X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fcharacter.c;h=96ce01e154c3218b75b52ffdda5b57c0a5e13870;hb=45e5ec16068aec42d4547ee5cb1871a63c6ee195;hp=51b65a6af1d7c3a50aa5b8e76a91bf02a9ca2657;hpb=4ce6e0ae9307dfffbb8e1e29eeed910046e13c4d;p=m17n%2Fm17n-lib.git diff --git a/src/character.c b/src/character.c index 51b65a6..96ce01e 100644 --- a/src/character.c +++ b/src/character.c @@ -17,7 +17,7 @@ You should have received a copy of the GNU Lesser General Public License along with the m17n library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 02111-1307, USA. */ /***en @@ -95,26 +95,13 @@ free_string (int from, int to, void *str, void *arg) int mchar__init () { - char_prop_list = mplist (); - - Mname - = mchar_define_property ("name", Mstring); - Mcategory - = mchar_define_property ("category", Msymbol); - Mcombining_class - = mchar_define_property ("combining-class", Minteger); - Mbidi_category - = mchar_define_property ("bidirectional-category", Msymbol); - Msimple_case_folding - = mchar_define_property ("simple-case-folding", Minteger); - Mcomplicated_case_folding - = mchar_define_property ("complicated-case-folding", Mtext); - Mscript - = mchar_define_property ("script", Msymbol); - - mchar_define_property ("cased", Minteger); - mchar_define_property ("soft-dotted", Msymbol); - mchar_define_property ("case-mapping", Mplist); + Mname = msymbol ("name"); + Mcategory = msymbol ("category"); + Mcombining_class = msymbol ("combining-class"); + Mbidi_category = msymbol ("bidirectional-category"); + Msimple_case_folding = msymbol ("simple-case-folding"); + Mcomplicated_case_folding = msymbol ("complicated-case-folding"); + Mscript = msymbol ("script"); return 0; } @@ -124,21 +111,61 @@ mchar__fini (void) { MPlist *p; - for (p = char_prop_list; mplist_key (p) != Mnil; p = mplist_next (p)) + if (char_prop_list) { - MCharPropRecord *record = mplist_value (p); - - if (record->table) + for (p = char_prop_list; mplist_key (p) != Mnil; p = mplist_next (p)) { - if (record->type == Mstring) - mchartable_map (record->table, NULL, free_string, NULL); - M17N_OBJECT_UNREF (record->table); + MCharPropRecord *record = mplist_value (p); + + if (record->table) + { + if (record->type == Mstring) + mchartable_map (record->table, NULL, free_string, NULL); + M17N_OBJECT_UNREF (record->table); + } + free (record); } - free (record); + M17N_OBJECT_UNREF (char_prop_list); + } +} + +void +mchar__define_prop (MSymbol key, MSymbol type, void *mdb) +{ + MCharPropRecord *record; + + if (char_prop_list) + record = mplist_get (char_prop_list, key); + else + char_prop_list = mplist (), record = NULL; + if (record) + { + if (record->table) + M17N_OBJECT_UNREF (record->table); + } + else + { + MSTRUCT_CALLOC (record, MERROR_CHAR); + mplist_put (char_prop_list, key, record); + } + + record->type = type; + record->mdb = mdb; + if (mdb) + { + record->table = NULL; + } + else + { + void *default_value = NULL; + + if (type == Minteger) + default_value = (void *) -1; + record->table = mchartable (type, default_value); } - M17N_OBJECT_UNREF (char_prop_list); } + /*** @} */ #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */ @@ -378,36 +405,13 @@ MSymbol mchar_define_property (const char *name, MSymbol type) { MSymbol key = msymbol (name); - MCharPropRecord *record; + void *mdb; - record = mplist_get (char_prop_list, key); - if (record) - { - if (record->table) - M17N_OBJECT_UNREF (record->table); - } + if (mdatabase__finder) + mdb = (*mdatabase__finder) (Mchar_table, type, key, Mnil); else - { - MSTRUCT_CALLOC (record, MERROR_CHAR); - mplist_put (char_prop_list, key, record); - } - - record->type = type; - if (mdatabase__finder - && (record->mdb = (*mdatabase__finder) (Mchar_table, type, key, Mnil))) - { - record->table = NULL; - } - else - { - void *default_value = NULL; - - record->mdb = NULL; - if (type == Minteger) - default_value = (void *) -1; - record->table = mchartable (type, default_value); - } - + mdb = NULL; + mchar__define_prop (key, type, mdb); return key; } @@ -448,6 +452,8 @@ mchar_get_prop (int c, MSymbol key) { MCharPropRecord *record; + if (! char_prop_list) + return NULL; record = mplist_get (char_prop_list, key); if (! record) return NULL; @@ -493,6 +499,8 @@ mchar_put_prop (int c, MSymbol key, void *val) { MCharPropRecord *record; + if (! char_prop_list) + MERROR (MERROR_CHAR, -1); record = mplist_get (char_prop_list, key); if (! record) return -1; @@ -538,6 +546,8 @@ mchar_get_prop_table (MSymbol key, MSymbol *type) { MCharPropRecord *record; + if (! char_prop_list) + return NULL; record = mplist_get (char_prop_list, key); if (! record) return NULL;