예제 #1
0
파일: icu_utf8.c 프로젝트: nla/yaz
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;
}
예제 #2
0
파일: icu_utf16.c 프로젝트: dcrossleyau/yaz
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;
}
예제 #3
0
파일: icu_utf16.c 프로젝트: dcrossleyau/yaz
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;
}
예제 #4
0
파일: icu_casemap.c 프로젝트: nla/yaz
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;
}