about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2004-07-11 22:53:01 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2004-07-11 22:53:01 +0000
commit86ae90bc1c2866b1b10a326d4cdbdb8b02a9f9a9 (patch)
tree0411ce469f4c945ade10a3aca46d1ea1c79e8237
parentf63b677f53d19553e7f63755fe4575638d64ae86 (diff)
downloadzsh-86ae90bc1c2866b1b10a326d4cdbdb8b02a9f9a9.tar.gz
zsh-86ae90bc1c2866b1b10a326d4cdbdb8b02a9f9a9.tar.xz
zsh-86ae90bc1c2866b1b10a326d4cdbdb8b02a9f9a9.zip
20149: improve prompt-reset code
20150: commit ancient memory leak fix(?) in completion
-rw-r--r--ChangeLog15
-rw-r--r--Doc/Zsh/zle.yo6
-rw-r--r--Src/Zle/compresult.c3
-rw-r--r--Src/Zle/zle_main.c17
-rw-r--r--Src/init.c6
-rw-r--r--Src/input.c13
-rw-r--r--Src/loop.c2
-rw-r--r--Src/zsh.h2
8 files changed, 40 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 911ece7e9..c83b389e0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2004-07-11  Peter Stephenson  <pws@pwstephenson.fsnet.co.uk>
+
+	* 20150: Src/Zle/compresult.c: repost of ancient attempt
+	to fix memory leak in completion.
+
+	* 20149: Doc/Zsh/zle.yo, Src/init.c, Src/input.c, Src/loop.c,
+	Src/zsh.h, Src/Zle/zle_main.c: alter users/7650 so that
+	prompt variable is always reread; fixes bug that if PS1
+	was altered the prompt string was invalid.
+
 2004-07-07  Peter Stephenson  <pws@csr.com>
 
 	* 20142: Test/A06assign.ztst: add test for bug fixed in
@@ -26,8 +36,9 @@
 
 2004-07-01  Peter Stephenson  <pws@csr.com>
 
-	* 7650: Doc/Zsh/zle.yo, Src/Zle/iwidgets.list, Src/Zle/zle_main.c:
-	new zle widget prompt-reset redisplays screen with prompt updated.
+	* users/7650: Doc/Zsh/zle.yo, Src/Zle/iwidgets.list,
+	Src/Zle/zle_main.c: new zle widget prompt-reset redisplays screen
+	with prompt updated.
 
 2004-06-30  Peter Stephenson  <pws@csr.com>
 
diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index 6c0b36005..f2067d14f 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -1740,13 +1740,13 @@ Redisplays the edit buffer.
 tindex(reset-prompt)
 item(tt(reset-prompt) (unbound) (unbound) (unbound))(
 Force the prompts on both the left and right of the screen to be
-re-expanded, then redisplay the edit buffer.  Note that this
-does not reflect changes to the prompt variables themselves, only changes
+re-expanded, then redisplay the edit buffer.  This
+reflects changes both to the prompt variables themselves and changes
 in the expansion of the values (for example, changes in time or
 directory, or changes to the value of variables referred to by the
 prompt).
 
-Otherwise, the prompt is only expaned each time zle starts, and
+Otherwise, the prompt is only expanded each time zle starts, and
 when the display as been interrupted by output from another part of the
 shell (such as a job notification) which causes the command line to be
 reprinted.
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index 83de2bd28..05f632d92 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1768,6 +1768,9 @@ calclist(int showall)
 		g->width += (max - (g->width * g->cols - CM_SPACE)) / g->cols;
 	}
     }
+    else
+	for (g = amatches; g; g = g->next)
+	    zfree(g->widths, 0);
     listdat.valid = 1;
     listdat.hidden = hidden;
     listdat.nlist = nlist;
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 3f13c8af3..765f4dfbe 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -150,7 +150,7 @@ int kungetct;
 /**/
 mod_export char *zlenoargs[1] = { NULL };
 
-static char *raw_lp, *raw_rp;
+static char **raw_lp, **raw_rp;
 
 #ifdef FIONREAD
 static int delayzsetterm;
@@ -742,7 +742,7 @@ zlecore(void)
 
 /**/
 unsigned char *
-zleread(char *lp, char *rp, int flags, int context)
+zleread(char **lp, char **rp, int flags, int context)
 {
     unsigned char *s;
     int old_errno = errno;
@@ -761,7 +761,8 @@ zleread(char *lp, char *rp, int flags, int context)
 	char *pptbuf;
 	int pptlen;
 
-	pptbuf = unmetafy(promptexpand(lp, 0, NULL, NULL), &pptlen);
+	pptbuf = unmetafy(promptexpand(lp ? *lp : NULL, 0, NULL, NULL),
+			  &pptlen);
 	write(2, (WRITE_ARG_2_T)pptbuf, pptlen);
 	free(pptbuf);
 	return (unsigned char *)shingetline();
@@ -788,10 +789,10 @@ zleread(char *lp, char *rp, int flags, int context)
     eofsent = 0;
     resetneeded = 0;
     raw_lp = lp;
-    lpromptbuf = promptexpand(lp, 1, NULL, NULL);
+    lpromptbuf = promptexpand(lp ? *lp : NULL, 1, NULL, NULL);
     pmpt_attr = txtchange;
     raw_rp = rp;
-    rpromptbuf = promptexpand(rp, 1, NULL, NULL);
+    rpromptbuf = promptexpand(rp ? *rp : NULL, 1, NULL, NULL);
     rpmpt_attr = txtchange;
     free_prepostdisplay();
 
@@ -1169,7 +1170,7 @@ bin_vared(char *name, char **args, Options ops, UNUSED(int func))
     if (OPT_ISSET(ops,'h'))
 	hbegin(2);
     isfirstln = OPT_ISSET(ops,'e');
-    t = (char *) zleread(p1, p2, OPT_ISSET(ops,'h') ? ZLRF_HISTORY : 0,
+    t = (char *) zleread(&p1, &p2, OPT_ISSET(ops,'h') ? ZLRF_HISTORY : 0,
 			 ZLCON_VARED);
     if (OPT_ISSET(ops,'h'))
 	hend(NULL);
@@ -1315,9 +1316,9 @@ void
 reexpandprompt(void)
 {
     free(lpromptbuf);
-    lpromptbuf = promptexpand(raw_lp, 1, NULL, NULL);
+    lpromptbuf = promptexpand(raw_lp ? *raw_lp : NULL, 1, NULL, NULL);
     free(rpromptbuf);
-    rpromptbuf = promptexpand(raw_rp, 1, NULL, NULL);
+    rpromptbuf = promptexpand(raw_rp ? *raw_rp : NULL, 1, NULL, NULL);
 }
 
 /**/
diff --git a/Src/init.c b/Src/init.c
index 60e7d3609..ef101069c 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -1148,7 +1148,7 @@ mod_export ZleVoidIntFn zlesetkeymapptr = noop_function_int;
 
 /**/
 unsigned char *
-autoload_zleread(char *lp, char *rp, int ha, int con)
+autoload_zleread(char **lp, char **rp, int ha, int con)
 {
     zlereadptr = fallback_zleread;
     if (load_module("zsh/zle"))
@@ -1158,12 +1158,12 @@ autoload_zleread(char *lp, char *rp, int ha, int con)
 
 /**/
 mod_export unsigned char *
-fallback_zleread(char *lp, UNUSED(char *rp), UNUSED(int ha), UNUSED(int con))
+fallback_zleread(char **lp, UNUSED(char **rp), UNUSED(int ha), UNUSED(int con))
 {
     char *pptbuf;
     int pptlen;
 
-    pptbuf = unmetafy(promptexpand(lp, 0, NULL, NULL), &pptlen);
+    pptbuf = unmetafy(promptexpand(lp ? *lp : NULL, 0, NULL, NULL), &pptlen);
     write(2, (WRITE_ARG_2_T)pptbuf, pptlen);
     free(pptbuf);
 
diff --git a/Src/input.c b/Src/input.c
index c07583781..739c7cf42 100644
--- a/Src/input.c
+++ b/Src/input.c
@@ -222,21 +222,21 @@ ingetc(void)
 static int
 inputline(void)
 {
-    char *ingetcline, *ingetcpmptl = NULL, *ingetcpmptr = NULL;
+    char *ingetcline, **ingetcpmptl = NULL, **ingetcpmptr = NULL;
     int context = ZLCON_LINE_START;
 
     /* If reading code interactively, work out the prompts. */
     if (interact && isset(SHINSTDIN)) {
 	if (!isfirstln) {
-	    ingetcpmptl = prompt2;
+	    ingetcpmptl = &prompt2;
 	    if (rprompt2)
-		ingetcpmptr = rprompt2;
+		ingetcpmptr = &rprompt2;
 	    context = ZLCON_LINE_CONT;
 	}
 	else {
-	    ingetcpmptl = prompt;
+	    ingetcpmptl = &prompt;
 	    if (rprompt)
-		ingetcpmptr = rprompt;
+		ingetcpmptr = &rprompt;
 	}
     }
     if (!(interact && isset(SHINSTDIN) && SHTTY != -1 && isset(USEZLE))) {
@@ -255,7 +255,8 @@ inputline(void)
 	     */
 	    char *pptbuf;
 	    int pptlen;
-	    pptbuf = unmetafy(promptexpand(ingetcpmptl, 0, NULL, NULL), &pptlen);
+	    pptbuf = unmetafy(promptexpand(ingetcpmptl ? *ingetcpmptl : NULL,
+					   0, NULL, NULL), &pptlen);
 	    write(2, (WRITE_ARG_2_T)pptbuf, pptlen);
 	    free(pptbuf);
 	}
diff --git a/Src/loop.c b/Src/loop.c
index 4c45c1f78..7e74f1783 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -245,7 +245,7 @@ execselect(Estate state, UNUSED(int do_exec))
 		    int oef = errflag;
 
 		    isfirstln = 1;
-		    str = (char *)zleread(prompt3, NULL, 0, ZLCON_SELECT);
+		    str = (char *)zleread(&prompt3, NULL, 0, ZLCON_SELECT);
 		    if (errflag)
 			str = NULL;
 		    errflag = oef;
diff --git a/Src/zsh.h b/Src/zsh.h
index c64632f4e..1501fdf8e 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1800,7 +1800,7 @@ typedef int (*CompctlReadFn) _((char *, char **, Options, char *));
 
 typedef void (*ZleVoidFn) _((void));
 typedef void (*ZleVoidIntFn) _((int));
-typedef unsigned char * (*ZleReadFn) _((char *, char *, int, int));
+typedef unsigned char * (*ZleReadFn) _((char **, char **, int, int));
 
 /***************************************/
 /* Hooks in core.                      */