diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2010-10-02 21:03:03 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2010-10-02 21:03:03 +0000 |
commit | 66f32a80dced4f03345b951573789821ecc8164e (patch) | |
tree | 6626d6793f69e502104a5fd691ca2e9b8d1fb189 /Src/hist.c | |
parent | 377f2bb8124d441e6927856c51e61c40516ae09e (diff) | |
download | zsh-66f32a80dced4f03345b951573789821ecc8164e.tar.gz zsh-66f32a80dced4f03345b951573789821ecc8164e.tar.xz zsh-66f32a80dced4f03345b951573789821ecc8164e.zip |
28308/28310: HIST_LEX_WORDS, check for quick history read
Diffstat (limited to 'Src/hist.c')
-rw-r--r-- | Src/hist.c | 108 |
1 files changed, 64 insertions, 44 deletions
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) { |