Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: history problems



On Sun, 16 Sep 2001, Bart Schaefer wrote:
> This is an unintended side-effect of Wayne's patch in 15806.  One
> possible fix is appended; Wayne may have a better idea.

Here's my suggested fix.

Since the fcgetcomm() function is only called when doing a history list,
I don't see why the function is complaining if the numeric values are
out of bounds -- the list function fixes these up to be valid already.
So, I changed the function to just limit the lower range so that it
couldn't return a -1.  I also allow the user to be able to type a
history number of 0.

Also, I can't find any reason for the "minflag" code to exist.  Way back
before I started changing things, it looks to me like the code that used
the minflag value could never get executed.  So, I've removed minflag.

The end result is that the user can now type invalid values and have
them get rounded off.  For instance, "history 0 99999" will output the
entire history buffer, as will "history -99999 99999".  (Older zsh
versions would reject this as invalid because of the too-high end
value.)  Someone wanting to output a single line would use something
like this: "history -20 1" (since the ending value will get rounded up
to the first value).

Anyone believe that this should work differently?

..wayne..

---8<------8<------8<------8<---cut here--->8------>8------>8------>8---
Index: Src/builtin.c
--- Src/builtin.c	2001/09/13 18:19:08	1.52
+++ Src/builtin.c	2001/09/17 17:54:45
@@ -1208,7 +1208,7 @@
 int
 bin_fc(char *nam, char **argv, char *ops, int func)
 {
-    int first = -1, last = -1, retval, minflag = 0;
+    int first = -1, last = -1, retval;
     char *s;
     struct asgment *asgf = NULL, *asgl = NULL;
     Patprog pprog = NULL;
@@ -1267,7 +1267,6 @@
     }
     /* interpret and check first history line specifier */
     if (*argv) {
-	minflag = **argv == '-';
 	first = fcgetcomm(*argv);
 	if (first == -1) {
 	    unqueue_signals();
@@ -1299,9 +1298,9 @@
     if (last == -1)
 	last = ops['l']? addhistnum(curline.histnum,-1,0) : first;
     if (first < firsthist())
-	first = firsthist() - (first == last);
+	first = firsthist() - (last < firsthist());
     if (last > curhist)
-	last = (minflag) ? curhist : first;
+	last = curhist;
     else if (last < first)
 	last = first;
     if (ops['l']) {
@@ -1365,13 +1364,11 @@

     /* First try to match a history number.  Negative *
      * numbers indicate reversed numbering.           */
-    if ((cmd = atoi(s))) {
+    if ((cmd = atoi(s)) != 0 || *s == '0') {
 	if (cmd < 0)
 	    cmd = addhistnum(curline.histnum,cmd,HIST_FOREIGN);
-	if (cmd < firsthist()) {
-	    zwarnnam("fc", "bad history number: %d", 0, cmd);
-	    return -1;
-	}
+	if (cmd < 0)
+	    cmd = 0;
 	return cmd;
     }
     /* not a number, so search by string */
---8<------8<------8<------8<---cut here--->8------>8------>8------>8---



Messages sorted by: Reverse Date, Date, Thread, Author