Date: Thu, 26 Jan 2012 11:34:00 +0000 From: David Chisnall <theraven@freebsd.org> To: Eitan Adler <lists@eitanadler.com> Cc: David Schultz <das@freebsd.org>, freebsd-standards@freebsd.org, python@freebsd.org, Andriy Gapon <avg@freebsd.org>, gogo@cs.uni-sb.de Subject: Re: pyconfig.h and freebsd10: _POSIX_C_SOURCE and _XOPEN_SOURCE Message-ID: <3B3BEEED-D1E4-4329-BE34-5CFF5CABB52C@freebsd.org> In-Reply-To: <CAF6rxgn81hxBwwx9Y6%2Bg1PFcaQjoLfQMfb5QGgycryR4PLoboA@mail.gmail.com> References: <4F1AAA75.5050500@FreeBSD.org> <20120122192526.GA52071@zim.MIT.EDU> <9F9CC3ED-0686-4BC5-BF01-1839A30ABA9C@FreeBSD.ORG> <4F206B5D.3080302@FreeBSD.org> <CAF6rxgn81hxBwwx9Y6%2Bg1PFcaQjoLfQMfb5QGgycryR4PLoboA@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 26 Jan 2012, at 04:47, Eitan Adler wrote: > On Wed, Jan 25, 2012 at 3:51 PM, Andriy Gapon <avg@freebsd.org> wrote: >> on 25/01/2012 15:23 David Chisnall said the following: >>> On 22 Jan 2012, at 19:25, David Schultz wrote: >>>> Technically it's a problem with python. If you ask for a strict >>>> POSIX environment (doesn't matter what version) and also #include >>>> a non-POSIX header, there's no guarantee about what you'll get. >>>> I've CC'd the xlocale author in case he wants to comment or >>>> voluntarily make xlocale work in an otherwise strict POSIX >>>> environment, but that's not officially supported. >>>=20 >>> The problem is really with glibc, which uses these macros in the = opposite way to everyone else (glibc thinks defining these macros means = expose functionality from this standard, don't expose it otherwise, = everyone else thinks they mean expose only the things defined by this = standard). This makes writing portable code a pain and, while I'd = usually be keen to blame Python for everything, in this case I = sympathise with their problem. >>=20 >> Thank you for the insights. >>=20 >>> Would defining locale_t and the related functions in xlocale.h if we = are in a mode where they are not normally exposed fix the problem? >>=20 >> I think that this should work. >=20 > What about patching python to only define the POSIX macros iff glibc > is being used (and getting this upstreamed) ? That would be ideal, but I'd prefer that we did anything that we can = within the standard to ensure that people who do silly thing that work = on other platforms don't end up saying 'FreeBSD sucks!' because of their = code. Please can you someone verify that this patch fixes the problem? =20= David Index: include/locale.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- include/locale.h (revision 230510) +++ include/locale.h (working copy) @@ -79,7 +79,8 @@ char *setlocale(int, const char *); __END_DECLS =20 -#if __POSIX_VISIBLE >=3D 200809 +#if __POSIX_VISIBLE >=3D 200809 && !defined(__X_LOCALE_DEFINED) +#define __X_LOCALE_DEFINED =20 #define LC_COLLATE_MASK (1<<0) #define LC_CTYPE_MASK (1<<1) Index: include/xlocale.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- include/xlocale.h (revision 230510) +++ include/xlocale.h (working copy) @@ -35,7 +35,33 @@ #include <locale.h> =20 __BEGIN_DECLS +/* + * If people turned off POSIX2008 stuff, but still explicitly included = the + * xlocale.h header, then assume that they actually do want these = functions and + * define them. + */ +#ifndef __X_LOCALE_DEFINED +#define __X_LOCALE_DEFINED =20 +#define LC_COLLATE_MASK (1<<0) +#define LC_CTYPE_MASK (1<<1) +#define LC_MESSAGES_MASK (1<<2) +#define LC_MONETARY_MASK (1<<3) +#define LC_NUMERIC_MASK (1<<4) +#define LC_TIME_MASK (1<<5) +#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | = LC_MESSAGES_MASK | \ + LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK) +#define LC_GLOBAL_LOCALE ((locale_t)-1) + +typedef struct _xlocale *locale_t; +locale_t newlocale(int mask, const char *locale, locale_t base); +locale_t duplocale(locale_t base); +int freelocale(locale_t loc); +const char *querylocale(int mask, locale_t loc); +locale_t uselocale(locale_t loc); + +#endif /* __X_LOCALE_DEFINED */ + /* * Extended locale versions of the locale-aware functions from = string.h. *
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3B3BEEED-D1E4-4329-BE34-5CFF5CABB52C>