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
--- 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_);
--- 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_);
--- 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_);
--- 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_);
--- 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_);
--- 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_);
--- 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_*/
--- 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_*/
--- 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_);
--- 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_*/
--- 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 *
--- 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 *