part 1 of 2<p><pre><code> # make config parser (yy018)
# source code for 018.l is below
flex -8iCrfa 018.l;
cc -static -o yy018 lex.yy.c;
# create a config (hh1)
# format is name: "value"
# no indent, must be left-justified
cat > hh1
httpVersion="1.0"
Host: ""
Connection: "close"
User-Agent: "CERN-LineMode/2.15 libwww/2.17b3"
^D
</code></pre>
save as "018.l"<p><pre><code> #define jmp (yy_start) = 1 + 2 *
#define se setenv
#define g getenv
#define X(x) fputs(x,stdout)
#define Y(x,y) fprintf(stdout,x,y)
#define Y2(x,y) fprintf(stderr,x,y)
xxyy()
{
se("value",yytext,1);
Y("\40\40\40if(0==se(\"%s\",",g("name"));
Y("%s,0))",g("value"));
Y("p(\"%s: %%s\\r\\n\",",g("name"));
Y("g(\"%s\"));\n",g("name"));
}
int lineno=1;
%s xa xb xc xd
%%
\n lineno++;
^[\40\11]+ {
Y2("yy018: error: remove %d ",yyleng);
Y2("leading spaces/tabs from line %d\n",lineno);
yyterminate();
}
^"Referer"[: ] jmp xb;
^"Host"[: ] se("name","Host",1);jmp xc;
^[^\40\11\":\n]* se("name",yytext,1);jmp xa;
<xa>[\"][^\"]*[\"] {
if(yyleng>2)xxyy();
else if(yyleng==2&&yytext[0]=='\"'&&yytext[1]=='\"') {
se("value",yytext,1);
Y("\40\40\40if(g(\"%s\"))",g("name"));
Y("p(\"%s: %%s\\r\\n\",",g("name"));
Y("g(\"%s\"));\n",g("name"));
}}
<xc>[\"][^\"]*[\"] xxyy();
<xb>[\"][^\":]*[\"] {
if(!g("Referer")){
X("\40\40\40p(\"Referer: %s\",g(\"Scheme\"));");
X("p(\"%s\",g(\"Host\"));");
X("if(0==path)puts(\"\\r\");\n");
X("if(1==path)p(\"%s\\r\\n\",g(\"Path\"));\n");
}}
\n|.
%%
int main(){ yylex();}
int yywrap(){}</code></pre>