Blame


1 c5b9ff9f 2003-12-04 devnull %{
2 c5b9ff9f 2003-12-04 devnull #include <u.h>
3 c5b9ff9f 2003-12-04 devnull #include <libc.h>
4 c5b9ff9f 2003-12-04 devnull #include <bio.h>
5 c5b9ff9f 2003-12-04 devnull #include <ctype.h>
6 c5b9ff9f 2003-12-04 devnull #include "hoc.h"
7 c5b9ff9f 2003-12-04 devnull #define code2(c1,c2) code(c1); code(c2)
8 c5b9ff9f 2003-12-04 devnull #define code3(c1,c2,c3) code(c1); code(c2); code(c3)
9 c5b9ff9f 2003-12-04 devnull %}
10 c5b9ff9f 2003-12-04 devnull %union {
11 c5b9ff9f 2003-12-04 devnull Symbol *sym; /* symbol table pointer */
12 c5b9ff9f 2003-12-04 devnull Inst *inst; /* machine instruction */
13 c5b9ff9f 2003-12-04 devnull int narg; /* number of arguments */
14 c5b9ff9f 2003-12-04 devnull Formal *formals; /* list of formal parameters */
15 c5b9ff9f 2003-12-04 devnull }
16 c5b9ff9f 2003-12-04 devnull %token <sym> NUMBER STRING PRINT VAR BLTIN UNDEF WHILE FOR IF ELSE
17 c5b9ff9f 2003-12-04 devnull %token <sym> FUNCTION PROCEDURE RETURN FUNC PROC READ
18 c5b9ff9f 2003-12-04 devnull %type <formals> formals
19 c5b9ff9f 2003-12-04 devnull %type <inst> expr stmt asgn prlist stmtlist
20 c5b9ff9f 2003-12-04 devnull %type <inst> cond while for if begin end
21 c5b9ff9f 2003-12-04 devnull %type <sym> procname
22 c5b9ff9f 2003-12-04 devnull %type <narg> arglist
23 c5b9ff9f 2003-12-04 devnull %right '=' ADDEQ SUBEQ MULEQ DIVEQ MODEQ
24 c5b9ff9f 2003-12-04 devnull %left OR
25 c5b9ff9f 2003-12-04 devnull %left AND
26 c5b9ff9f 2003-12-04 devnull %left GT GE LT LE EQ NE
27 c5b9ff9f 2003-12-04 devnull %left '+' '-'
28 c5b9ff9f 2003-12-04 devnull %left '*' '/' '%'
29 c5b9ff9f 2003-12-04 devnull %left UNARYMINUS NOT INC DEC
30 c5b9ff9f 2003-12-04 devnull %right '^'
31 c5b9ff9f 2003-12-04 devnull %%
32 c5b9ff9f 2003-12-04 devnull list: /* nothing */
33 c5b9ff9f 2003-12-04 devnull | list '\n'
34 c5b9ff9f 2003-12-04 devnull | list defn '\n'
35 c5b9ff9f 2003-12-04 devnull | list asgn '\n' { code2(xpop, STOP); return 1; }
36 c5b9ff9f 2003-12-04 devnull | list stmt '\n' { code(STOP); return 1; }
37 c5b9ff9f 2003-12-04 devnull | list expr '\n' { code2(printtop, STOP); return 1; }
38 c5b9ff9f 2003-12-04 devnull | list error '\n' { yyerrok; }
39 c5b9ff9f 2003-12-04 devnull ;
40 c5b9ff9f 2003-12-04 devnull asgn: VAR '=' expr { code3(varpush,(Inst)$1,assign); $$=$3; }
41 c5b9ff9f 2003-12-04 devnull | VAR ADDEQ expr { code3(varpush,(Inst)$1,addeq); $$=$3; }
42 c5b9ff9f 2003-12-04 devnull | VAR SUBEQ expr { code3(varpush,(Inst)$1,subeq); $$=$3; }
43 c5b9ff9f 2003-12-04 devnull | VAR MULEQ expr { code3(varpush,(Inst)$1,muleq); $$=$3; }
44 c5b9ff9f 2003-12-04 devnull | VAR DIVEQ expr { code3(varpush,(Inst)$1,diveq); $$=$3; }
45 c5b9ff9f 2003-12-04 devnull | VAR MODEQ expr { code3(varpush,(Inst)$1,modeq); $$=$3; }
46 c5b9ff9f 2003-12-04 devnull ;
47 c5b9ff9f 2003-12-04 devnull stmt: expr { code(xpop); }
48 c5b9ff9f 2003-12-04 devnull | RETURN { defnonly("return"); code(procret); }
49 c5b9ff9f 2003-12-04 devnull | RETURN expr
50 c5b9ff9f 2003-12-04 devnull { defnonly("return"); $$=$2; code(funcret); }
51 c5b9ff9f 2003-12-04 devnull | PROCEDURE begin '(' arglist ')'
52 de9b8f86 2006-04-20 devnull { $$ = $2; code3(call, (Inst)$1, (Inst)(uintptr)$4); }
53 c5b9ff9f 2003-12-04 devnull | PRINT prlist { $$ = $2; }
54 c5b9ff9f 2003-12-04 devnull | while '(' cond ')' stmt end {
55 c5b9ff9f 2003-12-04 devnull ($1)[1] = (Inst)$5; /* body of loop */
56 c5b9ff9f 2003-12-04 devnull ($1)[2] = (Inst)$6; } /* end, if cond fails */
57 c5b9ff9f 2003-12-04 devnull | for '(' cond ';' cond ';' cond ')' stmt end {
58 c5b9ff9f 2003-12-04 devnull ($1)[1] = (Inst)$5; /* condition */
59 c5b9ff9f 2003-12-04 devnull ($1)[2] = (Inst)$7; /* post loop */
60 c5b9ff9f 2003-12-04 devnull ($1)[3] = (Inst)$9; /* body of loop */
61 c5b9ff9f 2003-12-04 devnull ($1)[4] = (Inst)$10; } /* end, if cond fails */
62 c5b9ff9f 2003-12-04 devnull | if '(' cond ')' stmt end { /* else-less if */
63 c5b9ff9f 2003-12-04 devnull ($1)[1] = (Inst)$5; /* thenpart */
64 c5b9ff9f 2003-12-04 devnull ($1)[3] = (Inst)$6; } /* end, if cond fails */
65 c5b9ff9f 2003-12-04 devnull | if '(' cond ')' stmt end ELSE stmt end { /* if with else */
66 c5b9ff9f 2003-12-04 devnull ($1)[1] = (Inst)$5; /* thenpart */
67 c5b9ff9f 2003-12-04 devnull ($1)[2] = (Inst)$8; /* elsepart */
68 c5b9ff9f 2003-12-04 devnull ($1)[3] = (Inst)$9; } /* end, if cond fails */
69 c5b9ff9f 2003-12-04 devnull | '{' stmtlist '}' { $$ = $2; }
70 c5b9ff9f 2003-12-04 devnull ;
71 c5b9ff9f 2003-12-04 devnull cond: expr { code(STOP); }
72 c5b9ff9f 2003-12-04 devnull ;
73 c5b9ff9f 2003-12-04 devnull while: WHILE { $$ = code3(whilecode,STOP,STOP); }
74 c5b9ff9f 2003-12-04 devnull ;
75 c5b9ff9f 2003-12-04 devnull for: FOR { $$ = code(forcode); code3(STOP,STOP,STOP); code(STOP); }
76 c5b9ff9f 2003-12-04 devnull ;
77 c5b9ff9f 2003-12-04 devnull if: IF { $$ = code(ifcode); code3(STOP,STOP,STOP); }
78 c5b9ff9f 2003-12-04 devnull ;
79 c5b9ff9f 2003-12-04 devnull begin: /* nothing */ { $$ = progp; }
80 c5b9ff9f 2003-12-04 devnull ;
81 c5b9ff9f 2003-12-04 devnull end: /* nothing */ { code(STOP); $$ = progp; }
82 c5b9ff9f 2003-12-04 devnull ;
83 c5b9ff9f 2003-12-04 devnull stmtlist: /* nothing */ { $$ = progp; }
84 c5b9ff9f 2003-12-04 devnull | stmtlist '\n'
85 c5b9ff9f 2003-12-04 devnull | stmtlist stmt
86 c5b9ff9f 2003-12-04 devnull ;
87 c5b9ff9f 2003-12-04 devnull expr: NUMBER { $$ = code2(constpush, (Inst)$1); }
88 c5b9ff9f 2003-12-04 devnull | VAR { $$ = code3(varpush, (Inst)$1, eval); }
89 c5b9ff9f 2003-12-04 devnull | asgn
90 c5b9ff9f 2003-12-04 devnull | FUNCTION begin '(' arglist ')'
91 de9b8f86 2006-04-20 devnull { $$ = $2; code3(call,(Inst)$1,(Inst)(uintptr)$4); }
92 c5b9ff9f 2003-12-04 devnull | READ '(' VAR ')' { $$ = code2(varread, (Inst)$3); }
93 c5b9ff9f 2003-12-04 devnull | BLTIN '(' expr ')' { $$=$3; code2(bltin, (Inst)$1->u.ptr); }
94 c5b9ff9f 2003-12-04 devnull | '(' expr ')' { $$ = $2; }
95 c5b9ff9f 2003-12-04 devnull | expr '+' expr { code(add); }
96 c5b9ff9f 2003-12-04 devnull | expr '-' expr { code(sub); }
97 c5b9ff9f 2003-12-04 devnull | expr '*' expr { code(mul); }
98 c5b9ff9f 2003-12-04 devnull | expr '/' expr { code(div); }
99 c5b9ff9f 2003-12-04 devnull | expr '%' expr { code(mod); }
100 c5b9ff9f 2003-12-04 devnull | expr '^' expr { code (power); }
101 c5b9ff9f 2003-12-04 devnull | '-' expr %prec UNARYMINUS { $$=$2; code(negate); }
102 c5b9ff9f 2003-12-04 devnull | expr GT expr { code(gt); }
103 c5b9ff9f 2003-12-04 devnull | expr GE expr { code(ge); }
104 c5b9ff9f 2003-12-04 devnull | expr LT expr { code(lt); }
105 c5b9ff9f 2003-12-04 devnull | expr LE expr { code(le); }
106 c5b9ff9f 2003-12-04 devnull | expr EQ expr { code(eq); }
107 c5b9ff9f 2003-12-04 devnull | expr NE expr { code(ne); }
108 c5b9ff9f 2003-12-04 devnull | expr AND expr { code(and); }
109 c5b9ff9f 2003-12-04 devnull | expr OR expr { code(or); }
110 c5b9ff9f 2003-12-04 devnull | NOT expr { $$ = $2; code(not); }
111 c5b9ff9f 2003-12-04 devnull | INC VAR { $$ = code2(preinc,(Inst)$2); }
112 c5b9ff9f 2003-12-04 devnull | DEC VAR { $$ = code2(predec,(Inst)$2); }
113 c5b9ff9f 2003-12-04 devnull | VAR INC { $$ = code2(postinc,(Inst)$1); }
114 c5b9ff9f 2003-12-04 devnull | VAR DEC { $$ = code2(postdec,(Inst)$1); }
115 c5b9ff9f 2003-12-04 devnull ;
116 c5b9ff9f 2003-12-04 devnull prlist: expr { code(prexpr); }
117 c5b9ff9f 2003-12-04 devnull | STRING { $$ = code2(prstr, (Inst)$1); }
118 c5b9ff9f 2003-12-04 devnull | prlist ',' expr { code(prexpr); }
119 c5b9ff9f 2003-12-04 devnull | prlist ',' STRING { code2(prstr, (Inst)$3); }
120 c5b9ff9f 2003-12-04 devnull ;
121 c5b9ff9f 2003-12-04 devnull defn: FUNC procname { $2->type=FUNCTION; indef=1; }
122 c5b9ff9f 2003-12-04 devnull '(' formals ')' stmt { code(procret); define($2, $5); indef=0; }
123 c5b9ff9f 2003-12-04 devnull | PROC procname { $2->type=PROCEDURE; indef=1; }
124 c5b9ff9f 2003-12-04 devnull '(' formals ')' stmt { code(procret); define($2, $5); indef=0; }
125 c5b9ff9f 2003-12-04 devnull ;
126 c5b9ff9f 2003-12-04 devnull formals: { $$ = 0; }
127 c5b9ff9f 2003-12-04 devnull | VAR { $$ = formallist($1, 0); }
128 c5b9ff9f 2003-12-04 devnull | VAR ',' formals { $$ = formallist($1, $3); }
129 c5b9ff9f 2003-12-04 devnull ;
130 c5b9ff9f 2003-12-04 devnull procname: VAR
131 c5b9ff9f 2003-12-04 devnull | FUNCTION
132 c5b9ff9f 2003-12-04 devnull | PROCEDURE
133 c5b9ff9f 2003-12-04 devnull ;
134 c5b9ff9f 2003-12-04 devnull arglist: /* nothing */ { $$ = 0; }
135 c5b9ff9f 2003-12-04 devnull | expr { $$ = 1; }
136 c5b9ff9f 2003-12-04 devnull | arglist ',' expr { $$ = $1 + 1; }
137 c5b9ff9f 2003-12-04 devnull ;
138 c5b9ff9f 2003-12-04 devnull %%
139 c5b9ff9f 2003-12-04 devnull /* end of grammar */
140 c5b9ff9f 2003-12-04 devnull char *progname;
141 c5b9ff9f 2003-12-04 devnull int lineno = 1;
142 c5b9ff9f 2003-12-04 devnull jmp_buf begin;
143 c5b9ff9f 2003-12-04 devnull int indef;
144 c5b9ff9f 2003-12-04 devnull char *infile; /* input file name */
145 c5b9ff9f 2003-12-04 devnull Biobuf *bin; /* input file descriptor */
146 c5b9ff9f 2003-12-04 devnull Biobuf binbuf;
147 c5b9ff9f 2003-12-04 devnull char **gargv; /* global argument list */
148 c5b9ff9f 2003-12-04 devnull int gargc;
149 c5b9ff9f 2003-12-04 devnull
150 c5b9ff9f 2003-12-04 devnull int c = '\n'; /* global for use by warning() */
151 c5b9ff9f 2003-12-04 devnull
152 c5b9ff9f 2003-12-04 devnull int backslash(int), follow(int, int, int);
153 c5b9ff9f 2003-12-04 devnull void defnonly(char*), run(void);
154 c5b9ff9f 2003-12-04 devnull void warning(char*, char*);
155 c5b9ff9f 2003-12-04 devnull
156 c5b9ff9f 2003-12-04 devnull int
157 c5b9ff9f 2003-12-04 devnull yylex(void) /* hoc6 */
158 c5b9ff9f 2003-12-04 devnull {
159 c5b9ff9f 2003-12-04 devnull while ((c=Bgetc(bin)) == ' ' || c == '\t')
160 c5b9ff9f 2003-12-04 devnull ;
161 c5b9ff9f 2003-12-04 devnull if (c < 0)
162 c5b9ff9f 2003-12-04 devnull return 0;
163 c5b9ff9f 2003-12-04 devnull if (c == '\\') {
164 c5b9ff9f 2003-12-04 devnull c = Bgetc(bin);
165 c5b9ff9f 2003-12-04 devnull if (c == '\n') {
166 c5b9ff9f 2003-12-04 devnull lineno++;
167 c5b9ff9f 2003-12-04 devnull return yylex();
168 c5b9ff9f 2003-12-04 devnull }
169 c5b9ff9f 2003-12-04 devnull }
170 c5b9ff9f 2003-12-04 devnull if (c == '#') { /* comment */
171 c5b9ff9f 2003-12-04 devnull while ((c=Bgetc(bin)) != '\n' && c >= 0)
172 c5b9ff9f 2003-12-04 devnull ;
173 c5b9ff9f 2003-12-04 devnull if (c == '\n')
174 c5b9ff9f 2003-12-04 devnull lineno++;
175 c5b9ff9f 2003-12-04 devnull return c;
176 c5b9ff9f 2003-12-04 devnull }
177 c5b9ff9f 2003-12-04 devnull if (c == '.' || isdigit(c)) { /* number */
178 c5b9ff9f 2003-12-04 devnull double d;
179 c5b9ff9f 2003-12-04 devnull Bungetc(bin);
180 c5b9ff9f 2003-12-04 devnull Bgetd(bin, &d);
181 c5b9ff9f 2003-12-04 devnull yylval.sym = install("", NUMBER, d);
182 c5b9ff9f 2003-12-04 devnull return NUMBER;
183 c5b9ff9f 2003-12-04 devnull }
184 c5b9ff9f 2003-12-04 devnull if (isalpha(c) || c == '_') {
185 c5b9ff9f 2003-12-04 devnull Symbol *s;
186 c5b9ff9f 2003-12-04 devnull char sbuf[100], *p = sbuf;
187 c5b9ff9f 2003-12-04 devnull do {
188 c5b9ff9f 2003-12-04 devnull if (p >= sbuf + sizeof(sbuf) - 1) {
189 c5b9ff9f 2003-12-04 devnull *p = '\0';
190 c5b9ff9f 2003-12-04 devnull execerror("name too long", sbuf);
191 c5b9ff9f 2003-12-04 devnull }
192 c5b9ff9f 2003-12-04 devnull *p++ = c;
193 c5b9ff9f 2003-12-04 devnull } while ((c=Bgetc(bin)) >= 0 && (isalnum(c) || c == '_'));
194 c5b9ff9f 2003-12-04 devnull Bungetc(bin);
195 c5b9ff9f 2003-12-04 devnull *p = '\0';
196 c5b9ff9f 2003-12-04 devnull if ((s=lookup(sbuf)) == 0)
197 c5b9ff9f 2003-12-04 devnull s = install(sbuf, UNDEF, 0.0);
198 c5b9ff9f 2003-12-04 devnull yylval.sym = s;
199 c5b9ff9f 2003-12-04 devnull return s->type == UNDEF ? VAR : s->type;
200 c5b9ff9f 2003-12-04 devnull }
201 c5b9ff9f 2003-12-04 devnull if (c == '"') { /* quoted string */
202 c5b9ff9f 2003-12-04 devnull char sbuf[100], *p;
203 c5b9ff9f 2003-12-04 devnull for (p = sbuf; (c=Bgetc(bin)) != '"'; p++) {
204 c5b9ff9f 2003-12-04 devnull if (c == '\n' || c == Beof)
205 c5b9ff9f 2003-12-04 devnull execerror("missing quote", "");
206 c5b9ff9f 2003-12-04 devnull if (p >= sbuf + sizeof(sbuf) - 1) {
207 c5b9ff9f 2003-12-04 devnull *p = '\0';
208 c5b9ff9f 2003-12-04 devnull execerror("string too long", sbuf);
209 c5b9ff9f 2003-12-04 devnull }
210 c5b9ff9f 2003-12-04 devnull *p = backslash(c);
211 c5b9ff9f 2003-12-04 devnull }
212 c5b9ff9f 2003-12-04 devnull *p = 0;
213 c5b9ff9f 2003-12-04 devnull yylval.sym = (Symbol *)emalloc(strlen(sbuf)+1);
214 c5b9ff9f 2003-12-04 devnull strcpy((char*)yylval.sym, sbuf);
215 c5b9ff9f 2003-12-04 devnull return STRING;
216 c5b9ff9f 2003-12-04 devnull }
217 c5b9ff9f 2003-12-04 devnull switch (c) {
218 f1dd3f06 2019-09-19 crossd case '+': return follow('+', INC, '+') == INC ? INC : follow('=', ADDEQ, '+');
219 f1dd3f06 2019-09-19 crossd case '-': return follow('-', DEC, '-') == DEC ? DEC : follow('=', SUBEQ, '-');
220 c5b9ff9f 2003-12-04 devnull case '*': return follow('=', MULEQ, '*');
221 c5b9ff9f 2003-12-04 devnull case '/': return follow('=', DIVEQ, '/');
222 c5b9ff9f 2003-12-04 devnull case '%': return follow('=', MODEQ, '%');
223 c5b9ff9f 2003-12-04 devnull case '>': return follow('=', GE, GT);
224 c5b9ff9f 2003-12-04 devnull case '<': return follow('=', LE, LT);
225 c5b9ff9f 2003-12-04 devnull case '=': return follow('=', EQ, '=');
226 c5b9ff9f 2003-12-04 devnull case '!': return follow('=', NE, NOT);
227 c5b9ff9f 2003-12-04 devnull case '|': return follow('|', OR, '|');
228 c5b9ff9f 2003-12-04 devnull case '&': return follow('&', AND, '&');
229 c5b9ff9f 2003-12-04 devnull case '\n': lineno++; return '\n';
230 c5b9ff9f 2003-12-04 devnull default: return c;
231 c5b9ff9f 2003-12-04 devnull }
232 c5b9ff9f 2003-12-04 devnull }
233 c5b9ff9f 2003-12-04 devnull
234 c5b9ff9f 2003-12-04 devnull int
235 c5b9ff9f 2003-12-04 devnull backslash(int c) /* get next char with \'s interpreted */
236 c5b9ff9f 2003-12-04 devnull {
237 c5b9ff9f 2003-12-04 devnull static char transtab[] = "b\bf\fn\nr\rt\t";
238 c5b9ff9f 2003-12-04 devnull if (c != '\\')
239 c5b9ff9f 2003-12-04 devnull return c;
240 c5b9ff9f 2003-12-04 devnull c = Bgetc(bin);
241 c5b9ff9f 2003-12-04 devnull if (islower(c) && strchr(transtab, c))
242 c5b9ff9f 2003-12-04 devnull return strchr(transtab, c)[1];
243 c5b9ff9f 2003-12-04 devnull return c;
244 c5b9ff9f 2003-12-04 devnull }
245 c5b9ff9f 2003-12-04 devnull
246 c5b9ff9f 2003-12-04 devnull int
247 c5b9ff9f 2003-12-04 devnull follow(int expect, int ifyes, int ifno) /* look ahead for >=, etc. */
248 c5b9ff9f 2003-12-04 devnull {
249 c5b9ff9f 2003-12-04 devnull int c = Bgetc(bin);
250 c5b9ff9f 2003-12-04 devnull
251 c5b9ff9f 2003-12-04 devnull if (c == expect)
252 c5b9ff9f 2003-12-04 devnull return ifyes;
253 c5b9ff9f 2003-12-04 devnull Bungetc(bin);
254 c5b9ff9f 2003-12-04 devnull return ifno;
255 c5b9ff9f 2003-12-04 devnull }
256 c5b9ff9f 2003-12-04 devnull
257 c5b9ff9f 2003-12-04 devnull void
258 c5b9ff9f 2003-12-04 devnull yyerror(char* s) /* report compile-time error */
259 c5b9ff9f 2003-12-04 devnull {
260 c5b9ff9f 2003-12-04 devnull /*rob
261 c5b9ff9f 2003-12-04 devnull warning(s, (char *)0);
262 c5b9ff9f 2003-12-04 devnull longjmp(begin, 0);
263 c5b9ff9f 2003-12-04 devnull rob*/
264 c5b9ff9f 2003-12-04 devnull execerror(s, (char *)0);
265 c5b9ff9f 2003-12-04 devnull }
266 c5b9ff9f 2003-12-04 devnull
267 c5b9ff9f 2003-12-04 devnull void
268 c5b9ff9f 2003-12-04 devnull execerror(char* s, char* t) /* recover from run-time error */
269 c5b9ff9f 2003-12-04 devnull {
270 c5b9ff9f 2003-12-04 devnull warning(s, t);
271 c5b9ff9f 2003-12-04 devnull Bseek(bin, 0L, 2); /* flush rest of file */
272 c5b9ff9f 2003-12-04 devnull restoreall();
273 c5b9ff9f 2003-12-04 devnull longjmp(begin, 0);
274 c5b9ff9f 2003-12-04 devnull }
275 c5b9ff9f 2003-12-04 devnull
276 c5b9ff9f 2003-12-04 devnull void
277 c5b9ff9f 2003-12-04 devnull fpecatch(void) /* catch floating point exceptions */
278 c5b9ff9f 2003-12-04 devnull {
279 c5b9ff9f 2003-12-04 devnull execerror("floating point exception", (char *) 0);
280 c5b9ff9f 2003-12-04 devnull }
281 c5b9ff9f 2003-12-04 devnull
282 c5b9ff9f 2003-12-04 devnull void
283 c5b9ff9f 2003-12-04 devnull intcatch(void) /* catch interrupts */
284 c5b9ff9f 2003-12-04 devnull {
285 c5b9ff9f 2003-12-04 devnull execerror("interrupt", 0);
286 c5b9ff9f 2003-12-04 devnull }
287 c5b9ff9f 2003-12-04 devnull
288 c5b9ff9f 2003-12-04 devnull void
289 c5b9ff9f 2003-12-04 devnull run(void) /* execute until EOF */
290 c5b9ff9f 2003-12-04 devnull {
291 c5b9ff9f 2003-12-04 devnull setjmp(begin);
292 c5b9ff9f 2003-12-04 devnull for (initcode(); yyparse(); initcode())
293 c5b9ff9f 2003-12-04 devnull execute(progbase);
294 c5b9ff9f 2003-12-04 devnull }
295 c5b9ff9f 2003-12-04 devnull
296 c5b9ff9f 2003-12-04 devnull void
297 c5b9ff9f 2003-12-04 devnull main(int argc, char* argv[]) /* hoc6 */
298 c5b9ff9f 2003-12-04 devnull {
299 c5b9ff9f 2003-12-04 devnull static int first = 1;
300 c5b9ff9f 2003-12-04 devnull #ifdef YYDEBUG
301 c5b9ff9f 2003-12-04 devnull extern int yydebug;
302 c5b9ff9f 2003-12-04 devnull yydebug=3;
303 c5b9ff9f 2003-12-04 devnull #endif
304 c5b9ff9f 2003-12-04 devnull progname = argv[0];
305 c5b9ff9f 2003-12-04 devnull init();
306 c5b9ff9f 2003-12-04 devnull if (argc == 1) { /* fake an argument list */
307 c5b9ff9f 2003-12-04 devnull static char *stdinonly[] = { "-" };
308 c5b9ff9f 2003-12-04 devnull
309 c5b9ff9f 2003-12-04 devnull gargv = stdinonly;
310 c5b9ff9f 2003-12-04 devnull gargc = 1;
311 c5b9ff9f 2003-12-04 devnull } else if (first) { /* for interrupts */
312 c5b9ff9f 2003-12-04 devnull first = 0;
313 c5b9ff9f 2003-12-04 devnull gargv = argv+1;
314 c5b9ff9f 2003-12-04 devnull gargc = argc-1;
315 c5b9ff9f 2003-12-04 devnull }
316 c5b9ff9f 2003-12-04 devnull Binit(&binbuf, 0, OREAD);
317 c5b9ff9f 2003-12-04 devnull bin = &binbuf;
318 c5b9ff9f 2003-12-04 devnull while (moreinput())
319 c5b9ff9f 2003-12-04 devnull run();
320 c5b9ff9f 2003-12-04 devnull exits(0);
321 c5b9ff9f 2003-12-04 devnull }
322 c5b9ff9f 2003-12-04 devnull
323 c5b9ff9f 2003-12-04 devnull int
324 c5b9ff9f 2003-12-04 devnull moreinput(void)
325 c5b9ff9f 2003-12-04 devnull {
326 c5b9ff9f 2003-12-04 devnull char *expr;
327 c5b9ff9f 2003-12-04 devnull static char buf[64];
328 c5b9ff9f 2003-12-04 devnull int fd;
329 c5b9ff9f 2003-12-04 devnull static Biobuf b;
330 c5b9ff9f 2003-12-04 devnull
331 c5b9ff9f 2003-12-04 devnull if (gargc-- <= 0)
332 c5b9ff9f 2003-12-04 devnull return 0;
333 c5b9ff9f 2003-12-04 devnull if (bin && bin != &binbuf)
334 c5b9ff9f 2003-12-04 devnull Bterm(bin);
335 c5b9ff9f 2003-12-04 devnull infile = *gargv++;
336 c5b9ff9f 2003-12-04 devnull lineno = 1;
337 c5b9ff9f 2003-12-04 devnull if (strcmp(infile, "-") == 0) {
338 c5b9ff9f 2003-12-04 devnull bin = &binbuf;
339 c5b9ff9f 2003-12-04 devnull infile = 0;
340 c5b9ff9f 2003-12-04 devnull return 1;
341 c5b9ff9f 2003-12-04 devnull }
342 c5b9ff9f 2003-12-04 devnull if(strncmp(infile, "-e", 2) == 0) {
343 c5b9ff9f 2003-12-04 devnull if(infile[2]==0){
344 c5b9ff9f 2003-12-04 devnull if(gargc == 0){
345 c5b9ff9f 2003-12-04 devnull fprint(2, "%s: no argument for -e\n", progname);
346 c5b9ff9f 2003-12-04 devnull return 0;
347 c5b9ff9f 2003-12-04 devnull }
348 c5b9ff9f 2003-12-04 devnull gargc--;
349 c5b9ff9f 2003-12-04 devnull expr = *gargv++;
350 c5b9ff9f 2003-12-04 devnull }else
351 c5b9ff9f 2003-12-04 devnull expr = infile+2;
352 c5b9ff9f 2003-12-04 devnull sprint(buf, "/tmp/hocXXXXXXX");
353 c5b9ff9f 2003-12-04 devnull fd = mkstemp(buf);
354 c5b9ff9f 2003-12-04 devnull remove(buf);
355 c5b9ff9f 2003-12-04 devnull /*
356 c5b9ff9f 2003-12-04 devnull infile = mktemp(buf);
357 c5b9ff9f 2003-12-04 devnull fd = create(infile, ORDWR|ORCLOSE, 0600);
358 c5b9ff9f 2003-12-04 devnull if(fd < 0){
359 c5b9ff9f 2003-12-04 devnull fprint(2, "%s: can't create temp. file: %r\n", progname);
360 c5b9ff9f 2003-12-04 devnull return 0;
361 c5b9ff9f 2003-12-04 devnull }
362 c5b9ff9f 2003-12-04 devnull */
363 c5b9ff9f 2003-12-04 devnull fprint(fd, "%s\n", expr);
364 c5b9ff9f 2003-12-04 devnull /* leave fd around; file will be removed on exit */
365 c5b9ff9f 2003-12-04 devnull /* the following looks weird but is required for unix version */
366 c5b9ff9f 2003-12-04 devnull bin = &b;
367 c5b9ff9f 2003-12-04 devnull seek(fd, 0, 0);
368 c5b9ff9f 2003-12-04 devnull Binit(bin, fd, OREAD);
369 c5b9ff9f 2003-12-04 devnull } else {
370 c5b9ff9f 2003-12-04 devnull bin=Bopen(infile, OREAD);
371 c5b9ff9f 2003-12-04 devnull if (bin == 0) {
372 c5b9ff9f 2003-12-04 devnull fprint(2, "%s: can't open %s\n", progname, infile);
373 c5b9ff9f 2003-12-04 devnull return moreinput();
374 c5b9ff9f 2003-12-04 devnull }
375 c5b9ff9f 2003-12-04 devnull }
376 c5b9ff9f 2003-12-04 devnull return 1;
377 c5b9ff9f 2003-12-04 devnull }
378 c5b9ff9f 2003-12-04 devnull
379 c5b9ff9f 2003-12-04 devnull void
380 c5b9ff9f 2003-12-04 devnull warning(char* s, char* t) /* print warning message */
381 c5b9ff9f 2003-12-04 devnull {
382 c5b9ff9f 2003-12-04 devnull fprint(2, "%s: %s", progname, s);
383 c5b9ff9f 2003-12-04 devnull if (t)
384 c5b9ff9f 2003-12-04 devnull fprint(2, " %s", t);
385 c5b9ff9f 2003-12-04 devnull if (infile)
386 c5b9ff9f 2003-12-04 devnull fprint(2, " in %s", infile);
387 c5b9ff9f 2003-12-04 devnull fprint(2, " near line %d\n", lineno);
388 c5b9ff9f 2003-12-04 devnull while (c != '\n' && c != Beof)
389 c5b9ff9f 2003-12-04 devnull if((c = Bgetc(bin)) == '\n') /* flush rest of input line */
390 c5b9ff9f 2003-12-04 devnull lineno++;
391 c5b9ff9f 2003-12-04 devnull }
392 c5b9ff9f 2003-12-04 devnull
393 c5b9ff9f 2003-12-04 devnull void
394 c5b9ff9f 2003-12-04 devnull defnonly(char *s) /* warn if illegal definition */
395 c5b9ff9f 2003-12-04 devnull {
396 c5b9ff9f 2003-12-04 devnull if (!indef)
397 c5b9ff9f 2003-12-04 devnull execerror(s, "used outside definition");
398 c5b9ff9f 2003-12-04 devnull }