|
@@ -228,50 +228,88 @@ bool os_quick_write_utf8_file(const char *path, const char *str, size_t len,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-size_t os_mbs_to_wcs(const char *str, size_t len, wchar_t *dst)
|
|
|
+size_t os_mbs_to_wcs(const char *str, size_t len, wchar_t *dst, size_t dst_size)
|
|
|
{
|
|
|
size_t out_len = dst ? len : mbstowcs(NULL, str, len);
|
|
|
|
|
|
if (len && dst) {
|
|
|
- mbstowcs(dst, str, out_len+1);
|
|
|
+ if (!dst_size)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (out_len) {
|
|
|
+ if ((out_len + 1) > dst_size)
|
|
|
+ out_len = dst_size - 1;
|
|
|
+
|
|
|
+ mbstowcs(dst, str, out_len + 1);
|
|
|
+ }
|
|
|
+
|
|
|
dst[out_len] = 0;
|
|
|
}
|
|
|
|
|
|
return out_len;
|
|
|
}
|
|
|
|
|
|
-size_t os_utf8_to_wcs(const char *str, size_t len, wchar_t *dst)
|
|
|
+size_t os_utf8_to_wcs(const char *str, size_t len, wchar_t *dst,
|
|
|
+ size_t dst_size)
|
|
|
{
|
|
|
size_t in_len = len ? len : strlen(str);
|
|
|
size_t out_len = dst ? len : utf8_to_wchar(str, in_len, NULL, 0, 0);
|
|
|
|
|
|
if (out_len && dst) {
|
|
|
- utf8_to_wchar(str, in_len, dst, out_len+1, 0);
|
|
|
+ if (!dst_size)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (out_len) {
|
|
|
+ if ((out_len + 1) > dst_size)
|
|
|
+ out_len = dst_size - 1;
|
|
|
+
|
|
|
+ utf8_to_wchar(str, in_len, dst, out_len + 1, 0);
|
|
|
+ }
|
|
|
+
|
|
|
dst[out_len] = 0;
|
|
|
}
|
|
|
|
|
|
return out_len;
|
|
|
}
|
|
|
|
|
|
-size_t os_wcs_to_mbs(const wchar_t *str, size_t len, char *dst)
|
|
|
+size_t os_wcs_to_mbs(const wchar_t *str, size_t len, char *dst, size_t dst_size)
|
|
|
{
|
|
|
size_t out_len = dst ? len : wcstombs(NULL, str, len);
|
|
|
|
|
|
if (len && dst) {
|
|
|
- wcstombs(dst, str, out_len+1);
|
|
|
+ if (!dst_size)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (out_len) {
|
|
|
+ if ((out_len + 1) > dst_size)
|
|
|
+ out_len = dst_size - 1;
|
|
|
+
|
|
|
+ wcstombs(dst, str, out_len + 1);
|
|
|
+ }
|
|
|
+
|
|
|
dst[out_len] = 0;
|
|
|
}
|
|
|
|
|
|
return out_len;
|
|
|
}
|
|
|
|
|
|
-size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst)
|
|
|
+size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst,
|
|
|
+ size_t dst_size)
|
|
|
{
|
|
|
size_t in_len = (len != 0) ? len : wcslen(str);
|
|
|
size_t out_len = dst ? len : wchar_to_utf8(str, in_len, NULL, 0, 0);
|
|
|
|
|
|
if (out_len && dst) {
|
|
|
- wchar_to_utf8(str, in_len, dst, out_len+1, 0);
|
|
|
+ if (!dst_size)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if (out_len) {
|
|
|
+ if ((out_len + 1) > dst_size)
|
|
|
+ out_len = dst_size - 1;
|
|
|
+
|
|
|
+ wchar_to_utf8(str, in_len, dst, out_len + 1, 0);
|
|
|
+ }
|
|
|
+
|
|
|
dst[out_len] = 0;
|
|
|
}
|
|
|
|
|
@@ -280,33 +318,34 @@ size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst)
|
|
|
|
|
|
size_t os_mbs_to_wcs_ptr(const char *str, size_t len, wchar_t **pstr)
|
|
|
{
|
|
|
- size_t out_len = os_mbs_to_wcs(str, len, NULL);
|
|
|
+ size_t out_len = os_mbs_to_wcs(str, len, NULL, 0);
|
|
|
|
|
|
- *pstr = bmalloc((out_len+1) * sizeof(wchar_t));
|
|
|
- return os_mbs_to_wcs(str, out_len, *pstr);
|
|
|
+ *pstr = bmalloc((out_len + 1) * sizeof(wchar_t));
|
|
|
+ return os_mbs_to_wcs(str, out_len, *pstr, out_len + 1);
|
|
|
}
|
|
|
|
|
|
size_t os_utf8_to_wcs_ptr(const char *str, size_t len, wchar_t **pstr)
|
|
|
{
|
|
|
- size_t out_len = os_utf8_to_wcs(str, len, NULL);
|
|
|
- *pstr = bmalloc((out_len+1) * sizeof(wchar_t));
|
|
|
- return os_utf8_to_wcs(str, out_len, *pstr);
|
|
|
+ size_t out_len = os_utf8_to_wcs(str, len, NULL, 0);
|
|
|
+
|
|
|
+ *pstr = bmalloc((out_len + 1) * sizeof(wchar_t));
|
|
|
+ return os_utf8_to_wcs(str, out_len, *pstr, out_len + 1);
|
|
|
}
|
|
|
|
|
|
size_t os_wcs_to_mbs_ptr(const wchar_t *str, size_t len, char **pstr)
|
|
|
{
|
|
|
- size_t out_len = os_wcs_to_mbs(str, len, NULL);
|
|
|
+ size_t out_len = os_wcs_to_mbs(str, len, NULL, 0);
|
|
|
|
|
|
- *pstr = bmalloc((out_len+1) * sizeof(char));
|
|
|
- return os_wcs_to_mbs(str, out_len, *pstr);
|
|
|
+ *pstr = bmalloc((out_len + 1) * sizeof(char));
|
|
|
+ return os_wcs_to_mbs(str, out_len, *pstr, out_len + 1);
|
|
|
}
|
|
|
|
|
|
size_t os_wcs_to_utf8_ptr(const wchar_t *str, size_t len, char **pstr)
|
|
|
{
|
|
|
- size_t out_len = os_wcs_to_utf8(str, len, NULL);
|
|
|
+ size_t out_len = os_wcs_to_utf8(str, len, NULL, 0);
|
|
|
|
|
|
- *pstr = bmalloc((out_len+1) * sizeof(char));
|
|
|
- return os_wcs_to_utf8(str, out_len, *pstr);
|
|
|
+ *pstr = bmalloc((out_len + 1) * sizeof(char));
|
|
|
+ return os_wcs_to_utf8(str, out_len, *pstr, out_len + 1);
|
|
|
}
|
|
|
|
|
|
size_t os_utf8_to_mbs_ptr(const char *str, size_t len, char **pstr)
|