This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Does --enable-clocale=gnu work on Linux/ia64?
On Sun, Nov 25, 2001 at 10:17:35PM -0800, Benjamin Kosnik wrote:
>
> > > Well, on x86 and powerpc, wchar_t is long int. Gcc won't complain about
> > > casting from char* to wchar_t. However, on ia64, wchar_t is int. Gcc is
> > > not very happy. I think that part of libstdc++ is pretty much broken.
>
> Backstory for Ulrich.
>
> > 2001-11-25 H.J. Lu <hjl@gnu.org>
> >
> > * config/locale/moneypunct_members_gnu.cc
> > (_M_initialize_moneypunct): Cast "char *" to "long int" before
> > casting to wchar_t for _NL_NUMERIC_DECIMAL_POINT_WC and
> > _NL_NUMERIC_THOUSANDS_SEP_WC.
> > * config/locale/numpunct_members_gnu.cc
> > (_M_initialize_numpunct): Likewise.
> >
> > - _M_decimal_point = reinterpret_cast<wchar_t>(__nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc));
> > - _M_thousands_sep = reinterpret_cast<wchar_t>(__nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC,__cloc));
> > + long int ch;
> > + ch = reinterpret_cast<long int>(__nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc));
> > + _M_decimal_point = (wchar_t) ch;
>
> C++ style casts, like static_cast<wchar_t>(ch);
>
> Looks ok to me. Uli?
>
> Did you try this on x86 and ia64?
Whatever cast you use, this is wrong.
categories.def:
DEFINE_ELEMENT (_NL_NUMERIC_DECIMAL_POINT_WC, "numeric-decimal-point-wc", std, word)
DEFINE_ELEMENT (_NL_NUMERIC_THOUSANDS_SEP_WC, "numeric-thousands-sep-wc", std, word)
localeinfo.h:
union locale_data_value
{
const uint32_t *wstr;
const char *string;
unsigned int word;
}
values __flexarr; /* Items, usually pointers into `filedata'. */
nl_langinfo.c:
/* Return the string for the specified item. */
return (char *) data->values[index].string;
So, what you need to do is:
union { const char *string; unsigned int word; } __tmp;
__tmp.string = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc);
_M_decimal_point = static_cast<wchar_t>(ch);
resp:
_M_decimal_point = static_cast<wchar_t>(((union { const char *s; unsinged int w; }){ s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).w)
Otherwise, big endian looses.
Jakub