Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Feb 2012 12:03:23 +0000 (UTC)
From:      David Chisnall <theraven@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r231673 - in head: etc/mtree include include/xlocale lib/libc/locale sys/sys
Message-ID:  <201202141203.q1EC3NfW097214@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: theraven
Date: Tue Feb 14 12:03:23 2012
New Revision: 231673
URL: http://svn.freebsd.org/changeset/base/231673

Log:
  Cleanup of xlocale:
  
  - Address performance regressions encountered by das@ by caching per-thread
    data in TLS where available.
  - Add a __NO_TLS flag to cdefs.h to indicate where not available.
  - Reorganise the xlocale.h definitions into xlocale/*.h so that they can be
    included from multiple places.
  - Export the POSIX2008 subset of xlocale when POSIX2008 says it should be
    exported, independently of whether xlocale.h is included.
  - Fix the bug where programs using ctype functions always assumed ASCII unless
    recompiled.
  - Fix some style(9) violations.
  
  Reviewed by:	brooks (mentor)
  Approved by:	dim (mentor)

Added:
  head/include/xlocale/
  head/include/xlocale/Makefile   (contents, props changed)
  head/include/xlocale/_ctype.h   (contents, props changed)
  head/include/xlocale/_inttypes.h   (contents, props changed)
  head/include/xlocale/_langinfo.h   (contents, props changed)
  head/include/xlocale/_locale.h   (contents, props changed)
  head/include/xlocale/_monetary.h   (contents, props changed)
  head/include/xlocale/_stdio.h   (contents, props changed)
  head/include/xlocale/_stdlib.h   (contents, props changed)
  head/include/xlocale/_string.h   (contents, props changed)
  head/include/xlocale/_time.h   (contents, props changed)
  head/include/xlocale/_wchar.h   (contents, props changed)
Deleted:
  head/include/_xlocale_ctype.h
Modified:
  head/etc/mtree/BSD.include.dist
  head/include/Makefile
  head/include/ctype.h
  head/include/langinfo.h
  head/include/locale.h
  head/include/runetype.h
  head/include/string.h
  head/include/time.h
  head/include/wchar.h
  head/include/wctype.h
  head/include/xlocale.h
  head/lib/libc/locale/Symbol.map
  head/lib/libc/locale/setrunelocale.c
  head/lib/libc/locale/table.c
  head/lib/libc/locale/xlocale.c
  head/lib/libc/locale/xlocale_private.h
  head/sys/sys/cdefs.h

Modified: head/etc/mtree/BSD.include.dist
==============================================================================
--- head/etc/mtree/BSD.include.dist	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/etc/mtree/BSD.include.dist	Tue Feb 14 12:03:23 2012	(r231673)
@@ -329,4 +329,6 @@
     ..
     vm
     ..
+    xlocale
+    ..
 ..

Modified: head/include/Makefile
==============================================================================
--- head/include/Makefile	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/Makefile	Tue Feb 14 12:03:23 2012	(r231673)
@@ -6,7 +6,7 @@
 .include <bsd.own.mk>
 
 CLEANFILES= osreldate.h version vers.c
-SUBDIR= arpa gssapi protocols rpcsvc rpc
+SUBDIR= arpa gssapi protocols rpcsvc rpc xlocale
 INCS=	a.out.h ar.h assert.h bitstring.h complex.h cpio.h _ctype.h ctype.h \
 	db.h \
 	dirent.h dlfcn.h elf.h elf-hints.h err.h fmtmsg.h fnmatch.h fstab.h \
@@ -24,7 +24,7 @@ INCS=	a.out.h ar.h assert.h bitstring.h 
 	strings.h sysexits.h tar.h termios.h tgmath.h \
 	time.h timeconv.h timers.h ttyent.h \
 	ulimit.h unistd.h utime.h utmpx.h uuid.h varargs.h vis.h \
-	wchar.h wctype.h wordexp.h xlocale.h _xlocale_ctype.h
+	wchar.h wctype.h wordexp.h xlocale.h
 
 MHDRS=	float.h floatingpoint.h stdarg.h
 

Modified: head/include/ctype.h
==============================================================================
--- head/include/ctype.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/ctype.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -78,6 +78,10 @@ int	isphonogram(int);
 int	isrune(int);
 int	isspecial(int);
 #endif
+
+#if __POSIX_VISIBLE >= 200809
+#include <xlocale/_ctype.h>
+#endif
 __END_DECLS
 
 #ifndef __cplusplus

Modified: head/include/langinfo.h
==============================================================================
--- head/include/langinfo.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/langinfo.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -130,6 +130,10 @@ typedef	__nl_item	nl_item;
 
 __BEGIN_DECLS
 char	*nl_langinfo(nl_item);
+
+#if __POSIX_VISIBLE >= 200809
+#include <xlocale/_langinfo.h>
+#endif
 __END_DECLS
 
 #endif /* !_LANGINFO_H_ */

Modified: head/include/locale.h
==============================================================================
--- head/include/locale.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/locale.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -77,54 +77,11 @@ struct lconv {
 __BEGIN_DECLS
 struct lconv	*localeconv(void);
 char		*setlocale(int, const char *);
-__END_DECLS
 
 #if __POSIX_VISIBLE >= 200809
-
-#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)
-
-__BEGIN_DECLS
-
-typedef struct _xlocale *locale_t;
-/**
- * Creates a new locale.  
- */
-locale_t	 newlocale(int mask, const char *locale, locale_t base);
-
-/**
- * Returns an identical duplicate of the passed locale.  The returned locale
- * must be freed with freelocale().  The returned locale will share components
- * with the original.
- */
-locale_t	 duplocale(locale_t base);
-/*
- * Free a locale_t.  This is quite a poorly named function.  It actually
- * disclaims a reference to a locale_t, rather than freeing it.  
- */
-int	 freelocale(locale_t loc);
-
-/*
- * Returns the name of the locale for a particular component of a locale_t.
- */
-const char	*querylocale(int mask, locale_t loc);
-
-/*
- * Installs the specified locale_t as this thread's locale.
- */
-locale_t	 uselocale(locale_t loc);
-
+#include <xlocale/_locale.h>
+#endif
 __END_DECLS
 
-#endif /* __POSIX_VISIBLE >= 200809 */
-
 
 #endif /* _LOCALE_H_ */

Modified: head/include/runetype.h
==============================================================================
--- head/include/runetype.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/runetype.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -85,11 +85,21 @@ typedef struct {
 #define	_RUNE_MAGIC_1	"RuneMagi"	/* Indicates version 0 of RuneLocale */
 __BEGIN_DECLS
 extern const _RuneLocale _DefaultRuneLocale;
-__attribute__((deprecated))
-extern _RuneLocale *_CurrentRuneLocale;
-/* TODO: This is called quite a lot, so we should use a __thread variable when
- * it's available. */
-extern _RuneLocale *__getCurrentRuneLocale(void);
+extern const _RuneLocale *_CurrentRuneLocale;
+extern const _Thread_local _RuneLocale *_ThreadRuneLocale;
+#if defined(__NO_TLS) || defined(__RUNETYPE_INTERNAL)
+extern const _RuneLocale *__getCurrentRuneLocale(void);
+#else
+static inline const _RuneLocale *__getCurrentRuneLocale(void)
+{
+
+	if (_ThreadRuneLocale) 
+		return _ThreadRuneLocale;
+	if (_CurrentRuneLocale) 
+		return _CurrentRuneLocale;
+	return &_DefaultRuneLocale;
+}
+#endif /* __NO_TLS || __RUNETYPE_INTERNAL */
 #define _CurrentRuneLocale (__getCurrentRuneLocale())
 __END_DECLS
 

Modified: head/include/string.h
==============================================================================
--- head/include/string.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/string.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -132,6 +132,10 @@ void	 swab(const void * __restrict, void
 #endif /* _SWAB_DECLARED */
 
 #endif /* __BSD_VISIBLE */
+
+#if __POSIX_VISIBLE >= 200809
+#include <xlocale/_string.h>
+#endif
 __END_DECLS
 
 #endif /* _STRING_H_ */

Modified: head/include/time.h
==============================================================================
--- head/include/time.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/time.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -183,6 +183,10 @@ void tzsetwall(void);
 time_t timelocal(struct tm * const);
 time_t timegm(struct tm * const);
 #endif /* __BSD_VISIBLE */
+
+#if __POSIX_VISIBLE >= 200809
+#include <xlocale/_time.h>
+#endif
 __END_DECLS
 
 #endif /* !_TIME_H_ */

Modified: head/include/wchar.h
==============================================================================
--- head/include/wchar.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/wchar.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -224,6 +224,10 @@ wchar_t	*fgetwln(FILE * __restrict, size
 size_t	wcslcat(wchar_t *, const wchar_t *, size_t);
 size_t	wcslcpy(wchar_t *, const wchar_t *, size_t);
 #endif
+
+#if __POSIX_VISIBLE >= 200809
+#include <xlocale/_wchar.h>
+#endif
 __END_DECLS
 
 #endif /* !_WCHAR_H_ */

Modified: head/include/wctype.h
==============================================================================
--- head/include/wctype.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/wctype.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -87,6 +87,11 @@ wint_t	iswrune(wint_t);
 wint_t	iswspecial(wint_t);
 wint_t	nextwctype(wint_t, wctype_t);
 #endif
+
+#if __POSIX_VISIBLE >= 200809
+#define _XLOCALE_WCTYPES 1
+#include <xlocale/_ctype.h>
+#endif /* __POSIX_VISIBLE >= 200809 */
 __END_DECLS
 
 #ifndef __cplusplus

Modified: head/include/xlocale.h
==============================================================================
--- head/include/xlocale.h	Tue Feb 14 12:00:34 2012	(r231672)
+++ head/include/xlocale.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2011 The FreeBSD Foundation
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
  * All rights reserved.
  *
  * This software was developed by David Chisnall under sponsorship from
@@ -8,16 +8,16 @@
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 1.  Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@@ -33,225 +33,52 @@
 #define _XLOCALE_H_
 
 #include <locale.h>
-
 __BEGIN_DECLS
+#include <xlocale/_locale.h>
 
-/*
- * Extended locale versions of the locale-aware functions from string.h.
- *
- * Include <string.h> before <xlocale.h> to expose these.
- */
 #ifdef _STRING_H_
-int	 strcoll_l(const char *, const char *, locale_t);
-size_t	 strxfrm_l(char *, const char *, size_t, locale_t);
-int	 strcasecmp_l(const char *, const char *, locale_t);
-char	*strcasestr_l(const char *, const char *, locale_t);
-int	 strncasecmp_l(const char *, const char *, size_t, locale_t);
+#include <xlocale/_string.h>
 #endif
-/*
- * Extended locale versions of the locale-aware functions from inttypes.h.
- *
- * Include <inttypes.h> before <xlocale.h> to expose these.
- */
+
 #ifdef _INTTYPES_H_
-intmax_t 
-strtoimax_l(const char * __restrict, char ** __restrict, int, locale_t);
-uintmax_t
-strtoumax_l(const char * __restrict, char ** __restrict, int, locale_t);
-intmax_t 
-wcstoimax_l(const wchar_t * __restrict, wchar_t ** __restrict, int , locale_t);
-uintmax_t
-wcstoumax_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
+#include <xlocale/_inttypes.h>
 #endif
-/*
- * Extended locale versions of the locale-aware functions from monetary.h.
- *
- * Include <monetary.h> before <xlocale.h> to expose these.
- */
+
 #ifdef _MONETARY_H_
-ssize_t strfmon_l(char *, size_t, locale_t, const char *, ...)
-#	if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
-	__attribute__((__format__ (__strfmon__, 4, 5)))
-#	endif
-	;
+#include <xlocale/_monetary.h>
 #endif
 
-/*
- * Extended locale versions of the locale-aware functions from stdlib.h.
- *
- * Include <stdlib.h> before <xlocale.h> to expose these.
- */
 #ifdef _STDLIB_H_
-double	 atof_l(const char *, locale_t);
-int	 atoi_l(const char *, locale_t);
-long	 atol_l(const char *, locale_t);
-long long	 atoll_l(const char *, locale_t);
-int	 mblen_l(const char *, size_t, locale_t);
-size_t
-mbstowcs_l(wchar_t * __restrict, const char * __restrict, size_t, locale_t);
-int
-mbtowc_l(wchar_t * __restrict, const char * __restrict, size_t, locale_t);
-double	 strtod_l(const char *, char **, locale_t);
-float	 strtof_l(const char *, char **, locale_t);
-long	 strtol_l(const char *, char **, int, locale_t);
-long	 double strtold_l(const char *, char **, locale_t);
-long long	 strtoll_l(const char *, char **, int, locale_t);
-unsigned long	 strtoul_l(const char *, char **, int, locale_t);
-unsigned long long	 strtoull_l(const char *, char **, int, locale_t);
-size_t
-wcstombs_l(char * __restrict, const wchar_t * __restrict, size_t, locale_t);
-int	 wctomb_l(char *, wchar_t, locale_t);
-
-int	 ___mb_cur_max_l(locale_t);
-#define MB_CUR_MAX_L(x) (___mb_cur_max_l(x))
-
+#include <xlocale/_stdlib.h>
 #endif
-/*
- * Extended locale versions of the locale-aware functions from time.h.
- *
- * Include <time.h> before <xlocale.h> to expose these.
- */
+
 #ifdef _TIME_H_
-size_t
-strftime_l(char * __restrict, size_t, const char * __restrict, const
-           struct tm * __restrict, locale_t)
-#	if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
-	__attribute__((__format__ (__strftime__, 3, 0)))
-#	endif
-	;
-char *
-strptime_l(const char * __restrict, const char * __restrict,
-           struct tm * __restrict, locale_t);
+#include <xlocale/_time.h>
 #endif
+
 #ifdef _LANGINFO_H_
-char	*nl_langinfo_l(nl_item, locale_t);
+#include <xlocale/_langinfo.h>
 #endif
+
 #ifdef _CTYPE_H_
-#include <_xlocale_ctype.h>
+#include <xlocale/_ctype.h>
 #endif
+
 #ifdef _WCTYPE_H_
-#define XLOCALE_WCTYPES 1
-#include <_xlocale_ctype.h>
+#define _XLOCALE_WCTYPES 1
+#include <xlocale/_ctype.h>
 #endif
 
 #ifdef _STDIO_H_
-int	 fprintf_l(FILE * __restrict, locale_t, const char * __restrict, ...)
-		__printflike(3, 4);
-int	 fscanf_l(FILE * __restrict, locale_t, const char * __restrict, ...)
-		__scanflike(3, 4);
-int	 printf_l(locale_t, const char * __restrict, ...) __printflike(2, 3);
-int	 scanf_l(locale_t, const char * __restrict, ...) __scanflike(2, 3);
-int	 sprintf_l(char * __restrict, locale_t, const char * __restrict, ...)
-		__printflike(3, 4);
-int	 sscanf_l(const char * __restrict, locale_t, const char * __restrict, ...)
-		__scanflike(3, 4);
-int	 vfprintf_l(FILE * __restrict, locale_t, const char * __restrict, __va_list)
-		__printflike(3, 0);
-int	 vprintf_l(locale_t, const char * __restrict, __va_list) __printflike(2, 0);
-int	 vsprintf_l(char * __restrict, locale_t, const char * __restrict, __va_list)
-		__printflike(3, 0);
-
-int	 snprintf_l(char * __restrict, size_t, locale_t, const char * __restrict,
-		...) __printflike(4, 5);
-int	 vfscanf_l(FILE * __restrict, locale_t, const char * __restrict, __va_list)
-		__scanflike(3, 0);
-int	 vscanf_l(locale_t, const char * __restrict, __va_list) __scanflike(2, 0);
-int	 vsnprintf_l(char * __restrict, size_t, locale_t, const char * __restrict,
-		__va_list) __printflike(4, 0);
-int	 vsscanf_l(const char * __restrict, locale_t, const char * __restrict,
-		__va_list) __scanflike(3, 0);
-int	 dprintf_l(int, locale_t, const char * __restrict, ...) __printflike(3, 4);
-int	 vdprintf_l(int, locale_t, const char * __restrict, __va_list)
-		__printflike(3, 0);
-int	 asprintf_l(char **, locale_t, const char *, ...) __printflike(3, 4);
-int	 vasprintf_l(char **, locale_t, const char *, __va_list) __printflike(3, 0);
+#include <xlocale/_stdio.h>
 #endif
-#ifdef _WCHAR_H_
-wint_t	 btowc_l(int, locale_t);
-wint_t	 fgetwc_l(FILE *, locale_t);
-wchar_t *
-fgetws_l(wchar_t * __restrict, int, FILE * __restrict, locale_t);
-wint_t	 fputwc_l(wchar_t, FILE *, locale_t);
-int
-fputws_l(const wchar_t * __restrict, FILE * __restrict, locale_t);
-int
-fwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict,
-		...);
-int
-fwscanf_l(FILE * __restrict, locale_t, const wchar_t * __restrict, ...);
-wint_t	 getwc_l(FILE *, locale_t);
-wint_t	 getwchar_l(locale_t);
-size_t
-mbrlen_l(const char * __restrict, size_t, mbstate_t * __restrict, locale_t);
-size_t
-mbrtowc_l(wchar_t * __restrict, const char * __restrict, size_t,
-		mbstate_t * __restrict, locale_t);
-int	 mbsinit_l(const mbstate_t *, locale_t);
-size_t
-mbsrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t,
-		mbstate_t * __restrict, locale_t);
-wint_t	 putwc_l(wchar_t, FILE *, locale_t);
-wint_t	 putwchar_l(wchar_t, locale_t);
-int
-swprintf_l(wchar_t * __restrict, size_t n, locale_t,
-		const wchar_t * __restrict, ...);
-int
-swscanf_l(const wchar_t * __restrict, locale_t, const wchar_t * __restrict,
-		...);
-wint_t	 ungetwc_l(wint_t, FILE *, locale_t);
-int
-vfwprintf_l(FILE * __restrict, locale_t, const wchar_t * __restrict,
-		__va_list);
-int
-vswprintf_l(wchar_t * __restrict, size_t n, locale_t,
-		const wchar_t * __restrict, __va_list);
-int	 vwprintf_l(locale_t, const wchar_t * __restrict, __va_list);
-size_t
-wcrtomb_l(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
-int	 wcscoll_l(const wchar_t *, const wchar_t *, locale_t);
-size_t
-wcsftime_l(wchar_t * __restrict, size_t, const wchar_t * __restrict,
-		const struct tm * __restrict, locale_t);
-size_t 
-wcsrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t,
-		mbstate_t * __restrict, locale_t);
-double	 wcstod_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
-long
-wcstol_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
-unsigned long
-wcstoul_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
-int	 wcswidth_l(const wchar_t *, size_t, locale_t);
-size_t
-wcsxfrm_l(wchar_t * __restrict, const wchar_t * __restrict, size_t, locale_t);
-int	 wctob_l(wint_t, locale_t);
-int	 wcwidth_l(wchar_t, locale_t);
-int	 wprintf_l(locale_t, const wchar_t * __restrict, ...);
-int	 wscanf_l(locale_t, const wchar_t * __restrict, ...);
-
-int
-vfwscanf_l(FILE * __restrict, locale_t, const wchar_t * __restrict,
-		__va_list);
-int	 vswscanf_l(const wchar_t * __restrict, locale_t,
-const wchar_t	*__restrict, __va_list);
-int	 vwscanf_l(locale_t, const wchar_t * __restrict, __va_list);
-float 	wcstof_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
-long double
-wcstold_l(const wchar_t * __restrict, wchar_t ** __restrict, locale_t);
-long long
-wcstoll_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
-unsigned long long
-wcstoull_l(const wchar_t * __restrict, wchar_t ** __restrict, int, locale_t);
-size_t
-mbsnrtowcs_l(wchar_t * __restrict, const char ** __restrict, size_t, size_t,
-		mbstate_t * __restrict, locale_t);
-int	 wcscasecmp_l(const wchar_t *, const wchar_t *, locale_t);
-int	 wcsncasecmp_l(const wchar_t *, const wchar_t *, size_t, locale_t);
-size_t
-wcsnrtombs_l(char * __restrict, const wchar_t ** __restrict, size_t, size_t,
-		mbstate_t * __restrict, locale_t);
 
+#ifdef _WCHAR_H_
+#include <xlocale/_wchar.h>
 #endif
 
+
+
 struct lconv	*localeconv_l(locale_t);
 __END_DECLS
 

Added: head/include/xlocale/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/Makefile	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,8 @@
+# $FreeBSD$ 
+
+NO_OBJ=
+INCS=	_ctype.h _inttypes.h _langinfo.h _locale.h _monetary.h _stdio.h\
+	_stdlib.h _string.h _time.h _wchar.h
+INCSDIR=${INCLUDEDIR}/xlocale
+
+.include <bsd.prog.mk>

Added: head/include/xlocale/_ctype.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_ctype.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,182 @@
+/*-
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+
+#if	(defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_WCTYPE_H)) || \
+	(!defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_CTYPE_H))
+
+#ifdef _XLOCALE_WCTYPES
+#define _XLOCALE_WCTYPE_H
+#else
+#define _XLOCALE_CTYPE_H
+#endif
+
+#ifndef _LOCALE_T_DEFINED
+#define _LOCALE_T_DEFINED
+typedef struct	_xlocale *locale_t;
+#endif
+
+#ifndef _XLOCALE_CTYPE_H_
+unsigned long	 ___runetype_l(__ct_rune_t, locale_t) __pure;
+__ct_rune_t	 ___tolower_l(__ct_rune_t, locale_t) __pure;
+__ct_rune_t	 ___toupper_l(__ct_rune_t, locale_t) __pure;
+_RuneLocale	*__runes_for_locale(locale_t, int*);
+#endif
+
+#ifndef _XLOCALE_INLINE
+#if __GNUC__ && !__GNUC_STDC_INLINE__
+/* GNU89 inline has nonstandard semantics. */
+#define _XLOCALE_INLINE extern inline
+#else
+/* Hack to work around people who define inline away */
+#ifdef inline
+#define _XLOCALE_INLINE __inline static
+#else
+/* Define with C++ / C99 compatible semantics */
+#define _XLOCALE_INLINE inline
+#endif
+#endif
+#endif /* _XLOCALE_INLINE */
+
+#ifdef _XLOCALE_WCTYPES
+static __inline int
+__maskrune_l(__ct_rune_t _c, unsigned long _f, locale_t locale)
+{
+	int mb_sb_limit;
+	_RuneLocale *runes = __runes_for_locale(locale, &mb_sb_limit);
+	return (_c < 0 || _c >= _CACHED_RUNES) ? ___runetype_l(_c, locale) :
+	       runes->__runetype[_c] & _f;
+}
+
+static __inline int
+__istype_l(__ct_rune_t _c, unsigned long _f, locale_t locale)
+{
+	return (!!__maskrune_l(_c, _f, locale));
+}
+
+#define XLOCALE_ISCTYPE(fname, cat) \
+		_XLOCALE_INLINE int isw##fname##_l(int c, locale_t l)\
+		{ return __istype_l(c, cat, l); }
+#else
+static __inline int
+__sbmaskrune_l(__ct_rune_t _c, unsigned long _f, locale_t locale)
+{
+	int mb_sb_limit;
+	_RuneLocale *runes = __runes_for_locale(locale, &mb_sb_limit);
+	return (_c < 0 || _c >= mb_sb_limit) ? 0 :
+	       runes->__runetype[_c] & _f;
+}
+
+static __inline int
+__sbistype_l(__ct_rune_t _c, unsigned long _f, locale_t locale)
+{
+	return (!!__sbmaskrune_l(_c, _f, locale));
+}
+
+#define XLOCALE_ISCTYPE(fname, cat) \
+		_XLOCALE_INLINE int is##fname##_l(int c, locale_t l)\
+		{ return __sbistype_l(c, cat, l); }
+#endif
+
+XLOCALE_ISCTYPE(alnum, _CTYPE_A|_CTYPE_D)
+XLOCALE_ISCTYPE(alpha, _CTYPE_A)
+XLOCALE_ISCTYPE(blank, _CTYPE_B)
+XLOCALE_ISCTYPE(cntrl, _CTYPE_C)
+XLOCALE_ISCTYPE(digit, _CTYPE_D)
+XLOCALE_ISCTYPE(graph, _CTYPE_G)
+XLOCALE_ISCTYPE(hexnumber, _CTYPE_X)
+XLOCALE_ISCTYPE(ideogram, _CTYPE_I)
+XLOCALE_ISCTYPE(lower, _CTYPE_L)
+XLOCALE_ISCTYPE(number, _CTYPE_D)
+XLOCALE_ISCTYPE(phonogram, _CTYPE_Q)
+XLOCALE_ISCTYPE(print, _CTYPE_R)
+XLOCALE_ISCTYPE(punct, _CTYPE_P)
+XLOCALE_ISCTYPE(rune, 0xFFFFFF00L)
+XLOCALE_ISCTYPE(space, _CTYPE_S)
+XLOCALE_ISCTYPE(special, _CTYPE_T)
+XLOCALE_ISCTYPE(upper, _CTYPE_U)
+XLOCALE_ISCTYPE(xdigit, _CTYPE_X)
+#undef XLOCALE_ISCTYPE
+
+#ifdef _XLOCALE_WCTYPES
+_XLOCALE_INLINE int towlower_l(int c, locale_t locale)
+{
+	int mb_sb_limit;
+	_RuneLocale *runes = __runes_for_locale(locale, &mb_sb_limit);
+	return (c < 0 || c >= _CACHED_RUNES) ? ___tolower_l(c, locale) :
+	       runes->__maplower[c];
+}
+_XLOCALE_INLINE int towupper_l(int c, locale_t locale)
+{
+	int mb_sb_limit;
+	_RuneLocale *runes = __runes_for_locale(locale, &mb_sb_limit);
+	return (c < 0 || c >= _CACHED_RUNES) ? ___toupper_l(c, locale) :
+	       runes->__mapupper[c];
+}
+_XLOCALE_INLINE int
+__wcwidth_l(__ct_rune_t _c, locale_t locale)
+{
+	unsigned int _x;
+
+	if (_c == 0)
+		return (0);
+	_x = (unsigned int)__maskrune_l(_c, _CTYPE_SWM|_CTYPE_R, locale);
+	if ((_x & _CTYPE_SWM) != 0)
+		return ((_x & _CTYPE_SWM) >> _CTYPE_SWS);
+	return ((_x & _CTYPE_R) != 0 ? 1 : -1);
+}
+int iswctype_l(wint_t wc, wctype_t charclass, locale_t locale);
+wctype_t wctype_l(const char *property, locale_t locale);
+wint_t towctrans_l(wint_t wc, wctrans_t desc, locale_t locale);
+wint_t nextwctype_l(wint_t wc, wctype_t wct, locale_t locale);
+wctrans_t wctrans_l(const char *charclass, locale_t locale);
+#undef _XLOCALE_WCTYPES
+#else
+_XLOCALE_INLINE int digittoint_l(int c, locale_t locale)
+{ return __sbmaskrune_l((c), 0xFF, locale); }
+
+_XLOCALE_INLINE int tolower_l(int c, locale_t locale)
+{
+	int mb_sb_limit;
+	_RuneLocale *runes = __runes_for_locale(locale, &mb_sb_limit);
+	return (c < 0 || c >= mb_sb_limit) ? c :
+	       runes->__maplower[c];
+}
+_XLOCALE_INLINE int toupper_l(int c, locale_t locale)
+{
+	int mb_sb_limit;
+	_RuneLocale *runes = __runes_for_locale(locale, &mb_sb_limit);
+	return (c < 0 || c >= mb_sb_limit) ? c :
+	       runes->__mapupper[c];
+}
+#endif
+#endif /* (defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_WCTYPE_H)) || \
+	(!defined(_XLOCALE_WCTYPES) && !defined(_XLOCALE_CTYPE_H)) */

Added: head/include/xlocale/_inttypes.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_inttypes.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,44 @@
+/*-
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+
+/*
+ * Extended locale versions of the locale-aware functions from inttypes.h.
+ * Include <inttypes.h> before <xlocale.h> to expose these.
+ */
+intmax_t	strtoimax_l(const char * __restrict, char ** __restrict,
+		    int, locale_t);
+uintmax_t	strtoumax_l(const char * __restrict, char ** __restrict, int,
+		    locale_t);
+intmax_t	wcstoimax_l(const wchar_t * __restrict, wchar_t ** __restrict,
+		    int , locale_t);
+uintmax_t	wcstoumax_l(const wchar_t * __restrict, wchar_t ** __restrict,
+		    int, locale_t);

Added: head/include/xlocale/_langinfo.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_langinfo.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _XLOCALE_LANGINFO_H
+#define _XLOCALE_LANGINFO_H
+
+#ifndef _LOCALE_T_DEFINED
+#define _LOCALE_T_DEFINED
+typedef struct	_xlocale *locale_t;
+#endif
+
+char	*nl_langinfo_l(nl_item, locale_t);
+
+#endif /* _XLOCALE_LANGINFO_H */

Added: head/include/xlocale/_locale.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_locale.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,56 @@
+/*-
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _XLOCALE_LOCALE_H
+#define _XLOCALE_LOCALE_H
+
+#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)
+
+#ifndef _LOCALE_T_DEFINED
+#define _LOCALE_T_DEFINED
+typedef struct	_xlocale *locale_t;
+#endif
+
+locale_t	 duplocale(locale_t base);
+int		 freelocale(locale_t loc);
+locale_t	 newlocale(int mask, const char *locale, locale_t base);
+const char	*querylocale(int mask, locale_t loc);
+locale_t	 uselocale(locale_t loc);
+
+#endif /* _XLOCALE_LOCALE_H */

Added: head/include/xlocale/_monetary.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_monetary.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _LOCALE_T_DEFINED
+#define _LOCALE_T_DEFINED
+typedef struct	_xlocale *locale_t;
+#endif
+
+#if __POSIX_VISIBLE >= 200809 || defined(_XLOCALE_H_)
+#ifndef _XLOCALE_MONETARY_H
+#define _XLOCALE_MONETARY_H
+
+ssize_t strfmon_l(char *, size_t, locale_t, const char *, ...)
+    __strfmonlike(4, 5);
+
+#endif /* _XLOCALE_MONETARY_H */
+#endif /* __POSIX_VISIBLE >= 200809 || defined(_XLOCALE_H_) */

Added: head/include/xlocale/_stdio.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_stdio.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,64 @@
+/*-
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+int	 asprintf_l(char **, locale_t, const char *, ...) __printflike(3, 4);
+int	 dprintf_l(int, locale_t, const char * __restrict, ...)
+	    __printflike(3, 4);
+int	 fprintf_l(FILE * __restrict, locale_t, const char * __restrict, ...)
+	    __printflike(3, 4);
+int	 fscanf_l(FILE * __restrict, locale_t, const char * __restrict, ...)
+	    __scanflike(3, 4);
+int	 printf_l(locale_t, const char * __restrict, ...) __printflike(2, 3);
+int	 scanf_l(locale_t, const char * __restrict, ...) __scanflike(2, 3);
+int	 snprintf_l(char * __restrict, size_t, locale_t,
+	    const char * __restrict, ...) __printflike(4, 5);
+int	 sprintf_l(char * __restrict, locale_t, const char * __restrict, ...)
+	    __printflike(3, 4);
+int	 sscanf_l(const char * __restrict, locale_t, const char * __restrict,
+	    ...) __scanflike(3, 4);
+int	 vfprintf_l(FILE * __restrict, locale_t, const char * __restrict,
+	    __va_list) __printflike(3, 0);
+int	 vprintf_l(locale_t, const char * __restrict, __va_list)
+	    __printflike(2, 0);
+int	 vsprintf_l(char * __restrict, locale_t, const char * __restrict,
+	    __va_list) __printflike(3, 0);
+int	 vfscanf_l(FILE * __restrict, locale_t, const char * __restrict,
+	    __va_list) __scanflike(3, 0);
+int	 vscanf_l(locale_t, const char * __restrict, __va_list)
+	    __scanflike(2, 0);
+int	 vsnprintf_l(char * __restrict, size_t, locale_t,
+	    const char * __restrict, __va_list) __printflike(4, 0);
+int	 vsscanf_l(const char * __restrict, locale_t, const char * __restrict,
+	    __va_list) __scanflike(3, 0);
+int	 vdprintf_l(int, locale_t, const char * __restrict, __va_list)
+	    __printflike(3, 0);
+int	 vasprintf_l(char **, locale_t, const char *, __va_list)
+	    __printflike(3, 0);

Added: head/include/xlocale/_stdlib.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/include/xlocale/_stdlib.h	Tue Feb 14 12:03:23 2012	(r231673)
@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 2011, 2012 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by David Chisnall under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * Extended locale versions of the locale-aware functions from stdlib.h.
+ *
+ * Include <stdlib.h> before <xlocale.h> to expose these.
+ */
+double			 atof_l(const char *, locale_t);
+int			 atoi_l(const char *, locale_t);
+long			 atol_l(const char *, locale_t);
+long long		 atoll_l(const char *, locale_t);
+int			 mblen_l(const char *, size_t, locale_t);
+size_t			 mbstowcs_l(wchar_t * __restrict,
+			    const char * __restrict, size_t, locale_t);
+int			 mbtowc_l(wchar_t * __restrict,
+			    const char * __restrict, size_t, locale_t);
+double			 strtod_l(const char *, char **, locale_t);
+float			 strtof_l(const char *, char **, locale_t);
+long			 strtol_l(const char *, char **, int, locale_t);
+long double		 strtold_l(const char *, char **, locale_t);
+long long		 strtoll_l(const char *, char **, int, locale_t);
+unsigned long		 strtoul_l(const char *, char **, int, locale_t);
+unsigned long long	 strtoull_l(const char *, char **, int, locale_t);
+size_t			 wcstombs_l(char * __restrict,
+			    const wchar_t * __restrict, size_t, locale_t);
+int			 wctomb_l(char *, wchar_t, locale_t);
+
+int			 ___mb_cur_max_l(locale_t);
+#define MB_CUR_MAX_L(x) (___mb_cur_max_l(x))
+

Added: head/include/xlocale/_string.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202141203.q1EC3NfW097214>