5 #include "src/icu_util.h" 11 #if defined(V8_INTL_SUPPORT) 15 #include "unicode/putil.h" 16 #include "unicode/udata.h" 18 #include "src/base/build_config.h" 19 #include "src/base/file-utils.h" 21 #define ICU_UTIL_DATA_FILE 0 22 #define ICU_UTIL_DATA_SHARED 1 23 #define ICU_UTIL_DATA_STATIC 2 25 #define ICU_UTIL_DATA_SYMBOL "icudt" U_ICU_VERSION_SHORT "_dat" 26 #define ICU_UTIL_DATA_SHARED_MODULE_NAME "icudt.dll" 33 #if defined(V8_INTL_SUPPORT) && (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE) 35 char* g_icu_data_ptr =
nullptr;
37 void free_icu_data_ptr() {
38 delete[] g_icu_data_ptr;
44 bool InitializeICUDefaultLocation(
const char* exec_path,
45 const char* icu_data_file) {
46 #if !defined(V8_INTL_SUPPORT) 49 #if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE 51 return InitializeICU(icu_data_file);
53 char* icu_data_file_default;
54 #if defined(V8_TARGET_LITTLE_ENDIAN) 55 base::RelativePath(&icu_data_file_default, exec_path,
"icudtl.dat");
56 #elif defined(V8_TARGET_BIG_ENDIAN) 57 base::RelativePath(&icu_data_file_default, exec_path,
"icudtb.dat");
59 #error Unknown byte ordering 61 bool result = InitializeICU(icu_data_file_default);
62 free(icu_data_file_default);
65 return InitializeICU(
nullptr);
70 bool InitializeICU(
const char* icu_data_file) {
71 #if !defined(V8_INTL_SUPPORT) 74 #if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_SHARED 76 HMODULE module = LoadLibraryA(ICU_UTIL_DATA_SHARED_MODULE_NAME);
77 if (!module)
return false;
79 FARPROC addr = GetProcAddress(module, ICU_UTIL_DATA_SYMBOL);
80 if (!addr)
return false;
82 UErrorCode err = U_ZERO_ERROR;
83 udata_setCommonData(reinterpret_cast<void*>(addr), &err);
85 udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
86 return err == U_ZERO_ERROR;
87 #elif ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_STATIC 90 #elif ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE 91 if (!icu_data_file)
return false;
93 if (g_icu_data_ptr)
return true;
95 FILE* inf = fopen(icu_data_file,
"rb");
96 if (!inf)
return false;
98 fseek(inf, 0, SEEK_END);
99 size_t size = ftell(inf);
102 g_icu_data_ptr =
new char[size];
103 if (fread(g_icu_data_ptr, 1, size, inf) != size) {
104 delete[] g_icu_data_ptr;
105 g_icu_data_ptr =
nullptr;
111 atexit(free_icu_data_ptr);
113 UErrorCode err = U_ZERO_ERROR;
114 udata_setCommonData(reinterpret_cast<void*>(g_icu_data_ptr), &err);
116 udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
117 return err == U_ZERO_ERROR;