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:
parent
6fa63a0ce2
commit
ed43cf2768
2 changed files with 34 additions and 35 deletions
65
Src/hist.c
65
Src/hist.c
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue