Browse Source

initial import

master
Georg Hopp 18 years ago
commit
1f9850aded
  1. 140
      Cgilib.c
  2. 30
      Cgilib.h
  3. 29
      Cgilib2.h

140
Cgilib.c

@ -0,0 +1,140 @@
/* 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 <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloca.h>
#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 ("&auml;", stdout); break;
case 'ö': fputs ("&ouml;", stdout); break;
case 'ü': fputs ("&uuml;", stdout); break;
case 'Ä': fputs ("&Auml;", stdout); break;
case 'Ö': fputs ("&Ouml;", stdout); break;
case 'Ü': fputs ("&Uuml;", stdout); break;
case 'ß': fputs ("&szlig;", 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<MAX; i++) {
if (Feld [i] == NULL) return NULL;
if (strcmp (Feldname, Feld [i]) == 0) return Inhalt [i];
}
return NULL;
} /* Feldwert */

30
Cgilib.h

@ -0,0 +1,30 @@
/* Bibliothek zur Verarbeitung von gePOSTeten oder getGETeten
* Formulardaten ueber das CGI-Interface an ein C-Programm. Bei
* der Methode POST wird der Datenstrom ueber die Standardeingabe
* gelesen, zerlegt und decodiert. Bei der Methode GET wird die
* Environment-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. "ö"=>"&ouml;")
* ersetzt.
*/
/* Die maximale Anzahl Felder, die im Formular enthalten sein duerfen,
betraegt zur Zeit 50. Checkboxen zaehlen als 1 Feld */
#ifndef CGILIB_INCLUDED
#define CGILIB_INCLUDED
#include <string.h>
#include <stdio.h>
char *Feldwert (const char *Feldname);
void htmlprint (const char *s);
#endif

29
Cgilib2.h

@ -0,0 +1,29 @@
/* Bibliothek zur Verarbeitung von gePOSTeten oder getGETeten
* Formulardaten ueber das CGI-Interface an ein C-Programm. Bei
* der Methode POST wird der Datenstrom ueber die Standardeingabe
* gelesen, zerlegt und decodiert. Bei der Methode GET wird die
* Environment-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. "ö"=>"&ouml;")
* ersetzt.
*/
/* Die maximale Anzahl Felder, die im Formular enthalten sein duerfen,
betraegt zur Zeit 50. Checkboxen zaehlen als 1 Feld */
#ifndef CGILIB_INCLUDED
#define CGILIB_INCLUDED
#include <string.h>
#include <stdio.h>
char *Feldwert (const char *Feldname);
void htmlprint (const char *s);
#endif
Loading…
Cancel
Save