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 #ifdef FEATURE_ICU_LOCALE_TMP 52 #define ICU_UCHAR_ISALNUM_SYMBOL "u_isalnum" 53 #endif 54 55 typedef enum { 56 ICU_UC = 0, 57 ICU_I18N, 58 } icu_so_type; 59 60 #define MAX_VALID_ICU_NAME_LEN 8 61 typedef uint16_t u_char; 62 63 hidden void set_icu_directory(); 64 hidden void get_icu_symbol(icu_so_type type, void **icu_symbol_handle, const char *symbol_name); 65 hidden void get_valid_icu_locale_name(const char *name, const char *icu_name, int icu_name_len); 66 hidden void *icu_unum_open(char *icu_locale_name, int *cur_status); 67 hidden void icu_unum_close(void *fmt); 68 hidden double icu_parse_double(void *fmt, u_char *ustr, int32_t *parse_pos, int *cur_status); 69 hidden bool icuuc_handle_init(); 70 71 typedef char *(*f_icuuc_get_icu_version)(void); 72 typedef void (*f_icuuc_u_set_data_directory)(void); 73 typedef void *(*f_icu18n_unum_open)(int, void *, int32_t, const char *, void *, void *); 74 typedef void (*f_icu18n_unum_close)(void *); 75 typedef void *(*f_icu18n_u_str_from_utf8)(u_char *, int32_t, int32_t *, const char *, int32_t, int *); 76 typedef void *(*f_icu18n_u_str_from_utf32)(u_char *, int32_t, int32_t *, const wchar_t *, int32_t, int *); 77 typedef double (*f_icu18n_unum_parse_double)(void *, u_char *, int32_t, int32_t *, int *); 78 typedef int32_t(*f_icu18n_unum_get_symbol)(const void *, int, u_char *, int32_t, int *); 79 typedef char *(*f_icuuc_u_austrncpy)(char *, const u_char *, int32_t); 80 typedef void* (*f_ucnv_open)(const char*, int*); 81 typedef int32_t (*f_ucnv_setToUCallBack)(void*, void*, void*, void*, void*, int*); 82 typedef int32_t (*f_ucnv_setFromUCallBack)(void*, void*, void*, void*, void*, int*); 83 typedef void (*f_ucnv_convertEx)(void*, void*, char**, const char *, const char **, const char *, 84 u_char*, u_char **, u_char **, const u_char*, int8_t, int8_t, int*); 85 typedef void (*f_ucnv_close)(void*); 86 #ifdef FEATURE_ICU_LOCALE_TMP 87 typedef int(*f_icu18n_u_isalnum)(int c); 88 #endif 89 90 struct icu_opt_func { 91 f_icuuc_get_icu_version get_icu_version; 92 f_icuuc_u_set_data_directory set_data_directory; 93 f_icu18n_unum_open unum_open; 94 f_icu18n_unum_close unum_close; 95 f_icu18n_u_str_from_utf8 u_str_from_utf8; 96 f_icu18n_u_str_from_utf32 u_str_from_utf32; 97 f_icu18n_unum_parse_double unum_parse_double; 98 f_icu18n_unum_get_symbol unum_get_symbol; 99 f_icuuc_u_austrncpy u_austrncpy; 100 f_ucnv_open ucnv_open; 101 f_ucnv_setToUCallBack ucnv_setToUCallBack; 102 f_ucnv_setFromUCallBack ucnv_setFromUCallBack; 103 f_ucnv_convertEx ucnv_convertEx; 104 f_ucnv_close ucnv_close; 105 #ifdef FEATURE_ICU_LOCALE_TMP 106 f_icu18n_u_isalnum u_isalnum; 107 #endif 108 }; 109 extern hidden struct icu_opt_func g_icu_opt_func; 110 111 #define DLSYM_ICU_SUCC 0 112 #define DLSYM_ICU_FAIL 1 113 #define ICU_ERROR (-1) 114 #endif 115 116 #define LOC_MAP_FAILED ((const struct __locale_map *)-1) 117 118 #define LCTRANS(msg, lc, loc) __lctrans(msg, (loc)->cat[(lc)]) 119 #define LCTRANS_CUR(msg) __lctrans_cur(msg) 120 121 #define C_LOCALE ((locale_t)&__c_locale) 122 #define UTF8_LOCALE ((locale_t)&__c_dot_utf8_locale) 123 124 #define CURRENT_LOCALE (__pthread_self()->locale) 125 126 #define CURRENT_UTF8 (!!__pthread_self()->locale->cat[LC_CTYPE]) 127 128 #undef MB_CUR_MAX 129 #define MB_CUR_MAX (CURRENT_UTF8 ? 4 : 1) 130 131 #endif 132