merge from sun
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Thu, 10 Feb 1983 06:07:30 +0000 (22:07 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Thu, 10 Feb 1983 06:07:30 +0000 (22:07 -0800)
SCCS-vsn: old/awk/awk.def 4.2
SCCS-vsn: old/awk/awk.lx.l 4.2
SCCS-vsn: old/awk/lib.c 4.2
SCCS-vsn: old/awk/proc.c 4.2
SCCS-vsn: old/awk/run.c 4.2
SCCS-vsn: old/awk/tran.c 4.2

usr/src/old/awk/awk.def
usr/src/old/awk/awk.lx.l
usr/src/old/awk/lib.c
usr/src/old/awk/proc.c
usr/src/old/awk/run.c
usr/src/old/awk/tran.c

index 3d03eec..bcde4a0 100644 (file)
@@ -1,8 +1,9 @@
-/*     awk.def 4.1     82/05/07        */
+/*     awk.def 4.2     83/02/09        */
 
 #define hack   int
 #define        AWKFLOAT        float
 #define        xfree(a)        { if(a!=NULL) { yfree(a); a=NULL;} }
 
 #define hack   int
 #define        AWKFLOAT        float
 #define        xfree(a)        { if(a!=NULL) { yfree(a); a=NULL;} }
+#define        strfree(a)      { if(a!=NULL && a!=EMPTY) { yfree(a);} a=EMPTY; }
 #define yfree free
 #ifdef DEBUG
 #      define  dprintf if(dbg)printf
 #define yfree free
 #ifdef DEBUG
 #      define  dprintf if(dbg)printf
@@ -21,6 +22,7 @@ extern awkfloat *NF;
 extern char    **FILENAME;
 
 extern char    record[];
 extern char    **FILENAME;
 
 extern char    record[];
+extern char    EMPTY[];
 extern int     dbg;
 extern int     lineno;
 extern int     errorflag;
 extern int     dbg;
 extern int     lineno;
 extern int     errorflag;
@@ -121,8 +123,8 @@ extern int  pairstack[], paircnt;
 #define isstr(n)       (n.optr->tval & STR)
 #define istrue(n)      (n.otype == OBOOL && n.osub == BTRUE)
 #define istemp(n)      (n.otype == OCELL && n.osub == CTEMP)
 #define isstr(n)       (n.optr->tval & STR)
 #define istrue(n)      (n.otype == OBOOL && n.osub == BTRUE)
 #define istemp(n)      (n.otype == OCELL && n.osub == CTEMP)
-#define isfld(n)       (!donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval==0)
-#define isrec(n)       (donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval!=0)
+#define isfld(n)       (!donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval==EMPTY)
+#define isrec(n)       (donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval!=EMPTY)
 obj    nullproc();
 obj    relop();
 
 obj    nullproc();
 obj    relop();
 
index d875040..dc8f4de 100644 (file)
@@ -1,4 +1,4 @@
-/*     awk.lx.l        4.1     82/05/07        */
+/*     awk.lx.l        4.2     83/02/09        */
 
 %Start A str chc sc reg comment
 
 
 %Start A str chc sc reg comment
 
@@ -73,9 +73,9 @@ WS    [ \t]
                        }
                }
 <A>"$"{WS}*    { RETURN(INDIRECT); }
                        }
                }
 <A>"$"{WS}*    { RETURN(INDIRECT); }
-<A>NF          { mustfld=1; yylval = (hack)setsymtab(yytext, NULL, 0.0, NUM, symtab); RETURN(VAR); }
+<A>NF          { mustfld=1; yylval = (hack)setsymtab(yytext, EMPTY, 0.0, NUM, symtab); RETURN(VAR); }
 <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?        {
 <A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?        {
-               yylval = (hack)setsymtab(yytext, NULL, atof(yytext), CON|NUM, symtab); RETURN(NUMBER); }
+               yylval = (hack)setsymtab(yytext, EMPTY, atof(yytext), CON|NUM, symtab); RETURN(NUMBER); }
 <A>"}"{WS}*\n  { BEGIN sc; lineno++; RETURN(';'); }
 <A>"}"         { BEGIN sc; RETURN(';'); }
 <A>;\n         { lineno++; RETURN(';'); }
 <A>"}"{WS}*\n  { BEGIN sc; lineno++; RETURN(';'); }
 <A>"}"         { BEGIN sc; RETURN(';'); }
 <A>;\n         { lineno++; RETURN(';'); }
index e42869f..3118b69 100644 (file)
@@ -1,4 +1,4 @@
-/*     lib.c   4.1     82/05/07        */
+/*     lib.c   4.2     83/02/09        */
 
 #include "stdio.h"
 #include "awk.def"
 
 #include "stdio.h"
 #include "awk.def"
@@ -10,13 +10,14 @@ char        *file;
 #define        RECSIZE (5 * 512)
 char   record[RECSIZE];
 char   fields[RECSIZE];
 #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},
        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
 cell fldtab[MAXFLD] = {        /*room for fields */
        { "$record", record, 0.0, STR|FLD},
        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
@@ -124,7 +125,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 +139,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 +151,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;
@@ -227,6 +228,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++;
index 33e19fb..b7bed42 100644 (file)
@@ -1,4 +1,4 @@
-/*     proc.c  4.1     82/05/07        */
+/*     proc.c  4.2     83/02/09        */
 
 #include "awk.h"
 #define NULL 0
 
 #include "awk.h"
 #define NULL 0
@@ -80,7 +80,8 @@ main()
        for(p=proc; p->token!=0; p++)
                names[p->token-FIRSTTOKEN] = p->pname;
        for(i=0; i<SIZE; i++)
        for(p=proc; p->token!=0; p++)
                names[p->token-FIRSTTOKEN] = p->pname;
        for(i=0; i<SIZE; i++)
-               printf("/*%s*/\t\"%s\",\n",tokname(i+FIRSTTOKEN),names[i]);
+               printf("/*%s*/\t\"%s\",\n",tokname(i+FIRSTTOKEN),
+                                               names[i]?names[i]:"");
        printf("};\n");
        exit(0);
 }
        printf("};\n");
        exit(0);
 }
index 91f7d84..d069200 100644 (file)
@@ -1,4 +1,4 @@
-/*     run.c   4.1     82/05/07        */
+/*     run.c   4.2     83/02/09        */
 
 #include "awk.def"
 #include       "math.h"
 
 #include "awk.def"
 #include       "math.h"
@@ -20,7 +20,7 @@ int pairstack[PA2NUM], paircnt;
 node *winner = (node *)NULL;
 #define MAXTMP 20
 cell tmps[MAXTMP];
 node *winner = (node *)NULL;
 #define MAXTMP 20
 cell tmps[MAXTMP];
-static cell nullval ={0,0,0.0,NUM,0};
+static cell nullval ={EMPTY,EMPTY,0.0,NUM,0};
 obj    true    ={ OBOOL, BTRUE, 0 };
 obj    false   ={ OBOOL, BFALSE, 0 };
 
 obj    true    ={ OBOOL, BTRUE, 0 };
 obj    false   ={ OBOOL, BFALSE, 0 };
 
@@ -118,7 +118,7 @@ obj arrayel(a,b) node *a; obj b;
        s = getsval(b.optr);
        x = (cell *) a;
        if (!(x->tval&ARR)) {
        s = getsval(b.optr);
        x = (cell *) a;
        if (!(x->tval&ARR)) {
-               xfree(x->sval);
+               strfree(x->sval);
                x->tval &= ~STR;
                x->tval |= ARR;
                x->sval = (char *) makesymtab();
                x->tval &= ~STR;
                x->tval |= ARR;
                x->sval = (char *) makesymtab();
@@ -214,7 +214,7 @@ obj relop(a,n) node **a;
 tempfree(a) obj a;
 {
        if (!istemp(a)) return;
 tempfree(a) obj a;
 {
        if (!istemp(a)) return;
-       xfree(a.optr->sval);
+       strfree(a.optr->sval);
        a.optr->tval = 0;
 }
 
        a.optr->tval = 0;
 }
 
index 781439b..35a164a 100644 (file)
@@ -1,4 +1,4 @@
-/*     tran.c  4.1     82/05/07        */
+/*     tran.c  4.2     83/02/09        */
 
 #include "stdio.h"
 #include "awk.def"
 
 #include "stdio.h"
 #include "awk.def"
@@ -31,10 +31,10 @@ syminit()
        OFS = &setsymtab("OFS", tostring(" "), 0.0, STR|FLD, symtab)->sval;
        ORS = &setsymtab("ORS", tostring("\n"), 0.0, STR|FLD, symtab)->sval;
        OFMT = &setsymtab("OFMT", tostring("%.6g"), 0.0, STR|FLD, symtab)->sval;
        OFS = &setsymtab("OFS", tostring(" "), 0.0, STR|FLD, symtab)->sval;
        ORS = &setsymtab("ORS", tostring("\n"), 0.0, STR|FLD, symtab)->sval;
        OFMT = &setsymtab("OFMT", tostring("%.6g"), 0.0, STR|FLD, symtab)->sval;
-       FILENAME = &setsymtab("FILENAME", NULL, 0.0, STR|FLD, symtab)->sval;
-       nfloc = setsymtab("NF", NULL, 0.0, NUM, symtab);
+       FILENAME = &setsymtab("FILENAME", EMPTY, 0.0, STR|FLD, symtab)->sval;
+       nfloc = setsymtab("NF", EMPTY, 0.0, NUM, symtab);
        NF = &nfloc->fval;
        NF = &nfloc->fval;
-       nrloc = setsymtab("NR", NULL, 0.0, NUM, symtab);
+       nrloc = setsymtab("NR", EMPTY, 0.0, NUM, symtab);
        NR = &nrloc->fval;
 }
 
        NR = &nrloc->fval;
 }
 
@@ -62,8 +62,8 @@ cell *ap;
        tp = (cell **) ap->sval;
        for (i = 0; i < MAXSYM; i++) {
                for (cp = tp[i]; cp != NULL; cp = cp->nextval) {
        tp = (cell **) ap->sval;
        for (i = 0; i < MAXSYM; i++) {
                for (cp = tp[i]; cp != NULL; cp = cp->nextval) {
-                       xfree(cp->nval);
-                       xfree(cp->sval);
+                       strfree(cp->nval);
+                       strfree(cp->sval);
                        free(cp);
                }
        }
                        free(cp);
                }
        }
@@ -81,7 +81,7 @@ cell **tab;
        cell *lookup();
 
        if (n != NULL && (p = lookup(n, tab, 0)) != NULL) {
        cell *lookup();
 
        if (n != NULL && (p = lookup(n, tab, 0)) != NULL) {
-               xfree(s);
+               if (s != EMPTY ) xfree(s); /* careful here */
                dprintf("setsymtab found %o: %s", p, p->nval, NULL);
                dprintf(" %s %g %o\n", p->sval, p->fval, p->tval);
                return(p);
                dprintf("setsymtab found %o: %s", p, p->nval, NULL);
                dprintf(" %s %g %o\n", p->sval, p->fval, p->tval);
                return(p);
@@ -152,7 +152,7 @@ char *s;
        if ((vp->tval & FLD) && vp->nval == 0)
                donerec = 0;
        if (!(vp->tval&FLD))
        if ((vp->tval & FLD) && vp->nval == 0)
                donerec = 0;
        if (!(vp->tval&FLD))
-               xfree(vp->sval);
+               strfree(vp->sval);
        vp->tval &= ~FLD;
        return(vp->sval = tostring(s));
 }
        vp->tval &= ~FLD;
        return(vp->sval = tostring(s));
 }
@@ -193,7 +193,7 @@ register cell *vp;
        checkval(vp);
        if ((vp->tval & STR) == 0) {
                if (!(vp->tval&FLD))
        checkval(vp);
        if ((vp->tval & STR) == 0) {
                if (!(vp->tval&FLD))
-                       xfree(vp->sval);
+                       strfree(vp->sval);
                if ((long)vp->fval==vp->fval)
                        sprintf(s, "%.20g", vp->fval);
                else
                if ((long)vp->fval==vp->fval)
                        sprintf(s, "%.20g", vp->fval);
                else
@@ -221,10 +221,17 @@ register char *s;
 {
        register char *p;
 
 {
        register char *p;
 
-       p = malloc(strlen(s)+1);
-       if (p == NULL)
-               error(FATAL, "out of space in tostring on %s", s);
-       strcpy(p, s);
+       if (s==NULL){
+               p = malloc(1);
+               if (p == NULL)
+                       error(FATAL, "out of space in tostring on %s", s);
+               *p = '\0';
+       } else {
+               p = malloc(strlen(s)+1);
+               if (p == NULL)
+                       error(FATAL, "out of space in tostring on %s", s);
+               strcpy(p, s);
+       }
        return(p);
 }
 #ifndef yfree
        return(p);
 }
 #ifndef yfree