/** * Migemoオブジェクトを作成する。作成に成功するとオブジェクトが戻り値として * 返り、失敗するとNULLが返る。dictで指定したファイルがmigemo-dict辞書として * オブジェクト作成時に読み込まれる。辞書と同じディレクトリに: * * <dl> * <dt>roma2hira.dat</dt> * <dd>ローマ字→平仮名変換表 </dd> * <dt>hira2kata.dat</dt> * <dd>平仮名→カタカナ変換表 </dd> * <dt>han2zen.dat</dt> * <dd>半角→全角変換表 </dd> * </dl> * * という名前のファイルが存在すれば、存在したものだけが読み込まれる。dictに * NULLを指定した場合には、辞書を含めていかなるファイルも読み込まれない。 * ファイルはオブジェクト作成後にもmigemo_load()関数を使用することで追加読み * 込みができる。 * @param dict migemo-dict辞書のパス。NULLの時は辞書を読み込まない。 * @returns 作成されたMigemoオブジェクト */ EXPORTS migemo* MIGEMO_CALLTYPE migemo_open(const char* dict) { migemo *obj; /* migemoオブジェクトと各メンバを構築 */ if (!(obj = (migemo*)calloc(1, sizeof(migemo)))) return obj; obj->enable = 0; obj->mtree = mnode_open(NULL); obj->charset = CHARSET_NONE; obj->rx = rxgen_open(); obj->roma2hira = romaji_open(); obj->hira2kata = romaji_open(); obj->han2zen = romaji_open(); obj->zen2han = romaji_open(); if (!obj->rx || !obj->roma2hira || !obj->hira2kata || !obj->han2zen || !obj->zen2han) { migemo_close(obj); return obj = NULL; } /* デフォルトmigemo辞書が指定されていたらローマ字とカタカナ辞書も探す */ if (dict) { #ifndef _MAX_PATH # define _MAX_PATH 1024 /* いい加減な数値 */ #endif char dir[_MAX_PATH]; char roma_dict[_MAX_PATH]; char kata_dict[_MAX_PATH]; char h2z_dict[_MAX_PATH]; char z2h_dict[_MAX_PATH]; const char *tmp; mtree_p mtree; filename_directory(dir, dict); tmp = strlen(dir) ? dir : "."; dircat(roma_dict, tmp, DICT_ROMA2HIRA); dircat(kata_dict, tmp, DICT_HIRA2KATA); dircat(h2z_dict, tmp, DICT_HAN2ZEN); dircat(z2h_dict, tmp, DICT_ZEN2HAN); mtree = load_mtree_dictionary2(obj, dict); if (mtree) { obj->mtree = mtree; obj->enable = 1; romaji_load(obj->roma2hira, roma_dict); romaji_load(obj->hira2kata, kata_dict); romaji_load(obj->han2zen, h2z_dict); romaji_load(obj->zen2han, z2h_dict); } } return obj; }
void make_directory_and_parents(const std::string &dirname) { if (dirname == "") return; make_directory_and_parents(filename_directory(dirname)); make_directory(dirname); }