/* Bibliothek zur Verarbeitung von gePOSTeten oder geGETeten * Formulardaten ueber das CGI-Interface an ein C-Programm. * Es wird der Datenstrom ueber die Standardeingabe bzw. die * Variable QUERY_STRING gelesen, zerlegt und decodiert. * Die Zeichenketten werden mit Hilfe der Funktion Feldwert * zur Verfuegung gestellt. * * Weitere Funktion: htmlprint * Gibt Zeichenkette aus, Umlaute und andere Sonderzeichen * werden aber durch die HTML-Schreibweise (z. B. "ö"=>"ö") * ersetzt. Liste der Sonderzeichen ist noch nicht vollstaendig! */ /* MAX ist die maximale Anzahl Felder, die im Formular enthalten sein duerfen. Checkboxen zaehlen als 1 Feld */ #define MAX 50 #include #include #include #include #include "cgilib.h" char *Feld [MAX], *Inhalt [MAX]; char *SZhex[] = {"%20", "%21", "%5c", "%5C", "%23", "%24", "%25", "%26", "%27", "%28", "%29", "%b0", "%B0", "%5e", "%5E", "%2b", "%2B", "%2c", "%2C", "%2f", "%2F", "%3a", "%3A", "%3b", "%3B", "%3d", "%3D", "%3f", "%3F", "%0a", "%0A", "%0d", "%0D", "%e4", "%E4", "%f6", "%F6", "%fc", "%FC", "%df", "%DF", "%C4", "%c4", "%d6", "%D6", "%dc", "%DC", "%e9", "%E9", "%e8", "%E8", "%ea", "%EA", "%e1", "%E1", "%e0", "%E0", "%e2", "%E2", "%ed", "%ED", "%ec", "%EC", "%ee", "%EE", "%f3", "%F3", "%f2", "%F2", "%f4", "%F4", "%fa", "%FA", "%f9", "%F9", "%fb", "%FB", "%5b", "%5B", "%5d", "%5D", "%7b", "%7B", "%7d", "%7D", "%3c", "%3C", "%3e", "%3E", "%7c", "%7C", "%b2", "%B2", "%b3", "%B3", "%b5", "%B5", "%7e", "%7E", "%a9", "%A9", "%ae", "%AE", "%99"}; char SZ[] = " !\\\\#$%&'()°°^^++,,//::;;==??\012\012\015\015ääööüüßßÄÄÖÖÜÜ\ ééèèêêááààââííììîîóóòòôôúúùùûû[[]]{{}}<<>>||²²³³µµ~~©©®®™"; void Sonderzeichen (char *s) { char *x; int i; for (i=0; i < strlen (s); i++) { if (s [i] == '+') s [i] = ' '; } for (i=0; i < strlen (SZ); i++) { while ((x = strstr (s, SZhex [i])) != NULL) { *x = SZ [i]; strcpy (x+1, x+3); } } } /* Sonderzeichen */ void werteeinlesen (void) { char *zk; char *ret; char *inh; int i=0, len; memset (Feld, 0, sizeof (Feld)); memset (Inhalt, 0, sizeof (Inhalt)); if (strcmp (getenv ("REQUEST_METHOD"), "GET") == 0) { zk = getenv ("QUERY_STRING"); } else { len = atoi (getenv ("CONTENT_LENGTH")); zk = (char *) alloca (len+1); fread (zk, 1, len, stdin); } ret = strtok (zk, "&"); while (ret != NULL && i < MAX) { inh = strchr (ret, '=') + 1; Sonderzeichen (inh); Inhalt [i] = (char *) malloc (strlen (inh) + 1); strcpy (Inhalt [i], inh); *(--inh) = '\0'; Feld [i] = (char *) malloc (strlen (ret) + 1); strcpy (Feld [i], ret); if (i > 0 && strcmp (Feld [i], Feld [i-1]) == 0) { /* Feldnamen sind identisch => es war eine Checkbox, bei der mehrere Alternativen angekreuzt wurden; also muss der Feldinhalt an das vorige Feld angehaengt werden, durch Komma getrennt */ Inhalt [i-1] = (char *) realloc (Inhalt [i-1], strlen (Inhalt [i-1]) + strlen (Inhalt [i]) + 2); strcat (Inhalt [i-1], ","); strcat (Inhalt [i-1], Inhalt [i]); free (Feld [i]); free (Inhalt [i]); } else i++; ret = strtok (NULL, "&"); } free (zk); /* wird nicht mehr gebraucht */ } void htmlprint (const char *s) { int i; for (i=0; i < strlen (s); i++) { switch (s[i]) { case 'ä': fputs ("ä", stdout); break; case 'ö': fputs ("ö", stdout); break; case 'ü': fputs ("ü", stdout); break; case 'Ä': fputs ("Ä", stdout); break; case 'Ö': fputs ("Ö", stdout); break; case 'Ü': fputs ("Ü", stdout); break; case 'ß': fputs ("ß", stdout); break; default: fputc (s [i], stdout); } } } char *Feldwert (const char *Feldname) { static int init=0; int i; if (!init) { werteeinlesen(); init=1; } for (i=0; i