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
-/* 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
extern char **FILENAME;
extern char record[];
extern char **FILENAME;
extern char record[];
extern int dbg;
extern int lineno;
extern int errorflag;
extern int dbg;
extern int lineno;
extern int errorflag;
#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();
-/* 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
}
}
<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(';'); }
-/* 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"
#define RECSIZE (5 * 512)
char record[RECSIZE];
char fields[RECSIZE];
#define RECSIZE (5 * 512)
char record[RECSIZE];
char fields[RECSIZE];
#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,
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))
+ strfree(fldtab[i].sval);
fldtab[i].sval = fr;
fldtab[i].tval = FLD | STR;
do
fldtab[i].sval = fr;
fldtab[i].tval = FLD | STR;
do
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))
+ 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 */
*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))
+ strfree(fldtab[j].sval);
fldtab[j].tval = STR | FLD;
fldtab[j].tval = STR | FLD;
+ fldtab[j].sval = EMPTY;
}
maxfld = i;
donefld = 1;
}
maxfld = i;
donefld = 1;
+ 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++;
-/* 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
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);
}
-/* 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"
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 };
s = getsval(b.optr);
x = (cell *) a;
if (!(x->tval&ARR)) {
s = getsval(b.optr);
x = (cell *) a;
if (!(x->tval&ARR)) {
x->tval &= ~STR;
x->tval |= ARR;
x->sval = (char *) makesymtab();
x->tval &= ~STR;
x->tval |= ARR;
x->sval = (char *) makesymtab();
tempfree(a) obj a;
{
if (!istemp(a)) return;
tempfree(a) obj a;
{
if (!istemp(a)) return;
-/* 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"
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);
- nrloc = setsymtab("NR", NULL, 0.0, NUM, symtab);
+ nrloc = setsymtab("NR", EMPTY, 0.0, NUM, symtab);
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);
cell *lookup();
if (n != NULL && (p = lookup(n, tab, 0)) != NULL) {
cell *lookup();
if (n != NULL && (p = lookup(n, tab, 0)) != NULL) {
+ 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);
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))
vp->tval &= ~FLD;
return(vp->sval = tostring(s));
}
vp->tval &= ~FLD;
return(vp->sval = tostring(s));
}
checkval(vp);
if ((vp->tval & STR) == 0) {
if (!(vp->tval&FLD))
checkval(vp);
if ((vp->tval & STR) == 0) {
if (!(vp->tval&FLD))
if ((long)vp->fval==vp->fval)
sprintf(s, "%.20g", vp->fval);
else
if ((long)vp->fval==vp->fval)
sprintf(s, "%.20g", vp->fval);
else
- 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