struct iconv_list_head name = { \
.from_encoding = from, \
.to_encoding = to, \
- .list = LIST_HEAD_INIT(name.list), \
- .mutex = PTHREAD_MUTEX_INITIALIZER, \
}
static iconv_t *
return utf8_to_tstr(utf8str, strlen(utf8str), out, &out_nbytes);
}
+static void
+iconv_init(struct iconv_list_head *head)
+{
+ pthread_mutex_init(&head->mutex, NULL);
+ INIT_LIST_HEAD(&head->list);
+}
+
static void
iconv_cleanup(struct iconv_list_head *head)
{
}
}
+void
+iconv_global_init(void)
+{
+ iconv_init(&iconv_utf8_to_tstr);
+ iconv_init(&iconv_tstr_to_utf8);
+#if !TCHAR_IS_UTF16LE
+ iconv_init(&iconv_utf16le_to_tstr);
+ iconv_init(&iconv_tstr_to_utf16le);
+ iconv_init(&iconv_utf16le_to_utf8);
+ iconv_init(&iconv_utf8_to_utf16le);
+#endif
+}
+
void
iconv_global_cleanup(void)
{
return WIMLIB_VERSION_CODE;
}
+static bool lib_initialized = false;
+
/* API function documented in wimlib.h */
WIMLIBAPI int
wimlib_global_init(int init_flags)
{
- static bool already_inited = false;
-
- if (already_inited)
+ if (lib_initialized)
return 0;
if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
return ret;
}
#endif
+ iconv_global_init();
init_upcase();
if (init_flags & WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE)
default_ignore_case = false;
else if (init_flags & WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE)
default_ignore_case = true;
- already_inited = true;
+ lib_initialized = true;
return 0;
}
WIMLIBAPI void
wimlib_global_cleanup(void)
{
+ if (!lib_initialized)
+ return;
libxml_global_cleanup();
iconv_global_cleanup();
#ifdef __WIN32__
#endif
cleanup_decompressor_params();
cleanup_compressor_params();
+ lib_initialized = false;
}