• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _LOCALE_IMPL_H
2 #define _LOCALE_IMPL_H
3 
4 #include <locale.h>
5 #include <stdlib.h>
6 #include "libc.h"
7 #include "pthread_impl.h"
8 
9 #define LOCALE_NAME_MAX 23
10 #define VALID 2
11 #define INVALID 1
12 #define ICU_VALID 3
13 
14 struct __locale_map {
15 	const void *map;
16 	size_t map_size;
17 	char name[LOCALE_NAME_MAX+1];
18 	const struct __locale_map *next;
19 	char flag;
20 };
21 
22 extern hidden volatile int __locale_lock[1];
23 
24 extern hidden const struct __locale_map __c_dot_utf8;
25 extern hidden const struct __locale_struct __c_locale;
26 extern hidden const struct __locale_struct __c_dot_utf8_locale;
27 
28 hidden const struct __locale_map *__get_locale(int, const char *);
29 hidden const char *__mo_lookup(const void *, size_t, const char *);
30 hidden const char *__lctrans(const char *, const struct __locale_map *);
31 hidden const char *__lctrans_cur(const char *);
32 hidden const char *__lctrans_impl(const char *, const struct __locale_map *);
33 hidden int __loc_is_allocated(locale_t);
34 hidden char *__gettextdomain(void);
35 
36 #ifdef FEATURE_ICU_LOCALE
37 #define ICU_GET_VERSION_NUM_SYMBOL "GetIcuVersion"
38 #define ICU_SET_DATA_DIRECTORY_SYMBOL "SetOhosIcuDirectory"
39 #define ICU_UNUM_OPEN_SYMBOL "unum_open"
40 #define ICU_UNUM_CLOSE_SYMBOL "unum_close"
41 #define ICU_STR_FROM_UTF8_SYMBOL "u_strFromUTF8"
42 #define ICU_STR_FROM_UTF32_SYMBOL "u_strFromUTF32"
43 #define ICU_UNUM_PARSE_DOUBLE_SYMBOL "unum_parseDouble"
44 #define ICU_UNUM_GET_SYMBOL_SYMBOL "unum_getSymbol"
45 #define ICU_AUSTRNCPY_SYMBOL "u_austrncpy"
46 #define ICU_UCNV_OPEN_SYMBOL  "ucnv_open"
47 #define ICU_UCNV_SETTOUCALLBACK_SYMBOL  "ucnv_setToUCallBack"
48 #define ICU_UCNV_SETFROMUCALLBACK_SYMBOL  "ucnv_setFromUCallBack"
49 #define ICU_UCNV_CLOSE_SYMBOL  "ucnv_close"
50 #define ICU_UCNV_CONVERTEX_SYMBOL  "ucnv_convertEx"
51 #define ICU_UCHAR_ISALNUM_SYMBOL	"u_isalnum"
52 #define ICU_UCHAR_ISALPHA_SYMBOL 	"u_isalpha"
53 #define ICU_UCHAR_ISBLANK_SYMBOL 	"u_isblank"
54 #define ICU_UCHAR_ISCNTRL_SYMBOL 	"u_iscntrl"
55 #define ICU_UCHAR_ISDIGIT_SYMBOL 	"u_isdigit"
56 #define ICU_UCHAR_ISGRAPH_SYMBOL 	"u_isgraph"
57 #define ICU_UCHAR_ISLOWER_SYMBOL 	"u_islower"
58 #define ICU_UCHAR_ISPRINT_SYMBOL 	"u_isprint"
59 #define ICU_UCHAR_ISPUNCT_SYMBOL 	"u_ispunct"
60 #define ICU_UCHAR_ISSPACE_SYMBOL 	"u_isspace"
61 #define ICU_UCHAR_ISUPPER_SYMBOL 	"u_isupper"
62 #define ICU_UCHAR_ISXDIGIT_SYMBOL 	"u_isxdigit"
63 #define ICU_UCHAR_TOLOWER_SYMBOL 	"u_tolower"
64 #define ICU_UCHAR_TOUPPER_SYMBOL 	"u_toupper"
65 
66 typedef enum {
67 	ICU_UC = 0,
68 	ICU_I18N,
69 } icu_so_type;
70 
71 #define MAX_VALID_ICU_NAME_LEN 8
72 typedef uint16_t u_char;
73 
74 extern hidden bool icu_locale_wctype_enable;
75 hidden void set_icu_directory();
76 hidden void get_icu_symbol(icu_so_type type, void **icu_symbol_handle, const char *symbol_name);
77 hidden void get_valid_icu_locale_name(const char *name, const char *icu_name, int icu_name_len);
78 hidden void *icu_unum_open(char *icu_locale_name, int *cur_status);
79 hidden void icu_unum_close(void *fmt);
80 hidden double icu_parse_double(void *fmt, u_char *ustr, int32_t *parse_pos, int *cur_status);
81 hidden bool icuuc_handle_init();
82 hidden bool icuuc_wctype_handle_init();
83 
84 typedef char *(*f_icuuc_get_icu_version)(void);
85 typedef void (*f_icuuc_u_set_data_directory)(void);
86 typedef void *(*f_icu18n_unum_open)(int, void *, int32_t, const char *, void *, void *);
87 typedef void (*f_icu18n_unum_close)(void *);
88 typedef void *(*f_icu18n_u_str_from_utf8)(u_char *, int32_t, int32_t *, const char *, int32_t, int *);
89 typedef void *(*f_icu18n_u_str_from_utf32)(u_char *, int32_t, int32_t *, const wchar_t *, int32_t, int *);
90 typedef double (*f_icu18n_unum_parse_double)(void *, u_char *, int32_t, int32_t *, int *);
91 typedef int32_t(*f_icu18n_unum_get_symbol)(const void *, int, u_char *, int32_t, int *);
92 typedef char *(*f_icuuc_u_austrncpy)(char *, const u_char *, int32_t);
93 typedef void* (*f_ucnv_open)(const char*, int*);
94 typedef int32_t (*f_ucnv_setToUCallBack)(void*, void*, void*, void*, void*, int*);
95 typedef int32_t (*f_ucnv_setFromUCallBack)(void*, void*, void*, void*, void*, int*);
96 typedef void (*f_ucnv_convertEx)(void*, void*, char**, const char *,const char **, const char *,
97 				u_char*, u_char **, u_char **, const u_char*, int8_t, int8_t, int*);
98 typedef void (*f_ucnv_close)(void*);
99 typedef int(*f_icu18n_u_isalnum)(int c);
100 typedef int(*f_icu18n_u_isalpha)(int c);
101 typedef int(*f_icu18n_u_isblank)(int c);
102 typedef int(*f_icu18n_u_iscntrl)(int c);
103 typedef int(*f_icu18n_u_isdigit)(int c);
104 typedef int(*f_icu18n_u_isgraph)(int c);
105 typedef int(*f_icu18n_u_islower)(int c);
106 typedef int(*f_icu18n_u_isprint)(int c);
107 typedef int(*f_icu18n_u_ispunct)(int c);
108 typedef int(*f_icu18n_u_isspace)(int c);
109 typedef int(*f_icu18n_u_isupper)(int c);
110 typedef int(*f_icu18n_u_isxdigit)(int c);
111 typedef int(*f_icu18n_u_tolower)(int c);
112 typedef int(*f_icu18n_u_toupper)(int c);
113 
114 struct icu_opt_func {
115 	f_icuuc_get_icu_version get_icu_version;
116 	f_icuuc_u_set_data_directory set_data_directory;
117 	f_icu18n_unum_open unum_open;
118 	f_icu18n_unum_close unum_close;
119 	f_icu18n_u_str_from_utf8 u_str_from_utf8;
120 	f_icu18n_u_str_from_utf32 u_str_from_utf32;
121 	f_icu18n_unum_parse_double unum_parse_double;
122 	f_icu18n_unum_get_symbol unum_get_symbol;
123 	f_icuuc_u_austrncpy u_austrncpy;
124     f_ucnv_open ucnv_open;
125     f_ucnv_setToUCallBack ucnv_setToUCallBack;
126     f_ucnv_setFromUCallBack ucnv_setFromUCallBack;
127 	f_ucnv_convertEx ucnv_convertEx;
128     f_ucnv_close ucnv_close;
129 	f_icu18n_u_isalnum u_isalnum;
130 	f_icu18n_u_isalpha u_isalpha;
131 	f_icu18n_u_isblank u_isblank;
132 	f_icu18n_u_iscntrl u_iscntrl;
133 	f_icu18n_u_isdigit u_isdigit;
134 	f_icu18n_u_isgraph u_isgraph;
135 	f_icu18n_u_islower u_islower;
136 	f_icu18n_u_isprint u_isprint;
137 	f_icu18n_u_ispunct u_ispunct;
138 	f_icu18n_u_isspace u_isspace;
139 	f_icu18n_u_isupper u_isupper;
140 	f_icu18n_u_isxdigit u_isxdigit;
141 	f_icu18n_u_tolower u_tolower;
142 	f_icu18n_u_toupper u_toupper;
143 };
144 extern hidden struct icu_opt_func g_icu_opt_func;
145 
146 #define DLSYM_ICU_SUCC 0
147 #define DLSYM_ICU_FAIL 1
148 #define ICU_ERROR (-1)
149 #define ICU_ZERO_ERROR 0
150 #define ICU_SYMBOL_LOAD_ERROR (-1)
151 #endif
152 
153 #define LOC_MAP_FAILED ((const struct __locale_map *)-1)
154 
155 #define LCTRANS(msg, lc, loc) __lctrans(msg, (loc)->cat[(lc)])
156 #define LCTRANS_CUR(msg) __lctrans_cur(msg)
157 
158 #define C_LOCALE ((locale_t)&__c_locale)
159 #define UTF8_LOCALE ((locale_t)&__c_dot_utf8_locale)
160 
161 #define CURRENT_LOCALE (__pthread_self()->locale)
162 
163 #define CURRENT_UTF8 (!!__pthread_self()->locale->cat[LC_CTYPE])
164 
165 #undef MB_CUR_MAX
166 #define MB_CUR_MAX (CURRENT_UTF8 ? 4 : 1)
167 
168 #endif
169