setlocale.c (65603) | setlocale.c (72165) |
---|---|
1/* | 1/* |
2 * Copyright (c) 1996 - 2001 FreeBSD Project |
|
2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Paul Borman at Krystal Technologies. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions --- 18 unchanged lines hidden (view full) --- 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * | 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * Paul Borman at Krystal Technologies. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 18 unchanged lines hidden (view full) --- 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * |
36 * $FreeBSD: head/lib/libc/locale/setlocale.c 65603 2000-09-08 07:29:48Z kris $ | 37 * $FreeBSD: head/lib/libc/locale/setlocale.c 72165 2001-02-08 16:58:53Z phantom $ |
37 */ 38 39#ifdef LIBC_RCS 40static const char rcsid[] = | 38 */ 39 40#ifdef LIBC_RCS 41static const char rcsid[] = |
41 "$FreeBSD: head/lib/libc/locale/setlocale.c 65603 2000-09-08 07:29:48Z kris $"; | 42 "$FreeBSD: head/lib/libc/locale/setlocale.c 72165 2001-02-08 16:58:53Z phantom $"; |
42#endif 43 44#if defined(LIBC_SCCS) && !defined(lint) 45static char sccsid[] = "@(#)setlocale.c 8.1 (Berkeley) 7/4/93"; 46#endif /* LIBC_SCCS and not lint */ 47 48#include <sys/types.h> 49#include <sys/stat.h> 50#include <limits.h> 51#include <locale.h> 52#include <rune.h> 53#include <stdlib.h> 54#include <string.h> 55#include <unistd.h> 56#include "collate.h" | 43#endif 44 45#if defined(LIBC_SCCS) && !defined(lint) 46static char sccsid[] = "@(#)setlocale.c 8.1 (Berkeley) 7/4/93"; 47#endif /* LIBC_SCCS and not lint */ 48 49#include <sys/types.h> 50#include <sys/stat.h> 51#include <limits.h> 52#include <locale.h> 53#include <rune.h> 54#include <stdlib.h> 55#include <string.h> 56#include <unistd.h> 57#include "collate.h" |
58#include "lmonetary.h" /* for __monetary_load_locale() */ 59#include "lnumeric.h" /* for __numeric_load_locale() */ 60#include "lmessages.h" /* for __messages_load_locale() */ |
|
57#include "setlocale.h" 58 59/* 60 * Category names for getenv() 61 */ 62static char *categories[_LC_LAST] = { 63 "LC_ALL", 64 "LC_COLLATE", --- 22 unchanged lines hidden (view full) --- 87 */ 88static char new_categories[_LC_LAST][ENCODING_LEN + 1]; 89static char saved_categories[_LC_LAST][ENCODING_LEN + 1]; 90 91static char current_locale_string[_LC_LAST * (ENCODING_LEN + 1/*"/"*/ + 1)]; 92 93static char *currentlocale __P((void)); 94static char *loadlocale __P((int)); | 61#include "setlocale.h" 62 63/* 64 * Category names for getenv() 65 */ 66static char *categories[_LC_LAST] = { 67 "LC_ALL", 68 "LC_COLLATE", --- 22 unchanged lines hidden (view full) --- 91 */ 92static char new_categories[_LC_LAST][ENCODING_LEN + 1]; 93static char saved_categories[_LC_LAST][ENCODING_LEN + 1]; 94 95static char current_locale_string[_LC_LAST * (ENCODING_LEN + 1/*"/"*/ + 1)]; 96 97static char *currentlocale __P((void)); 98static char *loadlocale __P((int)); |
95static int stub_load_locale __P((const char *)); | |
96 97extern int __time_load_locale __P((const char *)); /* strftime.c */ 98 99char * 100setlocale(category, locale) 101 int category; 102 const char *locale; 103{ --- 138 unchanged lines hidden (view full) --- 242 ret = setrunelocale(new) ? NULL : new; 243 if (!ret) 244 (void)setrunelocale(old); 245 else 246 (void)strcpy(old, new); 247 return (ret); 248 } 249 | 99 100extern int __time_load_locale __P((const char *)); /* strftime.c */ 101 102char * 103setlocale(category, locale) 104 int category; 105 const char *locale; 106{ --- 138 unchanged lines hidden (view full) --- 245 ret = setrunelocale(new) ? NULL : new; 246 if (!ret) 247 (void)setrunelocale(old); 248 else 249 (void)strcpy(old, new); 250 return (ret); 251 } 252 |
250 if (category == LC_COLLATE) { 251 ret = (__collate_load_tables(new) < 0) ? NULL : new; 252 if (!ret) 253 (void)__collate_load_tables(old); 254 else 255 (void)strcpy(old, new); 256 return (ret); | 253#define LOAD_CATEGORY(CAT, FUNC) \ 254 if (category == CAT) { \ 255 ret = (FUNC(new) < 0) ? NULL : new; \ 256 if (!ret) \ 257 (void)FUNC(old); \ 258 else \ 259 (void)strcpy(old, new); \ 260 return (ret); \ |
257 } 258 | 261 } 262 |
259 if (category == LC_TIME) { 260 ret = (__time_load_locale(new) < 0) ? NULL : new; 261 if (!ret) 262 (void)__time_load_locale(old); 263 else 264 (void)strcpy(old, new); 265 return (ret); 266 } | 263 LOAD_CATEGORY(LC_COLLATE, __collate_load_tables); 264 LOAD_CATEGORY(LC_TIME, __time_load_locale); 265 LOAD_CATEGORY(LC_NUMERIC, __numeric_load_locale); 266 LOAD_CATEGORY(LC_MONETARY, __monetary_load_locale); 267 LOAD_CATEGORY(LC_MESSAGES, __messages_load_locale); |
267 | 268 |
268 if (category == LC_MONETARY || 269 category == LC_MESSAGES || 270 category == LC_NUMERIC) { 271 ret = stub_load_locale(new) ? NULL : new; 272 if (!ret) 273 (void)stub_load_locale(old); 274 else 275 (void)strcpy(old, new); 276 return (ret); 277 } 278 | |
279 /* Just in case...*/ 280 return (NULL); 281} 282 | 269 /* Just in case...*/ 270 return (NULL); 271} 272 |
283static int 284stub_load_locale(encoding) 285const char *encoding; 286{ 287 char name[PATH_MAX]; 288 struct stat st; 289 290 if (!encoding) 291 return(1); 292 /* 293 * The "C" and "POSIX" locale are always here. 294 */ 295 if (!strcmp(encoding, "C") || !strcmp(encoding, "POSIX")) 296 return(0); 297 if (!_PathLocale) 298 return(1); 299 /* Range checking not needed, encoding has fixed size */ 300 strcpy(name, _PathLocale); 301 strcat(name, "/"); 302 strcat(name, encoding); 303#if 0 304 /* 305 * Some day we will actually look at this file. 306 */ 307#endif 308 return (stat(name, &st) != 0 || !S_ISDIR(st.st_mode)); 309} | |