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