Moriyoshi Koizumi
moriy****@users*****
2002年 12月 31日 (火) 04:37:50 JST
moriyoshi 02/12/31 04:37:50 Modified: . mbfl.def mbfl mbfl_arraylist.h mbfl_collection.h mbfl_language.c mbfl_language.h mbfl_list.h nls nls_de.c nls_en.c nls_ja.c nls_kr.c nls_ru.c nls_uni.c nls_zh.c Log: Set mbfl_language_id free from hard-coded enums Revision Changes Path 1.5 +2 -0 libmbfl/mbfl.def Index: mbfl.def =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/mbfl.def,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mbfl.def 30 Dec 2002 19:33:35 -0000 1.4 +++ mbfl.def 30 Dec 2002 19:37:50 -0000 1.5 @@ -91,3 +91,5 @@ _mbfl_arraylist_ctor @86 __mbfl_arraylist_dtor @87 _mbfl_iterator_free @88 + _mbfl_register_language @89 + _mbfl_language_id_uni @90 1.3 +1 -0 libmbfl/mbfl/mbfl_arraylist.h Index: mbfl_arraylist.h =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/mbfl/mbfl_arraylist.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- mbfl_arraylist.h 30 Dec 2002 19:02:12 -0000 1.2 +++ mbfl_arraylist.h 30 Dec 2002 19:37:50 -0000 1.3 @@ -23,6 +23,7 @@ #define mbfl_arraylist_remove(a, b, c) mbfl_list_remove(&((a)->_super),(b), (c)) #define mbfl_arraylist_contains(a, b, c) mbfl_list_contains(&((a)->_super),(b), (c)) #define mbfl_arraylist_create_iter(a) mbfl_list_create_iter(&((a)->_super)) +#define mbfl_arraylist_get_num_items(a) mbfl_list_get_num_items(&((a)->_super)) #define mbfl_arraylist_insert_item_at(a, b, c, d, e) mbfl_list_insert_item_at(&((a)->_super), (b), (c), (d), (e)) #define mbfl_arraylist_update_item_at(a, b, c, d, e) mbfl_list_update_item_at(&((a)->_super), (b), (c), (d), (e)) #define mbfl_arraylist_get_item_at(a, b, c, d) mbfl_list_get_item_at(&((a)->_super), (b), (c), (d)) 1.2 +1 -0 libmbfl/mbfl/mbfl_collection.h Index: mbfl_collection.h =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/mbfl/mbfl_collection.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- mbfl_collection.h 29 Dec 2002 06:41:49 -0000 1.1 +++ mbfl_collection.h 30 Dec 2002 19:37:50 -0000 1.2 @@ -28,6 +28,7 @@ #define mbfl_collection_contains(a, b, c) (a)->contains_op((a), (b), (c)) #define mbfl_collection_create_iter(a) (a)->create_iter_op((a)) #define mbfl_collection_dtor(a) (a)->dtor(a) +#define mbfl_collection_get_num_items(a) (a)->num_items MBFLAPI int mbfl_collection_ctor(mbfl_collection *); MBFLAPI void _mbfl_collection_dtor(mbfl_collection *); 1.7 +96 -50 libmbfl/mbfl/mbfl_language.c Index: mbfl_language.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/mbfl/mbfl_language.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- mbfl_language.c 25 Dec 2002 20:54:13 -0000 1.6 +++ mbfl_language.c 30 Dec 2002 19:37:50 -0000 1.7 @@ -48,8 +48,12 @@ #include <strings.h> #endif +#include <assert.h> + #include "mbfl_encoding.h" #include "mbfl_language.h" +#include "mbfl_arraylist.h" +#include "private.h" #include "nls/nls_ja.h" #include "nls/nls_kr.h" @@ -65,70 +69,115 @@ #endif #endif +static const mbfl_language * mbfl_get_language_by_name_internal(const char *name, mbfl_language_id *pretval_id); + +static int mbfl_language_tbl_initialized = 0; +static mbfl_arraylist mbfl_language_tbl; + +MBFLAPI mbfl_language_id mbfl_language_id_uni; + +int mbfl_language_tbl_init(void) +{ + int err; + + mbfl_arraylist_ctor(&mbfl_language_tbl); + mbfl_language_tbl_initialized = 1; + + (err = mbfl_register_language(&mbfl_language_uni, &mbfl_language_id_uni)) || + (err = mbfl_register_language(&mbfl_language_japanese, NULL)) || + (err = mbfl_register_language(&mbfl_language_korean, NULL)) || + (err = mbfl_register_language(&mbfl_language_simplified_chinese, NULL)) || + (err = mbfl_register_language(&mbfl_language_traditional_chinese, NULL)) || + (err = mbfl_register_language(&mbfl_language_english, NULL)) || + (err = mbfl_register_language(&mbfl_language_german, NULL)) || + (err = mbfl_register_language(&mbfl_language_russian, NULL)) || 1; + + return err; +} + +void mbfl_language_tbl_cleanup(void) +{ + assert(mbfl_language_tbl_initialized); + mbfl_arraylist_dtor(&mbfl_language_tbl); +} + +MBFLAPI int mbfl_register_language(const mbfl_language *lang, mbfl_language_id *plangid) +{ + int next_id; -static const mbfl_language *mbfl_language_ptr_table[] = { - &mbfl_language_uni, - &mbfl_language_japanese, - &mbfl_language_korean, - &mbfl_language_simplified_chinese, - &mbfl_language_traditional_chinese, - &mbfl_language_english, - &mbfl_language_german, - &mbfl_language_russian, - NULL -}; + assert(mbfl_language_tbl_initialized); + + next_id = mbfl_arraylist_get_num_items(&mbfl_language_tbl); + + mbfl_arraylist_update_item_at(&mbfl_language_tbl, (void *)&lang, sizeof(lang), NULL, next_id); + + if (plangid != NULL) { + *plangid = next_id; + } +} /* language resolver */ -const mbfl_language * mbfl_get_language_by_name(const char *name) +static const mbfl_language * mbfl_get_language_by_name_internal(const char *name, mbfl_language_id *pretval_id) { - const mbfl_language *language; + const mbfl_language *retval = NULL; int i, j; + unsigned int dummy; + + assert(name != NULL); - if (name == NULL) { - return NULL; + if (pretval_id != NULL) { + *pretval_id = mbfl_language_id_invalid; } - i = 0; - while ((language = mbfl_language_ptr_table[i++]) != NULL){ - if (strcasecmp(language->name, name) == 0) { - return language; + for (i = 0; i < mbfl_arraylist_get_num_items(&mbfl_language_tbl); i++) { + mbfl_language **tmp; + unsigned int sz; + + if (mbfl_arraylist_get_item_at(&mbfl_language_tbl, (void **)&tmp, &dummy, i) != 0) { + return NULL; } - } - i = 0; - while ((language = mbfl_language_ptr_table[i++]) != NULL){ - if (strcasecmp(language->short_name, name) == 0) { - return language; + retval = *tmp; + + if (strcasecmp(retval->name, name) == 0) { + if (pretval_id != NULL) { + *pretval_id = i; + } + goto out; + } + + if (strcasecmp(retval->short_name, name) == 0) { + if (pretval_id != NULL) { + *pretval_id = i; + } + goto out; } - } - /* serch aliases */ - i = 0; - while ((language = mbfl_language_ptr_table[i++]) != NULL) { - if (language->aliases != NULL) { - j = 0; - while ((*language->aliases)[j] != NULL) { - if (strcasecmp((*language->aliases)[j], name) == 0) { - return language; - } - j++; + j = 0; + while ((*retval->aliases)[j] != NULL) { + if (strcasecmp((*retval->aliases)[j], name) == 0) { + goto out; } + j++; } + retval = NULL; } +out: + return retval; +} - return NULL; +const mbfl_language * mbfl_get_language_by_name(const char *name) +{ + return mbfl_get_language_by_name_internal(name, NULL); } const mbfl_language * mbfl_get_language_by_id(mbfl_language_id no_language) { - const mbfl_language *language; - int i; + const mbfl_language **plang; + unsigned int sz; - i = 0; - while ((language = mbfl_language_ptr_table[i++]) != NULL){ - if (language->no_language == no_language) { - return language; - } + if (mbfl_arraylist_get_item_at(&mbfl_language_tbl, (void **)&plang, &sz, no_language) != 0) { + return *plang; } return NULL; @@ -136,14 +185,11 @@ mbfl_language_id mbfl_language_get_id_by_name(const char *name) { - const mbfl_language *language; + mbfl_language_id retval; - language = mbfl_get_language_by_name(name); - if (language == NULL) { - return mbfl_language_id_invalid; - } else { - return language->no_language; - } + mbfl_get_language_by_name_internal(name, &retval); + + return retval; } const char * mbfl_language_get_name_by_id(mbfl_language_id no_language) 1.4 +6 -27 libmbfl/mbfl/mbfl_language.h Index: mbfl_language.h =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/mbfl/mbfl_language.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- mbfl_language.h 25 Dec 2002 18:07:18 -0000 1.3 +++ mbfl_language.h 30 Dec 2002 19:37:50 -0000 1.4 @@ -34,39 +34,14 @@ #include "mbfl_defs.h" #include "mbfl_encoding.h" -enum _mbfl_language_id { - mbfl_language_id_invalid = -1, - mbfl_language_id_neutral, - mbfl_language_id_uni, - mbfl_language_id_min, - mbfl_language_id_catalan, /* ca */ - mbfl_language_id_danish, /* da */ - mbfl_language_id_german, /* de */ - mbfl_language_id_english, /* en */ - mbfl_language_id_estonian, /* et */ - mbfl_language_id_greek, /* el */ - mbfl_language_id_spanish, /* es */ - mbfl_language_id_french, /* fr */ - mbfl_language_id_italian, /* it */ - mbfl_language_id_japanese, /* ja */ - mbfl_language_id_korean, /* ko */ - mbfl_language_id_dutch, /* nl */ - mbfl_language_id_polish, /* pl */ - mbfl_language_id_portuguese, /* pt */ - mbfl_language_id_swedish, /* sv */ - mbfl_language_id_simplified_chinese, /* zh-cn */ - mbfl_language_id_traditional_chinese, /* zh-tw */ - mbfl_language_id_russian, /* ru */ - mbfl_language_id_max -}; +#define mbfl_language_id_invalid -1 -typedef enum _mbfl_language_id mbfl_language_id; +typedef int mbfl_language_id; /* * language */ typedef struct _mbfl_language { - mbfl_language_id no_language; const char *name; const char *short_name; const char *(*aliases)[]; @@ -74,6 +49,10 @@ mbfl_encoding_id mail_header_encoding; mbfl_encoding_id mail_body_encoding; } mbfl_language; + +MBFLAPI mbfl_language_id mbfl_language_id_uni; + +MBFLAPI int mbfl_register_language(const mbfl_language *lang, mbfl_language_id *plangid); MBFLAPI extern const mbfl_language * mbfl_get_language_by_name(const char *name); MBFLAPI extern const mbfl_language * mbfl_get_language_by_id(mbfl_language_id no_language); 1.3 +1 -0 libmbfl/mbfl/mbfl_list.h Index: mbfl_list.h =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/mbfl/mbfl_list.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- mbfl_list.h 30 Dec 2002 19:02:12 -0000 1.2 +++ mbfl_list.h 30 Dec 2002 19:37:50 -0000 1.3 @@ -24,6 +24,7 @@ #define mbfl_list_remove_item(a, b, c) mbfl_collection_remove_item(&((a)->_super),(b), (c)) #define mbfl_list_contains(a, b, c) mbfl_collection_contains(&((a)->_super),(b), (c)) #define mbfl_list_create_iter(a) mbfl_collection_create_iter(&((a)->_super)) +#define mbfl_list_get_num_items(a) mbfl_collection_get_num_items(&((a)->_super)) #define mbfl_list_insert_item_at(a, b, c, d, e) (a)->insert_item_at_op((a), (b), (c), (d), (e)) #define mbfl_list_update_item_at(a, b, c, d, e) (a)->update_item_at_op((a), (b), (c), (d), (e)) #define mbfl_list_get_item_at(a, b, c, d) (a)->get_item_at_op((a), (b), (c), (d)) 1.4 +0 -1 libmbfl/nls/nls_de.c Index: nls_de.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_de.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_de.c 24 Dec 2002 18:11:12 -0000 1.3 +++ nls_de.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -12,7 +12,6 @@ static const char *mbfl_language_german_aliases[] = {"Deutsch", NULL}; const mbfl_language mbfl_language_german = { - mbfl_language_id_german, "German", "de", (const char *(*)[])&mbfl_language_german_aliases, 1.4 +0 -1 libmbfl/nls/nls_en.c Index: nls_en.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_en.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_en.c 24 Dec 2002 18:11:12 -0000 1.3 +++ nls_en.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -10,7 +10,6 @@ #include "nls_en.h" const mbfl_language mbfl_language_english = { - mbfl_language_id_english, "English", "en", NULL, 1.4 +0 -1 libmbfl/nls/nls_ja.c Index: nls_ja.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_ja.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_ja.c 24 Dec 2002 18:11:12 -0000 1.3 +++ nls_ja.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -10,7 +10,6 @@ #include "nls_ja.h" const mbfl_language mbfl_language_japanese = { - mbfl_language_id_japanese, "Japanese", "ja", NULL, 1.4 +0 -1 libmbfl/nls/nls_kr.c Index: nls_kr.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_kr.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_kr.c 24 Dec 2002 18:11:12 -0000 1.3 +++ nls_kr.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -10,7 +10,6 @@ #include "nls_kr.h" const mbfl_language mbfl_language_korean = { - mbfl_language_id_korean, "Korean", "ko", NULL, 1.4 +0 -1 libmbfl/nls/nls_ru.c Index: nls_ru.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_ru.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_ru.c 24 Dec 2002 18:11:12 -0000 1.3 +++ nls_ru.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -10,7 +10,6 @@ #include "nls_ru.h" const mbfl_language mbfl_language_russian = { - mbfl_language_id_russian, "Russian", "ru", NULL, 1.4 +0 -1 libmbfl/nls/nls_uni.c Index: nls_uni.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_uni.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_uni.c 24 Dec 2002 18:12:41 -0000 1.3 +++ nls_uni.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -12,7 +12,6 @@ static const char *mbfl_language_uni_aliases[] = {"universal", NULL}; const mbfl_language mbfl_language_uni = { - mbfl_language_id_uni, "uni", "uni", (const char *(*)[])&mbfl_language_uni_aliases, 1.4 +0 -2 libmbfl/nls/nls_zh.c Index: nls_zh.c =================================================================== RCS file: /cvsroot/php-i18n/libmbfl/nls/nls_zh.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- nls_zh.c 24 Dec 2002 18:11:12 -0000 1.3 +++ nls_zh.c 30 Dec 2002 19:37:50 -0000 1.4 @@ -10,7 +10,6 @@ #include "nls_zh.h" const mbfl_language mbfl_language_simplified_chinese = { - mbfl_language_id_simplified_chinese, "Simplified Chinese", "zh-cn", NULL, @@ -20,7 +19,6 @@ }; const mbfl_language mbfl_language_traditional_chinese = { - mbfl_language_id_traditional_chinese, "Traditional Chinese", "zh-tw", NULL,