14b588458SPeter Avalos /**************************************************************** 24b588458SPeter Avalos Copyright (C) Lucent Technologies 1997 34b588458SPeter Avalos All Rights Reserved 44b588458SPeter Avalos 54b588458SPeter Avalos Permission to use, copy, modify, and distribute this software and 64b588458SPeter Avalos its documentation for any purpose and without fee is hereby 74b588458SPeter Avalos granted, provided that the above copyright notice appear in all 84b588458SPeter Avalos copies and that both that the copyright notice and this 94b588458SPeter Avalos permission notice and warranty disclaimer appear in supporting 104b588458SPeter Avalos documentation, and that the name Lucent Technologies or any of 114b588458SPeter Avalos its entities not be used in advertising or publicity pertaining 124b588458SPeter Avalos to distribution of the software without specific, written prior 134b588458SPeter Avalos permission. 144b588458SPeter Avalos 154b588458SPeter Avalos LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 164b588458SPeter Avalos INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. 174b588458SPeter Avalos IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY 184b588458SPeter Avalos SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 194b588458SPeter Avalos WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 204b588458SPeter Avalos IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 214b588458SPeter Avalos ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 224b588458SPeter Avalos THIS SOFTWARE. 234b588458SPeter Avalos ****************************************************************/ 244b588458SPeter Avalos 254b588458SPeter Avalos #define DEBUG 264b588458SPeter Avalos #include <stdio.h> 274b588458SPeter Avalos #include <string.h> 284b588458SPeter Avalos #include <stdlib.h> 294b588458SPeter Avalos #include "awk.h" 304b588458SPeter Avalos #include "ytab.h" 314b588458SPeter Avalos 324b588458SPeter Avalos Node *nodealloc(int n) 334b588458SPeter Avalos { 344b588458SPeter Avalos Node *x; 354b588458SPeter Avalos 36*1d48fce0SDaniel Fojt x = malloc(sizeof(*x) + (n-1) * sizeof(x)); 374b588458SPeter Avalos if (x == NULL) 384b588458SPeter Avalos FATAL("out of space in nodealloc"); 394b588458SPeter Avalos x->nnext = NULL; 404b588458SPeter Avalos x->lineno = lineno; 414b588458SPeter Avalos return(x); 424b588458SPeter Avalos } 434b588458SPeter Avalos 444b588458SPeter Avalos Node *exptostat(Node *a) 454b588458SPeter Avalos { 464b588458SPeter Avalos a->ntype = NSTAT; 474b588458SPeter Avalos return(a); 484b588458SPeter Avalos } 494b588458SPeter Avalos 504b588458SPeter Avalos Node *node1(int a, Node *b) 514b588458SPeter Avalos { 524b588458SPeter Avalos Node *x; 534b588458SPeter Avalos 544b588458SPeter Avalos x = nodealloc(1); 554b588458SPeter Avalos x->nobj = a; 564b588458SPeter Avalos x->narg[0]=b; 574b588458SPeter Avalos return(x); 584b588458SPeter Avalos } 594b588458SPeter Avalos 604b588458SPeter Avalos Node *node2(int a, Node *b, Node *c) 614b588458SPeter Avalos { 624b588458SPeter Avalos Node *x; 634b588458SPeter Avalos 644b588458SPeter Avalos x = nodealloc(2); 654b588458SPeter Avalos x->nobj = a; 664b588458SPeter Avalos x->narg[0] = b; 674b588458SPeter Avalos x->narg[1] = c; 684b588458SPeter Avalos return(x); 694b588458SPeter Avalos } 704b588458SPeter Avalos 714b588458SPeter Avalos Node *node3(int a, Node *b, Node *c, Node *d) 724b588458SPeter Avalos { 734b588458SPeter Avalos Node *x; 744b588458SPeter Avalos 754b588458SPeter Avalos x = nodealloc(3); 764b588458SPeter Avalos x->nobj = a; 774b588458SPeter Avalos x->narg[0] = b; 784b588458SPeter Avalos x->narg[1] = c; 794b588458SPeter Avalos x->narg[2] = d; 804b588458SPeter Avalos return(x); 814b588458SPeter Avalos } 824b588458SPeter Avalos 834b588458SPeter Avalos Node *node4(int a, Node *b, Node *c, Node *d, Node *e) 844b588458SPeter Avalos { 854b588458SPeter Avalos Node *x; 864b588458SPeter Avalos 874b588458SPeter Avalos x = nodealloc(4); 884b588458SPeter Avalos x->nobj = a; 894b588458SPeter Avalos x->narg[0] = b; 904b588458SPeter Avalos x->narg[1] = c; 914b588458SPeter Avalos x->narg[2] = d; 924b588458SPeter Avalos x->narg[3] = e; 934b588458SPeter Avalos return(x); 944b588458SPeter Avalos } 954b588458SPeter Avalos 964b588458SPeter Avalos Node *stat1(int a, Node *b) 974b588458SPeter Avalos { 984b588458SPeter Avalos Node *x; 994b588458SPeter Avalos 1004b588458SPeter Avalos x = node1(a,b); 1014b588458SPeter Avalos x->ntype = NSTAT; 1024b588458SPeter Avalos return(x); 1034b588458SPeter Avalos } 1044b588458SPeter Avalos 1054b588458SPeter Avalos Node *stat2(int a, Node *b, Node *c) 1064b588458SPeter Avalos { 1074b588458SPeter Avalos Node *x; 1084b588458SPeter Avalos 1094b588458SPeter Avalos x = node2(a,b,c); 1104b588458SPeter Avalos x->ntype = NSTAT; 1114b588458SPeter Avalos return(x); 1124b588458SPeter Avalos } 1134b588458SPeter Avalos 1144b588458SPeter Avalos Node *stat3(int a, Node *b, Node *c, Node *d) 1154b588458SPeter Avalos { 1164b588458SPeter Avalos Node *x; 1174b588458SPeter Avalos 1184b588458SPeter Avalos x = node3(a,b,c,d); 1194b588458SPeter Avalos x->ntype = NSTAT; 1204b588458SPeter Avalos return(x); 1214b588458SPeter Avalos } 1224b588458SPeter Avalos 1234b588458SPeter Avalos Node *stat4(int a, Node *b, Node *c, Node *d, Node *e) 1244b588458SPeter Avalos { 1254b588458SPeter Avalos Node *x; 1264b588458SPeter Avalos 1274b588458SPeter Avalos x = node4(a,b,c,d,e); 1284b588458SPeter Avalos x->ntype = NSTAT; 1294b588458SPeter Avalos return(x); 1304b588458SPeter Avalos } 1314b588458SPeter Avalos 1324b588458SPeter Avalos Node *op1(int a, Node *b) 1334b588458SPeter Avalos { 1344b588458SPeter Avalos Node *x; 1354b588458SPeter Avalos 1364b588458SPeter Avalos x = node1(a,b); 1374b588458SPeter Avalos x->ntype = NEXPR; 1384b588458SPeter Avalos return(x); 1394b588458SPeter Avalos } 1404b588458SPeter Avalos 1414b588458SPeter Avalos Node *op2(int a, Node *b, Node *c) 1424b588458SPeter Avalos { 1434b588458SPeter Avalos Node *x; 1444b588458SPeter Avalos 1454b588458SPeter Avalos x = node2(a,b,c); 1464b588458SPeter Avalos x->ntype = NEXPR; 1474b588458SPeter Avalos return(x); 1484b588458SPeter Avalos } 1494b588458SPeter Avalos 1504b588458SPeter Avalos Node *op3(int a, Node *b, Node *c, Node *d) 1514b588458SPeter Avalos { 1524b588458SPeter Avalos Node *x; 1534b588458SPeter Avalos 1544b588458SPeter Avalos x = node3(a,b,c,d); 1554b588458SPeter Avalos x->ntype = NEXPR; 1564b588458SPeter Avalos return(x); 1574b588458SPeter Avalos } 1584b588458SPeter Avalos 1594b588458SPeter Avalos Node *op4(int a, Node *b, Node *c, Node *d, Node *e) 1604b588458SPeter Avalos { 1614b588458SPeter Avalos Node *x; 1624b588458SPeter Avalos 1634b588458SPeter Avalos x = node4(a,b,c,d,e); 1644b588458SPeter Avalos x->ntype = NEXPR; 1654b588458SPeter Avalos return(x); 1664b588458SPeter Avalos } 1674b588458SPeter Avalos 1684b588458SPeter Avalos Node *celltonode(Cell *a, int b) 1694b588458SPeter Avalos { 1704b588458SPeter Avalos Node *x; 1714b588458SPeter Avalos 1724b588458SPeter Avalos a->ctype = OCELL; 1734b588458SPeter Avalos a->csub = b; 1744b588458SPeter Avalos x = node1(0, (Node *) a); 1754b588458SPeter Avalos x->ntype = NVALUE; 1764b588458SPeter Avalos return(x); 1774b588458SPeter Avalos } 1784b588458SPeter Avalos 1794b588458SPeter Avalos Node *rectonode(void) /* make $0 into a Node */ 1804b588458SPeter Avalos { 1814b588458SPeter Avalos extern Cell *literal0; 1824b588458SPeter Avalos return op1(INDIRECT, celltonode(literal0, CUNK)); 1834b588458SPeter Avalos } 1844b588458SPeter Avalos 1854b588458SPeter Avalos Node *makearr(Node *p) 1864b588458SPeter Avalos { 1874b588458SPeter Avalos Cell *cp; 1884b588458SPeter Avalos 1894b588458SPeter Avalos if (isvalue(p)) { 1904b588458SPeter Avalos cp = (Cell *) (p->narg[0]); 1914b588458SPeter Avalos if (isfcn(cp)) 1924b588458SPeter Avalos SYNTAX( "%s is a function, not an array", cp->nval ); 1934b588458SPeter Avalos else if (!isarr(cp)) { 1944b588458SPeter Avalos xfree(cp->sval); 1954b588458SPeter Avalos cp->sval = (char *) makesymtab(NSYMTAB); 1964b588458SPeter Avalos cp->tval = ARR; 1974b588458SPeter Avalos } 1984b588458SPeter Avalos } 1994b588458SPeter Avalos return p; 2004b588458SPeter Avalos } 2014b588458SPeter Avalos 2024b588458SPeter Avalos #define PA2NUM 50 /* max number of pat,pat patterns allowed */ 2034b588458SPeter Avalos int paircnt; /* number of them in use */ 2044b588458SPeter Avalos int pairstack[PA2NUM]; /* state of each pat,pat */ 2054b588458SPeter Avalos 2064b588458SPeter Avalos Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */ 2074b588458SPeter Avalos { 2084b588458SPeter Avalos Node *x; 2094b588458SPeter Avalos 2104b588458SPeter Avalos x = node4(PASTAT2, a, b, c, itonp(paircnt)); 2114b588458SPeter Avalos if (paircnt++ >= PA2NUM) 2124b588458SPeter Avalos SYNTAX( "limited to %d pat,pat statements", PA2NUM ); 2134b588458SPeter Avalos x->ntype = NSTAT; 2144b588458SPeter Avalos return(x); 2154b588458SPeter Avalos } 2164b588458SPeter Avalos 2174b588458SPeter Avalos Node *linkum(Node *a, Node *b) 2184b588458SPeter Avalos { 2194b588458SPeter Avalos Node *c; 2204b588458SPeter Avalos 2214b588458SPeter Avalos if (errorflag) /* don't link things that are wrong */ 2224b588458SPeter Avalos return a; 2234b588458SPeter Avalos if (a == NULL) 2244b588458SPeter Avalos return(b); 2254b588458SPeter Avalos else if (b == NULL) 2264b588458SPeter Avalos return(a); 2274b588458SPeter Avalos for (c = a; c->nnext != NULL; c = c->nnext) 2284b588458SPeter Avalos ; 2294b588458SPeter Avalos c->nnext = b; 2304b588458SPeter Avalos return(a); 2314b588458SPeter Avalos } 2324b588458SPeter Avalos 2334b588458SPeter Avalos void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */ 2344b588458SPeter Avalos { /* body of function, arglist */ 2354b588458SPeter Avalos Node *p; 2364b588458SPeter Avalos int n; 2374b588458SPeter Avalos 2384b588458SPeter Avalos if (isarr(v)) { 2394b588458SPeter Avalos SYNTAX( "`%s' is an array name and a function name", v->nval ); 2404b588458SPeter Avalos return; 2414b588458SPeter Avalos } 2424b588458SPeter Avalos if (isarg(v->nval) != -1) { 2434b588458SPeter Avalos SYNTAX( "`%s' is both function name and argument name", v->nval ); 2444b588458SPeter Avalos return; 2454b588458SPeter Avalos } 2464b588458SPeter Avalos 2474b588458SPeter Avalos v->tval = FCN; 2484b588458SPeter Avalos v->sval = (char *) st; 2494b588458SPeter Avalos n = 0; /* count arguments */ 2504b588458SPeter Avalos for (p = vl; p; p = p->nnext) 2514b588458SPeter Avalos n++; 2524b588458SPeter Avalos v->fval = n; 2534b588458SPeter Avalos dprintf( ("defining func %s (%d args)\n", v->nval, n) ); 2544b588458SPeter Avalos } 2554b588458SPeter Avalos 2564b588458SPeter Avalos int isarg(const char *s) /* is s in argument list for current function? */ 2574b588458SPeter Avalos { /* return -1 if not, otherwise arg # */ 2584b588458SPeter Avalos extern Node *arglist; 2594b588458SPeter Avalos Node *p = arglist; 2604b588458SPeter Avalos int n; 2614b588458SPeter Avalos 262*1d48fce0SDaniel Fojt for (n = 0; p != NULL; p = p->nnext, n++) 2634b588458SPeter Avalos if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0) 2644b588458SPeter Avalos return n; 2654b588458SPeter Avalos return -1; 2664b588458SPeter Avalos } 2674b588458SPeter Avalos 2684b588458SPeter Avalos int ptoi(void *p) /* convert pointer to integer */ 2694b588458SPeter Avalos { 2704b588458SPeter Avalos return (int) (long) p; /* swearing that p fits, of course */ 2714b588458SPeter Avalos } 2724b588458SPeter Avalos 2734b588458SPeter Avalos Node *itonp(int i) /* and vice versa */ 2744b588458SPeter Avalos { 2754b588458SPeter Avalos return (Node *) (long) i; 2764b588458SPeter Avalos } 277