Date: Mon, 28 Jan 2002 08:55:58 +0300 From: "Andrey A. Chernov" <ache@nagual.pp.ru> To: Chad David <davidc@acns.ab.ca>, phantom@FreeBSD.org Cc: "Brian F. Feldman" <green@FreeBSD.org>, Bruce Evans <bde@zeta.org.au>, arch@FreeBSD.org Subject: Re: strtod() Message-ID: <20020128055557.GA23297@nagual.pp.ru> In-Reply-To: <20020127161626.A62332@colnta.acns.ab.ca> 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> <20020127161626.A62332@colnta.acns.ab.ca>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jan 27, 2002 at 16:16:26 -0700, Chad David wrote: > I don't understand what you mean. > This is locale code bug and EINVAL from strtol() really helps to find it. Try the patch below, it fix the problem (at least on my testing): --- lmonetary.c.old Thu Dec 13 12:26:25 2001 +++ lmonetary.c Mon Jan 28 08:50:21 2002 @@ -27,6 +27,7 @@ */ #include <limits.h> +#include <stdlib.h> #include "lmonetary.h" #include "ldpart.h" @@ -60,6 +61,14 @@ static int _monetary_using_locale; static char *_monetary_locale_buf; +static char +cnv(const char *str) { + int i = strtol(str, NULL, 10); + if (i == -1) + i = CHAR_MAX; + return (char)i; +} + int __monetary_load_locale(const char *name) { @@ -69,9 +78,22 @@ _monetary_locale_buf, "LC_MONETARY", LCMONETARY_SIZE, LCMONETARY_SIZE, (const char **)&_monetary_locale); - if (ret == 0 && _monetary_using_locale) + if (ret == 0 && _monetary_using_locale) { _monetary_locale.mon_grouping = __fix_locale_grouping_str(_monetary_locale.mon_grouping); + +#define M_ASSIGN_CHAR(NAME) (((char *)_monetary_locale.NAME)[0] = \ + cnv(_monetary_locale.NAME)) + + M_ASSIGN_CHAR(int_frac_digits); + M_ASSIGN_CHAR(frac_digits); + M_ASSIGN_CHAR(p_cs_precedes); + M_ASSIGN_CHAR(p_sep_by_space); + M_ASSIGN_CHAR(n_cs_precedes); + M_ASSIGN_CHAR(n_sep_by_space); + M_ASSIGN_CHAR(p_sign_posn); + M_ASSIGN_CHAR(n_sign_posn); + } return ret; } @@ -93,14 +115,14 @@ "mon_grouping = %s\n" "positive_sign = %s\n" "negative_sign = %s\n" - "int_frac_digits = %s\n" - "frac_digits = %s\n" - "p_cs_precedes = %s\n" - "p_sep_by_space = %s\n" - "n_cs_precedes = %s\n" - "n_sep_by_space = %s\n" - "p_sign_posn = %s\n" - "n_sign_posn = %s\n", + "int_frac_digits = %d\n" + "frac_digits = %d\n" + "p_cs_precedes = %d\n" + "p_sep_by_space = %d\n" + "n_cs_precedes = %d\n" + "n_sep_by_space = %d\n" + "p_sign_posn = %d\n" + "n_sign_posn = %d\n", _monetary_locale.int_curr_symbol, _monetary_locale.currency_symbol, _monetary_locale.mon_decimal_point, @@ -108,14 +130,14 @@ _monetary_locale.mon_grouping, _monetary_locale.positive_sign, _monetary_locale.negative_sign, - _monetary_locale.int_frac_digits, - _monetary_locale.frac_digits, - _monetary_locale.p_cs_precedes, - _monetary_locale.p_sep_by_space, - _monetary_locale.n_cs_precedes, - _monetary_locale.n_sep_by_space, - _monetary_locale.p_sign_posn, - _monetary_locale.n_sign_posn + _monetary_locale.int_frac_digits[0], + _monetary_locale.frac_digits[0], + _monetary_locale.p_cs_precedes[0], + _monetary_locale.p_sep_by_space[0], + _monetary_locale.n_cs_precedes[0], + _monetary_locale.n_sep_by_space[0], + _monetary_locale.p_sign_posn[0], + _monetary_locale.n_sign_posn[0] ); } #endif /* LOCALE_DEBUG */ --- localeconv.c.old Fri Dec 21 07:27:35 2001 +++ localeconv.c Mon Jan 28 08:44:47 2002 @@ -41,8 +41,6 @@ #endif /* LIBC_SCCS and not lint */ #include <locale.h> -#include <stdlib.h> -#include <limits.h> #include "lmonetary.h" #include "lnumeric.h" @@ -58,14 +56,6 @@ int __mlocale_changed = 1; int __nlocale_changed = 1; -static char -cnv(char *str) { - int i = strtol(str, NULL, 10); - if (i == -1) - i = CHAR_MAX; - return (char)i; -} - /* * Return the current locale conversion. */ @@ -79,7 +69,7 @@ struct lc_monetary_T * mptr; #define M_ASSIGN_STR(NAME) (ret.NAME = (char*)mptr->NAME) -#define M_ASSIGN_CHAR(NAME) (ret.NAME = cnv((char*)mptr->NAME)) +#define M_ASSIGN_CHAR(NAME) (ret.NAME = mptr->NAME[0]) mptr = __get_current_monetary_locale(); M_ASSIGN_STR(int_curr_symbol); -- Andrey A. Chernov http://ache.pp.ru/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020128055557.GA23297>