version 1.36, 2020/06/11 12:00:51 |
version 1.37, 2020/06/16 16:14:22 |
|
|
*/ |
*/ |
void savefs(void) |
void savefs(void) |
{ |
{ |
size_t len; |
size_t len = strlen(getsval(fsloc)); |
if ((len = strlen(getsval(fsloc))) < len_inputFS) { |
if (len >= len_inputFS) { |
strlcpy(inputFS, *FS, len_inputFS); /* for subsequent field splitting */ |
len_inputFS = len + 1; |
return; |
inputFS = realloc(inputFS, len_inputFS); |
|
if (inputFS == NULL) |
|
FATAL("field separator %.10s... is too long", *FS); |
} |
} |
|
if (strlcpy(inputFS, *FS, len_inputFS) >= len_inputFS) |
len_inputFS = len + 1; |
|
inputFS = realloc(inputFS, len_inputFS); |
|
if (inputFS == NULL) |
|
FATAL("field separator %.10s... is too long", *FS); |
FATAL("field separator %.10s... is too long", *FS); |
memcpy(inputFS, *FS, len_inputFS); |
|
} |
} |
|
|
static bool firsttime = true; |
static bool firsttime = true; |
|
|
DPRINTF( ("into refldbld, rec = <%s>, pat = <%s>\n", rec, fs) ); |
DPRINTF( ("into refldbld, rec = <%s>, pat = <%s>\n", rec, fs) ); |
tempstat = pfa->initstat; |
tempstat = pfa->initstat; |
for (i = 1; ; i++) { |
for (i = 1; ; i++) { |
|
const size_t fss_rem = fields + fieldssize + 1 - fr; |
if (i > nfields) |
if (i > nfields) |
growfldtab(i); |
growfldtab(i); |
if (freeable(fldtab[i])) |
if (freeable(fldtab[i])) |
|
|
fldtab[i]->sval = fr; |
fldtab[i]->sval = fr; |
DPRINTF( ("refldbld: i=%d\n", i) ); |
DPRINTF( ("refldbld: i=%d\n", i) ); |
if (nematch(pfa, rec)) { |
if (nematch(pfa, rec)) { |
|
const size_t reclen = patbeg - rec; |
pfa->initstat = 2; /* horrible coupling to b.c */ |
pfa->initstat = 2; /* horrible coupling to b.c */ |
DPRINTF( ("match %s (%d chars)\n", patbeg, patlen) ); |
DPRINTF( ("match %s (%d chars)\n", patbeg, patlen) ); |
strncpy(fr, rec, patbeg-rec); |
if (reclen >= fss_rem) |
fr += patbeg - rec + 1; |
FATAL("out of space for fields in refldbld"); |
*(fr-1) = '\0'; |
memcpy(fr, rec, reclen); |
|
fr += reclen; |
|
*fr++ = '\0'; |
rec = patbeg + patlen; |
rec = patbeg + patlen; |
} else { |
} else { |
DPRINTF( ("no match %s\n", rec) ); |
DPRINTF( ("no match %s\n", rec) ); |
strlcpy(fr, rec, fields + fieldssize - fr); |
if (strlcpy(fr, rec, fss_rem) >= fss_rem) |
|
FATAL("out of space for fields in refldbld"); |
pfa->initstat = tempstat; |
pfa->initstat = tempstat; |
break; |
break; |
} |
} |