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