UErrorCode icu_utf16_from_utf8_cstr(struct icu_buf_utf16 *dest16, const char *src8cstr, UErrorCode *status) { size_t src8cstr_len = 0; int32_t utf16_len = 0; *status = U_ZERO_ERROR; src8cstr_len = strlen(src8cstr); u_strFromUTF8(dest16->utf16, dest16->utf16_cap, &utf16_len, src8cstr, src8cstr_len, status); /* check for buffer overflow, resize and retry */ if (*status == U_BUFFER_OVERFLOW_ERROR) { icu_buf_utf16_resize(dest16, utf16_len * 2); *status = U_ZERO_ERROR; u_strFromUTF8(dest16->utf16, dest16->utf16_cap, &utf16_len, src8cstr, src8cstr_len, status); } if (U_SUCCESS(*status) && utf16_len <= dest16->utf16_cap) dest16->utf16_len = utf16_len; else icu_buf_utf16_clear(dest16); return *status; }
struct icu_buf_utf16 *icu_buf_utf16_copy(struct icu_buf_utf16 *dest16, const struct icu_buf_utf16 *src16) { if (!dest16 || !src16 || dest16 == src16) return 0; if (dest16->utf16_cap < src16->utf16_len) icu_buf_utf16_resize(dest16, src16->utf16_len * 2); u_strncpy(dest16->utf16, src16->utf16, src16->utf16_len); dest16->utf16_len = src16->utf16_len; return dest16; }
struct icu_buf_utf16 *icu_buf_utf16_append(struct icu_buf_utf16 *dest16, const struct icu_buf_utf16 *src16) { assert(dest16); if (!src16) return dest16; if (dest16 == src16) return 0; if (dest16->utf16_cap <= src16->utf16_len + dest16->utf16_len) icu_buf_utf16_resize(dest16, dest16->utf16_len + src16->utf16_len * 2); u_strncpy(dest16->utf16 + dest16->utf16_len, src16->utf16, src16->utf16_len); dest16->utf16_len += src16->utf16_len; return dest16; }
int icu_utf16_casemap(struct icu_buf_utf16 *dest16, struct icu_buf_utf16 *src16, const char *locale, char action, UErrorCode *status) { int32_t dest16_len = 0; if (!src16->utf16_len) { /* guarding for empty source string */ if (dest16->utf16) dest16->utf16[0] = (UChar) 0; dest16->utf16_len = 0; return U_ZERO_ERROR; } dest16_len = icu_utf16_sub(dest16, src16, locale, action, status); /* check for buffer overflow, resize and retry */ if (*status == U_BUFFER_OVERFLOW_ERROR && dest16 != src16) /* do not resize if in-place conversion */ { icu_buf_utf16_resize(dest16, dest16_len * 2); *status = U_ZERO_ERROR; icu_utf16_sub(dest16, src16, locale, action, status); } if (U_SUCCESS(*status) && dest16_len <= dest16->utf16_cap) dest16->utf16_len = dest16_len; else { if (dest16->utf16) dest16->utf16[0] = (UChar) 0; dest16->utf16_len = 0; } return *status; }