From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14928 invoked from network); 17 Sep 2001 17:57:03 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 17 Sep 2001 17:57:03 -0000 Received: (qmail 26386 invoked by alias); 17 Sep 2001 17:56:52 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 15836 Received: (qmail 26375 invoked from network); 17 Sep 2001 17:56:51 -0000 Date: Mon, 17 Sep 2001 10:56:22 -0700 (PDT) From: Wayne Davison X-X-Sender: To: Zsh Workers Subject: Re: history problems In-Reply-To: <1010916213120.ZM4318@candle.brasslantern.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII 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---