Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
ZLE lists containing control characters
- X-seq: zsh-workers 185
- From: Zefram <A.Main@xxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxxx (Z Shell workers mailing list)
- Subject: ZLE lists containing control characters
- Date: Sun, 9 Jul 1995 02:54:09 +0100 (BST)
-----BEGIN PGP SIGNED MESSAGE-----
This patch fixes the problem that ZLE lists have with non-printing
characters (try it), and also the problem that a DEL character (^?)
wouldn't display properly in history lists the way other control
characters do.
Specifically, the changes are that niceprintf() is renamed to
nicefputs() (correctly indicating its behaviour) and moved to utils.c,
niceputc() and nicefputs() are fixed to handle tab and ^?, and
listmatches() is changed to use nicefputs() so that its output looks
how it will look in the edit buffer.
-zefram
*** Src/builtin.c.old Sun Jul 9 01:15:04 1995
--- Src/builtin.c Sun Jul 9 01:19:52 1995
***************
*** 2872,2878 ****
/* output the command */
if (f == stdout) {
! niceprintf(s, f);
putc('\n', f);
} else
fprintf(f, "%s\n", s);
--- 2872,2878 ----
/* output the command */
if (f == stdout) {
! nicefputs(s, f);
putc('\n', f);
} else
fprintf(f, "%s\n", s);
***************
*** 2905,2930 ****
if (!strcmp(ename, "-"))
return 1;
return !zyztem(ename, fn);
- }
-
- /* fprintf, with conversion of control codes to a printable form. *
- * This is used in displaying history events. */
-
- /**/
- void
- niceprintf(char *s, FILE *f)
- {
- for (; *s; s++) {
- if (isprint(*s))
- fputc(*s, f);
- else if (*s == '\n') {
- putc('\\', f);
- putc('n', f);
- } else {
- putc('^', f);
- fputc(*s | 0x40, f);
- }
- }
}
/**** parameter builtins ****/
--- 2905,2910 ----
*** Src/utils.c.old Sun Jul 9 01:09:36 1995
--- Src/utils.c Sun Jul 9 02:48:29 1995
***************
*** 128,139 ****
else if (c == '\n') {
putc('\\', f);
putc('n', f);
} else {
putc('^', f);
! putc(c | '@', f);
}
}
/* get a symlink-free pathname for s relative to PWD */
/**/
--- 128,173 ----
else if (c == '\n') {
putc('\\', f);
putc('n', f);
+ } else if(c == '\t') {
+ putc('\\', f);
+ putc('t', f);
} else {
putc('^', f);
! putc(c ^ 0x40, f);
}
}
+ /**/
+ void
+ nicefputs(char *s, FILE *f)
+ {
+ for (; *s; s++) {
+ if (isprint(*s))
+ putc(*s, f);
+ else if (*s == '\n') {
+ putc('\\', f);
+ putc('n', f);
+ } else if(*s == '\t') {
+ putc('\\', f);
+ putc('t', f);
+ } else {
+ putc('^', f);
+ putc(*s ^ 0x40, f);
+ }
+ }
+ }
+
+ /**/
+ size_t
+ nicestrlen(char *s)
+ {
+ size_t l = 0;
+
+ for(; *s; s++)
+ l += 1 + !isprint(*s);
+ return l;
+ }
+
/* get a symlink-free pathname for s relative to PWD */
/**/
***************
*** 2623,2626 ****
}
return (0L);
}
-
--- 2657,2659 ----
*** Src/zle_tricky.c.old Sun Jul 9 01:34:39 1995
--- Src/zle_tricky.c Sun Jul 9 02:29:09 1995
***************
*** 3525,3534 ****
listmatches(void)
{
int longest = 1, fct, fw, colsz, t0, t1, ct, up, cl;
! int off, boff;
int of = (isset(LISTTYPES) && !(haswhat & HAS_MISC));
char **arr, **ap, sav;
/* Calculate the lengths of the prefizes/suffizes we have to ignore
during printing. */
off = ispattern && ppre && *ppre &&
--- 3525,3541 ----
listmatches(void)
{
int longest = 1, fct, fw, colsz, t0, t1, ct, up, cl;
! int off, boff, nboff;
int of = (isset(LISTTYPES) && !(haswhat & HAS_MISC));
char **arr, **ap, sav;
+ int nfpl, nfsl, nlpl, nlsl;
+ /* Calculate lengths of prefixes/suffixes to be added */
+ nfpl = fpre ? nicestrlen(fpre) : 0;
+ nfsl = fsuf ? nicestrlen(fsuf) : 0;
+ nlpl = lpre ? nicestrlen(lpre) : 0;
+ nlsl = lsuf ? nicestrlen(lsuf) : 0;
+
/* Calculate the lengths of the prefizes/suffizes we have to ignore
during printing. */
off = ispattern && ppre && *ppre &&
***************
*** 3535,3540 ****
--- 3542,3549 ----
!(haswhat & (HAS_MISC | HAS_PATHPAT)) ? strlen(ppre) : 0;
boff = ispattern && psuf && *psuf &&
!(haswhat & (HAS_MISC | HAS_PATHPAT)) ? strlen(psuf) : 0;
+ nboff = ispattern && psuf && *psuf &&
+ !(haswhat & (HAS_MISC | HAS_PATHPAT)) ? nicestrlen(psuf) : 0;
/* When called from expandorcompleteprefix, we probably have to
remove a space now. */
***************
*** 3561,3569 ****
/* Calculate the column width, the number of columns and the number
of lines. */
for (ap = arr; *ap; ap++)
! if ((cl = strlen(*ap + off) - boff +
(ispattern ? 0 :
! (!(haswhat & HAS_MISC) ? fpl + fsl : lpl + lsl))) > longest)
longest = cl;
if (of)
longest++;
--- 3570,3578 ----
/* Calculate the column width, the number of columns and the number
of lines. */
for (ap = arr; *ap; ap++)
! if ((cl = nicestrlen(*ap + off) - nboff +
(ispattern ? 0 :
! (!(haswhat & HAS_MISC) ? nfpl + nfsl : nlpl + nlsl))) > longest)
longest = cl;
if (of)
longest++;
***************
*** 3575,3583 ****
colsz = ct;
up = colsz + nlnct - clearflag;
for (ap = arr; *ap; ap++)
! up += (strlen(*ap + off) - boff + of +
(ispattern ? 0 :
! (!(haswhat & HAS_MISC) ? fpl + fsl : lpl + lsl))) / columns;
} else {
colsz = (ct + fct - 1) / fct;
up = colsz + nlnct - clearflag;
--- 3584,3592 ----
colsz = ct;
up = colsz + nlnct - clearflag;
for (ap = arr; *ap; ap++)
! up += (nicestrlen(*ap + off) - nboff + of +
(ispattern ? 0 :
! (!(haswhat & HAS_MISC) ? nfpl + nfsl : nlpl + nlsl))) / columns;
} else {
colsz = (ct + fct - 1) / fct;
up = colsz + nlnct - clearflag;
***************
*** 3621,3641 ****
if (of) {
/* We have to print the file types. */
while (*ap) {
! int t2 = ispattern ? strlen(*ap) :
! strlen(*ap + off) - boff + 1 + fpl + fsl;
char pbuf[PATH_MAX], *pb;
struct stat buf;
/* Build the path name for the stat. */
if (ispattern) {
! sav = ap[0][t2 - boff];
! ap[0][t2 - boff] = '\0';
! fprintf(shout, "%s", *ap + off);
! ap[0][t2 - boff] = sav;
pb = *ap;
- t2 -= off + boff - 1;
} else {
! fprintf(shout, "%s%s%s", fpre, *ap, fsuf);
sprintf(pb = pbuf, "%s%s%s%s",
(prpre && *prpre) ? prpre : "./", fpre, *ap, fsuf);
}
--- 3630,3654 ----
if (of) {
/* We have to print the file types. */
while (*ap) {
! int t2;
char pbuf[PATH_MAX], *pb;
struct stat buf;
/* Build the path name for the stat. */
if (ispattern) {
! int cut = strlen(*ap) - boff;
!
! sav = ap[0][cut];
! ap[0][cut] = '\0';
! nicefputs(*ap + off, shout);
! t2 = nicestrlen(*ap + off);
! ap[0][cut] = sav;
pb = *ap;
} else {
! nicefputs(fpre, shout);
! nicefputs(*ap, shout);
! nicefputs(fsuf, shout);
! t2 = nfpl + nicestrlen(*ap) + nfsl;
sprintf(pb = pbuf, "%s%s%s%s",
(prpre && *prpre) ? prpre : "./", fpre, *ap, fsuf);
}
***************
*** 3647,3672 ****
for (t0 = colsz; t0 && *ap; t0--, ap++);
if (*ap)
/* And add spaces to make the columns aligned. */
! for (; t2 < fw; t2++)
putc(' ', shout);
}
} else
while (*ap) {
! int t2 = ispattern ? strlen(*ap) :
! strlen(*ap + off) - boff;
if (ispattern) {
! sav = ap[0][t2 - boff];
! ap[0][t2 - boff] = '\0';
! fprintf(shout, "%s", *ap + off);
! ap[0][t2 - boff] = sav;
! t2 -= off + boff;
} else if (!(haswhat & HAS_MISC)) {
! fprintf(shout, "%s%s%s", fpre, *ap, fsuf);
! t2 += fpl + fsl;
} else {
! fprintf(shout, "%s%s%s", lpre, *ap, lsuf);
! t2 += lpl + lsl;
}
for (t0 = colsz; t0 && *ap; t0--, ap++);
if (*ap)
--- 3660,3690 ----
for (t0 = colsz; t0 && *ap; t0--, ap++);
if (*ap)
/* And add spaces to make the columns aligned. */
! for (++t2; t2 < fw; t2++)
putc(' ', shout);
}
} else
while (*ap) {
! int t2;
if (ispattern) {
! int cut = strlen(*ap) - boff;
!
! sav = ap[0][cut];
! ap[0][cut] = '\0';
! nicefputs(*ap + off, shout);
! t2 = nicestrlen(*ap + off);
! ap[0][cut] = sav;
} else if (!(haswhat & HAS_MISC)) {
! nicefputs(fpre, shout);
! nicefputs(*ap, shout);
! nicefputs(fsuf, shout);
! t2 = nfpl + nicestrlen(*ap) + nfsl;
} else {
! nicefputs(lpre, shout);
! nicefputs(*ap, shout);
! nicefputs(lsuf, shout);
! t2 = nlpl + nicestrlen(*ap) + nlsl;
}
for (t0 = colsz; t0 && *ap; t0--, ap++);
if (*ap)
-----BEGIN PGP SIGNATURE-----
Version: 2.6.i
iQBVAgUBL/82lWWJ8JfKi+e9AQG15AH/bCQpHrRzDlRrAyHyv4fXEn0tdPAE79Sw
84j6uLWg2ZzqrwlBRBewA9a0jMrhS5LIKrRi9SE//K8Qu3Ywb1dLnQ==
=9pPR
-----END PGP SIGNATURE-----
Messages sorted by:
Reverse Date,
Date,
Thread,
Author