From owner-freebsd-arch Sun Jan 27 15:16:42 2002 Delivered-To: freebsd-arch@freebsd.org Received: from mail.acns.ab.ca (mail.acns.ab.ca [142.179.151.95]) by hub.freebsd.org (Postfix) with ESMTP id 0AD5837B404; Sun, 27 Jan 2002 15:16:33 -0800 (PST) Received: from colnta.acns.ab.ca (colnta.acns.ab.ca [192.168.1.2]) by mail.acns.ab.ca (8.11.6/8.11.3) with ESMTP id g0RNGQV15069; Sun, 27 Jan 2002 16:16:26 -0700 (MST) (envelope-from davidc@colnta.acns.ab.ca) Received: (from davidc@localhost) by colnta.acns.ab.ca (8.11.6/8.11.3) id g0RNGQk62404; Sun, 27 Jan 2002 16:16:26 -0700 (MST) (envelope-from davidc) Date: Sun, 27 Jan 2002 16:16:26 -0700 From: Chad David To: "Andrey A. Chernov" Cc: "Brian F. Feldman" , Bruce Evans , arch@FreeBSD.ORG Subject: Re: strtod() Message-ID: <20020127161626.A62332@colnta.acns.ab.ca> Mail-Followup-To: "Andrey A. Chernov" , "Brian F. Feldman" , Bruce Evans , arch@FreeBSD.ORG References: <20020126162924.A7726@colnta.acns.ab.ca> <200201270453.g0R4rwi92912@green.bikeshed.org> <20020127070421.GA13415@nagual.pp.ru> <20020127003719.A38420@colnta.acns.ab.ca> <20020127083529.GA13957@nagual.pp.ru> <20020127024626.B40668@colnta.acns.ab.ca> <20020127105258.GA14836@nagual.pp.ru> <20020127130625.A42735@colnta.acns.ab.ca> <20020127224529.GA20003@nagual.pp.ru> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="8t9RHnE3ZwKMSgU+" Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20020127224529.GA20003@nagual.pp.ru>; from ache@nagual.pp.ru on Mon, Jan 28, 2002 at 01:45:30AM +0300 Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Jan 28, 2002 at 01:45:30AM +0300, Andrey A. Chernov wrote: > On Sun, Jan 27, 2002 at 13:06:25 -0700, Chad David wrote: > > > $4 = {int_curr_symbol = 0x80549ac "", currency_symbol = 0x80549ac "", > > mon_decimal_point = 0x80549ac "", mon_thousands_sep = 0x80549ac "", > > mon_grouping = 0x80549ad "\177", positive_sign = 0x80549ac "", > > negative_sign = 0x80549ac "", int_frac_digits = 0x80549ad "\177", > > frac_digits = 0x80549ad "\177", p_cs_precedes = 0x80549ad "\177", > > p_sep_by_space = 0x80549ad "\177", n_cs_precedes = 0x80549ad "\177", > > n_sep_by_space = 0x80549ad "\177", p_sign_posn = 0x80549ad "\177", > > n_sign_posn = 0x80549ad "\177"} > > > > It looks right. cnv() must be never called on that, it already converted. I don't understand what you mean. > From where failing cnv() call occurse, on which field? Post your minimal > test, at least. > I've attached the simple program I'm using to test, as well as the gdb session that should explain what I am doing. -- Chad David davidc@acns.ab.ca www.FreeBSD.org davidc@freebsd.org ACNS Inc. Calgary, Alberta Canada Fourthly, The constant breeders, beside the gain of eight shillings sterling per annum by the sale of their children, will be rid of the charge of maintaining them after the first year. - Johnathan Swift --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="strtod.c" #include #include #include #include int main(int argc, char **argv) { double d; char *c; int i; if (argc != 2) { fprintf(stderr, "Usage: %s [double]\n", argv[0]); exit(1); } for (i = 0; i < 2 ; i++) { errno = 0; d = strtod(argv[1], &c); if (d == 0.0 && errno == EINVAL) printf("strtod() failed 1 [%d]\n", i); if (d == 0.0 && c == argv[1]) printf("strtod() failed 2 [%d]\n", i); printf("strtod() returned %f [%d]\n", d, i); } exit(0); } --8t9RHnE3ZwKMSgU+ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=gdb1 colnta->gdb strtod /usr/home/davidc/tmp/strtod GNU gdb 4.18 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-unknown-freebsd"... (gdb) b strtod Breakpoint 1 at 0x804c484: file /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/stdlib/strtod.c, line 1201. (gdb) run 0.0 Starting program: /mnt1/home/davidc/tmp/strtod/strtod 0.0 Breakpoint 1, strtod (s00=0xbfbff82c "0.0", se=0xbfbff6ac) at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/stdlib/strtod.c:1201 1201 char decimal_point = localeconv()->decimal_point[0]; (gdb) s localeconv () at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/localeconv.c:77 77 if (__mlocale_changed) { (gdb) s 84 mptr = __get_current_monetary_locale(); (gdb) s __get_current_monetary_locale () at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/lmonetary.c:81 81 return (_monetary_using_locale (gdb) s localeconv () at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/localeconv.c:85 85 M_ASSIGN_STR(int_curr_symbol); (gdb) p mptr $1 = (struct lc_monetary_T *) 0x8052a20 (gdb) p *mptr $2 = {int_curr_symbol = 0x8054a0c "", currency_symbol = 0x8054a0c "", mon_decimal_point = 0x8054a0c "", mon_thousands_sep = 0x8054a0c "", mon_grouping = 0x8054a0d "\177", positive_sign = 0x8054a0c "", negative_sign = 0x8054a0c "", int_frac_digits = 0x8054a0d "\177", frac_digits = 0x8054a0d "\177", p_cs_precedes = 0x8054a0d "\177", p_sep_by_space = 0x8054a0d "\177", n_cs_precedes = 0x8054a0d "\177", n_sep_by_space = 0x8054a0d "\177", p_sign_posn = 0x8054a0d "\177", n_sign_posn = 0x8054a0d "\177"} (gdb) s 86 M_ASSIGN_STR(currency_symbol); (gdb) s 87 M_ASSIGN_STR(mon_decimal_point); (gdb) s 88 M_ASSIGN_STR(mon_thousands_sep); (gdb) s 89 M_ASSIGN_STR(mon_grouping); (gdb) s 90 M_ASSIGN_STR(positive_sign); (gdb) s 91 M_ASSIGN_STR(negative_sign); (gdb) s 92 M_ASSIGN_CHAR(int_frac_digits); (gdb) s cnv (str=0x8054a0d "\177") at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/localeconv.c:63 63 int i = strtol(str, NULL, 10); (gdb) s strtol (nptr=0x8054a0d "\177", endptr=0x0, base=10) at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/stdlib/strtol.c:69 69 s = nptr; (gdb) s 71 c = *s++; (gdb) s 72 } while (isspace((unsigned char)c)); (gdb) s 152 return ((_c < 0 || _c >= _CACHED_RUNES) ___runetype(_c) : (gdb) s 72 } while (isspace((unsigned char)c)); 73 if (c == '-') { (gdb) s 77 neg = 0; (gdb) s 78 if (c == '+') (gdb) s 81 if ((base == 0 || base == 16) && (gdb) s 87 if (base == 0) (gdb) s 89 acc = any = 0; (gdb) s 90 if (base < 2 || base > 36) (gdb) s 110 cutoff = neg (unsigned long)-(LONG_MIN + LONG_MAX) + LONG_MAX (gdb) s 113 cutoff /= base; (gdb) s 114 for ( ; ; c = *s++) { (gdb) s 115 if (c >= '0' && c <= '9') (gdb) s 117 else if (c >= 'A' && c <= 'Z') (gdb) s 119 else if (c >= 'a' && c <= 'z') (gdb) s 133 if (any < 0) { (gdb) s 138 errno = EINVAL; (gdb) s __error_unthreaded () at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/sys/__error.c:48 48 return(&errno); (gdb) s strtol (nptr=0x8054a0d "\177", endptr=0x0, base=10) at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/stdlib/strtol.c:139 139 } else if (neg) (gdb) s 141 if (endptr != NULL) (gdb) s 143 return (acc); (gdb) s cnv (str=0x8054a0d "\177") at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/localeconv.c:64 64 if (i == -1) (gdb) s 66 return (char)i; (gdb) s localeconv () at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/localeconv.c:93 93 M_ASSIGN_CHAR(frac_digits); (gdb) s cnv (str=0x8054a0d "\177") at /mnt1/devel/work/dev/bsd/FreeBSD/src/lib/libc/../libc/locale/localeconv.c:63 63 int i = strtol(str, NULL, 10); (gdb)p str $3 = 0x8054a0d "\177" (gdb) p errno $4 = 22 --8t9RHnE3ZwKMSgU+-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message