C 言語用のインタフェース(考え中)
まさしくチラシの裏….考え中のインタフェースです.
#ifndef _MSC_VER #include <stdint.h> #endif // _MSC_VER #ifdef __cplusplus #include <cstddef> #else // __cplusplus #include <stddef.h> #endif // __cplusplus #ifdef __cplusplus extern "C" { #endif // __cplusplus // Visual C++ では unsigned __intXX を使い,gcc では uintXX_t を使う. #ifdef _MSC_VER typedef unsigned __int8 marisa_uint8; typedef unsigned __int16 marisa_uint16; typedef unsigned __int32 marisa_uint32; typedef unsigned __int64 marisa_uint64; #else // _MSC_VER typedef uint8_t marisa_uint8; typedef uint16_t marisa_uint16; typedef uint32_t marisa_uint32; typedef uint64_t marisa_uint64; #endif // _MSC_VER // 関数の返り値を marisa_status に統一することで // インタフェースの悩みを取り除こうという手抜き…かもしれない. typedef enum marisa_status_ { // 成功. MARISA_OK = 0, // ハンドルが不正なとき. MARISA_HANDLE_ERROR = 1, // 引数が明らかにおかしいとき. MARISA_PARAM_ERROR = 2, // メモリの確保に失敗したとき,あるいは与えられたバッファが小さすぎるとき. MARISA_MEMORY_ERROR = 3, // 入出力用の関数が失敗したとき. MARISA_IO_ERROR = 4 } marisa_status; // NULL 文字を終端として扱いたいときに指定する. #define MARISA_ZERO_TERMINATED ((size_t)-1) // ハンドル用. typedef struct marisa_trie_ marisa_trie; // 初期化・終了処理. marisa_status marisa_init(marisa_trie **h); marisa_status marisa_end(marisa_trie *h); marisa_status marisa_easy_build(marisa_trie *h, const char * const *keys, size_t num_keys, marisa_uint32 *key_ids); marisa_status marisa_build(marisa_trie *h, const char * const *keys, const size_t *key_lengths, const double *key_weights, size_t num_keys, marisa_uint32 *key_ids); marisa_status marisa_build_ex(marisa_trie *h, const char * const *keys, const size_t *key_lengths, const double *key_weights, size_t num_keys, marisa_uint32 *key_ids, marisa_uint32 num_tries, int patricia, int tail, int weight_order); // 外に出したくないので marisa_trie にマップ情報をもたせる. marisa_status marisa_mmap(marisa_trie *h, const char *filename, long offset, int whence); marisa_status marisa_map(marisa_trie *h, const void *ptr, size_t size); marisa_status marisa_load(marisa_trie *h, const char *filename, long offset, int whence); marisa_status marisa_fread(marisa_trie *h, FILE *file); marisa_status marisa_read(marisa_trie *h, int fd); marisa_status marisa_save(const marisa_trie *h, const char *filename, int trunc_flag, long offset, int whence); marisa_status marisa_fwrite(const marisa_trie *h, FILE *file); marisa_status marisa_write(const marisa_trie *h, int fd); // 呼出側でメモリ確保.サイズが足りないと MARISA_MEMORY_ERROR を返す. // サイズが不足していても key_length にはキーの長さを格納する. marisa_status marisa_restore(const marisa_trie *h, marisa_uint32 key_id, char *key_buf, size_t key_buf_size, size_t *key_length); marisa_status marisa_lookup(const marisa_trie *h, const char *ptr, size_t length, marisa_uint32 *key_id); marisa_status marisa_find(const marisa_trie *h, const char *ptr, size_t length, marisa_uint32 *key_ids, size_t *key_lengths, size_t max_num_results, size_t *num_results); marisa_status marisa_find_first(const marisa_trie *h, const char *ptr, size_t length, marisa_uint32 *key_id, size_t *key_length); marisa_status marisa_find_last(const marisa_trie *h, const char *ptr, size_t length, marisa_uint32 *key_id, size_t *key_length); marisa_status marisa_find_callback(const marisa_trie *h, int (*callback)(marisa_uint32, size_t, void *), void *last_arg_to_callback); // 小さいながらもメモリの確保をおこなうので MARISA_MEMORY_ERROR の可能性あり. // 文字列を複数返すようなインタフェースはどうしてもややこしくなるので, // 文字列の受け取りはコールバック関数限定にする予定. marisa_status marisa_predict(const marisa_trie *h, marisa_uint32 *key_ids, size_t max_num_results, size_t *num_results); marisa_status marisa_predict_breadth_first(const marisa_trie *h, marisa_uint32 *key_ids, size_t max_num_results, size_t *num_results); marisa_status marisa_predict_depth_first(const marisa_trie *h, marisa_uint32 *key_ids, size_t max_num_results, size_t *num_results); marisa_status marisa_predict_callback(const marisa_trie *h, int (*callback)(marisa_uint32, const char *, size_t, void *), void *last_arg_to_callback); // get_ をはさむ. marisa_status marisa_get_num_keys(const marisa_trie *h, marisa_uint32 *num_keys); marisa_status marisa_get_num_tries(const marisa_trie *h, marisa_uint32 *num_tries); marisa_status marisa_get_num_nodes(const marisa_trie *h, marisa_uint32 *num_nodes); marisa_status marisa_get_size(const marisa_trie *h, size_t *size); marisa_status marisa_clear(marisa_trie *h); marisa_status marisa_swap(marisa_trie *lhs, marisa_trie *rhs); #ifdef __cplusplus } // extern "C" #endif // __cplusplus