Sun Mar 4 21:14:57 2012 UTC ()
don't use __link_set_* stuff for locale implementation.
patch reviewed by matt@, thanks.


(tnozaki)
diff -r1.9 -r1.10 src/lib/libc/citrus/citrus_lc_ctype.c
diff -r1.4 -r1.5 src/lib/libc/citrus/citrus_lc_messages.c
diff -r1.4 -r1.5 src/lib/libc/citrus/citrus_lc_monetary.c
diff -r1.4 -r1.5 src/lib/libc/citrus/citrus_lc_numeric.c
diff -r1.5 -r1.6 src/lib/libc/citrus/citrus_lc_time.c
diff -r1.2 -r1.3 src/lib/libc/locale/dummy_lc_collate.c
diff -r1.2 -r1.3 src/lib/libc/locale/dummy_lc_template.h
diff -r1.2 -r1.3 src/lib/libc/locale/generic_lc_template_decl.h
diff -r1.3 -r1.4 src/lib/libc/locale/generic_lc_all.c
diff -r1.3 -r1.4 src/lib/libc/locale/nb_lc_template.h
diff -r1.3 -r0 src/lib/libc/locale/generic_lc_template.h
diff -r1.59 -r1.60 src/lib/libc/locale/setlocale.c
diff -r1.7 -r1.8 src/lib/libc/locale/setlocale_local.h

cvs diff -r1.9 -r1.10 src/lib/libc/citrus/citrus_lc_ctype.c (expand / switch to context diff)
--- src/lib/libc/citrus/citrus_lc_ctype.c 2010/06/19 13:26:51 1.9
+++ src/lib/libc/citrus/citrus_lc_ctype.c 2012/03/04 21:14:55 1.10
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_ctype.c,v 1.9 2010/06/19 13:26:51 tnozaki Exp $ */
+/* $NetBSD: citrus_lc_ctype.c,v 1.10 2012/03/04 21:14:55 tnozaki 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.9 2010/06/19 13:26:51 tnozaki Exp $");
+__RCSID("$NetBSD: citrus_lc_ctype.c,v 1.10 2012/03/04 21:14:55 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "reentrant.h"
@@ -130,4 +130,3 @@
 #define _CATEGORY_DEFAULT	_DefaultRuneLocale
 
 #include "nb_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_citrus_LC_CTYPE_);

cvs diff -r1.4 -r1.5 src/lib/libc/citrus/citrus_lc_messages.c (expand / switch to context diff)
--- src/lib/libc/citrus/citrus_lc_messages.c 2010/06/13 04:14:57 1.4
+++ src/lib/libc/citrus/citrus_lc_messages.c 2012/03/04 21:14:55 1.5
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_messages.c,v 1.4 2010/06/13 04:14:57 tnozaki Exp $ */
+/* $NetBSD: citrus_lc_messages.c,v 1.5 2012/03/04 21:14:55 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_lc_messages.c,v 1.4 2010/06/13 04:14:57 tnozaki Exp $");
+__RCSID("$NetBSD: citrus_lc_messages.c,v 1.5 2012/03/04 21:14:55 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "namespace.h"
@@ -160,4 +160,3 @@
 #define _CATEGORY_MAGIC		_CITRUS_LC_MESSAGES_MAGIC_1
 
 #include "citrus_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_citrus_LC_MESSAGES_);

cvs diff -r1.4 -r1.5 src/lib/libc/citrus/citrus_lc_monetary.c (expand / switch to context diff)
--- src/lib/libc/citrus/citrus_lc_monetary.c 2010/06/13 04:14:57 1.4
+++ src/lib/libc/citrus/citrus_lc_monetary.c 2012/03/04 21:14:55 1.5
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_monetary.c,v 1.4 2010/06/13 04:14:57 tnozaki Exp $ */
+/* $NetBSD: citrus_lc_monetary.c,v 1.5 2012/03/04 21:14:55 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_lc_monetary.c,v 1.4 2010/06/13 04:14:57 tnozaki Exp $");
+__RCSID("$NetBSD: citrus_lc_monetary.c,v 1.5 2012/03/04 21:14:55 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "namespace.h"
@@ -217,4 +217,3 @@
 #define _CATEGORY_MAGIC		_CITRUS_LC_MONETARY_MAGIC_1
 
 #include "citrus_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_citrus_LC_MONETARY_);

cvs diff -r1.4 -r1.5 src/lib/libc/citrus/citrus_lc_numeric.c (expand / switch to context diff)
--- src/lib/libc/citrus/citrus_lc_numeric.c 2010/06/13 04:14:57 1.4
+++ src/lib/libc/citrus/citrus_lc_numeric.c 2012/03/04 21:14:55 1.5
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_numeric.c,v 1.4 2010/06/13 04:14:57 tnozaki Exp $ */
+/* $NetBSD: citrus_lc_numeric.c,v 1.5 2012/03/04 21:14:55 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_lc_numeric.c,v 1.4 2010/06/13 04:14:57 tnozaki Exp $");
+__RCSID("$NetBSD: citrus_lc_numeric.c,v 1.5 2012/03/04 21:14:55 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "namespace.h"
@@ -166,4 +166,3 @@
 #define _CATEGORY_MAGIC		_CITRUS_LC_NUMERIC_MAGIC_1
 
 #include "citrus_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_citrus_LC_NUMERIC_);

cvs diff -r1.5 -r1.6 src/lib/libc/citrus/citrus_lc_time.c (expand / switch to context diff)
--- src/lib/libc/citrus/citrus_lc_time.c 2010/06/13 04:14:57 1.5
+++ src/lib/libc/citrus/citrus_lc_time.c 2012/03/04 21:14:55 1.6
@@ -1,4 +1,4 @@
-/* $NetBSD: citrus_lc_time.c,v 1.5 2010/06/13 04:14:57 tnozaki Exp $ */
+/* $NetBSD: citrus_lc_time.c,v 1.6 2012/03/04 21:14:55 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: citrus_lc_time.c,v 1.5 2010/06/13 04:14:57 tnozaki Exp $");
+__RCSID("$NetBSD: citrus_lc_time.c,v 1.6 2012/03/04 21:14:55 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "namespace.h"
@@ -211,4 +211,3 @@
 #define _CATEGORY_MAGIC		_CITRUS_LC_TIME_MAGIC_1
 
 #include "citrus_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_citrus_LC_TIME_);

cvs diff -r1.2 -r1.3 src/lib/libc/locale/dummy_lc_collate.c (expand / switch to context diff)
--- src/lib/libc/locale/dummy_lc_collate.c 2009/01/11 02:46:28 1.2
+++ src/lib/libc/locale/dummy_lc_collate.c 2012/03/04 21:14:56 1.3
@@ -1,4 +1,4 @@
-/* $NetBSD: dummy_lc_collate.c,v 1.2 2009/01/11 02:46:28 christos Exp $ */
+/* $NetBSD: dummy_lc_collate.c,v 1.3 2012/03/04 21:14:56 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: dummy_lc_collate.c,v 1.2 2009/01/11 02:46:28 christos Exp $");
+__RCSID("$NetBSD: dummy_lc_collate.c,v 1.3 2012/03/04 21:14:56 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -51,4 +51,3 @@
 #define _CATEGORY_NAME		"LC_COLLATE"
 
 #include "dummy_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_dummy_LC_COLLATE_);

cvs diff -r1.2 -r1.3 src/lib/libc/locale/dummy_lc_template.h (expand / switch to context diff)
--- src/lib/libc/locale/dummy_lc_template.h 2009/01/11 02:46:28 1.2
+++ src/lib/libc/locale/dummy_lc_template.h 2012/03/04 21:14:56 1.3
@@ -1,4 +1,4 @@
-/* $NetBSD: dummy_lc_template.h,v 1.2 2009/01/11 02:46:28 christos Exp $ */
+/* $NetBSD: dummy_lc_template.h,v 1.3 2012/03/04 21:14:56 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -31,7 +31,7 @@
 
 #include "generic_lc_template_decl.h"
 
-static const char *
+const char *
 _PREFIX(setlocale)(const char * __restrict name,
     struct _locale_impl_t * __restrict locale)
 {
@@ -50,7 +50,5 @@
 	}
 	return locale->part_name[(size_t)_CATEGORY_ID];
 }
-
-#include "generic_lc_template.h"
 
 #endif /*_DUMMY_LC_TEMPLATE_H_*/

cvs diff -r1.2 -r1.3 src/lib/libc/locale/generic_lc_template_decl.h (expand / switch to context diff)
--- src/lib/libc/locale/generic_lc_template_decl.h 2009/01/11 02:46:28 1.2
+++ src/lib/libc/locale/generic_lc_template_decl.h 2012/03/04 21:14:56 1.3
@@ -1,4 +1,4 @@
-/* $NetBSD: generic_lc_template_decl.h,v 1.2 2009/01/11 02:46:28 christos Exp $ */
+/* $NetBSD: generic_lc_template_decl.h,v 1.3 2012/03/04 21:14:56 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -29,7 +29,7 @@
 #ifndef _GENERIC_LC_TEMPLATE_DECL_H_
 #define _GENERIC_LC_TEMPLATE_DECL_H_
 
-static const char * _PREFIX(setlocale)(const char * __restrict,
+const char * _PREFIX(setlocale)(const char * __restrict,
     struct _locale_impl_t * __restrict);
 
 #endif /*_GENERIC_LC_TEMPLATE_DECL_H_*/

cvs diff -r1.3 -r1.4 src/lib/libc/locale/generic_lc_all.c (expand / switch to context diff)
--- src/lib/libc/locale/generic_lc_all.c 2009/10/04 21:05:18 1.3
+++ src/lib/libc/locale/generic_lc_all.c 2012/03/04 21:14:56 1.4
@@ -1,4 +1,4 @@
-/* $NetBSD: generic_lc_all.c,v 1.3 2009/10/04 21:05:18 tnozaki Exp $ */
+/* $NetBSD: generic_lc_all.c,v 1.4 2012/03/04 21:14:56 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: generic_lc_all.c,v 1.3 2009/10/04 21:05:18 tnozaki Exp $");
+__RCSID("$NetBSD: generic_lc_all.c,v 1.4 2012/03/04 21:14:56 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -53,13 +53,13 @@
 _generic_LC_ALL_setlocale(const char * __restrict name,
     struct _locale_impl_t * __restrict locale)
 {
-	_locale_category_t *l;
+	_locale_set_t sl;
 	char head[_LOCALENAME_LEN_MAX * (_LC_LAST - 1)], *tail;
 	const char *tokens[_LC_LAST], *s, *t;
 	int load_locale_success, i, j;
 
-	l = _find_category(1);
-	_DIAGASSERT(l != NULL);
+	sl = _find_category(1);
+	_DIAGASSERT(sl != NULL);
 	load_locale_success = 0;
 	if (name != NULL) {
 		strlcpy(&head[0], name, sizeof(head));
@@ -82,20 +82,20 @@
 			if (tail != NULL)
 				return NULL;
 		}
-		if ((*l->setlocale)(tokens[1], locale) != NULL)
+		if ((*sl)(tokens[1], locale) != NULL)
 			load_locale_success = 1;
 	}
-	s = (*l->setlocale)(NULL, locale);
+	s = (*sl)(NULL, locale);
 	_DIAGASSERT(s != NULL);
 	strlcpy(&locale->query[0], s, sizeof(locale->query));
 	for (i = 2, j = 0; i < _LC_LAST; ++i) {
-		l = _find_category(i);
-		_DIAGASSERT(l != NULL);
+		sl = _find_category(i);
+		_DIAGASSERT(sl != NULL);
 		if (name != NULL) {
-			if ((*l->setlocale)(tokens[i], locale) != NULL)
+			if ((*sl)(tokens[i], locale) != NULL)
 				load_locale_success = 1;
 		}
-		t = (*l->setlocale)(NULL, locale);
+		t = (*sl)(NULL, locale);
 		_DIAGASSERT(t != NULL);
 		if (j == 0) {
 			if (!strcmp(s, t))
@@ -115,10 +115,3 @@
 	return (const char *)&locale->query[0];
 }
 
-/*
- * macro requrired by generic_lc_template.h
- */
-#define _CATEGORY_ID	LC_ALL
-
-#include "generic_lc_template.h"
-_LOCALE_CATEGORY_ENTRY(_generic_LC_ALL_);

cvs diff -r1.3 -r1.4 src/lib/libc/locale/nb_lc_template.h (expand / switch to context diff)
--- src/lib/libc/locale/nb_lc_template.h 2010/05/22 13:15:59 1.3
+++ src/lib/libc/locale/nb_lc_template.h 2012/03/04 21:14:56 1.4
@@ -1,4 +1,4 @@
-/* $NetBSD: nb_lc_template.h,v 1.3 2010/05/22 13:15:59 tnozaki Exp $ */
+/* $NetBSD: nb_lc_template.h,v 1.4 2012/03/04 21:14:56 tnozaki Exp $ */
 
 /*-
  * Copyright (c)1999, 2008 Citrus Project,
@@ -214,7 +214,7 @@
 	return ret;
 }
 
-static const char *
+const char *
 _PREFIX(setlocale)(const char * __restrict name,
     struct _locale_impl_t * __restrict locale)
 {
@@ -242,7 +242,5 @@
 	}
 	return locale->part_name[(size_t)_CATEGORY_ID];
 }
-
-#include "generic_lc_template.h"
 
 #endif /*_NB_LC_TEMPLATE_H_*/

File Deleted: src/lib/libc/locale/Attic/generic_lc_template.h

cvs diff -r1.59 -r1.60 src/lib/libc/locale/setlocale.c (expand / switch to context diff)
--- src/lib/libc/locale/setlocale.c 2012/01/20 16:31:30 1.59
+++ src/lib/libc/locale/setlocale.c 2012/03/04 21:14:56 1.60
@@ -1,4 +1,4 @@
-/* $NetBSD: setlocale.c,v 1.59 2012/01/20 16:31:30 joerg Exp $ */
+/* $NetBSD: setlocale.c,v 1.60 2012/03/04 21:14:56 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: setlocale.c,v 1.59 2012/01/20 16:31:30 joerg Exp $");
+__RCSID("$NetBSD: setlocale.c,v 1.60 2012/03/04 21:14:56 tnozaki Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
@@ -43,33 +43,21 @@
 
 const char *_PathLocale = NULL;
 
-__link_set_decl(all_categories, _locale_category_t);
+static _locale_set_t all_categories[_LC_LAST] = {
+	[LC_ALL     ] = &_generic_LC_ALL_setlocale,
+	[LC_COLLATE ] = &_dummy_LC_COLLATE_setlocale,
+	[LC_CTYPE   ] = &_citrus_LC_CTYPE_setlocale,
+	[LC_MONETARY] = &_citrus_LC_MONETARY_setlocale,
+	[LC_NUMERIC ] = &_citrus_LC_NUMERIC_setlocale,
+	[LC_TIME    ] = &_citrus_LC_TIME_setlocale,
+	[LC_MESSAGES] = &_citrus_LC_MESSAGES_setlocale,
+};
 
-extern const _locale_category_t _generic_LC_ALL_desc;
-extern const _locale_category_t _dummy_LC_COLLATE_desc;
-extern const _locale_category_t _citrus_LC_CTYPE_desc;
-extern const _locale_category_t _citrus_LC_MONETARY_desc;
-extern const _locale_category_t _citrus_LC_NUMERIC_desc;
-extern const _locale_category_t _citrus_LC_TIME_desc;
-extern const _locale_category_t _citrus_LC_MESSAGES_desc;
-
-__link_set_add_data(all_categories, _generic_LC_ALL_desc);
-__link_set_add_data(all_categories, _dummy_LC_COLLATE_desc);
-__link_set_add_data(all_categories, _citrus_LC_CTYPE_desc);
-__link_set_add_data(all_categories, _citrus_LC_MONETARY_desc);
-__link_set_add_data(all_categories, _citrus_LC_NUMERIC_desc);
-__link_set_add_data(all_categories, _citrus_LC_TIME_desc);
-__link_set_add_data(all_categories, _citrus_LC_MESSAGES_desc);
-
-_locale_category_t *
+_locale_set_t
 _find_category(int category)
 {
-	_locale_category_t * const *p;
-
-	__link_set_foreach(p, all_categories) {
-		if ((*p)->category == category)
-			return *p;
-	}
+	if (category >= LC_ALL && category < _LC_LAST)
+		return all_categories[category];
 	return NULL;
 }
 
@@ -97,21 +85,18 @@
 char *
 __setlocale(int category, const char *name)
 {
-	_locale_category_t *l;
+	_locale_set_t sl;
 	struct _locale_impl_t *impl;
 
-	if (category >= LC_ALL && category < _LC_LAST) {
-		l = _find_category(category);
-		if (l != NULL) {
-			if (issetugid() || ((_PathLocale == NULL &&
-			    (_PathLocale = getenv("PATH_LOCALE")) == NULL) ||
-			    *_PathLocale == '\0'))
-				_PathLocale = _PATH_LOCALE;
-			impl = *_current_locale();
-			return __UNCONST((*l->setlocale)(name, impl));
-		}
-	}
-	return NULL;
+	sl = _find_category(category);
+	if (sl == NULL)
+		return NULL;
+	if (issetugid() || ((_PathLocale == NULL &&
+	    (_PathLocale = getenv("PATH_LOCALE")) == NULL) ||
+	    *_PathLocale == '\0'))
+		_PathLocale = _PATH_LOCALE;
+	impl = *_current_locale();
+	return __UNCONST((*sl)(name, impl));
 }
 
 char *

cvs diff -r1.7 -r1.8 src/lib/libc/locale/setlocale_local.h (expand / switch to context diff)
--- src/lib/libc/locale/setlocale_local.h 2010/06/07 13:52:30 1.7
+++ src/lib/libc/locale/setlocale_local.h 2012/03/04 21:14:57 1.8
@@ -1,4 +1,4 @@
-/* $NetBSD: setlocale_local.h,v 1.7 2010/06/07 13:52:30 tnozaki Exp $ */
+/* $NetBSD: setlocale_local.h,v 1.8 2012/03/04 21:14:57 tnozaki Exp $ */
 
 /*-
  * Copyright (c)2008 Citrus Project,
@@ -58,17 +58,26 @@
 typedef const char *(*_locale_set_t)(const char * __restrict,
     struct _locale_impl_t * __restrict);
 
-typedef struct {
-	const char* name;
-	int category;
-	_locale_set_t setlocale;
-} _locale_category_t;
-
 __BEGIN_DECLS
-_locale_category_t	*_find_category(int);
+_locale_set_t		_find_category(int);
 const char		*_get_locale_env(const char *);
 struct _locale_impl_t	**_current_locale(void);
 char			*__setlocale(int, const char *);
+
+const char *_generic_LC_ALL_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
+const char *_dummy_LC_COLLATE_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
+const char *_citrus_LC_CTYPE_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
+const char *_citrus_LC_MONETARY_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
+const char *_citrus_LC_NUMERIC_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
+const char *_citrus_LC_TIME_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
+const char *_citrus_LC_MESSAGES_setlocale(
+    const char * __restrict, struct _locale_impl_t * __restrict);
 __END_DECLS
 
 static __inline struct _locale_cache_t *