xref: /titanic_50/usr/src/cmd/awk/parse.c (revision 1ee2e5fa222f6d33d1ff1c48f155973a5e146434)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
22*1ee2e5faSnakanon 
23*1ee2e5faSnakanon /*
24*1ee2e5faSnakanon  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
25*1ee2e5faSnakanon  * Use is subject to license terms.
26*1ee2e5faSnakanon  */
27*1ee2e5faSnakanon 
287c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
297c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
307c478bd9Sstevel@tonic-gate 
31*1ee2e5faSnakanon #pragma ident	"%Z%%M%	%I%	%E% SMI"
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #define	DEBUG
347c478bd9Sstevel@tonic-gate #include "awk.h"
357c478bd9Sstevel@tonic-gate #include "y.tab.h"
367c478bd9Sstevel@tonic-gate 
37*1ee2e5faSnakanon Node *
nodealloc(int n)38*1ee2e5faSnakanon nodealloc(int n)
397c478bd9Sstevel@tonic-gate {
407c478bd9Sstevel@tonic-gate 	register Node *x;
41*1ee2e5faSnakanon 
427c478bd9Sstevel@tonic-gate 	x = (Node *)malloc(sizeof (Node) + (n - 1) * sizeof (Node *));
437c478bd9Sstevel@tonic-gate 	if (x == NULL)
447c478bd9Sstevel@tonic-gate 		ERROR "out of space in nodealloc" FATAL;
457c478bd9Sstevel@tonic-gate 	x->nnext = NULL;
467c478bd9Sstevel@tonic-gate 	x->lineno = lineno;
477c478bd9Sstevel@tonic-gate 	return (x);
487c478bd9Sstevel@tonic-gate }
497c478bd9Sstevel@tonic-gate 
50*1ee2e5faSnakanon Node *
exptostat(Node * a)51*1ee2e5faSnakanon exptostat(Node *a)
527c478bd9Sstevel@tonic-gate {
537c478bd9Sstevel@tonic-gate 	a->ntype = NSTAT;
547c478bd9Sstevel@tonic-gate 	return (a);
557c478bd9Sstevel@tonic-gate }
567c478bd9Sstevel@tonic-gate 
57*1ee2e5faSnakanon Node *
node1(int a,Node * b)58*1ee2e5faSnakanon node1(int a, Node *b)
597c478bd9Sstevel@tonic-gate {
607c478bd9Sstevel@tonic-gate 	register Node *x;
61*1ee2e5faSnakanon 
627c478bd9Sstevel@tonic-gate 	x = nodealloc(1);
637c478bd9Sstevel@tonic-gate 	x->nobj = a;
647c478bd9Sstevel@tonic-gate 	x->narg[0] = b;
657c478bd9Sstevel@tonic-gate 	return (x);
667c478bd9Sstevel@tonic-gate }
677c478bd9Sstevel@tonic-gate 
68*1ee2e5faSnakanon Node *
node2(int a,Node * b,Node * c)69*1ee2e5faSnakanon node2(int a, Node *b, Node *c)
707c478bd9Sstevel@tonic-gate {
717c478bd9Sstevel@tonic-gate 	register Node *x;
72*1ee2e5faSnakanon 
737c478bd9Sstevel@tonic-gate 	x = nodealloc(2);
747c478bd9Sstevel@tonic-gate 	x->nobj = a;
757c478bd9Sstevel@tonic-gate 	x->narg[0] = b;
767c478bd9Sstevel@tonic-gate 	x->narg[1] = c;
777c478bd9Sstevel@tonic-gate 	return (x);
787c478bd9Sstevel@tonic-gate }
797c478bd9Sstevel@tonic-gate 
80*1ee2e5faSnakanon Node *
node3(int a,Node * b,Node * c,Node * d)81*1ee2e5faSnakanon node3(int a, Node *b, Node *c, Node *d)
827c478bd9Sstevel@tonic-gate {
837c478bd9Sstevel@tonic-gate 	register Node *x;
84*1ee2e5faSnakanon 
857c478bd9Sstevel@tonic-gate 	x = nodealloc(3);
867c478bd9Sstevel@tonic-gate 	x->nobj = a;
877c478bd9Sstevel@tonic-gate 	x->narg[0] = b;
887c478bd9Sstevel@tonic-gate 	x->narg[1] = c;
897c478bd9Sstevel@tonic-gate 	x->narg[2] = d;
907c478bd9Sstevel@tonic-gate 	return (x);
917c478bd9Sstevel@tonic-gate }
927c478bd9Sstevel@tonic-gate 
93*1ee2e5faSnakanon Node *
node4(int a,Node * b,Node * c,Node * d,Node * e)94*1ee2e5faSnakanon node4(int a, Node *b, Node *c, Node *d, Node *e)
957c478bd9Sstevel@tonic-gate {
967c478bd9Sstevel@tonic-gate 	register Node *x;
977c478bd9Sstevel@tonic-gate 	x = nodealloc(4);
987c478bd9Sstevel@tonic-gate 	x->nobj = a;
997c478bd9Sstevel@tonic-gate 	x->narg[0] = b;
1007c478bd9Sstevel@tonic-gate 	x->narg[1] = c;
1017c478bd9Sstevel@tonic-gate 	x->narg[2] = d;
1027c478bd9Sstevel@tonic-gate 	x->narg[3] = e;
1037c478bd9Sstevel@tonic-gate 	return (x);
1047c478bd9Sstevel@tonic-gate }
1057c478bd9Sstevel@tonic-gate 
106*1ee2e5faSnakanon Node *
stat3(int a,Node * b,Node * c,Node * d)107*1ee2e5faSnakanon stat3(int a, Node *b, Node *c, Node *d)
1087c478bd9Sstevel@tonic-gate {
1097c478bd9Sstevel@tonic-gate 	register Node *x;
110*1ee2e5faSnakanon 
1117c478bd9Sstevel@tonic-gate 	x = node3(a, b, c, d);
1127c478bd9Sstevel@tonic-gate 	x->ntype = NSTAT;
1137c478bd9Sstevel@tonic-gate 	return (x);
1147c478bd9Sstevel@tonic-gate }
1157c478bd9Sstevel@tonic-gate 
116*1ee2e5faSnakanon Node *
op2(int a,Node * b,Node * c)117*1ee2e5faSnakanon op2(int a, Node *b, Node *c)
1187c478bd9Sstevel@tonic-gate {
1197c478bd9Sstevel@tonic-gate 	register Node *x;
120*1ee2e5faSnakanon 
1217c478bd9Sstevel@tonic-gate 	x = node2(a, b, c);
1227c478bd9Sstevel@tonic-gate 	x->ntype = NEXPR;
1237c478bd9Sstevel@tonic-gate 	return (x);
1247c478bd9Sstevel@tonic-gate }
1257c478bd9Sstevel@tonic-gate 
126*1ee2e5faSnakanon Node *
op1(int a,Node * b)127*1ee2e5faSnakanon op1(int a, Node *b)
1287c478bd9Sstevel@tonic-gate {
1297c478bd9Sstevel@tonic-gate 	register Node *x;
130*1ee2e5faSnakanon 
1317c478bd9Sstevel@tonic-gate 	x = node1(a, b);
1327c478bd9Sstevel@tonic-gate 	x->ntype = NEXPR;
1337c478bd9Sstevel@tonic-gate 	return (x);
1347c478bd9Sstevel@tonic-gate }
1357c478bd9Sstevel@tonic-gate 
136*1ee2e5faSnakanon Node *
stat1(int a,Node * b)137*1ee2e5faSnakanon stat1(int a, Node *b)
1387c478bd9Sstevel@tonic-gate {
1397c478bd9Sstevel@tonic-gate 	register Node *x;
140*1ee2e5faSnakanon 
1417c478bd9Sstevel@tonic-gate 	x = node1(a, b);
1427c478bd9Sstevel@tonic-gate 	x->ntype = NSTAT;
1437c478bd9Sstevel@tonic-gate 	return (x);
1447c478bd9Sstevel@tonic-gate }
1457c478bd9Sstevel@tonic-gate 
146*1ee2e5faSnakanon Node *
op3(int a,Node * b,Node * c,Node * d)147*1ee2e5faSnakanon op3(int a, Node *b, Node *c, Node *d)
1487c478bd9Sstevel@tonic-gate {
1497c478bd9Sstevel@tonic-gate 	register Node *x;
150*1ee2e5faSnakanon 
1517c478bd9Sstevel@tonic-gate 	x = node3(a, b, c, d);
1527c478bd9Sstevel@tonic-gate 	x->ntype = NEXPR;
1537c478bd9Sstevel@tonic-gate 	return (x);
1547c478bd9Sstevel@tonic-gate }
1557c478bd9Sstevel@tonic-gate 
156*1ee2e5faSnakanon Node *
op4(int a,Node * b,Node * c,Node * d,Node * e)157*1ee2e5faSnakanon op4(int a, Node *b, Node *c, Node *d, Node *e)
1587c478bd9Sstevel@tonic-gate {
1597c478bd9Sstevel@tonic-gate 	register Node *x;
160*1ee2e5faSnakanon 
1617c478bd9Sstevel@tonic-gate 	x = node4(a, b, c, d, e);
1627c478bd9Sstevel@tonic-gate 	x->ntype = NEXPR;
1637c478bd9Sstevel@tonic-gate 	return (x);
1647c478bd9Sstevel@tonic-gate }
1657c478bd9Sstevel@tonic-gate 
166*1ee2e5faSnakanon Node *
stat2(int a,Node * b,Node * c)167*1ee2e5faSnakanon stat2(int a, Node *b, Node *c)
1687c478bd9Sstevel@tonic-gate {
1697c478bd9Sstevel@tonic-gate 	register Node *x;
170*1ee2e5faSnakanon 
1717c478bd9Sstevel@tonic-gate 	x = node2(a, b, c);
1727c478bd9Sstevel@tonic-gate 	x->ntype = NSTAT;
1737c478bd9Sstevel@tonic-gate 	return (x);
1747c478bd9Sstevel@tonic-gate }
1757c478bd9Sstevel@tonic-gate 
176*1ee2e5faSnakanon Node *
stat4(int a,Node * b,Node * c,Node * d,Node * e)177*1ee2e5faSnakanon stat4(int a, Node *b, Node *c, Node *d, Node *e)
1787c478bd9Sstevel@tonic-gate {
1797c478bd9Sstevel@tonic-gate 	register Node *x;
180*1ee2e5faSnakanon 
1817c478bd9Sstevel@tonic-gate 	x = node4(a, b, c, d, e);
1827c478bd9Sstevel@tonic-gate 	x->ntype = NSTAT;
1837c478bd9Sstevel@tonic-gate 	return (x);
1847c478bd9Sstevel@tonic-gate }
1857c478bd9Sstevel@tonic-gate 
186*1ee2e5faSnakanon Node *
valtonode(Cell * a,int b)187*1ee2e5faSnakanon valtonode(Cell *a, int b)
1887c478bd9Sstevel@tonic-gate {
1897c478bd9Sstevel@tonic-gate 	register Node *x;
1907c478bd9Sstevel@tonic-gate 
1917c478bd9Sstevel@tonic-gate 	a->ctype = OCELL;
1927c478bd9Sstevel@tonic-gate 	a->csub = b;
1937c478bd9Sstevel@tonic-gate 	x = node1(0, (Node *)a);
1947c478bd9Sstevel@tonic-gate 	x->ntype = NVALUE;
1957c478bd9Sstevel@tonic-gate 	return (x);
1967c478bd9Sstevel@tonic-gate }
1977c478bd9Sstevel@tonic-gate 
198*1ee2e5faSnakanon Node *
rectonode(void)199*1ee2e5faSnakanon rectonode(void)
2007c478bd9Sstevel@tonic-gate {
2017c478bd9Sstevel@tonic-gate 	/* return valtonode(lookup("$0", symtab), CFLD); */
202*1ee2e5faSnakanon 	return (valtonode(recloc, CFLD));
2037c478bd9Sstevel@tonic-gate }
2047c478bd9Sstevel@tonic-gate 
205*1ee2e5faSnakanon Node *
makearr(Node * p)206*1ee2e5faSnakanon makearr(Node *p)
2077c478bd9Sstevel@tonic-gate {
2087c478bd9Sstevel@tonic-gate 	Cell *cp;
2097c478bd9Sstevel@tonic-gate 
2107c478bd9Sstevel@tonic-gate 	if (isvalue(p)) {
2117c478bd9Sstevel@tonic-gate 		cp = (Cell *)(p->narg[0]);
2127c478bd9Sstevel@tonic-gate 		if (isfunc(cp))
2137c478bd9Sstevel@tonic-gate 			ERROR "%s is a function, not an array", cp->nval SYNTAX;
2147c478bd9Sstevel@tonic-gate 		else if (!isarr(cp)) {
2157c478bd9Sstevel@tonic-gate 			xfree(cp->sval);
2167c478bd9Sstevel@tonic-gate 			cp->sval = (uchar *)makesymtab(NSYMTAB);
2177c478bd9Sstevel@tonic-gate 			cp->tval = ARR;
2187c478bd9Sstevel@tonic-gate 		}
2197c478bd9Sstevel@tonic-gate 	}
220*1ee2e5faSnakanon 	return (p);
2217c478bd9Sstevel@tonic-gate }
2227c478bd9Sstevel@tonic-gate 
223*1ee2e5faSnakanon Node *
pa2stat(Node * a,Node * b,Node * c)224*1ee2e5faSnakanon pa2stat(Node *a, Node *b, Node *c)
2257c478bd9Sstevel@tonic-gate {
2267c478bd9Sstevel@tonic-gate 	register Node *x;
227*1ee2e5faSnakanon 
2287c478bd9Sstevel@tonic-gate 	x = node4(PASTAT2, a, b, c, (Node *)paircnt);
2297c478bd9Sstevel@tonic-gate 	paircnt++;
2307c478bd9Sstevel@tonic-gate 	x->ntype = NSTAT;
2317c478bd9Sstevel@tonic-gate 	return (x);
2327c478bd9Sstevel@tonic-gate }
2337c478bd9Sstevel@tonic-gate 
234*1ee2e5faSnakanon Node *
linkum(Node * a,Node * b)235*1ee2e5faSnakanon linkum(Node *a, Node *b)
2367c478bd9Sstevel@tonic-gate {
2377c478bd9Sstevel@tonic-gate 	register Node *c;
2387c478bd9Sstevel@tonic-gate 
2397c478bd9Sstevel@tonic-gate 	if (errorflag)	/* don't link things that are wrong */
240*1ee2e5faSnakanon 		return (a);
241*1ee2e5faSnakanon 	if (a == NULL)
242*1ee2e5faSnakanon 		return (b);
243*1ee2e5faSnakanon 	else if (b == NULL)
244*1ee2e5faSnakanon 		return (a);
2457c478bd9Sstevel@tonic-gate 	for (c = a; c->nnext != NULL; c = c->nnext)
2467c478bd9Sstevel@tonic-gate 		;
2477c478bd9Sstevel@tonic-gate 	c->nnext = b;
2487c478bd9Sstevel@tonic-gate 	return (a);
2497c478bd9Sstevel@tonic-gate }
2507c478bd9Sstevel@tonic-gate 
251*1ee2e5faSnakanon void
defn(Cell * v,Node * vl,Node * st)252*1ee2e5faSnakanon defn(Cell *v, Node *vl, Node *st)	/* turn on FCN bit in definition */
2537c478bd9Sstevel@tonic-gate {
2547c478bd9Sstevel@tonic-gate 	Node *p;
2557c478bd9Sstevel@tonic-gate 	int n;
2567c478bd9Sstevel@tonic-gate 
2577c478bd9Sstevel@tonic-gate 	if (isarr(v)) {
258*1ee2e5faSnakanon 		ERROR "`%s' is an array name and a function name",
259*1ee2e5faSnakanon 		    v->nval SYNTAX;
2607c478bd9Sstevel@tonic-gate 		return;
2617c478bd9Sstevel@tonic-gate 	}
2627c478bd9Sstevel@tonic-gate 	v->tval = FCN;
2637c478bd9Sstevel@tonic-gate 	v->sval = (uchar *)st;
2647c478bd9Sstevel@tonic-gate 	n = 0;	/* count arguments */
2657c478bd9Sstevel@tonic-gate 	for (p = vl; p; p = p->nnext)
2667c478bd9Sstevel@tonic-gate 		n++;
2677c478bd9Sstevel@tonic-gate 	v->fval = n;
2687c478bd9Sstevel@tonic-gate 	dprintf(("defining func %s (%d args)\n", v->nval, n));
2697c478bd9Sstevel@tonic-gate }
2707c478bd9Sstevel@tonic-gate 
271*1ee2e5faSnakanon int
isarg(uchar * s)272*1ee2e5faSnakanon isarg(uchar *s)	/* is s in argument list for current function? */
2737c478bd9Sstevel@tonic-gate {
2747c478bd9Sstevel@tonic-gate 	extern Node *arglist;
2757c478bd9Sstevel@tonic-gate 	Node *p = arglist;
2767c478bd9Sstevel@tonic-gate 	int n;
2777c478bd9Sstevel@tonic-gate 
278*1ee2e5faSnakanon 	for (n = 0; p != 0; p = p->nnext, n++) {
279*1ee2e5faSnakanon 		if (strcmp((char *)((Cell *)(p->narg[0]))->nval,
280*1ee2e5faSnakanon 		    (char *)s) == 0) {
281*1ee2e5faSnakanon 			return (n);
282*1ee2e5faSnakanon 		}
283*1ee2e5faSnakanon 	}
284*1ee2e5faSnakanon 	return (-1);
2857c478bd9Sstevel@tonic-gate }
286