From 4aaa5b3257fe43fc8a68d47b9e16b571fdb570aa Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Tue, 16 Oct 2001 11:16:04 +0000 Subject: fix return code and tests of printf and comment above bslashquote func (16064) --- ChangeLog | 6 ++++++ Src/builtin.c | 14 ++++++++++++-- Src/utils.c | 5 +++-- Test/B03print.ztst | 37 ++++++++++++++++++++++--------------- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index d25abcbbb..f62036964 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2001-10-16 Oliver Kiddle + + * 16064: Src/builtin.c, Src/utils.c, Test/B03print.ztst: + fix return code of printf after math errors, incomplete comment + in utils.c and tests of printf now that math evaluation is used + 2001-10-16 Clint Adams * 16062: Src/Modules/zftp.c: use O_EXCL diff --git a/Src/builtin.c b/Src/builtin.c index 8b05759b7..113c5931e 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -3125,6 +3125,10 @@ bin_print(char *name, char **args, char *ops, int func) if (*c == '*') { if (*args) width = (int)mathevali(*args++); + if (errflag) { + errflag = 0; + ret = 1; + } c++; } else if (idigit(*c)) { width = strtoul(c, &endptr, 0); @@ -3136,6 +3140,10 @@ bin_print(char *name, char **args, char *ops, int func) c++; if (*c == '*') { prec = (*args) ? (int)mathevali(*args++) : 0; + if (errflag) { + errflag = 0; + ret = 1; + } c++; } else if (idigit(*c)) { prec = strtoul(c, &endptr, 0); @@ -3147,7 +3155,6 @@ bin_print(char *name, char **args, char *ops, int func) /* ignore any size modifier */ if (*c == 'l' || *c == 'L' || *c == 'h') c++; - errflag = 0; d[1] = '\0'; switch (*d = *c) { case 'c': @@ -3226,6 +3233,7 @@ bin_print(char *name, char **args, char *ops, int func) if (errflag) { zlongval = 0; errflag = 0; + ret = 1; } print_val(zlongval) break; @@ -3238,11 +3246,12 @@ bin_print(char *name, char **args, char *ops, int func) if (errflag) { doubleval = 0; errflag = 0; + ret = 1; } print_val(doubleval) break; case 3: -#ifdef ZSH_64_BIT_TYPE +#ifdef ZSH_64_BIT_UTYPE *d++ = 'l'; #endif *d++ = 'l', *d++ = *c, *d = '\0'; @@ -3250,6 +3259,7 @@ bin_print(char *name, char **args, char *ops, int func) if (errflag) { doubleval = 0; errflag = 0; + ret = 1; } print_val(zulongval) } diff --git a/Src/utils.c b/Src/utils.c index 6bede2e43..539b383ee 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -2929,8 +2929,9 @@ hasspecial(char const *s) * pointer it points to may point to a position in s and in e the position * * of the corresponding character in the quoted string is returned. * * The last argument should be zero if this is to be used outside a string, * - * one if it is to be quoted for the inside of a single quoted string, and * - * two if it is for the inside of double quoted string. * + * one if it is to be quoted for the inside of a single quoted string, * + * two if it is for the inside of a double quoted string, and * + * three if it is for the inside of a posix quoted string. * * The string may be metafied and contain tokens. */ /**/ diff --git a/Test/B03print.ztst b/Test/B03print.ztst index 0986aa6e4..56c202ef4 100644 --- a/Test/B03print.ztst +++ b/Test/B03print.ztst @@ -78,6 +78,10 @@ 0:initial quote to get numeric value of character with double >6.6E+01 + printf '%x\n' $(printf '"\xf0') +0:numeric value of high numbered character +>f0 + # code will probably be changed to print the literal `%s' in this case printf '\x25s\n' arg 0:using \x25 to introduce a format specifier @@ -95,24 +99,15 @@ 0:width/precision specified in arguments > 10.20 - printf '%d\n' 3000000000 -1d:out of range numeric result -?(eval):printf:1: `3000000000' arithmetic overflow - - printf '%G\n' letters -1:non numeric argument -?(eval):printf:1: `letters' expected numeric value ->0 - - print -f '%d\n' 2e4 -1:letters in numeric argument -?(eval):print:1: `2e4' not completely converted ->2 - printf '%z' -1:test invalid directive +1:use of invalid directive ?(eval):printf:1: %z: invalid directive + printf '%d\n' 3a +1:bad arithmetic expression +?(eval):1: bad math expression: operator expected at `a' +>0 + print -m -f 'format - %s.\n' 'z' a b c 0:format not printed if no arguments left after -m removal @@ -133,3 +128,15 @@ >one a:0x1% >two b:0x2% >three c:0x3% + + printf '%0+- #-08.5dx\n' 123 +0:maximal length format specification +>+00123 x + + printf '%*smorning\n' -5 good +0:negative width specified +>good morning + + printf '%.*g\n' -1 .1 +0:negative precision specified +>0.1 -- cgit 1.4.1