|
|
1.1 root 1: #define DEBUG
2: #include <stdio.h>
3: #include "awk.h"
4: #include "y.tab.h"
5:
6: Node *nodealloc(n)
7: {
8: register Node *x;
9: x = (Node *) Malloc(sizeof(Node) + (n-1)*sizeof(Node *));
10: if (x == NULL)
11: error(FATAL, "out of space in nodealloc");
12: x->nnext = NULL;
13: x->lineno = lineno;
14: return(x);
15: }
16:
17: Node *exptostat(a) Node *a;
18: {
19: a->ntype = NSTAT;
20: return(a);
21: }
22:
23: Node *node0(a)
24: {
25: register Node *x;
26: x = nodealloc(0);
27: x->nobj = a;
28: return(x);
29: }
30:
31: Node *node1(a,b) Node *b;
32: {
33: register Node *x;
34: x = nodealloc(1);
35: x->nobj = a;
36: x->narg[0]=b;
37: return(x);
38: }
39:
40: Node *node2(a,b,c) Node *b, *c;
41: {
42: register Node *x;
43: x = nodealloc(2);
44: x->nobj = a;
45: x->narg[0] = b;
46: x->narg[1] = c;
47: return(x);
48: }
49:
50: Node *node3(a,b,c,d) Node *b, *c, *d;
51: {
52: register Node *x;
53: x = nodealloc(3);
54: x->nobj = a;
55: x->narg[0] = b;
56: x->narg[1] = c;
57: x->narg[2] = d;
58: return(x);
59: }
60:
61: Node *node4(a,b,c,d,e) Node *b, *c, *d, *e;
62: {
63: register Node *x;
64: x = nodealloc(4);
65: x->nobj = a;
66: x->narg[0] = b;
67: x->narg[1] = c;
68: x->narg[2] = d;
69: x->narg[3] = e;
70: return(x);
71: }
72:
73: Node *stat3(a,b,c,d) Node *b, *c, *d;
74: {
75: register Node *x;
76: x = node3(a,b,c,d);
77: x->ntype = NSTAT;
78: return(x);
79: }
80:
81: Node *op2(a,b,c) Node *b, *c;
82: {
83: register Node *x;
84: x = node2(a,b,c);
85: x->ntype = NEXPR;
86: return(x);
87: }
88:
89: Node *op1(a,b) Node *b;
90: {
91: register Node *x;
92: x = node1(a,b);
93: x->ntype = NEXPR;
94: return(x);
95: }
96:
97: Node *stat1(a,b) Node *b;
98: {
99: register Node *x;
100: x = node1(a,b);
101: x->ntype = NSTAT;
102: return(x);
103: }
104:
105: Node *op3(a,b,c,d) Node *b, *c, *d;
106: {
107: register Node *x;
108: x = node3(a,b,c,d);
109: x->ntype = NEXPR;
110: return(x);
111: }
112:
113: Node *op4(a,b,c,d,e) Node *b, *c, *d, *e;
114: {
115: register Node *x;
116: x = node4(a,b,c,d,e);
117: x->ntype = NEXPR;
118: return(x);
119: }
120:
121: Node *stat2(a,b,c) Node *b, *c;
122: {
123: register Node *x;
124: x = node2(a,b,c);
125: x->ntype = NSTAT;
126: return(x);
127: }
128:
129: Node *stat4(a,b,c,d,e) Node *b, *c, *d, *e;
130: {
131: register Node *x;
132: x = node4(a,b,c,d,e);
133: x->ntype = NSTAT;
134: return(x);
135: }
136:
137: Node *valtonode(a, b) Cell *a;
138: {
139: register Node *x;
140:
141: a->ctype = OCELL;
142: a->csub = b;
143: x = node1(0, a);
144: x->ntype = b == CFLD ? NFIELD : NVALUE;
145: return(x);
146: }
147:
148: Node *rectonode()
149: {
150: return valtonode(lookup("$0", symtab), CFLD);
151: }
152:
153: Node *makearr(p) Node *p;
154: {
155: Cell *cp;
156:
157: if (isvalue(p)) {
158: cp = (Cell *) (p->narg[0]);
159: if (!isarr(cp)) {
160: xfree(cp->sval);
161: cp->sval = (char *) makesymtab();
162: cp->tval = ARR;
163: }
164: }
165: return p;
166: }
167:
168: Node *pa2stat(a,b,c) Node *a, *b, *c;
169: {
170: register Node *x;
171: x = node4(PASTAT2, a, b, c, (Node *) paircnt);
172: paircnt++;
173: x->ntype = NSTAT;
174: return(x);
175: }
176:
177: Node *linkum(a,b) Node *a, *b;
178: {
179: register Node *c;
180:
181: if (errorflag) /* don't link things that are wrong */
182: return a;
183: if (a == NULL) return(b);
184: else if (b == NULL) return(a);
185: for (c = a; c->nnext != NULL; c = c->nnext)
186: ;
187: c->nnext = b;
188: return(a);
189: }
190:
191: defn(v, vl, st) /* turn on FCN bit in definition */
192: Cell *v;
193: Node *st, *vl; /* body of function, arglist */
194: {
195: Node *p;
196: int n;
197:
198: v->tval = FCN;
199: v->sval = (char *) st;
200: n = 0; /* count arguments */
201: for (p = vl; p; p = p->nnext)
202: n++;
203: v->fval = n;
204: dprintf("defining func %s (%d args)\n", v->nval, n);
205: }
206:
207: isarg(s) /* is s in argument list for current function? */
208: char *s;
209: {
210: extern Node *arglist;
211: Node *p = arglist;
212: int n;
213:
214: for (n = 0; p != 0; p = p->nnext, n++)
215: if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
216: return n;
217: return -1;
218: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.