1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-20 12:40:55 +01:00

Fixed bin_print() to handle \c escapes as per POSIX (truncating the

output at the \c).  (Based on a patch by Thorsten Dahlheimer.)
This commit is contained in:
Wayne Davison 2005-07-26 00:07:11 +00:00
parent fa8923e1f9
commit b77b51cda8

View file

@ -3284,7 +3284,7 @@ int
bin_print(char *name, char **args, Options ops, int func) bin_print(char *name, char **args, Options ops, int func)
{ {
int flen, width, prec, type, argc, n, narg; int flen, width, prec, type, argc, n, narg;
int nnl = 0, ret = 0, maxarg = 0; int nnl = 0, fmttrunc = 0, ret = 0, maxarg = 0;
int flags[5], *len; int flags[5], *len;
char *start, *endptr, *c, *d, *flag, *buf, spec[13], *fmt = NULL; char *start, *endptr, *c, *d, *flag, *buf, spec[13], *fmt = NULL;
char **first, *curarg, *flagch = "0+- #", save = '\0', nullstr = '\0'; char **first, *curarg, *flagch = "0+- #", save = '\0', nullstr = '\0';
@ -3313,7 +3313,7 @@ bin_print(char *name, char **args, Options ops, int func)
else if (OPT_HASARG(ops,'f')) else if (OPT_HASARG(ops,'f'))
fmt = OPT_ARG(ops,'f'); fmt = OPT_ARG(ops,'f');
if (fmt) if (fmt)
fmt = getkeystring(fmt, &flen, OPT_ISSET(ops,'b') ? 2 : 0, &nnl); fmt = getkeystring(fmt, &flen, OPT_ISSET(ops,'b') ? 2 : 0, &fmttrunc);
first = args; first = args;
@ -3349,10 +3349,16 @@ bin_print(char *name, char **args, Options ops, int func)
(!OPT_ISSET(ops,'e') && (!OPT_ISSET(ops,'e') &&
(OPT_ISSET(ops,'R') || OPT_ISSET(ops,'r') || OPT_ISSET(ops,'E')))) (OPT_ISSET(ops,'R') || OPT_ISSET(ops,'r') || OPT_ISSET(ops,'E'))))
unmetafy(args[n], &len[n]); unmetafy(args[n], &len[n]);
else else {
args[n] = getkeystring(args[n], &len[n], OPT_ISSET(ops,'b') ? 2 : args[n] = getkeystring(args[n], &len[n], OPT_ISSET(ops,'b') ? 2 :
(func != BIN_ECHO && !OPT_ISSET(ops,'e')), (func != BIN_ECHO && !OPT_ISSET(ops,'e')),
&nnl); &nnl);
if (nnl) {
/* If there was a \c escape, make this the last arg. */
argc = n + 1;
args[argc] = NULL;
}
}
/* -P option -- interpret as a prompt sequence */ /* -P option -- interpret as a prompt sequence */
if(OPT_ISSET(ops,'P')) { if(OPT_ISSET(ops,'P')) {
/* /*
@ -3754,6 +3760,11 @@ bin_print(char *name, char **args, Options ops, int func)
if (width < 0 && l < -width) if (width < 0 && l < -width)
printf("%*c", -width - l, ' '); printf("%*c", -width - l, ' ');
count += l; count += l;
if (nnl) {
/* If the %b arg had a \c escape, truncate the fmt. */
flen = c - fmt + 1;
fmttrunc = 1;
}
} }
break; break;
case 'q': case 'q':
@ -3845,7 +3856,7 @@ bin_print(char *name, char **args, Options ops, int func)
ret = 1; ret = 1;
} }
print_val(zulongval) print_val(zulongval)
} }
} }
} }
if (maxarg && (args - first > maxarg)) if (maxarg && (args - first > maxarg))
@ -3854,7 +3865,7 @@ bin_print(char *name, char **args, Options ops, int func)
if (maxarg) args = first + maxarg; if (maxarg) args = first + maxarg;
/* if there are remaining args, reuse format string */ /* if there are remaining args, reuse format string */
} while (*args && args != first && !OPT_ISSET(ops,'r')); } while (*args && args != first && !fmttrunc && !OPT_ISSET(ops,'r'));
if (OPT_ISSET(ops,'z') || OPT_ISSET(ops,'s')) { if (OPT_ISSET(ops,'z') || OPT_ISSET(ops,'s')) {
#ifdef HAVE_OPEN_MEMSTREAM #ifdef HAVE_OPEN_MEMSTREAM