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}
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
int maxfld
= 0; /* last used field */
dprintf("**RS=%o, **FS=%o\n", **RS
, **FS
, NULL
);
dprintf("svargc=%d, *svargv=%s\n", svargc
, *svargv
, NULL
);
if (infile
== NULL
) { /* have to open a new file */
if (member('=', *svargv
)) { /* it's a var=value argument */
*FILENAME
= file
= *svargv
;
dprintf("opening file %s\n", file
, NULL
, NULL
);
else if ((infile
= fopen(file
, "r")) == NULL
)
error(FATAL
, "can't open %s", file
);
for (; (c
=getc(infile
)) != sep
&& c
!= EOF
; *rr
++ = c
)
if (**RS
== sep
|| c
== EOF
)
if ((c
= getc(infile
)) == '\n' || c
== EOF
) /* 2 in a row */
error(FATAL
, "record `%.20s...' too long", record
);
if (c
!= EOF
) /* normal record */
/* EOF arrived on this file; set up next */
return(0); /* true end of file */
setclvar(s
) /* set var=value from s */
for (p
=s
; *p
!= '='; p
++)
q
= setsymtab(s
, tostring(p
), 0.0, STR
, symtab
);
dprintf("command line set %s to |%s|\n", s
, p
, NULL
);
register char *r
, *fr
, sep
;
while (*r
== ' ' || *r
== '\t' || *r
== '\n')
error(FATAL
, "record `%.20s...' has too many fields", record
);
if (!(fldtab
[i
].tval
&FLD
))
fldtab
[i
].tval
= FLD
| STR
;
while (*r
!= ' ' && *r
!= '\t' && *r
!= '\n' && *r
!= '\0');
error(FATAL
, "record `%.20s...' has too many fields", record
);
if (!(fldtab
[i
].tval
&FLD
))
fldtab
[i
].tval
= FLD
| STR
;
while (*r
!= sep
&& *r
!= '\n' && *r
!= '\0') /* \n always a separator */
for (j
=maxfld
; j
>i
; j
--) { /* clean out junk from previous record */
if (!(fldtab
[j
].tval
&FLD
))
fldtab
[j
].tval
= STR
| FLD
;
if(isnumber(fldtab
[i
].sval
))
{ fldtab
[i
].fval
= atof(fldtab
[i
].sval
);
setfval(lookup("NF", symtab
), (awkfloat
) maxfld
);
for (i
= 0; i
<= maxfld
; i
++)
printf("field %d: |%s|\n", i
, fldtab
[i
].sval
);
if (donefld
== 0 || donerec
== 1)
for (i
= 1; i
<= *NF
; i
++) {
dprintf("in recbld FS=%o, recloc=%o\n", **FS
, recloc
, NULL
);
recloc
->tval
= STR
| FLD
;
dprintf("in recbld FS=%o, recloc=%o\n", **FS
, recloc
, NULL
);
error(FATAL
, "built giant record `%.20s...'", record
);
dprintf("recbld = |%s|\n", record
, NULL
, NULL
);
error(FATAL
, "trying to access field %d", n
);
fprintf(stderr
, "awk: %s near line %d\n", s
, lineno
);
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
, " record number %g\n", *NR
);
dprintf("%s\n", s
, NULL
, NULL
);
{ if(isdigit(*s) || *s=='-' || *s=='.'
|| *s=='+' || *s=='e' || *s=='E')
isnumber(s
) char *s
; {return(0);}