/* tran.c 4.1 82/05/07 */
cell
*symtab
[MAXSYM
]; /* symbol table pointers */
char **FS
; /* initial field sep */
char **RS
; /* initial record sep */
char **OFS
; /* output field sep */
char **ORS
; /* output record sep */
char **OFMT
; /*output format for numbers*/
awkfloat
*NF
; /* number of fields in current record */
awkfloat
*NR
; /* number of current record */
char **FILENAME
; /* current filename argument */
cell
*recloc
; /* location of record */
setsymtab("0", tostring("0"), 0.0, NUM
|STR
|CON
|FLD
, symtab
);
/* this one is used for if(x)... tests: */
setsymtab("$zero&null", tostring(""), 0.0, NUM
|STR
|CON
|FLD
, symtab
);
recloc
= setsymtab("$record", record
, 0.0, STR
|FLD
, symtab
);
dprintf("recloc %o lookup %o\n", recloc
, lookup("$record", symtab
, 0), NULL
);
FS
= &setsymtab("FS", tostring(" "), 0.0, STR
|FLD
, symtab
)->sval
;
RS
= &setsymtab("RS", tostring("\n"), 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
);
nrloc
= setsymtab("NR", NULL
, 0.0, NUM
, symtab
);
cp
= (cell
**) malloc(MAXSYM
* sizeof(cell
*));
error(FATAL
, "out of space in makesymtab");
for (i
= 0; i
< MAXSYM
; i
++)
freesymtab(ap
) /* free symbol table */
for (i
= 0; i
< MAXSYM
; i
++) {
for (cp
= tp
[i
]; cp
!= NULL
; cp
= cp
->nextval
) {
cell
*setsymtab(n
, s
, f
, t
, tab
)
if (n
!= NULL
&& (p
= lookup(n
, tab
, 0)) != NULL
) {
dprintf("setsymtab found %o: %s", p
, p
->nval
, NULL
);
dprintf(" %s %g %o\n", p
->sval
, p
->fval
, p
->tval
);
p
= (cell
*) malloc(sizeof(cell
));
error(FATAL
, "symbol table overflow at %s", n
);
dprintf("setsymtab set %o: %s", p
, p
->nval
, NULL
);
dprintf(" %s %g %o\n", p
->sval
, p
->fval
, p
->tval
);
hash(s
) /* form hash value for string s */
register unsigned char *s
;
for (hashval
= 0; *s
!= '\0'; )
return(hashval
% MAXSYM
);
cell
*lookup(s
, tab
, flag
) /* look for s in tab, flag must match*/
for (p
= tab
[hash(s
)]; p
!= NULL
; p
= p
->nextval
)
if (strcmp(s
, p
->nval
) == 0 &&
(flag
== 0 || flag
== p
->tval
))
return(p
); /* found it */
return(NULL
); /* not found */
dprintf("setfval: %o %g\n", vp
, f
, NULL
);
error(FATAL
, "can't set $0");
vp
->tval
&= ~STR
; /* mark string invalid */
vp
->tval
|= NUM
; /* mark number ok */
if ((vp
->tval
& FLD
) && vp
->nval
== 0)
dprintf("setsval: %o %s\n", vp
, s
, NULL
);
error(FATAL
, "can't set $0");
if ((vp
->tval
& FLD
) && vp
->nval
== 0)
return(vp
->sval
= tostring(s
));
if (vp
->sval
== record
&& donerec
== 0)
dprintf("getfval: %o", vp
, NULL
, NULL
);
if ((vp
->tval
& NUM
) == 0) {
/* the problem is to make non-numeric things */
/* have unlikely numeric variables, so that */
/* $1 == $2 comparisons sort of make sense when */
/* one or the other is numeric */
if (isnumber(vp
->sval
)) {
vp
->fval
= atof(vp
->sval
);
if (!(vp
->tval
& CON
)) /* don't change type of a constant */
vp
->fval
= 0.0; /* not a very good idea */
dprintf(" %g\n", vp
->fval
, NULL
, NULL
);
if (vp
->sval
== record
&& donerec
== 0)
dprintf("getsval: %o", vp
, NULL
, NULL
);
if ((vp
->tval
& STR
) == 0) {
if ((long)vp
->fval
==vp
->fval
)
sprintf(s
, "%.20g", vp
->fval
);
sprintf(s
, *OFMT
, vp
->fval
);
dprintf(" %s\n", vp
->sval
, NULL
, NULL
);
error(FATAL
, "illegal reference to array %s", vp
->nval
);
if ((vp
->tval
& (NUM
| STR
)) == 0)
error(FATAL
, "funny variable %o: %s %s %g %o", vp
, vp
->nval
,
vp
->sval
, vp
->fval
, vp
->tval
);
error(FATAL
, "out of space in tostring on %s", s
);
char *ymalloc(u
) unsigned u
;