Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: PATCH: arithmetic evaluation for printf
- X-seq: zsh-workers 16064
- From: Oliver Kiddle <okiddle@xxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: Re: PATCH: arithmetic evaluation for printf
- Date: Tue, 16 Oct 2001 12:09:55 +0100
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <3BCAC666.9DC9EF09@xxxxxxxxxxx>
- Sender: kiddleo@xxxxxxxxxxxxxxxx
I wrote:
>
> I've only been able to test it where a zlong is a long long.
It is fine where zlong is a long and where long is 64 bits such as the
alpha on sourceforge. Problems might arise if the 64 bit type is
anything else but I can't see anything in zshconfig.ac to indicate that
that is yet the case anywhere (it only tries long and long long).
> And don't bother pointing out the resulting test failure in B03 - I
> forgot the changed test file when I put this on a floppy at home
> yesterday.
The changed test file is below. I also forgot to make it return 1 after
math errors so that fix is also below. The comment above bslashquote()
in utils.c was incomplete so even though I'm ditching the changes to
that function, I'll bring the comment up-to-date.
Oliver
Index: Src/builtin.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/builtin.c,v
retrieving revision 1.58
diff -u -r1.58 builtin.c
--- Src/builtin.c 2001/10/15 11:34:27 1.58
+++ Src/builtin.c 2001/10/16 11:05:32
@@ -3125,6 +3125,10 @@
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 @@
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 @@
/* 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 @@
if (errflag) {
zlongval = 0;
errflag = 0;
+ ret = 1;
}
print_val(zlongval)
break;
@@ -3238,11 +3246,12 @@
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 @@
if (errflag) {
doubleval = 0;
errflag = 0;
+ ret = 1;
}
print_val(zulongval)
}
Index: Src/utils.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/utils.c,v
retrieving revision 1.35
diff -u -r1.35 utils.c
--- Src/utils.c 2001/06/15 23:55:08 1.35
+++ Src/utils.c 2001/10/16 11:05:32
@@ -2929,8 +2929,9 @@
* 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. */
/**/
Index: Test/B03print.ztst
===================================================================
RCS file: /cvsroot/zsh/zsh/Test/B03print.ztst,v
retrieving revision 1.1
diff -u -r1.1 B03print.ztst
--- Test/B03print.ztst 2001/10/08 10:47:47 1.1
+++ Test/B03print.ztst 2001/10/16 11:05:32
@@ -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
_____________________________________________________________________
This message has been checked for all known viruses by the
MessageLabs Virus Scanning Service. For further information visit
http://www.messagelabs.com/stats.asp
Messages sorted by:
Reverse Date,
Date,
Thread,
Author