Print this page
3731 Update nawk to version 20121220

@@ -23,27 +23,46 @@
 /*
  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
-/*        All Rights Reserved   */
-
-#pragma ident   "%Z%%M% %I%     %E% SMI"
+/*
+ * Copyright (C) Lucent Technologies 1997
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that the above copyright notice appear in all
+ * copies and that both that the copyright notice and this
+ * permission notice and warranty disclaimer appear in supporting
+ * documentation, and that the name Lucent Technologies or any of
+ * its entities not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.
+ *
+ * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+ * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
 
 #define DEBUG
 #include "awk.h"
 #include "y.tab.h"
 
 Node *
 nodealloc(int n)
 {
-        register Node *x;
+        Node *x;
 
         x = (Node *)malloc(sizeof (Node) + (n - 1) * sizeof (Node *));
         if (x == NULL)
-                ERROR "out of space in nodealloc" FATAL;
+                FATAL("out of space in nodealloc");
         x->nnext = NULL;
         x->lineno = lineno;
         return (x);
 }
 

@@ -55,22 +74,22 @@
 }
 
 Node *
 node1(int a, Node *b)
 {
-        register Node *x;
+        Node *x;
 
         x = nodealloc(1);
         x->nobj = a;
         x->narg[0] = b;
         return (x);
 }
 
 Node *
 node2(int a, Node *b, Node *c)
 {
-        register Node *x;
+        Node *x;
 
         x = nodealloc(2);
         x->nobj = a;
         x->narg[0] = b;
         x->narg[1] = c;

@@ -78,11 +97,11 @@
 }
 
 Node *
 node3(int a, Node *b, Node *c, Node *d)
 {
-        register Node *x;
+        Node *x;
 
         x = nodealloc(3);
         x->nobj = a;
         x->narg[0] = b;
         x->narg[1] = c;

@@ -91,152 +110,160 @@
 }
 
 Node *
 node4(int a, Node *b, Node *c, Node *d, Node *e)
 {
-        register Node *x;
+        Node *x;
         x = nodealloc(4);
         x->nobj = a;
         x->narg[0] = b;
         x->narg[1] = c;
         x->narg[2] = d;
         x->narg[3] = e;
         return (x);
 }
 
 Node *
-stat3(int a, Node *b, Node *c, Node *d)
+stat1(int a, Node *b)
 {
-        register Node *x;
+        Node *x;
 
-        x = node3(a, b, c, d);
+        x = node1(a, b);
         x->ntype = NSTAT;
         return (x);
 }
 
 Node *
-op2(int a, Node *b, Node *c)
+stat2(int a, Node *b, Node *c)
 {
-        register Node *x;
+        Node *x;
 
         x = node2(a, b, c);
-        x->ntype = NEXPR;
+        x->ntype = NSTAT;
         return (x);
 }
 
 Node *
-op1(int a, Node *b)
+stat3(int a, Node *b, Node *c, Node *d)
 {
-        register Node *x;
+        Node *x;
 
-        x = node1(a, b);
-        x->ntype = NEXPR;
+        x = node3(a, b, c, d);
+        x->ntype = NSTAT;
         return (x);
 }
 
 Node *
-stat1(int a, Node *b)
+stat4(int a, Node *b, Node *c, Node *d, Node *e)
 {
-        register Node *x;
+        Node *x;
 
-        x = node1(a, b);
+        x = node4(a, b, c, d, e);
         x->ntype = NSTAT;
         return (x);
 }
 
 Node *
-op3(int a, Node *b, Node *c, Node *d)
+op1(int a, Node *b)
 {
-        register Node *x;
+        Node *x;
 
-        x = node3(a, b, c, d);
+        x = node1(a, b);
         x->ntype = NEXPR;
         return (x);
 }
 
 Node *
-op4(int a, Node *b, Node *c, Node *d, Node *e)
+op2(int a, Node *b, Node *c)
 {
-        register Node *x;
+        Node *x;
 
-        x = node4(a, b, c, d, e);
+        x = node2(a, b, c);
         x->ntype = NEXPR;
         return (x);
 }
 
 Node *
-stat2(int a, Node *b, Node *c)
+op3(int a, Node *b, Node *c, Node *d)
 {
-        register Node *x;
+        Node *x;
 
-        x = node2(a, b, c);
-        x->ntype = NSTAT;
+        x = node3(a, b, c, d);
+        x->ntype = NEXPR;
         return (x);
 }
 
 Node *
-stat4(int a, Node *b, Node *c, Node *d, Node *e)
+op4(int a, Node *b, Node *c, Node *d, Node *e)
 {
-        register Node *x;
+        Node *x;
 
         x = node4(a, b, c, d, e);
-        x->ntype = NSTAT;
+        x->ntype = NEXPR;
         return (x);
 }
 
-Node *
-valtonode(Cell *a, int b)
+Node
+*celltonode(Cell *a, int b)
 {
-        register Node *x;
+        Node *x;
 
         a->ctype = OCELL;
         a->csub = b;
         x = node1(0, (Node *)a);
         x->ntype = NVALUE;
         return (x);
 }
 
-Node *
-rectonode(void)
+Node
+*rectonode(void)        /* make $0 into a Node */
 {
-        /* return valtonode(lookup("$0", symtab), CFLD); */
-        return (valtonode(recloc, CFLD));
+        extern Cell *literal0;
+        return (op1(INDIRECT, celltonode(literal0, CUNK)));
 }
 
 Node *
 makearr(Node *p)
 {
         Cell *cp;
 
         if (isvalue(p)) {
                 cp = (Cell *)(p->narg[0]);
-                if (isfunc(cp))
-                        ERROR "%s is a function, not an array", cp->nval SYNTAX;
+                if (isfcn(cp))
+                        SYNTAX("%s is a function, not an array", cp->nval);
                 else if (!isarr(cp)) {
                         xfree(cp->sval);
                         cp->sval = (uchar *)makesymtab(NSYMTAB);
                         cp->tval = ARR;
                 }
         }
         return (p);
 }
 
+/*
+ * The One True Awk sets PA2NUM to 50, which is not enough for webrev(1).
+ */
+#define PA2NUM  250     /* max number of pat,pat patterns allowed */
+int     paircnt;                /* number of them in use */
+int     pairstack[PA2NUM];      /* state of each pat,pat */
+
 Node *
-pa2stat(Node *a, Node *b, Node *c)
+pa2stat(Node *a, Node *b, Node *c)      /* pat, pat {...} */
 {
-        register Node *x;
+        Node *x;
 
-        x = node4(PASTAT2, a, b, c, (Node *)paircnt);
-        paircnt++;
+        x = node4(PASTAT2, a, b, c, itonp(paircnt));
+        if (paircnt++ >= PA2NUM)
+                SYNTAX("limited to %d pat,pat statements", PA2NUM);
         x->ntype = NSTAT;
         return (x);
 }
 
 Node *
 linkum(Node *a, Node *b)
 {
-        register Node *c;
+        Node *c;
 
         if (errorflag)  /* don't link things that are wrong */
                 return (a);
         if (a == NULL)
                 return (b);

@@ -248,31 +275,37 @@
         return (a);
 }
 
 void
 defn(Cell *v, Node *vl, Node *st)       /* turn on FCN bit in definition */
-{
+{                                       /*   body of function, arglist */
         Node *p;
         int n;
 
         if (isarr(v)) {
-                ERROR "`%s' is an array name and a function name",
-                    v->nval SYNTAX;
+                SYNTAX("`%s' is an array name and a function name",
+                    v->nval);
                 return;
         }
+        if (isarg(v->nval) != -1) {
+                SYNTAX("`%s' is both function name and argument name",
+                    v->nval);
+                return;
+        }
+
         v->tval = FCN;
         v->sval = (uchar *)st;
         n = 0;  /* count arguments */
         for (p = vl; p; p = p->nnext)
                 n++;
         v->fval = n;
         dprintf(("defining func %s (%d args)\n", v->nval, n));
 }
 
 int
-isarg(uchar *s) /* is s in argument list for current function? */
-{
+isarg(const uchar *s)   /* is s in argument list for current function? */
+{               /* return -1 if not, otherwise arg # */
         extern Node *arglist;
         Node *p = arglist;
         int n;
 
         for (n = 0; p != 0; p = p->nnext, n++) {

@@ -281,5 +314,17 @@
                         return (n);
                 }
         }
         return (-1);
 }
+
+int
+ptoi(void *p)           /* convert pointer to integer */
+{
+        return ((int)(long)p);  /* swearing that p fits, of course */
+}
+
+Node
+*itonp(int i)           /* and vice versa */
+{
+        return ((Node *)(long)i);
+}