summaryrefslogtreecommitdiff
path: root/usr
diff options
context:
space:
mode:
authorCody Peter Mello <cody.mello@joyent.com>2018-10-10 22:54:42 +0000
committerCody Peter Mello <cody.mello@joyent.com>2019-06-13 18:47:50 +0000
commitd0ca0fd545f68d9afab9400f4b46c79e6fedbce9 (patch)
tree7a0732421c19c725ffe054d079473bc61f754808 /usr
parent486c29ab370b325b6cf8d9bbe8e4bc5bac22baeb (diff)
downloadillumos-joyent-d0ca0fd545f68d9afab9400f4b46c79e6fedbce9.tar.gz
OS-7209 Copy minor upstream nawk(1) code changes
Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Jason King <jbk@joyent.com>
Diffstat (limited to 'usr')
-rw-r--r--usr/src/cmd/awk/Makefile11
-rw-r--r--usr/src/cmd/awk/awk.g.y122
-rw-r--r--usr/src/cmd/awk/awk.h203
-rw-r--r--usr/src/cmd/awk/awk.lx.l306
-rw-r--r--usr/src/cmd/awk/b.c337
-rw-r--r--usr/src/cmd/awk/lex.c633
-rw-r--r--usr/src/cmd/awk/lib.c289
-rw-r--r--usr/src/cmd/awk/main.c87
-rw-r--r--usr/src/cmd/awk/maketab.c76
-rw-r--r--usr/src/cmd/awk/parse.c152
-rw-r--r--usr/src/cmd/awk/run.c1076
-rw-r--r--usr/src/cmd/awk/tran.c264
-rw-r--r--usr/src/pkg/manifests/system-test-utiltest.mf154
-rw-r--r--usr/src/test/util-tests/tests/awk/examples/awk/t.crlf4
-rw-r--r--usr/src/test/util-tests/tests/awk/examples/out/t.crlf199
-rw-r--r--usr/src/test/util-tests/tests/awk/gnu/regeq.awk29
-rw-r--r--usr/src/test/util-tests/tests/awk/gnu/regeq.in2
-rw-r--r--usr/src/test/util-tests/tests/awk/gnu/regeq.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/aryprm2.ok6
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/badassign1.ok4
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/badbuild.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/delfunc.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/fnarray.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/fnmisc.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/noparms.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/nulinsrc.ok3
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/parseme.ok4
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/synerr1.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/synerr2.ok4
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/tradanch1.ok2
-rw-r--r--usr/src/test/util-tests/tests/awk/syn/unterm.ok6
-rwxr-xr-xusr/src/test/util-tests/tests/awk/tests/T.-f-f12
-rwxr-xr-xusr/src/test/util-tests/tests/awk/tests/T.errmsg10
-rwxr-xr-xusr/src/test/util-tests/tests/awk/tests/T.latin14
-rwxr-xr-xusr/src/test/util-tests/tests/awk/tests/T.misc17
-rwxr-xr-xusr/src/test/util-tests/tests/awk/tests/T.re6
36 files changed, 2433 insertions, 1603 deletions
diff --git a/usr/src/cmd/awk/Makefile b/usr/src/cmd/awk/Makefile
index 0b38940b29..22570a3ffd 100644
--- a/usr/src/cmd/awk/Makefile
+++ b/usr/src/cmd/awk/Makefile
@@ -30,14 +30,13 @@
PROG= nawk
-OBJ1= b.o lib.o main.o parse.o proctab.o run.o tran.o
-OBJ2= awk.g.o awk.lx.o
+OBJ1= b.o lib.o main.o parse.o proctab.o run.o tran.o lex.o
+OBJ2= awk.g.o
OBJS= $(OBJ2) $(OBJ1)
SRCS= $(OBJ1:%.o=%.c)
include ../Makefile.cmd
-CERRWARN += -_gcc=-Wno-implicit-function-declaration
CERRWARN += -_gcc=-Wno-unused-label
CERRWARN += -_gcc=-Wno-parentheses
CERRWARN += -_gcc=-Wno-unused-variable
@@ -58,11 +57,11 @@ CPPFLAGS += -D_FILE_OFFSET_BITS=64
YFLAGS += -d
LDLIBS += -lm
LINTFLAGS += -u
-CLEANFILES= maketab proctab.c awk.g.c awk.lx.c y.tab.h
+CLEANFILES= maketab proctab.c awk.g.c y.tab.h
.KEEP_STATE:
-all: $(PROG)
+all: $(PROG)
$(PROG): $(OBJS)
$(LINK.c) $(OBJS) -o $@ $(LDLIBS)
@@ -94,8 +93,6 @@ awk.g.c + y.tab.h: awk.g.y
awk.g.o: awk.g.c
-awk.lx.c: awk.lx.l
-
proctab.o: proctab.c
$(COMPILE.c) proctab.c
$(POST_PROCESS_O)
diff --git a/usr/src/cmd/awk/awk.g.y b/usr/src/cmd/awk/awk.g.y
index 21bc8b6dc8..872f452a12 100644
--- a/usr/src/cmd/awk/awk.g.y
+++ b/usr/src/cmd/awk/awk.g.y
@@ -1,5 +1,29 @@
%{
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -30,30 +54,25 @@
/* All Rights Reserved */
%{
-#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 2.10 */
-%}
-
-%{
#include "awk.h"
int yywrap(void) { return(1); }
-#ifndef DEBUG
-# define PUTS(x)
-#endif
-Node *beginloc = 0, *endloc = 0;
-int infunc = 0; /* = 1 if in arglist or body of func */
-uchar *curfname = 0;
-Node *arglist = 0; /* list of args for current function */
+
+Node *beginloc = NULL;
+Node *endloc = NULL;
+int infunc = 0; /* = 1 if in arglist or body of func */
+char *curfname = NULL; /* current function name */
+Node *arglist = NULL; /* list of args for current function */
static void setfname(Cell *);
static int constnode(Node *);
-static uchar *strnode(Node *);
-static Node *notnull();
+static char *strnode(Node *);
+static Node *notnull(Node *);
%}
%union {
Node *p;
Cell *cp;
int i;
- uchar *s;
+ char *s;
}
%token <i> FIRSTTOKEN /* must be first */
@@ -63,14 +82,14 @@ static Node *notnull();
%token <i> MATCH NOTMATCH MATCHOP
%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS
%token <i> AND BOR APPEND EQ GE GT LE LT NE IN
-%token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC
+%token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC
%token <i> SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT
%token <i> ADD MINUS MULT DIVIDE MOD
%token <i> ASSIGN ASGNOP ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ
%token <i> PRINT PRINTF SPRINTF
%token <p> ELSE INTEST CONDEXPR
%token <i> POSTINCR PREINCR POSTDECR PREDECR
-%token <cp> VAR IVAR VARNF CALL NUMBER STRING FIELD
+%token <cp> VAR IVAR VARNF CALL NUMBER STRING
%token <s> REGEXPR
%type <p> pas pattern ppattern plist pplist patlist prarg term
@@ -89,7 +108,7 @@ static Node *notnull();
%left AND
%left GETLINE
%nonassoc APPEND EQ GE GT LE LT NE MATCHOP IN '|'
-%left ARG BLTIN BREAK CALL CLOSE CONTINUE DELETE DO EXIT FOR FIELD FUNC
+%left ARG BLTIN BREAK CALL CLOSE CONTINUE DELETE DO EXIT FOR FUNC
%left GSUB IF INDEX LSUBSTR MATCHFCN NEXT NUMBER
%left PRINT PRINTF RETURN SPLIT SPRINTF STRING SUB SUBSTR
%left REGEXPR VAR VARNF IVAR WHILE '('
@@ -107,7 +126,7 @@ static Node *notnull();
program:
pas { if (errorflag==0)
winner = (Node *)stat3(PROGRAM, beginloc, $1, endloc); }
- | error { yyclearin; bracecheck(); ERROR "bailing out" SYNTAX; }
+ | error { yyclearin; bracecheck(); SYNTAX("bailing out"); }
;
and:
@@ -202,13 +221,13 @@ pa_stats:
patlist:
pattern
- | patlist comma pattern { $$ = linkum($1, $3); }
+ | patlist comma pattern { $$ = linkum($1, $3); }
;
ppattern:
var ASGNOP ppattern { $$ = op2($2, $1, $3); }
| ppattern '?' ppattern ':' ppattern %prec '?'
- { $$ = op3(CONDEXPR, notnull($1), $3, $5); }
+ { $$ = op3(CONDEXPR, notnull($1), $3, $5); }
| ppattern bor ppattern %prec BOR
{ $$ = op2(BOR, notnull($1), notnull($3)); }
| ppattern and ppattern %prec AND
@@ -232,13 +251,13 @@ ppattern:
pattern:
var ASGNOP pattern { $$ = op2($2, $1, $3); }
| pattern '?' pattern ':' pattern %prec '?'
- { $$ = op3(CONDEXPR, notnull($1), $3, $5); }
+ { $$ = op3(CONDEXPR, notnull($1), $3, $5); }
| pattern bor pattern %prec BOR
{ $$ = op2(BOR, notnull($1), notnull($3)); }
| pattern and pattern %prec AND
{ $$ = op2(AND, notnull($1), notnull($3)); }
| NOT pattern
- { $$ = op1(NOT, op2(NE,$2,valtonode(lookup((uchar *)"$zero&null",symtab),CCON))); }
+ { $$ = op1(NOT, op2(NE,$2,celltonode(lookup("$zero&null",symtab),CCON))); }
| pattern EQ pattern { $$ = op2($2, $1, $3); }
| pattern GE pattern { $$ = op2($2, $1, $3); }
| pattern GT pattern { $$ = op2($2, $1, $3); }
@@ -269,6 +288,7 @@ plist:
pplist:
ppattern
| pplist comma ppattern { $$ = linkum($1, $3); }
+ ;
prarg:
/* empty */ { $$ = rectonode(); }
@@ -302,13 +322,14 @@ simple_stmt:
| print prarg GT term { $$ = stat3($1, $2, (Node *) $3, $4); }
| print prarg { $$ = stat3($1, $2, NIL, NIL); }
| DELETE varname '[' patlist ']' { $$ = stat2(DELETE, makearr($2), $4); }
- | DELETE varname { yyclearin; ERROR "you can only delete array[element]" SYNTAX; $$ = stat1(DELETE, $2); }
+ | DELETE varname { yyclearin; SYNTAX("you can only delete array[element]"); $$ = stat1(DELETE, $2); }
| pattern { $$ = exptostat($1); }
- | error { yyclearin; ERROR "illegal statement" SYNTAX; }
+ | error { yyclearin; SYNTAX("illegal statement"); }
;
st:
- nl | ';' opt_nl
+ nl
+ | ';' opt_nl
;
stmt:
@@ -324,7 +345,7 @@ stmt:
| if stmt { $$ = stat3(IF, $1, $2, NIL); }
| lbrace stmtlist rbrace { $$ = $2; }
| NEXT st { if (infunc)
- ERROR "next is illegal inside a function" SYNTAX;
+ SYNTAX("next is illegal inside a function");
$$ = stat1(NEXT, NIL); }
| RETURN pattern st { $$ = stat1(RETURN, $2); }
| RETURN st { $$ = stat1(RETURN, NIL); }
@@ -343,7 +364,8 @@ subop:
;
term:
- term '+' term { $$ = op2(ADD, $1, $3); }
+ term '/' ASGNOP term { $$ = op2(DIVEQ, $1, $4); }
+ | term '+' term { $$ = op2(ADD, $1, $3); }
| term '-' term { $$ = op2(MINUS, $1, $3); }
| term '*' term { $$ = op2(MULT, $1, $3); }
| term '/' term { $$ = op2(DIVIDE, $1, $3); }
@@ -351,23 +373,23 @@ term:
| term POWER term { $$ = op2(POWER, $1, $3); }
| '-' term %prec UMINUS { $$ = op1(UMINUS, $2); }
| '+' term %prec UMINUS { $$ = $2; }
- | BLTIN '(' ')' { $$ = op2(BLTIN, (Node *) $1, rectonode()); }
- | BLTIN '(' patlist ')' { $$ = op2(BLTIN, (Node *) $1, $3); }
- | BLTIN { $$ = op2(BLTIN, (Node *) $1, rectonode()); }
- | CALL '(' ')' { $$ = op2(CALL, valtonode($1,CVAR), NIL); }
- | CALL '(' patlist ')' { $$ = op2(CALL, valtonode($1,CVAR), $3); }
+ | BLTIN '(' ')' { $$ = op2(BLTIN, itonp($1), rectonode()); }
+ | BLTIN '(' patlist ')' { $$ = op2(BLTIN, itonp($1), $3); }
+ | BLTIN { $$ = op2(BLTIN, itonp($1), rectonode()); }
+ | CALL '(' ')' { $$ = op2(CALL, celltonode($1,CVAR), NIL); }
+ | CALL '(' patlist ')' { $$ = op2(CALL, celltonode($1,CVAR), $3); }
| DECR var { $$ = op1(PREDECR, $2); }
| INCR var { $$ = op1(PREINCR, $2); }
| var DECR { $$ = op1(POSTDECR, $1); }
| var INCR { $$ = op1(POSTINCR, $1); }
- | GETLINE var LT term { $$ = op3(GETLINE, $2, (Node *)$3, $4); }
- | GETLINE LT term { $$ = op3(GETLINE, NIL, (Node *)$2, $3); }
+ | GETLINE var LT term { $$ = op3(GETLINE, $2, itonp($3), $4); }
+ | GETLINE LT term { $$ = op3(GETLINE, NIL, itonp($2), $3); }
| GETLINE var { $$ = op3(GETLINE, $2, NIL, NIL); }
| GETLINE { $$ = op3(GETLINE, NIL, NIL, NIL); }
| INDEX '(' pattern comma pattern ')'
{ $$ = op2(INDEX, $3, $5); }
| INDEX '(' pattern comma reg_expr ')'
- { ERROR "index() doesn't permit regular expressions" SYNTAX;
+ { SYNTAX("index() doesn't permit regular expressions");
$$ = op2(INDEX, $3, (Node*)$5); }
| '(' pattern ')' { $$ = $2; }
| MATCHFCN '(' pattern comma reg_expr ')'
@@ -377,7 +399,7 @@ term:
$$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa(strnode($5), 1));
else
$$ = op3(MATCHFCN, (Node *)1, $3, $5); }
- | NUMBER { $$ = valtonode($1, CCON); }
+ | NUMBER { $$ = celltonode($1, CCON); }
| SPLIT '(' pattern comma varname comma pattern ')' /* string */
{ $$ = op4(SPLIT, $3, makearr($5), $7, (Node*)STRING); }
| SPLIT '(' pattern comma varname comma reg_expr ')' /* const /regexp/ */
@@ -385,7 +407,7 @@ term:
| SPLIT '(' pattern comma varname ')'
{ $$ = op4(SPLIT, $3, makearr($5), NIL, (Node*)STRING); } /* default */
| SPRINTF '(' patlist ')' { $$ = op1($1, $3); }
- | STRING { $$ = valtonode($1, CCON); }
+ | STRING { $$ = celltonode($1, CCON); }
| subop '(' reg_expr comma pattern ')'
{ $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); }
| subop '(' pattern comma pattern ')'
@@ -410,20 +432,19 @@ term:
var:
varname
| varname '[' patlist ']' { $$ = op2(ARRAY, makearr($1), $3); }
- | FIELD { $$ = valtonode($1, CFLD); }
- | IVAR { $$ = op1(INDIRECT, valtonode($1, CVAR)); }
- | INDIRECT term { $$ = op1(INDIRECT, $2); }
- ;
+ | IVAR { $$ = op1(INDIRECT, celltonode($1, CVAR)); }
+ | INDIRECT term { $$ = op1(INDIRECT, $2); }
+ ;
varlist:
/* nothing */ { arglist = $$ = 0; }
- | VAR { arglist = $$ = valtonode($1,CVAR); }
- | varlist comma VAR { arglist = $$ = linkum($1,valtonode($3,CVAR)); }
+ | VAR { arglist = $$ = celltonode($1,CVAR); }
+ | varlist comma VAR { arglist = $$ = linkum($1,celltonode($3,CVAR)); }
;
varname:
- VAR { $$ = valtonode($1, CVAR); }
- | ARG { $$ = op1(ARG, (Node *) $1); }
+ VAR { $$ = celltonode($1, CVAR); }
+ | ARG { $$ = op1(ARG, itonp($1)); }
| VARNF { $$ = op1(VARNF, (Node *) $1); }
;
@@ -438,20 +459,19 @@ static void
setfname(Cell *p)
{
if (isarr(p))
- ERROR "%s is an array, not a function", p->nval SYNTAX;
- else if (isfunc(p))
- ERROR "you can't define function %s more than once", p->nval SYNTAX;
+ SYNTAX("%s is an array, not a function", p->nval);
+ else if (isfcn(p))
+ SYNTAX("you can't define function %s more than once", p->nval);
curfname = p->nval;
}
-
static int
constnode(Node *p)
{
- return p->ntype == NVALUE && ((Cell *) (p->narg[0]))->csub == CCON;
+ return isvalue(p) && ((Cell *) (p->narg[0]))->csub == CCON;
}
-static uchar *
+static char *
strnode(Node *p)
{
return ((Cell *)(p->narg[0]))->sval;
diff --git a/usr/src/cmd/awk/awk.h b/usr/src/cmd/awk/awk.h
index 987028fea2..80e894ea6d 100644
--- a/usr/src/cmd/awk/awk.h
+++ b/usr/src/cmd/awk/awk.h
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -38,10 +62,15 @@
#include <limits.h>
typedef double Awkfloat;
-typedef unsigned char uchar;
-#define xfree(a) { if ((a) != NULL) { free(a); a = NULL; } }
+/* unsigned char is more trouble than it's worth */
+
+typedef unsigned char uschar;
+#define xfree(a) { if ((a) != NULL) { free((void *)(a)); (a) = NULL; } }
+
+/* guaranteed non-null for dprintf */
+#define NN(p) ((p) ? (p) : "(null)")
#define DEBUG
#ifdef DEBUG
/* uses have to be doubly parenthesized */
@@ -50,18 +79,6 @@ typedef unsigned char uchar;
#define dprintf(x)
#endif
-extern char errbuf[200];
-extern void error(int, char *);
-#define ERROR (void) snprintf(errbuf, sizeof (errbuf),
-/*CSTYLED*/
-#define FATAL ), error(1, errbuf)
-/*CSTYLED*/
-#define WARNING ), error(0, errbuf)
-/*CSTYLED*/
-#define SYNTAX ), yyerror(errbuf)
-/*CSTYLED*/
-#define CONT )
-
extern int compile_time; /* 1 if compiling, 0 if running */
#define FLD_INCR 64
@@ -71,42 +88,42 @@ extern int compile_time; /* 1 if compiling, 0 if running */
#define expand_buf(p, n, r) \
if (*(n) == 0 || (r) >= (*(n) - 1)) r_expand_buf(p, n, r)
-extern uchar **FS;
-extern uchar **RS;
-extern uchar **ORS;
-extern uchar **OFS;
-extern uchar **OFMT;
+extern char **FS;
+extern char **RS;
+extern char **ORS;
+extern char **OFS;
+extern char **OFMT;
extern Awkfloat *NR;
extern Awkfloat *FNR;
extern Awkfloat *NF;
-extern uchar **FILENAME;
-extern uchar **SUBSEP;
+extern char **FILENAME;
+extern char **SUBSEP;
extern Awkfloat *RSTART;
extern Awkfloat *RLENGTH;
-extern uchar *record;
-extern size_t record_size;
-extern int errorflag;
+extern char *record; /* points to $0 */
+extern size_t recsize;
+extern int errorflag; /* 1 if error has occurred */
extern int donefld; /* 1 if record broken into fields */
extern int donerec; /* 1 if record is valid (no fld has changed */
-extern uchar *patbeg; /* beginning of pattern matched */
-extern int patlen; /* length. set in b.c */
+extern char *patbeg; /* beginning of pattern matched */
+extern int patlen; /* length of pattern matched. set in b.c */
/* Cell: all information about a variable or constant */
typedef struct Cell {
- uchar ctype; /* OCELL, OBOOL, OJUMP, etc. */
- uchar csub; /* CCON, CTEMP, CFLD, etc. */
- uchar *nval; /* name, for variables only */
- uchar *sval; /* string value */
+ uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */
+ uschar csub; /* CCON, CTEMP, CFLD, etc. */
+ char *nval; /* name, for variables only */
+ char *sval; /* string value */
Awkfloat fval; /* value as number */
unsigned tval;
/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
struct Cell *cnext; /* ptr to next if chained */
} Cell;
-typedef struct { /* symbol table array */
+typedef struct Array { /* symbol table array */
int nelem; /* elements in table right now */
int size; /* size of tab */
Cell **tab; /* hash table pointers */
@@ -114,8 +131,9 @@ typedef struct { /* symbol table array */
#define NSYMTAB 50 /* initial size of a symbol table */
extern Array *symtab, *makesymtab(int);
-extern Cell *setsymtab(uchar *, uchar *, Awkfloat, unsigned int, Array *);
-extern Cell *lookup(uchar *, Array *);
+extern Cell *setsymtab(const char *, const char *, Awkfloat,
+ unsigned int, Array *);
+extern Cell *lookup(const char *, Array *);
extern Cell *recloc; /* location of input record */
extern Cell *nrloc; /* NR */
@@ -136,9 +154,15 @@ extern Cell *rlengthloc; /* RLENGTH */
#define freeable(p) (!((p)->tval & DONTFREE))
-extern Awkfloat setfval(Cell *, Awkfloat), getfval(Cell *), r_getfval(Cell *);
-extern uchar *setsval(Cell *, uchar *), *getsval(Cell *), *r_getsval(Cell *);
-extern uchar *tostring(uchar *), *tokname(int), *qstring(uchar *, int);
+extern Awkfloat setfval(Cell *, Awkfloat);
+extern Awkfloat getfval(Cell *);
+extern Awkfloat r_getfval(Cell *);
+extern char *setsval(Cell *, const char *);
+extern char *getsval(Cell *);
+extern char *r_getsval(Cell *);
+extern char *tostring(const char *);
+extern char *tokname(int);
+extern char *qstring(const char *, int);
#define getfval(p) \
(((p)->tval & (ARR|FLD|REC|NUM)) == NUM ? (p)->fval : r_getfval(p))
@@ -165,9 +189,9 @@ extern uchar *tostring(uchar *), *tokname(int), *qstring(uchar *, int);
typedef struct Node {
int ntype;
struct Node *nnext;
- off_t lineno;
+ off_t lineno;
int nobj;
- struct Node *narg[1];
+ struct Node *narg[1];
/* variable: actual size set by calling malloc */
} Node;
@@ -190,6 +214,7 @@ extern Node *nullnode;
#define CNAME 3
#define CVAR 2
#define CFLD 1
+#define CUNK 0
/* bool subtypes */
#define BTRUE 11
@@ -210,7 +235,7 @@ extern Node *nullnode;
extern Cell *(*proctab[])(Node **, int);
extern Cell *nullproc(Node **, int);
-extern int pairstack[], paircnt;
+extern int *pairstack, paircnt;
extern Node *stat1(int, Node *), *stat2(int, Node *, Node *);
extern Node *stat3(int, Node *, Node *, Node *);
@@ -219,7 +244,7 @@ extern Node *pa2stat(Node *, Node *, Node *);
extern Node *op1(int, Node *), *op2(int, Node *, Node *);
extern Node *op3(int, Node *, Node *, Node *);
extern Node *op4(int, Node *, Node *, Node *, Node *);
-extern Node *linkum(Node *, Node *), *valtonode(Cell *, int);
+extern Node *linkum(Node *, Node *), *celltonode(Cell *, int);
extern Node *rectonode(void), *exptostat(Node *);
extern Node *makearr(Node *);
@@ -233,10 +258,12 @@ extern Node *makearr(Node *);
#define iscont(n) ((n)->csub == JCONT)
#define isnext(n) ((n)->csub == JNEXT)
#define isret(n) ((n)->csub == JRET)
+#define isrec(n) ((n)->tval & REC)
+#define isfld(n) ((n)->tval & FLD)
#define isstr(n) ((n)->tval & STR)
#define isnum(n) ((n)->tval & NUM)
#define isarr(n) ((n)->tval & ARR)
-#define isfunc(n) ((n)->tval & FCN)
+#define isfcn(n) ((n)->tval & FCN)
#define istrue(n) ((n)->csub == BTRUE)
#define istemp(n) ((n)->csub == CTEMP)
@@ -250,70 +277,92 @@ typedef struct rrow {
} rrow;
typedef struct fa {
- uchar *restr;
+ uschar gototab[NSTATES][NCHARS];
+ uschar out[NSTATES];
+ uschar *restr;
+ int *posns[NSTATES];
int anchor;
int use;
- uchar gototab[NSTATES][NCHARS];
- int *posns[NSTATES];
- uchar out[NSTATES];
int initstat;
int curstat;
int accept;
int reset;
+ /* re is variable: actual size set by calling malloc */
struct rrow re[1];
} fa;
+/* lex.c */
+extern int yylex(void);
+extern void startreg(void);
+extern int input(void);
+extern void unput(int);
+extern void unputstr(const char *);
+extern int yylook(void);
+extern int yyback(int *, int);
+extern int yyinput(void);
+
+/* parse.c */
+extern void defn(Cell *, Node *, Node *);
+extern int ptoi(void *);
+extern Node *itonp(int);
+extern int isarg(const char *);
+
/* b.c */
-extern fa *makedfa(uchar *, int);
-extern int nematch(fa *, uchar *);
-extern int match(fa *, uchar *);
-extern int pmatch(fa *, uchar *);
+extern fa *makedfa(const char *, int);
+extern int nematch(fa *, const char *);
+extern int match(fa *, const char *);
+extern int pmatch(fa *, const char *);
/* lib.c */
-extern int isclvar(uchar *);
-extern int is_number(uchar *);
-extern void setclvar(uchar *);
-extern int readrec(uchar **, size_t *, FILE *);
+
+extern void SYNTAX(const char *, ...);
+extern void FATAL(const char *, ...) __attribute__((__noreturn__));
+extern void WARNING(const char *, ...);
+extern void error(void);
+
+extern int isclvar(const char *);
+extern int is_number(const char *);
+extern void setclvar(char *);
+extern int readrec(char **, size_t *, FILE *);
extern void bracecheck(void);
+extern void recinit(unsigned int n);
extern void syminit(void);
-extern void yyerror(char *);
+extern void yyerror(const char *);
extern void fldbld(void);
extern void recbld(void);
-extern int getrec(uchar **, size_t *);
+extern int getrec(char **, size_t *);
extern Cell *fieldadr(int);
extern void newfld(int);
extern Cell *getfld(int);
extern int fldidx(Cell *);
-extern double errcheck(double, char *);
+extern double errcheck(double, const char *);
extern void fpecatch(int);
-extern void init_buf(uchar **, size_t *, size_t);
-extern void adjust_buf(uchar **, size_t);
-extern void r_expand_buf(uchar **, size_t *, size_t);
-
-extern int donefld;
-extern int donerec;
-extern uchar *record;
-extern size_t record_size;
+extern void init_buf(char **, size_t *, size_t);
+extern void adjust_buf(char **, size_t);
+extern void r_expand_buf(char **, size_t *, size_t);
/* main.c */
extern int dbg;
-extern uchar *cmdname;
-extern uchar *lexprog;
+extern char *lexprog;
extern int compile_time;
extern char radixpoint;
+extern char *cursource(void);
+extern int pgetc(void);
/* tran.c */
extern void syminit(void);
-extern void arginit(int, uchar **);
-extern void envinit(uchar **);
+extern void arginit(int, char **);
+extern void envinit(char **);
extern void freesymtab(Cell *);
-extern void freeelem(Cell *, uchar *);
-extern void funnyvar(Cell *, char *);
-extern int hash(uchar *, int);
+extern void freeelem(Cell *, const char *);
+extern void funnyvar(Cell *, const char *);
+extern int hash(const char *, int);
extern Awkfloat *ARGC;
/* run.c */
-extern void run(Node *);
+extern void run(Node *);
+extern int adjbuf(char **pb, size_t *sz, size_t min, size_t q,
+ char **pbp, const char *what);
extern int paircnt;
extern Node *winner;
@@ -336,7 +385,7 @@ extern Cell *substr(Node **, int);
extern Cell *sub(Node **, int);
extern Cell *gsub(Node **, int);
extern Cell *sindex(Node **, int);
-extern Cell *a_sprintf(Node **, int);
+extern Cell *awksprintf(Node **, int);
extern Cell *arith(Node **, int);
extern Cell *incrdecr(Node **, int);
extern Cell *cat(Node **, int);
@@ -344,10 +393,10 @@ extern Cell *pastat(Node **, int);
extern Cell *dopa2(Node **, int);
extern Cell *matchop(Node **, int);
extern Cell *intest(Node **, int);
-extern Cell *aprintf(Node **, int);
-extern Cell *print(Node **, int);
+extern Cell *awkprintf(Node **, int);
+extern Cell *printstat(Node **, int);
extern Cell *closefile(Node **, int);
-extern Cell *delete(Node **, int);
+extern Cell *awkdelete(Node **, int);
extern Cell *split(Node **, int);
extern Cell *assign(Node **, int);
extern Cell *condexpr(Node **, int);
@@ -361,6 +410,6 @@ extern Cell *bltin(Node **, int);
extern Cell *call(Node **, int);
extern Cell *arg(Node **, int);
extern Cell *getnf(Node **, int);
-extern Cell *getaline(Node **, int);
+extern Cell *awkgetline(Node **, int);
#endif /* AWK_H */
diff --git a/usr/src/cmd/awk/awk.lx.l b/usr/src/cmd/awk/awk.lx.l
deleted file mode 100644
index a7e8185832..0000000000
--- a/usr/src/cmd/awk/awk.lx.l
+++ /dev/null
@@ -1,306 +0,0 @@
-%{
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * 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"
-%}
-
-%Start A str sc reg comment
-
-%{
-
-#include <sys/types.h>
-#include "awk.h"
-#include "y.tab.h"
-
-#undef input /* defeat lex */
-#undef unput
-
-static void unput(int);
-static void unputstr(char *);
-
-extern YYSTYPE yylval;
-extern int infunc;
-
-off_t lineno = 1;
-int bracecnt = 0;
-int brackcnt = 0;
-int parencnt = 0;
-#define DEBUG
-#ifdef DEBUG
-# define RET(x) {if(dbg)printf("lex %s [%s]\n", tokname(x), yytext); return(x); }
-#else
-# define RET(x) return(x)
-#endif
-
-/*
- * The standards (SUSV2) requires that Record size be atleast LINE_MAX.
- * LINE_MAX is a standard variable defined in limits.h.
- * Though nawk is not standards compliant, we let RECSIZE
- * grow with LINE_MAX instead of the magic number 1024.
- */
-#define CBUFLEN (3 * LINE_MAX)
-
-#define CADD cbuf[clen++] = yytext[0]; \
- if (clen >= CBUFLEN-1) { \
- ERROR "string/reg expr %.10s... too long", cbuf SYNTAX; \
- BEGIN A; \
- }
-
-static uchar cbuf[CBUFLEN];
-static uchar *s;
-static int clen, cflag;
-%}
-
-A [a-zA-Z_]
-B [a-zA-Z0-9_]
-D [0-9]
-O [0-7]
-H [0-9a-fA-F]
-WS [ \t]
-
-%%
- switch (yybgin-yysvec-1) { /* witchcraft */
- case 0:
- BEGIN A;
- break;
- case sc:
- BEGIN A;
- RET('}');
- }
-
-<A>\n { lineno++; RET(NL); }
-<A>#.* { ; } /* strip comments */
-<A>{WS}+ { ; }
-<A>; { RET(';'); }
-
-<A>"\\"\n { lineno++; }
-<A>BEGIN { RET(XBEGIN); }
-<A>END { RET(XEND); }
-<A>func(tion)? { if (infunc) ERROR "illegal nested function" SYNTAX; RET(FUNC); }
-<A>return { if (!infunc) ERROR "return not in function" SYNTAX; RET(RETURN); }
-<A>"&&" { RET(AND); }
-<A>"||" { RET(BOR); }
-<A>"!" { RET(NOT); }
-<A>"!=" { yylval.i = NE; RET(NE); }
-<A>"~" { yylval.i = MATCH; RET(MATCHOP); }
-<A>"!~" { yylval.i = NOTMATCH; RET(MATCHOP); }
-<A>"<" { yylval.i = LT; RET(LT); }
-<A>"<=" { yylval.i = LE; RET(LE); }
-<A>"==" { yylval.i = EQ; RET(EQ); }
-<A>">=" { yylval.i = GE; RET(GE); }
-<A>">" { yylval.i = GT; RET(GT); }
-<A>">>" { yylval.i = APPEND; RET(APPEND); }
-<A>"++" { yylval.i = INCR; RET(INCR); }
-<A>"--" { yylval.i = DECR; RET(DECR); }
-<A>"+=" { yylval.i = ADDEQ; RET(ASGNOP); }
-<A>"-=" { yylval.i = SUBEQ; RET(ASGNOP); }
-<A>"*=" { yylval.i = MULTEQ; RET(ASGNOP); }
-<A>"/=" { yylval.i = DIVEQ; RET(ASGNOP); }
-<A>"%=" { yylval.i = MODEQ; RET(ASGNOP); }
-<A>"^=" { yylval.i = POWEQ; RET(ASGNOP); }
-<A>"**=" { yylval.i = POWEQ; RET(ASGNOP); }
-<A>"=" { yylval.i = ASSIGN; RET(ASGNOP); }
-<A>"**" { RET(POWER); }
-<A>"^" { RET(POWER); }
-
-<A>"$"{D}+ { yylval.cp = fieldadr(atoi(yytext+1)); RET(FIELD); }
-<A>"$NF" { unputstr("(NF)"); return(INDIRECT); }
-<A>"$"{A}{B}* { int c, n;
- c = input(); unput(c);
- if (c == '(' || c == '[' || infunc && (n=isarg(yytext+1)) >= 0) {
- unputstr(yytext+1);
- return(INDIRECT);
- } else {
- yylval.cp = setsymtab((uchar *)yytext+1,
- (uchar *)"",0.0,STR|NUM,symtab);
- RET(IVAR);
- }
- }
-<A>"$" { RET(INDIRECT); }
-<A>NF { yylval.cp = setsymtab((uchar *)yytext, (uchar *)"", 0.0, NUM, symtab); RET(VARNF); }
-
-<A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)? {
- yylval.cp = setsymtab((uchar *)yytext, tostring((uchar *)yytext), atof(yytext), CON|NUM, symtab);
- RET(NUMBER); }
-
-<A>while { RET(WHILE); }
-<A>for { RET(FOR); }
-<A>do { RET(DO); }
-<A>if { RET(IF); }
-<A>else { RET(ELSE); }
-<A>next { RET(NEXT); }
-<A>exit { RET(EXIT); }
-<A>break { RET(BREAK); }
-<A>continue { RET(CONTINUE); }
-<A>print { yylval.i = PRINT; RET(PRINT); }
-<A>printf { yylval.i = PRINTF; RET(PRINTF); }
-<A>sprintf { yylval.i = SPRINTF; RET(SPRINTF); }
-<A>split { yylval.i = SPLIT; RET(SPLIT); }
-<A>substr { RET(SUBSTR); }
-<A>sub { yylval.i = SUB; RET(SUB); }
-<A>gsub { yylval.i = GSUB; RET(GSUB); }
-<A>index { RET(INDEX); }
-<A>match { RET(MATCHFCN); }
-<A>in { RET(IN); }
-<A>getline { RET(GETLINE); }
-<A>close { RET(CLOSE); }
-<A>delete { RET(DELETE); }
-<A>length { yylval.i = FLENGTH; RET(BLTIN); }
-<A>log { yylval.i = FLOG; RET(BLTIN); }
-<A>int { yylval.i = FINT; RET(BLTIN); }
-<A>exp { yylval.i = FEXP; RET(BLTIN); }
-<A>sqrt { yylval.i = FSQRT; RET(BLTIN); }
-<A>sin { yylval.i = FSIN; RET(BLTIN); }
-<A>cos { yylval.i = FCOS; RET(BLTIN); }
-<A>atan2 { yylval.i = FATAN; RET(BLTIN); }
-<A>system { yylval.i = FSYSTEM; RET(BLTIN); }
-<A>rand { yylval.i = FRAND; RET(BLTIN); }
-<A>srand { yylval.i = FSRAND; RET(BLTIN); }
-<A>toupper { yylval.i = FTOUPPER; RET(BLTIN); }
-<A>tolower { yylval.i = FTOLOWER; RET(BLTIN); }
-
-<A>{A}{B}* { int n, c;
- c = input(); unput(c); /* look for '(' */
- if (c != '(' && infunc && (n=isarg(yytext)) >= 0) {
- yylval.i = n;
- RET(ARG);
- } else {
- yylval.cp = setsymtab((uchar *)yytext,
- (uchar *)"",0.0,STR|NUM,symtab);
- if (c == '(') {
- RET(CALL);
- } else {
- RET(VAR);
- }
- }
- }
-<A>\" { BEGIN str; clen = 0; }
-
-<A>"}" { if (--bracecnt < 0) ERROR "extra }" SYNTAX; BEGIN sc; RET(';'); }
-<A>"]" { if (--brackcnt < 0) ERROR "extra ]" SYNTAX; RET(']'); }
-<A>")" { if (--parencnt < 0) ERROR "extra )" SYNTAX; RET(')'); }
-
-<A>. { if (yytext[0] == '{') bracecnt++;
- else if (yytext[0] == '[') brackcnt++;
- else if (yytext[0] == '(') parencnt++;
- RET(yylval.i = yytext[0]); /* everything else */ }
-
-<reg>\\. { cbuf[clen++] = '\\'; cbuf[clen++] = yytext[1]; }
-<reg>\n { ERROR "newline in regular expression %.10s...", cbuf SYNTAX; lineno++; BEGIN A; }
-<reg>"/" { BEGIN A;
- cbuf[clen] = 0;
- yylval.s = tostring(cbuf);
- unput('/');
- RET(REGEXPR); }
-<reg>. { CADD; }
-
-<str>\" { BEGIN A;
- cbuf[clen] = 0; s = tostring(cbuf);
- cbuf[clen] = ' '; cbuf[++clen] = 0;
- yylval.cp = setsymtab(cbuf, s, 0.0, CON|STR, symtab);
- RET(STRING); }
-<str>\n { ERROR "newline in string %.10s...", cbuf SYNTAX; lineno++; BEGIN A; }
-<str>"\\\"" { cbuf[clen++] = '"'; }
-<str>"\\"n { cbuf[clen++] = '\n'; }
-<str>"\\"t { cbuf[clen++] = '\t'; }
-<str>"\\"f { cbuf[clen++] = '\f'; }
-<str>"\\"r { cbuf[clen++] = '\r'; }
-<str>"\\"b { cbuf[clen++] = '\b'; }
-<str>"\\"v { cbuf[clen++] = '\v'; } /* these ANSIisms may not be known by */
-<str>"\\"a { cbuf[clen++] = '\007'; } /* your compiler. hence 007 for bell */
-<str>"\\\\" { cbuf[clen++] = '\\'; }
-<str>"\\"({O}{O}{O}|{O}{O}|{O}) { int n;
- sscanf(yytext+1, "%o", &n); cbuf[clen++] = n; }
-<str>"\\"x({H}+) { int n; /* ANSI permits any number! */
- sscanf(yytext+2, "%x", &n); cbuf[clen++] = n; }
-<str>"\\". { cbuf[clen++] = yytext[1]; }
-<str>. { CADD; }
-
-%%
-
-void
-startreg()
-{
- BEGIN reg;
- clen = 0;
-}
-
-/* input() and unput() are transcriptions of the standard lex
- macros for input and output with additions for error message
- printing. God help us all if someone changes how lex works.
-*/
-
-uchar ebuf[300];
-uchar *ep = ebuf;
-
-int
-input(void)
-{
- register int c;
- extern uchar *lexprog;
-
- if (yysptr > yysbuf)
- c = U(*--yysptr);
- else if (lexprog != NULL) /* awk '...' */
- c = *lexprog++;
- else /* awk -f ... */
- c = pgetc();
- if (c == '\n')
- yylineno++;
- else if (c == EOF)
- c = 0;
- if (ep >= ebuf + sizeof ebuf)
- ep = ebuf;
- return *ep++ = c;
-}
-
-static void
-unput(int c)
-{
- yytchar = c;
- if (yytchar == '\n')
- yylineno--;
- *yysptr++ = yytchar;
- if (--ep < ebuf)
- ep = ebuf + sizeof(ebuf) - 1;
-}
-
-
-static void
-unputstr(char *s)
-{
- int i;
-
- for (i = strlen(s)-1; i >= 0; i--)
- unput(s[i]);
-}
diff --git a/usr/src/cmd/awk/b.c b/usr/src/cmd/awk/b.c
index 9caee4e9d3..d44372393b 100644
--- a/usr/src/cmd/awk/b.c
+++ b/usr/src/cmd/awk/b.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -28,6 +52,8 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
+/* lasciate ogne speranza, voi ch'intrate. */
+
#define DEBUG
#include "awk.h"
@@ -37,7 +63,7 @@
/* NCHARS is 2**n */
#define MAXLIN (3 * LINE_MAX)
-#define type(v) (v)->nobj
+#define type(v) (v)->nobj /* badly overloaded here */
#define left(v) (v)->narg[0]
#define right(v) (v)->narg[1]
#define parent(v) (v)->nnext
@@ -60,34 +86,34 @@ Node *point[MAXLIN];
int rtok; /* next token in current re */
int rlxval;
-uchar *rlxstr;
-uchar *prestr; /* current position in current re */
-uchar *lastre; /* origin of last re */
+static uschar *rlxstr;
+static uschar *prestr; /* current position in current re */
+static uschar *lastre; /* origin of last re */
static int setcnt;
static int poscnt;
-uchar *patbeg;
+char *patbeg;
int patlen;
#define NFA 20 /* cache this many dynamic fa's */
fa *fatab[NFA];
int nfatab = 0; /* entries in fatab */
-static fa *mkdfa(uchar *, int);
+static fa *mkdfa(const char *, int);
static int makeinit(fa *, int);
static void penter(Node *);
static void freetr(Node *);
static void overflo(char *);
static void cfoll(fa *, Node *);
static void follow(Node *);
-static Node *reparse(uchar *);
+static Node *reparse(const char *);
static int relex(void);
static void freefa(fa *);
static int cgoto(fa *, int, int);
fa *
-makedfa(uchar *s, int anchor) /* returns dfa for reg expr s */
+makedfa(const char *s, int anchor) /* returns dfa for reg expr s */
{
int i, use, nuse;
fa *pfa;
@@ -96,7 +122,7 @@ makedfa(uchar *s, int anchor) /* returns dfa for reg expr s */
return (mkdfa(s, anchor));
for (i = 0; i < nfatab; i++) { /* is it there already? */
if (fatab[i]->anchor == anchor &&
- strcmp((char *)fatab[i]->restr, (char *)s) == 0) {
+ strcmp((const char *)fatab[i]->restr, s) == 0) {
fatab[i]->use++;
return (fatab[i]);
}
@@ -121,9 +147,12 @@ makedfa(uchar *s, int anchor) /* returns dfa for reg expr s */
return (pfa);
}
+/*
+ * does the real work of making a dfa
+ * anchor = 1 for anchored matches, else 0
+ */
fa *
-mkdfa(uchar *s, int anchor) /* does the real work of making a dfa */
- /* anchor = 1 for anchored matches, else 0 */
+mkdfa(const char *s, int anchor)
{
Node *p, *p1;
fa *f;
@@ -137,7 +166,7 @@ mkdfa(uchar *s, int anchor) /* does the real work of making a dfa */
poscnt = 0;
penter(p1); /* enter parent pointers and leaf indices */
if ((f = (fa *)calloc(1, sizeof (fa) + poscnt * sizeof (rrow))) == NULL)
- overflo("no room for fa");
+ overflo("out of space for fa");
/* penter has computed number of positions in re */
f->accept = poscnt-1;
cfoll(f, p1); /* set up follow sets */
@@ -151,14 +180,14 @@ mkdfa(uchar *s, int anchor) /* does the real work of making a dfa */
*f->posns[1] = 0;
f->initstat = makeinit(f, anchor);
f->anchor = anchor;
- f->restr = tostring(s);
+ f->restr = (uschar *)tostring(s);
return (f);
}
static int
makeinit(fa *f, int anchor)
{
- register int i, k;
+ int i, k;
f->curstat = 2;
f->out[2] = 0;
@@ -207,8 +236,8 @@ penter(Node *p) /* set up parent pointers and leaf indices */
parent(left(p)) = p;
parent(right(p)) = p;
break;
- default:
- ERROR "unknown type %d in penter", type(p) FATAL;
+ default: /* can't happen */
+ FATAL("can't happen: unknown type %d in penter", type(p));
break;
}
}
@@ -230,80 +259,112 @@ freetr(Node *p) /* free parse tree */
freetr(right(p));
xfree(p);
break;
- default:
- ERROR "unknown type %d in freetr", type(p) FATAL;
+ default: /* can't happen */
+ FATAL("can't happen: unknown type %d in freetr", type(p));
break;
}
}
-uchar *
-cclenter(uchar *p)
+#define isoctdigit(c) ((c) >= '0' && (c) <= '7')
+
+/* pick up next thing after a \\ and increment *pp */
+int
+quoted(uschar **pp)
{
- register int i, c;
- uchar *op, *chars, *ret;
- size_t bsize;
+ uschar *p = *pp;
+ int c;
+
+ if ((c = *p++) == 't')
+ c = '\t';
+ else if (c == 'n')
+ c = '\n';
+ else if (c == 'f')
+ c = '\f';
+ else if (c == 'r')
+ c = '\r';
+ else if (c == 'b')
+ c = '\b';
+ else if (c == '\\')
+ c = '\\';
+ else if (isoctdigit(c)) { /* \d \dd \ddd */
+ int n = c - '0';
+ if (isoctdigit(*p)) {
+ n = 8 * n + *p++ - '0';
+ if (isoctdigit(*p))
+ n = 8 * n + *p++ - '0';
+ }
+ c = n;
+ } /* else */
+ /* c = c; */
+ *pp = p;
+ return (c);
+}
+
+char *
+cclenter(const char *argp) /* add a character class */
+{
+ int i, c, c2;
+ uschar *p = (uschar *)argp;
+ uschar *op, *bp;
+ static uschar *buf = NULL;
+ static size_t bufsz = 100;
- init_buf(&chars, &bsize, LINE_INCR);
op = p;
- i = 0;
- while ((c = *p++) != 0) {
+ if (buf == NULL && (buf = (uschar *)malloc(bufsz)) == NULL)
+ FATAL("out of space for character class [%.10s...] 1", p);
+ bp = buf;
+ for (i = 0; (c = *p++) != 0; ) {
if (c == '\\') {
- if ((c = *p++) == 't')
- c = '\t';
- else if (c == 'n')
- c = '\n';
- else if (c == 'f')
- c = '\f';
- else if (c == 'r')
- c = '\r';
- else if (c == 'b')
- c = '\b';
- else if (c == '\\')
- c = '\\';
- else if (isdigit(c)) {
- int n = c - '0';
- if (isdigit(*p)) {
- n = 8 * n + *p++ - '0';
- if (isdigit(*p))
- n = 8 * n + *p++ - '0';
- }
- c = n;
- } /* else */
- /* c = c; */
- } else if (c == '-' && i > 0 && chars[i-1] != 0) {
+ c = quoted(&p);
+ } else if (c == '-' && i > 0 && bp[-1] != 0) {
if (*p != 0) {
- c = chars[i-1];
- while ((uchar)c < *p) { /* fails if *p is \\ */
- expand_buf(&chars, &bsize, i);
- chars[i++] = ++c;
+ c = bp[-1];
+ c2 = *p++;
+ if (c2 == '\\')
+ c2 = quoted(&p);
+ if (c > c2) { /* empty; ignore */
+ bp--;
+ i--;
+ continue;
+ }
+ while (c < c2) {
+ if (!adjbuf((char **)&buf, &bufsz,
+ bp-buf+2, 100, (char **)&bp,
+ "cclenter1")) {
+ FATAL(
+ "out of space for character class [%.10s...] 2", p);
+ }
+ *bp++ = ++c;
+ i++;
}
- p++;
continue;
}
}
- expand_buf(&chars, &bsize, i);
- chars[i++] = c;
+ if (!adjbuf((char **)&buf, &bufsz, bp-buf+2, 100, (char **)&bp,
+ "cclenter2"))
+ FATAL(
+ "out of space for character class [%.10s...] 3", p);
+ *bp++ = c;
+ i++;
}
- chars[i++] = '\0';
- dprintf(("cclenter: in = |%s|, out = |%s|\n", op, chars));
+ *bp = '\0';
+ dprintf(("cclenter: in = |%s|, out = |%s|\n", op, buf));
xfree(op);
- ret = tostring(chars);
- free(chars);
- return (ret);
+ return (char *)tostring((char *)buf);
}
static void
overflo(char *s)
{
- ERROR "regular expression too big: %s", gettext((char *)s) FATAL;
+ FATAL("regular expression too big: %.30s...", gettext((char *)s));
}
/* enter follow set of each leaf of vertex v into lfollow[leaf] */
static void
cfoll(fa *f, Node *v)
{
- register int i;
- register int *p;
+ int i;
+ int *p;
switch (type(v)) {
LEAF
@@ -330,8 +391,8 @@ cfoll(fa *f, Node *v)
cfoll(f, left(v));
cfoll(f, right(v));
break;
- default:
- ERROR "unknown type %d in cfoll", type(v) FATAL;
+ default: /* can't happen */
+ FATAL("can't happen: unknown type %d in cfoll", type(v));
}
}
@@ -342,7 +403,7 @@ cfoll(fa *f, Node *v)
static int
first(Node *p)
{
- register int b;
+ int b;
switch (type(p)) {
LEAF
@@ -350,7 +411,7 @@ first(Node *p)
setvec[(int)left(p)] = 1;
setcnt++;
}
- if (type(p) == CCL && (*(uchar *)right(p)) == '\0')
+ if (type(p) == CCL && (*(uschar *)right(p)) == '\0')
return (0); /* empty CCL */
else
return (1);
@@ -372,8 +433,7 @@ first(Node *p)
return (0);
return (1);
}
- ERROR "unknown type %d in first", type(p) FATAL;
- return (-1);
+ FATAL("can't happen: unknown type %d in first", type(p));
}
/* collects leaves that can follow v into setvec */
@@ -407,14 +467,16 @@ follow(Node *v)
follow(p);
return;
default:
- ERROR "unknown type %d in follow", type(p) FATAL;
+ FATAL("unknown type %d in follow", type(p));
break;
}
}
static int
-member(uchar c, uchar *s) /* is c in s? */
+member(int c, const char *sarg) /* is c in s? */
{
+ uschar *s = (uschar *)sarg;
+
while (*s)
if (c == *s++)
return (1);
@@ -423,9 +485,10 @@ member(uchar c, uchar *s) /* is c in s? */
int
-match(fa *f, uchar *p)
+match(fa *f, const char *p0) /* shortest match ? */
{
- register int s, ns;
+ int s, ns;
+ uschar *p = (uschar *)p0;
s = f->reset ? makeinit(f, 0) : f->initstat;
if (f->out[s])
@@ -442,10 +505,11 @@ match(fa *f, uchar *p)
}
int
-pmatch(fa *f, uchar *p)
+pmatch(fa *f, const char *p0) /* longest match, for sub */
{
- register int s, ns;
- register uchar *q;
+ int s, ns;
+ uschar *p = (uschar *)p0;
+ uschar *q;
int i, k;
if (f->reset) {
@@ -453,7 +517,7 @@ pmatch(fa *f, uchar *p)
} else {
s = f->initstat;
}
- patbeg = p;
+ patbeg = (char *)p;
patlen = -1;
do {
q = p;
@@ -466,16 +530,17 @@ pmatch(fa *f, uchar *p)
s = cgoto(f, s, *q);
if (s == 1) { /* no transition */
if (patlen >= 0) {
- patbeg = p;
+ patbeg = (char *)p;
return (1);
- } else
+ } else {
goto nextin; /* no match */
+ }
}
} while (*q++ != 0);
if (f->out[s])
patlen = q - p - 1; /* don't count $ */
if (patlen >= 0) {
- patbeg = p;
+ patbeg = (char *)p;
return (1);
}
nextin:
@@ -500,10 +565,11 @@ pmatch(fa *f, uchar *p)
}
int
-nematch(fa *f, uchar *p)
+nematch(fa *f, const char *p0) /* non-empty match, for sub */
{
- register int s, ns;
- register uchar *q;
+ int s, ns;
+ uschar *p = (uschar *)p0;
+ uschar *q;
int i, k;
if (f->reset) {
@@ -523,7 +589,7 @@ nematch(fa *f, uchar *p)
s = cgoto(f, s, *q);
if (s == 1) { /* no transition */
if (patlen > 0) {
- patbeg = p;
+ patbeg = (char *)p;
return (1);
} else
goto nnextin; /* no nonempty match */
@@ -532,7 +598,7 @@ nematch(fa *f, uchar *p)
if (f->out[s])
patlen = q - p - 1; /* don't count $ */
if (patlen > 0) {
- patbeg = p;
+ patbeg = (char *)p;
return (1);
}
nnextin:
@@ -561,30 +627,29 @@ static Node *regexp(void), *primary(void), *concat(Node *);
static Node *alt(Node *), *unary(Node *);
static Node *
-reparse(uchar *p)
+reparse(const char *p)
{
/* parses regular expression pointed to by p */
/* uses relex() to scan regular expression */
Node *np;
dprintf(("reparse <%s>\n", p));
- lastre = prestr = p; /* prestr points to string to be parsed */
+
+ /* prestr points to string to be parsed */
+ lastre = prestr = (uschar *)p;
rtok = relex();
- if (rtok == '\0')
- ERROR "empty regular expression" FATAL;
- np = regexp();
if (rtok == '\0') {
- return (np);
- } else {
- ERROR "syntax error in regular expression %s at %s",
- lastre, prestr FATAL;
+ FATAL("empty regular expression");
}
- /*NOTREACHED*/
- return (NULL);
+ np = regexp();
+ if (rtok != '\0')
+ FATAL("syntax error in regular expression %s at %s",
+ lastre, prestr);
+ return (np);
}
static Node *
-regexp(void)
+regexp(void) /* top-level parse of reg expr */
{
return (alt(concat(primary())));
}
@@ -596,7 +661,7 @@ primary(void)
switch (rtok) {
case CHAR:
- np = op2(CHAR, NIL, (Node *)rlxval);
+ np = op2(CHAR, NIL, itonp(rlxval));
rtok = relex();
return (unary(np));
case ALL:
@@ -607,17 +672,17 @@ primary(void)
return (unary(op2(DOT, NIL, NIL)));
case CCL:
/*LINTED align*/
- np = op2(CCL, NIL, (Node *)cclenter(rlxstr));
+ np = op2(CCL, NIL, (Node *)cclenter((char *)rlxstr));
rtok = relex();
return (unary(np));
case NCCL:
/*LINTED align*/
- np = op2(NCCL, NIL, (Node *)cclenter(rlxstr));
+ np = op2(NCCL, NIL, (Node *)cclenter((char *)rlxstr));
rtok = relex();
return (unary(np));
case '^':
rtok = relex();
- return (unary(op2(CHAR, NIL, (Node *)HAT)));
+ return (unary(op2(CHAR, NIL, itonp(HAT))));
case '$':
rtok = relex();
return (unary(op2(CHAR, NIL, NIL)));
@@ -627,20 +692,20 @@ primary(void)
rtok = relex();
return (unary(op2(CCL, NIL,
/*LINTED align*/
- (Node *)tostring((uchar *)""))));
+ (Node *)tostring(""))));
}
np = regexp();
if (rtok == ')') {
rtok = relex();
return (unary(np));
} else {
- ERROR "syntax error in regular expression %s at %s",
- lastre, prestr FATAL;
+ FATAL("syntax error in regular expression %s at %s",
+ lastre, prestr);
}
/* FALLTHROUGH */
default:
- ERROR "illegal primary in regular expression %s at %s",
- lastre, prestr FATAL;
+ FATAL("illegal primary in regular expression %s at %s",
+ lastre, prestr);
}
/*NOTREACHED*/
return (NULL);
@@ -688,8 +753,8 @@ unary(Node *np)
static int
relex(void) /* lexical analyzer for reparse */
{
- register int c;
- uchar *cbuf;
+ int c;
+ uschar *cbuf;
int clen, cflag;
switch (c = *prestr++) {
@@ -705,28 +770,7 @@ relex(void) /* lexical analyzer for reparse */
case ')':
return (c);
case '\\':
- if ((c = *prestr++) == 't')
- c = '\t';
- else if (c == 'n')
- c = '\n';
- else if (c == 'f')
- c = '\f';
- else if (c == 'r')
- c = '\r';
- else if (c == 'b')
- c = '\b';
- else if (c == '\\')
- c = '\\';
- else if (isdigit(c)) {
- int n = c - '0';
- if (isdigit(*prestr)) {
- n = 8 * n + *prestr++ - '0';
- if (isdigit(*prestr))
- n = 8 * n + *prestr++ - '0';
- }
- c = n;
- } /* else it's now in c */
- rlxval = c;
+ rlxval = quoted(&prestr);
return (CHAR);
default:
rlxval = c;
@@ -738,29 +782,31 @@ relex(void) /* lexical analyzer for reparse */
prestr++;
} else
cflag = 0;
- init_buf(&cbuf, NULL, strlen((char *)prestr) * 2 + 1);
+ init_buf((char **)&cbuf, NULL, strlen((char *)prestr) * 2 + 1);
for (;;) {
if ((c = *prestr++) == '\\') {
cbuf[clen++] = '\\';
if ((c = *prestr++) == '\0') {
- ERROR
- "nonterminated character class %s", lastre FATAL;
+ FATAL("nonterminated character class "
+ "%.20s...", lastre);
}
cbuf[clen++] = c;
+ } else if (clen == 0) {
+ cbuf[clen++] = c;
} else if (c == ']') {
cbuf[clen] = 0;
- rlxstr = tostring(cbuf);
+ rlxstr = (uschar *)tostring((char *)cbuf);
free(cbuf);
if (cflag == 0)
return (CCL);
else
return (NCCL);
} else if (c == '\n') {
- ERROR "newline in character class %s...",
- lastre FATAL;
+ FATAL("newline in character class %s...",
+ lastre);
} else if (c == '\0') {
- ERROR "nonterminated character class %s",
- lastre FATAL;
+ FATAL("nonterminated character class %s",
+ lastre);
} else
cbuf[clen++] = c;
}
@@ -772,8 +818,8 @@ relex(void) /* lexical analyzer for reparse */
static int
cgoto(fa *f, int s, int c)
{
- register int i, j, k;
- register int *p, *q;
+ int i, j, k;
+ int *p, *q;
for (i = 0; i <= f->accept; i++)
setvec[i] = 0;
@@ -786,9 +832,9 @@ cgoto(fa *f, int s, int c)
k == DOT && c != 0 && c != HAT ||
k == ALL && c != 0 ||
k == CCL &&
- member(c, (uchar *)f->re[p[i]].lval) ||
+ member(c, (char *)f->re[p[i]].lval) ||
k == NCCL &&
- !member(c, (uchar *)f->re[p[i]].lval) &&
+ !member(c, (char *)f->re[p[i]].lval) &&
c != 0 && c != HAT) {
q = f->re[p[i]].lfollow;
for (j = 1; j <= *q; j++) {
@@ -847,10 +893,9 @@ cgoto(fa *f, int s, int c)
}
static void
-freefa(fa *f)
+freefa(fa *f) /* free a finite automaton */
{
-
- register int i;
+ int i;
if (f == NULL)
return;
diff --git a/usr/src/cmd/awk/lex.c b/usr/src/cmd/awk/lex.c
new file mode 100644
index 0000000000..78954e3a49
--- /dev/null
+++ b/usr/src/cmd/awk/lex.c
@@ -0,0 +1,633 @@
+/*
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "awk.h"
+#include "y.tab.h"
+
+extern YYSTYPE yylval;
+extern int infunc;
+
+off_t lineno = 1;
+int bracecnt = 0;
+int brackcnt = 0;
+int parencnt = 0;
+
+typedef struct Keyword {
+ const char *word;
+ int sub;
+ int type;
+} Keyword;
+
+Keyword keywords[] = { /* keep sorted: binary searched */
+ { "BEGIN", XBEGIN, XBEGIN },
+ { "END", XEND, XEND },
+ { "NF", VARNF, VARNF },
+ { "atan2", FATAN, BLTIN },
+ { "break", BREAK, BREAK },
+ { "close", CLOSE, CLOSE },
+ { "continue", CONTINUE, CONTINUE },
+ { "cos", FCOS, BLTIN },
+ { "delete", DELETE, DELETE },
+ { "do", DO, DO },
+ { "else", ELSE, ELSE },
+ { "exit", EXIT, EXIT },
+ { "exp", FEXP, BLTIN },
+ { "for", FOR, FOR },
+ { "func", FUNC, FUNC },
+ { "function", FUNC, FUNC },
+ { "getline", GETLINE, GETLINE },
+ { "gsub", GSUB, GSUB },
+ { "if", IF, IF },
+ { "in", IN, IN },
+ { "index", INDEX, INDEX },
+ { "int", FINT, BLTIN },
+ { "length", FLENGTH, BLTIN },
+ { "log", FLOG, BLTIN },
+ { "match", MATCHFCN, MATCHFCN },
+ { "next", NEXT, NEXT },
+ { "print", PRINT, PRINT },
+ { "printf", PRINTF, PRINTF },
+ { "rand", FRAND, BLTIN },
+ { "return", RETURN, RETURN },
+ { "sin", FSIN, BLTIN },
+ { "split", SPLIT, SPLIT },
+ { "sprintf", SPRINTF, SPRINTF },
+ { "sqrt", FSQRT, BLTIN },
+ { "srand", FSRAND, BLTIN },
+ { "sub", SUB, SUB },
+ { "substr", SUBSTR, SUBSTR },
+ { "system", FSYSTEM, BLTIN },
+ { "tolower", FTOLOWER, BLTIN },
+ { "toupper", FTOUPPER, BLTIN },
+ { "while", WHILE, WHILE },
+};
+
+#define RET(x) { if (dbg) (void) printf("lex %s\n", tokname(x)); return (x); }
+
+int
+peek(void)
+{
+ int c = input();
+ unput(c);
+ return (c);
+}
+
+int
+gettok(char **pbuf, size_t *psz) /* get next input token */
+{
+ int c, retc;
+ char *buf = *pbuf;
+ size_t sz = *psz;
+ char *bp = buf;
+
+ c = input();
+ if (c == 0)
+ return (0);
+ buf[0] = c;
+ buf[1] = 0;
+ if (!isalnum(c) && c != '.' && c != '_')
+ return (c);
+
+ *bp++ = c;
+ if (isalpha(c) || c == '_') { /* it's a varname */
+ for (; (c = input()) != 0; ) {
+ if (bp-buf >= sz &&
+ !adjbuf(&buf, &sz, bp-buf+2, 100, &bp, "gettok"))
+ FATAL("out of space for name %.10s...", buf);
+ if (isalnum(c) || c == '_')
+ *bp++ = c;
+ else {
+ *bp = 0;
+ unput(c);
+ break;
+ }
+ }
+ *bp = 0;
+ retc = 'a'; /* alphanumeric */
+ } else { /* maybe it's a number, but could be . */
+ char *rem;
+ /* read input until can't be a number */
+ for (; (c = input()) != 0; ) {
+ if (bp-buf >= sz &&
+ !adjbuf(&buf, &sz, bp-buf+2, 100, &bp, "gettok"))
+ FATAL("out of space for number %.10s...", buf);
+ if (isdigit(c) || c == 'e' || c == 'E' ||
+ c == '.' || c == '+' || c == '-')
+ *bp++ = c;
+ else {
+ unput(c);
+ break;
+ }
+ }
+ *bp = 0;
+ (void) strtod(buf, &rem); /* parse the number */
+ if (rem == buf) { /* it wasn't a valid number at all */
+ buf[1] = 0; /* return one character as token */
+ retc = buf[0]; /* character is its own type */
+ unputstr(rem+1); /* put rest back for later */
+ } else { /* some prefix was a number */
+ unputstr(rem); /* put rest back for later */
+ rem[0] = 0; /* truncate buf after number part */
+ retc = '0'; /* type is number */
+ }
+ }
+ *pbuf = buf;
+ *psz = sz;
+ return (retc);
+}
+
+int word(char *);
+int string(void);
+int regexpr(void);
+int sc = 0; /* 1 => return a } right now */
+int reg = 0; /* 1 => return a REGEXPR now */
+
+int
+yylex(void)
+{
+ int c;
+ static char *buf = NULL;
+ /* BUG: setting this small causes core dump! */
+ static size_t bufsize = 5;
+
+ if (buf == NULL && (buf = (char *)malloc(bufsize)) == NULL)
+ FATAL("out of space in yylex");
+ if (sc) {
+ sc = 0;
+ RET('}');
+ }
+ if (reg) {
+ reg = 0;
+ return (regexpr());
+ }
+ for (;;) {
+ c = gettok(&buf, &bufsize);
+ if (c == 0)
+ return (0);
+ if (isalpha(c) || c == '_')
+ return (word(buf));
+ if (isdigit(c)) {
+ yylval.cp = setsymtab(
+ buf, tostring(buf), atof(buf), CON|NUM, symtab);
+ /* should this also have STR set? */
+ RET(NUMBER);
+ }
+
+ yylval.i = c;
+ switch (c) {
+ case '\n': /* {EOL} */
+ lineno++;
+ RET(NL);
+ case '\r': /* assume \n is coming */
+ case ' ': /* {WS}+ */
+ case '\t':
+ break;
+ case '#': /* #.* strip comments */
+ while ((c = input()) != '\n' && c != 0)
+ ;
+ unput(c);
+ break;
+ case ';':
+ RET(';');
+ case '\\':
+ if (peek() == '\n') {
+ (void) input();
+ lineno++;
+ } else if (peek() == '\r') {
+ (void) input();
+ (void) input(); /* BUG: check for \n */
+ lineno++;
+ } else {
+ RET(c);
+ }
+ break;
+ case '&':
+ if (peek() == '&') {
+ (void) input();
+ RET(AND);
+ } else
+ RET('&');
+ case '|':
+ if (peek() == '|') {
+ (void) input();
+ RET(BOR);
+ } else
+ RET('|');
+ case '!':
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = NE;
+ RET(NE);
+ } else if (peek() == '~') {
+ (void) input();
+ yylval.i = NOTMATCH;
+ RET(MATCHOP);
+ } else
+ RET(NOT);
+ case '~':
+ yylval.i = MATCH;
+ RET(MATCHOP);
+ case '<':
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = LE;
+ RET(LE);
+ } else {
+ yylval.i = LT;
+ RET(LT);
+ }
+ case '=':
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = EQ;
+ RET(EQ);
+ } else {
+ yylval.i = ASSIGN;
+ RET(ASGNOP);
+ }
+ case '>':
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = GE;
+ RET(GE);
+ } else if (peek() == '>') {
+ (void) input();
+ yylval.i = APPEND;
+ RET(APPEND);
+ } else {
+ yylval.i = GT;
+ RET(GT);
+ }
+ case '+':
+ if (peek() == '+') {
+ (void) input();
+ yylval.i = INCR;
+ RET(INCR);
+ } else if (peek() == '=') {
+ (void) input();
+ yylval.i = ADDEQ;
+ RET(ASGNOP);
+ } else
+ RET('+');
+ case '-':
+ if (peek() == '-') {
+ (void) input();
+ yylval.i = DECR;
+ RET(DECR);
+ } else if (peek() == '=') {
+ (void) input();
+ yylval.i = SUBEQ;
+ RET(ASGNOP);
+ } else
+ RET('-');
+ case '*':
+ if (peek() == '=') { /* *= */
+ (void) input();
+ yylval.i = MULTEQ;
+ RET(ASGNOP);
+ } else if (peek() == '*') { /* ** or **= */
+ (void) input(); /* eat 2nd * */
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = POWEQ;
+ RET(ASGNOP);
+ } else {
+ RET(POWER);
+ }
+ } else
+ RET('*');
+ case '/':
+ RET('/');
+ case '%':
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = MODEQ;
+ RET(ASGNOP);
+ } else
+ RET('%');
+ case '^':
+ if (peek() == '=') {
+ (void) input();
+ yylval.i = POWEQ;
+ RET(ASGNOP);
+ } else
+ RET(POWER);
+
+ case '$':
+ /* BUG: awkward, if not wrong */
+ c = gettok(&buf, &bufsize);
+ if (isalpha(c)) {
+ if (strcmp(buf, "NF") == 0) {
+ /* very special */
+ unputstr("(NF)");
+ RET(INDIRECT);
+ }
+ c = peek();
+ if (c == '(' || c == '[' ||
+ (infunc && isarg(buf) >= 0)) {
+ unputstr(buf);
+ RET(INDIRECT);
+ }
+ yylval.cp = setsymtab(
+ buf, "", 0.0, STR|NUM, symtab);
+ RET(IVAR);
+ } else if (c == 0) { /* */
+ SYNTAX("unexpected end of input after $");
+ RET(';');
+ } else {
+ unputstr(buf);
+ RET(INDIRECT);
+ }
+
+ case '}':
+ if (--bracecnt < 0)
+ SYNTAX("extra }");
+ sc = 1;
+ RET(';');
+ case ']':
+ if (--brackcnt < 0)
+ SYNTAX("extra ]");
+ RET(']');
+ case ')':
+ if (--parencnt < 0)
+ SYNTAX("extra )");
+ RET(')');
+ case '{':
+ bracecnt++;
+ RET('{');
+ case '[':
+ brackcnt++;
+ RET('[');
+ case '(':
+ parencnt++;
+ RET('(');
+
+ case '"':
+ /* BUG: should be like tran.c ? */
+ return (string());
+
+ default:
+ RET(c);
+ }
+ }
+}
+
+int
+string(void)
+{
+ int c, n;
+ char *s, *bp;
+ static char *buf = NULL;
+ static size_t bufsz = 500;
+
+ if (buf == NULL && (buf = (char *)malloc(bufsz)) == NULL)
+ FATAL("out of space for strings");
+ for (bp = buf; (c = input()) != '"'; ) {
+ if (!adjbuf(&buf, &bufsz, bp-buf+2, 500, &bp, "string"))
+ FATAL("out of space for string %.10s...", buf);
+ switch (c) {
+ case '\n':
+ case '\r':
+ case 0:
+ *bp = '\0';
+ SYNTAX("non-terminated string %.10s...", buf);
+ if (c == 0) /* hopeless */
+ FATAL("giving up");
+ lineno++;
+ break;
+ case '\\':
+ c = input();
+ switch (c) {
+ case '"': *bp++ = '"'; break;
+ case 'n': *bp++ = '\n'; break;
+ case 't': *bp++ = '\t'; break;
+ case 'f': *bp++ = '\f'; break;
+ case 'r': *bp++ = '\r'; break;
+ case 'b': *bp++ = '\b'; break;
+ case 'v': *bp++ = '\v'; break;
+ case 'a': *bp++ = '\007'; break;
+ case '\\': *bp++ = '\\'; break;
+
+ case '0': case '1': case '2': /* octal: \d \dd \ddd */
+ case '3': case '4': case '5': case '6': case '7':
+ n = c - '0';
+ if ((c = peek()) >= '0' && c < '8') {
+ n = 8 * n + input() - '0';
+ if ((c = peek()) >= '0' && c < '8')
+ n = 8 * n + input() - '0';
+ }
+ *bp++ = n;
+ break;
+
+ case 'x': { /* hex \x0-9a-fA-F + */
+ char xbuf[100], *px;
+ px = xbuf;
+ while ((c = input()) != 0 && px-xbuf < 100-2) {
+ if (isdigit(c) ||
+ (c >= 'a' && c <= 'f') ||
+ (c >= 'A' && c <= 'F'))
+ *px++ = c;
+ else
+ break;
+ }
+ *px = 0;
+ unput(c);
+ (void) sscanf(xbuf, "%x", (unsigned int *)&n);
+ *bp++ = n;
+ break;
+ }
+
+ default:
+ *bp++ = c;
+ break;
+ }
+ break;
+ default:
+ *bp++ = c;
+ break;
+ }
+ }
+ *bp = 0;
+ s = tostring(buf);
+ *bp++ = ' '; *bp++ = 0;
+ yylval.cp = setsymtab(buf, s, 0.0, CON|STR|DONTFREE, symtab);
+ RET(STRING);
+}
+
+
+int
+binsearch(char *w, Keyword *kp, int n)
+{
+ int cond, low, mid, high;
+
+ low = 0;
+ high = n - 1;
+ while (low <= high) {
+ mid = (low + high) / 2;
+ if ((cond = strcmp(w, kp[mid].word)) < 0)
+ high = mid - 1;
+ else if (cond > 0)
+ low = mid + 1;
+ else
+ return (mid);
+ }
+ return (-1);
+}
+
+int
+word(char *w)
+{
+ Keyword *kp;
+ int c, n;
+
+ n = binsearch(w, keywords, sizeof (keywords) / sizeof (keywords[0]));
+ if (n != -1) { /* found in table */
+ kp = keywords + n;
+ yylval.i = kp->sub;
+ switch (kp->type) { /* special handling */
+ case BLTIN:
+ RET(kp->type);
+ case FUNC:
+ if (infunc)
+ SYNTAX("illegal nested function");
+ RET(kp->type);
+ case RETURN:
+ if (!infunc)
+ SYNTAX("return not in function");
+ RET(kp->type);
+ case VARNF:
+ yylval.cp = setsymtab("NF", "", 0.0, NUM, symtab);
+ RET(VARNF);
+ default:
+ RET(kp->type);
+ }
+ }
+ c = peek(); /* look for '(' */
+ if (c != '(' && infunc && (n = isarg(w)) >= 0) {
+ yylval.i = n;
+ RET(ARG);
+ } else {
+ yylval.cp = setsymtab(w, "", 0.0, STR|NUM|DONTFREE, symtab);
+ if (c == '(') {
+ RET(CALL);
+ } else {
+ RET(VAR);
+ }
+ }
+}
+
+void
+startreg(void) /* next call to yylex will return a regular expression */
+{
+ reg = 1;
+}
+
+int
+regexpr(void)
+{
+ int c;
+ static char *buf = NULL;
+ static size_t bufsz = 500;
+ char *bp;
+
+ if (buf == NULL && (buf = (char *)malloc(bufsz)) == NULL)
+ FATAL("out of space for rex expr");
+ bp = buf;
+ for (; (c = input()) != '/' && c != 0; ) {
+ if (!adjbuf(&buf, &bufsz, bp-buf+3, 500, &bp, "regexpr"))
+ FATAL("out of space for reg expr %.10s...", buf);
+ if (c == '\n') {
+ *bp = '\0';
+ SYNTAX("newline in regular expression %.10s...", buf);
+ unput('\n');
+ break;
+ } else if (c == '\\') {
+ *bp++ = '\\';
+ *bp++ = input();
+ } else {
+ *bp++ = c;
+ }
+ }
+ *bp = 0;
+ if (c == 0)
+ SYNTAX("non-terminated regular expression %.10s...", buf);
+ yylval.s = tostring(buf);
+ unput('/');
+ RET(REGEXPR);
+}
+
+/* low-level lexical stuff, sort of inherited from lex */
+
+char ebuf[300];
+char *ep = ebuf;
+char yysbuf[100]; /* pushback buffer */
+char *yysptr = yysbuf;
+FILE *yyin = NULL;
+
+int
+input(void) /* get next lexical input character */
+{
+ int c;
+ extern char *lexprog;
+
+ if (yysptr > yysbuf)
+ c = (uschar)*--yysptr;
+ else if (lexprog != NULL) { /* awk '...' */
+ if ((c = (uschar)*lexprog) != 0)
+ lexprog++;
+ } else /* awk -f ... */
+ c = pgetc();
+ if (c == EOF)
+ c = 0;
+ if (ep >= ebuf + sizeof (ebuf))
+ ep = ebuf;
+ *ep = c;
+ if (c != 0) {
+ ep++;
+ }
+ return (c);
+}
+
+void
+unput(int c) /* put lexical character back on input */
+{
+ if (yysptr >= yysbuf + sizeof (yysbuf))
+ FATAL("pushed back too much: %.20s...", yysbuf);
+ *yysptr++ = c;
+ if (--ep < ebuf)
+ ep = ebuf + sizeof (ebuf) - 1;
+}
+
+void
+unputstr(const char *s) /* put a string back on input */
+{
+ int i;
+
+ for (i = strlen(s)-1; i >= 0; i--)
+ unput(s[i]);
+}
diff --git a/usr/src/cmd/awk/lib.c b/usr/src/cmd/awk/lib.c
index ded064c6c3..1f1649549c 100644
--- a/usr/src/cmd/awk/lib.c
+++ b/usr/src/cmd/awk/lib.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -27,14 +51,21 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
#include <errno.h>
+#include <stdlib.h>
+#include <stdarg.h>
#include "awk.h"
#include "y.tab.h"
-uchar *record;
-size_t record_size;
+static FILE *infile = NULL;
+static char *file = "";
+char *record;
+size_t recsize;
+static char *fields;
+static size_t fieldssize = LINE_INCR;
int donefld; /* 1 = implies rec broken into fields */
int donerec; /* 1 = record is valid (no flds have changed) */
@@ -46,17 +77,13 @@ static struct fldtab_chunk {
static size_t fldtab_maxidx;
-static FILE *infile = NULL;
-static uchar *file = (uchar*) "";
-static uchar *fields;
-static size_t fields_size = LINE_INCR;
static int maxfld = 0; /* last used field */
static int argno = 1; /* current input argument number */
-static uchar *getargv(int);
+static char *getargv(int);
static void cleanfld(int, int);
-static int refldbld(uchar *, uchar *);
+static int refldbld(const char *, const char *);
static void bcheck2(int, int, int);
static void eprint(void);
static void bclass(int);
@@ -65,7 +92,7 @@ static void
initgetrec(void)
{
int i;
- uchar *p;
+ char *p;
for (i = 1; i < *ARGC; i++) {
if (!isclvar(p = getargv(i))) /* find 1st real filename */
@@ -74,15 +101,14 @@ initgetrec(void)
argno++;
}
infile = stdin; /* no filenames, so use stdin */
- /* *FILENAME = file = (uchar*) "-"; */
}
int
-getrec(uchar **bufp, size_t *bufsizep)
+getrec(char **bufp, size_t *bufsizep)
{
int c;
static int firsttime = 1;
- uchar_t *buf, *nbuf;
+ char *buf, *nbuf;
size_t len;
if (firsttime) {
@@ -110,8 +136,8 @@ getrec(uchar **bufp, size_t *bufsizep)
dprintf(("opening file %s\n", file));
if (*file == '-' && *(file+1) == '\0')
infile = stdin;
- else if ((infile = fopen((char *)file, "r")) == NULL)
- ERROR "can't open file %s", file FATAL;
+ else if ((infile = fopen(file, "r")) == NULL)
+ FATAL("can't open file %s", file);
(void) setfval(fnrloc, 0.0);
}
c = readrec(&nbuf, &len, infile);
@@ -123,13 +149,13 @@ getrec(uchar **bufp, size_t *bufsizep)
if (c != 0 || buf[0] != '\0') { /* normal record */
if (bufp == &record) {
- if (!(recloc->tval & DONTFREE))
+ if (freeable(recloc))
xfree(recloc->sval);
recloc->sval = record;
recloc->tval = REC | STR | DONTFREE;
if (is_number(recloc->sval)) {
recloc->fval =
- atof((const char *)recloc->sval);
+ atof(recloc->sval);
recloc->tval |= NUM;
}
}
@@ -147,10 +173,10 @@ getrec(uchar **bufp, size_t *bufsizep)
}
int
-readrec(uchar **bufp, size_t *sizep, FILE *inf) /* read one record into buf */
+readrec(char **bufp, size_t *sizep, FILE *inf) /* read one record into buf */
{
int sep, c;
- uchar *buf;
+ char *buf;
int count;
size_t bufsize;
@@ -186,24 +212,24 @@ readrec(uchar **bufp, size_t *sizep, FILE *inf) /* read one record into buf */
}
/* get ARGV[n] */
-static uchar *
+static char *
getargv(int n)
{
Cell *x;
- uchar *s, temp[11];
+ char *s, temp[50];
extern Array *ARGVtab;
- (void) sprintf((char *)temp, "%d", n);
- x = setsymtab(temp, (uchar *)"", 0.0, STR, ARGVtab);
+ (void) sprintf(temp, "%d", n);
+ x = setsymtab(temp, "", 0.0, STR, ARGVtab);
s = getsval(x);
dprintf(("getargv(%d) returns |%s|\n", n, s));
return (s);
}
void
-setclvar(uchar *s) /* set var=value from s */
+setclvar(char *s) /* set var=value from s */
{
- uchar *p;
+ char *p;
Cell *q;
for (p = s; *p != '='; p++)
@@ -213,7 +239,7 @@ setclvar(uchar *s) /* set var=value from s */
q = setsymtab(s, p, 0.0, STR, symtab);
(void) setsval(q, p);
if (is_number(q->sval)) {
- q->fval = atof((const char *)q->sval);
+ q->fval = atof(q->sval);
q->tval |= NUM;
}
dprintf(("command line set %s to |%s|\n", s, p));
@@ -221,43 +247,43 @@ setclvar(uchar *s) /* set var=value from s */
}
void
-fldbld(void)
+fldbld(void) /* create fields from current record */
{
- uchar *r, *fr, sep;
+ char *r, *fr, sep;
Cell *p;
int i;
size_t len;
if (donefld)
return;
- if (!(recloc->tval & STR))
+ if (!isstr(recloc))
(void) getsval(recloc);
r = recloc->sval; /* was record! */
/* make sure fields is always allocated */
- adjust_buf(&fields, fields_size);
+ adjust_buf(&fields, fieldssize);
/*
* make sure fields has enough size. We don't expand the buffer
* in the middle of the loop, since p->sval has already pointed
* the address in the fields.
*/
- len = strlen((char *)r) + 1;
- expand_buf(&fields, &fields_size, len);
+ len = strlen(r) + 1;
+ expand_buf(&fields, &fieldssize, len);
fr = fields;
i = 0; /* number of fields accumulated here */
- if (strlen((char *)*FS) > 1) { /* it's a regular expression */
+ if (strlen(*FS) > 1) { /* it's a regular expression */
i = refldbld(r, *FS);
} else if ((sep = **FS) == ' ') {
for (i = 0; ; ) {
while (*r == ' ' || *r == '\t' || *r == '\n')
r++;
- if (*r == 0)
+ if (*r == '\0')
break;
i++;
p = getfld(i);
- if (!(p->tval & DONTFREE))
+ if (freeable(p))
xfree(p->sval);
p->sval = fr;
p->tval = FLD | STR | DONTFREE;
@@ -269,22 +295,22 @@ fldbld(void)
*fr++ = 0;
}
*fr = 0;
- } else if (*r != 0) { /* if 0, it's a null field */
+ } else if (*r != '\0') { /* if 0, it's a null field */
for (;;) {
i++;
p = getfld(i);
- if (!(p->tval & DONTFREE))
+ if (freeable(p))
xfree(p->sval);
p->sval = fr;
p->tval = FLD | STR | DONTFREE;
- /* \n always a separator */
+ /* \n is always a separator */
while (*r != sep && *r != '\n' && *r != '\0')
*fr++ = *r++;
- *fr++ = 0;
- if (*r++ == 0)
+ *fr++ = '\0';
+ if (*r++ == '\0')
break;
}
- *fr = 0;
+ *fr = '\0';
}
/* clean out junk from previous record */
cleanfld(i, maxfld);
@@ -293,7 +319,7 @@ fldbld(void)
for (i = 1; i <= maxfld; i++) {
p = getfld(i);
if (is_number(p->sval)) {
- p->fval = atof((const char *)p->sval);
+ p->fval = atof(p->sval);
p->tval |= NUM;
}
}
@@ -310,16 +336,15 @@ fldbld(void)
static void
cleanfld(int n1, int n2) /* clean out fields n1..n2 inclusive */
{
- static uchar *nullstat = (uchar *) "";
Cell *p;
- int i;
+ int i;
for (i = n2; i > n1; i--) {
p = getfld(i);
- if (!(p->tval & DONTFREE))
+ if (freeable(p))
xfree(p->sval);
+ p->sval = "";
p->tval = FLD | STR | DONTFREE;
- p->sval = nullstat;
}
}
@@ -327,11 +352,11 @@ void
newfld(int n) /* add field n (after end) */
{
if (n < 0)
- ERROR "accessing invalid field", record FATAL;
+ FATAL("accessing invalid field", record);
(void) getfld(n);
cleanfld(maxfld, n);
maxfld = n;
- (void) setfval(nfloc, (Awkfloat) n);
+ (void) setfval(nfloc, (Awkfloat)n);
}
/*
@@ -346,14 +371,14 @@ morefld(void)
Cell *newfld;
if ((fldcp = calloc(sizeof (struct fldtab_chunk), 1)) == NULL)
- ERROR "out of space in morefld" FATAL;
+ FATAL("out of space in morefld");
newfld = &fldcp->fields[0];
for (i = 0; i < FLD_INCR; i++) {
newfld[i].ctype = OCELL;
newfld[i].csub = CFLD;
newfld[i].nval = NULL;
- newfld[i].sval = (uchar *)"";
+ newfld[i].sval = "";
newfld[i].fval = 0.0;
newfld[i].tval = FLD|STR|DONTFREE;
newfld[i].cnext = NULL;
@@ -378,7 +403,7 @@ getfld(int idx)
int cbase;
if (idx < 0)
- ERROR "trying to access field %d", idx FATAL;
+ FATAL("trying to access field %d", idx);
while (idx >= fldtab_maxidx)
morefld();
cbase = 0;
@@ -388,8 +413,7 @@ getfld(int idx)
cbase += FLD_INCR;
}
/* should never happen */
- ERROR "trying to access invalid field %d", idx FATAL;
- return (NULL);
+ FATAL("trying to access invalid field %d", idx);
}
int
@@ -407,28 +431,28 @@ fldidx(Cell *vp)
cbase += FLD_INCR;
}
/* should never happen */
- ERROR "trying to access unknown field" FATAL;
- return (0);
+ FATAL("trying to access unknown field");
}
+/* build fields from reg expr in FS */
static int
-refldbld(uchar *rec, uchar *fs) /* build fields from reg expr in FS */
+refldbld(const char *rec, const char *fs)
{
- uchar *fr;
+ char *fr;
int i, tempstat;
fa *pfa;
Cell *p;
size_t len;
/* make sure fields is allocated */
- adjust_buf(&fields, fields_size);
+ adjust_buf(&fields, fieldssize);
fr = fields;
*fr = '\0';
if (*rec == '\0')
return (0);
- len = strlen((char *)rec) + 1;
- expand_buf(&fields, &fields_size, len);
+ len = strlen(rec) + 1;
+ expand_buf(&fields, &fieldssize, len);
fr = fields;
pfa = makedfa(fs, 1);
@@ -436,21 +460,21 @@ refldbld(uchar *rec, uchar *fs) /* build fields from reg expr in FS */
tempstat = pfa->initstat;
for (i = 1; ; i++) {
p = getfld(i);
- if (!(p->tval & DONTFREE))
+ if (freeable(p))
xfree(p->sval);
p->tval = FLD | STR | DONTFREE;
p->sval = fr;
dprintf(("refldbld: i=%d\n", i));
if (nematch(pfa, rec)) {
- pfa->initstat = 2;
+ pfa->initstat = 2; /* horrible coupling to b.c */
dprintf(("match %s (%d chars)\n", patbeg, patlen));
- (void) strncpy((char *)fr, (char *)rec, patbeg-rec);
+ (void) strncpy(fr, rec, patbeg-rec);
fr += patbeg - rec + 1;
*(fr-1) = '\0';
rec = patbeg + patlen;
} else {
dprintf(("no match %s\n", rec));
- (void) strcpy((char *)fr, (char *)rec);
+ (void) strcpy(fr, rec);
pfa->initstat = tempstat;
break;
}
@@ -459,20 +483,20 @@ refldbld(uchar *rec, uchar *fs) /* build fields from reg expr in FS */
}
void
-recbld(void)
+recbld(void) /* create $0 from $1..$NF if necessary */
{
int i;
- uchar *p;
+ char *p;
size_t cnt, len, olen;
if (donerec == 1)
return;
cnt = 0;
- olen = strlen((char *)*OFS);
+ olen = strlen(*OFS);
for (i = 1; i <= *NF; i++) {
p = getsval(getfld(i));
- len = strlen((char *)p);
- expand_buf(&record, &record_size, cnt + len + olen);
+ len = strlen(p);
+ expand_buf(&record, &recsize, cnt + len + olen);
(void) memcpy(&record[cnt], p, len);
cnt += len;
if (i < *NF) {
@@ -482,7 +506,7 @@ recbld(void)
}
record[cnt] = '\0';
dprintf(("in recbld FS=%o, recloc=%p\n", **FS, (void *)recloc));
- if (!(recloc->tval & DONTFREE))
+ if (freeable(recloc))
xfree(recloc->sval);
recloc->tval = REC | STR | DONTFREE;
recloc->sval = record;
@@ -495,35 +519,45 @@ Cell *
fieldadr(int n)
{
if (n < 0)
- ERROR "trying to access field %d", n FATAL;
+ FATAL("trying to access field %d", n);
return (getfld(n));
}
int errorflag = 0;
-char errbuf[200];
void
-yyerror(char *s)
+yyerror(const char *s)
+{
+ SYNTAX("%s", s);
+}
+
+void
+SYNTAX(const char *fmt, ...)
{
- extern uchar *cmdname, *curfname;
+ extern char *cmdname, *curfname;
static int been_here = 0;
+ va_list varg;
if (been_here++ > 2)
return;
- (void) fprintf(stderr, "%s: %s", cmdname, s);
- (void) fprintf(stderr, gettext(" at source line %lld"), lineno);
+ (void) fprintf(stderr, "%s: ", cmdname);
+ va_start(varg, fmt);
+ (void) vfprintf(stderr, fmt, varg);
+ va_end(varg);
+ (void) fprintf(stderr, " at source line %lld", lineno);
if (curfname != NULL)
- (void) fprintf(stderr, gettext(" in function %s"), curfname);
+ (void) fprintf(stderr, " in function %s", curfname);
+ if (compile_time == 1 && cursource() != NULL)
+ (void) fprintf(stderr, " source file %s", cursource());
(void) fprintf(stderr, "\n");
errorflag = 2;
eprint();
}
-/*ARGSUSED*/
void
-fpecatch(int sig)
+fpecatch(int n)
{
- ERROR "floating point exception" FATAL;
+ FATAL("floating point exception %d", n);
}
extern int bracecnt, brackcnt, parencnt;
@@ -558,47 +592,74 @@ bcheck2(int n, int c1, int c2)
}
void
-error(int f, char *s)
+FATAL(const char *fmt, ...)
{
- extern Node *curnode;
- extern uchar *cmdname;
+ extern char *cmdname;
+ va_list varg;
(void) fflush(stdout);
(void) fprintf(stderr, "%s: ", cmdname);
- (void) fprintf(stderr, "%s", s);
+ va_start(varg, fmt);
+ (void) vfprintf(stderr, fmt, varg);
+ va_end(varg);
+ error();
+ if (dbg > 1) /* core dump if serious debugging on */
+ abort();
+ exit(2);
+}
+
+void
+WARNING(const char *fmt, ...)
+{
+ extern char *cmdname;
+ va_list varg;
+
+ (void) fflush(stdout);
+ (void) fprintf(stderr, "%s: ", cmdname);
+ va_start(varg, fmt);
+ (void) vfprintf(stderr, fmt, varg);
+ va_end(varg);
+ error();
+}
+
+void
+error(void)
+{
+ extern Node *curnode;
+
(void) fprintf(stderr, "\n");
if (compile_time != 2 && NR && *NR > 0) {
(void) fprintf(stderr,
gettext(" input record number %g"), *FNR);
- if (strcmp((char *)*FILENAME, "-") != 0)
+ if (strcmp(*FILENAME, "-") != 0)
(void) fprintf(stderr, gettext(", file %s"), *FILENAME);
(void) fprintf(stderr, "\n");
}
if (compile_time != 2 && curnode)
- (void) fprintf(stderr, gettext(" source line number %lld\n"),
+ (void) fprintf(stderr, gettext(" source line number %lld"),
curnode->lineno);
else if (compile_time != 2 && lineno) {
(void) fprintf(stderr,
- gettext(" source line number %lld\n"), lineno);
+ gettext(" source line number %lld"), lineno);
}
+ if (compile_time == 1 && cursource() != NULL)
+ (void) fprintf(stderr, gettext(" source file %s"), cursource());
+ (void) fprintf(stderr, "\n");
eprint();
- if (f) {
- if (dbg)
- abort();
- exit(2);
- }
}
static void
eprint(void) /* try to print context around error */
{
- uchar *p, *q;
+ char *p, *q;
int c;
static int been_here = 0;
- extern uchar ebuf[300], *ep;
+ extern char ebuf[], *ep;
if (compile_time == 2 || compile_time == 0 || been_here++ > 0)
return;
+ if (ebuf == ep)
+ return;
p = ep - 1;
if (p > ebuf && *p == '\n')
p--;
@@ -640,30 +701,22 @@ bclass(int c)
}
double
-errcheck(double x, char *s)
+errcheck(double x, const char *s)
{
- extern int errno;
-
if (errno == EDOM) {
errno = 0;
- ERROR "%s argument out of domain", s WARNING;
+ WARNING("%s argument out of domain", s);
x = 1;
} else if (errno == ERANGE) {
errno = 0;
- ERROR "%s result out of range", s WARNING;
+ WARNING("%s result out of range", s);
x = 1;
}
return (x);
}
-void
-PUTS(uchar *s)
-{
- dprintf(("%s\n", s));
-}
-
int
-isclvar(uchar *s) /* is s of form var=something? */
+isclvar(const char *s) /* is s of form var=something ? */
{
if (s != NULL) {
@@ -689,11 +742,11 @@ isclvar(uchar *s) /* is s of form var=something? */
#define MAXEXPON 38 /* maximum exponent for fp number */
int
-is_number(uchar *s)
+is_number(const char *s)
{
int d1, d2;
int point;
- uchar *es;
+ const char *es;
extern char radixpoint;
d1 = d2 = point = 0;
@@ -751,12 +804,12 @@ is_number(uchar *s)
}
void
-init_buf(uchar **optr, size_t *sizep, size_t amt)
+init_buf(char **optr, size_t *sizep, size_t amt)
{
- uchar *nptr = NULL;
+ char *nptr = NULL;
if ((nptr = malloc(amt)) == NULL)
- ERROR "out of space in init_buf" FATAL;
+ FATAL("out of space in init_buf");
/* initial buffer should have NULL terminated */
*nptr = '\0';
if (sizep != NULL)
@@ -765,9 +818,9 @@ init_buf(uchar **optr, size_t *sizep, size_t amt)
}
void
-r_expand_buf(uchar **optr, size_t *sizep, size_t req)
+r_expand_buf(char **optr, size_t *sizep, size_t req)
{
- uchar *nptr;
+ char *nptr;
size_t amt, size = *sizep;
if (size != 0 && req < (size - 1))
@@ -776,7 +829,7 @@ r_expand_buf(uchar **optr, size_t *sizep, size_t req)
amt = (amt / LINE_INCR + 1) * LINE_INCR;
if ((nptr = realloc(*optr, size + amt)) == NULL)
- ERROR "out of space in expand_buf" FATAL;
+ FATAL("out of space in expand_buf");
/* initial buffer should have NULL terminated */
if (size == 0)
*nptr = '\0';
@@ -785,11 +838,11 @@ r_expand_buf(uchar **optr, size_t *sizep, size_t req)
}
void
-adjust_buf(uchar **optr, size_t size)
+adjust_buf(char **optr, size_t size)
{
- uchar *nptr;
+ char *nptr;
if ((nptr = realloc(*optr, size)) == NULL)
- ERROR "out of space in adjust_buf" FATAL;
+ FATAL("out of space in adjust_buf");
*optr = nptr;
}
diff --git a/usr/src/cmd/awk/main.c b/usr/src/cmd/awk/main.c
index b0c9d5ae98..b07f2c5b0a 100644
--- a/usr/src/cmd/awk/main.c
+++ b/usr/src/cmd/awk/main.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -42,20 +66,20 @@
char *version = "version Oct 11, 1989";
int dbg = 0;
-uchar *cmdname; /* gets argv[0] for error messages */
-uchar *lexprog; /* points to program argument if it exists */
+char *cmdname; /* gets argv[0] for error messages */
+char *lexprog; /* points to program argument if it exists */
int compile_time = 2; /* for error printing: */
/* 2 = cmdline, 1 = compile, 0 = running */
char radixpoint = '.';
-static uchar **pfile = NULL; /* program filenames from -f's */
+static char **pfile = NULL; /* program filenames from -f's */
static int npfile = 0; /* number of filenames */
static int curpfile = 0; /* current filename */
int
main(int argc, char *argv[], char *envp[])
{
- uchar *fs = NULL;
+ const char *fs = NULL;
char *nl_radix;
/*
* At this point, numbers are still scanned as in
@@ -68,7 +92,7 @@ main(int argc, char *argv[], char *envp[])
#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
#endif
(void) textdomain(TEXT_DOMAIN);
- cmdname = (uchar *)argv[0];
+ cmdname = argv[0];
if (argc == 1) {
(void) fprintf(stderr, gettext(
"Usage: %s [-f programfile | 'program'] [-Ffieldsep] "
@@ -90,37 +114,37 @@ main(int argc, char *argv[], char *envp[])
argc--;
argv++;
if (argc <= 1)
- ERROR "no program filename" FATAL;
- pfile = realloc(pfile, sizeof (uchar *) * (npfile + 1));
+ FATAL("no program filename");
+ pfile = realloc(pfile, sizeof (char *) * (npfile + 1));
if (pfile == NULL)
- ERROR "out of space in main" FATAL;
- pfile[npfile++] = (uchar *)argv[1];
+ FATAL("out of space in main");
+ pfile[npfile++] = argv[1];
break;
case 'F': /* set field separator */
if (argv[1][2] != 0) { /* arg is -Fsomething */
/* wart: t=>\t */
if (argv[1][2] == 't' && argv[1][3] == 0)
- fs = (uchar *) "\t";
+ fs = "\t";
else if (argv[1][2] != 0)
- fs = (uchar *)&argv[1][2];
+ fs = &argv[1][2];
} else { /* arg is -F something */
argc--; argv++;
if (argc > 1) {
/* wart: t=>\t */
if (argv[1][0] == 't' &&
argv[1][1] == 0)
- fs = (uchar *) "\t";
+ fs = "\t";
else if (argv[1][0] != 0)
- fs = (uchar *)&argv[1][0];
+ fs = &argv[1][0];
}
}
if (fs == NULL || *fs == '\0')
- ERROR "field separator FS is empty" WARNING;
+ WARNING("field separator FS is empty");
break;
case 'v': /* -v a=1 to be done NOW. one -v for each */
if (argv[1][2] == '\0' && --argc > 1 &&
- isclvar((uchar *)(++argv)[1]))
- setclvar((uchar *)argv[1]);
+ isclvar((++argv)[1]))
+ setclvar(argv[1]);
break;
case 'd':
dbg = atoi(&argv[1][2]);
@@ -129,7 +153,7 @@ main(int argc, char *argv[], char *envp[])
(void) printf("awk %s\n", version);
break;
default:
- ERROR "unknown option %s ignored", argv[1] WARNING;
+ WARNING("unknown option %s ignored", argv[1]);
break;
}
argc--;
@@ -140,18 +164,18 @@ main(int argc, char *argv[], char *envp[])
if (argc <= 1) {
if (dbg)
exit(0);
- ERROR "no program given" FATAL;
+ FATAL("no program given");
}
dprintf(("program = |%s|\n", argv[1]));
- lexprog = (uchar *)argv[1];
+ lexprog = argv[1];
argc--;
argv++;
}
compile_time = 1;
- argv[0] = (char *)cmdname; /* put prog name at front of arglist */
+ argv[0] = cmdname; /* put prog name at front of arglist */
dprintf(("argc=%d, argv[0]=%s\n", argc, argv[0]));
- arginit(argc, (uchar **)argv);
- envinit((uchar **)envp);
+ arginit(argc, argv);
+ envinit(envp);
(void) yyparse();
if (fs)
*FS = qstring(fs, '\0');
@@ -173,7 +197,7 @@ main(int argc, char *argv[], char *envp[])
}
int
-pgetc(void) /* get program character */
+pgetc(void) /* get 1 character from awk program */
{
int c;
@@ -181,12 +205,12 @@ pgetc(void) /* get program character */
if (yyin == NULL) {
if (curpfile >= npfile)
return (EOF);
- yyin = (strcmp((char *)pfile[curpfile], "-") == 0) ?
- stdin : fopen((char *)pfile[curpfile], "r");
+ yyin = (strcmp(pfile[curpfile], "-") == 0) ?
+ stdin : fopen(pfile[curpfile], "r");
if (yyin == NULL) {
- ERROR "can't open file %s",
- pfile[curpfile] FATAL;
+ FATAL("can't open file %s", pfile[curpfile]);
}
+ lineno = 1;
}
if ((c = getc(yyin)) != EOF)
return (c);
@@ -195,3 +219,12 @@ pgetc(void) /* get program character */
curpfile++;
}
}
+
+char *
+cursource(void) /* current source file name */
+{
+ if (curpfile < npfile)
+ return (pfile[curpfile]);
+ else
+ return (NULL);
+}
diff --git a/usr/src/cmd/awk/maketab.c b/usr/src/cmd/awk/maketab.c
index 5c7d8601ea..ff398f3593 100644
--- a/usr/src/cmd/awk/maketab.c
+++ b/usr/src/cmd/awk/maketab.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -26,6 +50,12 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
+/*
+ * this program makes the table to link function names
+ * and type indices that is used by execute() in run.c.
+ * it finds the indices in ytab.h, produced by yacc.
+ */
+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -35,8 +65,8 @@
struct xx {
int token;
- char *name;
- char *pname;
+ const char *name;
+ const char *pname;
} proc[] = {
{ PROGRAM, "program", NULL },
{ BOR, "boolop", " || " },
@@ -54,7 +84,7 @@ struct xx {
{ SUB, "sub", "sub" },
{ GSUB, "gsub", "gsub" },
{ INDEX, "sindex", "sindex" },
- { SPRINTF, "a_sprintf", "sprintf " },
+ { SPRINTF, "awksprintf", "sprintf " },
{ ADD, "arith", " + " },
{ MINUS, "arith", " - " },
{ MULT, "arith", " * " },
@@ -73,10 +103,10 @@ struct xx {
{ NOTMATCH, "matchop", " !~ " },
{ MATCHFCN, "matchop", "matchop" },
{ INTEST, "intest", "intest" },
- { PRINTF, "aprintf", "printf" },
- { PRINT, "print", "print" },
+ { PRINTF, "awkprintf", "printf" },
+ { PRINT, "printstat", "print" },
{ CLOSE, "closefile", "closefile" },
- { DELETE, "delete", "delete" },
+ { DELETE, "awkdelete", "awkdelete" },
{ SPLIT, "split", "split" },
{ ASSIGN, "assign", " = " },
{ ADDEQ, "assign", " += " },
@@ -100,23 +130,24 @@ struct xx {
{ CALL, "call", "call" },
{ ARG, "arg", "arg" },
{ VARNF, "getnf", "NF" },
- { GETLINE, "getaline", "getline" },
+ { GETLINE, "awkgetline", "getline" },
{ 0, "", "" },
};
-#define SIZE LASTTOKEN - FIRSTTOKEN + 1
-char *table[SIZE];
+#define SIZE (LASTTOKEN - FIRSTTOKEN + 1)
+const char *table[SIZE];
char *names[SIZE];
int
-main()
+main(int argc, char *argv[])
{
- struct xx *p;
+ const struct xx *p;
int i, n, tok;
char c;
FILE *fp;
- char buf[100], name[100], def[100];
+ char buf[200], name[200], def[200];
+ printf("#include <stdio.h>\n");
printf("#include \"awk.h\"\n");
printf("#include \"y.tab.h\"\n\n");
@@ -124,28 +155,29 @@ main()
fprintf(stderr, gettext("maketab can't open y.tab.h!\n"));
exit(1);
}
- printf("static uchar *printname[%d] = {\n", SIZE);
+ printf("static char *printname[%d] = {\n", SIZE);
i = 0;
while (fgets(buf, sizeof (buf), fp) != NULL) {
n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok);
- /* not a valid #define? */
- if (c != '#' || n != 4 && strcmp(def, "define") != 0)
+ if (c != '#' || (n != 4 && strcmp(def, "define") != 0)) {
+ /* not a valid #define */
continue;
+ }
if (tok < FIRSTTOKEN || tok > LASTTOKEN) {
fprintf(stderr, gettext("maketab funny token %d %s\n"),
tok, buf);
exit(1);
}
- names[tok-FIRSTTOKEN] = malloc(strlen(name)+1);
+ names[tok-FIRSTTOKEN] = (char *)malloc(strlen(name)+1);
strcpy(names[tok-FIRSTTOKEN], name);
- printf("\t(uchar *) \"%s\",\t/* %d */\n", name, tok);
+ printf("\t(char *) \"%s\",\t/* %d */\n", name, tok);
i++;
}
printf("};\n\n");
for (p = proc; p->token != 0; p++)
table[p->token-FIRSTTOKEN] = p->name;
- printf("\nCell *(*proctab[%d])() = {\n", SIZE);
+ printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE);
for (i = 0; i < SIZE; i++)
if (table[i] == 0)
printf("\tnullproc,\t/* %s */\n", names[i]);
@@ -153,14 +185,14 @@ main()
printf("\t%s,\t/* %s */\n", table[i], names[i]);
printf("};\n\n");
- printf("uchar *\ntokname(int n)\n"); /* print a tokname() function */
+ printf("char *\ntokname(int n)\n"); /* print a tokname() function */
printf("{\n");
printf(" static char buf[100];\n\n");
printf(" if (n < FIRSTTOKEN || n > LASTTOKEN) {\n");
printf(" (void) sprintf(buf, \"token %%d\", n);\n");
- printf(" return ((uchar *)buf);\n");
+ printf(" return (buf);\n");
printf(" }\n");
- printf(" return printname[n-257];\n");
+ printf(" return printname[n-FIRSTTOKEN];\n");
printf("}\n");
- exit(0);
+ return (0);
}
diff --git a/usr/src/cmd/awk/parse.c b/usr/src/cmd/awk/parse.c
index 909977f10f..c91550f310 100644
--- a/usr/src/cmd/awk/parse.c
+++ b/usr/src/cmd/awk/parse.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -28,8 +52,6 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#define DEBUG
#include "awk.h"
#include "y.tab.h"
@@ -37,11 +59,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 +79,7 @@ exptostat(Node *a)
Node *
node1(int a, Node *b)
{
- register Node *x;
+ Node *x;
x = nodealloc(1);
x->nobj = a;
@@ -68,7 +90,7 @@ node1(int a, Node *b)
Node *
node2(int a, Node *b, Node *c)
{
- register Node *x;
+ Node *x;
x = nodealloc(2);
x->nobj = a;
@@ -80,7 +102,7 @@ node2(int a, Node *b, Node *c)
Node *
node3(int a, Node *b, Node *c, Node *d)
{
- register Node *x;
+ Node *x;
x = nodealloc(3);
x->nobj = a;
@@ -93,7 +115,8 @@ node3(int a, Node *b, Node *c, Node *d)
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 +127,89 @@ node4(int a, Node *b, Node *c, Node *d, Node *e)
}
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)
+celltonode(Cell *a, int b)
{
- register Node *x;
+ Node *x;
a->ctype = OCELL;
a->csub = b;
@@ -196,10 +219,9 @@ valtonode(Cell *a, int b)
}
Node *
-rectonode(void)
+rectonode(void) /* make $0 into a Node */
{
- /* return valtonode(lookup("$0", symtab), CFLD); */
- return (valtonode(recloc, CFLD));
+ return (celltonode(recloc, CFLD));
}
Node *
@@ -209,23 +231,26 @@ makearr(Node *p)
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->sval = (char *)makesymtab(NSYMTAB);
cp->tval = ARR;
}
}
return (p);
}
+int paircnt; /* number of them in use */
+int *pairstack; /* 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);
+ x = node4(PASTAT2, a, b, c, itonp(paircnt));
paircnt++;
x->ntype = NSTAT;
return (x);
@@ -234,7 +259,7 @@ pa2stat(Node *a, Node *b, Node *c)
Node *
linkum(Node *a, Node *b)
{
- register Node *c;
+ Node *c;
if (errorflag) /* don't link things that are wrong */
return (a);
@@ -248,38 +273,51 @@ linkum(Node *a, Node *b)
return (a);
}
+/* turn on FCN bit in definition, */
+/* body of function, arglist */
void
-defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition */
+defn(Cell *v, Node *vl, Node *st)
{
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;
}
+
v->tval = FCN;
- v->sval = (uchar *)st;
+ v->sval = (char *)st;
n = 0; /* count arguments */
- for (p = vl; p; p = p->nnext)
+ for (p = vl; p != NULL; p = p->nnext)
n++;
v->fval = n;
dprintf(("defining func %s (%d args)\n", v->nval, n));
}
+/* is s in argument list for current function? */
+/* return -1 if not, otherwise arg # */
int
-isarg(uchar *s) /* is s in argument list for current function? */
+isarg(const char *s)
{
extern Node *arglist;
Node *p = arglist;
int n;
- for (n = 0; p != 0; p = p->nnext, n++) {
- if (strcmp((char *)((Cell *)(p->narg[0]))->nval,
- (char *)s) == 0) {
+ for (n = 0; p != NULL; p = p->nnext, n++)
+ if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
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);
+}
diff --git a/usr/src/cmd/awk/run.c b/usr/src/cmd/awk/run.c
index 3cc8341d84..29529bdb84 100644
--- a/usr/src/cmd/awk/run.c
+++ b/usr/src/cmd/awk/run.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -26,18 +50,16 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#define tempfree(x, s) if (istemp(x)) tfree(x, s)
-
-#define execute(p) r_execute(p)
-
#define DEBUG
-#include "awk.h"
-#include <math.h>
-#include "y.tab.h"
#include <stdio.h>
#include <ctype.h>
#include <setjmp.h>
+#include <math.h>
#include <time.h>
+#include "awk.h"
+#include "y.tab.h"
+
+#define tempfree(x) if (istemp(x)) tfree(x)
#ifndef FOPEN_MAX
#define FOPEN_MAX 15 /* max number of open files, from ANSI std. */
@@ -46,19 +68,18 @@
static jmp_buf env;
-static Cell *r_execute(Node *);
-static Cell *gettemp(char *), *copycell(Cell *);
-static FILE *openfile(int, uchar *), *redirect(int, Node *);
+static Cell *execute(Node *);
+static Cell *gettemp(void), *copycell(Cell *);
+static FILE *openfile(int, const char *), *redirect(int, Node *);
-int paircnt;
-Node *winner = NULL;
+Node *winner = NULL; /* root of parse tree */
-static Cell *tmps;
+static Cell *tmps; /* free temporary cells for execution */
static Cell truecell = { OBOOL, BTRUE, 0, 0, 1.0, NUM };
-Cell *true = &truecell;
+Cell *True = &truecell;
static Cell falsecell = { OBOOL, BFALSE, 0, 0, 0.0, NUM };
-Cell *false = &falsecell;
+Cell *False = &falsecell;
static Cell breakcell = { OJUMP, JBREAK, 0, 0, 0.0, NUM };
Cell *jbreak = &breakcell;
static Cell contcell = { OJUMP, JCONT, 0, 0, 0.0, NUM };
@@ -73,131 +94,173 @@ static Cell tempcell = { OCELL, CTEMP, 0, 0, 0.0, NUM };
Node *curnode = NULL; /* the node being executed, for debugging */
-static void tfree(Cell *, char *);
+static void tfree(Cell *);
static void closeall(void);
static double ipow(double, int);
+/*
+ * buffer memory management
+ *
+ * pbuf: address of pointer to buffer being managed
+ * psiz: address of buffer size variable
+ * minlen: minimum length of buffer needed
+ * quantum: buffer size quantum
+ * pbptr: address of movable pointer into buffer, or 0 if none
+ * whatrtn: name of the calling routine if failure should cause fatal error
+ *
+ * return 0 for realloc failure, !=0 for success
+ */
+int
+adjbuf(char **pbuf, size_t *psiz, size_t minlen, size_t quantum, char **pbptr,
+ const char *whatrtn)
+{
+ if (minlen > *psiz) {
+ char *tbuf;
+ int rminlen = quantum ? minlen % quantum : 0;
+ int boff = pbptr ? *pbptr - *pbuf : 0;
+ /* round up to next multiple of quantum */
+ if (rminlen)
+ minlen += quantum - rminlen;
+ tbuf = (char *)realloc(*pbuf, minlen);
+ dprintf(("adjbuf %s: %d %d (pbuf=%p, tbuf=%p)\n", whatrtn,
+ *psiz, minlen, (void *)*pbuf, (void *)tbuf));
+ if (tbuf == NULL) {
+ if (whatrtn)
+ FATAL("out of memory in %s", whatrtn);
+ return (0);
+ }
+ *pbuf = tbuf;
+ *psiz = minlen;
+ if (pbptr)
+ *pbptr = tbuf + boff;
+ }
+ return (1);
+}
+
void
-run(Node *a)
+run(Node *a) /* execution of parse tree starts here */
{
(void) execute(a);
closeall();
}
static Cell *
-r_execute(Node *u)
+execute(Node *u) /* execute a node of the parse tree */
{
- register Cell *(*proc)();
- register Cell *x;
- register Node *a;
+ Cell *(*proc)(Node **, int);
+ Cell *x;
+ Node *a;
if (u == NULL)
- return (true);
+ return (True);
for (a = u; ; a = a->nnext) {
curnode = a;
if (isvalue(a)) {
x = (Cell *) (a->narg[0]);
- if ((x->tval & FLD) && !donefld)
+ if (isfld(x) && !donefld)
fldbld();
- else if ((x->tval & REC) && !donerec)
+ else if (isrec(x) && !donerec)
recbld();
return (x);
}
/* probably a Cell* but too risky to print */
if (notlegal(a->nobj))
- ERROR "illegal statement" FATAL;
+ FATAL("illegal statement");
proc = proctab[a->nobj-FIRSTTOKEN];
x = (*proc)(a->narg, a->nobj);
- if ((x->tval & FLD) && !donefld)
+ if (isfld(x) && !donefld)
fldbld();
- else if ((x->tval & REC) && !donerec)
+ else if (isrec(x) && !donerec)
recbld();
if (isexpr(a))
return (x);
/* a statement, goto next statement */
if (isjump(x))
return (x);
- if (a->nnext == (Node *)NULL)
+ if (a->nnext == NULL)
return (x);
- tempfree(x, "execute");
+ tempfree(x);
}
}
+/* execute an awk program */
+/* a[0] = BEGIN, a[1] = body, a[2] = END */
/*ARGSUSED*/
Cell *
program(Node **a, int n)
{
- register Cell *x;
+ Cell *x;
if (setjmp(env) != 0)
goto ex;
if (a[0]) { /* BEGIN */
x = execute(a[0]);
if (isexit(x))
- return (true);
+ return (True);
if (isjump(x)) {
- ERROR "illegal break, continue or next from BEGIN"
- FATAL;
+ FATAL("illegal break, continue, or next from BEGIN");
}
- tempfree(x, "");
+ tempfree(x);
}
loop:
if (a[1] || a[2])
- while (getrec(&record, &record_size) > 0) {
+ while (getrec(&record, &recsize) > 0) {
x = execute(a[1]);
if (isexit(x))
break;
- tempfree(x, "");
+ tempfree(x);
}
ex:
- if (setjmp(env) != 0)
+ if (setjmp(env) != 0) /* handles exit within END */
goto ex1;
if (a[2]) { /* END */
x = execute(a[2]);
if (iscont(x)) /* read some more */
goto loop;
if (isbreak(x) || isnext(x))
- ERROR "illegal break or next from END" FATAL;
- tempfree(x, "");
+ FATAL("illegal break or next from END");
+ tempfree(x);
}
ex1:
- return (true);
+ return (True);
}
-struct Frame {
+struct Frame { /* stack frame for awk function calls */
int nargs; /* number of arguments in this call */
Cell *fcncell; /* pointer to Cell for function */
Cell **args; /* pointer to array of arguments after execute */
Cell *retval; /* return value */
};
-#define NARGS 30
+#define NARGS 30 /* max args in a call */
-struct Frame *frame = NULL; /* base of stack frames; dynamically allocated */
+struct Frame *frame = NULL; /* base of stack frames; dynamically alloc'd */
int nframe = 0; /* number of frames allocated */
struct Frame *fp = NULL; /* frame pointer. bottom level unused */
/*ARGSUSED*/
Cell *
-call(Node **a, int n)
+call(Node **a, int n) /* function call. very kludgy and fragile */
{
static Cell newcopycell =
- { OCELL, CCOPY, 0, (uchar *) "", 0.0, NUM|STR|DONTFREE };
- int i, ncall, ndef, freed = 0;
+ { OCELL, CCOPY, 0, "", 0.0, NUM|STR|DONTFREE };
+ int i, ncall, ndef;
+ /* handles potential double freeing when fcn & param share a tempcell */
+ int freed = 0;
Node *x;
- Cell *args[NARGS], *oargs[NARGS], *y, *z, *fcn;
- uchar *s;
+ Cell *args[NARGS], *oargs[NARGS]; /* BUG: fixed size arrays */
+ Cell *y, *z, *fcn;
+ char *s;
fcn = execute(a[0]); /* the function itself */
s = fcn->nval;
- if (!isfunc(fcn))
- ERROR "calling undefined function %s", s FATAL;
+ if (!isfcn(fcn))
+ FATAL("calling undefined function %s", s);
if (frame == NULL) {
fp = frame = (struct Frame *)calloc(nframe += 100,
sizeof (struct Frame));
if (frame == NULL) {
- ERROR "out of space for stack frames calling %s",
- s FATAL;
+ FATAL("out of space for stack frames calling %s", s);
}
}
for (ncall = 0, x = a[1]; x != NULL; x = x->nnext) /* args in call */
@@ -206,12 +269,12 @@ call(Node **a, int n)
dprintf(("calling %s, %d args (%d in defn), fp=%d\n",
s, ncall, ndef, fp-frame));
if (ncall > ndef) {
- ERROR "function %s called with %d args, uses only %d",
- s, ncall, ndef WARNING;
+ WARNING("function %s called with %d args, uses only %d",
+ s, ncall, ndef);
}
if (ncall + ndef > NARGS) {
- ERROR "function %s has %d arguments, limit %d",
- s, ncall+ndef, NARGS FATAL;
+ FATAL("function %s has %d arguments, limit %d",
+ s, ncall+ndef, NARGS);
}
for (i = 0, x = a[1]; x != NULL; i++, x = x->nnext) {
/* get call args */
@@ -219,20 +282,20 @@ call(Node **a, int n)
y = execute(x);
oargs[i] = y;
dprintf(("args[%d]: %s %f <%s>, t=%o\n",
- i, y->nval, y->fval,
- isarr(y) ? "(array)" : (char *)y->sval, y->tval));
- if (isfunc(y)) {
- ERROR "can't use function %s as argument in %s",
- y->nval, s FATAL;
+ i, NN(y->nval), y->fval,
+ isarr(y) ? "(array)" : NN(y->sval), y->tval));
+ if (isfcn(y)) {
+ FATAL("can't use function %s as argument in %s",
+ y->nval, s);
}
if (isarr(y))
args[i] = y; /* arrays by ref */
else
args[i] = copycell(y);
- tempfree(y, "callargs");
+ tempfree(y);
}
- for (; i < ndef; i++) { /* add null args for ones not provided */
- args[i] = gettemp("nullargs");
+ for (; i < ndef; i++) { /* add null args for ones not provided */
+ args[i] = gettemp();
*args[i] = newcopycell;
}
fp++; /* now ok to up frame */
@@ -241,13 +304,13 @@ call(Node **a, int n)
frame = (struct Frame *)
realloc(frame, (nframe += 100) * sizeof (struct Frame));
if (frame == NULL)
- ERROR "out of space for stack frames in %s", s FATAL;
+ FATAL("out of space for stack frames in %s", s);
fp = frame + dfp;
}
fp->fcncell = fcn;
fp->args = args;
fp->nargs = ndef; /* number defined with (excess are locals) */
- fp->retval = gettemp("retval");
+ fp->retval = gettemp();
dprintf(("start exec of %s, fp=%d\n", s, fp-frame));
/*LINTED align*/
@@ -265,20 +328,21 @@ call(Node **a, int n)
oargs[i]->tval = t->tval;
oargs[i]->tval &= ~(STR|NUM|DONTFREE);
oargs[i]->sval = t->sval;
- tempfree(t, "oargsarr");
+ tempfree(t);
}
}
} else {
t->csub = CTEMP;
- tempfree(t, "fp->args");
+ tempfree(t);
if (t == y) freed = 1;
}
}
- tempfree(fcn, "call.fcn");
+ tempfree(fcn);
if (isexit(y) || isnext(y))
return (y);
- if (!freed)
- tempfree(y, "fcn ret"); /* this can free twice! */
+ if (freed == 0) {
+ tempfree(y); /* don't free twice! */
+ }
z = fp->retval; /* return value */
dprintf(("%s returns %g |%s| %o\n",
s, getfval(z), getsval(z), z->tval));
@@ -291,7 +355,7 @@ copycell(Cell *x) /* make a copy of a cell in a temp */
{
Cell *y;
- y = gettemp("copycell");
+ y = gettemp();
y->csub = CCOPY; /* prevents freeing until call is over */
y->nval = x->nval;
y->sval = x->sval ? tostring(x->sval) : NULL;
@@ -303,30 +367,30 @@ copycell(Cell *x) /* make a copy of a cell in a temp */
/*ARGSUSED*/
Cell *
-arg(Node **a, int nnn)
+arg(Node **a, int nnn) /* nth argument of a function */
{
int n;
- n = (int)a[0]; /* argument number, counting from 0 */
+ n = ptoi(a[0]); /* argument number, counting from 0 */
dprintf(("arg(%d), fp->nargs=%d\n", n, fp->nargs));
if (n+1 > fp->nargs) {
- ERROR "argument #%d of function %s was not supplied",
- n+1, fp->fcncell->nval FATAL;
+ FATAL("argument #%d of function %s was not supplied",
+ n+1, fp->fcncell->nval);
}
return (fp->args[n]);
}
Cell *
-jump(Node **a, int n)
+jump(Node **a, int n) /* break, continue, next, nextfile, return */
{
- register Cell *y;
+ Cell *y;
switch (n) {
case EXIT:
if (a[0] != NULL) {
y = execute(a[0]);
errorflag = (int)getfval(y);
- tempfree(y, "");
+ tempfree(y);
}
longjmp(env, 1);
/*NOTREACHED*/
@@ -341,7 +405,9 @@ jump(Node **a, int n)
(void) setsval(fp->retval, getsval(y));
else if (y->tval & NUM)
(void) setfval(fp->retval, getfval(y));
- tempfree(y, "");
+ else /* can't happen */
+ FATAL("bad type variable %d", y->tval);
+ tempfree(y);
}
return (jret);
case NEXT:
@@ -351,29 +417,31 @@ jump(Node **a, int n)
case CONTINUE:
return (jcont);
default: /* can't happen */
- ERROR "illegal jump type %d", n FATAL;
+ FATAL("illegal jump type %d", n);
}
/*NOTREACHED*/
return (NULL);
}
Cell *
-getaline(Node **a, int n)
+awkgetline(Node **a, int n) /* get next line from specific input */
{
/* a[0] is variable, a[1] is operator, a[2] is filename */
- register Cell *r, *x;
- uchar *buf;
+ Cell *r, *x;
+ char *buf;
FILE *fp;
size_t len;
+ int mode;
(void) fflush(stdout); /* in case someone is waiting for a prompt */
- r = gettemp("");
+ r = gettemp();
if (a[1] != NULL) { /* getline < file */
x = execute(a[2]); /* filename */
- if ((int)a[1] == '|') /* input pipe */
- a[1] = (Node *)LE; /* arbitrary flag */
- fp = openfile((int)a[1], getsval(x));
- tempfree(x, "");
+ mode = ptoi(a[1]);
+ if (mode == '|') /* input pipe */
+ mode = LE; /* arbitrary flag */
+ fp = openfile(mode, getsval(x));
+ tempfree(x);
buf = NULL;
if (fp == NULL)
n = -1;
@@ -385,7 +453,7 @@ getaline(Node **a, int n)
} else { /* getline <file */
if (!(recloc->tval & DONTFREE))
xfree(recloc->sval);
- expand_buf(&record, &record_size, len);
+ expand_buf(&record, &recsize, len);
(void) memcpy(record, buf, len);
record[len] = '\0';
recloc->sval = record;
@@ -397,7 +465,7 @@ getaline(Node **a, int n)
free(buf);
} else { /* bare getline; use current input */
if (a[0] == NULL) /* getline */
- n = getrec(&record, &record_size);
+ n = getrec(&record, &recsize);
else { /* getline var */
init_buf(&buf, &len, LINE_INCR);
n = getrec(&buf, &len);
@@ -411,7 +479,7 @@ getaline(Node **a, int n)
/*ARGSUSED*/
Cell *
-getnf(Node **a, int n)
+getnf(Node **a, int n) /* get NF */
{
if (donefld == 0)
fldbld();
@@ -420,23 +488,23 @@ getnf(Node **a, int n)
/*ARGSUSED*/
Cell *
-array(Node **a, int n)
+array(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */
{
- register Cell *x, *y, *z;
- register uchar *s;
- register Node *np;
- uchar *buf;
+ Cell *x, *y, *z;
+ char *s;
+ Node *np;
+ char *buf;
size_t bsize, tlen, len, slen;
x = execute(a[0]); /* Cell* for symbol table */
init_buf(&buf, &bsize, LINE_INCR);
buf[0] = '\0';
tlen = 0;
- slen = strlen((char *)*SUBSEP);
- for (np = a[1]; np; np = np->nnext) {
+ slen = strlen(*SUBSEP);
+ for (np = a[1]; np != NULL; np = np->nnext) {
y = execute(np); /* subscript */
s = getsval(y);
- len = strlen((char *)s);
+ len = strlen(s);
expand_buf(&buf, &bsize, tlen + len + slen);
(void) memcpy(&buf[tlen], s, len);
tlen += len;
@@ -445,45 +513,45 @@ array(Node **a, int n)
tlen += slen;
}
buf[tlen] = '\0';
- tempfree(y, "");
+ tempfree(y);
}
if (!isarr(x)) {
- dprintf(("making %s into an array\n", x->nval));
+ dprintf(("making %s into an array\n", NN(x->nval)));
if (freeable(x))
xfree(x->sval);
x->tval &= ~(STR|NUM|DONTFREE);
x->tval |= ARR;
- x->sval = (uchar *) makesymtab(NSYMTAB);
+ x->sval = (char *)makesymtab(NSYMTAB);
}
/*LINTED align*/
- z = setsymtab(buf, (uchar *)"", 0.0, STR|NUM, (Array *)x->sval);
+ z = setsymtab(buf, "", 0.0, STR|NUM, (Array *)x->sval);
z->ctype = OCELL;
z->csub = CVAR;
- tempfree(x, "");
+ tempfree(x);
free(buf);
return (z);
}
/*ARGSUSED*/
Cell *
-delete(Node **a, int n)
+awkdelete(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */
{
Cell *x, *y;
Node *np;
- uchar *buf, *s;
+ char *buf, *s;
size_t bsize, tlen, slen, len;
x = execute(a[0]); /* Cell* for symbol table */
if (!isarr(x))
- return (true);
+ return (True);
init_buf(&buf, &bsize, LINE_INCR);
buf[0] = '\0';
tlen = 0;
- slen = strlen((char *)*SUBSEP);
- for (np = a[1]; np; np = np->nnext) {
+ slen = strlen(*SUBSEP);
+ for (np = a[1]; np != NULL; np = np->nnext) {
y = execute(np); /* subscript */
s = getsval(y);
- len = strlen((char *)s);
+ len = strlen(s);
expand_buf(&buf, &bsize, tlen + len + slen);
(void) memcpy(&buf[tlen], s, len);
tlen += len;
@@ -492,39 +560,39 @@ delete(Node **a, int n)
tlen += slen;
}
buf[tlen] = '\0';
- tempfree(y, "");
+ tempfree(y);
}
freeelem(x, buf);
- tempfree(x, "");
+ tempfree(x);
free(buf);
- return (true);
+ return (True);
}
/*ARGSUSED*/
Cell *
-intest(Node **a, int n)
+intest(Node **a, int n) /* a[0] is index (list), a[1] is symtab */
{
- register Cell *x, *ap, *k;
+ Cell *x, *ap, *k;
Node *p;
- uchar *buf;
- uchar *s;
+ char *buf;
+ char *s;
size_t bsize, tlen, slen, len;
ap = execute(a[1]); /* array name */
if (!isarr(ap))
- ERROR "%s is not an array", ap->nval FATAL;
+ FATAL("%s is not an array", ap->nval);
init_buf(&buf, &bsize, LINE_INCR);
- buf[0] = 0;
+ buf[0] = '\0';
tlen = 0;
- slen = strlen((char *)*SUBSEP);
- for (p = a[0]; p; p = p->nnext) {
+ slen = strlen(*SUBSEP);
+ for (p = a[0]; p != NULL; p = p->nnext) {
x = execute(p); /* expr */
s = getsval(x);
- len = strlen((char *)s);
+ len = strlen(s);
expand_buf(&buf, &bsize, tlen + len + slen);
(void) memcpy(&buf[tlen], s, len);
tlen += len;
- tempfree(x, "");
+ tempfree(x);
if (p->nnext) {
(void) memcpy(&buf[tlen], *SUBSEP, slen);
tlen += slen;
@@ -533,95 +601,95 @@ intest(Node **a, int n)
}
/*LINTED align*/
k = lookup(buf, (Array *)ap->sval);
- tempfree(ap, "");
+ tempfree(ap);
free(buf);
if (k == NULL)
- return (false);
+ return (False);
else
- return (true);
+ return (True);
}
Cell *
-matchop(Node **a, int n)
+matchop(Node **a, int n) /* ~ and match() */
{
- register Cell *x, *y;
- register uchar *s, *t;
- register int i;
+ Cell *x, *y;
+ char *s, *t;
+ int i;
fa *pfa;
- int (*mf)() = match, mode = 0;
+ int (*mf)(fa *, const char *) = match, mode = 0;
if (n == MATCHFCN) {
mf = pmatch;
mode = 1;
}
- x = execute(a[1]);
+ x = execute(a[1]); /* a[1] = target text */
s = getsval(x);
- if (a[0] == 0)
- i = (*mf)(a[2], s);
+ if (a[0] == NULL) /* a[1] == 0: already-compiled reg expr */
+ i = (*mf)((fa *)a[2], s);
else {
- y = execute(a[2]);
+ y = execute(a[2]); /* a[2] = regular expr */
t = getsval(y);
pfa = makedfa(t, mode);
i = (*mf)(pfa, s);
- tempfree(y, "");
+ tempfree(y);
}
- tempfree(x, "");
+ tempfree(x);
if (n == MATCHFCN) {
int start = patbeg - s + 1;
if (patlen < 0)
start = 0;
(void) setfval(rstartloc, (Awkfloat)start);
(void) setfval(rlengthloc, (Awkfloat)patlen);
- x = gettemp("");
+ x = gettemp();
x->tval = NUM;
x->fval = start;
return (x);
- } else if (n == MATCH && i == 1 || n == NOTMATCH && i == 0)
- return (true);
+ } else if ((n == MATCH && i == 1) || (n == NOTMATCH && i == 0))
+ return (True);
else
- return (false);
+ return (False);
}
Cell *
-boolop(Node **a, int n)
+boolop(Node **a, int n) /* a[0] || a[1], a[0] && a[1], !a[0] */
{
- register Cell *x, *y;
- register int i;
+ Cell *x, *y;
+ int i;
x = execute(a[0]);
i = istrue(x);
- tempfree(x, "");
+ tempfree(x);
switch (n) {
case BOR:
if (i)
- return (true);
+ return (True);
y = execute(a[1]);
i = istrue(y);
- tempfree(y, "");
- return (i ? true : false);
+ tempfree(y);
+ return (i ? True : False);
case AND:
if (!i)
- return (false);
+ return (False);
y = execute(a[1]);
i = istrue(y);
- tempfree(y, "");
- return (i ? true : false);
+ tempfree(y);
+ return (i ? True : False);
case NOT:
- return (i ? false : true);
+ return (i ? False : True);
default: /* can't happen */
- ERROR "unknown boolean operator %d", n FATAL;
+ FATAL("unknown boolean operator %d", n);
}
/*NOTREACHED*/
return (NULL);
}
Cell *
-relop(Node **a, int n)
+relop(Node **a, int n) /* a[0] < a[1], etc. */
{
- register int i;
- register Cell *x, *y;
+ int i;
+ Cell *x, *y;
Awkfloat j;
x = execute(a[0]);
@@ -630,102 +698,101 @@ relop(Node **a, int n)
j = x->fval - y->fval;
i = j < 0 ? -1: (j > 0 ? 1: 0);
} else {
- i = strcmp((char *)getsval(x), (char *)getsval(y));
+ i = strcmp(getsval(x), getsval(y));
}
- tempfree(x, "");
- tempfree(y, "");
+ tempfree(x);
+ tempfree(y);
switch (n) {
- case LT: return (i < 0 ? true : false);
- case LE: return (i <= 0 ? true : false);
- case NE: return (i != 0 ? true : false);
- case EQ: return (i == 0 ? true : false);
- case GE: return (i >= 0 ? true : false);
- case GT: return (i > 0 ? true : false);
+ case LT: return (i < 0 ? True : False);
+ case LE: return (i <= 0 ? True : False);
+ case NE: return (i != 0 ? True : False);
+ case EQ: return (i == 0 ? True : False);
+ case GE: return (i >= 0 ? True : False);
+ case GT: return (i > 0 ? True : False);
default: /* can't happen */
- ERROR "unknown relational operator %d", n FATAL;
+ FATAL("unknown relational operator %d", n);
}
/*NOTREACHED*/
- return (false);
+ return (False);
}
static void
-tfree(Cell *a, char *s)
+tfree(Cell *a) /* free a tempcell */
{
- if (dbg > 1) {
- (void) printf("## tfree %.8s %06lo %s\n",
- s, (ulong_t)a, a->sval ? a->sval : (uchar *)"");
- }
- if (freeable(a))
+ if (freeable(a)) {
+ dprintf(("freeing %s %s %o\n",
+ NN(a->nval), NN(a->sval), a->tval));
xfree(a->sval);
+ }
if (a == tmps)
- ERROR "tempcell list is curdled" FATAL;
+ FATAL("tempcell list is curdled");
a->cnext = tmps;
tmps = a;
}
static Cell *
-gettemp(char *s)
+gettemp(void) /* get a tempcell */
{
int i;
- register Cell *x;
+ Cell *x;
if (!tmps) {
tmps = (Cell *)calloc(100, sizeof (Cell));
if (!tmps)
- ERROR "no space for temporaries" FATAL;
+ FATAL("out of space for temporaries");
for (i = 1; i < 100; i++)
tmps[i-1].cnext = &tmps[i];
- tmps[i-1].cnext = 0;
+ tmps[i-1].cnext = NULL;
}
x = tmps;
tmps = x->cnext;
*x = tempcell;
- if (dbg > 1)
- (void) printf("## gtemp %.8s %06lo\n", s, (ulong_t)x);
+ dprintf(("gtemp %.8s %06lo\n", NN(x->nval), (ulong_t)x));
return (x);
}
/*ARGSUSED*/
Cell *
-indirect(Node **a, int n)
+indirect(Node **a, int n) /* $( a[0] ) */
{
- register Cell *x;
- register int m;
- register uchar *s;
+ Cell *x;
+ int m;
+ char *s;
x = execute(a[0]);
m = (int)getfval(x);
if (m == 0 && !is_number(s = getsval(x))) /* suspicion! */
- ERROR "illegal field $(%s)", s FATAL;
- tempfree(x, "");
+ FATAL("illegal field $(%s)", s);
+ tempfree(x);
x = fieldadr(m);
- x->ctype = OCELL;
+ x->ctype = OCELL; /* BUG? why are these needed? */
x->csub = CFLD;
return (x);
}
/*ARGSUSED*/
Cell *
-substr(Node **a, int nnn)
+substr(Node **a, int nnn) /* substr(a[0], a[1], a[2]) */
{
- register int k, m, n;
- register uchar *s;
+ int k, m, n;
+ char *s;
int temp;
- register Cell *x, *y, *z;
+ Cell *x, *y, *z = NULL;
x = execute(a[0]);
y = execute(a[1]);
- if (a[2] != 0)
+ if (a[2] != NULL)
z = execute(a[2]);
s = getsval(x);
- k = strlen((char *)s) + 1;
+ k = strlen(s) + 1;
if (k <= 1) {
- tempfree(x, "");
- tempfree(y, "");
- if (a[2] != 0)
- tempfree(z, "");
- x = gettemp("");
- (void) setsval(x, (uchar *)"");
+ tempfree(x);
+ tempfree(y);
+ if (a[2] != NULL) {
+ tempfree(z);
+ }
+ x = gettemp();
+ (void) setsval(x, "");
return (x);
}
m = (int)getfval(y);
@@ -733,10 +800,10 @@ substr(Node **a, int nnn)
m = 1;
else if (m > k)
m = k;
- tempfree(y, "");
- if (a[2] != 0) {
+ tempfree(y);
+ if (a[2] != NULL) {
n = (int)getfval(z);
- tempfree(z, "");
+ tempfree(z);
} else
n = k - 1;
if (n < 0)
@@ -744,21 +811,21 @@ substr(Node **a, int nnn)
else if (n > k - m)
n = k - m;
dprintf(("substr: m=%d, n=%d, s=%s\n", m, n, s));
- y = gettemp("");
+ y = gettemp();
temp = s[n + m - 1]; /* with thanks to John Linderman */
s[n + m - 1] = '\0';
(void) setsval(y, s + m - 1);
s[n + m - 1] = temp;
- tempfree(x, "");
+ tempfree(x);
return (y);
}
/*ARGSUSED*/
Cell *
-sindex(Node **a, int nnn)
+sindex(Node **a, int nnn) /* index(a[0], a[1]) */
{
- register Cell *x, *y, *z;
- register uchar *s1, *s2, *p1, *p2, *q;
+ Cell *x, *y, *z;
+ char *s1, *s2, *p1, *p2, *q;
Awkfloat v = 0.0;
x = execute(a[0]);
@@ -766,7 +833,7 @@ sindex(Node **a, int nnn)
y = execute(a[1]);
s2 = getsval(y);
- z = gettemp("");
+ z = gettemp();
for (p1 = s1; *p1 != '\0'; p1++) {
for (q = p1, p2 = s2; *p2 != '\0' && *q == *p2; q++, p2++)
;
@@ -775,20 +842,20 @@ sindex(Node **a, int nnn)
break;
}
}
- tempfree(x, "");
- tempfree(y, "");
+ tempfree(x);
+ tempfree(y);
(void) setfval(z, v);
return (z);
}
void
-format(uchar **bufp, uchar *s, Node *a)
+format(char **bufp, char *s, Node *a)
{
- uchar *fmt;
- register uchar *os;
- register Cell *x;
+ char *fmt;
+ const char *os;
+ Cell *x;
int flag = 0, len;
- uchar_t *buf;
+ char *buf;
size_t bufsize, fmtsize, cnt, tcnt, ret;
init_buf(&buf, &bufsize, LINE_INCR);
@@ -812,21 +879,22 @@ format(uchar **bufp, uchar *s, Node *a)
fmt[tcnt++] = *s;
if (*s == '\0')
break;
- if (isalpha(*s) && *s != 'l' && *s != 'h' && *s != 'L')
+ if (isalpha((uschar)*s) &&
+ *s != 'l' && *s != 'h' && *s != 'L')
break; /* the ansi panoply */
if (*s == '*') {
if (a == NULL) {
- ERROR
- "not enough args in printf(%s) or sprintf(%s)", os, os FATAL;
+ FATAL("not enough args in printf(%s) "
+ "or sprintf(%s)", os, os);
}
x = execute(a);
a = a->nnext;
tcnt--;
expand_buf(&fmt, &fmtsize, tcnt + 12);
- ret = sprintf((char *)&fmt[tcnt], "%d",
+ ret = sprintf(&fmt[tcnt], "%d",
(int)getfval(x));
tcnt += ret;
- tempfree(x, "");
+ tempfree(x);
}
}
fmt[tcnt] = '\0';
@@ -858,7 +926,7 @@ format(uchar **bufp, uchar *s, Node *a)
break;
}
if (flag == 0) {
- len = strlen((char *)fmt);
+ len = strlen(fmt);
expand_buf(&buf, &bufsize, cnt + len);
(void) memcpy(&buf[cnt], fmt, len);
cnt += len;
@@ -866,8 +934,8 @@ format(uchar **bufp, uchar *s, Node *a)
continue;
}
if (a == NULL) {
- ERROR
- "not enough args in printf(%s) or sprintf(%s)", os, os FATAL;
+ FATAL("not enough args in printf(%s) "
+ "or sprintf(%s)", os, os);
}
x = execute(a);
a = a->nnext;
@@ -878,33 +946,33 @@ format(uchar **bufp, uchar *s, Node *a)
switch (flag) {
case 1:
/*LINTED*/
- ret = snprintf((char *)&buf[cnt], len,
- (char *)fmt, getfval(x));
+ ret = snprintf(&buf[cnt], len,
+ fmt, getfval(x));
break;
case 2:
/*LINTED*/
- ret = snprintf((char *)&buf[cnt], len,
- (char *)fmt, (long)getfval(x));
+ ret = snprintf(&buf[cnt], len,
+ fmt, (long)getfval(x));
break;
case 3:
/*LINTED*/
- ret = snprintf((char *)&buf[cnt], len,
- (char *)fmt, (int)getfval(x));
+ ret = snprintf(&buf[cnt], len,
+ fmt, (int)getfval(x));
break;
case 4:
/*LINTED*/
- ret = snprintf((char *)&buf[cnt], len,
- (char *)fmt, getsval(x));
+ ret = snprintf(&buf[cnt], len,
+ fmt, getsval(x));
break;
case 5:
if (isnum(x)) {
/*LINTED*/
- ret = snprintf((char *)&buf[cnt], len,
- (char *)fmt, (int)getfval(x));
+ ret = snprintf(&buf[cnt], len,
+ fmt, (int)getfval(x));
} else {
/*LINTED*/
- ret = snprintf((char *)&buf[cnt], len,
- (char *)fmt, getsval(x)[0]);
+ ret = snprintf(&buf[cnt], len,
+ fmt, getsval(x)[0]);
}
break;
default:
@@ -914,12 +982,12 @@ format(uchar **bufp, uchar *s, Node *a)
break;
expand_buf(&buf, &bufsize, cnt + ret);
}
- tempfree(x, "");
+ tempfree(x);
cnt += ret;
s++;
}
buf[cnt] = '\0';
- for (; a; a = a->nnext) /* evaluate any remaining args */
+ for (; a != NULL; a = a->nnext) /* evaluate any remaining args */
(void) execute(a);
*bufp = tostring(buf);
free(buf);
@@ -928,17 +996,17 @@ format(uchar **bufp, uchar *s, Node *a)
/*ARGSUSED*/
Cell *
-a_sprintf(Node **a, int n)
+awksprintf(Node **a, int n) /* sprintf(a[0]) */
{
- register Cell *x;
- register Node *y;
- uchar *buf;
+ Cell *x;
+ Node *y;
+ char *buf;
y = a[0]->nnext;
x = execute(a[0]);
format(&buf, getsval(x), y);
- tempfree(x, "");
- x = gettemp("");
+ tempfree(x);
+ x = gettemp();
x->sval = buf;
x->tval = STR;
return (x);
@@ -946,44 +1014,46 @@ a_sprintf(Node **a, int n)
/*ARGSUSED*/
Cell *
-aprintf(Node **a, int n)
+awkprintf(Node **a, int n) /* printf */
{
+ /* a[0] is list of args, starting with format string */
+ /* a[1] is redirection operator, a[2] is redirection file */
FILE *fp;
- register Cell *x;
- register Node *y;
- uchar *buf;
+ Cell *x;
+ Node *y;
+ char *buf;
y = a[0]->nnext;
x = execute(a[0]);
format(&buf, getsval(x), y);
- tempfree(x, "");
- if (a[1] == NULL)
- (void) fputs((char *)buf, stdout);
- else {
- fp = redirect((int)a[1], a[2]);
- (void) fputs((char *)buf, fp);
+ tempfree(x);
+ if (a[1] == NULL) {
+ (void) fputs(buf, stdout);
+ } else {
+ fp = redirect(ptoi(a[1]), a[2]);
+ (void) fputs(buf, fp);
(void) fflush(fp);
}
free(buf);
- return (true);
+ return (True);
}
Cell *
-arith(Node **a, int n)
+arith(Node **a, int n) /* a[0] + a[1], etc. also -a[0] */
{
- Awkfloat i, j;
+ Awkfloat i, j = 0;
double v;
- register Cell *x, *y, *z;
+ Cell *x, *y, *z;
x = execute(a[0]);
i = getfval(x);
- tempfree(x, "");
+ tempfree(x);
if (n != UMINUS) {
y = execute(a[1]);
j = getfval(y);
- tempfree(y, "");
+ tempfree(y);
}
- z = gettemp("");
+ z = gettemp();
switch (n) {
case ADD:
i += j;
@@ -996,12 +1066,12 @@ arith(Node **a, int n)
break;
case DIVIDE:
if (j == 0)
- ERROR "division by zero" FATAL;
+ FATAL("division by zero");
i /= j;
break;
case MOD:
if (j == 0)
- ERROR "division by zero in mod" FATAL;
+ FATAL("division by zero in mod");
(void) modf(i/j, &v);
i = i - j * v;
break;
@@ -1015,14 +1085,14 @@ arith(Node **a, int n)
i = errcheck(pow(i, j), "pow");
break;
default: /* can't happen */
- ERROR "illegal arithmetic operator %d", n FATAL;
+ FATAL("illegal arithmetic operator %d", n);
}
(void) setfval(z, i);
return (z);
}
static double
-ipow(double x, int n)
+ipow(double x, int n) /* x**n. ought to be done by pow, but isn't always */
{
double v;
@@ -1036,10 +1106,10 @@ ipow(double x, int n)
}
Cell *
-incrdecr(Node **a, int n)
+incrdecr(Node **a, int n) /* a[0]++, etc. */
{
- register Cell *x, *z;
- register int k;
+ Cell *x, *z;
+ int k;
Awkfloat xf;
x = execute(a[0]);
@@ -1049,17 +1119,19 @@ incrdecr(Node **a, int n)
(void) setfval(x, xf + k);
return (x);
}
- z = gettemp("");
+ z = gettemp();
(void) setfval(z, xf);
(void) setfval(x, xf + k);
- tempfree(x, "");
+ tempfree(x);
return (z);
}
+/* a[0] = a[1], a[0] += a[1], etc. */
+/* this is subtle; don't muck with it. */
Cell *
assign(Node **a, int n)
{
- register Cell *x, *y;
+ Cell *x, *y;
Awkfloat xf, yf;
double v;
@@ -1070,13 +1142,13 @@ assign(Node **a, int n)
(void) setsval(x, getsval(y));
x->fval = getfval(y);
x->tval |= NUM;
- } else if (y->tval & STR)
+ } else if (isstr(y))
(void) setsval(x, getsval(y));
- else if (y->tval & NUM)
+ else if (isnum(y))
(void) setfval(x, getfval(y));
else
funnyvar(y, "read value of");
- tempfree(y, "");
+ tempfree(y);
return (x);
}
xf = getfval(x);
@@ -1093,12 +1165,12 @@ assign(Node **a, int n)
break;
case DIVEQ:
if (yf == 0)
- ERROR "division by zero in /=" FATAL;
+ FATAL("division by zero in /=");
xf /= yf;
break;
case MODEQ:
if (yf == 0)
- ERROR "division by zero in %%=" FATAL;
+ FATAL("division by zero in %%=");
(void) modf(xf/yf, &v);
xf = xf - yf * v;
break;
@@ -1109,55 +1181,55 @@ assign(Node **a, int n)
xf = errcheck(pow(xf, yf), "pow");
break;
default:
- ERROR "illegal assignment operator %d", n FATAL;
+ FATAL("illegal assignment operator %d", n);
break;
}
- tempfree(y, "");
+ tempfree(y);
(void) setfval(x, xf);
return (x);
}
/*ARGSUSED*/
Cell *
-cat(Node **a, int q)
+cat(Node **a, int q) /* a[0] cat a[1] */
{
- register Cell *x, *y, *z;
- register int n1, n2;
- register uchar *s;
+ Cell *x, *y, *z;
+ int n1, n2;
+ char *s;
x = execute(a[0]);
y = execute(a[1]);
(void) getsval(x);
(void) getsval(y);
- n1 = strlen((char *)x->sval);
- n2 = strlen((char *)y->sval);
- s = (uchar *)malloc(n1 + n2 + 1);
+ n1 = strlen(x->sval);
+ n2 = strlen(y->sval);
+ s = (char *)malloc(n1 + n2 + 1);
if (s == NULL) {
- ERROR "out of space concatenating %.15s and %.15s",
- x->sval, y->sval FATAL;
+ FATAL("out of space concatenating %.15s... and %.15s...",
+ x->sval, y->sval);
}
- (void) strcpy((char *)s, (char *)x->sval);
- (void) strcpy((char *)s + n1, (char *)y->sval);
- tempfree(y, "");
- z = gettemp("");
+ (void) strcpy(s, x->sval);
+ (void) strcpy(s + n1, y->sval);
+ tempfree(x);
+ tempfree(y);
+ z = gettemp();
z->sval = s;
z->tval = STR;
- tempfree(x, "");
return (z);
}
/*ARGSUSED*/
Cell *
-pastat(Node **a, int n)
+pastat(Node **a, int n) /* a[0] { a[1] } */
{
- register Cell *x;
+ Cell *x;
- if (a[0] == 0)
+ if (a[0] == NULL)
x = execute(a[1]);
else {
x = execute(a[0]);
if (istrue(x)) {
- tempfree(x, "");
+ tempfree(x);
x = execute(a[1]);
}
}
@@ -1166,73 +1238,72 @@ pastat(Node **a, int n)
/*ARGSUSED*/
Cell *
-dopa2(Node **a, int n)
+dopa2(Node **a, int n) /* a[0], a[1] { a[2] } */
{
Cell *x;
int pair;
- static int *pairstack = NULL;
if (!pairstack) {
/* first time */
dprintf(("paircnt: %d\n", paircnt));
- pairstack = (int *)malloc(sizeof (int) * paircnt);
- if (!pairstack)
- ERROR "out of space in dopa2" FATAL;
- (void) memset(pairstack, 0, sizeof (int) * paircnt);
+ pairstack = (int *)calloc(paircnt, sizeof (int));
+ if (pairstack == NULL)
+ FATAL("out of space in dopa2");
}
- pair = (int)a[3];
+ pair = ptoi(a[3]);
if (pairstack[pair] == 0) {
x = execute(a[0]);
if (istrue(x))
pairstack[pair] = 1;
- tempfree(x, "");
+ tempfree(x);
}
if (pairstack[pair] == 1) {
x = execute(a[1]);
if (istrue(x))
pairstack[pair] = 0;
- tempfree(x, "");
+ tempfree(x);
x = execute(a[2]);
return (x);
}
- return (false);
+ return (False);
}
/*ARGSUSED*/
Cell *
-split(Node **a, int nnn)
+split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
{
Cell *x, *y, *ap;
- register uchar *s;
- register int sep;
- uchar *t, temp, num[11], *fs;
- int n, tempstat;
+ char *s;
+ int sep;
+ char *t, temp, num[50], *fs = NULL;
+ int n, tempstat, arg3type;
y = execute(a[0]); /* source string */
s = getsval(y);
- if (a[2] == 0) /* fs string */
+ arg3type = ptoi(a[3]);
+ if (a[2] == NULL) /* fs string */
fs = *FS;
- else if ((int)a[3] == STRING) { /* split(str,arr,"string") */
+ else if (arg3type == STRING) { /* split(str,arr,"string") */
x = execute(a[2]);
fs = getsval(x);
- } else if ((int)a[3] == REGEXPR)
- fs = (uchar *)"(regexpr)"; /* split(str,arr,/regexpr/) */
+ } else if (arg3type == REGEXPR)
+ fs = "(regexpr)"; /* split(str,arr,/regexpr/) */
else
- ERROR "illegal type of split()" FATAL;
+ FATAL("illegal type of split");
sep = *fs;
ap = execute(a[1]); /* array name */
freesymtab(ap);
- dprintf(("split: s=|%s|, a=%s, sep=|%s|\n", s, ap->nval, fs));
+ dprintf(("split: s=|%s|, a=%s, sep=|%s|\n", s, NN(ap->nval), fs));
ap->tval &= ~STR;
ap->tval |= ARR;
- ap->sval = (uchar *)makesymtab(NSYMTAB);
+ ap->sval = (char *)makesymtab(NSYMTAB);
n = 0;
- if (*s != '\0' && strlen((char *)fs) > 1 || (int)a[3] == REGEXPR) {
+ if (*s != '\0' && (strlen(fs) > 1 || arg3type == REGEXPR)) {
/* reg expr */
fa *pfa;
- if ((int)a[3] == REGEXPR) { /* it's ready already */
+ if (arg3type == REGEXPR) { /* it's ready already */
pfa = (fa *)a[2];
} else {
pfa = makedfa(fs, 1);
@@ -1242,12 +1313,12 @@ split(Node **a, int nnn)
pfa->initstat = 2;
do {
n++;
- (void) sprintf((char *)num, "%d", n);
+ (void) sprintf(num, "%d", n);
temp = *patbeg;
*patbeg = '\0';
if (is_number(s)) {
(void) setsymtab(num, s,
- atof((char *)s),
+ atof(s),
/*LINTED align*/
STR|NUM, (Array *)ap->sval);
} else {
@@ -1259,8 +1330,8 @@ split(Node **a, int nnn)
s = patbeg + patlen;
if (*(patbeg+patlen-1) == 0 || *s == 0) {
n++;
- (void) sprintf((char *)num, "%d", n);
- (void) setsymtab(num, (uchar *)"", 0.0,
+ (void) sprintf(num, "%d", n);
+ (void) setsymtab(num, "", 0.0,
/*LINTED align*/
STR, (Array *)ap->sval);
pfa->initstat = tempstat;
@@ -1269,9 +1340,9 @@ split(Node **a, int nnn)
} while (nematch(pfa, s));
}
n++;
- (void) sprintf((char *)num, "%d", n);
+ (void) sprintf(num, "%d", n);
if (is_number(s)) {
- (void) setsymtab(num, s, atof((char *)s),
+ (void) setsymtab(num, s, atof(s),
/*LINTED align*/
STR|NUM, (Array *)ap->sval);
} else {
@@ -1284,7 +1355,7 @@ spdone:
for (n = 0; ; ) {
while (*s == ' ' || *s == '\t' || *s == '\n')
s++;
- if (*s == 0)
+ if (*s == '\0')
break;
n++;
t = s;
@@ -1295,9 +1366,9 @@ spdone:
;
temp = *s;
*s = '\0';
- (void) sprintf((char *)num, "%d", n);
+ (void) sprintf(num, "%d", n);
if (is_number(t)) {
- (void) setsymtab(num, t, atof((char *)t),
+ (void) setsymtab(num, t, atof(t),
/*LINTED align*/
STR|NUM, (Array *)ap->sval);
} else {
@@ -1306,10 +1377,10 @@ spdone:
STR, (Array *)ap->sval);
}
*s = temp;
- if (*s != 0)
+ if (*s != '\0')
s++;
}
- } else if (*s != 0) {
+ } else if (*s != '\0') {
for (;;) {
n++;
t = s;
@@ -1317,9 +1388,9 @@ spdone:
s++;
temp = *s;
*s = '\0';
- (void) sprintf((char *)num, "%d", n);
+ (void) sprintf(num, "%d", n);
if (is_number(t)) {
- (void) setsymtab(num, t, atof((char *)t),
+ (void) setsymtab(num, t, atof(t),
/*LINTED align*/
STR|NUM, (Array *)ap->sval);
} else {
@@ -1328,15 +1399,16 @@ spdone:
STR, (Array *)ap->sval);
}
*s = temp;
- if (*s++ == 0)
+ if (*s++ == '\0')
break;
}
}
- tempfree(ap, "");
- tempfree(y, "");
- if (a[2] != 0 && (int)a[3] == STRING)
- tempfree(x, "");
- x = gettemp("");
+ tempfree(ap);
+ tempfree(y);
+ if (a[2] != NULL && arg3type == STRING) {
+ tempfree(x);
+ }
+ x = gettemp();
x->tval = NUM;
x->fval = n;
return (x);
@@ -1344,16 +1416,16 @@ spdone:
/*ARGSUSED*/
Cell *
-condexpr(Node **a, int n)
+condexpr(Node **a, int n) /* a[0] ? a[1] : a[2] */
{
- register Cell *x;
+ Cell *x;
x = execute(a[0]);
if (istrue(x)) {
- tempfree(x, "");
+ tempfree(x);
x = execute(a[1]);
} else {
- tempfree(x, "");
+ tempfree(x);
x = execute(a[2]);
}
return (x);
@@ -1361,16 +1433,16 @@ condexpr(Node **a, int n)
/*ARGSUSED*/
Cell *
-ifstat(Node **a, int n)
+ifstat(Node **a, int n) /* if (a[0]) a[1]; else a[2] */
{
- register Cell *x;
+ Cell *x;
x = execute(a[0]);
if (istrue(x)) {
- tempfree(x, "");
+ tempfree(x);
x = execute(a[1]);
- } else if (a[2] != 0) {
- tempfree(x, "");
+ } else if (a[2] != NULL) {
+ tempfree(x);
x = execute(a[2]);
}
return (x);
@@ -1378,123 +1450,124 @@ ifstat(Node **a, int n)
/*ARGSUSED*/
Cell *
-whilestat(Node **a, int n)
+whilestat(Node **a, int n) /* while (a[0]) a[1] */
{
- register Cell *x;
+ Cell *x;
for (;;) {
x = execute(a[0]);
if (!istrue(x))
return (x);
- tempfree(x, "");
+ tempfree(x);
x = execute(a[1]);
if (isbreak(x)) {
- x = true;
+ x = True;
return (x);
}
if (isnext(x) || isexit(x) || isret(x))
return (x);
- tempfree(x, "");
+ tempfree(x);
}
}
/*ARGSUSED*/
Cell *
-dostat(Node **a, int n)
+dostat(Node **a, int n) /* do a[0]; while(a[1]) */
{
- register Cell *x;
+ Cell *x;
for (;;) {
x = execute(a[0]);
if (isbreak(x))
- return (true);
+ return (True);
if (isnext(x) || isexit(x) || isret(x))
return (x);
- tempfree(x, "");
+ tempfree(x);
x = execute(a[1]);
if (!istrue(x))
return (x);
- tempfree(x, "");
+ tempfree(x);
}
}
/*ARGSUSED*/
Cell *
-forstat(Node **a, int n)
+forstat(Node **a, int n) /* for (a[0]; a[1]; a[2]) a[3] */
{
- register Cell *x;
+ Cell *x;
x = execute(a[0]);
- tempfree(x, "");
+ tempfree(x);
for (;;) {
- if (a[1] != 0) {
+ if (a[1] != NULL) {
x = execute(a[1]);
if (!istrue(x))
return (x);
else
- tempfree(x, "");
+ tempfree(x);
}
x = execute(a[3]);
if (isbreak(x)) /* turn off break */
- return (true);
+ return (True);
if (isnext(x) || isexit(x) || isret(x))
return (x);
- tempfree(x, "");
+ tempfree(x);
x = execute(a[2]);
- tempfree(x, "");
+ tempfree(x);
}
}
/*ARGSUSED*/
Cell *
-instat(Node **a, int n)
+instat(Node **a, int n) /* for (a[0] in a[1]) a[2] */
{
- register Cell *x, *vp, *arrayp, *cp, *ncp;
+ Cell *x, *vp, *arrayp, *cp, *ncp;
Array *tp;
int i;
vp = execute(a[0]);
arrayp = execute(a[1]);
- if (!isarr(arrayp))
- ERROR "%s is not an array", arrayp->nval FATAL;
+ if (!isarr(arrayp)) {
+ FATAL("%s is not an array", arrayp->nval);
+ }
/*LINTED align*/
tp = (Array *)arrayp->sval;
- tempfree(arrayp, "");
+ tempfree(arrayp);
for (i = 0; i < tp->size; i++) { /* this routine knows too much */
for (cp = tp->tab[i]; cp != NULL; cp = ncp) {
(void) setsval(vp, cp->nval);
ncp = cp->cnext;
x = execute(a[2]);
if (isbreak(x)) {
- tempfree(vp, "");
- return (true);
+ tempfree(vp);
+ return (True);
}
if (isnext(x) || isexit(x) || isret(x)) {
- tempfree(vp, "");
+ tempfree(vp);
return (x);
}
- tempfree(x, "");
+ tempfree(x);
}
}
- return (true);
+ return (True);
}
/*ARGSUSED*/
Cell *
-bltin(Node **a, int n)
+bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg list */
{
- register Cell *x, *y;
+ Cell *x, *y;
Awkfloat u;
- register int t;
- uchar *p, *buf;
+ int t;
+ char *p, *buf;
Node *nextarg;
- t = (int)a[0];
+ t = ptoi(a[0]);
x = execute(a[1]);
nextarg = a[1]->nnext;
switch (t) {
case FLENGTH:
- u = (Awkfloat)strlen((char *)getsval(x)); break;
+ u = (Awkfloat)strlen(getsval(x)); break;
case FLOG:
u = errcheck(log(getfval(x)), "log"); break;
case FINT:
@@ -1508,14 +1581,13 @@ bltin(Node **a, int n)
case FCOS:
u = cos(getfval(x)); break;
case FATAN:
- if (nextarg == 0) {
- ERROR "atan2 requires two arguments; returning 1.0"
- WARNING;
+ if (nextarg == NULL) {
+ WARNING("atan2 requires two arguments; returning 1.0");
u = 1.0;
} else {
y = execute(a[1]->nnext);
u = atan2(getfval(x), getfval(y));
- tempfree(y, "");
+ tempfree(y);
nextarg = nextarg->nnext;
}
break;
@@ -1523,13 +1595,14 @@ bltin(Node **a, int n)
/* in case something is buffered already */
(void) fflush(stdout);
/* 256 is unix-dep */
- u = (Awkfloat)system((char *)getsval(x)) / 256;
+ u = (Awkfloat)system(getsval(x)) / 256;
break;
case FRAND:
- u = (Awkfloat)(rand() % 32767) / 32767.0;
+ /* in principle, rand() returns something in 0..RAND_MAX */
+ u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX;
break;
case FSRAND:
- if (x->tval & REC) /* no argument provided */
+ if (isrec(x)) /* no argument provided */
u = time((time_t *)0);
else
u = getfval(x);
@@ -1540,28 +1613,28 @@ bltin(Node **a, int n)
buf = tostring(getsval(x));
if (t == FTOUPPER) {
for (p = buf; *p; p++)
- if (islower(*p))
- *p = toupper(*p);
+ if (islower((uschar)*p))
+ *p = toupper((uschar)*p);
} else {
for (p = buf; *p; p++)
- if (isupper(*p))
- *p = tolower(*p);
+ if (isupper((uschar)*p))
+ *p = tolower((uschar)*p);
}
- tempfree(x, "");
- x = gettemp("");
+ tempfree(x);
+ x = gettemp();
(void) setsval(x, buf);
free(buf);
return (x);
default: /* can't happen */
- ERROR "illegal function type %d", t FATAL;
+ FATAL("illegal function type %d", t);
break;
}
- tempfree(x, "");
- x = gettemp("");
+ tempfree(x);
+ x = gettemp();
(void) setfval(x, u);
- if (nextarg != 0) {
- ERROR "warning: function has too many arguments" WARNING;
- for (; nextarg; nextarg = nextarg->nnext)
+ if (nextarg != NULL) {
+ WARNING("warning: function has too many arguments");
+ for (; nextarg != NULL; nextarg = nextarg->nnext)
(void) execute(nextarg);
}
return (x);
@@ -1569,28 +1642,28 @@ bltin(Node **a, int n)
/*ARGSUSED*/
Cell *
-print(Node **a, int n)
+printstat(Node **a, int n) /* print a[0] */
{
- register Node *x;
- register Cell *y;
+ Node *x;
+ Cell *y;
FILE *fp;
- if (a[1] == 0)
+ if (a[1] == NULL) /* a[1] is redirection operator, a[2] is file */
fp = stdout;
else
- fp = redirect((int)a[1], a[2]);
+ fp = redirect(ptoi(a[1]), a[2]);
for (x = a[0]; x != NULL; x = x->nnext) {
y = execute(x);
- (void) fputs((char *)getsval(y), fp);
- tempfree(y, "");
+ (void) fputs(getsval(y), fp);
+ tempfree(y);
if (x->nnext == NULL)
- (void) fputs((char *)*ORS, fp);
+ (void) fputs(*ORS, fp);
else
- (void) fputs((char *)*OFS, fp);
+ (void) fputs(*OFS, fp);
}
- if (a[1] != 0)
+ if (a[1] != NULL)
(void) fflush(fp);
- return (true);
+ return (True);
}
/*ARGSUSED*/
@@ -1602,39 +1675,38 @@ nullproc(Node **a, int n)
struct {
FILE *fp;
- uchar *fname;
+ char *fname;
int mode; /* '|', 'a', 'w' */
} files[FOPEN_MAX];
static FILE *
-redirect(int a, Node *b)
+redirect(int a, Node *b) /* set up all i/o redirections */
{
FILE *fp;
Cell *x;
- uchar *fname;
+ char *fname;
x = execute(b);
fname = getsval(x);
fp = openfile(a, fname);
if (fp == NULL)
- ERROR "can't open file %s", fname FATAL;
- tempfree(x, "");
+ FATAL("can't open file %s", fname);
+ tempfree(x);
return (fp);
}
static FILE *
-openfile(int a, uchar *s)
+openfile(int a, const char *s)
{
- register int i, m;
- register FILE *fp;
+ int i, m;
+ FILE *fp = NULL;
if (*s == '\0')
- ERROR "null file name in print or getline" FATAL;
+ FATAL("null file name in print or getline");
for (i = 0; i < FOPEN_MAX; i++) {
- if (files[i].fname &&
- strcmp((char *)s, (char *)files[i].fname) == 0) {
+ if (files[i].fname && strcmp(s, files[i].fname) == 0) {
if (a == files[i].mode ||
- a == APPEND && files[i].mode == GT) {
+ (a == APPEND && files[i].mode == GT)) {
return (files[i].fp);
}
}
@@ -1644,23 +1716,23 @@ openfile(int a, uchar *s)
break;
}
if (i >= FOPEN_MAX)
- ERROR "%s makes too many open files", s FATAL;
+ FATAL("%s makes too many open files", s);
(void) fflush(stdout); /* force a semblance of order */
m = a;
if (a == GT) {
- fp = fopen((char *)s, "w");
+ fp = fopen(s, "w");
} else if (a == APPEND) {
- fp = fopen((char *)s, "a");
+ fp = fopen(s, "a");
m = GT; /* so can mix > and >> */
} else if (a == '|') { /* output pipe */
- fp = popen((char *)s, "w");
+ fp = popen(s, "w");
} else if (a == LE) { /* input pipe */
- fp = popen((char *)s, "r");
+ fp = popen(s, "r");
} else if (a == LT) { /* getline <file */
- fp = strcmp((char *)s, "-") == 0 ?
- stdin : fopen((char *)s, "r"); /* "-" is stdin */
+ fp = strcmp(s, "-") == 0 ?
+ stdin : fopen(s, "r"); /* "-" is stdin */
} else /* can't happen */
- ERROR "illegal redirection" FATAL;
+ FATAL("illegal redirection %d", a);
if (fp != NULL) {
files[i].fname = tostring(s);
files[i].fp = fp;
@@ -1673,25 +1745,24 @@ openfile(int a, uchar *s)
Cell *
closefile(Node **a, int n)
{
- register Cell *x;
+ Cell *x;
int i, stat;
x = execute(a[0]);
(void) getsval(x);
for (i = 0; i < FOPEN_MAX; i++) {
- if (files[i].fname &&
- strcmp((char *)x->sval, (char *)files[i].fname) == 0) {
+ if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) {
if (ferror(files[i].fp)) {
- ERROR "i/o error occurred on %s",
- files[i].fname WARNING;
+ WARNING("i/o error occurred on %s",
+ files[i].fname);
}
if (files[i].mode == '|' || files[i].mode == LE)
stat = pclose(files[i].fp);
else
stat = fclose(files[i].fp);
if (stat == EOF) {
- ERROR "i/o error occurred closing %s",
- files[i].fname WARNING;
+ WARNING("i/o error occurred closing %s",
+ files[i].fname);
}
xfree(files[i].fname);
/* watch out for ref thru this */
@@ -1699,8 +1770,8 @@ closefile(Node **a, int n)
files[i].fp = NULL;
}
}
- tempfree(x, "close");
- return (true);
+ tempfree(x);
+ return (True);
}
static void
@@ -1711,16 +1782,16 @@ closeall(void)
for (i = 0; i < FOPEN_MAX; i++) {
if (files[i].fp) {
if (ferror(files[i].fp)) {
- ERROR "i/o error occurred on %s",
- files[i].fname WARNING;
+ WARNING("i/o error occurred on %s",
+ files[i].fname);
}
if (files[i].mode == '|' || files[i].mode == LE)
stat = pclose(files[i].fp);
else
stat = fclose(files[i].fp);
if (stat == EOF) {
- ERROR "i/o error occurred while closing %s",
- files[i].fname WARNING;
+ WARNING("i/o error occurred while closing %s",
+ files[i].fname);
}
}
}
@@ -1728,44 +1799,46 @@ closeall(void)
/*ARGSUSED*/
Cell *
-sub(Node **a, int nnn)
+sub(Node **a, int nnn) /* substitute command */
{
- register uchar *sptr;
- register Cell *x, *y, *result;
- uchar *buf, *t;
+ char *sptr;
+ Cell *x, *y, *result;
+ char *t, *buf;
fa *pfa;
- size_t bsize, cnt, len;
+ size_t bufsz = recsize;
+ size_t cnt = 0, len;
+ if ((buf = (char *)malloc(bufsz)) == NULL)
+ FATAL("out of memory in sub");
x = execute(a[3]); /* target string */
t = getsval(x);
- if (a[0] == 0)
+ if (a[0] == NULL) /* 0 => a[1] is already-compiled regexpr */
pfa = (fa *)a[1]; /* regular expression */
else {
y = execute(a[1]);
pfa = makedfa(getsval(y), 1);
- tempfree(y, "");
+ tempfree(y);
}
y = execute(a[2]); /* replacement string */
- result = false;
+ result = False;
if (pmatch(pfa, t)) {
- init_buf(&buf, &bsize, LINE_INCR);
- cnt = 0;
sptr = t;
len = patbeg - sptr;
if (len > 0) {
- expand_buf(&buf, &bsize, cnt + len);
+ (void) adjbuf(&buf, &bufsz, cnt + len,
+ recsize, NULL, "sub");
(void) memcpy(buf, sptr, len);
cnt += len;
}
sptr = getsval(y);
- while (*sptr != 0) {
- expand_buf(&buf, &bsize, cnt);
+ while (*sptr != '\0') {
+ (void) adjbuf(&buf, &bufsz, 1 + cnt + patlen,
+ recsize, NULL, "sub");
if (*sptr == '\\' &&
(*(sptr+1) == '&' || *(sptr+1) == '\\')) {
sptr++; /* skip \, */
buf[cnt++] = *sptr++; /* add & or \ */
} else if (*sptr == '&') {
- expand_buf(&buf, &bsize, cnt + patlen);
sptr++;
(void) memcpy(&buf[cnt], patbeg, patlen);
cnt += patlen;
@@ -1775,67 +1848,74 @@ sub(Node **a, int nnn)
}
sptr = patbeg + patlen;
if ((patlen == 0 && *patbeg) || (patlen && *(sptr-1))) {
- len = strlen((char *)sptr);
- expand_buf(&buf, &bsize, cnt + len);
+ len = strlen(sptr);
+ (void) adjbuf(&buf, &bufsz, 1 + cnt + len,
+ recsize, NULL, "sub");
(void) memcpy(&buf[cnt], sptr, len);
cnt += len;
}
buf[cnt] = '\0';
- (void) setsval(x, buf);
- free(buf);
- result = true;
+ (void) setsval(x, buf); /* BUG: should be able to avoid copy */
+ result = True;
}
- tempfree(x, "");
- tempfree(y, "");
+ tempfree(x);
+ tempfree(y);
+ free(buf);
return (result);
}
/*ARGSUSED*/
Cell *
-gsub(Node **a, int nnn)
+gsub(Node **a, int nnn) /* global substitute */
{
- register Cell *x, *y;
- register uchar *rptr, *sptr, *t;
- uchar *buf;
- register fa *pfa;
+ Cell *x, *y;
+ char *rptr, *sptr, *t;
+ char *buf;
+ fa *pfa;
int mflag, tempstat, num;
- size_t bsize, cnt, len;
+ size_t bufsz = recsize;
+ size_t cnt, len;
+ if ((buf = (char *)malloc(bufsz)) == NULL)
+ FATAL("out of memory in gsub");
mflag = 0; /* if mflag == 0, can replace empty string */
num = 0;
x = execute(a[3]); /* target string */
t = getsval(x);
- if (a[0] == 0)
- pfa = (fa *) a[1]; /* regular expression */
+ if (a[0] == NULL) /* 0 => a[1] is already-compiled regexpr */
+ pfa = (fa *)a[1]; /* regular expression */
else {
y = execute(a[1]);
pfa = makedfa(getsval(y), 1);
- tempfree(y, "");
+ tempfree(y);
}
y = execute(a[2]); /* replacement string */
if (pmatch(pfa, t)) {
tempstat = pfa->initstat;
pfa->initstat = 2;
- init_buf(&buf, &bsize, LINE_INCR);
rptr = getsval(y);
cnt = 0;
do {
- if (patlen == 0 && *patbeg != 0) {
+ if (patlen == 0 && *patbeg != '\0') {
/* matched empty string */
if (mflag == 0) { /* can replace empty */
num++;
sptr = rptr;
- while (*sptr != 0) {
- expand_buf(&buf, &bsize, cnt);
+ while (*sptr != '\0') {
+ (void) adjbuf(&buf, &bufsz,
+ 1 + cnt, recsize,
+ NULL, "gsub");
if (*sptr == '\\' &&
(*(sptr+1) == '&' ||
*(sptr+1) == '\\')) {
sptr++;
buf[cnt++] = *sptr++;
} else if (*sptr == '&') {
- expand_buf(&buf,
- &bsize,
- cnt + patlen);
+ (void) adjbuf(&buf,
+ &bufsz,
+ 1 + cnt + patlen,
+ recsize,
+ NULL, "gsub");
sptr++;
(void) memcpy(&buf[cnt],
patbeg, patlen);
@@ -1845,9 +1925,10 @@ gsub(Node **a, int nnn)
}
}
}
- if (*t == 0) /* at end */
+ if (*t == '\0') /* at end */
goto done;
- expand_buf(&buf, &bsize, cnt);
+ (void) adjbuf(&buf, &bufsz, 1 + cnt,
+ recsize, NULL, "gsub");
buf[cnt++] = *t++;
mflag = 0;
} else { /* matched nonempty string */
@@ -1855,22 +1936,26 @@ gsub(Node **a, int nnn)
sptr = t;
len = patbeg - sptr;
if (len > 0) {
- expand_buf(&buf, &bsize, cnt + len);
+ (void) adjbuf(&buf, &bufsz,
+ 1 + cnt + len, recsize,
+ NULL, "gsub");
(void) memcpy(&buf[cnt], sptr, len);
cnt += len;
}
sptr = rptr;
- while (*sptr != 0) {
- expand_buf(&buf, &bsize, cnt);
+ while (*sptr != '\0') {
+ (void) adjbuf(&buf, &bufsz, 1 + cnt,
+ recsize, NULL, "gsub");
if (*sptr == '\\' &&
(*(sptr+1) == '&' ||
*(sptr+1) == '\\')) {
sptr++;
buf[cnt++] = *sptr++;
} else if (*sptr == '&') {
- expand_buf(&buf, &bsize,
- cnt + patlen);
sptr++;
+ (void) adjbuf(&buf, &bufsz,
+ 1 + cnt + patlen, recsize,
+ NULL, "gsub");
(void) memcpy(&buf[cnt],
patbeg, patlen);
cnt += patlen;
@@ -1879,14 +1964,15 @@ gsub(Node **a, int nnn)
}
}
t = patbeg + patlen;
- if ((*(t-1) == 0) || (*t == 0))
+ if ((*(t-1) == '\0') || (*t == '\0'))
goto done;
mflag = 1;
}
} while (pmatch(pfa, t));
sptr = t;
- len = strlen((char *)sptr);
- expand_buf(&buf, &bsize, len + cnt);
+ len = strlen(sptr);
+ (void) adjbuf(&buf, &bufsz, 1 + len + cnt,
+ recsize, NULL, "gsub");
(void) memcpy(&buf[cnt], sptr, len);
cnt += len;
done:
@@ -1895,9 +1981,9 @@ gsub(Node **a, int nnn)
free(buf);
pfa->initstat = tempstat;
}
- tempfree(x, "");
- tempfree(y, "");
- x = gettemp("");
+ tempfree(x);
+ tempfree(y);
+ x = gettemp();
x->tval = NUM;
x->fval = num;
return (x);
diff --git a/usr/src/cmd/awk/tran.c b/usr/src/cmd/awk/tran.c
index e8e42d780e..bbcc161347 100644
--- a/usr/src/cmd/awk/tran.c
+++ b/usr/src/cmd/awk/tran.c
@@ -1,4 +1,28 @@
/*
+ * 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.
+ */
+
+/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
@@ -27,13 +51,12 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#define DEBUG
#include <stdio.h>
-#include <stdlib.h>
+#include <math.h>
#include <ctype.h>
#include <string.h>
+#include <stdlib.h>
#include "awk.h"
#include "y.tab.h"
@@ -42,17 +65,17 @@
Array *symtab; /* main symbol table */
-uchar **FS; /* initial field sep */
-uchar **RS; /* initial record sep */
-uchar **OFS; /* output field sep */
-uchar **ORS; /* output record sep */
-uchar **OFMT; /* output format for numbers */
+char **FS; /* initial field sep */
+char **RS; /* initial record sep */
+char **OFS; /* output field sep */
+char **ORS; /* output record sep */
+char **OFMT; /* output format for numbers */
Awkfloat *NF; /* number of fields in current record */
Awkfloat *NR; /* number of current record */
Awkfloat *FNR; /* number of current record in current file */
-uchar **FILENAME; /* current filename argument */
+char **FILENAME; /* current filename argument */
Awkfloat *ARGC; /* number of arguments from command line */
-uchar **SUBSEP; /* subscript separator for a[i,j,k]; default \034 */
+char **SUBSEP; /* subscript separator for a[i,j,k]; default \034 */
Awkfloat *RSTART; /* start of re matched with ~; origin 1 (!) */
Awkfloat *RLENGTH; /* length of same */
@@ -66,83 +89,80 @@ Cell *rstartloc; /* RSTART */
Cell *rlengthloc; /* RLENGTH */
Cell *symtabloc; /* SYMTAB */
-Cell *nullloc;
+Cell *nullloc; /* a guaranteed empty cell */
Node *nullnode; /* zero&null, converted into a node for comparisons */
static void rehash(Array *);
void
-syminit(void)
+syminit(void) /* initialize symbol table with builtin vars */
{
- init_buf(&record, &record_size, LINE_INCR);
+ init_buf(&record, &recsize, LINE_INCR);
/* initialize $0 */
recloc = getfld(0);
- recloc->nval = (uchar *)"$0";
+ recloc->nval = "$0";
recloc->sval = record;
recloc->tval = REC|STR|DONTFREE;
symtab = makesymtab(NSYMTAB);
- (void) setsymtab((uchar *)"0", (uchar *)"0", 0.0,
+ (void) setsymtab("0", "0", 0.0,
NUM|STR|CON|DONTFREE, symtab);
/* this is used for if(x)... tests: */
- nullloc = setsymtab((uchar *)"$zero&null", (uchar *)"", 0.0,
+ nullloc = setsymtab("$zero&null", "", 0.0,
NUM|STR|CON|DONTFREE, symtab);
- nullnode = valtonode(nullloc, CCON);
- FS = &setsymtab((uchar *)"FS", (uchar *)" ", 0.0,
- STR|DONTFREE, symtab)->sval;
- RS = &setsymtab((uchar *)"RS", (uchar *)"\n", 0.0,
+ nullnode = celltonode(nullloc, CCON);
+
+ FS = &setsymtab("FS", " ", 0.0,
STR|DONTFREE, symtab)->sval;
- OFS = &setsymtab((uchar *)"OFS", (uchar *)" ", 0.0,
+ RS = &setsymtab("RS", "\n", 0.0,
STR|DONTFREE, symtab)->sval;
- ORS = &setsymtab((uchar *)"ORS", (uchar *)"\n", 0.0,
+ OFS = &setsymtab("OFS", " ", 0.0, STR|DONTFREE, symtab)->sval;
+ ORS = &setsymtab("ORS", "\n", 0.0,
STR|DONTFREE, symtab)->sval;
- OFMT = &setsymtab((uchar *)"OFMT", (uchar *)"%.6g", 0.0,
+ OFMT = &setsymtab("OFMT", "%.6g", 0.0,
STR|DONTFREE, symtab)->sval;
- FILENAME = &setsymtab((uchar *)"FILENAME", (uchar *)"-", 0.0,
+ FILENAME = &setsymtab("FILENAME", "-", 0.0,
STR|DONTFREE, symtab)->sval;
- nfloc = setsymtab((uchar *)"NF", (uchar *)"", 0.0, NUM, symtab);
+ nfloc = setsymtab("NF", "", 0.0, NUM, symtab);
NF = &nfloc->fval;
- nrloc = setsymtab((uchar *)"NR", (uchar *)"", 0.0, NUM, symtab);
+ nrloc = setsymtab("NR", "", 0.0, NUM, symtab);
NR = &nrloc->fval;
- fnrloc = setsymtab((uchar *)"FNR", (uchar *)"", 0.0, NUM, symtab);
+ fnrloc = setsymtab("FNR", "", 0.0, NUM, symtab);
FNR = &fnrloc->fval;
- SUBSEP = &setsymtab((uchar *)"SUBSEP", (uchar *)"\034", 0.0,
+ SUBSEP = &setsymtab("SUBSEP", "\034", 0.0,
STR|DONTFREE, symtab)->sval;
- rstartloc = setsymtab((uchar *)"RSTART", (uchar *)"", 0.0,
- NUM, symtab);
+ rstartloc = setsymtab("RSTART", "", 0.0, NUM, symtab);
RSTART = &rstartloc->fval;
- rlengthloc = setsymtab((uchar *)"RLENGTH", (uchar *)"", 0.0,
- NUM, symtab);
+ rlengthloc = setsymtab("RLENGTH", "", 0.0, NUM, symtab);
RLENGTH = &rlengthloc->fval;
- symtabloc = setsymtab((uchar *)"SYMTAB", (uchar *)"", 0.0, ARR, symtab);
- symtabloc->sval = (uchar *)symtab;
+ symtabloc = setsymtab("SYMTAB", "", 0.0, ARR, symtab);
+ symtabloc->sval = (char *)symtab;
}
void
-arginit(int ac, uchar *av[])
+arginit(int ac, char **av) /* set up ARGV and ARGC */
{
Cell *cp;
int i;
- uchar temp[11];
+ char temp[50];
/* first make FILENAME first real argument */
for (i = 1; i < ac; i++) {
if (!isclvar(av[i])) {
- (void) setsval(lookup((uchar *)"FILENAME", symtab),
+ (void) setsval(lookup("FILENAME", symtab),
av[i]);
break;
}
}
- ARGC = &setsymtab((uchar *)"ARGC", (uchar *)"", (Awkfloat)ac,
- NUM, symtab)->fval;
- cp = setsymtab((uchar *)"ARGV", (uchar *)"", 0.0, ARR, symtab);
+ ARGC = &setsymtab("ARGC", "", (Awkfloat)ac, NUM, symtab)->fval;
+ cp = setsymtab("ARGV", "", 0.0, ARR, symtab);
ARGVtab = makesymtab(NSYMTAB); /* could be (int) ARGC as well */
- cp->sval = (uchar *) ARGVtab;
+ cp->sval = (char *)ARGVtab;
for (i = 0; i < ac; i++) {
- (void) sprintf((char *)temp, "%d", i);
+ (void) sprintf(temp, "%d", i);
if (is_number(*av)) {
- (void) setsymtab(temp, *av, atof((const char *)*av),
+ (void) setsymtab(temp, *av, atof(*av),
STR|NUM, ARGVtab);
} else {
(void) setsymtab(temp, *av, 0.0, STR, ARGVtab);
@@ -152,20 +172,20 @@ arginit(int ac, uchar *av[])
}
void
-envinit(uchar *envp[])
+envinit(char **envp) /* set up ENVIRON variable */
{
Cell *cp;
- uchar *p;
+ char *p;
- cp = setsymtab((uchar *)"ENVIRON", (uchar *)"", 0.0, ARR, symtab);
+ cp = setsymtab("ENVIRON", "", 0.0, ARR, symtab);
ENVtab = makesymtab(NSYMTAB);
- cp->sval = (uchar *) ENVtab;
+ cp->sval = (char *)ENVtab;
for (; *envp; envp++) {
- if ((p = (uchar *)strchr((char *)*envp, '=')) == NULL)
+ if ((p = strchr(*envp, '=')) == NULL)
continue;
*p++ = 0; /* split into two strings at = */
if (is_number(p)) {
- (void) setsymtab(*envp, p, atof((const char *)p),
+ (void) setsymtab(*envp, p, atof(p),
STR|NUM, ENVtab);
} else {
(void) setsymtab(*envp, p, 0.0, STR, ENVtab);
@@ -176,7 +196,7 @@ envinit(uchar *envp[])
}
Array *
-makesymtab(int n)
+makesymtab(int n) /* make a new symbol table */
{
Array *ap;
Cell **tp;
@@ -184,7 +204,7 @@ makesymtab(int n)
ap = (Array *)malloc(sizeof (Array));
tp = (Cell **)calloc(n, sizeof (Cell *));
if (ap == NULL || tp == NULL)
- ERROR "out of space in makesymtab" FATAL;
+ FATAL("out of space in makesymtab");
ap->nelem = 0;
ap->size = n;
ap->tab = tp;
@@ -192,9 +212,9 @@ makesymtab(int n)
}
void
-freesymtab(Cell *ap) /* free symbol table */
+freesymtab(Cell *ap) /* free a symbol table */
{
- Cell *cp, *next;
+ Cell *cp, *temp;
Array *tp;
int i;
@@ -205,20 +225,26 @@ freesymtab(Cell *ap) /* free symbol table */
if (tp == NULL)
return;
for (i = 0; i < tp->size; i++) {
- for (cp = tp->tab[i]; cp != NULL; cp = next) {
- next = cp->cnext;
+ for (cp = tp->tab[i]; cp != NULL; cp = temp) {
xfree(cp->nval);
if (freeable(cp))
xfree(cp->sval);
+ temp = cp->cnext; /* avoids freeing then using */
free(cp);
+ tp->nelem--;
}
+ tp->tab[i] = 0;
+ }
+ if (tp->nelem != 0) {
+ WARNING("can't happen: inconsistent element count freeing %s",
+ ap->nval);
}
free(tp->tab);
free(tp);
}
void
-freeelem(Cell *ap, uchar *s) /* free elem s from ap (i.e., ap["s"] */
+freeelem(Cell *ap, const char *s) /* free elem s from ap (i.e., ap["s"] */
{
Array *tp;
Cell *p, *prev = NULL;
@@ -228,7 +254,7 @@ freeelem(Cell *ap, uchar *s) /* free elem s from ap (i.e., ap["s"] */
tp = (Array *)ap->sval;
h = hash(s, tp->size);
for (p = tp->tab[h]; p != NULL; prev = p, p = p->cnext)
- if (strcmp((char *)s, (char *)p->nval) == 0) {
+ if (strcmp(s, p->nval) == 0) {
if (prev == NULL) /* 1st one */
tp->tab[h] = p->cnext;
else /* middle somewhere */
@@ -243,25 +269,24 @@ freeelem(Cell *ap, uchar *s) /* free elem s from ap (i.e., ap["s"] */
}
Cell *
-setsymtab(uchar *n, uchar *s, Awkfloat f, unsigned int t, Array *tp)
+setsymtab(const char *n, const char *s, Awkfloat f, unsigned int t, Array *tp)
{
- register int h;
- register Cell *p;
+ int h;
+ Cell *p;
if (n != NULL && (p = lookup(n, tp)) != NULL) {
- dprintf(("setsymtab found %p: n=%s", (void *)p, p->nval));
- dprintf((" s=\"%s\" f=%g t=%p\n",
- p->sval, p->fval, (void *)p->tval));
+ dprintf(("setsymtab found %p: n=%s s=\"%s\" f=%g t=%o\n",
+ (void *)p, NN(p->nval), NN(p->sval), p->fval, p->tval));
return (p);
}
p = (Cell *)malloc(sizeof (Cell));
if (p == NULL)
- ERROR "symbol table overflow at %s", n FATAL;
+ FATAL("out of space for symbol table at %s", n);
p->nval = tostring(n);
- p->sval = s ? tostring(s) : tostring((uchar *)"");
+ p->sval = s ? tostring(s) : tostring("");
p->fval = f;
p->tval = t;
- p->csub = 0;
+ p->csub = CUNK;
tp->nelem++;
if (tp->nelem > FULLTAB * tp->size)
@@ -269,15 +294,15 @@ setsymtab(uchar *n, uchar *s, Awkfloat f, unsigned int t, Array *tp)
h = hash(n, tp->size);
p->cnext = tp->tab[h];
tp->tab[h] = p;
- dprintf(("setsymtab set %p: n=%s", (void *)p, p->nval));
- dprintf((" s=\"%s\" f=%g t=%p\n", p->sval, p->fval, (void *)p->tval));
+ dprintf(("setsymtab set %p: n=%s s=\"%s\" f=%g t=%o\n",
+ (void *)p, p->nval, p->sval, p->fval, p->tval));
return (p);
}
int
-hash(uchar *s, int n) /* form hash value for string s */
+hash(const char *s, int n) /* form hash value for string s */
{
- register unsigned hashval;
+ unsigned int hashval;
for (hashval = 0; *s != '\0'; s++)
hashval = (*s + 31 * hashval);
@@ -292,10 +317,10 @@ rehash(Array *tp) /* rehash items in small table into big one */
nsz = GROWTAB * tp->size;
np = (Cell **)calloc(nsz, sizeof (Cell *));
- if (np == NULL)
- ERROR "out of space in rehash" FATAL;
+ if (np == NULL) /* can't do it, but can keep running. */
+ return; /* someone else will run out later. */
for (i = 0; i < tp->size; i++) {
- for (cp = tp->tab[i]; cp; cp = op) {
+ for (cp = tp->tab[i]; cp != NULL; cp = op) {
op = cp->cnext;
nh = hash(cp->nval, nsz);
cp->cnext = np[nh];
@@ -308,69 +333,70 @@ rehash(Array *tp) /* rehash items in small table into big one */
}
Cell *
-lookup(uchar *s, Array *tp) /* look for s in tp */
+lookup(const char *s, Array *tp) /* look for s in tp */
{
- register Cell *p;
+ Cell *p;
int h;
h = hash(s, tp->size);
for (p = tp->tab[h]; p != NULL; p = p->cnext) {
- if (strcmp((char *)s, (char *)p->nval) == 0)
+ if (strcmp(s, p->nval) == 0)
return (p); /* found it */
}
return (NULL); /* not found */
}
Awkfloat
-setfval(Cell *vp, Awkfloat f)
+setfval(Cell *vp, Awkfloat f) /* set float val of a Cell */
{
int i;
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "assign to");
- if (vp->tval & FLD) {
+ if (isfld(vp)) {
donerec = 0; /* mark $0 invalid */
i = fldidx(vp);
if (i > *NF)
newfld(i);
dprintf(("setting field %d to %g\n", i, f));
- } else if (vp->tval & REC) {
+ } else if (isrec(vp)) {
donefld = 0; /* mark $1... invalid */
donerec = 1;
}
vp->tval &= ~STR; /* mark string invalid */
vp->tval |= NUM; /* mark number ok */
- dprintf(("setfval %p: %s = %g, t=%p\n", (void *)vp,
- vp->nval ? vp->nval : (unsigned char *)"NULL",
- f, (void *)vp->tval));
+ dprintf(("setfval %p: %s = %g, t=%o\n", (void *)vp,
+ NN(vp->nval), f, vp->tval));
return (vp->fval = f);
}
void
-funnyvar(Cell *vp, char *rw)
+funnyvar(Cell *vp, const char *rw)
{
- if (vp->tval & ARR)
- ERROR "can't %s %s; it's an array name.", rw, vp->nval FATAL;
- if (vp->tval & FCN)
- ERROR "can't %s %s; it's a function.", rw, vp->nval FATAL;
- ERROR "funny variable %o: n=%s s=\"%s\" f=%g t=%o",
- vp, vp->nval, vp->sval, vp->fval, vp->tval CONT;
+ if (isarr(vp))
+ FATAL("can't %s %s; it's an array name.", rw, vp->nval);
+ if (isfcn(vp))
+ FATAL("can't %s %s; it's a function.", rw, vp->nval);
+ WARNING("funny variable %p: n=%s s=\"%s\" f=%g t=%o",
+ vp, vp->nval, vp->sval, vp->fval, vp->tval);
}
-uchar *
-setsval(Cell *vp, uchar *s)
+char *
+setsval(Cell *vp, const char *s) /* set string val of a Cell */
{
int i;
+ dprintf(("starting setsval %p: %s = \"%s\", t=%o, r,f=%d,%d\n",
+ (void *)vp, NN(vp->nval), s, vp->tval, donerec, donefld));
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "assign to");
- if (vp->tval & FLD) {
+ if (isfld(vp)) {
donerec = 0; /* mark $0 invalid */
i = fldidx(vp);
if (i > *NF)
newfld(i);
dprintf(("setting field %d to %s\n", i, s));
- } else if (vp->tval & REC) {
+ } else if (isrec(vp)) {
donefld = 0; /* mark $1... invalid */
donerec = 1;
}
@@ -388,74 +414,68 @@ setsval(Cell *vp, uchar *s)
}
Awkfloat
-r_getfval(Cell *vp)
+r_getfval(Cell *vp) /* get float val of a Cell */
{
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "read value of");
- if ((vp->tval & FLD) && donefld == 0)
+ if (isfld(vp) && donefld == 0)
fldbld();
- else if ((vp->tval & REC) && donerec == 0)
+ else if (isrec(vp) && donerec == 0)
recbld();
if (!isnum(vp)) { /* not a number */
- vp->fval = atof((const char *)vp->sval); /* best guess */
+ vp->fval = atof(vp->sval); /* best guess */
if (is_number(vp->sval) && !(vp->tval&CON))
vp->tval |= NUM; /* make NUM only sparingly */
}
dprintf(("getfval %p: %s = %g, t=%p\n",
- (void *)vp, vp->nval, vp->fval, (void *)vp->tval));
+ (void *)vp, NN(vp->nval), vp->fval, (void *)vp->tval));
return (vp->fval);
}
-uchar *
+char *
r_getsval(Cell *vp)
{
- uchar s[256];
+ char s[256];
if ((vp->tval & (NUM | STR)) == 0)
funnyvar(vp, "read value of");
- if ((vp->tval & FLD) && donefld == 0)
+ if (isfld(vp) && donefld == 0)
fldbld();
- else if ((vp->tval & REC) && donerec == 0)
+ else if (isrec(vp) && donerec == 0)
recbld();
- if ((vp->tval & STR) == 0) {
- if (!(vp->tval&DONTFREE))
+ if (isstr(vp) == 0) {
+ if (freeable(vp))
xfree(vp->sval);
if ((long long)vp->fval == vp->fval) {
- (void) snprintf((char *)s, sizeof (s),
+ (void) snprintf(s, sizeof (s),
"%.20g", vp->fval);
} else {
/*LINTED*/
- (void) snprintf((char *)s, sizeof (s),
+ (void) snprintf(s, sizeof (s),
(char *)*OFMT, vp->fval);
}
vp->sval = tostring(s);
vp->tval &= ~DONTFREE;
vp->tval |= STR;
}
- dprintf(("getsval %p: %s = \"%s\", t=%p\n",
- (void *)vp,
- vp->nval ? (char *)vp->nval : "",
- vp->sval ? (char *)vp->sval : "",
- (void *)vp->tval));
+ dprintf(("getsval %p: %s = \"%s (%p)\", t=%o\n",
+ (void *)vp, NN(vp->nval), vp->sval, (void *)vp->sval, vp->tval));
return (vp->sval);
}
-uchar *
-tostring(uchar *s)
+char *
+tostring(const char *s) /* make a copy of string s */
{
- register uchar *p;
-
- p = (uchar *)malloc(strlen((char *)s)+1);
+ char *p = strdup(s);
if (p == NULL)
- ERROR "out of space in tostring on %s", s FATAL;
- (void) strcpy((char *)p, (char *)s);
+ FATAL("out of space in tostring on %s", s);
return (p);
}
-uchar *
-qstring(uchar *s, int delim) /* collect string up to delim */
+char *
+qstring(const char *s, int delim) /* collect string up to delim */
{
- uchar *cbuf, *ret;
+ char *cbuf, *ret;
int c, n;
size_t cbufsz, cnt;
@@ -463,7 +483,7 @@ qstring(uchar *s, int delim) /* collect string up to delim */
for (cnt = 0; (c = *s) != delim; s++) {
if (c == '\n') {
- ERROR "newline in string %.10s...", cbuf SYNTAX;
+ SYNTAX("newline in string %.10s...", cbuf);
} else if (c != '\\') {
expand_buf(&cbuf, &cbufsz, cnt);
cbuf[cnt++] = c;
diff --git a/usr/src/pkg/manifests/system-test-utiltest.mf b/usr/src/pkg/manifests/system-test-utiltest.mf
index 90a47d6c56..0f6f005e2d 100644
--- a/usr/src/pkg/manifests/system-test-utiltest.mf
+++ b/usr/src/pkg/manifests/system-test-utiltest.mf
@@ -188,7 +188,6 @@ file path=opt/util-tests/tests/awk/examples/awk/t.f4 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.for mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.for1 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.for2 mode=0444
-file path=opt/util-tests/tests/awk/examples/awk/t.for3 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.format4 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.fun mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.fun0 mode=0444
@@ -262,10 +261,8 @@ file path=opt/util-tests/tests/awk/examples/awk/t.set2 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.set3 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.split mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.split2 mode=0444
-file path=opt/util-tests/tests/awk/examples/awk/t.split2a mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.split3 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.split4 mode=0444
-file path=opt/util-tests/tests/awk/examples/awk/t.split8 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.split9 mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.split9a mode=0444
file path=opt/util-tests/tests/awk/examples/awk/t.stately mode=0444
@@ -412,7 +409,6 @@ file path=opt/util-tests/tests/awk/examples/out/t.f4 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.for mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.for1 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.for2 mode=0444
-file path=opt/util-tests/tests/awk/examples/out/t.for3 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.format4 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.fun mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.fun0 mode=0444
@@ -486,10 +482,8 @@ file path=opt/util-tests/tests/awk/examples/out/t.set2 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.set3 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.split mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.split2 mode=0444
-file path=opt/util-tests/tests/awk/examples/out/t.split2a mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.split3 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.split4 mode=0444
-file path=opt/util-tests/tests/awk/examples/out/t.split8 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.split9 mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.split9a mode=0444
file path=opt/util-tests/tests/awk/examples/out/t.stately mode=0444
@@ -514,12 +508,6 @@ file path=opt/util-tests/tests/awk/gnu/anchgsub.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/anchor.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/anchor.in mode=0444
file path=opt/util-tests/tests/awk/gnu/anchor.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/argarray.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/argarray.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/argarray.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/arrayind1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/arrayind1.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/arrayind1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/arrayind3.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/arrayind3.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/arrayprm2.awk mode=0444
@@ -530,14 +518,8 @@ file path=opt/util-tests/tests/awk/gnu/arrayref.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/arrayref.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/arrymem1.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/arrymem1.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/arryref2.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/arryref2.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/arynasty.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/arynasty.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/arynocls.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/arynocls.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/aryprm8.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/aryprm8.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/aryprm9.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/aryprm9.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/arysubnm.awk mode=0444
@@ -547,22 +529,11 @@ file path=opt/util-tests/tests/awk/gnu/aryunasgn.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/asgext.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/asgext.in mode=0444
file path=opt/util-tests/tests/awk/gnu/asgext.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/back89.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/back89.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/back89.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/backgsub.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/backgsub.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/backgsub.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/childin.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/childin.in mode=0444
file path=opt/util-tests/tests/awk/gnu/childin.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/clobber.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/clobber.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/closebad.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/closebad.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/clsflnam.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/clsflnam.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/clsflnam.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/compare.in mode=0444
file path=opt/util-tests/tests/awk/gnu/compare.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/compare.sh mode=0555
@@ -573,27 +544,11 @@ file path=opt/util-tests/tests/awk/gnu/concat1.in mode=0444
file path=opt/util-tests/tests/awk/gnu/concat1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/concat2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/concat2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/concat3.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/concat3.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/concat4.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/concat4.in mode=0444
file path=opt/util-tests/tests/awk/gnu/concat4.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/concat5.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/concat5.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/convfmt.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/convfmt.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/datanonl.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/datanonl.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/datanonl.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/delargv.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/delargv.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/delarpm2.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/delarpm2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/delarprm.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/delarprm.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/dfamb1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/dfamb1.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/dfamb1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/dfastress.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/dfastress.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/dynlj.awk mode=0444
@@ -602,8 +557,6 @@ file path=opt/util-tests/tests/awk/gnu/eofsplit.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/eofsplit.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/exit2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/exit2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/exitval1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/exitval1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/exitval2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/exitval2.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/exitval3.awk mode=0444
@@ -613,8 +566,6 @@ file path=opt/util-tests/tests/awk/gnu/fcall_exit.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/fcall_exit2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/fcall_exit2.in mode=0444
file path=opt/util-tests/tests/awk/gnu/fcall_exit2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fflush.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fflush.sh mode=0555
file path=opt/util-tests/tests/awk/gnu/fldchg.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/fldchg.in mode=0444
file path=opt/util-tests/tests/awk/gnu/fldchg.ok mode=0444
@@ -624,27 +575,11 @@ file path=opt/util-tests/tests/awk/gnu/fldchgnf.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/fldterm.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/fldterm.in mode=0444
file path=opt/util-tests/tests/awk/gnu/fldterm.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnamedat.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnamedat.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnamedat.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnarray2.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnarray2.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnarray2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnasgnm.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnasgnm.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/fnasgnm.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fordel.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/fordel.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/forref.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/forref.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/forsimp.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/forsimp.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/fsbs.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/fsbs.in mode=0444
file path=opt/util-tests/tests/awk/gnu/fsbs.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/fsnul1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/fsnul1.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/fsnul1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/fsrs.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/fsrs.in mode=0444
file path=opt/util-tests/tests/awk/gnu/fsrs.ok mode=0444
@@ -659,18 +594,10 @@ file path=opt/util-tests/tests/awk/gnu/funsemnl.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/funstack.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/funstack.in mode=0444
file path=opt/util-tests/tests/awk/gnu/funstack.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/getline2.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/getline2.sh mode=0555
file path=opt/util-tests/tests/awk/gnu/getline3.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/getline3.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline4.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline4.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline4.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline5.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/getline5.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/getlnbuf.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/getlnbuf.in mode=0444
file path=opt/util-tests/tests/awk/gnu/getlnbuf.ok mode=0444
@@ -686,16 +613,6 @@ file path=opt/util-tests/tests/awk/gnu/gsubtest.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/gsubtest.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/gsubtst2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/gsubtst2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst3.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst3.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst3.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst4.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst4.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst5.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst5.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst5.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst6.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/gsubtst6.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/gsubtst7.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/gsubtst7.in mode=0444
file path=opt/util-tests/tests/awk/gnu/gsubtst7.ok mode=0444
@@ -707,8 +624,6 @@ file path=opt/util-tests/tests/awk/gnu/hex.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/hex2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/hex2.in mode=0444
file path=opt/util-tests/tests/awk/gnu/hex2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/hsprint.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/hsprint.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/inpref.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/inpref.in mode=0444
file path=opt/util-tests/tests/awk/gnu/inpref.ok mode=0444
@@ -730,9 +645,6 @@ file path=opt/util-tests/tests/awk/gnu/localenl.sh mode=0555
file path=opt/util-tests/tests/awk/gnu/longsub.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/longsub.in mode=0444
file path=opt/util-tests/tests/awk/gnu/longsub.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/longwrds.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/longwrds.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/longwrds.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/manglprm.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/manglprm.in mode=0444
file path=opt/util-tests/tests/awk/gnu/manglprm.ok mode=0444
@@ -765,9 +677,6 @@ file path=opt/util-tests/tests/awk/gnu/nfldstr.in mode=0444
file path=opt/util-tests/tests/awk/gnu/nfldstr.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/nfloop.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/nfloop.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/nfset.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/nfset.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/nfset.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/nlfldsep.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/nlfldsep.in mode=0444
file path=opt/util-tests/tests/awk/gnu/nlfldsep.ok mode=0444
@@ -801,11 +710,6 @@ file path=opt/util-tests/tests/awk/gnu/octsub.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmt.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmt.in mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmt.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofmta.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofmta.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofmtbig.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofmtbig.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofmtbig.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmtfidl.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmtfidl.in mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmtfidl.ok mode=0444
@@ -814,9 +718,6 @@ file path=opt/util-tests/tests/awk/gnu/ofmts.in mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmts.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmtstrnum.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/ofmtstrnum.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofs1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofs1.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/ofs1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/onlynl.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/onlynl.in mode=0444
file path=opt/util-tests/tests/awk/gnu/onlynl.ok mode=0444
@@ -834,16 +735,10 @@ file path=opt/util-tests/tests/awk/gnu/paramuninitglobal.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/parse1.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/parse1.in mode=0444
file path=opt/util-tests/tests/awk/gnu/parse1.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/parsefld.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/parsefld.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/parsefld.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/pcntplus.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/pcntplus.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/pipeio1.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/pipeio1.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/pipeio2.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/pipeio2.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/pipeio2.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/posix2008sub.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/posix2008sub.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/poundbang.ok mode=0444
@@ -863,18 +758,11 @@ file path=opt/util-tests/tests/awk/gnu/prmreuse.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/prmreuse.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/prt1eval.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/prt1eval.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/prtoeval.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/prtoeval.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/rand.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/rand.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/randtest.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/randtest.sh mode=0555
file path=opt/util-tests/tests/awk/gnu/range1.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/range1.in mode=0444
file path=opt/util-tests/tests/awk/gnu/range1.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/rebrackloc.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/rebrackloc.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/rebrackloc.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/rebt8b1.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/rebt8b1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/rebuild.awk mode=0444
@@ -886,16 +774,9 @@ file path=opt/util-tests/tests/awk/gnu/redfilnm.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/regeq.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/regeq.in mode=0444
file path=opt/util-tests/tests/awk/gnu/regeq.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/regexpbrack.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/regexpbrack.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/regexpbrack.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/regexpbrack2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/regexpbrack2.in mode=0444
file path=opt/util-tests/tests/awk/gnu/regexpbrack2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/regexprange.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/regexprange.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/regrange.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/regrange.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/reparse.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/reparse.in mode=0444
file path=opt/util-tests/tests/awk/gnu/reparse.ok mode=0444
@@ -918,14 +799,6 @@ file path=opt/util-tests/tests/awk/gnu/rsnulbig.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/rsnulbig.sh mode=0555
file path=opt/util-tests/tests/awk/gnu/rsnulbig2.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/rsnulbig2.sh mode=0555
-file path=opt/util-tests/tests/awk/gnu/rsstart1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/rsstart1.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/rsstart1.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/rsstart2.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/rsstart2.in mode=0444
-file path=opt/util-tests/tests/awk/gnu/rsstart2.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/rstest1.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/rstest1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/rstest2.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/rstest2.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/rstest3.awk mode=0444
@@ -950,8 +823,6 @@ file path=opt/util-tests/tests/awk/gnu/sigpipe1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/splitargv.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/splitargv.in mode=0444
file path=opt/util-tests/tests/awk/gnu/splitargv.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/splitarr.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/splitarr.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/splitdef.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/splitdef.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/splitvar.awk mode=0444
@@ -959,8 +830,6 @@ file path=opt/util-tests/tests/awk/gnu/splitvar.in mode=0444
file path=opt/util-tests/tests/awk/gnu/splitvar.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/splitwht.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/splitwht.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/status-close.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/status-close.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/strcat1.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/strcat1.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/strnum1.awk mode=0444
@@ -975,8 +844,6 @@ file path=opt/util-tests/tests/awk/gnu/subamp.in mode=0444
file path=opt/util-tests/tests/awk/gnu/subamp.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/subi18n.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/subi18n.ok mode=0444
-file path=opt/util-tests/tests/awk/gnu/subsepnm.awk mode=0444
-file path=opt/util-tests/tests/awk/gnu/subsepnm.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/subslash.awk mode=0444
file path=opt/util-tests/tests/awk/gnu/subslash.ok mode=0444
file path=opt/util-tests/tests/awk/gnu/substr.awk mode=0444
@@ -1035,8 +902,6 @@ file path=opt/util-tests/tests/awk/syn/aryprm5.awk mode=0444
file path=opt/util-tests/tests/awk/syn/aryprm5.ok mode=0444
file path=opt/util-tests/tests/awk/syn/aryprm6.awk mode=0444
file path=opt/util-tests/tests/awk/syn/aryprm6.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/aryprm7.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/aryprm7.ok mode=0444
file path=opt/util-tests/tests/awk/syn/badassign1.awk mode=0444
file path=opt/util-tests/tests/awk/syn/badassign1.ok mode=0444
file path=opt/util-tests/tests/awk/syn/badbuild.awk mode=0444
@@ -1051,30 +916,16 @@ file path=opt/util-tests/tests/awk/syn/fnaryscl.awk mode=0444
file path=opt/util-tests/tests/awk/syn/fnaryscl.ok mode=0444
file path=opt/util-tests/tests/awk/syn/fnmisc.awk mode=0444
file path=opt/util-tests/tests/awk/syn/fnmisc.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/funsmnam.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/funsmnam.ok mode=0444
file path=opt/util-tests/tests/awk/syn/gsubasgn.awk mode=0444
file path=opt/util-tests/tests/awk/syn/gsubasgn.ok mode=0444
file path=opt/util-tests/tests/awk/syn/nastyparm.awk mode=0444
file path=opt/util-tests/tests/awk/syn/nastyparm.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/nfneg.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/nfneg.ok mode=0444
file path=opt/util-tests/tests/awk/syn/noparms.awk mode=0444
file path=opt/util-tests/tests/awk/syn/noparms.ok mode=0444
file path=opt/util-tests/tests/awk/syn/nulinsrc.awk mode=0444
file path=opt/util-tests/tests/awk/syn/nulinsrc.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/paramasfunc1.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/paramasfunc1.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/paramasfunc2.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/paramasfunc2.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/paramdup.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/paramdup.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/paramres.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/paramres.ok mode=0444
file path=opt/util-tests/tests/awk/syn/parseme.awk mode=0444
file path=opt/util-tests/tests/awk/syn/parseme.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/prmarscl.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/prmarscl.ok mode=0444
file path=opt/util-tests/tests/awk/syn/readbuf.awk mode=0444
file path=opt/util-tests/tests/awk/syn/readbuf.ok mode=0444
file path=opt/util-tests/tests/awk/syn/scalar.awk mode=0444
@@ -1089,8 +940,6 @@ file path=opt/util-tests/tests/awk/syn/synerr2.awk mode=0444
file path=opt/util-tests/tests/awk/syn/synerr2.ok mode=0444
file path=opt/util-tests/tests/awk/syn/tradanch1.awk mode=0444
file path=opt/util-tests/tests/awk/syn/tradanch1.ok mode=0444
-file path=opt/util-tests/tests/awk/syn/tradanch2.awk mode=0444
-file path=opt/util-tests/tests/awk/syn/tradanch2.ok mode=0444
file path=opt/util-tests/tests/awk/syn/unterm.awk mode=0444
file path=opt/util-tests/tests/awk/syn/unterm.ok mode=0444
file path=opt/util-tests/tests/awk/tests/chem.awk mode=0444
@@ -1105,7 +954,6 @@ file path=opt/util-tests/tests/awk/tests/T.builtin mode=0555
file path=opt/util-tests/tests/awk/tests/T.chem mode=0555
file path=opt/util-tests/tests/awk/tests/T.close mode=0555
file path=opt/util-tests/tests/awk/tests/T.clv mode=0555
-file path=opt/util-tests/tests/awk/tests/T.delete mode=0555
file path=opt/util-tests/tests/awk/tests/T.errmsg mode=0555
file path=opt/util-tests/tests/awk/tests/T.expr mode=0555
file path=opt/util-tests/tests/awk/tests/T.exprconv mode=0555
@@ -1117,10 +965,8 @@ file path=opt/util-tests/tests/awk/tests/T.latin1 mode=0555
file path=opt/util-tests/tests/awk/tests/T.lilly mode=0555
file path=opt/util-tests/tests/awk/tests/T.main mode=0555
file path=opt/util-tests/tests/awk/tests/T.misc mode=0555
-file path=opt/util-tests/tests/awk/tests/T.nextfile mode=0555
file path=opt/util-tests/tests/awk/tests/T.overflow mode=0555
file path=opt/util-tests/tests/awk/tests/T.re mode=0555
-file path=opt/util-tests/tests/awk/tests/T.recache mode=0555
file path=opt/util-tests/tests/awk/tests/T.redir mode=0555
file path=opt/util-tests/tests/awk/tests/T.split mode=0555
file path=opt/util-tests/tests/awk/tests/T.sub mode=0555
diff --git a/usr/src/test/util-tests/tests/awk/examples/awk/t.crlf b/usr/src/test/util-tests/tests/awk/examples/awk/t.crlf
new file mode 100644
index 0000000000..c5f51ae0fc
--- /dev/null
+++ b/usr/src/test/util-tests/tests/awk/examples/awk/t.crlf
@@ -0,0 +1,4 @@
+# checks whether lines with crlf are parsed ok
+
+{print \
+ }
diff --git a/usr/src/test/util-tests/tests/awk/examples/out/t.crlf b/usr/src/test/util-tests/tests/awk/examples/out/t.crlf
new file mode 100644
index 0000000000..be3dbf6155
--- /dev/null
+++ b/usr/src/test/util-tests/tests/awk/examples/out/t.crlf
@@ -0,0 +1,199 @@
+/dev/rrp3:
+
+17379 mel
+16693 bwk me
+16116 ken him someone else
+15713 srb
+11895 lem
+10409 scj
+10252 rhm
+ 9853 shen
+ 9748 a68
+ 9492 sif
+ 9190 pjw
+ 8912 nls
+ 8895 dmr
+ 8491 cda
+ 8372 bs
+ 8252 llc
+ 7450 mb
+ 7360 ava
+ 7273 jrv
+ 7080 bin
+ 7063 greg
+ 6567 dict
+ 6462 lck
+ 6291 rje
+ 6211 lwf
+ 5671 dave
+ 5373 jhc
+ 5220 agf
+ 5167 doug
+ 5007 valerie
+ 3963 jca
+ 3895 bbs
+ 3796 moh
+ 3481 xchar
+ 3200 tbl
+ 2845 s
+ 2774 tgs
+ 2641 met
+ 2566 jck
+ 2511 port
+ 2479 sue
+ 2127 root
+ 1989 bsb
+ 1989 jeg
+ 1933 eag
+ 1801 pdj
+ 1590 tpc
+ 1385 cvw
+ 1370 rwm
+ 1316 avg
+ 1205 eg
+ 1194 jam
+ 1153 dl
+ 1150 lgm
+ 1031 cmb
+ 1018 jwr
+ 950 gdb
+ 931 marc
+ 898 usg
+ 865 ggr
+ 822 daemon
+ 803 mihalis
+ 700 honey
+ 624 tad
+ 559 acs
+ 541 uucp
+ 523 raf
+ 495 adh
+ 456 kec
+ 414 craig
+ 386 donmac
+ 375 jj
+ 348 ravi
+ 344 drw
+ 327 stars
+ 288 mrg
+ 272 jcb
+ 263 ralph
+ 253 tom
+ 251 sjb
+ 248 haight
+ 224 sharon
+ 222 chuck
+ 213 dsj
+ 201 bill
+ 184 god
+ 176 sys
+ 166 meh
+ 163 jon
+ 144 dan
+ 143 fox
+ 123 dale
+ 116 kab
+ 95 buz
+ 80 asc
+ 79 jas
+ 79 trt
+ 64 wsb
+ 62 dwh
+ 56 ktf
+ 54 lr
+ 47 dlc
+ 45 dls
+ 45 jwf
+ 44 mash
+ 43 ars
+ 43 vgl
+ 37 jfo
+ 32 rab
+ 31 pd
+ 29 jns
+ 25 spm
+ 22 rob
+ 15 egb
+ 10 hm
+ 10 mhb
+ 6 aed
+ 6 cpb
+ 5 evp
+ 4 ber
+ 4 men
+ 4 mitch
+ 3 ast
+ 3 jfr
+ 3 lax
+ 3 nel
+ 2 blue
+ 2 jfk
+ 2 njas
+ 1 122sec
+ 1 ddwar
+ 1 gopi
+ 1 jk
+ 1 learn
+ 1 low
+ 1 nac
+ 1 sidor
+1root:EMpNB8Zp56:0:0:Super-User,,,,,,,:/:/bin/sh
+2roottcsh:*:0:0:Super-User running tcsh [cbm]:/:/bin/tcsh
+3sysadm:*:0:0:System V Administration:/usr/admin:/bin/sh
+4diag:*:0:996:Hardware Diagnostics:/usr/diags:/bin/csh
+5daemon:*:1:1:daemons:/:/bin/sh
+6bin:*:2:2:System Tools Owner:/bin:/dev/null
+7nuucp:BJnuQbAo:6:10:UUCP.Admin:/usr/spool/uucppublic:/usr/lib/uucp/uucico
+8uucp:*:3:5:UUCP.Admin:/usr/lib/uucp:
+9sys:*:4:0:System Activity Owner:/usr/adm:/bin/sh
+10adm:*:5:3:Accounting Files Owner:/usr/adm:/bin/sh
+11lp:*:9:9:Print Spooler Owner:/var/spool/lp:/bin/sh
+12auditor:*:11:0:Audit Activity Owner:/auditor:/bin/sh
+13dbadmin:*:12:0:Security Database Owner:/dbadmin:/bin/sh
+14bootes:dcon:50:1:Tom Killian (DO NOT REMOVE):/tmp:
+15cdjuke:dcon:51:1:Tom Killian (DO NOT REMOVE):/tmp:
+16rfindd:*:66:1:Rfind Daemon and Fsdump:/var/rfindd:/bin/sh
+17EZsetup:*:992:998:System Setup:/var/sysadmdesktop/EZsetup:/bin/csh
+18demos:*:993:997:Demonstration User:/usr/demos:/bin/csh
+19tutor:*:994:997:Tutorial User:/usr/tutor:/bin/csh
+20tour:*:995:997:IRIS Space Tour:/usr/people/tour:/bin/csh
+21guest:nfP4/Wpvio/Rw:998:998:Guest Account:/usr/people/guest:/bin/csh
+224Dgifts:0nWRTZsOMt.:999:998:4Dgifts Account:/usr/people/4Dgifts:/bin/csh
+23nobody:*:60001:60001:SVR4 nobody uid:/dev/null:/dev/null
+24noaccess:*:60002:60002:uid no access:/dev/null:/dev/null
+25nobody:*:-2:-2:original nobody uid:/dev/null:/dev/null
+26rje:*:8:8:RJE Owner:/usr/spool/rje:
+27changes:*:11:11:system change log:/:
+28dist:sorry:9999:4:file distributions:/v/adm/dist:/v/bin/sh
+29man:*:99:995:On-line Manual Owner:/:
+30phoneca:*:991:991:phone call log [tom]:/v/adm/log:/v/bin/sh
+1r oot EMpNB8Zp56 0 0 Super-User,,,,,,, / /bin/sh
+2r oottcsh * 0 0 Super-User running tcsh [cbm] / /bin/tcsh
+3s ysadm * 0 0 System V Administration /usr/admin /bin/sh
+4d iag * 0 996 Hardware Diagnostics /usr/diags /bin/csh
+5d aemon * 1 1 daemons / /bin/sh
+6b in * 2 2 System Tools Owner /bin /dev/null
+7n uucp BJnuQbAo 6 10 UUCP.Admin /usr/spool/uucppublic /usr/lib/uucp/uucico
+8u ucp * 3 5 UUCP.Admin /usr/lib/uucp
+9s ys * 4 0 System Activity Owner /usr/adm /bin/sh
+10 adm * 5 3 Accounting Files Owner /usr/adm /bin/sh
+11 lp * 9 9 Print Spooler Owner /var/spool/lp /bin/sh
+12 auditor * 11 0 Audit Activity Owner /auditor /bin/sh
+13 dbadmin * 12 0 Security Database Owner /dbadmin /bin/sh
+14 bootes dcon 50 1 Tom Killian (DO NOT REMOVE) /tmp
+15 cdjuke dcon 51 1 Tom Killian (DO NOT REMOVE) /tmp
+16 rfindd * 66 1 Rfind Daemon and Fsdump /var/rfindd /bin/sh
+17 EZsetup * 992 998 System Setup /var/sysadmdesktop/EZsetup /bin/csh
+18 demos * 993 997 Demonstration User /usr/demos /bin/csh
+19 tutor * 994 997 Tutorial User /usr/tutor /bin/csh
+20 tour * 995 997 IRIS Space Tour /usr/people/tour /bin/csh
+21 guest nfP4/Wpvio/Rw 998 998 Guest Account /usr/people/guest /bin/csh
+22 4Dgifts 0nWRTZsOMt. 999 998 4Dgifts Account /usr/people/4Dgifts /bin/csh
+23 nobody * 60001 60001 SVR4 nobody uid /dev/null /dev/null
+24 noaccess * 60002 60002 uid no access /dev/null /dev/null
+25 nobody * -2 -2 original nobody uid /dev/null /dev/null
+26 rje * 8 8 RJE Owner /usr/spool/rje
+27 changes * 11 11 system change log /
+28 dist sorry 9999 4 file distributions /v/adm/dist /v/bin/sh
+29 man * 99 995 On-line Manual Owner /
+30 phoneca * 991 991 phone call log [tom] /v/adm/log /v/bin/sh
diff --git a/usr/src/test/util-tests/tests/awk/gnu/regeq.awk b/usr/src/test/util-tests/tests/awk/gnu/regeq.awk
new file mode 100644
index 0000000000..0208eb24cf
--- /dev/null
+++ b/usr/src/test/util-tests/tests/awk/gnu/regeq.awk
@@ -0,0 +1,29 @@
+#Date: Sat, 8 May 1999 17:42:20 +0200
+#From: Iva Cabric <ivac@fly.srk.fer.hr>
+#To: bug-gnu-utils@gnu.org
+#Cc: arnold@gnu.org
+#Subject: Problem in gawk with match
+#
+#Hello,
+#
+#gawk reports fatal error in match when first character in regexp is "=" :
+#
+#$ gawk '{ where = match($0, /=a/); print where}'
+#gawk: cmd. line:1: { where = match($0, /=a/); print where}
+#gawk: cmd. line:1: ^ parse error
+#gawk: cmd. line:1: fatal: match() cannot have 0 arguments
+#
+#Using "\=" instead "=" works without problems :
+#
+#$ gawk '{ where = match($0, /\=a/); print where}'
+#sdgfa
+#0
+#asdfds=a
+#7
+#
+#Other versions of awk have no problems with "/=/" (except oawk on SunOS).
+#
+#--
+# @
+#
+{ where = match($0, /=a/); print where}
diff --git a/usr/src/test/util-tests/tests/awk/gnu/regeq.in b/usr/src/test/util-tests/tests/awk/gnu/regeq.in
new file mode 100644
index 0000000000..2428df3aa7
--- /dev/null
+++ b/usr/src/test/util-tests/tests/awk/gnu/regeq.in
@@ -0,0 +1,2 @@
+sdgfa
+asdfds=a
diff --git a/usr/src/test/util-tests/tests/awk/gnu/regeq.ok b/usr/src/test/util-tests/tests/awk/gnu/regeq.ok
new file mode 100644
index 0000000000..4596f886c3
--- /dev/null
+++ b/usr/src/test/util-tests/tests/awk/gnu/regeq.ok
@@ -0,0 +1,2 @@
+0
+7
diff --git a/usr/src/test/util-tests/tests/awk/syn/aryprm2.ok b/usr/src/test/util-tests/tests/awk/syn/aryprm2.ok
index e1974ff31d..bc4268be76 100644
--- a/usr/src/test/util-tests/tests/awk/syn/aryprm2.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/aryprm2.ok
@@ -1,6 +1,6 @@
-$AWK: you can only delete array[element] at source line 3 in function f
+$AWK: you can only delete array[element] at source line 3 in function f source file aryprm2.awk
context is
delete a >>>
<<<
-$AWK: syntax error at source line 3 in function f
-$AWK: illegal statement at source line 3 in function f
+$AWK: syntax error at source line 3 in function f source file aryprm2.awk
+$AWK: illegal statement at source line 3 in function f source file aryprm2.awk
diff --git a/usr/src/test/util-tests/tests/awk/syn/badassign1.ok b/usr/src/test/util-tests/tests/awk/syn/badassign1.ok
index 63195088bc..43494bce4b 100644
--- a/usr/src/test/util-tests/tests/awk/syn/badassign1.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/badassign1.ok
@@ -1,4 +1,4 @@
-$AWK: syntax error at source line 1
+$AWK: syntax error at source line 1 source file badassign1.awk
context is
BEGIN { $i++ >>> = <<< 3 ; print i }
-$AWK: illegal statement at source line 1
+$AWK: illegal statement at source line 1 source file badassign1.awk
diff --git a/usr/src/test/util-tests/tests/awk/syn/badbuild.ok b/usr/src/test/util-tests/tests/awk/syn/badbuild.ok
index bebca97297..230134520d 100644
--- a/usr/src/test/util-tests/tests/awk/syn/badbuild.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/badbuild.ok
@@ -1,4 +1,4 @@
-$AWK: syntax error at source line 1
+$AWK: syntax error at source line 1 source file badbuild.awk
context is
$1 == $2 >>> == <<<
$AWK: bailing out at source line 1
diff --git a/usr/src/test/util-tests/tests/awk/syn/delfunc.ok b/usr/src/test/util-tests/tests/awk/syn/delfunc.ok
index 52bdbc462d..9f9e74f6ae 100644
--- a/usr/src/test/util-tests/tests/awk/syn/delfunc.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/delfunc.ok
@@ -1,4 +1,4 @@
-$AWK: you can only delete array[element] at source line 5 in function f
+$AWK: you can only delete array[element] at source line 5 in function f source file delfunc.awk
context is
delete f >>>
<<<
diff --git a/usr/src/test/util-tests/tests/awk/syn/fnarray.ok b/usr/src/test/util-tests/tests/awk/syn/fnarray.ok
index 2575d2591f..aec63d5d7a 100644
--- a/usr/src/test/util-tests/tests/awk/syn/fnarray.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/fnarray.ok
@@ -1,3 +1,3 @@
-$AWK: foo is a function, not an array at source line 5
+$AWK: foo is a function, not an array at source line 5 source file fnarray.awk
context is
Num = >>> foo[c] <<<
diff --git a/usr/src/test/util-tests/tests/awk/syn/fnmisc.ok b/usr/src/test/util-tests/tests/awk/syn/fnmisc.ok
index 7f9d5e7e6d..906113aaa7 100644
--- a/usr/src/test/util-tests/tests/awk/syn/fnmisc.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/fnmisc.ok
@@ -1,4 +1,4 @@
-$AWK: syntax error at source line 11
+$AWK: syntax error at source line 11 source file fnmisc.awk
context is
function >>> split <<< (x) { return x }
$AWK: bailing out at source line 11
diff --git a/usr/src/test/util-tests/tests/awk/syn/noparms.ok b/usr/src/test/util-tests/tests/awk/syn/noparms.ok
index 6d523bf86e..ca7fa3085f 100644
--- a/usr/src/test/util-tests/tests/awk/syn/noparms.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/noparms.ok
@@ -1,4 +1,4 @@
-$AWK: syntax error at source line 1 in function x
+$AWK: syntax error at source line 1 in function x source file noparms.awk
context is
function x(a, b, c , >>> , <<<
$AWK: bailing out at source line 1 in function x
diff --git a/usr/src/test/util-tests/tests/awk/syn/nulinsrc.ok b/usr/src/test/util-tests/tests/awk/syn/nulinsrc.ok
index d0b7cb139a..605a39fc6b 100644
--- a/usr/src/test/util-tests/tests/awk/syn/nulinsrc.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/nulinsrc.ok
@@ -1,4 +1,3 @@
-$AWK: syntax error at source line 1
+$AWK: non-terminated regular expression \... at source line 1
context is
>>> /\ <<<
-$AWK: bailing out at source line 1
diff --git a/usr/src/test/util-tests/tests/awk/syn/parseme.ok b/usr/src/test/util-tests/tests/awk/syn/parseme.ok
index 1b517e1eca..00fc855b10 100644
--- a/usr/src/test/util-tests/tests/awk/syn/parseme.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/parseme.ok
@@ -1,5 +1,5 @@
-$AWK: syntax error at source line 1
+$AWK: syntax error at source line 1 source file parseme.awk
context is
BEGIN { >>> toupper(substr* <<< line,1,12)) }
-$AWK: illegal statement at source line 1
+$AWK: illegal statement at source line 1 source file parseme.awk
extra )
diff --git a/usr/src/test/util-tests/tests/awk/syn/synerr1.ok b/usr/src/test/util-tests/tests/awk/syn/synerr1.ok
index ef8e46dac5..9201971c04 100644
--- a/usr/src/test/util-tests/tests/awk/syn/synerr1.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/synerr1.ok
@@ -1,4 +1,4 @@
-$AWK: syntax error at source line 4
+$AWK: syntax error at source line 4 source file synerr1.awk
context is
>>> print <<< "hi"
$AWK: bailing out at source line 4
diff --git a/usr/src/test/util-tests/tests/awk/syn/synerr2.ok b/usr/src/test/util-tests/tests/awk/syn/synerr2.ok
index 7b778e2e5b..1eb51dd0ac 100644
--- a/usr/src/test/util-tests/tests/awk/syn/synerr2.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/synerr2.ok
@@ -1,4 +1,4 @@
-$AWK: syntax error at source line 47
+$AWK: syntax error at source line 47 source file synerr2.awk
context is
BEGIN { sprintf("%s", >>> $) <<< }
-$AWK: illegal statement at source line 47
+$AWK: illegal statement at source line 47 source file synerr2.awk
diff --git a/usr/src/test/util-tests/tests/awk/syn/tradanch1.ok b/usr/src/test/util-tests/tests/awk/syn/tradanch1.ok
index 8d07ab4dfb..194330a35e 100644
--- a/usr/src/test/util-tests/tests/awk/syn/tradanch1.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/tradanch1.ok
@@ -1,4 +1,4 @@
$AWK: syntax error in regular expression foo^bar at bar
- source line number 1
+ source line number 1 source file tradanch1.awk
context is
>>> /foo^bar/ <<<
diff --git a/usr/src/test/util-tests/tests/awk/syn/unterm.ok b/usr/src/test/util-tests/tests/awk/syn/unterm.ok
index 4c32fcf95b..393b31b74a 100644
--- a/usr/src/test/util-tests/tests/awk/syn/unterm.ok
+++ b/usr/src/test/util-tests/tests/awk/syn/unterm.ok
@@ -1,5 +1,5 @@
-$AWK: syntax error at source line 1
+$AWK: non-terminated string ............. at source line 1
context is
>>> BEGIN{x=".........................................................................................................................................................................................................................................................} <<<
-$AWK: illegal statement at source line 1
- missing }
+$AWK: giving up
+ source line number 1
diff --git a/usr/src/test/util-tests/tests/awk/tests/T.-f-f b/usr/src/test/util-tests/tests/awk/tests/T.-f-f
index 57679a6f8b..73f0bcdcb1 100755
--- a/usr/src/test/util-tests/tests/awk/tests/T.-f-f
+++ b/usr/src/test/util-tests/tests/awk/tests/T.-f-f
@@ -20,6 +20,7 @@ TEMP2=$WORKDIR/test.temp.2
TEMP3=$WORKDIR/test.temp.3
TEMP4=$WORKDIR/test.temp.4
TEMP5=$WORKDIR/test.temp.5
+TEMP6=$WORKDIR/test.temp.6
echo 'begin
end' > $TEMP0
@@ -41,4 +42,15 @@ echo '}' > $TEMP4
$AWK -f $TEMP2 -f $TEMP3 -f $TEMP4 /etc/passwd > $TEMP5
diff $TEMP1 $TEMP5 || fail 'BAD: T.-f-f 3 files'
+
+echo '/./ {' > $TEMP2
+echo 'print' > $TEMP3
+echo '
+
+
+
+]' > $TEMP4
+$AWK -f $TEMP2 -f $TEMP3 -f $TEMP4 /etc/passwd > $TEMP5 2> $TEMP6
+grep "syntax error.*file $TEMP4" $TEMP6 >/dev/null 2>&1 || fail 'BAD: T.-f-f source file name'
+
exit $RESULT
diff --git a/usr/src/test/util-tests/tests/awk/tests/T.errmsg b/usr/src/test/util-tests/tests/awk/tests/T.errmsg
index 7bcae73d51..3c0d43fd4f 100755
--- a/usr/src/test/util-tests/tests/awk/tests/T.errmsg
+++ b/usr/src/test/util-tests/tests/awk/tests/T.errmsg
@@ -43,6 +43,12 @@ nonterminated character class
/[[/
nonterminated character class
+/[]/
+
+nonterminated character class
+/[\
+
+nonterminated character class
BEGIN { s = "[x"; if (1 ~ s) print "foo"}
syntax error in regular expression
@@ -95,6 +101,10 @@ function x() { function g() {} }
return not in function
{ return }
+non-terminated string
+{ print "abc
+}
+
illegal field $(foo)
BEGIN { print $"foo" }
diff --git a/usr/src/test/util-tests/tests/awk/tests/T.latin1 b/usr/src/test/util-tests/tests/awk/tests/T.latin1
index 792578212c..84f87e8ad0 100755
--- a/usr/src/test/util-tests/tests/awk/tests/T.latin1
+++ b/usr/src/test/util-tests/tests/awk/tests/T.latin1
@@ -32,6 +32,10 @@ $AWK '{ gsub(/\351/, "\370"); print }' latin1 > $TEMP0
$AWK '{ gsub(/é/, "ø"); print }' latin1 > $TEMP1
diff $TEMP0 $TEMP1 || fail 'BAD: T.latin1 3'
+$AWK '{ gsub(/[^\300-\370]/, ""); print }' latin1 > $TEMP0
+$AWK '{ gsub(/[^À-ø]/, ""); print } ' latin1 > $TEMP1
+diff $TEMP0 $TEMP1 || fail 'BAD: T.latin1 4'
+
echo '/á/' > $TEMP1
$AWK -f $TEMP1 $TEMP1 > $TEMP2
diff $TEMP1 $TEMP2 || fail 'BAD: T.latin1 5'
diff --git a/usr/src/test/util-tests/tests/awk/tests/T.misc b/usr/src/test/util-tests/tests/awk/tests/T.misc
index 748705c60d..6909f4155e 100755
--- a/usr/src/test/util-tests/tests/awk/tests/T.misc
+++ b/usr/src/test/util-tests/tests/awk/tests/T.misc
@@ -401,6 +401,23 @@ $AWK .++. 2> $TEMP0
grep "syntax error" $TEMP0 >/dev/null || fail "BAD: T.misc syntax error .++. fails"
+
+# These should be syntax errors
+$AWK '$' 2> $TEMP0
+grep "unexpected" $TEMP0 >/dev/null || fail "BAD: T.misc syntax error $ fails"
+
+$AWK '{print $' 2> $TEMP0
+grep "unexpected" $TEMP0 >/dev/null || fail "BAD: T.misc syntax error \$2 fails"
+
+$AWK '"' 2> $TEMP0
+grep "non-terminated" $TEMP0 >/dev/null || fail "BAD: T.misc bare quote fails"
+
+
+# non-terminated RE
+
+$AWK /xyz > $TEMP0 2>&1
+grep "non-terminated" $TEMP0 >/dev/null || fail "BAD: T.misc non-terminated RE"
+
# next several were infinite loops, found by brian tsang.
# this is his example:
diff --git a/usr/src/test/util-tests/tests/awk/tests/T.re b/usr/src/test/util-tests/tests/awk/tests/T.re
index 54b5a60ac3..8bf704d9bf 100755
--- a/usr/src/test/util-tests/tests/awk/tests/T.re
+++ b/usr/src/test/util-tests/tests/awk/tests/T.re
@@ -55,6 +55,12 @@ a ~ a
!~ ""
x
xxxxx
+= ~ =
+ b=
+ b=b
+ !~ ""
+ x
+ xxxxx
. ~ x
xxx
!~ ""