Ricardo Peres wrote:
> I have some questions for you gurus regarding CGI programming and
> PostgreSQL databases:
>
> 1-What is the simplest way to convert an "urlencoded" string
> (resultant from a HTTP POST or GET) into an ascii string? I have written a
> couple of functions do to that, but I'm have certain doubts as to their
> simplicity...
You need to first split the string into its components according to
the presence of & and = characters. Then, replace all + characters by
spaces and all hex sequences (%XX) with the characters which they
represent.
It is possible to perform all of these steps simultaneously. The main
thing to bear in mind is that only literal & and = characters split
the string into its components. The URL-encoded forms (%26 and %3D
respectively) correspond to the presence of literal & or = characters
in the variable or the value.
The attached lex program will parse a URL-encoded string (from stdin)
and emit a sequence of shell commands which define environment
variables.
--
Glynn Clements <[EMAIL PROTECTED]>
%pointer
%option 8bit
%s NAME
%s VALUE
HEX [0-9A-Fa-f]
%{
static int yywrap(void)
{
return 1;
}
static int digitval(int c)
{
switch (c)
{
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
return (c - '0');
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
return (c - 'A' + 10);
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
return (c - 'a' + 10);
default:
fprintf(stderr, "Invalid hex digit '%c'\n", c);
return 0;
}
}
static int hexcode(const char *p)
{
return digitval(p[0]) * 0x10 + digitval(p[1]);
}
#define OUTCHR(c) fputc((c), yyout)
#define OUTSTR(s) fputs(s, yyout);
%}
%%
<INITIAL>.|\n { yyless(0); OUTSTR("export CGI_"); BEGIN(NAME); }
<NAME>"%"{HEX}{HEX}"%" OUTCHR(hexcode(yytext + 1));
<NAME>"%"{HEX}{HEX} return -1;
<NAME>"%"{HEX} return -1;
<NAME>"%" return -1;
<NAME>"+" OUTCHR(' ');
<NAME>"&" { OUTSTR(";\n"); BEGIN(INITIAL); }
<NAME>"=" { OUTSTR("='"); BEGIN(VALUE); }
<NAME>.|\n OUTCHR(yytext[0]);
<NAME><<EOF>> OUTSTR(";\n");
<VALUE>"%"{HEX}{HEX}"%" OUTCHR(hexcode(yytext + 1));
<VALUE>"%"{HEX}{HEX} return -1;
<VALUE>"%"{HEX} return -1;
<VALUE>"%" return -1;
<VALUE>"+" OUTCHR(' ');
<VALUE>"&" { OUTSTR("';\n"); BEGIN(INITIAL); }
<VALUE>.|\n OUTCHR(yytext[0]);
<VALUE><<EOF>> { OUTSTR("';\n"); return 0; }
%%
int main(int argc, char **argv)
{
return yylex();
}