install correct aliases file
[unix-history] / usr / src / old / awk / lib.c
index e42869f..14472ca 100644 (file)
@@ -1,31 +1,37 @@
-/*     lib.c   4.1     82/05/07        */
+#ifndef lint
+static char sccsid[] = "@(#)lib.c      4.6 (Berkeley) %G%";
+#endif
 
 #include "stdio.h"
 #include "awk.def"
 #include "awk.h"
 #include "ctype.h"
 
 
 #include "stdio.h"
 #include "awk.def"
 #include "awk.h"
 #include "ctype.h"
 
+extern FILE    *yyin;  /* lex input file */
 FILE   *infile = NULL;
 char   *file;
 #define        RECSIZE (5 * 512)
 char   record[RECSIZE];
 char   fields[RECSIZE];
 FILE   *infile = NULL;
 char   *file;
 #define        RECSIZE (5 * 512)
 char   record[RECSIZE];
 char   fields[RECSIZE];
+char   EMPTY[] = "";
 
 #define        MAXFLD  100
 int    donefld;        /* 1 = implies rec broken into fields */
 int    donerec;        /* 1 = record is valid (no flds have changed) */
 int    mustfld;        /* 1 = NF seen, so always break*/
 
 
 #define        MAXFLD  100
 int    donefld;        /* 1 = implies rec broken into fields */
 int    donerec;        /* 1 = record is valid (no flds have changed) */
 int    mustfld;        /* 1 = NF seen, so always break*/
 
-#define        FINIT   {0, NULL, 0.0, FLD|STR}
+#define        FINIT   {EMPTY, EMPTY, 0.0, FLD|STR}
 cell fldtab[MAXFLD] = {        /*room for fields */
        { "$record", record, 0.0, STR|FLD},
 cell fldtab[MAXFLD] = {        /*room for fields */
        { "$record", record, 0.0, STR|FLD},
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
-       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
+       FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
 };
 int    maxfld  = 0;    /* last used field */
 
 };
 int    maxfld  = 0;    /* last used field */
 
@@ -52,8 +58,12 @@ getrec()
                        }
                        *FILENAME = file = *svargv;
                        dprintf("opening file %s\n", file, NULL, NULL);
                        }
                        *FILENAME = file = *svargv;
                        dprintf("opening file %s\n", file, NULL, NULL);
-                       if (*file == '-')
-                               infile = stdin;
+                       if (*file == '-') {
+                               if (yyin == stdin)
+                                       error(FATAL, "standard input already used for reading commands");
+                               else
+                                       infile = stdin;
+                       }
                        else if ((infile = fopen(file, "r")) == NULL)
                                error(FATAL, "can't open %s", file);
                }
                        else if ((infile = fopen(file, "r")) == NULL)
                                error(FATAL, "can't open %s", file);
                }
@@ -124,7 +134,7 @@ fldbld()
                        if (i >= MAXFLD)
                                error(FATAL, "record `%.20s...' has too many fields", record);
                        if (!(fldtab[i].tval&FLD))
                        if (i >= MAXFLD)
                                error(FATAL, "record `%.20s...' has too many fields", record);
                        if (!(fldtab[i].tval&FLD))
-                               xfree(fldtab[i].sval);
+                               strfree(fldtab[i].sval);
                        fldtab[i].sval = fr;
                        fldtab[i].tval = FLD | STR;
                        do
                        fldtab[i].sval = fr;
                        fldtab[i].tval = FLD | STR;
                        do
@@ -138,7 +148,7 @@ fldbld()
                        if (i >= MAXFLD)
                                error(FATAL, "record `%.20s...' has too many fields", record);
                        if (!(fldtab[i].tval&FLD))
                        if (i >= MAXFLD)
                                error(FATAL, "record `%.20s...' has too many fields", record);
                        if (!(fldtab[i].tval&FLD))
-                               xfree(fldtab[i].sval);
+                               strfree(fldtab[i].sval);
                        fldtab[i].sval = fr;
                        fldtab[i].tval = FLD | STR;
                        while (*r != sep && *r != '\n' && *r != '\0')   /* \n always a separator */
                        fldtab[i].sval = fr;
                        fldtab[i].tval = FLD | STR;
                        while (*r != sep && *r != '\n' && *r != '\0')   /* \n always a separator */
@@ -150,9 +160,9 @@ fldbld()
        *fr = 0;
        for (j=MAXFLD-1; j>i; j--) {    /* clean out junk from previous record */
                if (!(fldtab[j].tval&FLD))
        *fr = 0;
        for (j=MAXFLD-1; j>i; j--) {    /* clean out junk from previous record */
                if (!(fldtab[j].tval&FLD))
-                       xfree(fldtab[j].sval);
+                       strfree(fldtab[j].sval);
                fldtab[j].tval = STR | FLD;
                fldtab[j].tval = STR | FLD;
-               fldtab[j].sval = NULL;
+               fldtab[j].sval = EMPTY;
        }
        maxfld = i;
        donefld = 1;
        }
        maxfld = i;
        donefld = 1;
@@ -208,7 +218,7 @@ error(f, s, a1, a2, a3, a4, a5, a6, a7) {
        fprintf(stderr, "awk: ");
        fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
        fprintf(stderr, "\n");
        fprintf(stderr, "awk: ");
        fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
        fprintf(stderr, "\n");
-       if (*NR > 0)
+       if (NR && *NR > 0)
                fprintf(stderr, " record number %g\n", *NR);
        if (f)
                exit(2);
                fprintf(stderr, " record number %g\n", *NR);
        if (f)
                exit(2);
@@ -227,6 +237,8 @@ register char *s;
        int point;
        char *es;
 
        int point;
        char *es;
 
+       if (s == NULL) 
+               return (0);
        d1 = d2 = point = 0;
        while (*s == ' ' || *s == '\t' || *s == '\n')
                s++;
        d1 = d2 = point = 0;
        while (*s == ' ' || *s == '\t' || *s == '\n')
                s++;