tmove it here - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit bc72254a1abedc43c9c90685dda81efe92b460fe
 (DIR) parent 61a3e9c44daa2d4a5f2ac8941f6418c399568f39
 (HTM) Author: rsc <devnull@localhost>
       Date:   Mon, 17 May 2004 03:28:58 +0000
       
       move it here
       
       Diffstat:
         A lib/lex.ncform                      |     191 +++++++++++++++++++++++++++++++
       
       1 file changed, 191 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/lib/lex.ncform b/lib/lex.ncform
       t@@ -0,0 +1,191 @@
       +/* #pragma lib        "libl.a" */
       +int yylineno =1;
       +# define YYU(x) x
       +char yytext[YYLMAX];
       +struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
       +Uchar yysbuf[YYLMAX];
       +Uchar *yysptr = yysbuf;
       +int *yyfnd;
       +extern struct yysvf *yyestate;
       +int yyprevious = YYNEWLINE;
       +# ifdef LEXDEBUG
       +extern void allprint(char);
       +# endif
       +int
       +yylook(void){
       +        struct yysvf *yystate, **lsp;
       +        struct yywork *yyt;
       +        struct yysvf *yyz;
       +        int yych;
       +        struct yywork *yyr;
       +# ifdef LEXDEBUG
       +        int debug;
       +# endif
       +        Uchar *yylastch;
       +        /* start off machines */
       +# ifdef LEXDEBUG
       +        debug = 0;
       +# endif
       +        if (!yymorfg)
       +                yylastch = (Uchar*)yytext;
       +        else {
       +                yymorfg=0;
       +                yylastch = (Uchar*)yytext+yyleng;
       +                }
       +        for(;;){
       +                lsp = yylstate;
       +                yyestate = yystate = yybgin;
       +                if (yyprevious==YYNEWLINE) yystate++;
       +                for (;;){
       +# ifdef LEXDEBUG
       +                        if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
       +# endif
       +                        yyt = yystate->yystoff;
       +                        if(yyt == yycrank){                /* may not be any transitions */
       +                                yyz = yystate->yyother;
       +                                if(yyz == 0)break;
       +                                if(yyz->yystoff == yycrank)break;
       +                                }
       +                        *yylastch++ = yych = input();
       +                tryagain:
       +# ifdef LEXDEBUG
       +                        if(debug){
       +                                fprintf(yyout,"char ");
       +                                allprint(yych);
       +                                putchar('\n');
       +                                }
       +# endif
       +                        yyr = yyt;
       +                        if ( (int)yyt > (int)yycrank){
       +                                yyt = yyr + yych;
       +                                if (yyt <= yytop && yyt->verify+yysvec == yystate){
       +                                        if(yyt->advance+yysvec == YYLERR)        /* error transitions */
       +                                                {unput(*--yylastch);break;}
       +                                        *lsp++ = yystate = yyt->advance+yysvec;
       +                                        goto contin;
       +                                        }
       +                                }
       +# ifdef YYOPTIM
       +                        else if((int)yyt < (int)yycrank) {                /* r < yycrank */
       +                                yyt = yyr = yycrank+(yycrank-yyt);
       +# ifdef LEXDEBUG
       +                                if(debug)fprintf(yyout,"compressed state\n");
       +# endif
       +                                yyt = yyt + yych;
       +                                if(yyt <= yytop && yyt->verify+yysvec == yystate){
       +                                        if(yyt->advance+yysvec == YYLERR)        /* error transitions */
       +                                                {unput(*--yylastch);break;}
       +                                        *lsp++ = yystate = yyt->advance+yysvec;
       +                                        goto contin;
       +                                        }
       +                                yyt = yyr + YYU(yymatch[yych]);
       +# ifdef LEXDEBUG
       +                                if(debug){
       +                                        fprintf(yyout,"try fall back character ");
       +                                        allprint(YYU(yymatch[yych]));
       +                                        putchar('\n');
       +                                        }
       +# endif
       +                                if(yyt <= yytop && yyt->verify+yysvec == yystate){
       +                                        if(yyt->advance+yysvec == YYLERR)        /* error transition */
       +                                                {unput(*--yylastch);break;}
       +                                        *lsp++ = yystate = yyt->advance+yysvec;
       +                                        goto contin;
       +                                        }
       +                                }
       +                        if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
       +# ifdef LEXDEBUG
       +                                if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
       +# endif
       +                                goto tryagain;
       +                                }
       +# endif
       +                        else
       +                                {unput(*--yylastch);break;}
       +                contin:
       +# ifdef LEXDEBUG
       +                        if(debug){
       +                                fprintf(yyout,"state %d char ",yystate-yysvec-1);
       +                                allprint(yych);
       +                                putchar('\n');
       +                                }
       +# endif
       +                        ;
       +                        }
       +# ifdef LEXDEBUG
       +                if(debug){
       +                        fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
       +                        allprint(yych);
       +                        putchar('\n');
       +                        }
       +# endif
       +                while (lsp-- > yylstate){
       +                        *yylastch-- = 0;
       +                        if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
       +                                yyolsp = lsp;
       +                                if(yyextra[*yyfnd]){                /* must backup */
       +                                        while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
       +                                                lsp--;
       +                                                unput(*yylastch--);
       +                                                }
       +                                        }
       +                                yyprevious = YYU(*yylastch);
       +                                yylsp = lsp;
       +                                yyleng = yylastch-(Uchar*)yytext+1;
       +                                yytext[yyleng] = 0;
       +# ifdef LEXDEBUG
       +                                if(debug){
       +                                        fprintf(yyout,"\nmatch '%s'", yytext);
       +                                        fprintf(yyout," action %d\n",*yyfnd);
       +                                        }
       +# endif
       +                                return(*yyfnd++);
       +                                }
       +                        unput(*yylastch);
       +                        }
       +                if (yytext[0] == 0  /* && feof(yyin) */)
       +                        {
       +                        yysptr=yysbuf;
       +                        return(0);
       +                        }
       +                yyprevious = input();
       +                yytext[0] = yyprevious;
       +                if (yyprevious>0)
       +                        output(yyprevious);
       +                yylastch = (Uchar*)yytext;
       +# ifdef LEXDEBUG
       +                if(debug)putchar('\n');
       +# endif
       +                }
       +        return(0);        /* shut up the compiler; i have no idea what should be returned */
       +        }
       +int
       +yyback(int *p, int m)
       +{
       +if (p==0) return(0);
       +while (*p)
       +        {
       +        if (*p++ == m)
       +                return(1);
       +        }
       +return(0);
       +}
       +        /* the following are only used in the lex library */
       +int
       +yyinput(void){
       +        if(yyin == ((void*)0))
       +                yyin = stdin;
       +        return(input());
       +}
       +void
       +yyoutput(int c)
       +{
       +        if(yyout == ((void*)0))
       +                yyout = stdin;
       +        output(c);
       +}
       +void
       +yyunput(int c)
       +{
       +        unput(c);
       +}