summaryrefslogtreecommitdiff
path: root/Src/hist.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/hist.c')
-rw-r--r--Src/hist.c56
1 files changed, 34 insertions, 22 deletions
diff --git a/Src/hist.c b/Src/hist.c
index 6b3aa3b33..00773cd74 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -222,12 +222,12 @@ iaddtoline(int c)
exlast--;
zleaddtolineptr('\\');
}
- if (excs > zlecs) {
+ if (excs > zlemetacs) {
excs += 1 + inbufct - exlast;
- if (excs < zlecs)
+ if (excs < zlemetacs)
/* this case could be handled better but it is *
* so rare that it does not worth it */
- excs = zlecs;
+ excs = zlemetacs;
}
exlast = inbufct;
zleaddtolineptr(itok(c) ? ztokens[c - Pound] : c);
@@ -662,8 +662,8 @@ ihungetc(int c)
hungetc('\n'), hungetc('\\');
if (expanding) {
- zlecs--;
- zlell--;
+ zlemetacs--;
+ zlemetall--;
exlast++;
}
DPUTS(hptr <= chline, "BUG: hungetc attempted at buffer start");
@@ -2241,15 +2241,27 @@ histfileIsLocked(void)
return lockhistct > 0;
}
-/* Get the words in the current buffer. Using the lexer. */
+/*
+ * Get the words in the current buffer. Using the lexer.
+ *
+ * As far as I can make out, this is a gross hack based on a gross hack.
+ * When analysing lines from within zle, we tweak the metafied line
+ * positions (zlemetall and zlemetacs) directly in the lexer. That's
+ * bad enough, but this function appears to be designed to be called
+ * from outside zle, pretending to be in zle and calling out, so
+ * we set zlemetall and zlemetacs locally and copy the current zle line,
+ * which may not even be valid at this point.
+ *
+ * However, I'm so confused it could simply be baking Bakewell tarts.
+ */
/**/
mod_export LinkList
bufferwords(LinkList list, char *buf, int *index)
{
- int num = 0, cur = -1, got = 0, ne = noerrs, ocs = zlecs, oll = zlell;
+ int num = 0, cur = -1, got = 0, ne = noerrs;
int owb = wb, owe = we, oadx = addedx, ozp = zleparse, onc = nocomments;
- int ona = noaliases;
+ int ona = noaliases, ocs = zlemetacs, oll = zlemetall;
char *p;
if (!list)
@@ -2267,47 +2279,47 @@ bufferwords(LinkList list, char *buf, int *index)
p[l] = ' ';
p[l + 1] = '\0';
inpush(p, 0, NULL);
- zlell = strlen(p) ;
- zlecs = zlell + 1;
+ zlemetall = strlen(p) ;
+ zlemetacs = zlemetall + 1;
nocomments = 1;
} else {
int ll, cs;
char *linein;
if (zlegetlineptr) {
- linein = zlegetlineptr(&ll, &cs);
+ linein = (char *)zlegetlineptr(&ll, &cs);
} else {
linein = ztrdup("");
ll = cs = 0;
}
- zlell = ll + 1; /* length of line plus space added below */
- zlecs = cs;
+ zlemetall = ll + 1; /* length of line plus space added below */
+ zlemetacs = cs;
if (!isfirstln && chline) {
p = (char *) zhalloc(hptr - chline + ll + 2);
memcpy(p, chline, hptr - chline);
memcpy(p + (hptr - chline), linein, ll);
p[(hptr - chline) + ll] = ' ';
- p[(hptr - chline) + zlell] = '\0';
+ p[(hptr - chline) + zlemetall] = '\0';
inpush(p, 0, NULL);
/*
* advance line length and character position over
* prepended string.
*/
- zlell += hptr - chline;
- zlecs += hptr - chline;
+ zlemetall += hptr - chline;
+ zlemetacs += hptr - chline;
} else {
p = (char *) zhalloc(ll + 2);
memcpy(p, linein, ll);
p[ll] = ' ';
- p[zlell] = '\0';
+ p[zlemetall] = '\0';
inpush(p, 0, NULL);
}
- zsfree(linein);
+ zsfree(linein);
}
- if (zlecs)
- zlecs--;
+ if (zlemetacs)
+ zlemetacs--;
strinbeg(0);
noaliases = 1;
do {
@@ -2363,8 +2375,8 @@ bufferwords(LinkList list, char *buf, int *index)
nocomments = onc;
noerrs = ne;
lexrestore();
- zlecs = ocs;
- zlell = oll;
+ zlemetacs = ocs;
+ zlemetall = oll;
wb = owb;
we = owe;
addedx = oadx;