xref: /illumos-gate/usr/src/cmd/oawk/parse.c (revision 4763305e3243687c189d755d737d52205b2614ed)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 #include "awk.def"
26 #include "awk.h"
27 #include "stdio.h"
28 #include "stdint.h"
29 
30 NODE *nodealloc(int n)
31 {
32 	NODE *x;
33 	x = (NODE *) malloc(sizeof (NODE) + n * sizeof (NODE *));
34 	if (x == NULL)
35 		error(FATAL, "out of space in nodealloc");
36 	return (x);
37 }
38 
39 
40 
41 
42 NODE *exptostat(NODE *a)
43 {
44 	a->ntype = NSTAT;
45 	return (a);
46 }
47 
48 
49 
50 
51 NODE *node0(int a)
52 {
53 	NODE *x;
54 	x = nodealloc(0);	/* No space for narg */
55 	x->nnext = NULL;
56 	x->nobj = a;
57 	return (x);
58 }
59 
60 
61 
62 
63 NODE *node1(int a, NODE *b)
64 {
65 	NODE *x;
66 	x = nodealloc(1);
67 	x->nnext = NULL;
68 	x->nobj = a;
69 	x->narg[0]=b;
70 	return (x);
71 }
72 
73 
74 
75 
76 NODE *node2(int a, NODE *b, NODE *c)
77 {
78 	NODE *x;
79 	x = nodealloc(2);
80 	x->nnext = NULL;
81 	x->nobj = a;
82 	x->narg[0] = b;
83 	x->narg[1] = c;
84 	return (x);
85 }
86 
87 
88 
89 
90 NODE *node3(int a, NODE *b, NODE *c, NODE *d)
91 {
92 	NODE *x;
93 	x = nodealloc(3);
94 	x->nnext = NULL;
95 	x->nobj = a;
96 	x->narg[0] = b;
97 	x->narg[1] = c;
98 	x->narg[2] = d;
99 	return (x);
100 }
101 
102 
103 
104 
105 NODE *node4(int a, NODE *b, NODE *c, NODE *d, NODE *e)
106 {
107 	NODE *x;
108 	x = nodealloc(4);
109 	x->nnext = NULL;
110 	x->nobj = a;
111 	x->narg[0] = b;
112 	x->narg[1] = c;
113 	x->narg[2] = d;
114 	x->narg[3] = e;
115 	return (x);
116 }
117 
118 
119 
120 
121 NODE *stat3(int a, NODE *b, NODE *c, NODE *d)
122 {
123 	NODE *x;
124 	x = node3(a, b, c, d);
125 	x->ntype = NSTAT;
126 	return (x);
127 }
128 
129 
130 
131 
132 NODE *op2(int a, NODE *b, NODE *c)
133 {
134 	NODE *x;
135 	x = node2(a, b, c);
136 	x->ntype = NEXPR;
137 	return (x);
138 }
139 
140 
141 
142 
143 NODE *op1(int a, NODE *b)
144 {
145 	NODE *x;
146 	x = node1(a, b);
147 	x->ntype = NEXPR;
148 	return (x);
149 }
150 
151 
152 
153 
154 NODE *stat1(int a, NODE *b)
155 {
156 	NODE *x;
157 	x = node1(a, b);
158 	x->ntype = NSTAT;
159 	return (x);
160 }
161 
162 
163 
164 
165 NODE *op3(int a, NODE *b, NODE *c, NODE *d)
166 {
167 	NODE *x;
168 	x = node3(a, b, c, d);
169 	x->ntype = NEXPR;
170 	return (x);
171 }
172 
173 
174 
175 
176 NODE *stat2(int a, NODE *b, NODE *c)
177 {
178 	NODE *x;
179 	x = node2(a, b, c);
180 	x->ntype = NSTAT;
181 	return (x);
182 }
183 
184 
185 
186 
187 NODE *stat4(int a, NODE *b, NODE *c, NODE *d, NODE *e)
188 {
189 	NODE *x;
190 	x = node4(a, b, c, d, e);
191 	x->ntype = NSTAT;
192 	return (x);
193 }
194 
195 
196 
197 
198 NODE *valtonode(CELL *a, int b)
199 {
200 	NODE *x;
201 	x = node0((uintptr_t)a);
202 	x->ntype = NVALUE;
203 	x->subtype = b;
204 	return (x);
205 }
206 
207 
208 
209 
210 NODE *pa2stat(NODE *a, NODE *b, NODE *c)
211 {
212 	NODE *x;
213 	x = node4(PASTAT2, a, b, c, (NODE *) paircnt);
214 	paircnt++;
215 	x->ntype = NSTAT;
216 	return (x);
217 }
218 
219 
220 
221 
222 NODE *linkum(NODE *a, NODE *b)
223 {
224 	NODE *c;
225 	if (a == NULL) return (b);
226 	else if (b == NULL) return (a);
227 	for (c = a; c->nnext != NULL; c=c->nnext)
228 		;
229 	c->nnext = b;
230 	return (a);
231 }
232 
233 
234 
235 
236 NODE *genprint(void)
237 {
238 	NODE *x;
239 	static wchar_t L_record[] = L"$record";
240 	x = stat2(PRINT, valtonode(lookup(L_record, symtab, 0), CFLD), NULL);
241 	return (x);
242 }
243