version 1.4, 1997/08/25 16:17:11 |
version 1.5, 1999/04/18 17:06:30 |
|
|
int fieldssize = RECSIZE; |
int fieldssize = RECSIZE; |
|
|
Cell **fldtab; /* pointers to Cells */ |
Cell **fldtab; /* pointers to Cells */ |
char inputFS[100]; |
char inputFS[100] = " "; |
|
|
#define MAXFLD 200 |
#define MAXFLD 200 |
int nfields = MAXFLD; /* last allocated slot for $i */ |
int nfields = MAXFLD; /* last allocated slot for $i */ |
|
|
} |
} |
dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n", |
dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n", |
*RS, *FS, *ARGC, *FILENAME) ); |
*RS, *FS, *ARGC, *FILENAME) ); |
donefld = 0; |
if (isrecord) { |
donerec = 1; |
donefld = 0; |
|
donerec = 1; |
|
} |
buf[0] = 0; |
buf[0] = 0; |
while (argno < *ARGC || infile == stdin) { |
while (argno < *ARGC || infile == stdin) { |
dprintf( ("argno=%d, file=|%s|\n", argno, file) ); |
dprintf( ("argno=%d, file=|%s|\n", argno, file) ); |
|
|
xfree(fldtab[0]->sval); |
xfree(fldtab[0]->sval); |
fldtab[0]->sval = buf; /* buf == record */ |
fldtab[0]->sval = buf; /* buf == record */ |
fldtab[0]->tval = REC | STR | DONTFREE; |
fldtab[0]->tval = REC | STR | DONTFREE; |
if (isnumber(fldtab[0]->sval)) { |
if (is_number(fldtab[0]->sval)) { |
fldtab[0]->fval = atof(fldtab[0]->sval); |
fldtab[0]->fval = atof(fldtab[0]->sval); |
fldtab[0]->tval |= NUM; |
fldtab[0]->tval |= NUM; |
} |
} |
|
|
p = qstring(p, '\0'); |
p = qstring(p, '\0'); |
q = setsymtab(s, p, 0.0, STR, symtab); |
q = setsymtab(s, p, 0.0, STR, symtab); |
setsval(q, p); |
setsval(q, p); |
if (isnumber(q->sval)) { |
if (is_number(q->sval)) { |
q->fval = atof(q->sval); |
q->fval = atof(q->sval); |
q->tval |= NUM; |
q->tval |= NUM; |
} |
} |
|
|
donefld = 1; |
donefld = 1; |
for (j = 1; j <= lastfld; j++) { |
for (j = 1; j <= lastfld; j++) { |
p = fldtab[j]; |
p = fldtab[j]; |
if(isnumber(p->sval)) { |
if(is_number(p->sval)) { |
p->fval = atof(p->sval); |
p->fval = atof(p->sval); |
p->tval |= NUM; |
p->tval |= NUM; |
} |
} |
|
|
{ |
{ |
int i; |
int i; |
char *r, *p; |
char *r, *p; |
char *buf = record; |
|
int bufsize = recsize; |
|
|
|
if (donerec == 1) |
if (donerec == 1) |
return; |
return; |
r = buf; |
r = record; |
for (i = 1; i <= *NF; i++) { |
for (i = 1; i <= *NF; i++) { |
p = getsval(fldtab[i]); |
p = getsval(fldtab[i]); |
if (!adjbuf(&buf, &bufsize, 1+strlen(p)+r-buf, recsize, &r, "recbld 1")) |
if (!adjbuf(&record, &recsize, 1+strlen(p)+r-record, recsize, &r, "recbld 1")) |
ERROR "created $0 `%.30s...' too long", buf FATAL; |
ERROR "created $0 `%.30s...' too long", record FATAL; |
while ((*r = *p++) != 0) |
while ((*r = *p++) != 0) |
r++; |
r++; |
if (i < *NF) { |
if (i < *NF) { |
if (!adjbuf(&buf, &bufsize, 2+strlen(*OFS)+r-buf, recsize, &r, "recbld 2")) |
if (!adjbuf(&record, &recsize, 2+strlen(*OFS)+r-record, recsize, &r, "recbld 2")) |
ERROR "created $0 `%.30s...' too long", buf FATAL; |
ERROR "created $0 `%.30s...' too long", record FATAL; |
for (p = *OFS; (*r = *p++) != 0; ) |
for (p = *OFS; (*r = *p++) != 0; ) |
r++; |
r++; |
} |
} |
} |
} |
if (!adjbuf(&buf, &bufsize, 2+r-buf, recsize, &r, "recbld 3")) |
if (!adjbuf(&record, &recsize, 2+r-record, recsize, &r, "recbld 3")) |
ERROR "built giant record `%.30s...'", buf FATAL; |
ERROR "built giant record `%.30s...'", record FATAL; |
*r = '\0'; |
*r = '\0'; |
dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); |
dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); |
|
|
if (buf != record) { /* increased size of record */ |
|
record = buf; /* BUG? memory leak? */ |
|
recsize = bufsize; |
|
} |
|
if (freeable(fldtab[0])) |
if (freeable(fldtab[0])) |
xfree(fldtab[0]->sval); |
xfree(fldtab[0]->sval); |
fldtab[0]->tval = REC | STR | DONTFREE; |
fldtab[0]->tval = REC | STR | DONTFREE; |
|
|
/* strtod is supposed to be a proper test of what's a valid number */ |
/* strtod is supposed to be a proper test of what's a valid number */ |
|
|
#include <math.h> |
#include <math.h> |
int isnumber(char *s) |
int is_number(char *s) |
{ |
{ |
double r; |
double r; |
char *ep; |
char *ep; |