1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-01 18:30:55 +01:00

34615 + 34619: Remeta one frame earlier

This commit is contained in:
Mikael Magnusson 2015-02-23 14:49:39 +01:00
parent 6fa63a0ce2
commit ed43cf2768
2 changed files with 34 additions and 35 deletions

View file

@ -2500,12 +2500,40 @@ readhistfile(char *fn, int err, int readflags)
|| (hist_ignore_all_dups && newflags & hist_skip_flags))
newflags |= HIST_MAKEUNIQUE;
while (fpos = ftell(in), (l = readhistline(0, &buf, &bufsiz, in))) {
char *pt = buf;
char *pt;
int remeta = 0;
if (l < 0) {
zerr("corrupt history file %s", fn);
break;
}
/*
* 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.
*/
for (pt = buf; *pt; pt++) {
if (*pt == Meta && pt[1])
pt++;
else if (imeta(*pt)) {
remeta = 1;
break;
}
}
if (remeta) {
unmetafy(buf, &remeta);
pt = metafy(buf, remeta, META_USEHEAP);
} else {
pt = buf;
}
if (*pt == ':') {
pt++;
stim = zstrtol(pt, NULL, 0);
@ -3379,40 +3407,7 @@ histsplitwords(char *lineptr, short **wordsp, int *nwordsp, int *nwordposp,
if (uselex) {
LinkList wordlist;
LinkNode wordnode;
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;
}
int nwords_max;
wordlist = bufferwords(NULL, lineptr, NULL,
LEXFLAGS_COMMENTS_KEEP);