diff options
author | Denis Vlasenko | 2007-07-18 18:32:25 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-07-18 18:32:25 +0000 |
commit | af1bd0962527ae7c3b75fcc028186e5def6141d5 (patch) | |
tree | 07eb5a4c38d6d6df104f0aaa52cbcbd722f54e58 | |
parent | b78c782c85705494634a936f6a9b0c6fcaf0860a (diff) | |
download | busybox-af1bd0962527ae7c3b75fcc028186e5def6141d5.zip busybox-af1bd0962527ae7c3b75fcc028186e5def6141d5.tar.gz |
awk: fix -F 'regex' bug (miscounted fields if last field is empty)
-rw-r--r-- | editors/awk.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/editors/awk.c b/editors/awk.c index c087a5d..752c73e 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -1522,9 +1522,12 @@ static int awk_split(const char *s, node *spl, char **slist) if (*getvar_s(intvar[RS]) == '\0') c[2] = '\n'; - if ((spl->info & OPCLSMASK) == OC_REGEXP) { /* regex split */ - while (*s) { - l = strcspn(s, c+2); + if ((spl->info & OPCLSMASK) == OC_REGEXP) { /* regex split */ + if (!*s) + return n; /* "": zero fields */ + n++; /* at least one field will be there */ + do { + l = strcspn(s, c+2); /* len till next NUL or \n */ if (regexec(icase ? spl->r.ire : spl->l.re, s, 1, pmatch, 0) == 0 && pmatch[0].rm_so <= l ) { @@ -1533,24 +1536,27 @@ static int awk_split(const char *s, node *spl, char **slist) l++; pmatch[0].rm_eo++; } + n++; /* we saw yet another delimiter */ } else { pmatch[0].rm_eo = l; if (s[l]) pmatch[0].rm_eo++; } - memcpy(s1, s, l); s1[l] = '\0'; nextword(&s1); s += pmatch[0].rm_eo; - n++; - } - } else if (c[0] == '\0') { /* null split */ + } while (*s); + return n; + } + if (c[0] == '\0') { /* null split */ while (*s) { *s1++ = *s++; *s1++ = '\0'; n++; } - } else if (c[0] != ' ') { /* single-character split */ + return n; + } + if (c[0] != ' ') { /* single-character split */ if (icase) { c[0] = toupper(c[0]); c[1] = tolower(c[1]); @@ -1560,21 +1566,23 @@ static int awk_split(const char *s, node *spl, char **slist) *s1++ = '\0'; n++; } - } else { /* space split */ - while (*s) { - s = skip_whitespace(s); - if (!*s) break; - n++; - while (*s && !isspace(*s)) - *s1++ = *s++; - *s1++ = '\0'; - } + return n; + } + /* space split */ + while (*s) { + s = skip_whitespace(s); + if (!*s) break; + n++; + while (*s && !isspace(*s)) + *s1++ = *s++; + *s1++ = '\0'; } return n; } static void split_f0(void) { +/* static char *fstrings; */ #define fstrings (G.split_f0__fstrings) int i, n; |