diff options
Diffstat (limited to 'usr/src/cmd/awk/parse.c')
-rw-r--r-- | usr/src/cmd/awk/parse.c | 152 |
1 files changed, 95 insertions, 57 deletions
diff --git a/usr/src/cmd/awk/parse.c b/usr/src/cmd/awk/parse.c index 909977f10f..c91550f310 100644 --- a/usr/src/cmd/awk/parse.c +++ b/usr/src/cmd/awk/parse.c @@ -1,4 +1,28 @@ /* + * Copyright (C) Lucent Technologies 1997 + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appear in all + * copies and that both that the copyright notice and this + * permission notice and warranty disclaimer appear in supporting + * documentation, and that the name Lucent Technologies or any of + * its entities not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. + * + * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + * THIS SOFTWARE. + */ + +/* * CDDL HEADER START * * The contents of this file are subject to the terms of the @@ -28,8 +52,6 @@ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ -#pragma ident "%Z%%M% %I% %E% SMI" - #define DEBUG #include "awk.h" #include "y.tab.h" @@ -37,11 +59,11 @@ Node * nodealloc(int n) { - register Node *x; + Node *x; x = (Node *)malloc(sizeof (Node) + (n - 1) * sizeof (Node *)); if (x == NULL) - ERROR "out of space in nodealloc" FATAL; + FATAL("out of space in nodealloc"); x->nnext = NULL; x->lineno = lineno; return (x); @@ -57,7 +79,7 @@ exptostat(Node *a) Node * node1(int a, Node *b) { - register Node *x; + Node *x; x = nodealloc(1); x->nobj = a; @@ -68,7 +90,7 @@ node1(int a, Node *b) Node * node2(int a, Node *b, Node *c) { - register Node *x; + Node *x; x = nodealloc(2); x->nobj = a; @@ -80,7 +102,7 @@ node2(int a, Node *b, Node *c) Node * node3(int a, Node *b, Node *c, Node *d) { - register Node *x; + Node *x; x = nodealloc(3); x->nobj = a; @@ -93,7 +115,8 @@ node3(int a, Node *b, Node *c, Node *d) Node * node4(int a, Node *b, Node *c, Node *d, Node *e) { - register Node *x; + Node *x; + x = nodealloc(4); x->nobj = a; x->narg[0] = b; @@ -104,89 +127,89 @@ node4(int a, Node *b, Node *c, Node *d, Node *e) } Node * -stat3(int a, Node *b, Node *c, Node *d) +stat1(int a, Node *b) { - register Node *x; + Node *x; - x = node3(a, b, c, d); + x = node1(a, b); x->ntype = NSTAT; return (x); } Node * -op2(int a, Node *b, Node *c) +stat2(int a, Node *b, Node *c) { - register Node *x; + Node *x; x = node2(a, b, c); - x->ntype = NEXPR; + x->ntype = NSTAT; return (x); } Node * -op1(int a, Node *b) +stat3(int a, Node *b, Node *c, Node *d) { - register Node *x; + Node *x; - x = node1(a, b); - x->ntype = NEXPR; + x = node3(a, b, c, d); + x->ntype = NSTAT; return (x); } Node * -stat1(int a, Node *b) +stat4(int a, Node *b, Node *c, Node *d, Node *e) { - register Node *x; + Node *x; - x = node1(a, b); + x = node4(a, b, c, d, e); x->ntype = NSTAT; return (x); } Node * -op3(int a, Node *b, Node *c, Node *d) +op1(int a, Node *b) { - register Node *x; + Node *x; - x = node3(a, b, c, d); + x = node1(a, b); x->ntype = NEXPR; return (x); } Node * -op4(int a, Node *b, Node *c, Node *d, Node *e) +op2(int a, Node *b, Node *c) { - register Node *x; + Node *x; - x = node4(a, b, c, d, e); + x = node2(a, b, c); x->ntype = NEXPR; return (x); } Node * -stat2(int a, Node *b, Node *c) +op3(int a, Node *b, Node *c, Node *d) { - register Node *x; + Node *x; - x = node2(a, b, c); - x->ntype = NSTAT; + x = node3(a, b, c, d); + x->ntype = NEXPR; return (x); } Node * -stat4(int a, Node *b, Node *c, Node *d, Node *e) +op4(int a, Node *b, Node *c, Node *d, Node *e) { - register Node *x; + Node *x; x = node4(a, b, c, d, e); - x->ntype = NSTAT; + x->ntype = NEXPR; return (x); } Node * -valtonode(Cell *a, int b) +celltonode(Cell *a, int b) { - register Node *x; + Node *x; a->ctype = OCELL; a->csub = b; @@ -196,10 +219,9 @@ valtonode(Cell *a, int b) } Node * -rectonode(void) +rectonode(void) /* make $0 into a Node */ { - /* return valtonode(lookup("$0", symtab), CFLD); */ - return (valtonode(recloc, CFLD)); + return (celltonode(recloc, CFLD)); } Node * @@ -209,23 +231,26 @@ makearr(Node *p) if (isvalue(p)) { cp = (Cell *)(p->narg[0]); - if (isfunc(cp)) - ERROR "%s is a function, not an array", cp->nval SYNTAX; + if (isfcn(cp)) + SYNTAX("%s is a function, not an array", cp->nval); else if (!isarr(cp)) { xfree(cp->sval); - cp->sval = (uchar *)makesymtab(NSYMTAB); + cp->sval = (char *)makesymtab(NSYMTAB); cp->tval = ARR; } } return (p); } +int paircnt; /* number of them in use */ +int *pairstack; /* state of each pat,pat */ + Node * -pa2stat(Node *a, Node *b, Node *c) +pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */ { - register Node *x; + Node *x; - x = node4(PASTAT2, a, b, c, (Node *)paircnt); + x = node4(PASTAT2, a, b, c, itonp(paircnt)); paircnt++; x->ntype = NSTAT; return (x); @@ -234,7 +259,7 @@ pa2stat(Node *a, Node *b, Node *c) Node * linkum(Node *a, Node *b) { - register Node *c; + Node *c; if (errorflag) /* don't link things that are wrong */ return (a); @@ -248,38 +273,51 @@ linkum(Node *a, Node *b) return (a); } +/* turn on FCN bit in definition, */ +/* body of function, arglist */ void -defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition */ +defn(Cell *v, Node *vl, Node *st) { Node *p; int n; if (isarr(v)) { - ERROR "`%s' is an array name and a function name", - v->nval SYNTAX; + SYNTAX("`%s' is an array name and a function name", v->nval); return; } + v->tval = FCN; - v->sval = (uchar *)st; + v->sval = (char *)st; n = 0; /* count arguments */ - for (p = vl; p; p = p->nnext) + for (p = vl; p != NULL; p = p->nnext) n++; v->fval = n; dprintf(("defining func %s (%d args)\n", v->nval, n)); } +/* is s in argument list for current function? */ +/* return -1 if not, otherwise arg # */ int -isarg(uchar *s) /* is s in argument list for current function? */ +isarg(const char *s) { extern Node *arglist; Node *p = arglist; int n; - for (n = 0; p != 0; p = p->nnext, n++) { - if (strcmp((char *)((Cell *)(p->narg[0]))->nval, - (char *)s) == 0) { + for (n = 0; p != NULL; p = p->nnext, n++) + if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0) return (n); - } - } return (-1); } + +int +ptoi(void *p) /* convert pointer to integer */ +{ + return ((int)(long)p); /* swearing that p fits, of course */ +} + +Node * +itonp(int i) /* and vice versa */ +{ + return ((Node *)(long)i); +} |