Chunked-transfer decoding from stdin yy045
1 points by textmode 3 years ago
· 1 comment
/* chunked transfer decoding */
#define echo do{if(fwrite(yytext,(size_t)yyleng,1,yyout)){}}while(0)
#define jmp (yy_start) = 1 + 2 *
int fileno (FILE *);
int ischunked,chunksize,count;
xa "\15"|"\12"
xb "\15\12"
xc "HTTP/0.9"|"HTTP/1.0"|"HTTP/1.1"
xd [Cc][Hh][Uu][Nn][Kk][Ee][Dd]
xe [0-9a-fA-F]+\r\n
xf [0-9a-fA-F]*\r\n
%option noyywrap nounput noinput
%s xb xc xd xe xf
%%
^{xc} echo;ischunked=0;jmp xc;
<xc>^transfer-encoding: echo;jmp xb;
<xb>\r\n\r\n echo;jmp xe;
<xb>{xd} echo;ischunked=1;
<xe>{xf}|{xe} {
count=0;
if(ischunked==1)
{chunksize=strtol(yytext,NULL,16);
jmp xd;};
};
<xd>{xb} jmp xf;
<xd>. {
count++;
if(count==chunksize)jmp xe;
echo;
};
<xf>^[A-Fa-f0-9]+{xa}
<xf>{xa}+[A-Fa-f0-9]+{xa}
<xf>{xb}[A-Fa-f0-9]+{xb}
%%
int main(){ yylex();exit(0);}