xref: /minix3/external/historical/nawk/dist/parse.c (revision 5ea9e707be09a1df0407e195a11908f6fac19e14)
1*5ea9e707SThomas Veerman /****************************************************************
2*5ea9e707SThomas Veerman Copyright (C) Lucent Technologies 1997
3*5ea9e707SThomas Veerman All Rights Reserved
4*5ea9e707SThomas Veerman 
5*5ea9e707SThomas Veerman Permission to use, copy, modify, and distribute this software and
6*5ea9e707SThomas Veerman its documentation for any purpose and without fee is hereby
7*5ea9e707SThomas Veerman granted, provided that the above copyright notice appear in all
8*5ea9e707SThomas Veerman copies and that both that the copyright notice and this
9*5ea9e707SThomas Veerman permission notice and warranty disclaimer appear in supporting
10*5ea9e707SThomas Veerman documentation, and that the name Lucent Technologies or any of
11*5ea9e707SThomas Veerman its entities not be used in advertising or publicity pertaining
12*5ea9e707SThomas Veerman to distribution of the software without specific, written prior
13*5ea9e707SThomas Veerman permission.
14*5ea9e707SThomas Veerman 
15*5ea9e707SThomas Veerman LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16*5ea9e707SThomas Veerman INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17*5ea9e707SThomas Veerman IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18*5ea9e707SThomas Veerman SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19*5ea9e707SThomas Veerman WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20*5ea9e707SThomas Veerman IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21*5ea9e707SThomas Veerman ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22*5ea9e707SThomas Veerman THIS SOFTWARE.
23*5ea9e707SThomas Veerman ****************************************************************/
24*5ea9e707SThomas Veerman 
25*5ea9e707SThomas Veerman #if HAVE_NBTOOL_CONFIG_H
26*5ea9e707SThomas Veerman #include "nbtool_config.h"
27*5ea9e707SThomas Veerman #endif
28*5ea9e707SThomas Veerman 
29*5ea9e707SThomas Veerman #define DEBUG
30*5ea9e707SThomas Veerman #include <stdio.h>
31*5ea9e707SThomas Veerman #include <string.h>
32*5ea9e707SThomas Veerman #include <stdlib.h>
33*5ea9e707SThomas Veerman #include "awk.h"
34*5ea9e707SThomas Veerman #include "awkgram.h"
35*5ea9e707SThomas Veerman 
nodealloc(int n)36*5ea9e707SThomas Veerman Node *nodealloc(int n)
37*5ea9e707SThomas Veerman {
38*5ea9e707SThomas Veerman 	Node *x;
39*5ea9e707SThomas Veerman 
40*5ea9e707SThomas Veerman 	x = malloc(sizeof(Node) + (n-1)*sizeof(Node *));
41*5ea9e707SThomas Veerman 	if (x == NULL)
42*5ea9e707SThomas Veerman 		FATAL("out of space in nodealloc");
43*5ea9e707SThomas Veerman 	x->nnext = NULL;
44*5ea9e707SThomas Veerman 	x->lineno = lineno;
45*5ea9e707SThomas Veerman 	return(x);
46*5ea9e707SThomas Veerman }
47*5ea9e707SThomas Veerman 
exptostat(Node * a)48*5ea9e707SThomas Veerman Node *exptostat(Node *a)
49*5ea9e707SThomas Veerman {
50*5ea9e707SThomas Veerman 	a->ntype = NSTAT;
51*5ea9e707SThomas Veerman 	return(a);
52*5ea9e707SThomas Veerman }
53*5ea9e707SThomas Veerman 
node1(int a,Node * b)54*5ea9e707SThomas Veerman Node *node1(int a, Node *b)
55*5ea9e707SThomas Veerman {
56*5ea9e707SThomas Veerman 	Node *x;
57*5ea9e707SThomas Veerman 
58*5ea9e707SThomas Veerman 	x = nodealloc(1);
59*5ea9e707SThomas Veerman 	x->nobj = a;
60*5ea9e707SThomas Veerman 	x->narg[0]=b;
61*5ea9e707SThomas Veerman 	return(x);
62*5ea9e707SThomas Veerman }
63*5ea9e707SThomas Veerman 
node2(int a,Node * b,Node * c)64*5ea9e707SThomas Veerman Node *node2(int a, Node *b, Node *c)
65*5ea9e707SThomas Veerman {
66*5ea9e707SThomas Veerman 	Node *x;
67*5ea9e707SThomas Veerman 
68*5ea9e707SThomas Veerman 	x = nodealloc(2);
69*5ea9e707SThomas Veerman 	x->nobj = a;
70*5ea9e707SThomas Veerman 	x->narg[0] = b;
71*5ea9e707SThomas Veerman 	x->narg[1] = c;
72*5ea9e707SThomas Veerman 	return(x);
73*5ea9e707SThomas Veerman }
74*5ea9e707SThomas Veerman 
node3(int a,Node * b,Node * c,Node * d)75*5ea9e707SThomas Veerman Node *node3(int a, Node *b, Node *c, Node *d)
76*5ea9e707SThomas Veerman {
77*5ea9e707SThomas Veerman 	Node *x;
78*5ea9e707SThomas Veerman 
79*5ea9e707SThomas Veerman 	x = nodealloc(3);
80*5ea9e707SThomas Veerman 	x->nobj = a;
81*5ea9e707SThomas Veerman 	x->narg[0] = b;
82*5ea9e707SThomas Veerman 	x->narg[1] = c;
83*5ea9e707SThomas Veerman 	x->narg[2] = d;
84*5ea9e707SThomas Veerman 	return(x);
85*5ea9e707SThomas Veerman }
86*5ea9e707SThomas Veerman 
node4(int a,Node * b,Node * c,Node * d,Node * e)87*5ea9e707SThomas Veerman Node *node4(int a, Node *b, Node *c, Node *d, Node *e)
88*5ea9e707SThomas Veerman {
89*5ea9e707SThomas Veerman 	Node *x;
90*5ea9e707SThomas Veerman 
91*5ea9e707SThomas Veerman 	x = nodealloc(4);
92*5ea9e707SThomas Veerman 	x->nobj = a;
93*5ea9e707SThomas Veerman 	x->narg[0] = b;
94*5ea9e707SThomas Veerman 	x->narg[1] = c;
95*5ea9e707SThomas Veerman 	x->narg[2] = d;
96*5ea9e707SThomas Veerman 	x->narg[3] = e;
97*5ea9e707SThomas Veerman 	return(x);
98*5ea9e707SThomas Veerman }
99*5ea9e707SThomas Veerman 
node5(int a,Node * b,Node * c,Node * d,Node * e,Node * f)100*5ea9e707SThomas Veerman Node *node5(int a, Node *b, Node *c, Node *d, Node *e, Node *f)
101*5ea9e707SThomas Veerman {
102*5ea9e707SThomas Veerman 	Node *x;
103*5ea9e707SThomas Veerman 
104*5ea9e707SThomas Veerman 	x = nodealloc(5);
105*5ea9e707SThomas Veerman 	x->nobj = a;
106*5ea9e707SThomas Veerman 	x->narg[0] = b;
107*5ea9e707SThomas Veerman 	x->narg[1] = c;
108*5ea9e707SThomas Veerman 	x->narg[2] = d;
109*5ea9e707SThomas Veerman 	x->narg[3] = e;
110*5ea9e707SThomas Veerman 	x->narg[4] = f;
111*5ea9e707SThomas Veerman 	return(x);
112*5ea9e707SThomas Veerman }
113*5ea9e707SThomas Veerman 
stat1(int a,Node * b)114*5ea9e707SThomas Veerman Node *stat1(int a, Node *b)
115*5ea9e707SThomas Veerman {
116*5ea9e707SThomas Veerman 	Node *x;
117*5ea9e707SThomas Veerman 
118*5ea9e707SThomas Veerman 	x = node1(a,b);
119*5ea9e707SThomas Veerman 	x->ntype = NSTAT;
120*5ea9e707SThomas Veerman 	return(x);
121*5ea9e707SThomas Veerman }
122*5ea9e707SThomas Veerman 
stat2(int a,Node * b,Node * c)123*5ea9e707SThomas Veerman Node *stat2(int a, Node *b, Node *c)
124*5ea9e707SThomas Veerman {
125*5ea9e707SThomas Veerman 	Node *x;
126*5ea9e707SThomas Veerman 
127*5ea9e707SThomas Veerman 	x = node2(a,b,c);
128*5ea9e707SThomas Veerman 	x->ntype = NSTAT;
129*5ea9e707SThomas Veerman 	return(x);
130*5ea9e707SThomas Veerman }
131*5ea9e707SThomas Veerman 
stat3(int a,Node * b,Node * c,Node * d)132*5ea9e707SThomas Veerman Node *stat3(int a, Node *b, Node *c, Node *d)
133*5ea9e707SThomas Veerman {
134*5ea9e707SThomas Veerman 	Node *x;
135*5ea9e707SThomas Veerman 
136*5ea9e707SThomas Veerman 	x = node3(a,b,c,d);
137*5ea9e707SThomas Veerman 	x->ntype = NSTAT;
138*5ea9e707SThomas Veerman 	return(x);
139*5ea9e707SThomas Veerman }
140*5ea9e707SThomas Veerman 
stat4(int a,Node * b,Node * c,Node * d,Node * e)141*5ea9e707SThomas Veerman Node *stat4(int a, Node *b, Node *c, Node *d, Node *e)
142*5ea9e707SThomas Veerman {
143*5ea9e707SThomas Veerman 	Node *x;
144*5ea9e707SThomas Veerman 
145*5ea9e707SThomas Veerman 	x = node4(a,b,c,d,e);
146*5ea9e707SThomas Veerman 	x->ntype = NSTAT;
147*5ea9e707SThomas Veerman 	return(x);
148*5ea9e707SThomas Veerman }
149*5ea9e707SThomas Veerman 
op1(int a,Node * b)150*5ea9e707SThomas Veerman Node *op1(int a, Node *b)
151*5ea9e707SThomas Veerman {
152*5ea9e707SThomas Veerman 	Node *x;
153*5ea9e707SThomas Veerman 
154*5ea9e707SThomas Veerman 	x = node1(a,b);
155*5ea9e707SThomas Veerman 	x->ntype = NEXPR;
156*5ea9e707SThomas Veerman 	return(x);
157*5ea9e707SThomas Veerman }
158*5ea9e707SThomas Veerman 
op2(int a,Node * b,Node * c)159*5ea9e707SThomas Veerman Node *op2(int a, Node *b, Node *c)
160*5ea9e707SThomas Veerman {
161*5ea9e707SThomas Veerman 	Node *x;
162*5ea9e707SThomas Veerman 
163*5ea9e707SThomas Veerman 	x = node2(a,b,c);
164*5ea9e707SThomas Veerman 	x->ntype = NEXPR;
165*5ea9e707SThomas Veerman 	return(x);
166*5ea9e707SThomas Veerman }
167*5ea9e707SThomas Veerman 
op3(int a,Node * b,Node * c,Node * d)168*5ea9e707SThomas Veerman Node *op3(int a, Node *b, Node *c, Node *d)
169*5ea9e707SThomas Veerman {
170*5ea9e707SThomas Veerman 	Node *x;
171*5ea9e707SThomas Veerman 
172*5ea9e707SThomas Veerman 	x = node3(a,b,c,d);
173*5ea9e707SThomas Veerman 	x->ntype = NEXPR;
174*5ea9e707SThomas Veerman 	return(x);
175*5ea9e707SThomas Veerman }
176*5ea9e707SThomas Veerman 
op4(int a,Node * b,Node * c,Node * d,Node * e)177*5ea9e707SThomas Veerman Node *op4(int a, Node *b, Node *c, Node *d, Node *e)
178*5ea9e707SThomas Veerman {
179*5ea9e707SThomas Veerman 	Node *x;
180*5ea9e707SThomas Veerman 
181*5ea9e707SThomas Veerman 	x = node4(a,b,c,d,e);
182*5ea9e707SThomas Veerman 	x->ntype = NEXPR;
183*5ea9e707SThomas Veerman 	return(x);
184*5ea9e707SThomas Veerman }
185*5ea9e707SThomas Veerman 
op5(int a,Node * b,Node * c,Node * d,Node * e,Node * f)186*5ea9e707SThomas Veerman Node *op5(int a, Node *b, Node *c, Node *d, Node *e, Node *f)
187*5ea9e707SThomas Veerman {
188*5ea9e707SThomas Veerman 	Node *x;
189*5ea9e707SThomas Veerman 
190*5ea9e707SThomas Veerman 	x = node5(a,b,c,d,e, f);
191*5ea9e707SThomas Veerman 	x->ntype = NEXPR;
192*5ea9e707SThomas Veerman 	return(x);
193*5ea9e707SThomas Veerman }
194*5ea9e707SThomas Veerman 
celltonode(Cell * a,int b)195*5ea9e707SThomas Veerman Node *celltonode(Cell *a, int b)
196*5ea9e707SThomas Veerman {
197*5ea9e707SThomas Veerman 	Node *x;
198*5ea9e707SThomas Veerman 
199*5ea9e707SThomas Veerman 	a->ctype = OCELL;
200*5ea9e707SThomas Veerman 	a->csub = b;
201*5ea9e707SThomas Veerman 	x = node1(0, (Node *) a);
202*5ea9e707SThomas Veerman 	x->ntype = NVALUE;
203*5ea9e707SThomas Veerman 	return(x);
204*5ea9e707SThomas Veerman }
205*5ea9e707SThomas Veerman 
rectonode(void)206*5ea9e707SThomas Veerman Node *rectonode(void)	/* make $0 into a Node */
207*5ea9e707SThomas Veerman {
208*5ea9e707SThomas Veerman 	extern Cell *literal0;
209*5ea9e707SThomas Veerman 	return op1(INDIRECT, celltonode(literal0, CUNK));
210*5ea9e707SThomas Veerman }
211*5ea9e707SThomas Veerman 
makearr(Node * p)212*5ea9e707SThomas Veerman Node *makearr(Node *p)
213*5ea9e707SThomas Veerman {
214*5ea9e707SThomas Veerman 	Cell *cp;
215*5ea9e707SThomas Veerman 
216*5ea9e707SThomas Veerman 	if (isvalue(p)) {
217*5ea9e707SThomas Veerman 		cp = (Cell *) (p->narg[0]);
218*5ea9e707SThomas Veerman 		if (isfcn(cp))
219*5ea9e707SThomas Veerman 			SYNTAX( "%s is a function, not an array", cp->nval );
220*5ea9e707SThomas Veerman 		else if (!isarr(cp)) {
221*5ea9e707SThomas Veerman 			xfree(cp->sval);
222*5ea9e707SThomas Veerman 			cp->sval = (char *) makesymtab(NSYMTAB);
223*5ea9e707SThomas Veerman 			cp->tval = ARR;
224*5ea9e707SThomas Veerman 		}
225*5ea9e707SThomas Veerman 	}
226*5ea9e707SThomas Veerman 	return p;
227*5ea9e707SThomas Veerman }
228*5ea9e707SThomas Veerman 
229*5ea9e707SThomas Veerman #define PA2NUM	50	/* max number of pat,pat patterns allowed */
230*5ea9e707SThomas Veerman int	paircnt;		/* number of them in use */
231*5ea9e707SThomas Veerman int	pairstack[PA2NUM];	/* state of each pat,pat */
232*5ea9e707SThomas Veerman 
pa2stat(Node * a,Node * b,Node * c)233*5ea9e707SThomas Veerman Node *pa2stat(Node *a, Node *b, Node *c)	/* pat, pat {...} */
234*5ea9e707SThomas Veerman {
235*5ea9e707SThomas Veerman 	Node *x;
236*5ea9e707SThomas Veerman 
237*5ea9e707SThomas Veerman 	x = node4(PASTAT2, a, b, c, itonp(paircnt));
238*5ea9e707SThomas Veerman 	if (paircnt++ >= PA2NUM)
239*5ea9e707SThomas Veerman 		SYNTAX( "limited to %d pat,pat statements", PA2NUM );
240*5ea9e707SThomas Veerman 	x->ntype = NSTAT;
241*5ea9e707SThomas Veerman 	return(x);
242*5ea9e707SThomas Veerman }
243*5ea9e707SThomas Veerman 
linkum(Node * a,Node * b)244*5ea9e707SThomas Veerman Node *linkum(Node *a, Node *b)
245*5ea9e707SThomas Veerman {
246*5ea9e707SThomas Veerman 	Node *c;
247*5ea9e707SThomas Veerman 
248*5ea9e707SThomas Veerman 	if (errorflag)	/* don't link things that are wrong */
249*5ea9e707SThomas Veerman 		return a;
250*5ea9e707SThomas Veerman 	if (a == NULL)
251*5ea9e707SThomas Veerman 		return(b);
252*5ea9e707SThomas Veerman 	else if (b == NULL)
253*5ea9e707SThomas Veerman 		return(a);
254*5ea9e707SThomas Veerman 	for (c = a; c->nnext != NULL; c = c->nnext)
255*5ea9e707SThomas Veerman 		;
256*5ea9e707SThomas Veerman 	c->nnext = b;
257*5ea9e707SThomas Veerman 	return(a);
258*5ea9e707SThomas Veerman }
259*5ea9e707SThomas Veerman 
defn(Cell * v,Node * vl,Node * st)260*5ea9e707SThomas Veerman void defn(Cell *v, Node *vl, Node *st)	/* turn on FCN bit in definition, */
261*5ea9e707SThomas Veerman {					/*   body of function, arglist */
262*5ea9e707SThomas Veerman 	Node *p;
263*5ea9e707SThomas Veerman 	int n;
264*5ea9e707SThomas Veerman 
265*5ea9e707SThomas Veerman 	if (isarr(v)) {
266*5ea9e707SThomas Veerman 		SYNTAX( "`%s' is an array name and a function name", v->nval );
267*5ea9e707SThomas Veerman 		return;
268*5ea9e707SThomas Veerman 	}
269*5ea9e707SThomas Veerman 	if (isarg(v->nval) != -1) {
270*5ea9e707SThomas Veerman 		SYNTAX( "`%s' is both function name and argument name", v->nval );
271*5ea9e707SThomas Veerman 		return;
272*5ea9e707SThomas Veerman 	}
273*5ea9e707SThomas Veerman 
274*5ea9e707SThomas Veerman 	v->tval = FCN;
275*5ea9e707SThomas Veerman 	v->sval = (char *) st;
276*5ea9e707SThomas Veerman 	n = 0;	/* count arguments */
277*5ea9e707SThomas Veerman 	for (p = vl; p; p = p->nnext)
278*5ea9e707SThomas Veerman 		n++;
279*5ea9e707SThomas Veerman 	v->fval = n;
280*5ea9e707SThomas Veerman 	dprintf( ("defining func %s (%d args)\n", v->nval, n) );
281*5ea9e707SThomas Veerman }
282*5ea9e707SThomas Veerman 
isarg(const char * s)283*5ea9e707SThomas Veerman int isarg(const char *s)		/* is s in argument list for current function? */
284*5ea9e707SThomas Veerman {			/* return -1 if not, otherwise arg # */
285*5ea9e707SThomas Veerman 	extern Node *arglist;
286*5ea9e707SThomas Veerman 	Node *p = arglist;
287*5ea9e707SThomas Veerman 	int n;
288*5ea9e707SThomas Veerman 
289*5ea9e707SThomas Veerman 	for (n = 0; p != 0; p = p->nnext, n++)
290*5ea9e707SThomas Veerman 		if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
291*5ea9e707SThomas Veerman 			return n;
292*5ea9e707SThomas Veerman 	return -1;
293*5ea9e707SThomas Veerman }
294*5ea9e707SThomas Veerman 
ptoi(void * p)295*5ea9e707SThomas Veerman int ptoi(void *p)	/* convert pointer to integer */
296*5ea9e707SThomas Veerman {
297*5ea9e707SThomas Veerman 	return (int) (long) p;	/* swearing that p fits, of course */
298*5ea9e707SThomas Veerman }
299*5ea9e707SThomas Veerman 
itonp(int i)300*5ea9e707SThomas Veerman Node *itonp(int i)	/* and vice versa */
301*5ea9e707SThomas Veerman {
302*5ea9e707SThomas Veerman 	return (Node *) (long) i;
303*5ea9e707SThomas Veerman }
304