tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
newlocale(3) with base == (locale_t)0
Can someone tell me if NetBSD is non-conforming here, or should only the
newlocale(3) man-page be updated?
SUSv5 says for newlocale(3):
If the base argument is (locale_t)0, a new locale object shall
be created[...]
If a completely new locale object is created, the data for all
sections not requested by category_mask shall be taken from the
POSIX locale.
and that is what happens on Linux (Debian 13.4.0) and FreeBSD (15.0-RELEASE).
However, the Tribblix 0m39 newlocale(3) says:
To create a new locale, the argument base should be passed the
special argument (locale_t)0. This will use a copy of the current
global locale as a starting point.
So, the base is the _current_ locale, not POSIX, when base == (locale_t)0.
NetBSD has the same behaviour, but, this isn't documented.
Test code follows:
---START---
#ifdef __linux__
#define _GNU_SOURCE
#endif
#include <langinfo.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __FreeBSD__
#include <xlocale.h>
#else
#include <locale.h>
#endif
int
main(void)
{
locale_t nl;
/*
* es_ES -> es_ES
*/
setlocale(LC_ALL, "es_ES.UTF-8"); /* must have locale files */
printf("%s\n", localeconv()->decimal_point); /* , */
printf("%f\n", strtod("0,987654", NULL)); /* 0,987654 */
/*
* C -> es_ES
*/
/* use LC_NUMERIC_MASK on NetBSD & Tribblix 0m39 */
nl = newlocale(LC_CTYPE_MASK, "C", (locale_t)0);
printf("%s\n", nl_langinfo_l(RADIXCHAR, nl)); /* . or , (nbsd, tribblix) */
printf("%f\n", strtod_l("0.987654", NULL, nl)); /* expect: 0,987654 */
freelocale(nl);
return 0;
}
---END---
-RVP
Home |
Main Index |
Thread Index |
Old Index