/*- * This code contains changes by * Gunnar Ritter, Freiburg i. Br., Germany, 2002. All rights reserved. * * Conditions 1, 2, and 4 and the no-warranty notice below apply * to these changes. * * * Copyright (c) 1991 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * Redistributions of source code and documentation must retain the * above copyright notice, this list of conditions and the following * disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed or owned by Caldera * International, Inc. * Neither the name of Caldera International, Inc. nor the names of * other contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE * LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* from 4.4BSD /usr/src/old/awk/parse.c 4.3 (Berkeley) 4/17/91 */ /* Sccsid @(#)parse.c 1.5 (gritter) 4/21/04> */ #include "awk.def" #include "awk.h" #include "stdio.h" node *ALLOC(int n) { register node *x; x = (node *) malloc(sizeof(node) + (n-1)*sizeof(node *)); if (x == NULL) error(FATAL, "out of space in ALLOC"); return(x); } node *exptostat(node *a) { a->ntype = NSTAT; return(a); } node *nullstat; node *node0(intptr_t a) { register node *x; x=ALLOC(0); x->nnext = NULL; x->nobj=a; return(x); } node *node1(intptr_t a,node *b) { register node *x; x=ALLOC(1); x->nnext = NULL; x->nobj=a; x->narg[0]=b; return(x); } node *node2(intptr_t a,node *b,node *c) { register node *x; x = ALLOC(2); x->nnext = NULL; x->nobj = a; x->narg[0] = b; x->narg[1] = c; return(x); } node *node3(intptr_t a,node *b,node *c,node *d) { register node *x; x = ALLOC(3); x->nnext = NULL; x->nobj = a; x->narg[0] = b; x->narg[1] = c; x->narg[2] = d; return(x); } node *node4(intptr_t a,node *b,node *c,node *d,node *e) { register node *x; x = ALLOC(4); x->nnext = NULL; x->nobj = a; x->narg[0] = b; x->narg[1] = c; x->narg[2] = d; x->narg[3] = e; return(x); } node *stat3(intptr_t a,node *b,node *c,node *d) { register node *x; x = node3(a,b,c,d); x->ntype = NSTAT; return(x); } node *op2(intptr_t a,node *b,node *c) { register node *x; x = node2(a,b,c); x->ntype = NEXPR; return(x); } node *op1(intptr_t a,node *b) { register node *x; x = node1(a,b); x->ntype = NEXPR; return(x); } node *stat1(intptr_t a,node *b) { register node *x; x = node1(a,b); x->ntype = NSTAT; return(x); } node *op3(intptr_t a,node *b,node *c,node *d) { register node *x; x = node3(a,b,c,d); x->ntype = NEXPR; return(x); } node *stat2(intptr_t a,node *b,node *c) { register node *x; x = node2(a,b,c); x->ntype = NSTAT; return(x); } node *stat4(intptr_t a,node *b,node *c,node *d,node *e) { register node *x; x = node4(a,b,c,d,e); x->ntype = NSTAT; return(x); } node *valtonode(cell *a, int b) { register node *x; x = node0((intptr_t)a); x->ntype = NVALUE; x->subtype = b; return(x); } node *pa2stat(node *a,node *b,node *c) { register node *x; x = node3(paircnt++, a, b, c); x->ntype = NPA2; return(x); } node *linkum(node *a,node *b) { register node *c; if(a == NULL) return(b); else if(b == NULL) return(a); for(c=a; c->nnext != NULL; c=c->nnext); c->nnext = b; return(a); } node *genprint(void) { register node *x; x = stat2(PRINT,valtonode(lookup("$record", symtab, 0), CFLD), nullstat); return(x); }