Annotation of rpl/rplawk/parse.c, revision 1.1
1.1 ! bertrand 1: /****************************************************************
! 2: Copyright (C) Lucent Technologies 1997
! 3: All Rights Reserved
! 4:
! 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
! 13: permission.
! 14:
! 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
! 22: THIS SOFTWARE.
! 23: ****************************************************************/
! 24:
! 25: #define DEBUG
! 26: #include <stdio.h>
! 27: #include <string.h>
! 28: #include <stdlib.h>
! 29: #include "awk.h"
! 30: #include "ytab.h"
! 31:
! 32: Node *nodealloc(int n)
! 33: {
! 34: Node *x;
! 35:
! 36: x = (Node *) malloc(sizeof(Node) + (n-1)*sizeof(Node *));
! 37: if (x == NULL)
! 38: FATAL("out of space in nodealloc");
! 39: x->nnext = NULL;
! 40: x->lineno = lineno;
! 41: return(x);
! 42: }
! 43:
! 44: Node *exptostat(Node *a)
! 45: {
! 46: a->ntype = NSTAT;
! 47: return(a);
! 48: }
! 49:
! 50: Node *node1(int a, Node *b)
! 51: {
! 52: Node *x;
! 53:
! 54: x = nodealloc(1);
! 55: x->nobj = a;
! 56: x->narg[0]=b;
! 57: return(x);
! 58: }
! 59:
! 60: Node *node2(int a, Node *b, Node *c)
! 61: {
! 62: Node *x;
! 63:
! 64: x = nodealloc(2);
! 65: x->nobj = a;
! 66: x->narg[0] = b;
! 67: x->narg[1] = c;
! 68: return(x);
! 69: }
! 70:
! 71: Node *node3(int a, Node *b, Node *c, Node *d)
! 72: {
! 73: Node *x;
! 74:
! 75: x = nodealloc(3);
! 76: x->nobj = a;
! 77: x->narg[0] = b;
! 78: x->narg[1] = c;
! 79: x->narg[2] = d;
! 80: return(x);
! 81: }
! 82:
! 83: Node *node4(int a, Node *b, Node *c, Node *d, Node *e)
! 84: {
! 85: Node *x;
! 86:
! 87: x = nodealloc(4);
! 88: x->nobj = a;
! 89: x->narg[0] = b;
! 90: x->narg[1] = c;
! 91: x->narg[2] = d;
! 92: x->narg[3] = e;
! 93: return(x);
! 94: }
! 95:
! 96: Node *stat1(int a, Node *b)
! 97: {
! 98: Node *x;
! 99:
! 100: x = node1(a,b);
! 101: x->ntype = NSTAT;
! 102: return(x);
! 103: }
! 104:
! 105: Node *stat2(int a, Node *b, Node *c)
! 106: {
! 107: Node *x;
! 108:
! 109: x = node2(a,b,c);
! 110: x->ntype = NSTAT;
! 111: return(x);
! 112: }
! 113:
! 114: Node *stat3(int a, Node *b, Node *c, Node *d)
! 115: {
! 116: Node *x;
! 117:
! 118: x = node3(a,b,c,d);
! 119: x->ntype = NSTAT;
! 120: return(x);
! 121: }
! 122:
! 123: Node *stat4(int a, Node *b, Node *c, Node *d, Node *e)
! 124: {
! 125: Node *x;
! 126:
! 127: x = node4(a,b,c,d,e);
! 128: x->ntype = NSTAT;
! 129: return(x);
! 130: }
! 131:
! 132: Node *op1(int a, Node *b)
! 133: {
! 134: Node *x;
! 135:
! 136: x = node1(a,b);
! 137: x->ntype = NEXPR;
! 138: return(x);
! 139: }
! 140:
! 141: Node *op2(int a, Node *b, Node *c)
! 142: {
! 143: Node *x;
! 144:
! 145: x = node2(a,b,c);
! 146: x->ntype = NEXPR;
! 147: return(x);
! 148: }
! 149:
! 150: Node *op3(int a, Node *b, Node *c, Node *d)
! 151: {
! 152: Node *x;
! 153:
! 154: x = node3(a,b,c,d);
! 155: x->ntype = NEXPR;
! 156: return(x);
! 157: }
! 158:
! 159: Node *op4(int a, Node *b, Node *c, Node *d, Node *e)
! 160: {
! 161: Node *x;
! 162:
! 163: x = node4(a,b,c,d,e);
! 164: x->ntype = NEXPR;
! 165: return(x);
! 166: }
! 167:
! 168: Node *celltonode(Cell *a, int b)
! 169: {
! 170: Node *x;
! 171:
! 172: a->ctype = OCELL;
! 173: a->csub = b;
! 174: x = node1(0, (Node *) a);
! 175: x->ntype = NVALUE;
! 176: return(x);
! 177: }
! 178:
! 179: Node *rectonode(void) /* make $0 into a Node */
! 180: {
! 181: extern Cell *literal0;
! 182: return op1(INDIRECT, celltonode(literal0, CUNK));
! 183: }
! 184:
! 185: Node *makearr(Node *p)
! 186: {
! 187: Cell *cp;
! 188:
! 189: if (isvalue(p)) {
! 190: cp = (Cell *) (p->narg[0]);
! 191: if (isfcn(cp))
! 192: SYNTAX( "%s is a function, not an array", cp->nval );
! 193: else if (!isarr(cp)) {
! 194: xfree(cp->sval);
! 195: cp->sval = (char *) makesymtab(NSYMTAB);
! 196: cp->tval = ARR;
! 197: }
! 198: }
! 199: return p;
! 200: }
! 201:
! 202: #define PA2NUM 50 /* max number of pat,pat patterns allowed */
! 203: int paircnt; /* number of them in use */
! 204: int pairstack[PA2NUM]; /* state of each pat,pat */
! 205:
! 206: Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */
! 207: {
! 208: Node *x;
! 209:
! 210: x = node4(PASTAT2, a, b, c, itonp(paircnt));
! 211: if (paircnt++ >= PA2NUM)
! 212: SYNTAX( "limited to %d pat,pat statements", PA2NUM );
! 213: x->ntype = NSTAT;
! 214: return(x);
! 215: }
! 216:
! 217: Node *linkum(Node *a, Node *b)
! 218: {
! 219: Node *c;
! 220:
! 221: if (errorflag) /* don't link things that are wrong */
! 222: return a;
! 223: if (a == NULL)
! 224: return(b);
! 225: else if (b == NULL)
! 226: return(a);
! 227: for (c = a; c->nnext != NULL; c = c->nnext)
! 228: ;
! 229: c->nnext = b;
! 230: return(a);
! 231: }
! 232:
! 233: void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */
! 234: { /* body of function, arglist */
! 235: Node *p;
! 236: int n;
! 237:
! 238: if (isarr(v)) {
! 239: SYNTAX( "`%s' is an array name and a function name", v->nval );
! 240: return;
! 241: }
! 242: if (isarg(v->nval) != -1) {
! 243: SYNTAX( "`%s' is both function name and argument name", v->nval );
! 244: return;
! 245: }
! 246:
! 247: v->tval = FCN;
! 248: v->sval = (char *) st;
! 249: n = 0; /* count arguments */
! 250: for (p = vl; p; p = p->nnext)
! 251: n++;
! 252: v->fval = n;
! 253: dprintf( ("defining func %s (%d args)\n", v->nval, n) );
! 254: }
! 255:
! 256: int isarg(const char *s) /* is s in argument list for current function? */
! 257: { /* return -1 if not, otherwise arg # */
! 258: extern Node *arglist;
! 259: Node *p = arglist;
! 260: int n;
! 261:
! 262: for (n = 0; p != 0; p = p->nnext, n++)
! 263: if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
! 264: return n;
! 265: return -1;
! 266: }
! 267:
! 268: int ptoi(void *p) /* convert pointer to integer */
! 269: {
! 270: return (int) (long) p; /* swearing that p fits, of course */
! 271: }
! 272:
! 273: Node *itonp(int i) /* and vice versa */
! 274: {
! 275: return (Node *) (long) i;
! 276: }
CVSweb interface <joel.bertrand@systella.fr>