aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/locale/setlocale.c
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>2002-08-04 04:29:54 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>2002-08-04 04:29:54 +0000
commit10bc1114cecec4a11075928b3902878f8e6268b9 (patch)
tree6c3488e71a67885b7aba5234ebf6ea547a4c4031 /lib/libc/locale/setlocale.c
parent27ebcacbb0ead4b0cbd2db69b874c76714e9a6e1 (diff)
downloadsrc-10bc1114cecec4a11075928b3902878f8e6268b9.tar.gz
src-10bc1114cecec4a11075928b3902878f8e6268b9.zip
Rewrite loadlocale() to eliminate LOAD_CATEGORY macro to save space.
Notes
Notes: svn path=/head/; revision=101292
Diffstat (limited to 'lib/libc/locale/setlocale.c')
-rw-r--r--lib/libc/locale/setlocale.c55
1 files changed, 27 insertions, 28 deletions
diff --git a/lib/libc/locale/setlocale.c b/lib/libc/locale/setlocale.c
index 331ce60c7efd..184326c269bc 100644
--- a/lib/libc/locale/setlocale.c
+++ b/lib/libc/locale/setlocale.c
@@ -218,7 +218,6 @@ currentlocale()
return (current_locale_string);
}
-
static int
wrap_setrunelocale(locale)
char *locale;
@@ -239,6 +238,7 @@ loadlocale(category)
char *ret;
char *new = new_categories[category];
char *old = current_categories[category];
+ int (*func)();
int saverr;
if ((new[0] == '.' &&
@@ -268,43 +268,42 @@ loadlocale(category)
_PathLocale = _PATH_LOCALE;
}
-#define LOAD_CATEGORY(FUNC) \
- { \
- if (strcmp(new, old) == 0) \
- return (old); \
- ret = FUNC(new) != 0 ? NULL : new; \
- if (ret == NULL) { \
- saverr = errno; \
- if (FUNC(old) != 0 && FUNC("C") == 0) \
- (void)strcpy(old, "C"); \
- errno = saverr; \
- } else \
- (void)strcpy(old, new); \
- return (ret); \
- }
-
switch (category) {
case LC_CTYPE:
- LOAD_CATEGORY(wrap_setrunelocale);
- /* NOTREACHED */
+ func = wrap_setrunelocale;
+ break;
case LC_COLLATE:
- LOAD_CATEGORY(__collate_load_tables);
- /* NOTREACHED */
+ func = __collate_load_tables;
+ break;
case LC_TIME:
- LOAD_CATEGORY(__time_load_locale);
- /* NOTREACHED */
+ func = __time_load_locale;
+ break;
case LC_NUMERIC:
- LOAD_CATEGORY(__numeric_load_locale);
- /* NOTREACHED */
+ func = __numeric_load_locale;
+ break;
case LC_MONETARY:
- LOAD_CATEGORY(__monetary_load_locale);
- /* NOTREACHED */
+ func = __monetary_load_locale;
+ break;
case LC_MESSAGES:
- LOAD_CATEGORY(__messages_load_locale);
- /* NOTREACHED */
+ func = __messages_load_locale;
+ break;
default:
errno = EINVAL;
return (NULL);
}
+
+ if (strcmp(new, old) == 0)
+ return (old);
+
+ ret = func(new) != 0 ? NULL : new;
+ if (ret == NULL) {
+ saverr = errno;
+ if (func(old) != 0 && func("C") == 0)
+ (void)strcpy(old, "C");
+ errno = saverr;
+ } else
+ (void)strcpy(old, new);
+
+ return (ret);
}