static char sccsid
[] = "@(#)lib.c 4.4 %G%";
#define RECSIZE (5 * 512)
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 {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
,
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
|| rr
> record
) { /* 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
;
i
= 0; /* number of fields accumulated here */
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');
else if (*r
!= 0) /* if 0, it's a null field */
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
-1; 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
, 0), (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
);
#define MAXEXPON 38 /* maximum exponenet for fp number */
while (*s
== ' ' || *s
== '\t' || *s
== '\n')
return(0); /* empty stuff isn't number */
if (*s
== '+' || *s
== '-')
if (!isdigit(*s
) && *s
!= '.')
return(0); /* too many digits to convert */
if (!(d1
|| point
&& d2
))
if (*s
== 'e' || *s
== 'E') {
if (*s
== '+' || *s
== '-')
else if (s
- es
== 2 && 10 * (*es
-'0') + *(es
+1)-'0' >= MAXEXPON
)
while (*s
== ' ' || *s
== '\t' || *s
== '\n')
isnumber(s) char *s; {return(0);}