diff options
author | ache <ache@FreeBSD.org> | 2002-08-04 04:29:54 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2002-08-04 04:29:54 +0000 |
commit | c41f494e5b3e27a5991c0311ac9db9163ce9967a (patch) | |
tree | 6c3488e71a67885b7aba5234ebf6ea547a4c4031 | |
parent | 9c3f31fb8e7776a343be503445696717f80b7b76 (diff) | |
download | FreeBSD-src-c41f494e5b3e27a5991c0311ac9db9163ce9967a.zip FreeBSD-src-c41f494e5b3e27a5991c0311ac9db9163ce9967a.tar.gz |
Rewrite loadlocale() to eliminate LOAD_CATEGORY macro to save space.
-rw-r--r-- | lib/libc/locale/setlocale.c | 55 |
1 files changed, 27 insertions, 28 deletions
diff --git a/lib/libc/locale/setlocale.c b/lib/libc/locale/setlocale.c index 331ce60..184326c 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); } |