X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Ficu_utf16.c;h=3036d0aadc7a75202db2fdf7b757a69dc3869f7f;hp=66f584e3bbd45844706dd3296f4f79dd485cd6fe;hb=cf0d647d4a642af04013d09f412e8629897187c5;hpb=9c0e939209ea21db376876168faa4e6563d3ac16 diff --git a/src/icu_utf16.c b/src/icu_utf16.c index 66f584e..3036d0a 100644 --- a/src/icu_utf16.c +++ b/src/icu_utf16.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. */ @@ -22,29 +22,29 @@ #include #include #include +#include #include /* some more string fcns*/ #include /* char names */ -struct icu_buf_utf16 * icu_buf_utf16_create(size_t capacity) +struct icu_buf_utf16 *icu_buf_utf16_create(size_t capacity) { - struct icu_buf_utf16 * buf16 + struct icu_buf_utf16 *buf16 = (struct icu_buf_utf16 *) xmalloc(sizeof(struct icu_buf_utf16)); - buf16->utf16 = 0; buf16->utf16_len = 0; - buf16->utf16_cap = 0; - + buf16->utf16_cap = capacity; if (capacity > 0) { buf16->utf16 = (UChar *) xmalloc(sizeof(UChar) * capacity); buf16->utf16[0] = (UChar) 0; - buf16->utf16_cap = capacity; } + else + buf16->utf16 = 0; return buf16; } -struct icu_buf_utf16 * icu_buf_utf16_clear(struct icu_buf_utf16 * buf16) +struct icu_buf_utf16 *icu_buf_utf16_clear(struct icu_buf_utf16 *buf16) { if (buf16) { @@ -55,37 +55,32 @@ struct icu_buf_utf16 * icu_buf_utf16_clear(struct icu_buf_utf16 * buf16) return buf16; } -struct icu_buf_utf16 * icu_buf_utf16_resize(struct icu_buf_utf16 * buf16, - size_t capacity) +struct icu_buf_utf16 *icu_buf_utf16_resize(struct icu_buf_utf16 *buf16, + size_t capacity) { if (!buf16) return 0; - - if (capacity > 0) + + if (capacity > 0) { if (0 == buf16->utf16) buf16->utf16 = (UChar *) xmalloc(sizeof(UChar) * capacity); else - buf16->utf16 + buf16->utf16 = (UChar *) xrealloc(buf16->utf16, sizeof(UChar) * capacity); - - icu_buf_utf16_clear(buf16); - buf16->utf16_cap = capacity; - } + } else { xfree(buf16->utf16); buf16->utf16 = 0; - buf16->utf16_len = 0; - buf16->utf16_cap = 0; } - + buf16->utf16_cap = capacity; return buf16; } -struct icu_buf_utf16 * icu_buf_utf16_copy(struct icu_buf_utf16 * dest16, - const struct icu_buf_utf16 * src16) +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; @@ -99,13 +94,49 @@ struct icu_buf_utf16 * icu_buf_utf16_copy(struct icu_buf_utf16 * dest16, return dest16; } -void icu_buf_utf16_destroy(struct icu_buf_utf16 * buf16) + +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; +} + + +void icu_buf_utf16_destroy(struct icu_buf_utf16 *buf16) { if (buf16) xfree(buf16->utf16); xfree(buf16); } +void icu_buf_utf16_log(const char *lead, struct icu_buf_utf16 *src16) +{ + if (src16) + { + struct icu_buf_utf8 *dst8 = icu_buf_utf8_create(0); + UErrorCode status = U_ZERO_ERROR; + icu_utf16_to_utf8(dst8, src16, &status); + yaz_log(YLOG_LOG, "%s=%s", lead, dst8->utf8); + icu_buf_utf8_destroy(dst8); + } + else + { + yaz_log(YLOG_LOG, "%s=NULL", lead); + } +} #endif /* YAZ_HAVE_ICU */