On 26 Jan 2012, at 04:47, Eitan Adler wrote:

> On Wed, Jan 25, 2012 at 3:51 PM, Andriy Gapon <a...@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.
>>> 
>>> 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.
>> 
>> Thank you for the insights.
>> 
>>> 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?
>> 
>> I think that this should work.
> 
> 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?  

David

Index: include/locale.h
===================================================================
--- include/locale.h    (revision 230510)
+++ include/locale.h    (working copy)
@@ -79,7 +79,8 @@
 char           *setlocale(int, const char *);
 __END_DECLS
 
-#if __POSIX_VISIBLE >= 200809
+#if __POSIX_VISIBLE >= 200809 && !defined(__X_LOCALE_DEFINED)
+#define __X_LOCALE_DEFINED
 
 #define LC_COLLATE_MASK  (1<<0)
 #define LC_CTYPE_MASK    (1<<1)
Index: include/xlocale.h
===================================================================
--- include/xlocale.h   (revision 230510)
+++ include/xlocale.h   (working copy)
@@ -35,7 +35,33 @@
 #include <locale.h>
 
 __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
 
+#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.
  *

_______________________________________________
freebsd-python@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-python
To unsubscribe, send any mail to "freebsd-python-unsubscr...@freebsd.org"

Reply via email to