version 1.32, 2020/06/10 21:03:56 |
version 1.33, 2020/06/10 21:05:02 |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <unistd.h> |
#include <unistd.h> |
#include <stdarg.h> |
#include <stdarg.h> |
|
#include <limits.h> |
#include "awk.h" |
#include "awk.h" |
#include "ytab.h" |
#include "ytab.h" |
|
|
|
char EMPTY[] = { '\0' }; |
FILE *infile = NULL; |
FILE *infile = NULL; |
char *file = ""; |
char *file = EMPTY; |
char *record; |
char *record; |
int recsize = RECSIZE; |
int recsize = RECSIZE; |
char *fields; |
char *fields; |
int fieldssize = RECSIZE; |
int fieldssize = RECSIZE; |
|
|
Cell **fldtab; /* pointers to Cells */ |
Cell **fldtab; /* pointers to Cells */ |
char inputFS[100] = " "; |
static size_t len_inputFS = 0; |
|
static char *inputFS = NULL; /* FS at time of input, for field splitting */ |
|
|
#define MAXFLD 2 |
#define MAXFLD 2 |
int nfields = MAXFLD; /* last allocated slot for $i */ |
int nfields = MAXFLD; /* last allocated slot for $i */ |
|
|
int argno = 1; /* current input argument number */ |
int argno = 1; /* current input argument number */ |
extern Awkfloat *ARGC; |
extern Awkfloat *ARGC; |
|
|
static Cell dollar0 = { OCELL, CFLD, NULL, "", 0.0, REC|STR|DONTFREE }; |
static Cell dollar0 = { OCELL, CFLD, NULL, EMPTY, 0.0, REC|STR|DONTFREE }; |
static Cell dollar1 = { OCELL, CFLD, NULL, "", 0.0, FLD|STR|DONTFREE }; |
static Cell dollar1 = { OCELL, CFLD, NULL, EMPTY, 0.0, FLD|STR|DONTFREE }; |
|
|
void recinit(unsigned int n) |
void recinit(unsigned int n) |
{ |
{ |
|
|
*/ |
*/ |
void savefs(void) |
void savefs(void) |
{ |
{ |
if (strlen(getsval(fsloc)) >= sizeof (inputFS)) |
size_t len; |
|
if ((len = strlen(getsval(fsloc))) < len_inputFS) { |
|
strlcpy(inputFS, *FS, sizeof(inputFS)); /* for subsequent field splitting */ |
|
return; |
|
} |
|
|
|
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); |
strlcpy(inputFS, *FS, sizeof(inputFS)); |
memcpy(inputFS, *FS, len_inputFS); |
} |
} |
|
|
static bool firsttime = true; |
static bool firsttime = true; |
|
|
*fr = 0; |
*fr = 0; |
} else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */ |
} else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */ |
for (i = 0; *r != '\0'; r += n) { |
for (i = 0; *r != '\0'; r += n) { |
char buf[MB_CUR_MAX + 1]; |
char buf[MB_LEN_MAX + 1]; |
|
|
i++; |
i++; |
if (i > nfields) |
if (i > nfields) |
growfldtab(i); |
growfldtab(i); |
if (freeable(fldtab[i])) |
if (freeable(fldtab[i])) |
xfree(fldtab[i]->sval); |
xfree(fldtab[i]->sval); |
n = mblen(r, MB_CUR_MAX); |
n = mblen(r, MB_LEN_MAX); |
if (n < 0) |
if (n < 0) |
n = 1; |
n = 1; |
memcpy(buf, r, n); |
memcpy(buf, r, n); |
|
|
p = fldtab[i]; |
p = fldtab[i]; |
if (freeable(p)) |
if (freeable(p)) |
xfree(p->sval); |
xfree(p->sval); |
p->sval = ""; |
p->sval = EMPTY, |
p->tval = FLD | STR | DONTFREE; |
p->tval = FLD | STR | DONTFREE; |
} |
} |
} |
} |