X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxml.c;h=3812ce1e19d7926e499a9c230e0bddb9664d02ea;hb=7680ad7a8ae33d943be1b9785ae9440669f7a41b;hp=20c9abd83e3012fc3b726de13350cce62519a350;hpb=f1a477bb0927fdec7b2012839ddc51e8eb0c02ba;p=wimlib diff --git a/src/xml.c b/src/xml.c index 20c9abd8..3812ce1e 100644 --- a/src/xml.c +++ b/src/xml.c @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2012, 2013, 2015 Eric Biggers + * Copyright (C) 2012-2016 Eric Biggers * * 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 @@ -64,12 +64,14 @@ struct wim_xml_info { /* The number of WIM images (the length of 'images') */ int image_count; +#if TCHAR_IS_UTF16LE /* Temporary memory for UTF-8 => 'tchar' string translations. When an * API function needs to return a 'tchar' string, it uses one of these * array slots to hold the string and returns a pointer to it. */ tchar *strings[128]; size_t next_string_idx; size_t num_strings; +#endif }; /*----------------------------------------------------------------------------* @@ -144,18 +146,21 @@ node_get_timestamp(const xmlNode *node) static int tstr_get_utf8(const tchar *tstr, const xmlChar **utf8_ret) { - if (wimlib_mbs_is_utf8) { - *utf8_ret = (xmlChar *)tstr; - return 0; - } - return tstr_to_utf8_simple(tstr, (char **)utf8_ret); +#if TCHAR_IS_UTF16LE + return utf16le_to_utf8(tstr, tstrlen(tstr) * sizeof(tchar), + (char **)utf8_ret, NULL); +#else + *utf8_ret = (const xmlChar *)tstr; + return 0; +#endif } static void tstr_put_utf8(const xmlChar *utf8) { - if (!wimlib_mbs_is_utf8) - FREE((void *)utf8); +#if TCHAR_IS_UTF16LE + FREE((char *)utf8); +#endif } /* Retrieve the text contents of an XML element as a 'tchar' string. If not @@ -163,26 +168,29 @@ tstr_put_utf8(const xmlChar *utf8) static const tchar * node_get_ttext(struct wim_xml_info *info, xmlNode *node) { - const xmlChar *text; - tchar **ttext_p; + const xmlChar *text = node_get_text(node); - text = node_get_text(node); +#if TCHAR_IS_UTF16LE + tchar **ttext_p; - if (!text || wimlib_mbs_is_utf8) - return (const tchar *)text; + if (!text) + return NULL; ttext_p = &info->strings[info->next_string_idx]; if (info->num_strings >= ARRAY_LEN(info->strings)) { FREE(*ttext_p); *ttext_p = NULL; } - if (utf8_to_tstr_simple(text, ttext_p)) + if (utf8_to_tstr(text, strlen(text), ttext_p, NULL)) return NULL; if (info->num_strings < ARRAY_LEN(info->strings)) info->num_strings++; info->next_string_idx++; info->next_string_idx %= ARRAY_LEN(info->strings); return *ttext_p; +#else + return text; +#endif } /* Unlink the specified node from its parent, then free it (recursively). */ @@ -335,22 +343,24 @@ static struct wim_xml_info * alloc_wim_xml_info(void) { struct wim_xml_info *info = MALLOC(sizeof(*info)); +#if TCHAR_IS_UTF16LE if (info) { info->next_string_idx = 0; info->num_strings = 0; } +#endif return info; } static bool -parse_index(xmlChar **pp, uint32_t *index_ret) +parse_index(xmlChar **pp, u32 *index_ret) { xmlChar *p = *pp; - uint32_t index = 0; + u32 index = 0; *p++ = '\0'; /* overwrite '[' */ while (*p >= '0' && *p <= '9') { - uint32_t n = (index * 10) + (*p++ - '0'); + u32 n = (index * 10) + (*p++ - '0'); if (n < index) return false; index = n; @@ -393,7 +403,7 @@ do_xml_path_walk(xmlNode *node, const xmlChar *path, bool create, while (c != '\0') { const xmlChar *name; xmlNode *child; - uint32_t index = 1; + u32 index = 1; /* We have another path component. */ @@ -609,8 +619,10 @@ xml_free_info_struct(struct wim_xml_info *info) if (info) { xmlFreeDoc(info->doc); FREE(info->images); + #if TCHAR_IS_UTF16LE for (size_t i = 0; i < info->num_strings; i++) FREE(info->strings[i]); + #endif FREE(info); } } @@ -863,6 +875,7 @@ xml_delete_image(struct wim_xml_info *info, int image) #define PROCESSOR_ARCHITECTURE_MSIL 8 #define PROCESSOR_ARCHITECTURE_AMD64 9 #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10 +#define PROCESSOR_ARCHITECTURE_ARM64 12 static const tchar * describe_arch(u64 arch) @@ -873,6 +886,7 @@ describe_arch(u64 arch) [PROCESSOR_ARCHITECTURE_ARM] = T("ARM"), [PROCESSOR_ARCHITECTURE_IA64] = T("ia64"), [PROCESSOR_ARCHITECTURE_AMD64] = T("x86_64"), + [PROCESSOR_ARCHITECTURE_ARM64] = T("ARM64"), }; if (arch < ARRAY_LEN(descriptions) && descriptions[arch] != NULL) @@ -1025,7 +1039,7 @@ xml_print_image_info(struct wim_xml_info *info, int image) *----------------------------------------------------------------------------*/ static int -image_node_get_index(const xmlNode *node) +image_node_get_index(xmlNode *node) { u64 v = node_get_number((const xmlNode *)xmlHasProp(node, "INDEX"), 10); return min(v, INT_MAX);