X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fencoding.c;h=6a1148a8dea48deaadb258a620aa285e56a8b263;hp=927cb5dad342128017133ad903530643c246b056;hb=5f3757249c17cb9e2826f645e0f8618534c80fcc;hpb=ced16a28e197645a40fa04a54793d117a04526d7 diff --git a/src/encoding.c b/src/encoding.c index 927cb5da..6a1148a8 100644 --- a/src/encoding.c +++ b/src/encoding.c @@ -5,20 +5,18 @@ /* * 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 @@ -68,8 +66,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 * @@ -119,11 +115,6 @@ put_iconv(iconv_t *cd) errno = errno_save; } -/* Prevent printing an error message if a character conversion error occurs - * while printing an error message. (This variable is not per-thread but it - * doesn't matter too much since it's just the error messages.) */ -static bool error_message_being_printed = false; - #define DEFINE_CHAR_CONVERSION_FUNCTIONS(varname1, longname1, chartype1,\ varname2, longname2, chartype2,\ earlyreturn_on_utf8_locale, \ @@ -167,11 +158,7 @@ varname1##_to_##varname2##_nbytes(const chartype1 *in, size_t in_nbytes,\ \ len = iconv(*cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); \ if (len == (size_t)-1) { \ - if (!error_message_being_printed) { \ - error_message_being_printed = true; \ - err_msg; \ - error_message_being_printed = false; \ - } \ + err_msg; \ ret = err_return; \ } else { \ *out_nbytes_ret = bufsize - outbytesleft; \ @@ -201,11 +188,7 @@ varname1##_to_##varname2##_buf(const chartype1 *in, size_t in_nbytes, \ \ len = iconv(*cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); \ if (len == (size_t)-1) { \ - if (!error_message_being_printed) { \ - error_message_being_printed = true; \ - err_msg; \ - error_message_being_printed = false; \ - } \ + err_msg; \ ret = err_return; \ } else { \ out[(LARGE_NUMBER-outbytesleft)/sizeof(chartype2)] = 0; \ @@ -376,6 +359,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) { @@ -390,6 +380,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) { @@ -558,9 +561,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) {