1 /****************************************************************
2 Copyright (C) Lucent Technologies 1997
5 Permission to use, copy, modify, and distribute this software and
6 its documentation for any purpose and without fee is hereby
7 granted, provided that the above copyright notice appear in all
8 copies and that both that the copyright notice and this
9 permission notice and warranty disclaimer appear in supporting
10 documentation, and that the name Lucent Technologies or any of
11 its entities not be used in advertising or publicity pertaining
12 to distribution of the software without specific, written prior
15 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
23 ****************************************************************/
31 Node *nodealloc(int n)
35 x = (Node *) malloc(sizeof(Node) + (n-1)*sizeof(Node *));
37 FATAL("out of space in nodealloc");
43 Node *exptostat(Node *a)
49 Node *node1(int a, Node *b)
59 Node *node2(int a, Node *b, Node *c)
70 Node *node3(int a, Node *b, Node *c, Node *d)
82 Node *node4(int a, Node *b, Node *c, Node *d, Node *e)
95 Node *stat1(int a, Node *b)
104 Node *stat2(int a, Node *b, Node *c)
113 Node *stat3(int a, Node *b, Node *c, Node *d)
122 Node *stat4(int a, Node *b, Node *c, Node *d, Node *e)
126 x = node4(a,b,c,d,e);
131 Node *op1(int a, Node *b)
140 Node *op2(int a, Node *b, Node *c)
149 Node *op3(int a, Node *b, Node *c, Node *d)
158 Node *op4(int a, Node *b, Node *c, Node *d, Node *e)
162 x = node4(a,b,c,d,e);
167 Node *celltonode(Cell *a, int b)
173 x = node1(0, (Node *) a);
178 Node *rectonode(void) /* make $0 into a Node */
180 extern Cell *literal0;
181 return op1(INDIRECT, celltonode(literal0, CUNK));
184 Node *makearr(Node *p)
189 cp = (Cell *) (p->narg[0]);
191 SYNTAX( "%s is a function, not an array", cp->nval );
192 else if (!isarr(cp)) {
194 cp->sval = (char *) makesymtab(NSYMTAB);
201 #define PA2NUM 50 /* max number of pat,pat patterns allowed */
202 int paircnt; /* number of them in use */
203 int pairstack[PA2NUM]; /* state of each pat,pat */
205 Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */
209 x = node4(PASTAT2, a, b, c, itonp(paircnt));
210 if (paircnt++ >= PA2NUM)
211 SYNTAX( "limited to %d pat,pat statements", PA2NUM );
216 Node *linkum(Node *a, Node *b)
220 if (errorflag) /* don't link things that are wrong */
226 for (c = a; c->nnext != nil; c = c->nnext)
232 void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */
233 { /* body of function, arglist */
238 SYNTAX( "`%s' is an array name and a function name", v->nval );
242 v->sval = (char *) st;
243 n = 0; /* count arguments */
244 for (p = vl; p; p = p->nnext)
247 dprint( ("defining func %s (%d args)\n", v->nval, n) );
250 int isarg(char *s) /* is s in argument list for current function? */
251 { /* return -1 if not, otherwise arg # */
252 extern Node *arglist;
256 for (n = 0; p != 0; p = p->nnext, n++)
257 if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
262 int ptoi(void *p) /* convert pointer to integer */
264 return (int) (vlong) p; /* swearing that p fits, of course */
267 Node *itonp(int i) /* and vice versa */
269 return (Node *) (long) i;