]> wimlib.net Git - wimlib/blobdiff - src/encoding.c
win32_apply.c: handle target directory more like other directories
[wimlib] / src / encoding.c
index 8edf228817cba16e659ca47caed8d492e1de95cf..5819f0ef30c84000e62403384ac702049b5a851b 100644 (file)
@@ -5,27 +5,31 @@
 /*
  * Copyright (C) 2012, 2013 Eric Biggers
  *
- * This file is part of wimlib, a library for working with WIM files.
+ * This file is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
  *
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 3 of the License, or (at your option)
- * any later version.
- *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  * details.
  *
- * You should have received a copy of the GNU General Public License
- * along with wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
  */
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
 #endif
 
+#include <errno.h>
+#include <iconv.h>
+#include <pthread.h>
+#include <string.h>
+
 #include "wimlib.h"
+#include "wimlib/alloca.h"
 #include "wimlib/assert.h"
 #include "wimlib/encoding.h"
 #include "wimlib/endianness.h"
 #include "wimlib/list.h"
 #include "wimlib/util.h"
 
-#include <errno.h>
-#include <iconv.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_ALLOCA_H
-#  include <alloca.h>
-#endif
 
 bool wimlib_mbs_is_utf8 = !TCHAR_IS_UTF16LE;
 
@@ -68,8 +63,6 @@ struct iconv_node {
 struct iconv_list_head name = {                                \
        .from_encoding = from,                          \
        .to_encoding = to,                              \
-       .list = LIST_HEAD_INIT(name.list),              \
-       .mutex = PTHREAD_MUTEX_INITIALIZER,             \
 }
 
 static iconv_t *
@@ -363,6 +356,13 @@ utf8_to_tstr_simple(const char *utf8str, tchar **out)
        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)
 {
@@ -377,6 +377,19 @@ 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)
 {
@@ -545,9 +558,11 @@ cmp_utf16le_strings(const utf16lechar *s1, size_t n1,
        return (n1 < n2) ? -1 : 1;
 }
 
-/* Duplicate a UTF16-LE string which may not be null-terminated.  */
+/* Duplicate a UTF16-LE string.  The input string might not be null terminated
+ * and might be misaligned, but the returned string is guaranteed to be null
+ * terminated and properly aligned.  */
 utf16lechar *
-utf16le_dupz(const utf16lechar *ustr, size_t usize)
+utf16le_dupz(const void *ustr, size_t usize)
 {
        utf16lechar *dup = MALLOC(usize + sizeof(utf16lechar));
        if (dup) {