diff options
author | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-02-22 20:22:40 +0000 |
---|---|---|
committer | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-02-22 20:22:40 +0000 |
commit | bcc4ab792d415039fea3afa2976df09f66477721 (patch) | |
tree | 7c8679a254459d9f63a100521bb2f604615e0e13 /Src/hist.c | |
parent | 009b6c9ff50e2a74640d39e339c49ff723712982 (diff) | |
download | zsh-bcc4ab792d415039fea3afa2976df09f66477721.tar.gz zsh-bcc4ab792d415039fea3afa2976df09f66477721.tar.xz zsh-bcc4ab792d415039fea3afa2976df09f66477721.zip |
34604: Work around problem with changes in Meta characters.
If reading in a file that contains characters that should be metafied but are not, fix up on the fly. Only need when using HIST_LEX_WORDS.
Diffstat (limited to 'Src/hist.c')
-rw-r--r-- | Src/hist.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/Src/hist.c b/Src/hist.c index 381c7e2e5..acc425994 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -3377,11 +3377,45 @@ histsplitwords(char *lineptr, short **wordsp, int *nwordsp, int *nwordposp, char *start = lineptr; if (uselex) { - LinkList wordlist = bufferwords(NULL, lineptr, NULL, - LEXFLAGS_COMMENTS_KEEP); + LinkList wordlist; LinkNode wordnode; - int nwords_max; + int nwords_max, remeta = 0; + char *ptr; + + /* + * Handle the special case that we're reading from an + * old shell with fewer meta characters, so we need to + * metafy some more. (It's not clear why the history + * file is metafied at all; some would say this is plain + * stupid. But we're stuck with it now without some + * hairy workarounds for compatibility). + * + * This is rare so doesn't need to be that efficient; just + * allocate space off the heap. + * + * Note that our it's currently believed this all comes out in + * the wash in the non-uselex case owing to where unmetafication + * and metafication happen. + */ + for (ptr = lineptr; *ptr; ptr++) { + if (*ptr != Meta && imeta(*ptr)) + remeta++; + } + if (remeta) { + char *ptr2, *line2; + ptr2 = line2 = (char *)zhalloc((ptr - lineptr) + remeta + 1); + for (ptr = lineptr; *ptr; ptr++) { + if (*ptr != Meta && imeta(*ptr)) { + *ptr2++ = Meta; + *ptr2++ = *ptr ^ 32; + } else + *ptr2++ = *ptr; + } + lineptr = line2; + } + wordlist = bufferwords(NULL, lineptr, NULL, + LEXFLAGS_COMMENTS_KEEP); nwords_max = 2 * countlinknodes(wordlist); if (nwords_max > nwords) { *nwordsp = nwords = nwords_max; |