[cgi-bin programming]
Decoding parameters
#include <stdio.h>
#include <stdlib.h>
#define LF 10
#define CR 13
#define TRUE -1
#define FALSE 0
int check(char *str, int *nInCh, int inputLen);
char getch(int *nInCh, int inputLen);
char getch1(int *nInCh, int inputLen);
main()
{ int nInCh, inputLen;
char ch;
if(strcmp(getenv("REQUEST_METHOD"),"POST")) /* check usage */
{ printf("Error: script should be referenced with a METHOD of POST.\n");
exit(1);
}
if(strcmp(getenv("CONTENT_TYPE"),"application/x-www-form-urlencoded"))
{ printf("Error: script can only be used with forms.\n");
exit(1);
}
inputLen = atoi(getenv("CONTENT_LENGTH"));
nInCh=0;
if( !check("stdin= ", &nInCh, inputLen) )
{ printf("Error: text-area name must be have name = stdin.\n"); exit(1);
}
while( (nInCh < inputLen) && (!feof(stdin)) )
{ ch=getch(&nInCh, inputLen);
if( ch==CR ) ch=' ';
printf("%c", ch);
}
fclose(stdout);
}
check(char *str, int *nInCh, int inputLen)
{ int i;
for(i=0; i<10; i++)
{ if( str[i] == ' ' ) return(TRUE);
if( getch(nInCh, inputLen) != str[i] ) return(FALSE);
}
return(TRUE);
}
char getch(int *nInCh, int inputLen)
{ char ch, esc1, esc2;
ch=getch1(nInCh, inputLen);
if( ch=='%' ) /* e.g. %20 --> ' ' */
{ if( !(esc1=getch1(nInCh, inputLen)) ) return(' ');
if( !(esc2=getch1(nInCh, inputLen)) ) return(' ');
ch= (esc1>='A' ? ((esc1&0xdf)-'A')+10 : (esc1-'0'))*16
+ (esc2>='A' ? ((esc2&0xdf)-'A')+10 : (esc2-'0'));
}
return(ch);
}
char getch1(int *nInCh, int inputLen)
{ char ch;
if( (*nInCh >= inputLen) || feof(stdin) ) return(0);
(*nInCh)++; ch=(char)fgetc(stdin); if( ch=='+' ) ch=' '; /* '+' --> ' ' */
return(ch);
}
/* L. Allison, Dept. Computer Science, Monash University, Australia 3168 */