1 #ifndef _WIMLIB_ENCODING_H
2 #define _WIMLIB_ENCODING_H
6 #include "wimlib/error.h"
7 #include "wimlib/util.h"
8 #include "wimlib/types.h"
11 iconv_global_init(void);
14 iconv_global_cleanup(void);
16 extern u16 upcase[65536];
21 extern bool wimlib_mbs_is_utf8;
23 #define DECLARE_CHAR_CONVERSION_FUNCTIONS(varname1, varname2, \
24 chartype1, chartype2) \
27 varname1##_to_##varname2(const chartype1 *in, size_t in_nbytes, \
28 chartype2 **out_ret, \
29 size_t *out_nbytes_ret); \
32 varname1##_to_##varname2##_nbytes(const chartype1 *in, size_t in_nbytes,\
33 size_t *out_nbytes_ret); \
36 varname1##_to_##varname2##_buf(const chartype1 *in, size_t in_nbytes, \
40 utf16le_dupz(const void *ustr, size_t usize);
43 utf16le_dup(const utf16lechar *ustr);
46 utf16le_len_bytes(const utf16lechar *s);
49 utf16le_len_chars(const utf16lechar *s);
52 DECLARE_CHAR_CONVERSION_FUNCTIONS(utf16le, tstr, utf16lechar, tchar);
53 DECLARE_CHAR_CONVERSION_FUNCTIONS(tstr, utf16le, tchar, utf16lechar);
57 tstr_to_utf16le(const tchar *tstr, size_t tsize,
58 utf16lechar **ustr_ret, size_t *usize_ret)
60 utf16lechar *ustr = utf16le_dupz(tstr, tsize);
62 return WIMLIB_ERR_NOMEM;
68 #define utf16le_to_tstr tstr_to_utf16le
72 DECLARE_CHAR_CONVERSION_FUNCTIONS(utf8, tstr, char, tchar);
73 DECLARE_CHAR_CONVERSION_FUNCTIONS(tstr, utf8, tchar, char);
76 utf8_to_tstr_simple(const char *utf8str, tchar **out);
79 tstr_to_utf8_simple(const tchar *tstr, char **out);
82 cmp_utf16le_strings(const utf16lechar *s1, size_t n1,
83 const utf16lechar *s2, size_t n2,
87 cmp_utf16le_strings_z(const utf16lechar *s1, const utf16lechar *s2,
90 /* Convert a string in the platform-dependent encoding to UTF-16LE, but if both
91 * encodings are UTF-16LE, simply re-use the string. Release with
92 * tstr_put_utf16le() when done. */
94 tstr_get_utf16le_and_len(const tchar *tstr,
95 const utf16lechar **ustr_ret, size_t *usize_ret)
97 size_t tsize = tstrlen(tstr) * sizeof(tchar);
99 /* No conversion or copy needed */
104 return tstr_to_utf16le(tstr, tsize, (utf16lechar **)ustr_ret, usize_ret);
108 /* Convert a string in the platform-dependent encoding to UTF-16LE, but if both
109 * encodings are UTF-16LE, simply re-use the string. Release with
110 * tstr_put_utf16le() when done. */
112 tstr_get_utf16le(const tchar *tstr, const utf16lechar **ustr_ret)
115 /* No conversion or copy needed */
119 size_t tsize = tstrlen(tstr) * sizeof(tchar);
121 return tstr_to_utf16le(tstr, tsize, (utf16lechar **)ustr_ret, &dummy);
125 /* Release a string acquired with tstr_get_utf16le() or
126 * tstr_get_utf16le_and_len(). */
128 tstr_put_utf16le(const utf16lechar *ustr)
130 #if !TCHAR_IS_UTF16LE
135 /* Convert a UTF16-LE string to the platform-dependent encoding, but if both
136 * encodings are UTF-16LE, simply re-use the string. Release with
137 * utf16le_put_tstr() when done. */
139 utf16le_get_tstr(const utf16lechar *ustr, size_t usize,
140 const tchar **tstr_ret, size_t *tsize_ret)
143 /* No conversion or copy needed */
148 return utf16le_to_tstr(ustr, usize, (tchar **)tstr_ret, tsize_ret);
152 /* Release a string acquired with utf16le_get_tstr(). */
154 utf16le_put_tstr(const tchar *tstr)
156 #if !TCHAR_IS_UTF16LE
161 #endif /* _WIMLIB_ENCODING_H */