+static bool
+test_locale_ctype_utf8(void)
+{
+#ifdef __WIN32__
+ return false;
+#else
+ char *ctype = nl_langinfo(CODESET);
+
+ return (!strstr(ctype, "UTF-8") ||
+ !strstr(ctype, "UTF8") ||
+ !strstr(ctype, "utf8") ||
+ !strstr(ctype, "utf-8"));
+#endif
+}
+
+/* API function documented in wimlib.h */
+WIMLIBAPI u32
+wimlib_get_version(void)
+{
+ return WIMLIB_VERSION_CODE;
+}
+
+/* API function documented in wimlib.h */
+WIMLIBAPI int
+wimlib_global_init(int init_flags)
+{
+ static bool already_inited = false;
+
+ if (already_inited)
+ return 0;
+
+ if (init_flags & ~(WIMLIB_INIT_FLAG_ASSUME_UTF8 |
+ WIMLIB_INIT_FLAG_DONT_ACQUIRE_PRIVILEGES |
+ WIMLIB_INIT_FLAG_STRICT_CAPTURE_PRIVILEGES |
+ WIMLIB_INIT_FLAG_STRICT_APPLY_PRIVILEGES |
+ WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE |
+ WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE))
+ return WIMLIB_ERR_INVALID_PARAM;
+
+ libxml_global_init();
+ if (!(init_flags & WIMLIB_INIT_FLAG_ASSUME_UTF8)) {
+ wimlib_mbs_is_utf8 = test_locale_ctype_utf8();
+ #ifdef WITH_NTFS_3G
+ if (!wimlib_mbs_is_utf8)
+ libntfs3g_global_init();
+ #endif
+ }
+#ifdef __WIN32__
+ {
+ int ret = win32_global_init(init_flags);
+ if (ret)
+ return ret;
+ }
+#endif
+ 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;
+ return 0;
+}
+
+/* API function documented in wimlib.h */
+WIMLIBAPI void
+wimlib_global_cleanup(void)
+{
+ libxml_global_cleanup();
+ iconv_global_cleanup();
+#ifdef __WIN32__
+ win32_global_cleanup();
+#endif
+ cleanup_decompressor_params();
+ cleanup_compressor_params();
+}