aboutsummaryrefslogtreecommitdiff
path: root/src/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c61
1 files changed, 52 insertions, 9 deletions
diff --git a/src/string.c b/src/string.c
index 69dbf1b58..2f8da20a8 100644
--- a/src/string.c
+++ b/src/string.c
@@ -165,6 +165,54 @@ bool string_contains_char(String s, u8 c) {
return false;
}
+
+
+
+
+
+
+
+
+#if defined(GB_SYSTEM_WINDOWS)
+
+ int convert_multibyte_to_widechar(char* multibyte_input, int input_length, wchar_t* output, int output_size)
+ {
+ return MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, multibyte_input, input_length, output, output_size);
+ }
+
+ int convert_widechar_to_multibyte(wchar_t* widechar_input, int input_length, char* output, int output_size)
+ {
+ return WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, widechar_input, input_length, output, output_size, NULL, NULL);
+ }
+}
+#elif defined(GB_SYSTEM_UNIX) || defined(GB_SYSTEM_OSX)
+
+ #include <iconv.h>
+
+ int convert_multibyte_to_widechar(char* multibyte_input, int input_length, wchar_t* output, int output_size)
+ {
+ iconv_t conv = iconv_open("WCHAR_T", "UTF-8");
+ size_t result = iconv(conv, (char**) &multibyte_input, &input_length, (char**) &output, &output_size);
+ iconv_close(conv);
+
+ return (int) result;
+ }
+
+ int convert_widechar_to_multibyte(wchar_t* widechar_input, int input_length, char* output, int output_size)
+ {
+ iconv_t conv = iconv_open("UTF-8", "WCHAR_T");
+ size_t result = iconv(conv, (char**) &widechar_input, &input_length, (char**) &output, &output_size);
+ iconv_close(conv);
+
+ return (int) result;
+ }
+#else
+#error Implement system
+#endif
+
+
+
+
// TODO(bill): Make this non-windows specific
String16 string_to_string16(gbAllocator a, String s) {
int len, len1;
@@ -174,16 +222,14 @@ String16 string_to_string16(gbAllocator a, String s) {
return make_string16(NULL, 0);
}
- len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
- cast(char *)s.text, s.len, NULL, 0);
+ len = convert_multibyte_to_widechar(cast(char *)s.text, s.len, NULL, 0);
if (len == 0) {
return make_string16(NULL, 0);
}
text = gb_alloc_array(a, wchar_t, len+1);
- len1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
- cast(char *)s.text, s.len, text, len);
+ len1 = convert_multibyte_to_widechar(cast(char *)s.text, s.len, text, len);
if (len1 == 0) {
gb_free(a, text);
return make_string16(NULL, 0);
@@ -201,16 +247,14 @@ String string16_to_string(gbAllocator a, String16 s) {
return make_string(NULL, 0);
}
- len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,
- s.text, s.len, NULL, 0, NULL, NULL);
+ len = convert_widechar_to_multibyte(s.text, s.len, NULL, 0);
if (len == 0) {
return make_string(NULL, 0);
}
text = gb_alloc_array(a, u8, len+1);
- len1 = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,
- s.text, s.len, cast(char *)text, len, NULL, NULL);
+ len1 = convert_widechar_to_multibyte(s.text, s.len, cast(char *)text, len);
if (len1 == 0) {
gb_free(a, text);
return make_string(NULL, 0);
@@ -236,7 +280,6 @@ String string16_to_string(gbAllocator a, String16 s) {
-
bool unquote_char(String s, u8 quote, Rune *rune, bool *multiple_bytes, String *tail_string) {
u8 c;