From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gatech.edu (gatech.edu [130.207.244.244]) by werple.mira.net.au (8.6.12/8.6.9) with SMTP id FAA05502 for ; Fri, 7 Jul 1995 05:33:12 +1000 Received: from math (math.skiles.gatech.edu) by gatech.edu with SMTP id AA13844 (5.65c/Gatech-10.0-IDA for ); Thu, 6 Jul 1995 15:34:19 -0400 Received: by math (5.x/SMI-SVR4) id AA10439; Thu, 6 Jul 1995 15:30:44 -0400 Resent-Date: Fri, 7 Jul 1995 05:30:20 +1000 (EST) Old-Return-Path: From: Geoff Wing Message-Id: <199507061930.FAA25466@werple03.mira.net.au> Subject: zle_refresh.c patch To: zsh-workers@math.gatech.edu Date: Fri, 7 Jul 1995 05:30:20 +1000 (EST) X-Mailer: ELM [version 2.4 PL23] Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-Id: <"xgnb72.0.zY2.Zd3_l"@math> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/164 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu OK, here's a patch for zle_refresh.c to fix a couple of bugs: 1. not clearing properly if more characters were inserted than deleted 2. not clearing the last character in the line if rprompt printed (Who introduced this? Why?) This is a patch on the last RCS source I got, with no other patches applied. Don't include Peter Stephenson's patch (message 158 or 160) with this. *** zle_refresh.c.orig Mon Jul 3 01:01:02 1995 --- zle_refresh.c Fri Jul 7 05:15:34 1995 *************** *** 416,421 **** --- 416,422 ---- { char *nl, *ol, *p1; /* line buffer pointers */ int ccs = 0, /* temporary count for cursor position */ + char_ins = 0, /* number of characters inserted/deleted */ col_cleareol, /* clear to end-of-line from this column */ i, j, /* tmp */ nllen, ollen; /* new and old line buffer lengths */ *************** *** 429,435 **** which need to be written. do this now to allow some pre-processing */ if (cleareol || /* request to clear to end of line */ ! !nllen) { /* no line buffer given */ p1 = halloc(winw + 1); if (nllen) strncpy(p1, nl, nllen); --- 430,437 ---- which need to be written. do this now to allow some pre-processing */ if (cleareol || /* request to clear to end of line */ ! !nllen || /* no line buffer given */ ! (ln == 0 && (put_rpmpt != oput_rpmpt))) { /* prompt changed */ p1 = halloc(winw + 1); if (nllen) strncpy(p1, nl, nllen); *************** *** 437,451 **** p1[winw] = '\0'; nl = p1; nllen = winw; - } else if (ln == 0 && put_rpmpt != oput_rpmpt && winw - 1 > nllen) { - /* prompt changed */ - p1 = halloc(winw); - if (nllen) - strncpy(p1, nl, nllen); - memset(p1 + nllen, ' ', winw - 1 - nllen); - p1[winw - 1] = '\0'; - nl = p1; - nllen = winw - 1; } else if (ollen > nllen) { /* make new line at least as long as old */ p1 = halloc(ollen + 1); strncpy(p1, nl, nllen); --- 439,444 ---- *************** *** 461,467 **** col_cleareol = -1; if (tccan(TCCLEAREOL) && (nllen == winw || /* new buffer goes to the end of the line */ ! !put_rpmpt)) { for (i = nllen; i && nl[i - 1] == ' '; i--); for (j = ollen; j && ol[j - 1] == ' '; j--); if ((j > i + tclen[TCCLEAREOL]) || /* new buf's spaces early enough */ --- 454,460 ---- col_cleareol = -1; if (tccan(TCCLEAREOL) && (nllen == winw || /* new buffer goes to the end of the line */ ! put_rpmpt != oput_rpmpt)) { for (i = nllen; i && nl[i - 1] == ' '; i--); for (j = ollen; j && ol[j - 1] == ' '; j--); if ((j > i + tclen[TCCLEAREOL]) || /* new buf's spaces early enough */ *************** *** 478,485 **** /* skip past all matching characters */ for (; *nl && (*nl == *ol); nl++, ol++, ccs++) ; ! if (!*nl) /* we've finished writing the new line */ ! return; moveto(ln, ccs); /* move to where we do all output from */ --- 471,484 ---- /* skip past all matching characters */ for (; *nl && (*nl == *ol); nl++, ol++, ccs++) ; ! if (!*nl) { ! if ((char_ins <= 0) || (vcs >= winw)) /* written everything */ ! return; ! else /* we've got junk on the right yet to clear */ ! if (tccan(TCCLEAREOL) && (char_ins >= tclen[TCCLEAREOL]) ! && ccs < winw) ! col_cleareol = 0; /* force a clear to end of line */ ! } moveto(ln, ccs); /* move to where we do all output from */ *************** *** 490,495 **** --- 489,509 ---- return; } + /* we've written out the new but yet to clear rubbish due to inserts */ + if (!*nl) { + if ((i = (winw - ccs < char_ins ? winw - ccs : char_ins)) == 0) + return; + if (tccan(TCDEL) && (tcdelcost(i) <= i + 1)) + tc_delchars(i); + else { + SELECT_ADD_COST(i); + vcs += i; + while (i-- > 0) + putc(' ', shout); + } + return; + } + /* if we've reached the end of the old buffer, then there are few tricks we can do, so we just dump out what we must and clear if we can */ if (!*ol) { *************** *** 520,525 **** --- 534,540 ---- tc_delchars(i); SELECT_ADD_COST(i); ol = p1; + char_ins -= i; break; } if (*p1) *************** *** 538,543 **** --- 553,559 ---- fwrite(nl, i, 1, shout); ccs = (vcs += i); nl = p1; + char_ins += i; break; } if (*p1) -- Mason [G.C.W] mason@werple.mira.net.au Hurt...Agony...Pain...LOVE-IT