X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=chise.c;h=2ac1ebbcb5420365a4ef3c5fdb86cfde7d08bf18;hb=04f25c3dac6e46dc936f54531ff614b5a2b29a49;hp=e76f8e12de5f1f9b695c27a76320bbc085e67126;hpb=d3ad2e8a6bd2a7b010077f475e52244352ecaa0c;p=chise%2Flibchise.git diff --git a/chise.c b/chise.c index e76f8e1..2ac1ebb 100644 --- a/chise.c +++ b/chise.c @@ -1,29 +1,335 @@ +/* Copyright (C) 2003,2004,2005,2011 MORIOKA Tomohiko + This file is part of the CHISE Library. + + The CHISE Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The CHISE Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the CHISE Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include +#include #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include "sysdep.h" +#include "chise.h" + +const unsigned char chise_db_format_version[] = CHISE_DB_FORMAT_VERSION; +const unsigned char chise_db_dir[] = CHISE_DB_DIR; +const unsigned char chise_system_db_dir[] = CHISE_SI_DB_DIR; + + +#define xzero(lvalue) ((void) memset (&(lvalue), '\0', sizeof (lvalue))) -#ifndef HAVE_STRNLEN -/* original in mysql, strings/strnlen.c. -uint strnlen(register const char *s, register uint maxlen) + +int +chise_value_size (const CHISE_Value* s) { - const char *end= (const char *)memchr(s, '\0', maxlen); - return end ? (uint) (end - s) : maxlen; + return s->size; } -*/ -static inline int -strnlen (register const char *s, register int maxlen) + +unsigned char* +chise_value_data (const CHISE_Value* s) { - const char *end= (const char *)memchr(s, '\0', maxlen); - return end ? (int) (end - s) : maxlen; + return s->data; } + +unsigned char* +chise_value_to_c_string (const CHISE_Value* s) +{ + return s->data; +} + + +CHISE_Char_ID +chise_char_id_parse_c_string (unsigned char *str, size_t len); + +int +chise_format_char_id (CHISE_Char_ID cid, unsigned char *dest, size_t len); + + +CHISE_DS* +CHISE_DS_open (CHISE_DS_Type type, const unsigned char* location, + int subtype, int modemask) +{ +#if 0 + CONCORD_DS ds = concord_open_ds (type, location, subtype, modemask); +#else + CONCORD_DS ds = concord_open_env (location); #endif -#include "chise.h" + if (ds == NULL) + return NULL; + + return concord_ds_get_genre (ds, "character"); +} + +int +CHISE_DS_close (CHISE_DS* ds) +{ + return concord_close_ds (concord_genre_get_data_source (ds)); +} + +unsigned char* +chise_ds_location (CHISE_DS* ds) +{ + return concord_ds_location (concord_genre_get_data_source (ds)); +} + +CHISE_Feature +chise_ds_get_feature (CHISE_DS* ds, const unsigned char* name) +{ + return concord_genre_get_feature (ds, name); +} + +CHISE_CCS +chise_ds_get_ccs (CHISE_DS* ds, const unsigned char* name) +{ + return concord_genre_get_index (ds, name); +} + +CHISE_Property +chise_ds_get_property (CHISE_DS* ds, const unsigned char* name) +{ + CONCORD_Genre genre + = concord_ds_get_genre (concord_genre_get_data_source (ds), + "feature"); + + if (genre == NULL) + return NULL; + + return concord_genre_get_feature (genre, name); +} + +int +chise_ds_foreach_char_feature_name (CHISE_DS* ds, + int (*func) (CHISE_DS* ds, + unsigned char* name)) +{ + return concord_genre_foreach_feature_name (ds, func); +} + +int +chise_feature_setup_db (CHISE_Feature feature, int writable) +{ + return concord_feature_setup_db (feature, writable); +} + +int +chise_feature_sync (CHISE_Feature feature) +{ + return concord_feature_sync (feature); +} + +int +chise_char_set_feature_value (CHISE_Char_ID cid, + CHISE_Feature feature, + unsigned char* value) +{ + unsigned char key_buf[8]; + + chise_format_char_id (cid, key_buf, 8); + return concord_obj_put_feature_value_str (key_buf, feature, value); +} + +int +chise_char_load_feature_value (CHISE_Char_ID cid, + CHISE_Feature feature, + CHISE_Value* valdatum) +{ + unsigned char key_buf[8]; + + chise_format_char_id (cid, key_buf, 8); + return concord_obj_get_feature_value_string (key_buf, feature, valdatum); +} + +int +chise_char_load_decomposition (CHISE_Char_ID cid, + CHISE_Feature feature, + CHISE_Char_ID* base_char, CHISE_Char_ID* comb_char) +{ + unsigned char key_buf[8]; + CHISE_Value value; + int status; + unsigned char* vp; + unsigned char* vp_ret; + int len; + + chise_format_char_id (cid, key_buf, 8); + if ( status = concord_obj_get_feature_value_string (key_buf, feature, &value) ) + return status; + len = chise_value_size (&value); + if ( len < (1 + 2 + 1 + 2 + 1) ) + return -1; + + vp = chise_value_data (&value); + if ( *vp++ != '(' ) + return -1; + len--; + + if ( ( vp_ret = memchr (vp, ' ', len) ) == NULL ) + return -1; + *base_char = chise_char_id_parse_c_string (vp, vp_ret - vp + 1); + if ( *base_char == -1 ) + return -1; + vp = vp_ret + 1; + len -= vp - chise_value_data (&value); + if ( len <= 1 ) + return -1; + + *comb_char = chise_char_id_parse_c_string (vp, len); + if ( *comb_char == -1 ) + return -1; + return 0; +} + +unsigned char* +chise_char_gets_feature_value (CHISE_Char_ID cid, + CHISE_Feature feature, + unsigned char* dst, size_t size) +{ + unsigned char key_buf[8]; + + chise_format_char_id (cid, key_buf, 8); + return concord_obj_gets_feature_value (key_buf, feature, dst, size); +} + +static int +(*chise_feature_for_a_char_with_value_func) (CHISE_Char_ID cid, + CHISE_Feature feature, + CHISE_Value* valdatum); + +int +chise_feature_foreach_char_with_value_wrapper (CONCORD_String object_id, + CONCORD_Feature feature, + CONCORD_String value); +int +chise_feature_foreach_char_with_value_wrapper (CONCORD_String object_id, + CONCORD_Feature feature, + CONCORD_String value) +{ + unsigned char* cid_str = CONCORD_String_data (object_id); + int cid_len = strnlen (cid_str, CONCORD_String_size (object_id)); + CHISE_Char_ID cid = chise_char_id_parse_c_string (cid_str, cid_len); + + return chise_feature_for_a_char_with_value_func (cid, feature, value); +} + +int +chise_feature_foreach_char_with_value (CHISE_Feature feature, + int (*func) (CHISE_Char_ID cid, + CHISE_Feature feature, + CHISE_Value* valdatum)) +{ + chise_feature_for_a_char_with_value_func = func; + return + concord_feature_foreach_obj_string + (feature, &chise_feature_foreach_char_with_value_wrapper); +} + + +int +chise_ccs_setup_db (CHISE_CCS ccs, int writable) +{ + return concord_index_setup_db (ccs, writable); +} + +int +chise_ccs_sync (CHISE_CCS ccs) +{ + return concord_index_sync (ccs); +} + +CHISE_Char_ID +chise_ccs_decode (CHISE_CCS ccs, int code_point) +{ + char key_buf[16]; + CONCORD_String_Tank value; + int status; + + sprintf(key_buf, "%d", code_point); + status = concord_index_strid_get_obj_string (ccs, key_buf, &value); + if (!status) + { + unsigned char *str + = (unsigned char *)CONCORD_String_data (&value); + int len = strnlen (str, CONCORD_String_size (&value)); + + return chise_char_id_parse_c_string (str, len); + } + return -1; +} + +int +chise_ccs_set_decoded_char (CHISE_CCS ccs, + int code_point, CHISE_Char_ID cid) +{ + char key_buf[16], val_buf[8]; + + sprintf(key_buf, "%d", code_point); + chise_format_char_id (cid, val_buf, 8); + return concord_index_strid_put_obj (ccs, key_buf, val_buf); +} + + +int +chise_property_setup_db (CHISE_Property property, int writable) +{ + return concord_feature_setup_db (property, writable); +} + +int +chise_property_sync (CHISE_Property property) +{ + return concord_feature_sync (property); +} + +int +chise_feature_set_property_value (CHISE_Feature feature, + CHISE_Property property, + unsigned char* value) +{ + return + concord_obj_put_feature_value_str + (concord_feature_get_name (feature), property, value); +} + +int +chise_feature_load_property_value (CHISE_Feature feature, + CHISE_Property property, + CHISE_Value* valdatum) +{ + return + concord_obj_get_feature_value_string + (concord_feature_get_name (feature), property, valdatum); +} + +unsigned char* +chise_feature_gets_property_value (CHISE_Feature feature, + CHISE_Property property, + unsigned char* buf, size_t size) +{ + return + concord_obj_gets_feature_value (concord_feature_get_name (feature), + property, buf, size); +} -#define xzero(lvalue) ((void) memset (&(lvalue), '\0', sizeof (lvalue))) CHISE_Char_ID -chise_char_id_parse_c_string (unsigned char *str, int len) +chise_char_id_parse_c_string (unsigned char *str, size_t len) { int i = 0; @@ -93,7 +399,7 @@ chise_char_id_parse_c_string (unsigned char *str, int len) } int -chise_format_char_id (CHISE_Char_ID cid, unsigned char *dest, int len) +chise_format_char_id (CHISE_Char_ID cid, unsigned char *dest, size_t len) { int i = 0; @@ -218,237 +524,3 @@ chise_format_char_id (CHISE_Char_ID cid, unsigned char *dest, int len) return i; } } - -int -chise_open_data_source (CHISE_DS *ds, CHISE_DS_Type type, char *location) -{ - ds->type = type; - ds->location = location; - return 0; -} - -int -chise_close_data_source (CHISE_DS *ds) -{ - ds->type = CHISE_DS_NONE; - ds->location = NULL; - return 0; -} - - -int -chise_open_decoding_table (CHISE_Decoding_Table **db, - CHISE_DS *ds, const char *ccs, - DBTYPE real_subtype, - u_int32_t accessmask, int modemask) -{ - return - chise_open_attribute_table (db, ds->location, - ccs, "system-char-id", - real_subtype, accessmask, modemask); -} - -int -chise_close_decoding_table (CHISE_Decoding_Table *db) -{ - if (db) - return chise_close_attribute_table (db); - return -1; -} - -CHISE_Char_ID -chise_dt_get_char (CHISE_Decoding_Table *db, int code_point) -{ - CHISE_Value valdatum; - int status = 0; - char key_buf[16]; - - sprintf(key_buf, "%d", code_point); - status = chise_get_attribute_table (db, key_buf, &valdatum); - if (!status) - { - unsigned char *str - = (unsigned char *)chise_value_data (&valdatum); - int len = strnlen (str, chise_value_size (&valdatum)); - - return chise_char_id_parse_c_string (str, len); - } - return -1; -} - -int -chise_dt_put_char (CHISE_Decoding_Table *db, - int code_point, CHISE_Char_ID cid) -{ - CHISE_Value valdatum; - char key_buf[16], val_buf[8]; - - sprintf(key_buf, "%d", code_point); - chise_format_char_id (cid, val_buf, 8); - return chise_put_attribute_table (db, key_buf, val_buf); -} - - - -int -chise_open_feature_table (CHISE_Feature_Table **db, - CHISE_DS *ds, const char *feature, - DBTYPE real_subtype, - u_int32_t accessmask, int modemask) -{ - return - chise_open_attribute_table (db, ds->location, - "system-char-id", feature, - real_subtype, accessmask, modemask); -} - -int -chise_close_feature_table (CHISE_Feature_Table *db) -{ - if (db) - return chise_close_attribute_table (db); - return -1; -} - -int -chise_ft_get_value (CHISE_Feature_Table *db, - CHISE_Char_ID cid, CHISE_Value *valdatum) -{ - unsigned char key_buf[8]; - - chise_format_char_id (cid, key_buf, 8); - return chise_get_attribute_table (db, key_buf, valdatum); -} - -void -chise_ft_iterate (CHISE_Feature_Table *dbp, - int (*func) (CHISE_Feature_Table *db, - CHISE_Char_ID cid, CHISE_Value *valdatum)) -{ - DBT keydatum, valdatum; - DBC *dbcp; - int status; - - xzero (keydatum); - xzero (valdatum); - - status = dbp->cursor (dbp, NULL, &dbcp, 0); - for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST); - status == 0; - status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT)) - { - unsigned char *key_str = (unsigned char *)keydatum.data; - int key_len = strnlen (key_str, keydatum.size); - CHISE_Char_ID key = chise_char_id_parse_c_string (key_str, key_len); - int ret; - - if (ret = func (dbp, key, &valdatum)) - break; - } - dbcp->c_close (dbcp); -} - -int -chise_open_attribute_table (CHISE_Attribute_Table **db, - const char *db_dir, - const char *encoding, const char *feature, - DBTYPE real_subtype, - u_int32_t accessmask, int modemask) -{ - DB* dbase; - int status; - int len, flen, i; - int size; - char *db_file_name, *sp; - - status = db_create (&dbase, NULL, 0); - if (status) - return -1; - - len = strlen (db_dir); - flen = strlen (feature); - size = len + strlen (encoding) + flen * 3 + 4; - db_file_name = alloca (size); - strcpy (db_file_name, db_dir); - if (db_file_name[len - 1] != '/') - { - db_file_name[len++] = '/'; - db_file_name[len] = '\0'; - } - strcat (db_file_name, encoding); - strcat (db_file_name, "/"); - /* strcat (db_file_name, feature); */ - sp = &db_file_name[strlen (db_file_name)]; - for (i = 0; i < flen; i++) - { - int c = feature[i]; - - if ( (c == '/') || (c == '%') ) - { - sprintf (sp, "%%%02X", c); - sp += 3; - } - else - *sp++ = c; - } - *sp = '\0'; - status = dbase->open (dbase, db_file_name, NULL, - real_subtype, accessmask, modemask); - if (status) - { - dbase->close (dbase, 0); - return -1; - } - *db = dbase; - return 0; -} - -int -chise_close_attribute_table (CHISE_Attribute_Table *db) -{ - if (db) - { - db->sync (db, 0); - db->close (db, 0); - } - return 0; -} - -int -chise_get_attribute_table (CHISE_Attribute_Table *db, - char *key, CHISE_Value *valdatum) -{ - DBT keydatum; - int status = 0; - - /* DB Version 2 requires DBT's to be zeroed before use. */ - xzero (keydatum); - xzero (*valdatum); - - keydatum.data = key; - keydatum.size = strlen (key); - - status = db->get (db, NULL, &keydatum, valdatum, 0); - return status; -} - -int -chise_put_attribute_table (CHISE_Attribute_Table *db, - char *key, char *value) -{ - DBT keydatum, valdatum; - int status = 0; - - /* DB Version 2 requires DBT's to be zeroed before use. */ - xzero (keydatum); - xzero (valdatum); - - keydatum.data = key; - keydatum.size = strlen (key); - - valdatum.data = value; - valdatum.size = strlen (value); - - status = db->put (db, NULL, &keydatum, &valdatum, 0); - return status; -}