=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/awk/lib.c,v retrieving revision 1.32 retrieving revision 1.33 diff -c -r1.32 -r1.33 *** src/usr.bin/awk/lib.c 2020/06/10 21:03:56 1.32 --- src/usr.bin/awk/lib.c 2020/06/10 21:05:02 1.33 *************** *** 1,4 **** ! /* $OpenBSD: lib.c,v 1.32 2020/06/10 21:03:56 millert Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved --- 1,4 ---- ! /* $OpenBSD: lib.c,v 1.33 2020/06/10 21:05:02 millert Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved *************** *** 31,48 **** #include #include #include #include "awk.h" #include "ytab.h" FILE *infile = NULL; ! char *file = ""; char *record; int recsize = RECSIZE; char *fields; int fieldssize = RECSIZE; Cell **fldtab; /* pointers to Cells */ ! char inputFS[100] = " "; #define MAXFLD 2 int nfields = MAXFLD; /* last allocated slot for $i */ --- 31,51 ---- #include #include #include + #include #include "awk.h" #include "ytab.h" + char EMPTY[] = { '\0' }; FILE *infile = NULL; ! char *file = EMPTY; char *record; int recsize = RECSIZE; char *fields; int fieldssize = RECSIZE; Cell **fldtab; /* pointers to Cells */ ! static size_t len_inputFS = 0; ! static char *inputFS = NULL; /* FS at time of input, for field splitting */ #define MAXFLD 2 int nfields = MAXFLD; /* last allocated slot for $i */ *************** *** 54,61 **** int argno = 1; /* current input argument number */ extern Awkfloat *ARGC; ! static Cell dollar0 = { OCELL, CFLD, NULL, "", 0.0, REC|STR|DONTFREE }; ! static Cell dollar1 = { OCELL, CFLD, NULL, "", 0.0, FLD|STR|DONTFREE }; void recinit(unsigned int n) { --- 57,64 ---- int argno = 1; /* current input argument number */ extern Awkfloat *ARGC; ! static Cell dollar0 = { OCELL, CFLD, NULL, EMPTY, 0.0, REC|STR|DONTFREE }; ! static Cell dollar1 = { OCELL, CFLD, NULL, EMPTY, 0.0, FLD|STR|DONTFREE }; void recinit(unsigned int n) { *************** *** 118,126 **** */ void savefs(void) { ! if (strlen(getsval(fsloc)) >= sizeof (inputFS)) FATAL("field separator %.10s... is too long", *FS); ! strlcpy(inputFS, *FS, sizeof(inputFS)); } static bool firsttime = true; --- 121,137 ---- */ void savefs(void) { ! 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); ! memcpy(inputFS, *FS, len_inputFS); } static bool firsttime = true; *************** *** 335,348 **** *fr = 0; } else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */ for (i = 0; *r != '\0'; r += n) { ! char buf[MB_CUR_MAX + 1]; i++; if (i > nfields) growfldtab(i); if (freeable(fldtab[i])) xfree(fldtab[i]->sval); ! n = mblen(r, MB_CUR_MAX); if (n < 0) n = 1; memcpy(buf, r, n); --- 346,359 ---- *fr = 0; } else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */ for (i = 0; *r != '\0'; r += n) { ! char buf[MB_LEN_MAX + 1]; i++; if (i > nfields) growfldtab(i); if (freeable(fldtab[i])) xfree(fldtab[i]->sval); ! n = mblen(r, MB_LEN_MAX); if (n < 0) n = 1; memcpy(buf, r, n); *************** *** 406,412 **** p = fldtab[i]; if (freeable(p)) xfree(p->sval); ! p->sval = ""; p->tval = FLD | STR | DONTFREE; } } --- 417,423 ---- p = fldtab[i]; if (freeable(p)) xfree(p->sval); ! p->sval = EMPTY, p->tval = FLD | STR | DONTFREE; } }