Module Name:    src
Committed By:   joerg
Date:           Tue Aug 20 19:58:30 UTC 2013

Modified Files:
        src/lib/libc/citrus: citrus_lc_ctype.c
        src/lib/libc/locale: global_locale.c nb_lc_messages_misc.h
            nb_lc_monetary_misc.h nb_lc_numeric_misc.h nb_lc_time_misc.h
            nl_langinfo.c setlocale_local.h

Log Message:
Extract the data for nl_langinfo directly from the corresponding
part implementation using a category/offset table.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/lib/libc/citrus/citrus_lc_ctype.c
cvs rdiff -u -r1.19 -r1.20 src/lib/libc/locale/global_locale.c
cvs rdiff -u -r1.5 -r1.6 src/lib/libc/locale/nb_lc_messages_misc.h \
    src/lib/libc/locale/nb_lc_monetary_misc.h \
    src/lib/libc/locale/nb_lc_numeric_misc.h
cvs rdiff -u -r1.6 -r1.7 src/lib/libc/locale/nb_lc_time_misc.h
cvs rdiff -u -r1.16 -r1.17 src/lib/libc/locale/nl_langinfo.c
cvs rdiff -u -r1.13 -r1.14 src/lib/libc/locale/setlocale_local.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/citrus/citrus_lc_ctype.c
diff -u src/lib/libc/citrus/citrus_lc_ctype.c:1.13 src/lib/libc/citrus/citrus_lc_ctype.c:1.14
--- src/lib/libc/citrus/citrus_lc_ctype.c:1.13	Mon Aug 19 22:43:28 2013
+++ src/lib/libc/citrus/citrus_lc_ctype.c	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_ctype.c,v 1.13 2013/08/19 22:43:28 joerg Exp $ */
+/* $NetBSD: citrus_lc_ctype.c,v 1.14 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_lc_ctype.c,v 1.13 2013/08/19 22:43:28 joerg Exp $");
+__RCSID("$NetBSD: citrus_lc_ctype.c,v 1.14 2013/08/20 19:58:30 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "reentrant.h"
@@ -100,10 +100,7 @@ _PREFIX(build_cache)(struct _locale_cach
     _RuneLocale * __restrict data)
 {
 	_DIAGASSERT(cache != NULL);
-	_DIAGASSERT(cache->items != NULL);
 	_DIAGASSERT(data != NULL);
-
-	cache->items[(size_t)CODESET] = data->rl_codeset;
 }
 
 static __inline void

Index: src/lib/libc/locale/global_locale.c
diff -u src/lib/libc/locale/global_locale.c:1.19 src/lib/libc/locale/global_locale.c:1.20
--- src/lib/libc/locale/global_locale.c:1.19	Mon Aug 19 22:43:28 2013
+++ src/lib/libc/locale/global_locale.c	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: global_locale.c,v 1.19 2013/08/19 22:43:28 joerg Exp $ */
+/* $NetBSD: global_locale.c,v 1.20 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: global_locale.c,v 1.19 2013/08/19 22:43:28 joerg Exp $");
+__RCSID("$NetBSD: global_locale.c,v 1.20 2013/08/20 19:58:30 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -137,69 +137,8 @@ static const struct lconv _C_ldata = {
 	.int_n_sign_posn	= NBCHAR_MAX,
 };
 
-static const char * const _C_items [(size_t)ALT_DIGITS + 1] = {
-	[(size_t)D_T_FMT    ] = "%a %b %e %H:%M:%S %Y",
-	[(size_t)D_FMT      ] = "%m/%d/%y",
-	[(size_t)T_FMT      ] = "%H:%M:%S",
-	[(size_t)T_FMT_AMPM ] = "%I:%M:%S %p",
-	[(size_t)AM_STR     ] = "AM",
-	[(size_t)PM_STR     ] = "PM",
-	[(size_t)DAY_1      ] = "Sun",
-	[(size_t)DAY_2      ] = "Mon",
-	[(size_t)DAY_3      ] = "Tue",
-	[(size_t)DAY_4      ] = "Wed",
-	[(size_t)DAY_5      ] = "Thu",
-	[(size_t)DAY_6      ] = "Fri",
-	[(size_t)DAY_7      ] = "Sat",
-	[(size_t)ABDAY_1    ] = "Sunday",
-	[(size_t)ABDAY_2    ] = "Monday",
-	[(size_t)ABDAY_3    ] = "Tuesday",
-	[(size_t)ABDAY_4    ] = "Wednesday",
-	[(size_t)ABDAY_5    ] = "Thursday",
-	[(size_t)ABDAY_6    ] = "Friday",
-	[(size_t)ABDAY_7    ] = "Saturday",
-	[(size_t)MON_1      ] = "Jan",
-	[(size_t)MON_2      ] = "Feb",
-	[(size_t)MON_3      ] = "Mar",
-	[(size_t)MON_4      ] = "Apr",
-	[(size_t)MON_5      ] = "May",
-	[(size_t)MON_6      ] = "Jun",
-	[(size_t)MON_7      ] = "Jul",
-	[(size_t)MON_8      ] = "Aug",
-	[(size_t)MON_9      ] = "Sep",
-	[(size_t)MON_10     ] = "Oct",
-	[(size_t)MON_11     ] = "Nov",
-	[(size_t)MON_12     ] = "Dec",
-	[(size_t)ABMON_1    ] = "January",
-	[(size_t)ABMON_2    ] = "February",
-	[(size_t)ABMON_3    ] = "March",
-	[(size_t)ABMON_4    ] = "April",
-	[(size_t)ABMON_5    ] = "May",
-	[(size_t)ABMON_6    ] = "June",
-	[(size_t)ABMON_7    ] = "July",
-	[(size_t)ABMON_8    ] = "August",
-	[(size_t)ABMON_9    ] = "September",
-	[(size_t)ABMON_10   ] = "October",
-	[(size_t)ABMON_11   ] = "November",
-	[(size_t)ABMON_12   ] = "December",
-	[(size_t)RADIXCHAR  ] = ".",
-	[(size_t)THOUSEP    ] = "",
-	[(size_t)YESSTR     ] = "yes",
-	[(size_t)YESEXPR    ] = "^[Yy]",
-	[(size_t)NOSTR      ] = "no",
-	[(size_t)NOEXPR     ] = "^[Nn]",
-	[(size_t)CRNCYSTR   ] = NULL,
-	[(size_t)CODESET    ] = "646",
-	[(size_t)ERA        ] = NULL,
-	[(size_t)ERA_D_FMT  ] = NULL,
-	[(size_t)ERA_D_T_FMT] = NULL,
-	[(size_t)ERA_T_FMT  ] = NULL,
-	[(size_t)ALT_DIGITS ] = NULL,
-};
-
 static struct _locale_cache_t _global_cache = {
     .ldata = __UNCONST(&_C_ldata),
-    .items = __UNCONST(&_C_items[0]),
 };
 
 __dso_protected struct _locale _lc_global_locale = {
@@ -232,7 +171,6 @@ __dso_protected struct _locale _lc_globa
 
 static const struct _locale_cache_t _C_cache = {
     .ldata = __UNCONST(&_C_ldata),
-    .items = __UNCONST(&_C_items[0]),
 };
 
 __dso_protected const struct _locale _lc_C_locale = {

Index: src/lib/libc/locale/nb_lc_messages_misc.h
diff -u src/lib/libc/locale/nb_lc_messages_misc.h:1.5 src/lib/libc/locale/nb_lc_messages_misc.h:1.6
--- src/lib/libc/locale/nb_lc_messages_misc.h:1.5	Mon Aug 19 09:12:58 2013
+++ src/lib/libc/locale/nb_lc_messages_misc.h	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_messages_misc.h,v 1.5 2013/08/19 09:12:58 joerg Exp $ */
+/* $NetBSD: nb_lc_messages_misc.h,v 1.6 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -39,13 +39,7 @@ _PREFIX(build_cache)(struct _locale_cach
     _MessagesLocale * __restrict data)
 {
 	_DIAGASSERT(cache != NULL);
-	_DIAGASSERT(cache->items != NULL);
 	_DIAGASSERT(data != NULL);
-
-	cache->items[(size_t)YESSTR ] = data->yesstr;
-	cache->items[(size_t)YESEXPR] = data->yesexpr;
-	cache->items[(size_t)NOSTR  ] = data->nostr;
-	cache->items[(size_t)NOEXPR ] = data->noexpr;
 }
 
 /* ARGSUSED */
Index: src/lib/libc/locale/nb_lc_monetary_misc.h
diff -u src/lib/libc/locale/nb_lc_monetary_misc.h:1.5 src/lib/libc/locale/nb_lc_monetary_misc.h:1.6
--- src/lib/libc/locale/nb_lc_monetary_misc.h:1.5	Mon Aug 19 09:12:58 2013
+++ src/lib/libc/locale/nb_lc_monetary_misc.h	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_monetary_misc.h,v 1.5 2013/08/19 09:12:58 joerg Exp $ */
+/* $NetBSD: nb_lc_monetary_misc.h,v 1.6 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -42,7 +42,6 @@ _PREFIX(build_cache)(struct _locale_cach
 
 	_DIAGASSERT(cache != NULL);
 	_DIAGASSERT(cache->ldata != NULL);
-	_DIAGASSERT(cache->items != NULL);
 	_DIAGASSERT(data != NULL);
 
 	ldata = cache->ldata;
@@ -68,8 +67,6 @@ _PREFIX(build_cache)(struct _locale_cach
 	ldata->int_n_sep_by_space = data->int_n_sep_by_space;
 	ldata->int_p_sign_posn    = data->int_p_sign_posn;
 	ldata->int_n_sign_posn    = data->int_n_sign_posn;
-
-	cache->items[(size_t)CRNCYSTR] = NULL; /* NOT IMPLEMENTED YET */
 }
 
 /* ARGSUSED */
Index: src/lib/libc/locale/nb_lc_numeric_misc.h
diff -u src/lib/libc/locale/nb_lc_numeric_misc.h:1.5 src/lib/libc/locale/nb_lc_numeric_misc.h:1.6
--- src/lib/libc/locale/nb_lc_numeric_misc.h:1.5	Mon Aug 19 09:12:58 2013
+++ src/lib/libc/locale/nb_lc_numeric_misc.h	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_numeric_misc.h,v 1.5 2013/08/19 09:12:58 joerg Exp $ */
+/* $NetBSD: nb_lc_numeric_misc.h,v 1.6 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -42,16 +42,12 @@ _PREFIX(build_cache)(struct _locale_cach
 
 	_DIAGASSERT(cache != NULL);
 	_DIAGASSERT(cache->ldata != NULL);
-	_DIAGASSERT(cache->items != NULL);
 	_DIAGASSERT(data != NULL);
 
 	ldata = cache->ldata;
 	ldata->decimal_point = __UNCONST(data->decimal_point);
 	ldata->thousands_sep = __UNCONST(data->thousands_sep);
 	ldata->grouping      = __UNCONST(data->grouping);
-
-	cache->items[(size_t)RADIXCHAR] = data->decimal_point;
-	cache->items[(size_t)THOUSEP  ] = data->thousands_sep;
 }
 
 /* ARGSUSED */

Index: src/lib/libc/locale/nb_lc_time_misc.h
diff -u src/lib/libc/locale/nb_lc_time_misc.h:1.6 src/lib/libc/locale/nb_lc_time_misc.h:1.7
--- src/lib/libc/locale/nb_lc_time_misc.h:1.6	Mon Aug 19 09:12:58 2013
+++ src/lib/libc/locale/nb_lc_time_misc.h	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_time_misc.h,v 1.6 2013/08/19 09:12:58 joerg Exp $ */
+/* $NetBSD: nb_lc_time_misc.h,v 1.7 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -45,33 +45,8 @@ static __inline void
 _PREFIX(build_cache)(struct _locale_cache_t * __restrict cache,
     _TimeLocale * __restrict data)
 {
-	size_t i;
-
 	_DIAGASSERT(cache != NULL);
-	_DIAGASSERT(cache->items != NULL);
 	_DIAGASSERT(data != NULL);
-
-        for (i = (size_t)ABDAY_1; i <= ABDAY_7;  ++i)
-		cache->items[i] = data->abday[ABDAY_IDX(i)];
-        for (i = (size_t)DAY_1;   i <= DAY_7;    ++i)
-		cache->items[i] = data->day[DAY_IDX(i)];
-        for (i = (size_t)ABMON_1; i <= ABMON_12; ++i)
-		cache->items[i] = data->abmon[ABMON_IDX(i)];
-        for (i = (size_t)MON_1;   i <= MON_12;   ++i)
-		cache->items[i] = data->mon[MON_IDX(i)];
-        for (i = (size_t)AM_STR;  i <= PM_STR;   ++i)
-		cache->items[i] = data->am_pm[AM_PM_IDX(i)];
-	cache->items[(size_t)D_T_FMT    ] = data->d_t_fmt;
-	cache->items[(size_t)D_FMT      ] = data->d_fmt;
-	cache->items[(size_t)T_FMT      ] = data->t_fmt;
-	cache->items[(size_t)T_FMT_AMPM ] = data->t_fmt_ampm;
-
-	/* NOT IMPLEMENTED YET */
-	cache->items[(size_t)ERA        ] = NULL;
-	cache->items[(size_t)ERA_D_FMT  ] = NULL;
-	cache->items[(size_t)ERA_D_T_FMT] = NULL;
-	cache->items[(size_t)ERA_T_FMT  ] = NULL;
-	cache->items[(size_t)ALT_DIGITS ] = NULL;
 }
 
 /* ARGSUSED */

Index: src/lib/libc/locale/nl_langinfo.c
diff -u src/lib/libc/locale/nl_langinfo.c:1.16 src/lib/libc/locale/nl_langinfo.c:1.17
--- src/lib/libc/locale/nl_langinfo.c:1.16	Mon Aug 19 08:03:34 2013
+++ src/lib/libc/locale/nl_langinfo.c	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: nl_langinfo.c,v 1.16 2013/08/19 08:03:34 joerg Exp $ */
+/* $NetBSD: nl_langinfo.c,v 1.17 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -27,17 +27,141 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: nl_langinfo.c,v 1.16 2013/08/19 08:03:34 joerg Exp $");
+__RCSID("$NetBSD: nl_langinfo.c,v 1.17 2013/08/20 19:58:30 joerg Exp $");
 
 #include "namespace.h"
 #include <sys/types.h>
+#include <sys/localedef.h>
 #include <langinfo.h>
+#include <stddef.h>
 #define __SETLOCALE_SOURCE__
 #include <locale.h>
 #include <stdlib.h>
+#include <string.h>
 
+#include "runetype_local.h"
 #include "setlocale_local.h"
 
+static const char langinfo_category[] = {
+    [ D_T_FMT ] = LC_TIME,
+    [ D_FMT ] = LC_TIME,
+    [ T_FMT ] = LC_TIME,
+    [ T_FMT_AMPM ] = LC_TIME,
+    [ AM_STR ] = LC_TIME,
+    [ PM_STR ] = LC_TIME,
+    [ DAY_1 ] = LC_TIME,
+    [ DAY_2 ] = LC_TIME,
+    [ DAY_3 ] = LC_TIME,
+    [ DAY_4 ] = LC_TIME,
+    [ DAY_5 ] = LC_TIME,
+    [ DAY_6 ] = LC_TIME,
+    [ DAY_7 ] = LC_TIME,
+    [ ABDAY_1 ] = LC_TIME,
+    [ ABDAY_2 ] = LC_TIME,
+    [ ABDAY_3 ] = LC_TIME,
+    [ ABDAY_4 ] = LC_TIME,
+    [ ABDAY_5 ] = LC_TIME,
+    [ ABDAY_6 ] = LC_TIME,
+    [ ABDAY_7 ] = LC_TIME,
+    [ MON_1 ] = LC_TIME,
+    [ MON_2 ] = LC_TIME,
+    [ MON_3 ] = LC_TIME,
+    [ MON_4 ] = LC_TIME,
+    [ MON_5 ] = LC_TIME,
+    [ MON_6 ] = LC_TIME,
+    [ MON_7 ] = LC_TIME,
+    [ MON_8 ] = LC_TIME,
+    [ MON_9 ] = LC_TIME,
+    [ MON_10 ] = LC_TIME,
+    [ MON_11 ] = LC_TIME,
+    [ MON_12 ] = LC_TIME,
+    [ ABMON_1 ] = LC_TIME,
+    [ ABMON_2 ] = LC_TIME,
+    [ ABMON_3 ] = LC_TIME,
+    [ ABMON_4 ] = LC_TIME,
+    [ ABMON_5 ] = LC_TIME,
+    [ ABMON_6 ] = LC_TIME,
+    [ ABMON_7 ] = LC_TIME,
+    [ ABMON_8 ] = LC_TIME,
+    [ ABMON_9 ] = LC_TIME,
+    [ ABMON_10 ] = LC_TIME,
+    [ ABMON_11 ] = LC_TIME,
+    [ ABMON_12 ] = LC_TIME,
+    [ RADIXCHAR ] = LC_NUMERIC,
+    [ THOUSEP ] = LC_NUMERIC,
+    [ YESSTR ] = LC_MESSAGES,
+    [ YESEXPR ] = LC_MESSAGES,
+    [ NOSTR ] = LC_MESSAGES,
+    [ NOEXPR ] = LC_MESSAGES,
+    [ CRNCYSTR ] = 0,
+    [ CODESET ] = LC_CTYPE,
+    [ ERA ] = 0,
+    [ ERA_D_FMT ] = 0,
+    [ ERA_D_T_FMT ] = 0,
+    [ ERA_T_FMT ] = 0,
+    [ ALT_DIGITS ] = 0,
+};
+
+static const uint16_t langinfo_offset[] = {
+    [ D_T_FMT ] = offsetof(_TimeLocale, d_t_fmt),
+    [ D_FMT ] = offsetof(_TimeLocale, d_fmt),
+    [ T_FMT ] = offsetof(_TimeLocale, t_fmt),
+    [ T_FMT_AMPM ] = offsetof(_TimeLocale, t_fmt_ampm),
+    [ AM_STR ] = offsetof(_TimeLocale, am_pm[0]),
+    [ PM_STR ] = offsetof(_TimeLocale, am_pm[1]),
+    [ DAY_1 ] = offsetof(_TimeLocale, day[0]),
+    [ DAY_2 ] = offsetof(_TimeLocale, day[1]),
+    [ DAY_3 ] = offsetof(_TimeLocale, day[2]),
+    [ DAY_4 ] = offsetof(_TimeLocale, day[3]),
+    [ DAY_5 ] = offsetof(_TimeLocale, day[4]),
+    [ DAY_6 ] = offsetof(_TimeLocale, day[5]),
+    [ DAY_7 ] = offsetof(_TimeLocale, day[6]),
+    [ ABDAY_1 ] = offsetof(_TimeLocale, abday[0]),
+    [ ABDAY_2 ] = offsetof(_TimeLocale, abday[1]),
+    [ ABDAY_3 ] = offsetof(_TimeLocale, abday[2]),
+    [ ABDAY_4 ] = offsetof(_TimeLocale, abday[3]),
+    [ ABDAY_5 ] = offsetof(_TimeLocale, abday[4]),
+    [ ABDAY_6 ] = offsetof(_TimeLocale, abday[5]),
+    [ ABDAY_7 ] = offsetof(_TimeLocale, abday[6]),
+    [ MON_1 ] = offsetof(_TimeLocale, mon[0]),
+    [ MON_2 ] = offsetof(_TimeLocale, mon[1]),
+    [ MON_3 ] = offsetof(_TimeLocale, mon[2]),
+    [ MON_4 ] = offsetof(_TimeLocale, mon[3]),
+    [ MON_5 ] = offsetof(_TimeLocale, mon[4]),
+    [ MON_6 ] = offsetof(_TimeLocale, mon[5]),
+    [ MON_7 ] = offsetof(_TimeLocale, mon[6]),
+    [ MON_8 ] = offsetof(_TimeLocale, mon[7]),
+    [ MON_9 ] = offsetof(_TimeLocale, mon[8]),
+    [ MON_10 ] = offsetof(_TimeLocale, mon[9]),
+    [ MON_11 ] = offsetof(_TimeLocale, mon[10]),
+    [ MON_12 ] = offsetof(_TimeLocale, mon[11]),
+    [ ABMON_1 ] = offsetof(_TimeLocale, abmon[0]),
+    [ ABMON_2 ] = offsetof(_TimeLocale, abmon[1]),
+    [ ABMON_3 ] = offsetof(_TimeLocale, abmon[2]),
+    [ ABMON_4 ] = offsetof(_TimeLocale, abmon[3]),
+    [ ABMON_5 ] = offsetof(_TimeLocale, abmon[4]),
+    [ ABMON_6 ] = offsetof(_TimeLocale, abmon[5]),
+    [ ABMON_7 ] = offsetof(_TimeLocale, abmon[6]),
+    [ ABMON_8 ] = offsetof(_TimeLocale, abmon[7]),
+    [ ABMON_9 ] = offsetof(_TimeLocale, abmon[8]),
+    [ ABMON_10 ] = offsetof(_TimeLocale, abmon[9]),
+    [ ABMON_11 ] = offsetof(_TimeLocale, abmon[10]),
+    [ ABMON_12 ] = offsetof(_TimeLocale, abmon[11]),
+    [ RADIXCHAR ] = offsetof(_NumericLocale, decimal_point),
+    [ THOUSEP ] = offsetof(_NumericLocale, thousands_sep),
+    [ YESSTR ] = offsetof(_MessagesLocale, yesstr),
+    [ YESEXPR ] = offsetof(_MessagesLocale, yesexpr),
+    [ NOSTR ] = offsetof(_MessagesLocale, nostr),
+    [ NOEXPR ] = offsetof(_MessagesLocale, noexpr),
+    [ CRNCYSTR ] = 0,
+    [ CODESET ] = offsetof(_RuneLocale, rl_codeset),
+    [ ERA ] = 0,
+    [ ERA_D_FMT ] = 0,
+    [ ERA_D_T_FMT ] = 0,
+    [ ERA_T_FMT ] = 0,
+    [ ALT_DIGITS ] = 0,
+};
+
 __weak_alias(nl_langinfo_l, _nl_langinfo_l)
 
 char *
@@ -50,12 +174,21 @@ nl_langinfo(nl_item item)
 char *
 nl_langinfo_l(nl_item item, locale_t loc)
 {
-	const char *s;
+	char *s;
+	int category;
+	size_t offset;
+
+	if (item < 0 || item >= (long)__arraycount(langinfo_category))
+		return __UNCONST(""); /* Outside the defined range */
+
+	category = langinfo_category[item];
+	if (category == 0)
+		return __UNCONST(""); /* Not in use */
+	offset = langinfo_offset[item];
 
-	s = NULL;
-	if (item >= D_T_FMT && item <= ALT_DIGITS)
-		s = loc->cache->items[(size_t)item];
+	memcpy(&s, (char *)loc->part_impl[category] + offset, sizeof(s));
 	if (s == NULL)
-		s = "";
-	return __UNCONST(s);
+		return __UNCONST("");
+	else
+		return s;
 }

Index: src/lib/libc/locale/setlocale_local.h
diff -u src/lib/libc/locale/setlocale_local.h:1.13 src/lib/libc/locale/setlocale_local.h:1.14
--- src/lib/libc/locale/setlocale_local.h:1.13	Mon Aug 19 22:43:28 2013
+++ src/lib/libc/locale/setlocale_local.h	Tue Aug 20 19:58:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: setlocale_local.h,v 1.13 2013/08/19 22:43:28 joerg Exp $ */
+/* $NetBSD: setlocale_local.h,v 1.14 2013/08/20 19:58:30 joerg Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -43,7 +43,6 @@ typedef void *_locale_part_t;
 
 struct _locale_cache_t {
 	struct lconv *ldata;
-	const char **items;
 };
 
 struct _locale {

Reply via email to