[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 */