Import awk-20110506.
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 18 Jun 2011 01:05:21 +0000 (15:05 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 18 Jun 2011 01:23:49 +0000 (15:23 -1000)
* added #ifdef for isblank (allows -ffoo as well as -f foo arguments).
* fixed a subtle (and i hope low-probability) overflow error in
fldbld, by adding space for one extra \0.
* changed srand() to return the previous seed

contrib/awk/FIXES
contrib/awk/README
contrib/awk/README.DELETED [new file with mode: 0644]
contrib/awk/b.c
contrib/awk/lib.c
contrib/awk/main.c
contrib/awk/proctab.c [deleted file]
contrib/awk/run.c

index 310da07..e6edc53 100644 (file)
@@ -25,6 +25,26 @@ THIS SOFTWARE.
 This file lists all bug fixes, changes, etc., made since the AWK book
 was sent to the printers in August, 1987.
 
+May 6, 2011:
+       added #ifdef for isblank.
+       now allows -ffoo as well as -f foo arguments.
+       (thanks, ruslan)
+
+May 1, 2011:
+       after advice from todd miller, kevin lo, ruslan ermilov,
+       and arnold robbins, changed srand() to return the previous
+       seed (which is 1 on the first call of srand).  the seed is
+       an Awkfloat internally though converted to unsigned int to
+       pass to the library srand().  thanks, everyone. 
+
+       fixed a subtle (and i hope low-probability) overflow error
+       in fldbld, by adding space for one extra \0.  thanks to 
+       robert bassett for spotting this one and providing a fix.
+
+       removed the files related to compilation on windows.  i no
+       longer have anything like a current windows environment, so
+       i can't test any of it.
+
 May 23, 2010:
        fixed long-standing overflow bug in run.c; many thanks to
        nelson beebe for spotting it and providing the fix.
index 21255a1..24aaf90 100644 (file)
@@ -29,7 +29,7 @@ by Al Aho, Brian Kernighan, and Peter Weinberger
 Changes, mostly bug fixes and occasional enhancements, are listed
 in FIXES.  If you distribute this code further, please please please
 distribute FIXES with it.  If you find errors, please report them
-to bwk@bell-labs.com.  Thanks.
+to bwk@cs.princeton.edu.  Thanks.
 
 The program itself is created by
        make
diff --git a/contrib/awk/README.DELETED b/contrib/awk/README.DELETED
new file mode 100644 (file)
index 0000000..e222486
--- /dev/null
@@ -0,0 +1,6 @@
+makefile
+proctab.c
+ytab.c
+ytab.h
+ytabc.bak
+ytabh.bak
index a4a46ac..97dc32a 100644 (file)
@@ -748,7 +748,11 @@ 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 017b376..d7eee31 100644 (file)
@@ -256,6 +256,7 @@ void fldbld(void)   /* create fields from current record */
 {
        /* 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;
@@ -268,7 +269,7 @@ void fldbld(void)   /* create fields from current record */
        n = strlen(r);
        if (n > fieldssize) {
                xfree(fields);
-               if ((fields = (char *) malloc(n+1)) == NULL)
+               if ((fields = (char *) malloc(n+2)) == NULL) /* possibly 2 final \0s */
                        FATAL("out of space for fields in fldbld %d", n);
                fieldssize = n;
        }
index 9e60e12..9eff3d7 100644 (file)
@@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 THIS SOFTWARE.
 ****************************************************************/
 
-const char     *version = "version 20100523";
+const char     *version = "version 20110506";
 
 #define DEBUG
 #include <stdio.h>
@@ -38,6 +38,7 @@ extern        char    **environ;
 extern int     nfields;
 
 int    dbg     = 0;
+Awkfloat       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 */
@@ -67,6 +68,10 @@ int main(int argc, char *argv[])
                exit(1);
        }
        signal(SIGFPE, fpecatch);
+
+       srand_seed = 1;
+       srand(srand_seed);
+
        yyin = NULL;
        symtab = makesymtab(NSYMTAB/NSYMTAB);
        while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
@@ -86,13 +91,18 @@ 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 (npfile >= MAX_PFILE - 1)
-                               FATAL("too many -f options"); 
-                       pfile[npfile++] = argv[1];
+                       if (argv[1][2] != 0) {  /* arg is -fsomething */
+                               if (npfile >= MAX_PFILE - 1)
+                                       FATAL("too many -f options"); 
+                               pfile[npfile++] = &argv[1][2];
+                       } else {                /* arg is -f something */
+                               argc--; argv++;
+                               if (argc <= 1)
+                                       FATAL("no program filename");
+                               if (npfile >= MAX_PFILE - 1)
+                                       FATAL("too many -f options"); 
+                               pfile[npfile++] = argv[1];
+                       }
                        break;
                case 'F':       /* set field separator */
                        if (argv[1][2] != 0) {  /* arg is -Fsomething */
diff --git a/contrib/awk/proctab.c b/contrib/awk/proctab.c
deleted file mode 100644 (file)
index e4eddfd..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-#include <stdio.h>
-#include "awk.h"
-#include "ytab.h"
-
-static char *printname[93] = {
-       (char *) "FIRSTTOKEN",  /* 258 */
-       (char *) "PROGRAM",     /* 259 */
-       (char *) "PASTAT",      /* 260 */
-       (char *) "PASTAT2",     /* 261 */
-       (char *) "XBEGIN",      /* 262 */
-       (char *) "XEND",        /* 263 */
-       (char *) "NL",  /* 264 */
-       (char *) "ARRAY",       /* 265 */
-       (char *) "MATCH",       /* 266 */
-       (char *) "NOTMATCH",    /* 267 */
-       (char *) "MATCHOP",     /* 268 */
-       (char *) "FINAL",       /* 269 */
-       (char *) "DOT", /* 270 */
-       (char *) "ALL", /* 271 */
-       (char *) "CCL", /* 272 */
-       (char *) "NCCL",        /* 273 */
-       (char *) "CHAR",        /* 274 */
-       (char *) "OR",  /* 275 */
-       (char *) "STAR",        /* 276 */
-       (char *) "QUEST",       /* 277 */
-       (char *) "PLUS",        /* 278 */
-       (char *) "EMPTYRE",     /* 279 */
-       (char *) "AND", /* 280 */
-       (char *) "BOR", /* 281 */
-       (char *) "APPEND",      /* 282 */
-       (char *) "EQ",  /* 283 */
-       (char *) "GE",  /* 284 */
-       (char *) "GT",  /* 285 */
-       (char *) "LE",  /* 286 */
-       (char *) "LT",  /* 287 */
-       (char *) "NE",  /* 288 */
-       (char *) "IN",  /* 289 */
-       (char *) "ARG", /* 290 */
-       (char *) "BLTIN",       /* 291 */
-       (char *) "BREAK",       /* 292 */
-       (char *) "CLOSE",       /* 293 */
-       (char *) "CONTINUE",    /* 294 */
-       (char *) "DELETE",      /* 295 */
-       (char *) "DO",  /* 296 */
-       (char *) "EXIT",        /* 297 */
-       (char *) "FOR", /* 298 */
-       (char *) "FUNC",        /* 299 */
-       (char *) "SUB", /* 300 */
-       (char *) "GSUB",        /* 301 */
-       (char *) "IF",  /* 302 */
-       (char *) "INDEX",       /* 303 */
-       (char *) "LSUBSTR",     /* 304 */
-       (char *) "MATCHFCN",    /* 305 */
-       (char *) "NEXT",        /* 306 */
-       (char *) "NEXTFILE",    /* 307 */
-       (char *) "ADD", /* 308 */
-       (char *) "MINUS",       /* 309 */
-       (char *) "MULT",        /* 310 */
-       (char *) "DIVIDE",      /* 311 */
-       (char *) "MOD", /* 312 */
-       (char *) "ASSIGN",      /* 313 */
-       (char *) "ASGNOP",      /* 314 */
-       (char *) "ADDEQ",       /* 315 */
-       (char *) "SUBEQ",       /* 316 */
-       (char *) "MULTEQ",      /* 317 */
-       (char *) "DIVEQ",       /* 318 */
-       (char *) "MODEQ",       /* 319 */
-       (char *) "POWEQ",       /* 320 */
-       (char *) "PRINT",       /* 321 */
-       (char *) "PRINTF",      /* 322 */
-       (char *) "SPRINTF",     /* 323 */
-       (char *) "ELSE",        /* 324 */
-       (char *) "INTEST",      /* 325 */
-       (char *) "CONDEXPR",    /* 326 */
-       (char *) "POSTINCR",    /* 327 */
-       (char *) "PREINCR",     /* 328 */
-       (char *) "POSTDECR",    /* 329 */
-       (char *) "PREDECR",     /* 330 */
-       (char *) "VAR", /* 331 */
-       (char *) "IVAR",        /* 332 */
-       (char *) "VARNF",       /* 333 */
-       (char *) "CALL",        /* 334 */
-       (char *) "NUMBER",      /* 335 */
-       (char *) "STRING",      /* 336 */
-       (char *) "REGEXPR",     /* 337 */
-       (char *) "GETLINE",     /* 338 */
-       (char *) "SUBSTR",      /* 339 */
-       (char *) "SPLIT",       /* 340 */
-       (char *) "RETURN",      /* 341 */
-       (char *) "WHILE",       /* 342 */
-       (char *) "CAT", /* 343 */
-       (char *) "UMINUS",      /* 344 */
-       (char *) "NOT", /* 345 */
-       (char *) "POWER",       /* 346 */
-       (char *) "INCR",        /* 347 */
-       (char *) "DECR",        /* 348 */
-       (char *) "INDIRECT",    /* 349 */
-       (char *) "LASTTOKEN",   /* 350 */
-};
-
-
-Cell *(*proctab[93])(Node **, int) = {
-       nullproc,       /* FIRSTTOKEN */
-       program,        /* PROGRAM */
-       pastat, /* PASTAT */
-       dopa2,  /* PASTAT2 */
-       nullproc,       /* XBEGIN */
-       nullproc,       /* XEND */
-       nullproc,       /* NL */
-       array,  /* ARRAY */
-       matchop,        /* MATCH */
-       matchop,        /* NOTMATCH */
-       nullproc,       /* MATCHOP */
-       nullproc,       /* FINAL */
-       nullproc,       /* DOT */
-       nullproc,       /* ALL */
-       nullproc,       /* CCL */
-       nullproc,       /* NCCL */
-       nullproc,       /* CHAR */
-       nullproc,       /* OR */
-       nullproc,       /* STAR */
-       nullproc,       /* QUEST */
-       nullproc,       /* PLUS */
-       nullproc,       /* EMPTYRE */
-       boolop, /* AND */
-       boolop, /* BOR */
-       nullproc,       /* APPEND */
-       relop,  /* EQ */
-       relop,  /* GE */
-       relop,  /* GT */
-       relop,  /* LE */
-       relop,  /* LT */
-       relop,  /* NE */
-       instat, /* IN */
-       arg,    /* ARG */
-       bltin,  /* BLTIN */
-       jump,   /* BREAK */
-       closefile,      /* CLOSE */
-       jump,   /* CONTINUE */
-       awkdelete,      /* DELETE */
-       dostat, /* DO */
-       jump,   /* EXIT */
-       forstat,        /* FOR */
-       nullproc,       /* FUNC */
-       sub,    /* SUB */
-       gsub,   /* GSUB */
-       ifstat, /* IF */
-       sindex, /* INDEX */
-       nullproc,       /* LSUBSTR */
-       matchop,        /* MATCHFCN */
-       jump,   /* NEXT */
-       jump,   /* NEXTFILE */
-       arith,  /* ADD */
-       arith,  /* MINUS */
-       arith,  /* MULT */
-       arith,  /* DIVIDE */
-       arith,  /* MOD */
-       assign, /* ASSIGN */
-       nullproc,       /* ASGNOP */
-       assign, /* ADDEQ */
-       assign, /* SUBEQ */
-       assign, /* MULTEQ */
-       assign, /* DIVEQ */
-       assign, /* MODEQ */
-       assign, /* POWEQ */
-       printstat,      /* PRINT */
-       awkprintf,      /* PRINTF */
-       awksprintf,     /* SPRINTF */
-       nullproc,       /* ELSE */
-       intest, /* INTEST */
-       condexpr,       /* CONDEXPR */
-       incrdecr,       /* POSTINCR */
-       incrdecr,       /* PREINCR */
-       incrdecr,       /* POSTDECR */
-       incrdecr,       /* PREDECR */
-       nullproc,       /* VAR */
-       nullproc,       /* IVAR */
-       getnf,  /* VARNF */
-       call,   /* CALL */
-       nullproc,       /* NUMBER */
-       nullproc,       /* STRING */
-       nullproc,       /* REGEXPR */
-       awkgetline,     /* GETLINE */
-       substr, /* SUBSTR */
-       split,  /* SPLIT */
-       jump,   /* RETURN */
-       whilestat,      /* WHILE */
-       cat,    /* CAT */
-       arith,  /* UMINUS */
-       boolop, /* NOT */
-       arith,  /* POWER */
-       nullproc,       /* INCR */
-       nullproc,       /* DECR */
-       indirect,       /* INDIRECT */
-       nullproc,       /* LASTTOKEN */
-};
-
-char *tokname(int n)
-{
-       static char buf[100];
-
-       if (n < FIRSTTOKEN || n > LASTTOKEN) {
-               sprintf(buf, "token %d", n);
-               return buf;
-       }
-       return printname[n-FIRSTTOKEN];
-}
index 88e0f8f..e96379b 100644 (file)
@@ -66,6 +66,7 @@ void tempfree(Cell *p) {
 
 jmp_buf env;
 extern int     pairstack[];
+extern Awkfloat        srand_seed;
 
 Node   *winner = NULL; /* root of parse tree */
 Cell   *tmps;          /* free temporary cells for execution */
@@ -1466,6 +1467,7 @@ Cell *bltin(Node **a, int n)      /* builtin functions. a[0] is type, a[1] is arg lis
        Cell *x, *y;
        Awkfloat u;
        int t;
+       Awkfloat tmp;
        char *p, *buf;
        Node *nextarg;
        FILE *fp;
@@ -1517,7 +1519,10 @@ Cell *bltin(Node **a, int n)     /* builtin functions. a[0] is type, a[1] is arg lis
                        u = time((time_t *)0);
                else
                        u = getfval(x);
+               tmp = u;
                srand((unsigned int) u);
+               u = srand_seed;
+               srand_seed = tmp;
                break;
        case FTOUPPER:
        case FTOLOWER: