-/* $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.
return buf16;
};
-
struct icu_buf_utf16 * icu_buf_utf16_resize(struct icu_buf_utf16 * buf16,
size_t capacity)
{
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 {
};
+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)
{
//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;
// 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;
//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;
}
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;
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,
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);
(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);
}
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:
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:
while (stp){
stp->more_tokens = 1;
+ stp->need_new_token = 1;
stp = stp->previous;
}
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;
};
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;
};
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;
};