xref: /dragonfly/contrib/awk/parse.c (revision ed569bc2)
14b588458SPeter Avalos /****************************************************************
24b588458SPeter Avalos Copyright (C) Lucent Technologies 1997
34b588458SPeter Avalos All Rights Reserved
44b588458SPeter Avalos 
54b588458SPeter Avalos Permission to use, copy, modify, and distribute this software and
64b588458SPeter Avalos its documentation for any purpose and without fee is hereby
74b588458SPeter Avalos granted, provided that the above copyright notice appear in all
84b588458SPeter Avalos copies and that both that the copyright notice and this
94b588458SPeter Avalos permission notice and warranty disclaimer appear in supporting
104b588458SPeter Avalos documentation, and that the name Lucent Technologies or any of
114b588458SPeter Avalos its entities not be used in advertising or publicity pertaining
124b588458SPeter Avalos to distribution of the software without specific, written prior
134b588458SPeter Avalos permission.
144b588458SPeter Avalos 
154b588458SPeter Avalos LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
164b588458SPeter Avalos INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
174b588458SPeter Avalos IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
184b588458SPeter Avalos SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
194b588458SPeter Avalos WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
204b588458SPeter Avalos IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
214b588458SPeter Avalos ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
224b588458SPeter Avalos THIS SOFTWARE.
234b588458SPeter Avalos ****************************************************************/
244b588458SPeter Avalos 
254b588458SPeter Avalos #define DEBUG
264b588458SPeter Avalos #include <stdio.h>
274b588458SPeter Avalos #include <string.h>
284b588458SPeter Avalos #include <stdlib.h>
294b588458SPeter Avalos #include "awk.h"
3048f09a05SAntonio Huete Jimenez #include "awkgram.tab.h"
314b588458SPeter Avalos 
nodealloc(size_t n)32*ed569bc2SAaron LI Node *nodealloc(size_t n)
334b588458SPeter Avalos {
344b588458SPeter Avalos 	Node *x;
354b588458SPeter Avalos 
3648f09a05SAntonio Huete Jimenez 	x = (Node *) malloc(sizeof(*x) + (n-1) * sizeof(x));
374b588458SPeter Avalos 	if (x == NULL)
384b588458SPeter Avalos 		FATAL("out of space in nodealloc");
394b588458SPeter Avalos 	x->nnext = NULL;
404b588458SPeter Avalos 	x->lineno = lineno;
414b588458SPeter Avalos 	return(x);
424b588458SPeter Avalos }
434b588458SPeter Avalos 
exptostat(Node * a)444b588458SPeter Avalos Node *exptostat(Node *a)
454b588458SPeter Avalos {
464b588458SPeter Avalos 	a->ntype = NSTAT;
474b588458SPeter Avalos 	return(a);
484b588458SPeter Avalos }
494b588458SPeter Avalos 
node1(int a,Node * b)504b588458SPeter Avalos Node *node1(int a, Node *b)
514b588458SPeter Avalos {
524b588458SPeter Avalos 	Node *x;
534b588458SPeter Avalos 
544b588458SPeter Avalos 	x = nodealloc(1);
554b588458SPeter Avalos 	x->nobj = a;
564b588458SPeter Avalos 	x->narg[0]=b;
574b588458SPeter Avalos 	return(x);
584b588458SPeter Avalos }
594b588458SPeter Avalos 
node2(int a,Node * b,Node * c)604b588458SPeter Avalos Node *node2(int a, Node *b, Node *c)
614b588458SPeter Avalos {
624b588458SPeter Avalos 	Node *x;
634b588458SPeter Avalos 
644b588458SPeter Avalos 	x = nodealloc(2);
654b588458SPeter Avalos 	x->nobj = a;
664b588458SPeter Avalos 	x->narg[0] = b;
674b588458SPeter Avalos 	x->narg[1] = c;
684b588458SPeter Avalos 	return(x);
694b588458SPeter Avalos }
704b588458SPeter Avalos 
node3(int a,Node * b,Node * c,Node * d)714b588458SPeter Avalos Node *node3(int a, Node *b, Node *c, Node *d)
724b588458SPeter Avalos {
734b588458SPeter Avalos 	Node *x;
744b588458SPeter Avalos 
754b588458SPeter Avalos 	x = nodealloc(3);
764b588458SPeter Avalos 	x->nobj = a;
774b588458SPeter Avalos 	x->narg[0] = b;
784b588458SPeter Avalos 	x->narg[1] = c;
794b588458SPeter Avalos 	x->narg[2] = d;
804b588458SPeter Avalos 	return(x);
814b588458SPeter Avalos }
824b588458SPeter Avalos 
node4(int a,Node * b,Node * c,Node * d,Node * e)834b588458SPeter Avalos Node *node4(int a, Node *b, Node *c, Node *d, Node *e)
844b588458SPeter Avalos {
854b588458SPeter Avalos 	Node *x;
864b588458SPeter Avalos 
874b588458SPeter Avalos 	x = nodealloc(4);
884b588458SPeter Avalos 	x->nobj = a;
894b588458SPeter Avalos 	x->narg[0] = b;
904b588458SPeter Avalos 	x->narg[1] = c;
914b588458SPeter Avalos 	x->narg[2] = d;
924b588458SPeter Avalos 	x->narg[3] = e;
934b588458SPeter Avalos 	return(x);
944b588458SPeter Avalos }
954b588458SPeter Avalos 
stat1(int a,Node * b)964b588458SPeter Avalos Node *stat1(int a, Node *b)
974b588458SPeter Avalos {
984b588458SPeter Avalos 	Node *x;
994b588458SPeter Avalos 
1004b588458SPeter Avalos 	x = node1(a,b);
1014b588458SPeter Avalos 	x->ntype = NSTAT;
1024b588458SPeter Avalos 	return(x);
1034b588458SPeter Avalos }
1044b588458SPeter Avalos 
stat2(int a,Node * b,Node * c)1054b588458SPeter Avalos Node *stat2(int a, Node *b, Node *c)
1064b588458SPeter Avalos {
1074b588458SPeter Avalos 	Node *x;
1084b588458SPeter Avalos 
1094b588458SPeter Avalos 	x = node2(a,b,c);
1104b588458SPeter Avalos 	x->ntype = NSTAT;
1114b588458SPeter Avalos 	return(x);
1124b588458SPeter Avalos }
1134b588458SPeter Avalos 
stat3(int a,Node * b,Node * c,Node * d)1144b588458SPeter Avalos Node *stat3(int a, Node *b, Node *c, Node *d)
1154b588458SPeter Avalos {
1164b588458SPeter Avalos 	Node *x;
1174b588458SPeter Avalos 
1184b588458SPeter Avalos 	x = node3(a,b,c,d);
1194b588458SPeter Avalos 	x->ntype = NSTAT;
1204b588458SPeter Avalos 	return(x);
1214b588458SPeter Avalos }
1224b588458SPeter Avalos 
stat4(int a,Node * b,Node * c,Node * d,Node * e)1234b588458SPeter Avalos Node *stat4(int a, Node *b, Node *c, Node *d, Node *e)
1244b588458SPeter Avalos {
1254b588458SPeter Avalos 	Node *x;
1264b588458SPeter Avalos 
1274b588458SPeter Avalos 	x = node4(a,b,c,d,e);
1284b588458SPeter Avalos 	x->ntype = NSTAT;
1294b588458SPeter Avalos 	return(x);
1304b588458SPeter Avalos }
1314b588458SPeter Avalos 
op1(int a,Node * b)1324b588458SPeter Avalos Node *op1(int a, Node *b)
1334b588458SPeter Avalos {
1344b588458SPeter Avalos 	Node *x;
1354b588458SPeter Avalos 
1364b588458SPeter Avalos 	x = node1(a,b);
1374b588458SPeter Avalos 	x->ntype = NEXPR;
1384b588458SPeter Avalos 	return(x);
1394b588458SPeter Avalos }
1404b588458SPeter Avalos 
op2(int a,Node * b,Node * c)1414b588458SPeter Avalos Node *op2(int a, Node *b, Node *c)
1424b588458SPeter Avalos {
1434b588458SPeter Avalos 	Node *x;
1444b588458SPeter Avalos 
1454b588458SPeter Avalos 	x = node2(a,b,c);
1464b588458SPeter Avalos 	x->ntype = NEXPR;
1474b588458SPeter Avalos 	return(x);
1484b588458SPeter Avalos }
1494b588458SPeter Avalos 
op3(int a,Node * b,Node * c,Node * d)1504b588458SPeter Avalos Node *op3(int a, Node *b, Node *c, Node *d)
1514b588458SPeter Avalos {
1524b588458SPeter Avalos 	Node *x;
1534b588458SPeter Avalos 
1544b588458SPeter Avalos 	x = node3(a,b,c,d);
1554b588458SPeter Avalos 	x->ntype = NEXPR;
1564b588458SPeter Avalos 	return(x);
1574b588458SPeter Avalos }
1584b588458SPeter Avalos 
op4(int a,Node * b,Node * c,Node * d,Node * e)1594b588458SPeter Avalos Node *op4(int a, Node *b, Node *c, Node *d, Node *e)
1604b588458SPeter Avalos {
1614b588458SPeter Avalos 	Node *x;
1624b588458SPeter Avalos 
1634b588458SPeter Avalos 	x = node4(a,b,c,d,e);
1644b588458SPeter Avalos 	x->ntype = NEXPR;
1654b588458SPeter Avalos 	return(x);
1664b588458SPeter Avalos }
1674b588458SPeter Avalos 
celltonode(Cell * a,int b)1684b588458SPeter Avalos Node *celltonode(Cell *a, int b)
1694b588458SPeter Avalos {
1704b588458SPeter Avalos 	Node *x;
1714b588458SPeter Avalos 
1724b588458SPeter Avalos 	a->ctype = OCELL;
1734b588458SPeter Avalos 	a->csub = b;
1744b588458SPeter Avalos 	x = node1(0, (Node *) a);
1754b588458SPeter Avalos 	x->ntype = NVALUE;
1764b588458SPeter Avalos 	return(x);
1774b588458SPeter Avalos }
1784b588458SPeter Avalos 
rectonode(void)1794b588458SPeter Avalos Node *rectonode(void)	/* make $0 into a Node */
1804b588458SPeter Avalos {
1814b588458SPeter Avalos 	extern Cell *literal0;
1824b588458SPeter Avalos 	return op1(INDIRECT, celltonode(literal0, CUNK));
1834b588458SPeter Avalos }
1844b588458SPeter Avalos 
makearr(Node * p)1854b588458SPeter Avalos Node *makearr(Node *p)
1864b588458SPeter Avalos {
1874b588458SPeter Avalos 	Cell *cp;
1884b588458SPeter Avalos 
1894b588458SPeter Avalos 	if (isvalue(p)) {
1904b588458SPeter Avalos 		cp = (Cell *) (p->narg[0]);
1914b588458SPeter Avalos 		if (isfcn(cp))
1924b588458SPeter Avalos 			SYNTAX( "%s is a function, not an array", cp->nval );
1934b588458SPeter Avalos 		else if (!isarr(cp)) {
1944b588458SPeter Avalos 			xfree(cp->sval);
1954b588458SPeter Avalos 			cp->sval = (char *) makesymtab(NSYMTAB);
1964b588458SPeter Avalos 			cp->tval = ARR;
1974b588458SPeter Avalos 		}
1984b588458SPeter Avalos 	}
1994b588458SPeter Avalos 	return p;
2004b588458SPeter Avalos }
2014b588458SPeter Avalos 
2024b588458SPeter Avalos #define PA2NUM	50	/* max number of pat,pat patterns allowed */
2034b588458SPeter Avalos int	paircnt;		/* number of them in use */
2044b588458SPeter Avalos int	pairstack[PA2NUM];	/* state of each pat,pat */
2054b588458SPeter Avalos 
pa2stat(Node * a,Node * b,Node * c)2064b588458SPeter Avalos Node *pa2stat(Node *a, Node *b, Node *c)	/* pat, pat {...} */
2074b588458SPeter Avalos {
2084b588458SPeter Avalos 	Node *x;
2094b588458SPeter Avalos 
2104b588458SPeter Avalos 	x = node4(PASTAT2, a, b, c, itonp(paircnt));
2114b588458SPeter Avalos 	if (paircnt++ >= PA2NUM)
2124b588458SPeter Avalos 		SYNTAX( "limited to %d pat,pat statements", PA2NUM );
2134b588458SPeter Avalos 	x->ntype = NSTAT;
2144b588458SPeter Avalos 	return(x);
2154b588458SPeter Avalos }
2164b588458SPeter Avalos 
linkum(Node * a,Node * b)2174b588458SPeter Avalos Node *linkum(Node *a, Node *b)
2184b588458SPeter Avalos {
2194b588458SPeter Avalos 	Node *c;
2204b588458SPeter Avalos 
2214b588458SPeter Avalos 	if (errorflag)	/* don't link things that are wrong */
2224b588458SPeter Avalos 		return a;
2234b588458SPeter Avalos 	if (a == NULL)
2244b588458SPeter Avalos 		return(b);
2254b588458SPeter Avalos 	else if (b == NULL)
2264b588458SPeter Avalos 		return(a);
2274b588458SPeter Avalos 	for (c = a; c->nnext != NULL; c = c->nnext)
2284b588458SPeter Avalos 		;
2294b588458SPeter Avalos 	c->nnext = b;
2304b588458SPeter Avalos 	return(a);
2314b588458SPeter Avalos }
2324b588458SPeter Avalos 
defn(Cell * v,Node * vl,Node * st)2334b588458SPeter Avalos void defn(Cell *v, Node *vl, Node *st)	/* turn on FCN bit in definition, */
2344b588458SPeter Avalos {					/*   body of function, arglist */
2354b588458SPeter Avalos 	Node *p;
2364b588458SPeter Avalos 	int n;
2374b588458SPeter Avalos 
2384b588458SPeter Avalos 	if (isarr(v)) {
2394b588458SPeter Avalos 		SYNTAX( "`%s' is an array name and a function name", v->nval );
2404b588458SPeter Avalos 		return;
2414b588458SPeter Avalos 	}
2424b588458SPeter Avalos 	if (isarg(v->nval) != -1) {
2434b588458SPeter Avalos 		SYNTAX( "`%s' is both function name and argument name", v->nval );
2444b588458SPeter Avalos 		return;
2454b588458SPeter Avalos 	}
2464b588458SPeter Avalos 
2474b588458SPeter Avalos 	v->tval = FCN;
2484b588458SPeter Avalos 	v->sval = (char *) st;
2494b588458SPeter Avalos 	n = 0;	/* count arguments */
2504b588458SPeter Avalos 	for (p = vl; p; p = p->nnext)
2514b588458SPeter Avalos 		n++;
2524b588458SPeter Avalos 	v->fval = n;
253e5e686a0SDaniel Fojt 	DPRINTF("defining func %s (%d args)\n", v->nval, n);
2544b588458SPeter Avalos }
2554b588458SPeter Avalos 
isarg(const char * s)2564b588458SPeter Avalos int isarg(const char *s)		/* is s in argument list for current function? */
2574b588458SPeter Avalos {			/* return -1 if not, otherwise arg # */
2584b588458SPeter Avalos 	extern Node *arglist;
2594b588458SPeter Avalos 	Node *p = arglist;
2604b588458SPeter Avalos 	int n;
2614b588458SPeter Avalos 
2621d48fce0SDaniel Fojt 	for (n = 0; p != NULL; p = p->nnext, n++)
2634b588458SPeter Avalos 		if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
2644b588458SPeter Avalos 			return n;
2654b588458SPeter Avalos 	return -1;
2664b588458SPeter Avalos }
2674b588458SPeter Avalos 
ptoi(void * p)2684b588458SPeter Avalos int ptoi(void *p)	/* convert pointer to integer */
2694b588458SPeter Avalos {
2704b588458SPeter Avalos 	return (int) (long) p;	/* swearing that p fits, of course */
2714b588458SPeter Avalos }
2724b588458SPeter Avalos 
itonp(int i)2734b588458SPeter Avalos Node *itonp(int i)	/* and vice versa */
2744b588458SPeter Avalos {
2754b588458SPeter Avalos 	return (Node *) (long) i;
2764b588458SPeter Avalos }
277