X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=chise.c;h=e675ff1962c49a0fed682a4f2ee4991a25ff95af;hb=2b6d82f58c6cd059bbf1d77905a945590949baaa;hp=e76f8e12de5f1f9b695c27a76320bbc085e67126;hpb=d3ad2e8a6bd2a7b010077f475e52244352ecaa0c;p=chise%2Flibchise.git diff --git a/chise.c b/chise.c index e76f8e1..e675ff1 100644 --- a/chise.c +++ b/chise.c @@ -1,29 +1,290 @@ +/* Copyright (C) 2003,2004,2005 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_dir[] = CHISE_DB_DIR; +const unsigned char chise_system_db_dir[] = CHISE_SI_DB_DIR; + + +#define xzero(lvalue) ((void) memset (&(lvalue), '\0', sizeof (lvalue))) + + +int +chise_value_size (const CHISE_Value* s) +{ + return s->size; +} -#ifndef HAVE_STRNLEN -/* original in mysql, strings/strnlen.c. -uint strnlen(register const char *s, register uint maxlen) +unsigned char* +chise_value_data (const CHISE_Value* s) { - const char *end= (const char *)memchr(s, '\0', maxlen); - return end ? (uint) (end - s) : maxlen; + return s->data; } -*/ -static inline int -strnlen (register const char *s, register int maxlen) + +unsigned char* +chise_value_to_c_string (const CHISE_Value* s) { - const char *end= (const char *)memchr(s, '\0', maxlen); - return end ? (int) (end - s) : maxlen; + return s->data; } -#endif -#include "chise.h" -#define xzero(lvalue) ((void) memset (&(lvalue), '\0', sizeof (lvalue))) +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) +{ + CONCORD_DS ds = concord_open_ds (type, location, subtype, modemask); + + if (ds == NULL) + return NULL; + + return concord_ds_get_genre (ds, "character"); +} + +int +CHISE_DS_close (CHISE_DS* ds) +{ + return CONCORD_DS_close (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_stroid_set_feature_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_stroid_get_feature_string (key_buf, feature, valdatum); +} + +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_stroid_gets_feature (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_object_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_object_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_set_object_str (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_stroid_set_feature_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_stroid_get_feature_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_stroid_gets_feature (concord_feature_get_name (feature), + property, buf, size); +} + 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 +354,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 +479,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; -}