X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ficu_I18N.c;h=1d08d5a11acdee1526db009beeaa75cd240bf143;hb=2fdbd5de9185e926401609c22b328f07af0248bd;hp=29b9edda834905110d9b4777d18dcec3617e0715;hpb=968c591d366c50df78a3dda223fdb3491cbcb6cd;p=pazpar2-moved-to-github.git diff --git a/src/icu_I18N.c b/src/icu_I18N.c index 29b9edd..1d08d5a 100644 --- a/src/icu_I18N.c +++ b/src/icu_I18N.c @@ -1,4 +1,4 @@ -/* $Id: icu_I18N.c,v 1.17 2007-05-20 19:00:17 marc Exp $ +/* $Id: icu_I18N.c,v 1.22 2007-05-25 13:27:21 marc Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -687,6 +687,7 @@ struct icu_normalizer * icu_normalizer_create(const char *rules, char action, UTRANS_FORWARD, 0, 0, normalizer->parse_error, status); + // yaz_log(YLOG_LOG, "utrans_open %p", normalizer->trans); break; case 'r': normalizer->trans @@ -695,6 +696,7 @@ struct icu_normalizer * icu_normalizer_create(const char *rules, char action, UTRANS_REVERSE , 0, 0, normalizer->parse_error, status); + // yaz_log(YLOG_LOG, "utrans_open %p", normalizer->trans); break; default: *status = U_UNSUPPORTED_ERROR; @@ -716,7 +718,10 @@ void icu_normalizer_destroy(struct icu_normalizer * normalizer){ if (normalizer->rules16) icu_buf_utf16_destroy(normalizer->rules16); if (normalizer->trans) + { + // yaz_log(YLOG_LOG, "utrans_close %p", normalizer->trans); utrans_close(normalizer->trans); + } free(normalizer); } }; @@ -764,21 +769,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, @@ -809,9 +809,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); @@ -828,8 +828,7 @@ void icu_chain_step_destroy(struct icu_chain_step * step){ default: break; } - - + free(step); }; @@ -862,16 +861,100 @@ struct icu_chain * icu_chain_create(const uint8_t * identifier, void icu_chain_destroy(struct icu_chain * chain) { - icu_buf_utf8_destroy(chain->display8); - icu_buf_utf8_destroy(chain->norm8); - icu_buf_utf8_destroy(chain->sort8); + if (chain){ + icu_buf_utf8_destroy(chain->display8); + icu_buf_utf8_destroy(chain->norm8); + icu_buf_utf8_destroy(chain->sort8); + + icu_buf_utf16_destroy(chain->src16); + + icu_chain_step_destroy(chain->steps); + free(chain); + } +}; + + + +struct icu_chain * icu_chain_xml_config(xmlNode *xml_node, + UErrorCode * status){ + + xmlNode *node = 0; + struct icu_chain * chain = 0; + + if (!xml_node + ||xml_node->type != XML_ELEMENT_NODE + || strcmp((const char *) xml_node->name, "icu_chain")) + + return 0; + + xmlChar *xml_id = xmlGetProp(xml_node, (xmlChar *) "id"); + xmlChar *xml_locale = xmlGetProp(xml_node, (xmlChar *) "locale"); + + if (!xml_id || !strlen((const char *) xml_id) + || !xml_locale || !strlen((const char *) xml_locale)) + return 0; + + chain = icu_chain_create((const uint8_t *) xml_id, + (const uint8_t *) xml_locale); + + xmlFree(xml_id); + xmlFree(xml_locale); + if (!chain) + return 0; + + for (node = xml_node->children; node; node = node->next) + { + if (node->type != XML_ELEMENT_NODE) + continue; + + xmlChar *xml_rule = xmlGetProp(node, (xmlChar *) "rule"); + struct icu_chain_step * step = 0; + + if (!strcmp((const char *) node->name, + (const char *) "casemap")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_casemap, + (const uint8_t *) xml_rule, status); + } + else if (!strcmp((const char *) node->name, + (const char *) "normalize")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_normalize, + (const uint8_t *) xml_rule, status); + } + else if (!strcmp((const char *) node->name, + (const char *) "tokenize")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_tokenize, + (const uint8_t *) xml_rule, status); + } + else if (!strcmp((const char *) node->name, + (const char *) "display")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_display, + (const uint8_t *) "", status); + } + else if (!strcmp((const char *) node->name, + (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 *) "sortkey")){ + step = icu_chain_insert_step(chain, ICU_chain_step_type_sortkey, + (const uint8_t *) "", status); + } - icu_buf_utf16_destroy(chain->src16); + xmlFree(xml_rule); + if (!step || U_FAILURE(*status)){ + icu_chain_destroy(chain); + return 0; + } + - icu_chain_step_destroy(chain->steps); + } + + return chain; }; + struct icu_chain_step * icu_chain_insert_step(struct icu_chain * chain, enum icu_chain_step_type type, const uint8_t * rule, @@ -898,10 +981,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: @@ -966,10 +1049,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: @@ -1031,10 +1114,12 @@ int icu_chain_assign_cstr(struct icu_chain * chain, const char * src8cstr, UErrorCode *status) { - struct icu_chain_step * stp = chain->steps; + struct icu_chain_step * stp = 0; if (!chain || !src8cstr) return 0; + + stp = chain->steps; // clear token count chain->token_count = 0; @@ -1043,6 +1128,7 @@ int icu_chain_assign_cstr(struct icu_chain * chain, while (stp){ stp->more_tokens = 1; + stp->need_new_token = 1; stp = stp->previous; }