X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ficu_I18N.c;h=966410004ede754b6fadf4759bea263d98ddf1d9;hb=0ff1a97b2a69905755b9adb24a474d30f1c52150;hp=f45869add406d1cb0801b6dc44045316d6c92317;hpb=b1b86ad23c4567066de98a476b2a2866f7d83d89;p=pazpar2-moved-to-github.git diff --git a/src/icu_I18N.c b/src/icu_I18N.c index f45869a..9664100 100644 --- a/src/icu_I18N.c +++ b/src/icu_I18N.c @@ -1,4 +1,4 @@ -/* $Id: icu_I18N.c,v 1.19 2007-05-22 07:51:45 adam Exp $ +/* $Id: icu_I18N.c,v 1.23 2007-09-10 16:04:20 adam Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -83,7 +83,6 @@ struct icu_buf_utf16 * icu_buf_utf16_create(size_t capacity) return buf16; }; - struct icu_buf_utf16 * icu_buf_utf16_resize(struct icu_buf_utf16 * buf16, size_t capacity) { @@ -172,8 +171,6 @@ struct icu_buf_utf8 * icu_buf_utf8_resize(struct icu_buf_utf8 * buf8, buf8->utf8 = (uint8_t *) realloc(buf8->utf8, sizeof(uint8_t) * capacity); - buf8->utf8[0] = (uint8_t) 0; - buf8->utf8_len = 0; buf8->utf8_cap = capacity; } else { @@ -206,6 +203,16 @@ struct icu_buf_utf8 * icu_buf_utf8_copy(struct icu_buf_utf8 * dest8, }; +const char *icu_buf_utf8_to_cstr(struct icu_buf_utf8 *src8) +{ + if (!src8 || src8->utf8_len == 0) + return ""; + if (src8->utf8_len == src8->utf8_cap) + src8 = icu_buf_utf8_resize(src8, src8->utf8_len * 2 + 1); + src8->utf8[src8->utf8_len] = '\0'; + return (const char *) src8->utf8; +} + void icu_buf_utf8_destroy(struct icu_buf_utf8 * buf8) { @@ -241,7 +248,7 @@ UErrorCode icu_utf16_from_utf8(struct icu_buf_utf16 * dest16, //if (*status != U_BUFFER_OVERFLOW_ERROR if (U_SUCCESS(*status) - && utf16_len < dest16->utf16_cap) + && utf16_len <= dest16->utf16_cap) dest16->utf16_len = utf16_len; else { dest16->utf16[0] = (UChar) 0; @@ -279,7 +286,7 @@ UErrorCode icu_utf16_from_utf8_cstr(struct icu_buf_utf16 * dest16, // if (*status != U_BUFFER_OVERFLOW_ERROR if (U_SUCCESS(*status) - && utf16_len < dest16->utf16_cap) + && utf16_len <= dest16->utf16_cap) dest16->utf16_len = utf16_len; else { dest16->utf16[0] = (UChar) 0; @@ -316,7 +323,7 @@ UErrorCode icu_utf16_to_utf8(struct icu_buf_utf8 * dest8, //if (*status != U_BUFFER_OVERFLOW_ERROR if (U_SUCCESS(*status) - && utf8_len < dest8->utf8_cap) + && utf8_len <= dest8->utf8_cap) dest8->utf8_len = utf8_len; else { dest8->utf8[0] = (uint8_t) 0; @@ -445,7 +452,7 @@ int icu_utf16_casemap(struct icu_buf_utf16 * dest16, } if (U_SUCCESS(*status) - && dest16_len < dest16->utf16_cap) + && dest16_len <= dest16->utf16_cap) dest16->utf16_len = dest16_len; else { dest16->utf16[0] = (UChar) 0; @@ -769,21 +776,16 @@ struct icu_chain_step * icu_chain_step_create(struct icu_chain * chain, step = (struct icu_chain_step *) malloc(sizeof(struct icu_chain_step)); step->type = type; - step->more_tokens = 0; - step->need_new_token = 1; - if (buf16) - step->buf16 = buf16; - else - step->buf16 = 0; + step->buf16 = buf16; // create auxilary objects switch(step->type) { case ICU_chain_step_type_display: break; - case ICU_chain_step_type_norm: + case ICU_chain_step_type_index: break; - case ICU_chain_step_type_sort: + case ICU_chain_step_type_sortkey: break; case ICU_chain_step_type_casemap: step->u.casemap = icu_casemap_create((char *) chain->locale, @@ -814,9 +816,9 @@ void icu_chain_step_destroy(struct icu_chain_step * step){ switch(step->type) { case ICU_chain_step_type_display: break; - case ICU_chain_step_type_norm: + case ICU_chain_step_type_index: break; - case ICU_chain_step_type_sort: + case ICU_chain_step_type_sortkey: break; case ICU_chain_step_type_casemap: icu_casemap_destroy(step->u.casemap); @@ -936,13 +938,13 @@ struct icu_chain * icu_chain_xml_config(xmlNode *xml_node, (const uint8_t *) "", status); } else if (!strcmp((const char *) node->name, - (const char *) "normal")){ - step = icu_chain_insert_step(chain, ICU_chain_step_type_norm, + (const char *) "index")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_index, (const uint8_t *) "", status); } else if (!strcmp((const char *) node->name, - (const char *) "sort")){ - step = icu_chain_insert_step(chain, ICU_chain_step_type_sort, + (const char *) "sortkey")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_sortkey, (const uint8_t *) "", status); } @@ -986,10 +988,10 @@ struct icu_chain_step * icu_chain_insert_step(struct icu_chain * chain, case ICU_chain_step_type_display: buf16 = src16; break; - case ICU_chain_step_type_norm: + case ICU_chain_step_type_index: buf16 = src16; break; - case ICU_chain_step_type_sort: + case ICU_chain_step_type_sortkey: buf16 = src16; break; case ICU_chain_step_type_casemap: @@ -1054,10 +1056,10 @@ int icu_chain_step_next_token(struct icu_chain * chain, case ICU_chain_step_type_display: icu_utf16_to_utf8(chain->display8, src16, status); break; - case ICU_chain_step_type_norm: + case ICU_chain_step_type_index: icu_utf16_to_utf8(chain->norm8, src16, status); break; - case ICU_chain_step_type_sort: + case ICU_chain_step_type_sortkey: icu_utf16_to_utf8(chain->sort8, src16, status); break; case ICU_chain_step_type_casemap: @@ -1133,6 +1135,7 @@ int icu_chain_assign_cstr(struct icu_chain * chain, while (stp){ stp->more_tokens = 1; + stp->need_new_token = 1; stp = stp->previous; } @@ -1178,7 +1181,7 @@ int icu_chain_get_token_count(struct icu_chain * chain) const char * icu_chain_get_display(struct icu_chain * chain) { if (chain->display8) - return (const char *) chain->display8->utf8; + return icu_buf_utf8_to_cstr(chain->display8); return 0; }; @@ -1186,7 +1189,7 @@ const char * icu_chain_get_display(struct icu_chain * chain) const char * icu_chain_get_norm(struct icu_chain * chain) { if (chain->norm8) - return (const char *) chain->norm8->utf8; + return icu_buf_utf8_to_cstr(chain->norm8); return 0; }; @@ -1194,7 +1197,7 @@ const char * icu_chain_get_norm(struct icu_chain * chain) const char * icu_chain_get_sort(struct icu_chain * chain) { if (chain->sort8) - return (const char *) chain->sort8->utf8; + return icu_buf_utf8_to_cstr(chain->sort8); return 0; };