---- nl_langinfo.c.orig Fri Mar 22 13:52:18 2002
-+++ nl_langinfo.c Sat May 3 14:14:55 2003
-@@ -33,7 +33,7 @@
- #include <stdlib.h>
- #include <string.h>
+--- nl_langinfo.c.orig 2005-03-15 23:26:13.000000000 -0800
++++ nl_langinfo.c 2005-03-15 23:38:20.000000000 -0800
+@@ -27,6 +27,8 @@
+ #include <sys/cdefs.h>
+ __FBSDID("$FreeBSD: src/lib/libc/locale/nl_langinfo.c,v 1.17 2003/06/26 10:46:16 phantom Exp $");
--#include "../stdtime/timelocal.h"
-+#include "timelocal.h"
++#include "xlocale_private.h"
++
+ #include <langinfo.h>
+ #include <limits.h>
+ #include <locale.h>
+@@ -36,20 +38,22 @@
#include "lnumeric.h"
- #include "lmonetary.h"
#include "lmessages.h"
+ #include "lmonetary.h"
+-#include "../stdtime/timelocal.h"
++#include "timelocal.h"
+
+ #define _REL(BASE) ((int)item-BASE)
+
+ char *
+-nl_langinfo(nl_item item)
++nl_langinfo_l(nl_item item, locale_t loc)
+ {
+- char *ret, *s, *cs;
++ char *ret, *cs;
++ const char *s;
+ static char *csym = NULL;
+
++ NORMALIZE_LOCALE(loc);
+ switch (item) {
+ case CODESET:
+ ret = "";
+- if ((s = setlocale(LC_CTYPE, NULL)) != NULL) {
++ if ((s = querylocale(LC_CTYPE_MASK, loc)) != NULL) {
+ if ((cs = strchr(s, '.')) != NULL)
+ ret = cs + 1;
+ else if (strcmp(s, "C") == 0 ||
+@@ -58,40 +62,40 @@
+ }
+ break;
+ case D_T_FMT:
+- ret = (char *) __get_current_time_locale()->c_fmt;
++ ret = (char *) __get_current_time_locale(loc)->c_fmt;
+ break;
+ case D_FMT:
+- ret = (char *) __get_current_time_locale()->x_fmt;
++ ret = (char *) __get_current_time_locale(loc)->x_fmt;
+ break;
+ case T_FMT:
+- ret = (char *) __get_current_time_locale()->X_fmt;
++ ret = (char *) __get_current_time_locale(loc)->X_fmt;
+ break;
+ case T_FMT_AMPM:
+- ret = (char *) __get_current_time_locale()->ampm_fmt;
++ ret = (char *) __get_current_time_locale(loc)->ampm_fmt;
+ break;
+ case AM_STR:
+- ret = (char *) __get_current_time_locale()->am;
++ ret = (char *) __get_current_time_locale(loc)->am;
+ break;
+ case PM_STR:
+- ret = (char *) __get_current_time_locale()->pm;
++ ret = (char *) __get_current_time_locale(loc)->pm;
+ break;
+ case DAY_1: case DAY_2: case DAY_3:
+ case DAY_4: case DAY_5: case DAY_6: case DAY_7:
+- ret = (char*) __get_current_time_locale()->weekday[_REL(DAY_1)];
++ ret = (char*) __get_current_time_locale(loc)->weekday[_REL(DAY_1)];
+ break;
+ case ABDAY_1: case ABDAY_2: case ABDAY_3:
+ case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7:
+- ret = (char*) __get_current_time_locale()->wday[_REL(ABDAY_1)];
++ ret = (char*) __get_current_time_locale(loc)->wday[_REL(ABDAY_1)];
+ break;
+ case MON_1: case MON_2: case MON_3: case MON_4:
+ case MON_5: case MON_6: case MON_7: case MON_8:
+ case MON_9: case MON_10: case MON_11: case MON_12:
+- ret = (char*) __get_current_time_locale()->month[_REL(MON_1)];
++ ret = (char*) __get_current_time_locale(loc)->month[_REL(MON_1)];
+ break;
+ case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4:
+ case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8:
+ case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
+- ret = (char*) __get_current_time_locale()->mon[_REL(ABMON_1)];
++ ret = (char*) __get_current_time_locale(loc)->mon[_REL(ABMON_1)];
+ break;
+ case ERA:
+ /* XXX: need to be implemented */
+@@ -114,16 +118,16 @@
+ ret = "";
+ break;
+ case RADIXCHAR:
+- ret = (char*) __get_current_numeric_locale()->decimal_point;
++ ret = (char*) __get_current_numeric_locale(loc)->decimal_point;
+ break;
+ case THOUSEP:
+- ret = (char*) __get_current_numeric_locale()->thousands_sep;
++ ret = (char*) __get_current_numeric_locale(loc)->thousands_sep;
+ break;
+ case YESEXPR:
+- ret = (char*) __get_current_messages_locale()->yesexpr;
++ ret = (char*) __get_current_messages_locale(loc)->yesexpr;
+ break;
+ case NOEXPR:
+- ret = (char*) __get_current_messages_locale()->noexpr;
++ ret = (char*) __get_current_messages_locale(loc)->noexpr;
+ break;
+ /*
+ * YESSTR and NOSTR items marked with LEGACY are available, but not
+@@ -131,25 +135,25 @@
+ * they're subject to remove in future specification editions.
+ */
+ case YESSTR: /* LEGACY */
+- ret = (char*) __get_current_messages_locale()->yesstr;
++ ret = (char*) __get_current_messages_locale(loc)->yesstr;
+ break;
+ case NOSTR: /* LEGACY */
+- ret = (char*) __get_current_messages_locale()->nostr;
++ ret = (char*) __get_current_messages_locale(loc)->nostr;
+ break;
+ /*
+ * SUSv2 special formatted currency string
+ */
+ case CRNCYSTR:
+ ret = "";
+- cs = (char*) __get_current_monetary_locale()->currency_symbol;
++ cs = (char*) __get_current_monetary_locale(loc)->currency_symbol;
+ if (*cs != '\0') {
+- char pos = localeconv()->p_cs_precedes;
++ char pos = localeconv_l(loc)->p_cs_precedes;
+
+- if (pos == localeconv()->n_cs_precedes) {
++ if (pos == localeconv_l(loc)->n_cs_precedes) {
+ char psn = '\0';
+
+ if (pos == CHAR_MAX) {
+- if (strcmp(cs, __get_current_monetary_locale()->mon_decimal_point) == 0)
++ if (strcmp(cs, __get_current_monetary_locale(loc)->mon_decimal_point) == 0)
+ psn = '.';
+ } else
+ psn = pos ? '-' : '+';
+@@ -166,10 +170,19 @@
+ }
+ break;
+ case D_MD_ORDER: /* FreeBSD local extension */
+- ret = (char *) __get_current_time_locale()->md_order;
++ ret = (char *) __get_current_time_locale(loc)->md_order;
+ break;
+ default:
+- ret = "";
++ return ""; /* do not consult POSIX */
++ }
++ if (ret && !ret[0] && item != D_MD_ORDER && item != CODESET && loc != _c_locale) {
++ ret = nl_langinfo_l(item, _c_locale);
+ }
+ return (ret);
+ }
++
++char *
++nl_langinfo(nl_item item)
++{
++ return (nl_langinfo_l(item, __current_locale()));
++}