--- old/usr/src/cmd/awk/parse.c	2013-05-11 15:20:45.381070123 +0000
+++ new/usr/src/cmd/awk/parse.c	2013-05-11 15:20:45.401790992 +0000
@@ -25,10 +25,29 @@
  * 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"
@@ -37,11 +56,11 @@
 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);
@@ -57,7 +76,7 @@
 Node *
 node1(int a, Node *b)
 {
-	register Node *x;
+	Node *x;
 
 	x = nodealloc(1);
 	x->nobj = a;
@@ -68,7 +87,7 @@
 Node *
 node2(int a, Node *b, Node *c)
 {
-	register Node *x;
+	Node *x;
 
 	x = nodealloc(2);
 	x->nobj = a;
@@ -80,7 +99,7 @@
 Node *
 node3(int a, Node *b, Node *c, Node *d)
 {
-	register Node *x;
+	Node *x;
 
 	x = nodealloc(3);
 	x->nobj = a;
@@ -93,7 +112,7 @@
 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;
@@ -104,89 +123,89 @@
 }
 
 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;
@@ -195,11 +214,11 @@
 	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 *
@@ -209,8 +228,8 @@
 
 	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);
@@ -220,13 +239,21 @@
 	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);
 }
@@ -234,7 +261,7 @@
 Node *
 linkum(Node *a, Node *b)
 {
-	register Node *c;
+	Node *c;
 
 	if (errorflag)	/* don't link things that are wrong */
 		return (a);
@@ -250,15 +277,21 @@
 
 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 */
@@ -269,8 +302,8 @@
 }
 
 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;
@@ -283,3 +316,15 @@
 	}
 	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);
+}
