-/** Returns a (pointer to a) lconv structure holding the values for the current
- * locale. The structure must not be changed; values might become outdated with
- * later calls to setlocale() changing LC_NUMERIC, LC_MONETARY or LC_ALL.
- */
-struct lconv * localeconv( void );
-
-/** Categories are selected by OR'ing the LC_* defines from this header. The
- * function sets the current locale to that defined by locale_name, and returns
- * the name of the new locale (if it was set successfully) or a null pointer
- * (if unsuccessful). At startup, the current locale is "C" by default. A null
- * pointer as locale_name leaves the locale unchanged, an empty string sets it
- * to the "native" locale.
+/* The category parameter can be any of the LC_* macros to specify if the call
+ to setlocale() shall affect the entire locale or only a portion thereof.
+ The category locale specifies which locale should be switched to, with "C"
+ being the minimal default locale, and "" being the locale-specific native
+ environment. A NULL pointer makes setlocale() return the *current* setting.
+ Otherwise, returns a pointer to a string associated with the specified
+ category for the new locale.
+*/
+char * setlocale( int category, const char * locale ) _PDCLIB_nothrow;
+
+/* Returns a struct lconv initialized to the values appropriate for the current
+ locale setting.
+*/
+struct lconv * localeconv( void ) _PDCLIB_nothrow;
+
+#if _PDCLIB_POSIX_MIN(2008)
+#define LC_COLLATE_MASK (1 << LC_COLLATE)
+#define LC_CTYPE_MASK (1 << LC_CTYPE)
+#define LC_MONETARY_MASK (1 << LC_MONETARY)
+#define LC_NUMERIC_MASK (1 << LC_NUMERIC)
+#define LC_TIME_MASK (1 << LC_TIME)
+#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MONETARY_MASK | \
+ LC_NUMERIC_MASK | LC_TIME_MASK)
+
+
+/* POSIX locale type */
+typedef _PDCLIB_locale_t locale_t;
+
+/* Global locale */
+extern struct _PDCLIB_locale _PDCLIB_global_locale;
+#define LC_GLOBAL_LOCALE (&_PDCLIB_global_locale)
+
+locale_t newlocale(int category_mask, const char *locale, locale_t base);
+
+/* Set the thread locale to newlocale
+ *
+ * If newlocale is (locale_t)0, then doesn't change the locale and just returns
+ * the existing locale.
+ *
+ * If newlocale is LC_GLOBAL_LOCALE, resets the thread's locale to use the
+ * global locale.
+ *
+ * Returns the previous thread locale. If the thread had no previous locale,
+ * returns the global locale.