18 #ifdef LCF_SUPPORT_ICU
19 # include <unicode/ucsdet.h>
20 # include <unicode/ucnv.h>
23 # error MSVC builds require ICU
30 # ifndef LCF_SUPPORT_ICU
36 #if defined(__MORPHOS__) || defined(__amigaos4__)
37 #define ICONV_CONST const
41 #ifdef LCF_SUPPORT_ICU
42 if (ucnv_compareNames(enc.c_str(),
"UTF-8") == 0) {
81 #ifdef LCF_SUPPORT_ICU
83 const auto& storage_encoding = code_page > 0
87 auto status = U_ZERO_ERROR;
88 constexpr
auto runtime_encoding =
"UTF-8";
89 auto conv_runtime = ucnv_open(runtime_encoding, &status);
91 if (conv_runtime ==
nullptr) {
92 fprintf(stderr,
"liblcf: ucnv_open() error for encoding \"%s\": %s\n", runtime_encoding, u_errorName(status));
95 status = U_ZERO_ERROR;
98 auto conv_storage = ucnv_open(storage_encoding.c_str(), &status);
100 if (conv_storage ==
nullptr) {
101 fprintf(stderr,
"liblcf: ucnv_open() error for dest encoding \"%s\": %s\n", storage_encoding.c_str(), u_errorName(status));
116 #ifdef LCF_SUPPORT_ICU
118 if (conv) ucnv_close(conv);
120 if (conv) ucnv_close(conv);
126 #ifdef LCF_SUPPORT_ICU
127 const auto& src = str;
128 auto* conv_dst =
reinterpret_cast<UConverter*
>(conv_dst_void);
129 auto* conv_src =
reinterpret_cast<UConverter*
>(conv_src_void);
131 auto status = U_ZERO_ERROR;
132 _buffer.resize(src.size() * 4);
134 const auto* src_p = src.c_str();
137 ucnv_convertEx(conv_dst, conv_src,
138 &dst_p, dst_p +
_buffer.size(),
139 &src_p, src_p + src.size(),
140 nullptr,
nullptr,
nullptr,
nullptr,
144 if (U_FAILURE(status)) {
145 fprintf(stderr,
"liblcf: ucnv_convertEx() error when encoding \"%s\": %s\n", src.c_str(), u_errorName(status));
149 str.assign(
_buffer.data(), dst_p);
152 auto* conv_dst =
reinterpret_cast<const char*
>(conv_dst_void);
153 auto* conv_src =
reinterpret_cast<const char*
>(conv_src_void);
154 iconv_t cd = iconv_open(conv_dst, conv_src);
155 if (cd == (iconv_t)-1)
157 char *src = &str.front();
158 size_t src_left = str.size();
159 size_t dst_size = str.size() * 5 + 10;
162 size_t dst_left = dst_size;
164 char ICONV_CONST *p = src;
169 size_t status = iconv(cd, &p, &src_left, &q, &dst_left);
171 if (status == (
size_t) -1 || src_left > 0) {
176 str.assign(dst, dst_size - dst_left);