+ FREE(wim);
+}
+
+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_MAJOR_VERSION << 20) |
+ (WIMLIB_MINOR_VERSION << 10) |
+ WIMLIB_PATCH_VERSION;
+}
+
+static bool lib_initialized = false;
+static pthread_mutex_t lib_initialization_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* API function documented in wimlib.h */
+WIMLIBAPI int
+wimlib_global_init(int init_flags)
+{
+ int ret;
+
+ if (lib_initialized)
+ return 0;
+
+ pthread_mutex_lock(&lib_initialization_mutex);
+
+ ret = 0;
+ if (lib_initialized)
+ goto out;
+
+#ifdef ENABLE_ERROR_MESSAGES
+ if (!wimlib_error_file)
+ wimlib_error_file = stderr;
+#endif
+
+ ret = WIMLIB_ERR_INVALID_PARAM;
+ 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))
+ goto out;
+
+ 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