Print this page
2964 need POSIX 2008 locale object support (more C++ fixes)
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/lib/libc/port/locale/localeimpl.h
+++ new/usr/src/lib/libc/port/locale/localeimpl.h
1 1 /*
2 2 * This file and its contents are supplied under the terms of the
3 3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 4 * You may only use this file in accordance with the terms of version
5 5 * 1.0 of the CDDL.
6 6 *
7 7 * A full copy of the text of the CDDL should have accompanied this
8 8 * source. A copy of the CDDL is also available via the Internet at
9 9 * http://www.illumos.org/license/CDDL.
10 10 */
11 11
12 12 /*
13 13 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
14 14 */
15 15
16 16 /*
17 17 * This file implements the 2008 newlocale and friends handling. It is
18 18 * private to libc.
19 19 */
20 20 #ifndef _LOCALEIMPL_H_
21 21 #define _LOCALEIMPL_H_
22 22
23 23 #ifndef _LCONV_C99
24 24 #define _LCONV_C99 /* so we get all the extensions */
25 25 #endif
26 26
27 27 #include <sys/types.h>
28 28 #include <locale.h>
29 29 #include <xlocale.h>
30 30 #include "setlocale.h"
31 31 #include "runetype.h"
32 32
33 33 /* private locale structures */
34 34
35 35 /*
36 36 * Because some locale data is rather ahem.. large, we would like to keep
37 37 * reference counts on it. We create an abstract header (locdata) structure
38 38 * which keeps a point to the opaque per-category data, along with a reference
39 39 * count to it. To be threadsafe, we will use atomics when holding it or
40 40 * freeing it. (This only occurs when locale objects are created or destroyed,
41 41 * so there should be no performance impact on hot code paths. If your code
42 42 * uses locale_t creation/destruction on a hot code path, its broken. But
43 43 * even so, the atomic and reference counting will probably *greatly* improve
44 44 * your life as bootstrapping locale data from files is quite expensive.
45 45 */
46 46
47 47 #define NLOCDATA 4
|
↓ open down ↓ |
47 lines elided |
↑ open up ↑ |
48 48 struct locdata {
49 49 char l_lname[ENCODING_LEN+1]; /* locale name */
50 50 void *l_data[NLOCDATA]; /* storage area */
51 51 void *l_map; /* mapped file */
52 52 size_t l_map_len;
53 53 struct locdata *l_next; /* link cached list */
54 54 int l_cached; /* nonzero if cached */
55 55 };
56 56
57 57
58 -struct locale {
58 +struct _locale {
59 59 struct locdata *locdata[LC_ALL];
60 - struct locale *next;
60 + struct _locale *next;
61 61 int on_list; /* on linked list */
62 62 char locname[(ENCODING_LEN+1)*NLOCDATA + 1];
63 63
64 64 /*
65 65 * Convenience pointers.
66 66 */
67 67 const struct lc_ctype *ctype;
68 68 const struct lc_collate *collate;
69 69 const struct lc_messages *messages;
70 70 const struct lc_monetary *monetary;
71 71 const struct lc_numeric *numeric;
72 72 const struct lc_time *time;
73 73 const _RuneLocale *runelocale;
74 74
75 75 /*
76 76 * The loaded value is used for localeconv. In paticular, when
77 77 * when we change the value of one of the above categories, we will
78 78 * also need to update the lconv structure. The loaded bit indicates
79 79 * that the lconv structure is "current" for that category. It's
80 80 * sort of an "inverse dirty" bit.
81 81 */
82 82 int loaded[LC_ALL];
83 83 struct lconv lconv;
84 84 };
85 85
86 86
87 87 struct locdata *__locdata_alloc(const char *, size_t);
88 88 void __locdata_free(struct locdata *);
89 89 struct locdata *__locdata_get_cache(int, const char *);
90 90 void __locdata_set_cache(int, struct locdata *);
91 91
92 92 struct locdata *__lc_numeric_load(const char *name);
93 93 struct locdata *__lc_monetary_load(const char *name);
94 94 struct locdata *__lc_messages_load(const char *name);
95 95 struct locdata *__lc_time_load(const char *name);
96 96 struct locdata *__lc_ctype_load(const char *name);
97 97 struct locdata *__lc_collate_load(const char *name);
98 98
99 99 extern struct locdata __posix_numeric_locdata;
100 100 extern struct locdata __posix_monetary_locdata;
101 101 extern struct locdata __posix_messages_locdata;
102 102 extern struct locdata __posix_time_locdata;
103 103 extern struct locdata __posix_ctype_locdata;
104 104 extern struct locdata __posix_collate_locdata;
105 105 extern locale_t ___global_locale;
106 106
107 107 #endif /* _LOCALEIMPL_H_ */
|
↓ open down ↓ |
37 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX