summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1999-04-20 17:31:32 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1999-04-20 17:31:32 +0000
commitd72f441b3c28e850b7b66eb6dc6566ab02b32b8b (patch)
tree0858922a5e05213e15a0328818ce90c35cfccef2
parent591150a7e3c5f1b66b2b893003130e19de7d3e0b (diff)
April 16, 1999 version of the "one true awk"--64-bit fixes and more.
-rw-r--r--usr.bin/awk/FIXES29
-rw-r--r--usr.bin/awk/OpenBSD-PATCHES6
-rw-r--r--usr.bin/awk/awk.h16
-rw-r--r--usr.bin/awk/awkgram.y27
-rw-r--r--usr.bin/awk/b.c27
-rw-r--r--usr.bin/awk/lex.c21
-rw-r--r--usr.bin/awk/lib.c12
-rw-r--r--usr.bin/awk/main.c13
-rw-r--r--usr.bin/awk/parse.c14
-rw-r--r--usr.bin/awk/proto.h7
-rw-r--r--usr.bin/awk/run.c151
-rw-r--r--usr.bin/awk/tran.c6
12 files changed, 191 insertions, 138 deletions
diff --git a/usr.bin/awk/FIXES b/usr.bin/awk/FIXES
index 72e432fa4d8..57adced3156 100644
--- a/usr.bin/awk/FIXES
+++ b/usr.bin/awk/FIXES
@@ -1,4 +1,4 @@
-/* $OpenBSD: FIXES,v 1.7 1999/04/18 17:06:29 millert Exp $ */
+/* $OpenBSD: FIXES,v 1.8 1999/04/20 17:31:25 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -26,6 +26,33 @@ THIS SOFTWARE.
This file lists all bug fixes, changes, etc., made since the AWK book
was sent to the printers in August, 1987.
+Apr 16, 1999:
+ with code kindly provided by Bruce Lilly, awk now parses
+ /=/ and similar constructs more sensibly in more places.
+
+Apr 5, 1999:
+ changed true/false to True/False in run.c to make it
+ easier to compile with C++. Added some casts on malloc
+ and realloc to be honest about casts; ditto. changed
+ ltype int to long in struct rrow to reduce some 64-bit
+ complaints; other changes scattered throughout for the
+ same purpose. thanks to Nelson Beebe for these portability
+ improvements.
+
+ removed some horrible pointer-int casting in b.c and elsewhere
+ by adding ptoi and itonp to localize the casts, which are
+ all benign. fixed one incipient bug that showed up on sgi
+ in 64-bit mode.
+
+ reset lineno for new source file; include filename in error
+ message. also fixed line number error in continuation lines.
+ (thanks to Nelson Beebe for both of these.)
+
+Mar 24, 1999:
+ Nelson Beebe notes that irix 5.3 yacc dies with a bogus
+ error; use a newer version or switch to bison, since sgi
+ is unlikely to fix it.
+
Mar 5, 1999:
after hearing from yet another innocent victim, changed
isnumber to is_number to avoid the problem caused by
diff --git a/usr.bin/awk/OpenBSD-PATCHES b/usr.bin/awk/OpenBSD-PATCHES
index f64aee79124..7349b5d801d 100644
--- a/usr.bin/awk/OpenBSD-PATCHES
+++ b/usr.bin/awk/OpenBSD-PATCHES
@@ -1,6 +1,6 @@
-/* $OpenBSD: OpenBSD-PATCHES,v 1.3 1999/04/18 17:06:29 millert Exp $ */
+/* $OpenBSD: OpenBSD-PATCHES,v 1.4 1999/04/20 17:31:28 millert Exp $ */
-I merged the March 5, 1999 version of the "one true awk" from Brian Kernighan's
+I merged the April 16, 1999 version of the "one true awk" from Brian Kernighan's
web page http://cm.bell-labs.com/who/bwk/
Mods to the distribution sources:
@@ -38,7 +38,7 @@ Let me know if you find more problems.
--- /home/millert/tmp/awk/awk.1 Sun Jan 19 18:06:25 1997
+++ awk.1 Sun Jan 19 17:51:39 1997
@@ -1,3 +1,4 @@
-+.\" $OpenBSD: OpenBSD-PATCHES,v 1.3 1999/04/18 17:06:29 millert Exp $
++.\" $OpenBSD: OpenBSD-PATCHES,v 1.4 1999/04/20 17:31:28 millert Exp $
.de EX
.nf
.ft CW
diff --git a/usr.bin/awk/awk.h b/usr.bin/awk/awk.h
index 3a391239334..a1285e5ed90 100644
--- a/usr.bin/awk/awk.h
+++ b/usr.bin/awk/awk.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: awk.h,v 1.5 1997/08/25 16:17:09 kstailey Exp $ */
+/* $OpenBSD: awk.h,v 1.6 1999/04/20 17:31:28 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -84,7 +84,7 @@ typedef struct Cell {
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 */
+ int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
struct Cell *cnext; /* ptr to next if chained */
} Cell;
@@ -137,7 +137,7 @@ typedef struct Node {
struct Node *nnext;
int lineno;
int nobj;
- struct Node *narg[1]; /* variable: actual size set by calling malloc */
+ struct Node *narg[1]; /* variable: actual size set by calling malloc */
} Node;
#define NIL ((Node *) 0)
@@ -210,7 +210,7 @@ extern int pairstack[], paircnt;
#define NSTATES 32
typedef struct rrow {
- int ltype;
+ long ltype; /* long avoids pointer warnings on 64-bit */
union {
int i;
Node *np;
@@ -220,17 +220,17 @@ typedef struct rrow {
} rrow;
typedef struct fa {
+ uschar gototab[NSTATES][NCHARS];
+ uschar out[NSTATES];
char *restr;
+ int *posns[NSTATES];
int anchor;
int use;
- uschar gototab[NSTATES][NCHARS];
- int *posns[NSTATES];
- uschar out[NSTATES];
int initstat;
int curstat;
int accept;
int reset;
- struct rrow re[1];
+ struct rrow re[1]; /* variable: actual size set by calling malloc */
} fa;
diff --git a/usr.bin/awk/awkgram.y b/usr.bin/awk/awkgram.y
index bd751e3e8f7..191fc8f9a5a 100644
--- a/usr.bin/awk/awkgram.y
+++ b/usr.bin/awk/awkgram.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: awkgram.y,v 1.4 1997/08/25 16:17:09 kstailey Exp $ */
+/* $OpenBSD: awkgram.y,v 1.5 1999/04/20 17:31:29 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -241,10 +241,10 @@ pattern:
| '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); }
| pattern '|' GETLINE var {
if (safe) ERROR "cmd | getline is unsafe" SYNTAX;
- else $$ = op3(GETLINE, $4, (Node*)$2, $1); }
+ else $$ = op3(GETLINE, $4, itonp($2), $1); }
| pattern '|' GETLINE {
if (safe) ERROR "cmd | getline is unsafe" SYNTAX;
- else $$ = op3(GETLINE, (Node*)0, (Node*)$2, $1); }
+ else $$ = op3(GETLINE, (Node*)0, itonp($2), $1); }
| pattern term %prec CAT { $$ = op2(CAT, $1, $2); }
| re
| term
@@ -295,13 +295,13 @@ rparen:
simple_stmt:
print prarg '|' term {
if (safe) ERROR "print | is unsafe" SYNTAX;
- else $$ = stat3($1, $2, (Node *) $3, $4); }
+ else $$ = stat3($1, $2, itonp($3), $4); }
| print prarg APPEND term {
if (safe) ERROR "print >> is unsafe" SYNTAX;
- else $$ = stat3($1, $2, (Node *) $3, $4); }
+ else $$ = stat3($1, $2, itonp($3), $4); }
| print prarg GT term {
if (safe) ERROR "print > is unsafe" SYNTAX;
- else $$ = stat3($1, $2, (Node *) $3, $4); }
+ else $$ = stat3($1, $2, itonp($3), $4); }
| print prarg { $$ = stat3($1, $2, NIL, NIL); }
| DELETE varname '[' patlist ']' { $$ = stat2(DELETE, makearr($2), $4); }
| DELETE varname { $$ = stat2(DELETE, makearr($2), 0); }
@@ -351,7 +351,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); }
@@ -360,17 +361,17 @@ term:
| '-' term %prec UMINUS { $$ = op1(UMINUS, $2); }
| '+' term %prec UMINUS { $$ = $2; }
| NOT term %prec UMINUS { $$ = op1(NOT, notnull($2)); }
- | BLTIN '(' ')' { $$ = op2(BLTIN, (Node *) $1, rectonode()); }
- | BLTIN '(' patlist ')' { $$ = op2(BLTIN, (Node *) $1, $3); }
- | BLTIN { $$ = op2(BLTIN, (Node *) $1, rectonode()); }
+ | 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 ')'
@@ -433,7 +434,7 @@ varlist:
varname:
VAR { $$ = celltonode($1, CVAR); }
- | ARG { $$ = op1(ARG, (Node *) $1); }
+ | ARG { $$ = op1(ARG, itonp($1)); }
| VARNF { $$ = op1(VARNF, (Node *) $1); }
;
diff --git a/usr.bin/awk/b.c b/usr.bin/awk/b.c
index 0553dedbdda..5722d3a30e1 100644
--- a/usr.bin/awk/b.c
+++ b/usr.bin/awk/b.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: b.c,v 1.6 1999/04/18 17:06:30 millert Exp $ */
+/* $OpenBSD: b.c,v 1.7 1999/04/20 17:31:29 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -38,7 +38,8 @@ THIS SOFTWARE.
/* NCHARS is 2**n */
#define MAXLIN 22
-#define type(v) (v)->nobj
+#define type(v) (v)->nobj /* badly overloaded here */
+#define info(v) (v)->ntype /* badly overloaded here */
#define left(v) (v)->narg[0]
#define right(v) (v)->narg[1]
#define parent(v) (v)->nnext
@@ -183,7 +184,7 @@ void penter(Node *p) /* set up parent pointers and leaf indices */
{
switch (type(p)) {
LEAF
- left(p) = (Node *) poscnt;
+ info(p) = poscnt;
poscnt++;
break;
UNARY
@@ -339,8 +340,8 @@ void cfoll(fa *f, Node *v) /* enter follow set of each leaf of vertex v into lfo
switch (type(v)) {
LEAF
- f->re[(int) left(v)].ltype = type(v);
- f->re[(int) left(v)].lval.np = right(v);
+ f->re[info(v)].ltype = type(v);
+ f->re[info(v)].lval.np = right(v);
while (f->accept >= maxsetvec) { /* guessing here! */
maxsetvec *= 4;
setvec = (int *) realloc(setvec, maxsetvec * sizeof(int));
@@ -354,7 +355,7 @@ void cfoll(fa *f, Node *v) /* enter follow set of each leaf of vertex v into lfo
follow(v); /* computes setvec and setcnt */
if ((p = (int *) calloc(1, (setcnt+1)*sizeof(int))) == NULL)
overflo("out of space building follow set");
- f->re[(int) left(v)].lfollow = p;
+ f->re[info(v)].lfollow = p;
*p = setcnt;
for (i = f->accept; i >= 0; i--)
if (setvec[i] == 1)
@@ -380,14 +381,13 @@ int first(Node *p) /* collects initially active leaves of p into setvec */
switch (type(p)) {
LEAF
- lp = (int) left(p); /* look for high-water mark of subscripts */
+ lp = info(p); /* look for high-water mark of subscripts */
while (setcnt >= maxsetvec || lp >= maxsetvec) { /* guessing here! */
maxsetvec *= 4;
setvec = (int *) realloc(setvec, maxsetvec * sizeof(int));
tmpset = (int *) realloc(tmpset, maxsetvec * sizeof(int));
- if (setvec == 0 || tmpset == 0) { abort();
+ if (setvec == 0 || tmpset == 0)
overflo("out of space in first()");
-}
}
if (setvec[lp] != 1) {
setvec[lp] = 1;
@@ -602,7 +602,7 @@ Node *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:
@@ -621,7 +621,7 @@ Node *primary(void)
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)));
@@ -754,9 +754,8 @@ int cgoto(fa *f, int s, int c)
maxsetvec *= 4;
setvec = (int *) realloc(setvec, maxsetvec * sizeof(int));
tmpset = (int *) realloc(tmpset, maxsetvec * sizeof(int));
- if (setvec == 0 || tmpset == 0) { abort();
+ if (setvec == 0 || tmpset == 0)
overflo("out of space in cgoto()");
-}
}
for (i = 0; i <= f->accept; i++)
setvec[i] = 0;
@@ -765,7 +764,7 @@ int cgoto(fa *f, int s, int c)
p = f->posns[s];
for (i = 1; i <= *p; i++) {
if ((k = f->re[p[i]].ltype) != FINAL) {
- if ((k == CHAR && c == f->re[p[i]].lval.i)
+ if ((k == CHAR && c == ptoi(f->re[p[i]].lval.np))
|| (k == DOT && c != 0 && c != HAT)
|| (k == ALL && c != 0)
|| (k == CCL && member(c, f->re[p[i]].lval.up))
diff --git a/usr.bin/awk/lex.c b/usr.bin/awk/lex.c
index 688128bdc7a..5540056222c 100644
--- a/usr.bin/awk/lex.c
+++ b/usr.bin/awk/lex.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lex.c,v 1.2 1999/04/18 17:06:30 millert Exp $ */
+/* $OpenBSD: lex.c,v 1.3 1999/04/20 17:31:29 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -164,9 +164,9 @@ int regexpr(void);
int sc = 0; /* 1 => return a } right now */
int reg = 0; /* 1 => return a REGEXPR now */
-int yylex()
+int yylex(void)
{
- int c, n;
+ int c;
static char *buf = 0;
static int bufsize = 500;
@@ -209,7 +209,7 @@ int yylex()
RET(';');
case '\\':
if (peek() == '\n') {
- input(); lineno++;
+ input();
} else if (peek() == '\r') {
input(); input(); /* \n */
lineno++;
@@ -284,10 +284,7 @@ int yylex()
} else
RET('*');
case '/':
- if (peek() == '=') {
- input(); yylval.i = DIVEQ; RET(ASGNOP);
- } else
- RET('/');
+ RET('/');
case '%':
if (peek() == '=') {
input(); yylval.i = MODEQ; RET(ASGNOP);
@@ -302,7 +299,7 @@ int yylex()
case '$':
/* BUG: awkward, if not wrong */
c = gettok(&buf, &bufsize);
- if (c == '(' || c == '[' || (infunc && (n=isarg(buf)) >= 0)) {
+ if (c == '(' || c == '[' || (infunc && isarg(buf) >= 0)) {
unputstr(buf);
RET(INDIRECT);
} else if (isalpha(c)) {
@@ -349,7 +346,7 @@ int yylex()
}
}
-int string()
+int string(void)
{
int c, n;
char *s, *bp;
@@ -378,7 +375,7 @@ int string()
case 'r': *bp++ = '\r'; break;
case 'b': *bp++ = '\b'; break;
case 'v': *bp++ = '\v'; break;
- case 'a': *bp++ = '\a'; break;
+ case 'a': *bp++ = '\007'; break;
case '\\': *bp++ = '\\'; break;
case '0': case '1': case '2': /* octal: \d \dd \ddd */
@@ -493,7 +490,7 @@ void startreg(void) /* next call to yyles will return a regular expression */
reg = 1;
}
-int regexpr()
+int regexpr(void)
{
int c;
static char *buf = 0;
diff --git a/usr.bin/awk/lib.c b/usr.bin/awk/lib.c
index 38660b4fac3..9706244dbc8 100644
--- a/usr.bin/awk/lib.c
+++ b/usr.bin/awk/lib.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: lib.c,v 1.5 1999/04/18 17:06:30 millert Exp $ */
+/* $OpenBSD: lib.c,v 1.6 1999/04/20 17:31:29 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -487,6 +487,8 @@ void yyerror(char *s)
fprintf(stderr, " at source line %d", lineno);
if (curfname != NULL)
fprintf(stderr, " in function %s", curfname);
+ if (compile_time == 1 && cursource() != NULL)
+ fprintf(stderr, " source file %s", cursource());
fprintf(stderr, "\n");
errorflag = 2;
eprint();
@@ -541,9 +543,12 @@ void error(int f, char *s)
fprintf(stderr, "\n");
}
if (compile_time != 2 && curnode)
- fprintf(stderr, " source line number %d\n", curnode->lineno);
+ fprintf(stderr, " source line number %d", curnode->lineno);
else if (compile_time != 2 && lineno)
- fprintf(stderr, " source line number %d\n", lineno);
+ fprintf(stderr, " source line number %d", lineno);
+ if (compile_time == 1 && cursource() != NULL)
+ fprintf(stderr, " source file %s", cursource());
+ fprintf(stderr, "\n");
eprint();
if (f) {
if (dbg > 1) /* core dump if serious debugging on */
@@ -602,7 +607,6 @@ void bclass(int c)
double errcheck(double x, char *s)
{
- extern int errno;
if (errno == EDOM) {
errno = 0;
diff --git a/usr.bin/awk/main.c b/usr.bin/awk/main.c
index 7fb6b080da5..3cc45ba8ceb 100644
--- a/usr.bin/awk/main.c
+++ b/usr.bin/awk/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.6 1999/04/18 17:06:30 millert Exp $ */
+/* $OpenBSD: main.c,v 1.7 1999/04/20 17:31:30 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -23,7 +23,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
****************************************************************/
-char *version = "version 990305";
+char *version = "version 19990416";
#define DEBUG
#include <stdio.h>
@@ -182,6 +182,7 @@ int pgetc(void) /* get 1 character from awk program */
yyin = stdin;
else if ((yyin = fopen(pfile[curpfile], "r")) == NULL)
ERROR "can't open file %s", pfile[curpfile] FATAL;
+ lineno = 1;
}
if ((c = getc(yyin)) != EOF)
return c;
@@ -191,3 +192,11 @@ int pgetc(void) /* get 1 character from awk program */
curpfile++;
}
}
+
+char *cursource(void) /* current source file name */
+{
+ if (npfile > 0)
+ return pfile[curpfile];
+ else
+ return NULL;
+}
diff --git a/usr.bin/awk/parse.c b/usr.bin/awk/parse.c
index 0fbe00d3e3d..429fdcaba7f 100644
--- a/usr.bin/awk/parse.c
+++ b/usr.bin/awk/parse.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.c,v 1.2 1997/08/25 16:17:13 kstailey Exp $ */
+/* $OpenBSD: parse.c,v 1.3 1999/04/20 17:31:30 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -208,7 +208,7 @@ Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */
{
Node *x;
- x = node4(PASTAT2, a, b, c, (Node *) paircnt);
+ x = node4(PASTAT2, a, b, c, itonp(paircnt));
if (paircnt++ >= PA2NUM)
ERROR "limited to %d pat,pat statements", PA2NUM SYNTAX;
x->ntype = NSTAT;
@@ -260,3 +260,13 @@ int isarg(char *s) /* is s in argument list for current function? */
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.bin/awk/proto.h b/usr.bin/awk/proto.h
index 4c109137d11..6e31c460320 100644
--- a/usr.bin/awk/proto.h
+++ b/usr.bin/awk/proto.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: proto.h,v 1.4 1999/04/18 17:06:30 millert Exp $ */
+/* $OpenBSD: proto.h,v 1.5 1999/04/20 17:31:30 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -66,6 +66,7 @@ extern int cgoto(fa *, int, int);
extern void freefa(fa *);
extern int pgetc(void);
+extern char *cursource(void);
extern Node *nodealloc(int);
extern Node *exptostat(Node *);
@@ -89,7 +90,9 @@ extern Node *linkum(Node *, Node *);
extern void defn(Cell *, Node *, Node *);
extern int isarg(char *);
extern char *tokname(int);
-extern Cell *(*proctab[])(Node **, int);
+extern Cell *(*proctab[])(Node **, int);
+extern int ptoi(void *);
+extern Node *itonp(int);
extern void syminit(void);
extern void arginit(int, char **);
diff --git a/usr.bin/awk/run.c b/usr.bin/awk/run.c
index 9a1c96c8b66..aa664b3580e 100644
--- a/usr.bin/awk/run.c
+++ b/usr.bin/awk/run.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: run.c,v 1.14 1999/04/18 17:06:31 millert Exp $ */
+/* $OpenBSD: run.c,v 1.15 1999/04/20 17:31:30 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -70,9 +70,9 @@ Node *winner = NULL; /* root of parse tree */
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 };
@@ -109,7 +109,7 @@ int adjbuf(char **pbuf, int *psiz, int minlen, int quantum, char **pbptr,
/* round up to next multiple of quantum */
if (rminlen)
minlen += quantum - rminlen;
- tbuf = realloc(*pbuf, minlen);
+ tbuf = (char *) realloc(*pbuf, minlen);
if (tbuf == NULL) {
if (whatrtn)
ERROR "out of memory in %s", whatrtn FATAL;
@@ -136,7 +136,7 @@ Cell *execute(Node *u) /* execute a node of the parse tree */
Node *a;
if (u == NULL)
- return(true);
+ return(True);
for (a = u; ; a = a->nnext) {
curnode = a;
if (isvalue(a)) {
@@ -175,7 +175,7 @@ Cell *program(Node **a, int n) /* execute an awk program */
if (a[0]) { /* BEGIN */
x = execute(a[0]);
if (isexit(x))
- return(true);
+ return(True);
if (isjump(x))
ERROR "illegal break, continue, next or nextfile from BEGIN" FATAL;
tempfree(x);
@@ -197,7 +197,7 @@ Cell *program(Node **a, int n) /* execute an awk program */
tempfree(x);
}
ex1:
- return(true);
+ return(True);
}
struct Frame { /* stack frame for awk function calls */
@@ -234,14 +234,14 @@ Cell *call(Node **a, int n) /* function call. very kludgy and fragile */
for (ncall = 0, x = a[1]; x != NULL; x = x->nnext) /* args in call */
ncall++;
ndef = (int) fcn->fval; /* args in defn */
- dprintf( ("calling %s, %d args (%d in defn), fp=%d\n", s, ncall, ndef, fp-frame) );
+ dprintf( ("calling %s, %d args (%d in defn), fp=%d\n", s, ncall, ndef, (int) (fp-frame)) );
if (ncall > ndef)
ERROR "function %s called with %d args, uses only %d",
s, ncall, ndef WARNING;
if (ncall + ndef > NARGS)
ERROR "function %s has %d arguments, limit %d", s, ncall+ndef, NARGS FATAL;
for (i = 0, x = a[1]; x != NULL; i++, x = x->nnext) { /* get call args */
- dprintf( ("evaluate args[%d], fp=%d:\n", i, fp-frame) );
+ dprintf( ("evaluate args[%d], fp=%d:\n", i, (int) (fp-frame)) );
y = execute(x);
oargs[i] = y;
dprintf( ("args[%d]: %s %f <%s>, t=%o\n",
@@ -272,9 +272,9 @@ Cell *call(Node **a, int n) /* function call. very kludgy and fragile */
fp->nargs = ndef; /* number defined with (excess are locals) */
fp->retval = gettemp();
- dprintf( ("start exec of %s, fp=%d\n", s, fp-frame) );
+ dprintf( ("start exec of %s, fp=%d\n", s, (int) (fp-frame)) );
y = execute((Node *)(fcn->sval)); /* execute body */
- dprintf( ("finished exec of %s, fp=%d\n", s, fp-frame) );
+ dprintf( ("finished exec of %s, fp=%d\n", s, (int) (fp-frame)) );
for (i = 0; i < ndef; i++) {
Cell *t = fp->args[i];
@@ -323,7 +323,7 @@ Cell *copycell(Cell *x) /* make a copy of a cell in a temp */
Cell *arg(Node **a, int n) /* nth argument of a function */
{
- 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",
@@ -382,6 +382,7 @@ Cell *getline(Node **a, int n) /* get next line from specific input */
FILE *fp;
char *buf;
int bufsize = recsize;
+ int mode;
if ((buf = (char *) malloc(bufsize)) == NULL)
ERROR "out of memory in getline" FATAL;
@@ -390,9 +391,10 @@ Cell *getline(Node **a, int n) /* get next line from specific input */
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));
+ mode = ptoi(a[1]);
+ if (mode == '|') /* input pipe */
+ mode = LE; /* arbitrary flag */
+ fp = openfile(mode, getsval(x));
tempfree(x);
if (fp == NULL)
n = -1;
@@ -442,7 +444,7 @@ Cell *array(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */
int bufsz = recsize;
int nsub = strlen(*SUBSEP);
- if ((buf = malloc(bufsz)) == NULL)
+ if ((buf = (char *) malloc(bufsz)) == NULL)
ERROR "out of memory in array" FATAL;
x = execute(a[0]); /* Cell* for symbol table */
@@ -482,7 +484,7 @@ Cell *awkdelete(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts *
x = execute(a[0]); /* Cell* for symbol table */
if (!isarr(x))
- return true;
+ return True;
if (a[1] == 0) { /* delete the elements, not the table */
freesymtab(x);
x->tval &= ~STR;
@@ -491,7 +493,7 @@ Cell *awkdelete(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts *
} else {
int bufsz = recsize;
char *buf;
- if ((buf = malloc(bufsz)) == NULL)
+ if ((buf = (char *) malloc(bufsz)) == NULL)
ERROR "out of memory in adelete" FATAL;
buf[0] = 0;
for (np = a[1]; np; np = np->nnext) {
@@ -508,7 +510,7 @@ Cell *awkdelete(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts *
free(buf);
}
tempfree(x);
- return true;
+ return True;
}
Cell *intest(Node **a, int n) /* a[0] is index (list), a[1] is symtab */
@@ -529,7 +531,7 @@ Cell *intest(Node **a, int n) /* a[0] is index (list), a[1] is symtab */
ap->tval |= ARR;
ap->sval = (char *) makesymtab(NSYMTAB);
}
- if ((buf = malloc(bufsz)) == NULL) {
+ if ((buf = (char *) malloc(bufsz)) == NULL) {
ERROR "out of memory in intest" FATAL;
}
buf[0] = 0;
@@ -547,9 +549,9 @@ Cell *intest(Node **a, int n) /* a[0] is index (list), a[1] is symtab */
tempfree(ap);
free(buf);
if (k == NULL)
- return(false);
+ return(False);
else
- return(true);
+ return(True);
}
@@ -588,9 +590,9 @@ Cell *matchop(Node **a, int n) /* ~ and match() */
x->fval = start;
return x;
} else if ((n == MATCH && i == 1) || (n == NOTMATCH && i == 0))
- return(true);
+ return(True);
else
- return(false);
+ return(False);
}
@@ -604,22 +606,22 @@ Cell *boolop(Node **a, int n) /* a[0] || a[1], a[0] && a[1], !a[0] */
tempfree(x);
switch (n) {
case BOR:
- if (i) return(true);
+ if (i) return(True);
y = execute(a[1]);
i = istrue(y);
tempfree(y);
- if (i) return(true);
- else return(false);
+ if (i) return(True);
+ else return(False);
case AND:
- if ( !i ) return(false);
+ if ( !i ) return(False);
y = execute(a[1]);
i = istrue(y);
tempfree(y);
- if (i) return(true);
- else return(false);
+ if (i) return(True);
+ else return(False);
case NOT:
- if (i) return(false);
- else return(true);
+ if (i) return(False);
+ else return(True);
default: /* can't happen */
ERROR "unknown boolean operator %d", n FATAL;
}
@@ -643,18 +645,18 @@ Cell *relop(Node **a, int n) /* a[0 < a[1], etc. */
tempfree(x);
tempfree(y);
switch (n) {
- case LT: if (i<0) return(true);
- else return(false);
- case LE: if (i<=0) return(true);
- else return(false);
- case NE: if (i!=0) return(true);
- else return(false);
- case EQ: if (i == 0) return(true);
- else return(false);
- case GE: if (i>=0) return(true);
- else return(false);
- case GT: if (i>0) return(true);
- else return(false);
+ case LT: if (i<0) return(True);
+ else return(False);
+ case LE: if (i<=0) return(True);
+ else return(False);
+ case NE: if (i!=0) return(True);
+ else return(False);
+ case EQ: if (i == 0) return(True);
+ else return(False);
+ case GE: if (i>=0) return(True);
+ else return(False);
+ case GT: if (i>0) return(True);
+ else return(False);
default: /* can't happen */
ERROR "unknown relational operator %d", n FATAL;
}
@@ -797,7 +799,7 @@ int format(char **pbuf, int *pbufsize, char *s, Node *a) /* printf-like conversi
os = s;
p = buf;
- if ((fmt = malloc(fmtsz)) == NULL)
+ if ((fmt = (char *) malloc(fmtsz)) == NULL)
ERROR "out of memory in format()" FATAL;
while (*s) {
adjbuf(&buf, &bufsize, MAXNUMSIZE+1+p-buf, recsize, &p, "format");
@@ -921,7 +923,7 @@ Cell *awksprintf(Node **a, int n) /* sprintf(a[0]) */
char *buf;
int bufsz=3*recsize;
- if ((buf=malloc(bufsz)) == NULL)
+ if ((buf = (char *) malloc(bufsz)) == NULL)
ERROR "out of memory in awksprintf" FATAL;
y = a[0]->nnext;
x = execute(a[0]);
@@ -944,7 +946,7 @@ Cell *awkprintf(Node **a, int n) /* printf */
int len;
int bufsz=3*recsize;
- if ((buf=malloc(bufsz)) == NULL)
+ if ((buf = (char *) malloc(bufsz)) == NULL)
ERROR "out of memory in awkprintf" FATAL;
y = a[0]->nnext;
x = execute(a[0]);
@@ -957,7 +959,7 @@ Cell *awkprintf(Node **a, int n) /* printf */
if (ferror(stdout))
ERROR "write error on stdout" FATAL;
} else {
- fp = redirect((int)a[1], a[2]);
+ fp = redirect(ptoi(a[1]), a[2]);
/* fputs(buf, fp); */
fwrite(buf, len, 1, fp);
fflush(fp);
@@ -965,7 +967,7 @@ Cell *awkprintf(Node **a, int n) /* printf */
ERROR "write error on %s", filename(fp) FATAL;
}
free(buf);
- return(true);
+ return(True);
}
Cell *arith(Node **a, int n) /* a[0] + a[1], etc. also -a[0] */
@@ -1163,7 +1165,7 @@ Cell *dopa2(Node **a, int n) /* a[0], a[1] { a[2] } */
Cell *x;
int pair;
- pair = (int) a[3];
+ pair = ptoi(a[3]);
if (pairstack[pair] == 0) {
x = execute(a[0]);
if (istrue(x))
@@ -1178,7 +1180,7 @@ Cell *dopa2(Node **a, int n) /* a[0], a[1] { a[2] } */
x = execute(a[2]);
return(x);
}
- return(false);
+ return(False);
}
Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
@@ -1187,16 +1189,17 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
char *s;
int sep;
char *t, temp, num[50], *fs = 0;
- int n, tempstat;
+ int n, tempstat, arg3type;
y = execute(a[0]); /* source string */
s = getsval(y);
+ arg3type = ptoi(a[3]);
if (a[2] == 0) /* 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)
+ } else if (arg3type == REGEXPR)
fs = "(regexpr)"; /* split(str,arr,/regexpr/) */
else
ERROR "illegal type of split" FATAL;
@@ -1209,9 +1212,9 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
ap->sval = (char *) makesymtab(NSYMTAB);
n = 0;
- if ((*s != '\0' && strlen(fs) > 1) || (int) a[3] == REGEXPR) { /* reg expr */
+ 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);
@@ -1301,7 +1304,7 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
}
tempfree(ap);
tempfree(y);
- if (a[2] != 0 && (int) a[3] == STRING)
+ if (a[2] != 0 && arg3type == STRING)
tempfree(x);
x = gettemp();
x->tval = NUM;
@@ -1350,7 +1353,7 @@ Cell *whilestat(Node **a, int n) /* while (a[0]) a[1] */
tempfree(x);
x = execute(a[1]);
if (isbreak(x)) {
- x = true;
+ x = True;
return(x);
}
if (isnext(x) || isexit(x) || isret(x))
@@ -1366,7 +1369,7 @@ Cell *dostat(Node **a, int n) /* do a[0]; while(a[1]) */
for (;;) {
x = execute(a[0]);
if (isbreak(x))
- return true;
+ return True;
if (isnext(x) || isnextfile(x) || isexit(x) || isret(x))
return(x);
tempfree(x);
@@ -1391,7 +1394,7 @@ Cell *forstat(Node **a, int n) /* for (a[0]; a[1]; a[2]) a[3] */
}
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);
@@ -1409,7 +1412,7 @@ Cell *instat(Node **a, int n) /* for (a[0] in a[1]) a[2] */
vp = execute(a[0]);
arrayp = execute(a[1]);
if (!isarr(arrayp)) {
- return true;
+ return True;
}
tp = (Array *) arrayp->sval;
tempfree(arrayp);
@@ -1420,7 +1423,7 @@ Cell *instat(Node **a, int n) /* for (a[0] in a[1]) a[2] */
x = execute(a[2]);
if (isbreak(x)) {
tempfree(vp);
- return true;
+ return True;
}
if (isnext(x) || isexit(x) || isret(x)) {
tempfree(vp);
@@ -1429,7 +1432,7 @@ Cell *instat(Node **a, int n) /* for (a[0] in a[1]) a[2] */
tempfree(x);
}
}
- return true;
+ return True;
}
Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg list */
@@ -1441,7 +1444,7 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
Node *nextarg;
FILE *fp;
- t = (int) a[0];
+ t = ptoi(a[0]);
x = execute(a[1]);
nextarg = a[1]->nnext;
switch (t) {
@@ -1532,7 +1535,7 @@ Cell *printstat(Node **a, int n) /* print a[0] */
if (a[1] == 0) /* 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);
fputs(getsval(y), fp);
@@ -1546,13 +1549,13 @@ Cell *printstat(Node **a, int n) /* print a[0] */
fflush(fp);
if (ferror(fp))
ERROR "write error on %s", filename(fp) FATAL;
- return(true);
+ return(True);
}
Cell *nullproc(Node **a, int n)
{
- n = 0;
- a = 0;
+ n = n;
+ a = a;
return 0;
}
@@ -1643,7 +1646,7 @@ Cell *closefile(Node **a, int n)
Cell *x;
int i, stat;
- n = 0;
+ n = n;
x = execute(a[0]);
getsval(x);
for (i = 0; i < FOPEN_MAX; i++)
@@ -1662,7 +1665,7 @@ Cell *closefile(Node **a, int n)
files[i].fp = NULL;
}
tempfree(x);
- return(true);
+ return(True);
}
void closeall(void)
@@ -1692,7 +1695,7 @@ Cell *sub(Node **a, int nnn) /* substitute command */
fa *pfa;
int bufsz = recsize;
- if ((buf=malloc(bufsz)) == NULL)
+ if ((buf = (char *) malloc(bufsz)) == NULL)
ERROR "out of memory in sub" FATAL;
x = execute(a[3]); /* target string */
t = getsval(x);
@@ -1704,7 +1707,7 @@ Cell *sub(Node **a, int nnn) /* substitute command */
tempfree(y);
}
y = execute(a[2]); /* replacement string */
- result = false;
+ result = False;
if (pmatch(pfa, t)) {
sptr = t;
adjbuf(&buf, &bufsz, 1+patbeg-sptr, recsize, 0, "sub");
@@ -1736,7 +1739,7 @@ Cell *sub(Node **a, int nnn) /* substitute command */
if (pb > buf + bufsz)
ERROR "sub result2 %.30s too big; can't happen", buf FATAL;
setsval(x, buf); /* BUG: should be able to avoid copy */
- result = true;;
+ result = True;;
}
tempfree(x);
tempfree(y);
@@ -1753,7 +1756,7 @@ Cell *gsub(Node **a, int nnn) /* global substitute */
int mflag, tempstat, num;
int bufsz = recsize;
- if ((buf=malloc(bufsz)) == NULL)
+ if ((buf = (char *) malloc(bufsz)) == NULL)
ERROR "out of memory in gsub" FATAL;
mflag = 0; /* if mflag == 0, can replace empty string */
num = 0;
diff --git a/usr.bin/awk/tran.c b/usr.bin/awk/tran.c
index cbbb00778ec..a35900df4be 100644
--- a/usr.bin/awk/tran.c
+++ b/usr.bin/awk/tran.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tran.c,v 1.4 1999/04/18 17:06:31 millert Exp $ */
+/* $OpenBSD: tran.c,v 1.5 1999/04/20 17:31:31 millert Exp $ */
/****************************************************************
Copyright (C) Lucent Technologies 1997
All Rights Reserved
@@ -262,11 +262,11 @@ void rehash(Array *tp) /* rehash items in small table into big one */
Cell *lookup(char *s, Array *tp) /* look for s in tp */
{
- Cell *p, *prev = NULL;
+ Cell *p;
int h;
h = hash(s, tp->size);
- for (p = tp->tab[h]; p != NULL; prev = p, p = p->cnext)
+ for (p = tp->tab[h]; p != NULL; p = p->cnext)
if (strcmp(s, p->nval) == 0)
return(p); /* found it */
return(NULL); /* not found */