-/* $Id: icu_I18N.c,v 1.19 2007-05-22 07:51:45 adam Exp $
- Copyright (c) 2006-2007, Index Data.
+/* This file is part of Pazpar2.
+ Copyright (C) 2006-2008 Index Data
- This file is part of Pazpar2.
+Pazpar2 is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
- Pazpar2 is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2, or (at your option) any later
- version.
+Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
- Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- You should have received a copy of the GNU General Public License
- along with Pazpar2; see the file LICENSE. If not, write to the
- Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
*/
#if HAVE_CONFIG_H
-#include "cconfig.h"
+#include <config.h>
#endif
#define USE_TIMING 0
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);
xmlNode *node = 0;
struct icu_chain * chain = 0;
+ xmlChar *xml_id = 0;
+ xmlChar *xml_locale = 0;
if (!xml_node
||xml_node->type != XML_ELEMENT_NODE
return 0;
- xmlChar *xml_id = xmlGetProp(xml_node, (xmlChar *) "id");
- xmlChar *xml_locale = xmlGetProp(xml_node, (xmlChar *) "locale");
+ xml_id = xmlGetProp(xml_node, (xmlChar *) "id");
+ xml_locale = xmlGetProp(xml_node, (xmlChar *) "locale");
if (!xml_id || !strlen((const char *) xml_id)
|| !xml_locale || !strlen((const char *) xml_locale))
for (node = xml_node->children; node; node = node->next)
{
+ xmlChar *xml_rule = 0;
+ struct icu_chain_step * step = 0;
if (node->type != XML_ELEMENT_NODE)
continue;
- xmlChar *xml_rule = xmlGetProp(node, (xmlChar *) "rule");
- struct icu_chain_step * step = 0;
+ xml_rule = xmlGetProp(node, (xmlChar *) "rule");
if (!strcmp((const char *) node->name,
(const char *) "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;
};