Module Name: src Committed By: christos Date: Sat Dec 29 02:44:26 UTC 2012
Modified Files: src/external/historical/nawk/dist: awkgram.y b.c lib.c main.c makefile proctab.c proto.h run.c tran.c Log Message: merge 2012-12-20 To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/external/historical/nawk/dist/awkgram.y \ src/external/historical/nawk/dist/b.c \ src/external/historical/nawk/dist/proctab.c cvs rdiff -u -r1.5 -r1.6 src/external/historical/nawk/dist/lib.c \ src/external/historical/nawk/dist/run.c cvs rdiff -u -r1.7 -r1.8 src/external/historical/nawk/dist/main.c cvs rdiff -u -r1.2 -r1.3 src/external/historical/nawk/dist/makefile cvs rdiff -u -r1.6 -r1.7 src/external/historical/nawk/dist/proto.h \ src/external/historical/nawk/dist/tran.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/historical/nawk/dist/awkgram.y diff -u src/external/historical/nawk/dist/awkgram.y:1.3 src/external/historical/nawk/dist/awkgram.y:1.4 --- src/external/historical/nawk/dist/awkgram.y:1.3 Sat May 28 11:13:04 2011 +++ src/external/historical/nawk/dist/awkgram.y Fri Dec 28 21:44:26 2012 @@ -179,8 +179,8 @@ pa_pat: pa_stat: pa_pat { $$ = stat2(PASTAT, $1, stat2(PRINT, rectonode(), NIL)); } | pa_pat lbrace stmtlist '}' { $$ = stat2(PASTAT, $1, $3); } - | pa_pat ',' pa_pat { $$ = pa2stat($1, $3, stat2(PRINT, rectonode(), NIL)); } - | pa_pat ',' pa_pat lbrace stmtlist '}' { $$ = pa2stat($1, $3, $5); } + | pa_pat ',' opt_nl pa_pat { $$ = pa2stat($1, $4, stat2(PRINT, rectonode(), NIL)); } + | pa_pat ',' opt_nl pa_pat lbrace stmtlist '}' { $$ = pa2stat($1, $4, $6); } | lbrace stmtlist '}' { $$ = stat2(PASTAT, NIL, $2); } | XBEGIN lbrace stmtlist '}' { beginloc = linkum(beginloc, $3); $$ = 0; } Index: src/external/historical/nawk/dist/b.c diff -u src/external/historical/nawk/dist/b.c:1.3 src/external/historical/nawk/dist/b.c:1.4 --- src/external/historical/nawk/dist/b.c:1.3 Sat Mar 10 14:18:48 2012 +++ src/external/historical/nawk/dist/b.c Fri Dec 28 21:44:26 2012 @@ -843,7 +843,7 @@ Node *unary(Node *np) * to nelson beebe for the suggestion; let's see if it works everywhere. */ -/* #define HAS_ISBLANK */ +#define HAS_ISBLANK static const struct charclass { const char *cc_name; @@ -852,7 +852,11 @@ static const struct charclass { } charclasses[] = { { "alnum", 5, isalnum }, { "alpha", 5, isalpha }, +#ifndef HAS_ISBLANK + { "blank", 5, isspace }, /* was isblank */ +#else { "blank", 5, isblank }, +#endif { "cntrl", 5, iscntrl }, { "digit", 5, isdigit }, { "graph", 5, isgraph }, Index: src/external/historical/nawk/dist/proctab.c diff -u src/external/historical/nawk/dist/proctab.c:1.3 src/external/historical/nawk/dist/proctab.c:1.4 --- src/external/historical/nawk/dist/proctab.c:1.3 Fri Aug 27 12:49:47 2010 +++ src/external/historical/nawk/dist/proctab.c Fri Dec 28 21:44:26 2012 @@ -7,100 +7,100 @@ #include "awkgram.h" static const char * const printname[94] = { - "FIRSTTOKEN", /* 257 */ - "PROGRAM", /* 258 */ - "PASTAT", /* 259 */ - "PASTAT2", /* 260 */ - "XBEGIN", /* 261 */ - "XEND", /* 262 */ - "NL", /* 263 */ - "ARRAY", /* 264 */ - "MATCH", /* 265 */ - "NOTMATCH", /* 266 */ - "MATCHOP", /* 267 */ - "FINAL", /* 268 */ - "DOT", /* 269 */ - "ALL", /* 270 */ - "CCL", /* 271 */ - "NCCL", /* 272 */ - "CHAR", /* 273 */ - "OR", /* 274 */ - "STAR", /* 275 */ - "QUEST", /* 276 */ - "PLUS", /* 277 */ - "EMPTYRE", /* 278 */ - "AND", /* 279 */ - "BOR", /* 280 */ - "APPEND", /* 281 */ - "EQ", /* 282 */ - "GE", /* 283 */ - "GT", /* 284 */ - "LE", /* 285 */ - "LT", /* 286 */ - "NE", /* 287 */ - "IN", /* 288 */ - "ARG", /* 289 */ - "BLTIN", /* 290 */ - "BREAK", /* 291 */ - "CLOSE", /* 292 */ - "CONTINUE", /* 293 */ - "DELETE", /* 294 */ - "DO", /* 295 */ - "EXIT", /* 296 */ - "FOR", /* 297 */ - "FUNC", /* 298 */ - "SUB", /* 299 */ - "GSUB", /* 300 */ - "IF", /* 301 */ - "INDEX", /* 302 */ - "LSUBSTR", /* 303 */ - "MATCHFCN", /* 304 */ - "NEXT", /* 305 */ - "NEXTFILE", /* 306 */ - "ADD", /* 307 */ - "MINUS", /* 308 */ - "MULT", /* 309 */ - "DIVIDE", /* 310 */ - "MOD", /* 311 */ - "ASSIGN", /* 312 */ - "ASGNOP", /* 313 */ - "ADDEQ", /* 314 */ - "SUBEQ", /* 315 */ - "MULTEQ", /* 316 */ - "DIVEQ", /* 317 */ - "MODEQ", /* 318 */ - "POWEQ", /* 319 */ - "PRINT", /* 320 */ - "PRINTF", /* 321 */ - "SPRINTF", /* 322 */ - "ELSE", /* 323 */ - "INTEST", /* 324 */ - "CONDEXPR", /* 325 */ - "POSTINCR", /* 326 */ - "PREINCR", /* 327 */ - "POSTDECR", /* 328 */ - "PREDECR", /* 329 */ - "VAR", /* 330 */ - "IVAR", /* 331 */ - "VARNF", /* 332 */ - "CALL", /* 333 */ - "NUMBER", /* 334 */ - "STRING", /* 335 */ - "REGEXPR", /* 336 */ - "GETLINE", /* 337 */ - "GENSUB", /* 338 */ - "RETURN", /* 339 */ - "SPLIT", /* 340 */ - "SUBSTR", /* 341 */ - "WHILE", /* 342 */ - "CAT", /* 343 */ - "NOT", /* 344 */ - "UMINUS", /* 345 */ - "POWER", /* 346 */ - "DECR", /* 347 */ - "INCR", /* 348 */ - "INDIRECT", /* 349 */ - "LASTTOKEN", /* 350 */ + "FIRSTTOKEN", /* 57346 */ + "PROGRAM", /* 57347 */ + "PASTAT", /* 57348 */ + "PASTAT2", /* 57349 */ + "XBEGIN", /* 57350 */ + "XEND", /* 57351 */ + "NL", /* 57352 */ + "ARRAY", /* 57353 */ + "MATCH", /* 57354 */ + "NOTMATCH", /* 57355 */ + "MATCHOP", /* 57356 */ + "FINAL", /* 57357 */ + "DOT", /* 57358 */ + "ALL", /* 57359 */ + "CCL", /* 57360 */ + "NCCL", /* 57361 */ + "CHAR", /* 57362 */ + "OR", /* 57363 */ + "STAR", /* 57364 */ + "QUEST", /* 57365 */ + "PLUS", /* 57366 */ + "EMPTYRE", /* 57367 */ + "AND", /* 57368 */ + "BOR", /* 57369 */ + "APPEND", /* 57370 */ + "EQ", /* 57371 */ + "GE", /* 57372 */ + "GT", /* 57373 */ + "LE", /* 57374 */ + "LT", /* 57375 */ + "NE", /* 57376 */ + "IN", /* 57377 */ + "ARG", /* 57378 */ + "BLTIN", /* 57379 */ + "BREAK", /* 57380 */ + "CLOSE", /* 57381 */ + "CONTINUE", /* 57382 */ + "DELETE", /* 57383 */ + "DO", /* 57384 */ + "EXIT", /* 57385 */ + "FOR", /* 57386 */ + "FUNC", /* 57387 */ + "SUB", /* 57388 */ + "GSUB", /* 57389 */ + "IF", /* 57390 */ + "INDEX", /* 57391 */ + "LSUBSTR", /* 57392 */ + "MATCHFCN", /* 57393 */ + "NEXT", /* 57394 */ + "NEXTFILE", /* 57395 */ + "ADD", /* 57396 */ + "MINUS", /* 57397 */ + "MULT", /* 57398 */ + "DIVIDE", /* 57399 */ + "MOD", /* 57400 */ + "ASSIGN", /* 57401 */ + "ASGNOP", /* 57402 */ + "ADDEQ", /* 57403 */ + "SUBEQ", /* 57404 */ + "MULTEQ", /* 57405 */ + "DIVEQ", /* 57406 */ + "MODEQ", /* 57407 */ + "POWEQ", /* 57408 */ + "PRINT", /* 57409 */ + "PRINTF", /* 57410 */ + "SPRINTF", /* 57411 */ + "ELSE", /* 57412 */ + "INTEST", /* 57413 */ + "CONDEXPR", /* 57414 */ + "POSTINCR", /* 57415 */ + "PREINCR", /* 57416 */ + "POSTDECR", /* 57417 */ + "PREDECR", /* 57418 */ + "VAR", /* 57419 */ + "IVAR", /* 57420 */ + "VARNF", /* 57421 */ + "CALL", /* 57422 */ + "NUMBER", /* 57423 */ + "STRING", /* 57424 */ + "REGEXPR", /* 57425 */ + "GETLINE", /* 57426 */ + "GENSUB", /* 57427 */ + "RETURN", /* 57428 */ + "SPLIT", /* 57429 */ + "SUBSTR", /* 57430 */ + "WHILE", /* 57431 */ + "CAT", /* 57432 */ + "NOT", /* 57433 */ + "UMINUS", /* 57434 */ + "POWER", /* 57435 */ + "DECR", /* 57436 */ + "INCR", /* 57437 */ + "INDIRECT", /* 57438 */ + "LASTTOKEN", /* 57439 */ }; Index: src/external/historical/nawk/dist/lib.c diff -u src/external/historical/nawk/dist/lib.c:1.5 src/external/historical/nawk/dist/lib.c:1.6 --- src/external/historical/nawk/dist/lib.c:1.5 Sat Mar 10 14:18:48 2012 +++ src/external/historical/nawk/dist/lib.c Fri Dec 28 21:44:26 2012 @@ -97,8 +97,13 @@ void initgetrec(void) char *p; for (i = 1; i < *ARGC; i++) { - if (!isclvar(p = getargv(i))) { /* find 1st real filename */ - setsval(lookup("FILENAME", symtab), getargv(i)); + p = getargv(i); /* find 1st real filename */ + if (p == NULL || *p == '\0') { /* deleted or zapped */ + argno++; + continue; + } + if (!isclvar(p)) { + setsval(lookup("FILENAME", symtab), p); return; } setclvar(p); /* a commandline assignment before filename */ @@ -133,7 +138,7 @@ int getrec(uschar **pbuf, int *pbufsize, dprintf( ("argno=%d, file=|%s|\n", argno, file) ); if (infile == NULL) { /* have to open a new file */ file = getargv(argno); - if (*file == '\0') { /* it's been zapped */ + if (file == NULL || *file == '\0') { /* deleted or zapped */ argno++; continue; } @@ -207,6 +212,7 @@ int readrec(uschar **pbuf, int *pbufsize FATAL("field separator %.10s... is too long", *FS); memcpy(inputFS, *FS, len_inputFS); } + /*fflush(stdout); avoids some buffering problem but makes it 25% slower*/ if (**RS && (*RS)[1]) { fa *pfa = makedfa(*RS, 1); if (newflag) @@ -265,6 +271,8 @@ char *getargv(int n) /* get ARGV[n] */ extern Array *ARGVtab; snprintf(temp, sizeof(temp), "%d", n); + if (lookup(temp, ARGVtab) == NULL) + return NULL; x = setsymtab(temp, "", 0.0, STR, ARGVtab); s = getsval(x); dprintf( ("getargv(%d) returns |%s|\n", n, s) ); @@ -294,6 +302,7 @@ void fldbld(void) /* create fields from { /* this relies on having fields[] the same length as $0 */ /* the fields are all stored in this one array with \0's */ + /* possibly with a final trailing \0 not associated with any field */ char *r, *fr, sep; Cell *p; int i, j, n; @@ -306,7 +315,7 @@ void fldbld(void) /* create fields from n = strlen(r); if (n > fieldssize) { xfree(fields); - if ((fields = malloc(n+1)) == NULL) + if ((fields = malloc(n+2)) == NULL) /* possibly 2 final \0s */ FATAL("out of space for fields in fldbld %d", n); fieldssize = n; } @@ -537,7 +546,7 @@ void recbld(void) /* create $0 from $1.. fldtab[0]->tval = REC | STR | DONTFREE; fldtab[0]->sval = record; - dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); + dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, (void*)fldtab[0]) ); dprintf( ("recbld = |%s|\n", record) ); donerec = 1; } Index: src/external/historical/nawk/dist/run.c diff -u src/external/historical/nawk/dist/run.c:1.5 src/external/historical/nawk/dist/run.c:1.6 --- src/external/historical/nawk/dist/run.c:1.5 Sat Mar 10 14:18:48 2012 +++ src/external/historical/nawk/dist/run.c Fri Dec 28 21:44:26 2012 @@ -1233,13 +1233,13 @@ static char regexpr[] = "(regexpr)"; Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */ { Cell *x = 0, *y, *ap; - char *s; + char *s, *origs; int sep; char *t, temp, num[50], *fs = 0; int n, tempstat, arg3type; y = execute(a[0]); /* source string */ - s = getsval(y); + origs = s = strdup(getsval(y)); arg3type = ptoi(a[3]); if (a[2] == 0) /* fs string */ fs = *FS; @@ -1259,6 +1259,12 @@ Cell *split(Node **a, int nnn) /* split( ap->sval = (char *) makesymtab(NSYMTAB); n = 0; + if (arg3type == REGEXPR && strlen((char*)((fa*)a[2])->restr) == 0) { + /* split(s, a, //); have to arrange that it looks like empty sep */ + arg3type = 0; + fs = EMPTY; + sep = 0; + } if (*s != '\0' && (strlen(fs) > 1 || arg3type == REGEXPR)) { /* reg expr */ fa *pfa; if (arg3type == REGEXPR) { /* it's ready already */ @@ -1353,6 +1359,7 @@ Cell *split(Node **a, int nnn) /* split( } tempfree(ap); tempfree(y); + free(origs); if (a[2] != 0 && arg3type == STRING) { tempfree(x); } @@ -1604,7 +1611,8 @@ Cell *bltin(Node **a, int n) /* builtin u = time((time_t *)0); else u = getfval(x); - srand(tmp = (unsigned int) u); + tmp = (unsigned int) u; + srand(tmp); u = srand_seed; srand_seed = tmp; break; @@ -1727,6 +1735,7 @@ struct files { const char *fname; int mode; /* '|', 'a', 'w' => LE/LT, GT */ } *files; + size_t nfiles; void stdinit(void) /* in case stdin, etc., are not constants */ Index: src/external/historical/nawk/dist/main.c diff -u src/external/historical/nawk/dist/main.c:1.7 src/external/historical/nawk/dist/main.c:1.8 --- src/external/historical/nawk/dist/main.c:1.7 Mon Mar 12 14:17:12 2012 +++ src/external/historical/nawk/dist/main.c Fri Dec 28 21:44:26 2012 @@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE THIS SOFTWARE. ****************************************************************/ -const char *version = "version 20100523"; +const char *version = "version 20121220"; #if HAVE_NBTOOL_CONFIG_H #include "nbtool_config.h" @@ -42,7 +42,7 @@ extern char **environ; extern int nfields; int dbg = 0; -unsigned int srand_seed; +unsigned int srand_seed = 1; char *cmdname; /* gets argv[0] for error messages */ extern FILE *yyin; /* lex input file */ char *lexprog; /* points to program argument if it exists */ @@ -101,6 +101,7 @@ __dead static void fpecatch(int n int main(int argc, char *argv[]) { const char *fs = NULL; + char *fn; setlocale(LC_ALL, ""); setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */ @@ -146,10 +147,15 @@ int main(int argc, char *argv[]) safe = 1; break; case 'f': /* next argument is program filename */ - argc--; - argv++; - if (argc <= 1) - FATAL("no program filename"); + if (argv[1][2] != 0) /* arg is -fsomething */ + fn = &argv[1][2]; + else { + argc--; + argv++; + if (argc <= 1) + FATAL("no program filename"); + fn = argv[1]; + } if (npfile >= maxpfile) { maxpfile += 20; pfile = realloc(pfile, @@ -158,7 +164,7 @@ int main(int argc, char *argv[]) FATAL("error allocating space for " "-f options"); } - pfile[npfile++] = argv[1]; + pfile[npfile++] = fn; break; case 'F': /* set field separator */ if (argv[1][2] != 0) { /* arg is -Fsomething */ @@ -172,10 +178,20 @@ int main(int argc, char *argv[]) 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((++argv)[1])) - setclvar(argv[1]); - else if (argv[1][2] != '\0') - setclvar(&argv[1][2]); + if (argv[1][2] != 0) { /* arg is -vsomething */ + if (isclvar(&argv[1][2])) + setclvar(&argv[1][2]); + else + FATAL("invalid -v option argument: %s", &argv[1][2]); + } else { /* arg is -v something */ + argc--; argv++; + if (argc <= 1) + FATAL("no variable name"); + if (isclvar(argv[1])) + setclvar(argv[1]); + else + FATAL("invalid -v option argument: %s", argv[1]); + } break; case 'd': dbg = atoi(&argv[1][2]); Index: src/external/historical/nawk/dist/makefile diff -u src/external/historical/nawk/dist/makefile:1.2 src/external/historical/nawk/dist/makefile:1.3 --- src/external/historical/nawk/dist/makefile:1.2 Thu Aug 26 10:55:20 2010 +++ src/external/historical/nawk/dist/makefile Fri Dec 28 21:44:26 2012 @@ -32,22 +32,24 @@ CC = /opt/pure/purify/purify cc CC = cc CC = gcc -Wall -g -Wwrite-strings CC = gcc -fprofile-arcs -ftest-coverage # then gcov f1.c; cat f1.c.gcov -CC = gcc -O4 +CC = gcc -g -Wall -pedantic +CC = gcc -O4 -Wall -pedantic -fno-strict-aliasing -YACC = bison -y -YACC = yacc -YFLAGS = -d +YACC = bison -d -y +YACC = yacc -d -S +#YFLAGS = -d -S + # -S uses sprintf in yacc parser instead of sprint OFILES = b.o main.o parse.o proctab.o tran.o lib.o run.o lex.o SOURCE = awk.h ytab.c ytab.h proto.h awkgram.y lex.c b.c main.c \ - maketab.c parse.c lib.c run.c tran.c proctab.c missing95.c + maketab.c parse.c lib.c run.c tran.c proctab.c LISTING = awk.h proto.h awkgram.y lex.c b.c main.c maketab.c parse.c \ - lib.c run.c tran.c missing95.c + lib.c run.c tran.c -SHIP = README FIXES $(SOURCE) ytab[ch].bak makefile makefile.win \ - vcvars32.bat buildwin.bat awk.1 +SHIP = README FIXES $(SOURCE) ytab[ch].bak makefile \ + awk.1 a.out: ytab.o $(OFILES) $(CC) $(CFLAGS) ytab.o $(OFILES) $(ALLOC) -lm Index: src/external/historical/nawk/dist/proto.h diff -u src/external/historical/nawk/dist/proto.h:1.6 src/external/historical/nawk/dist/proto.h:1.7 --- src/external/historical/nawk/dist/proto.h:1.6 Sat Mar 10 14:18:48 2012 +++ src/external/historical/nawk/dist/proto.h Fri Dec 28 21:44:26 2012 @@ -46,7 +46,7 @@ extern void freetr(Node *); extern int hexstr(const uschar **); extern int quoted(const uschar **); extern char *cclenter(const char *); -extern void overflo(const char *) __dead; +extern void overflo(const char *) __attribute__((__noreturn__)); extern void cfoll(fa *, Node *); extern int first(Node *); extern void follow(Node *); @@ -123,7 +123,7 @@ extern void makefields(int, int); extern void growfldtab(int n); extern int getrec(uschar **, int *, int); extern void nextfile(void); -extern int readrec(uschar **buf, int *bufsize, FILE *inf, int newflag); +extern int readrec(uschar **buf, int *, FILE *, int); extern char *getargv(int); extern void setclvar(char *); extern void fldbld(void); @@ -139,7 +139,7 @@ extern void bcheck2(int, int, int); extern void SYNTAX(const char *, ...) __attribute__((__format__(__printf__, 1, 2))); extern void FATAL(const char *, ...) __dead - __attribute__((__format__(__printf__, 1, 2))); + __attribute__((__format__(__printf__, 1, 2), __noreturn__)); extern void WARNING(const char *, ...) __attribute__((__format__(__printf__, 1, 2))); extern void error(void); @@ -149,7 +149,7 @@ extern double errcheck(double, const cha extern int isclvar(const char *); extern int is_number(const char *); -extern int adjbuf(uschar **pb, int *sz, int min, int q, uschar **pbp, const char *what); +extern int adjbuf(uschar **, int *, int, int, uschar **, const char *); extern void run(Node *); extern Cell *execute(Node *); extern Cell *program(Node **, int); Index: src/external/historical/nawk/dist/tran.c diff -u src/external/historical/nawk/dist/tran.c:1.6 src/external/historical/nawk/dist/tran.c:1.7 --- src/external/historical/nawk/dist/tran.c:1.6 Mon Dec 10 14:49:05 2012 +++ src/external/historical/nawk/dist/tran.c Fri Dec 28 21:44:26 2012 @@ -322,6 +322,8 @@ Awkfloat setfval(Cell *vp, Awkfloat f) / xfree(vp->sval); /* free any previous string */ vp->tval &= ~STR; /* mark string invalid */ vp->tval |= NUM; /* mark number ok */ + if (f == -0) /* who would have thought this possible? */ + f = 0; dprintf( ("setfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), f, vp->tval) ); return vp->fval = f; } @@ -389,7 +391,8 @@ Awkfloat getfval(Cell *vp) /* get float if (is_number(vp->sval) && !(vp->tval&CON)) vp->tval |= NUM; /* make NUM only sparingly */ } - dprintf( ("getfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), vp->fval, vp->tval) ); + dprintf( ("getfval %p: %s = %g, t=%o\n", + vp, NN(vp->nval), vp->fval, vp->tval) ); return(vp->fval); } @@ -415,7 +418,8 @@ static char *get_str_val(Cell *vp, char vp->tval |= STR; setfree(vp); } - dprintf( ("getsval %p: %s = \"%s (%p)\", t=%o\n", vp, NN(vp->nval), vp->sval, vp->sval, vp->tval) ); + dprintf( ("getsval %p: %s = \"%s (%p)\", t=%o\n", + vp, NN(vp->nval), vp->sval, vp->sval, vp->tval) ); return(vp->sval); }