Date: Wed, 10 Jul 2013 09:10:01 GMT From: Steffen "Daode" Nurpmeso <sdaoden@gmail.com> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/180328: awk(1) fails to treat var as integer Message-ID: <201307100910.r6A9A1mq049178@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/180328; it has been noted by GNATS. From: Steffen "Daode" Nurpmeso <sdaoden@gmail.com> To: bug-followup@FreeBSD.org Cc: Subject: Re: bin/180328: awk(1) fails to treat var as integer Date: Wed, 10 Jul 2013 11:01:34 +0200 Hello, i'm forwarding one more. (This time to bug-followup@ -- hello, Mark Linimon!) -------- Original Message -------- Date: Wed, 10 Jul 2013 10:53:13 +0200 From: Steffen "Daode" Nurpmeso <sdaoden@gmail.com> To: gnats-bugs@NetBSD.org Subject: Re: bin/48017: awk(1) fails to treat var as integer (may be related to #47840) David Holland <dholland-bugs@netbsd.org> wrote: | sprintf witih %d doesn't produce an number value; it produces a | string value, which you have to coerce to a number by adding zero to | it to get it to behave like a number. (Adding +0 was my final solution too, because GNU awk(1) didn't make it by the (presumably more expensive, too) sprintf("%X") call just as all other tested awk(1)s did.) So there is a problem with the implicit type conversion, since echo f001 f00d |\ awk '{ a=sprintf("%d", "0x" $1); b=sprintf("%d", "0x" $2); while (a < b) { print a; a++; }}' works just fine?!? I think the relevant parts from POSIX are the value of an expression shall be implicitly converted to the type needed for the context in which it is used. [.] A numeric value that is exactly equal to the value of an integer (see Concepts Derived from the ISO C Standard) shall be converted to a string by the equivalent of a call to the sprintf function (see String Functions) with the string "%d" as the fmt argument and the numeric value being converted as the first and only expr argument. [.] This volume of POSIX.1-2008 specifies no explicit conversions between numbers and strings. An application can force an expression to be treated as a number by adding zero to it, or can force it to be treated as a string by concatenating the null string ( "" ) to it. [.] A string value shall be considered a numeric string if it comes from one of the following: [.] 1. Field variables [.] 8. Variable assignment from another numeric string variable [...] and an implementation-dependent condition corresponding to either case (a) or (b) below is met. [.] b. After all the following conversions have been applied, the resulting string would lexically be recognized as a NUMBER token as described by the lexical conventions in Grammar : [.] Whether or not a string is a numeric string shall be relevant only in contexts where that term is used in this section. And because the `Table: Expressions in Decreasing Precedence in awk' contains the line expr < expr Less than Numeric None i believe its a bug. (That hopefully gets fixed by someone who yet has some experience with the awk codebase.) | David A. Holland | dholland@netbsd.org --steffen
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307100910.r6A9A1mq049178>