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