]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/lex/header.c
abaco: cleanup, handle image/x-icon, don't use backspace as a hotkey, and remove...
[plan9front.git] / sys / src / cmd / lex / header.c
1 # include "ldefs.h"
2
3 extern int nine;
4
5 void
6 phead1(void)
7 {
8         Bprint(&fout,"typedef unsigned char Uchar;\n");
9         if (nine) {
10                 Bprint(&fout,"# include <u.h>\n");
11                 Bprint(&fout,"# include <libc.h>\n");
12         }
13         Bprint(&fout,"# include <stdio.h>\n");
14         Bprint(&fout, "# define U(x) x\n");
15         Bprint(&fout, "# define NLSTATE yyprevious=YYNEWLINE\n");
16         Bprint(&fout,"# define BEGIN yybgin = yysvec + 1 +\n");
17         Bprint(&fout,"# define INITIAL 0\n");
18         Bprint(&fout,"# define YYLERR yysvec\n");
19         Bprint(&fout,"# define YYSTATE (yyestate-yysvec-1)\n");
20         Bprint(&fout,"# define YYOPTIM 1\n");
21 # ifdef DEBUG
22         Bprint(&fout,"# define LEXDEBUG 1\n");
23 # endif
24         Bprint(&fout,"# define YYLMAX 200\n");
25         Bprint(&fout,
26 "# define unput(c) {yytchar= (c);if(yytchar=='\\n')yylineno--;*yysptr++=yytchar;}\n");
27         Bprint(&fout,"# define yymore() (yymorfg=1)\n");
28         Bprint(&fout,"# define ECHO fprintf(yyout, \"%%s\",yytext)\n");
29         Bprint(&fout,"# define REJECT { nstr = yyreject(); goto yyfussy;}\n");
30         Bprint(&fout,"int yyleng; extern char yytext[];\n");
31         Bprint(&fout,"int yymorfg;\n");
32         Bprint(&fout,"extern Uchar *yysptr, yysbuf[];\n");
33         Bprint(&fout,"int yytchar;\n");
34         Bprint(&fout,"FILE *yyin = {stdin}, *yyout = {stdout};\n");
35         Bprint(&fout,"extern int yylineno;\n");
36         Bprint(&fout,"struct yysvf { \n");
37         Bprint(&fout,"\tstruct yywork *yystoff;\n");
38         Bprint(&fout,"\tstruct yysvf *yyother;\n");
39         Bprint(&fout,"\tint *yystops;};\n");
40         Bprint(&fout,"struct yysvf *yyestate;\n");
41         Bprint(&fout,"extern struct yysvf yysvec[], *yybgin;\n");
42         Bprint(&fout,"int yylook(void), yywrap(void), yyback(int *, int);\n");
43         if(nine) {
44                 Bprint(&fout,
45                                 "int infd, outfd;\n"
46                                 "\n"
47                                 "void\n"
48                                 "output(char c)\n"
49                                 "{\n"
50                                 "       int rv;\n"
51                                 "       if ((rv = write(outfd, &c, 1)) < 0)\n"
52                                 "               sysfatal(\"output: %%r\");\n"
53                                 "       if (rv == 0)\n"
54                                 "               sysfatal(\"output: EOF?\");\n"
55                                 "}\n"
56                                 "\n"
57                                 "int\n"
58                                 "input(void)\n"
59                                 "{\n"
60                                 "       if(yysptr > yysbuf)\n"
61                                 "               yytchar = U(*--yysptr);\n"
62                                 "       else {\n"
63                                 "               int rv;\n"
64                                 "               if ((rv = read(infd, &yytchar, 1)) < 0)\n"
65                                 "                       sysfatal(\"input: %%r\");\n"
66                                 "               if (rv == 0)\n"
67                                 "                       return 0;\n"
68                                 "       }\n"
69                                 "       if (yytchar == '\\n')\n"
70                                 "               yylineno++;\n"
71                                 "       return yytchar;\n"
72                                 "}\n");
73         }
74         else {
75                 Bprint(&fout,"# define output(c) putc(c,yyout)\n");
76                 Bprint(&fout, "%s%d%s\n",
77                  "# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==",
78                 '\n',
79                 "?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)");
80         }
81 }
82
83 void
84 phead2(void)
85 {
86         Bprint(&fout,"while((nstr = yylook()) >= 0)\n");
87         Bprint(&fout,"yyfussy: switch(nstr){\n");
88         Bprint(&fout,"case 0:\n");
89         Bprint(&fout,"if(yywrap()) return(0); break;\n");
90 }
91
92 void
93 ptail(void)
94 {
95         if(!pflag){
96                 Bprint(&fout,"case -1:\nbreak;\n");             /* for reject */
97                 Bprint(&fout,"default:\n");
98                 Bprint(&fout,"fprintf(yyout,\"bad switch yylook %%d\",nstr);\n");
99                 Bprint(&fout,"} return(0); }\n");
100                 Bprint(&fout,"/* end of yylex */\n");
101         }
102         pflag = 1;
103 }
104
105 void
106 statistics(void)
107 {
108         fprint(errorf,"%d/%d nodes(%%e), %d/%d positions(%%p), %d/%d (%%n), %ld transitions\n",
109                 tptr, treesize, (int)(nxtpos-positions), maxpos, stnum+1, nstates, rcount);
110         fprint(errorf, ", %d/%d packed char classes(%%k)", (int)(pcptr-pchar), pchlen);
111         fprint(errorf,", %d/%d packed transitions(%%a)",nptr, ntrans);
112         fprint(errorf, ", %d/%d output slots(%%o)", yytop, outsize);
113         fprint(errorf,"\n");
114 }