From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23027 invoked from network); 27 Jun 1999 08:19:01 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 27 Jun 1999 08:19:01 -0000 Received: (qmail 29486 invoked by alias); 27 Jun 1999 07:52:00 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 6871 Received: (qmail 29478 invoked from network); 27 Jun 1999 07:51:58 -0000 Date: Sun, 27 Jun 1999 17:51:32 +1000 From: Geoff Wing To: Zsh Hackers Subject: PATCH: zsh-3.1.5-pws-24: complist colour listing optimisation Message-ID: <19990627175131.A22749@primenet.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 0.95.6i Organization: PrimeNet Computer Consultancy Heyla, optimisations for output during colour lists. Duplicate sequences should not achieve anything different from single sequences so don't output them. Warning: unified diff follows :-) --- Src/Zle/complist.c.orig Thu Jun 24 19:46:37 1999 +++ Src/Zle/complist.c Sun Jun 27 17:42:56 1999 @@ -230,48 +230,65 @@ if (!c->cols[COL_MI]) c->cols[COL_MI] = c->cols[COL_FI]; - if (!c->cols[COL_EC]) { - char *e = (char *) zhalloc(strlen(c->cols[COL_LC]) + - strlen(c->cols[COL_NO]) + - strlen(c->cols[COL_RC]) + 1); - - /* If no `ec' was given, we is `' as the default. */ - strcpy(e, c->cols[COL_LC]); - strcat(e, c->cols[COL_NO]); - strcat(e, c->cols[COL_RC]); - c->cols[COL_EC] = e; - } return 0; } +static int last_col = COL_NO; + +static void +zcputs(Listcols c, int colour) +{ + if (colour != last_col + && (last_col < COL_NO + || strcmp(c->cols[last_col], c->cols[colour]))) { + fputs(c->cols[COL_LC], shout); + fputs(c->cols[colour], shout); + fputs(c->cols[COL_RC], shout); + last_col = colour; + } + return; +} + /* Get the terminal color string for the file with the given name and * file modes. */ -static char * -getcolstr(Listcols c, char *n, mode_t m) +static void +putcolstr(Listcols c, char *n, mode_t m) { + int colour; Extcol e; for (e = c->exts; e; e = e->next) - if (strsfx(e->ext, n)) - return e->col; + if (strsfx(e->ext, n)) { /* XXX: unoptimised if used */ + if (last_col < COL_NO + || strcmp(c->cols[last_col], e->col)) { + fputs(c->cols[COL_LC], shout); + fputs(e->col, shout); + fputs(c->cols[COL_RC], shout); + } + last_col = COL_NO - 1; + return; + } if (S_ISDIR(m)) - return c->cols[COL_DI]; + colour = COL_DI; else if (S_ISLNK(m)) - return c->cols[COL_LN]; + colour = COL_LN; else if (S_ISFIFO(m)) - return c->cols[COL_PI]; + colour = COL_PI; else if (S_ISSOCK(m)) - return c->cols[COL_SO]; + colour = COL_SO; else if (S_ISBLK(m)) - return c->cols[COL_BD]; + colour = COL_BD; else if (S_ISCHR(m)) - return c->cols[COL_CD]; + colour = COL_CD; else if (S_ISREG(m) && (m & S_IXUGO)) - return c->cols[COL_EX]; + colour = COL_EX; + else + colour = COL_FI; - return c->cols[COL_FI]; + zcputs(c, colour); + return; } /* Information about the list shown. */ @@ -505,14 +522,15 @@ mc = 0; q = p; while (n && i--) { - fputs(col.cols[COL_LC], shout); if (!(m = *q)) { - fputs(col.cols[COL_MI], shout); - fputs(col.cols[COL_RC], shout); + zcputs(&col, COL_MI); a = longest - 2; while (a--) putc(' ', shout); - fputs(col.cols[COL_EC], shout); + if (col.cols[COL_EC]) + fputs(col.cols[COL_EC], shout); + else + zcputs(&col, COL_NO); break; } hasm = 1; @@ -539,20 +557,18 @@ zt = ztat(pb, &buf, 1); if (cc >= 0) - fputs(col.cols[cc], shout); + zcputs(&col, cc); else if (zt) - fputs(col.cols[COL_NO], shout); + zcputs(&col, COL_NO); else - fputs(getcolstr(&col, pb, buf.st_mode), shout); - fputs(col.cols[COL_RC], shout); + putcolstr(&col, pb, buf.st_mode); nicezputs(m->str, shout); if (zt) putc(' ', shout); else putc(file_type(buf.st_mode), shout); } else { - fputs(col.cols[cc >= 0 ? cc : COL_NO], shout); - fputs(col.cols[COL_RC], shout); + zcputs(&col, cc >= 0 ? cc : COL_NO); nicezputs(m->str, shout); if (of) putc(' ', shout); @@ -560,13 +576,17 @@ a = longest - niceztrlen(m->str) - 2 - of; while (a--) putc(' ', shout); - fputs(col.cols[COL_EC], shout); + if (col.cols[COL_EC]) + fputs(col.cols[COL_EC], shout); + else + zcputs(&col, COL_NO); if (i) { - fputs(col.cols[COL_LC], shout); - fputs(col.cols[COL_NO], shout); - fputs(col.cols[COL_RC], shout); + zcputs(&col, COL_NO); fputs(" ", shout); - fputs(col.cols[COL_EC], shout); + if (col.cols[COL_EC]) + fputs(col.cols[COL_EC], shout); + else + zcputs(&col, COL_NO); } if (--n) for (j = nc; j && *q; j--) @@ -574,13 +594,14 @@ mc++; } if (i > 0) { - fputs(col.cols[COL_LC], shout); - fputs(col.cols[COL_MI], shout); - fputs(col.cols[COL_RC], shout); + zcputs(&col, COL_MI); a = longest - 2; while (a--) putc(' ', shout); - fputs(col.cols[COL_EC], shout); + if (col.cols[COL_EC]) + fputs(col.cols[COL_EC], shout); + else + zcputs(&col, COL_NO); } if (n) { putc('\n', shout); -- Geoff Wing : Work URL: http://www.primenet.com.au/ Rxvt Stuff : Ego URL : http://pobox.com/~gcw/ Zsh Stuff : Phone : (Australia) 0413 431 874