~d This file is in the public domain. ~\#include #include #define ~pget ((*(~pinp->string))?(*++(~pinp->string)):'\0') #define ~pchar (0x7f&(int)*(~pinp->string)) static char *~plastfail; static FSMarg ~pmainarg = { 0, 0 }; int ~p(char *); FSMarg *~pgetarg(void); char *~prest(void); static int ~p_(FSMarg *, int); ~a~nt ~T~\ int ~p(char *s) { int i; ~pmainarg.string = s; ~pmainarg.flags = 0; ~plastfail = 0; ~ni~I();~\ i = ~p_(&~pmainarg,~f); if (!i && ~plastfail) { ~pmainarg.string = ~plastfail; } return(i); } FSMarg *~pgetarg(void) { return(&~pmainarg); } char *~prest(void) { return(~pmainarg.string); } ~nc static int ~pcmp(FSMarg *in, const char *str, const char *want, char *buf) { register int i; char *start; register char *cp; cp = in->string; start = cp; for (i=0;str[i];i++) if (cp[i] != str[i]) return(0); cp += i; if (want) { for (i=0;want[i];i++) if (cp[i] != want[i]) break; cp += i; } in->string = cp; if (buf) { i = cp - start; buf[i] = '\0'; for (i--;i>=0;i--) buf[i] = *--cp; } return(1); } ~\~nr static int ~prec(FSMarg *~pinp, int ~pstate) { char *cp = ~pinp->string; if (~p_(~pinp,~pstate)) { return(1); } if (~plastfail == 0) { ~plastfail = ~pinp->string; } ~pinp->string = cp; return(0); } ~\~nx static int ~pxval(char c) { switch (c) { case '0': return(0); break; case '1': return(1); break; case '2': return(2); break; case '3': return(3); break; case '4': return(4); break; case '5': return(5); break; case '6': return(6); break; case '7': return(7); break; case '8': return(8); break; case '9': return(9); break; case 'a': case 'A': return(10); break; case 'b': case 'B': return(11); break; case 'c': case 'C': return(12); break; case 'd': case 'D': return(13); break; case 'e': case 'E': return(14); break; case 'f': case 'F': return(15); break; } return(-1); } ~\ static int ~p_(FSMarg *~pinp, int ~pstate) { ~z while(1) { if (!(~pinp->flags&FSM_FLAG_PARSE_BLANKS)) { while (isspace(~pchar)) { ~pget; } } ~plastfail = 0; ~nt~S(~pstate,~pstatenames[~pstate]);~\ switch(~pstate){ /* * * * * Machine begins here * * * */