pyconfig.h and freebsd10: _POSIX_C_SOURCE and _XOPEN_SOURCE

Bruce Evans brde at
Thu Jan 26 16:59:18 UTC 2012

On Thu, 26 Jan 2012, David Schultz wrote:

> On Thu, Jan 26, 2012, David Chisnall wrote:
>> On 26 Jan 2012, at 04:47, Eitan Adler wrote:
>>> What about patching python to only define the POSIX macros iff glibc
>>> is being used (and getting this upstreamed) ?
> That's a good strategy regardless.  As long as python is doing
> something bogus, it could easily break in the future.
>> Index: include/xlocale.h
> [...]
>> +/*
>> + * 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_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);

This file has mounds of style bugs.  This change adds many more:
- all tabs after #define are corrupt
- all spaces around the binary operator `<<' are missing.
- the prototype for newlocale() is disordered.

The prototypes have mounds of namespace pollution.  All their parameters
have names in the application namespace.

locale.h used to have only 1 corrupt tab after #define (the one, but
now has the above.  It also has verbose comments on the prototypes
which make the actual prototypes hard to read.  Normally, prototypes
have no comment, as for old prototypes in locale.h.  Some of the
comments are not formatted normally.

>> +
>> +#endif /* __X_LOCALE_DEFINED */
> It would be preferable not to have two copies of all the
> definitions and declarations in the source.  This is often handled
> with separate headers like sys/_timeval.h and sys/_types.h.
> Perhaps that's too many hoops to jump through just to cope with
> buggy applications.  (Incidentally, I noticed that the LC_* macros
> are in a slightly different order from the LC_*_MASK macros.  For
> that reason, and only that reason, it's not possible to define the
> latter in terms of the former.)
> Would it suffice, perhaps, to simply change the xlocale
> declarations to use type `struct _xlocale' instead of locale_t?
> That won't fix apps that expect the LC_*_MASK macros to be
> defined, but it looks like it will at least make the header
> compile in a strict POSIX environment, and it avoids the
> duplication.
> By the way, struct _xlocale needs another underscore in front of
> it.  Names prefixed with a single underscore and a lowercase
> letter are in the application's namespace.

No, this is not one of the many missing underscores in the above.
Identifiers that begin with a single underscore which is followed by
any character that gives a valid identifier (an upper or lower case
letter, or a digit) are reserved for use as identifiers with file scope
in both the ordinary and tag name spaces.  The above only uses _xlocale
in file scope (in a typedef), so application use of it can't clobber
this use.  Only use of it in macros is likely to require 2 underscores,
but there is no such use.  Using it for only a tag name limits problems
with underscores even more than usual.


More information about the freebsd-standards mailing list