From 66f32a80dced4f03345b951573789821ecc8164e Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sat, 2 Oct 2010 21:03:03 +0000 Subject: 28308/28310: HIST_LEX_WORDS, check for quick history read --- Src/hist.c | 108 ++++++++++++++++++++++++++++++++++------------------------ Src/options.c | 1 + Src/zsh.h | 1 + 3 files changed, 66 insertions(+), 44 deletions(-) (limited to 'Src') diff --git a/Src/hist.c b/Src/hist.c index c1341b002..b9f315280 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -2232,7 +2232,6 @@ readhistfile(char *fn, int err, int readflags) struct stat sb; int nwordpos, nwords, bufsiz; int searching, newflags, l, ret; - LinkList wordlist; if (!fn && !(fn = getsparam("HISTFILE"))) return; @@ -2336,60 +2335,81 @@ readhistfile(char *fn, int err, int readflags) he->ftim = ftim; /* - * Divide up the words. Attempt to do this using the lexer. + * Divide up the words. */ nwordpos = 0; start = pt; - wordlist = bufferwords(NULL, pt, NULL); - he->nwords = countlinknodes(wordlist); - if (2*he->nwords > nwords) { - nwords = 2*he->nwords; - words = (short *)realloc(words, nwords*sizeof(short)); - } - while (firstnode(wordlist)) { - char *word = uremnode(wordlist, firstnode(wordlist)); + if (isset(HISTLEXWORDS) && !(readflags & HFILE_FAST)) { + /* + * Attempt to do this using the lexer. + */ + LinkList wordlist = bufferwords(NULL, pt, NULL); + he->nwords = countlinknodes(wordlist); + if (2*he->nwords > nwords) { + nwords = 2*he->nwords; + words = (short *)realloc(words, nwords*sizeof(short)); + } + while (firstnode(wordlist)) { + char *word = uremnode(wordlist, firstnode(wordlist)); - while (inblank(*pt)) - pt++; - if (!strpfx(word, pt)) { - int bad = 0; - /* - * Oddity 1: newlines turn into semicolons. - */ - if (!strcmp(word, ";")) - continue; - /* - * Oddity 2: !'s turn into |'s. - */ - while (*pt) { - if (!*word) { - bad = 1; - break; + while (inblank(*pt)) + pt++; + if (!strpfx(word, pt)) { + int bad = 0; + /* + * Oddity 1: newlines turn into semicolons. + */ + if (!strcmp(word, ";")) + continue; + /* + * Oddity 2: !'s turn into |'s. + */ + while (*pt) { + if (!*word) { + bad = 1; + break; + } + if (*pt == *word || + (*pt == '!' && *word == '|')) { + pt++; + word++; + } else { + bad = 1; + break; + } } - if (*pt == *word || - (*pt == '!' && *word == '|')) { - pt++; - word++; - } else { - bad = 1; + if (bad) { +#ifdef DEBUG + dputs(ERRMSG("bad wordsplit reading history: " + "%s\nat: %s\nword: %s"), + start, pt, word); +#endif + words[nwordpos++] = pt - start; + pt += strlen(pt); + words[nwordpos++] = pt - start; break; } } - if (bad) { -#ifdef DEBUG - dputs(ERRMSG("bad wordsplit reading history: %s\nat: %s" - "\nword: %s"), - start, pt, word); -#endif + words[nwordpos++] = pt - start; + pt += strlen(word); + words[nwordpos++] = pt - start; + } + } else { + do { + while (inblank(*pt)) + pt++; + if (*pt) { + if (nwordpos >= nwords) + words = (short *) + realloc(words, (nwords += 64)*sizeof(short)); words[nwordpos++] = pt - start; - pt += strlen(pt); + while (*pt && !inblank(*pt)) + pt++; words[nwordpos++] = pt - start; - break; } - } - words[nwordpos++] = pt - start; - pt += strlen(word); - words[nwordpos++] = pt - start; + } while (*pt); + + he->nwords = nwordpos/2; } if (he->nwords) { diff --git a/Src/options.c b/Src/options.c index 02b471925..a2d5e0855 100644 --- a/Src/options.c +++ b/Src/options.c @@ -149,6 +149,7 @@ static struct optname optns[] = { {{NULL, "histignorealldups", 0}, HISTIGNOREALLDUPS}, {{NULL, "histignoredups", 0}, HISTIGNOREDUPS}, {{NULL, "histignorespace", 0}, HISTIGNORESPACE}, +{{NULL, "histlexwords", 0}, HISTLEXWORDS}, {{NULL, "histnofunctions", 0}, HISTNOFUNCTIONS}, {{NULL, "histnostore", 0}, HISTNOSTORE}, {{NULL, "histsubstpattern", OPT_EMULATE}, HISTSUBSTPATTERN}, diff --git a/Src/zsh.h b/Src/zsh.h index 7849b6986..cc50826e5 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1942,6 +1942,7 @@ enum { HISTIGNOREALLDUPS, HISTIGNOREDUPS, HISTIGNORESPACE, + HISTLEXWORDS, HISTNOFUNCTIONS, HISTNOSTORE, HISTREDUCEBLANKS, -- cgit 1.4.1