/**
* @file ptree.h
*
*
* @brief Patricia binary tree for data search
*
* This is a structure to build a patricia binary tree for searching
* various data or IDs from its name string.
*
*
* @brief データ検索用汎用パトリシア検索木の定義
*
* 文字列からその名前を持つ構造体や対応するIDを検索するための
* パトリシア木の構造体です.
*
*
* @author Akinobu LEE
* @date Fri Feb 11 17:27:24 2005
*
* $Revision: 1.8 $
*
*/
/*
* Copyright (c) 1991-2012 Kawahara Lab., Kyoto University
* Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
* Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology
* All rights reserved
*/
#ifndef __PATRICIA_TREE_H__
#define __PATRICIA_TREE_H__
/// Patricia binary tree node, to search related pointer from string
typedef struct _apatnode {
/**
* @brief Node value
*
* Pointer adreess if this is leaf node (in case both @a left0 and @a right1
* are NULL), or threshold bit if this is branch node (otherwise)
*
*/
union {
void *data; ///< Pointer address at leaf
int thres_bit; ///< Threshold bit at branch
} value;
struct _apatnode *left0; ///< Link to left node (bit=0)
struct _apatnode *right1; ///< Link to right node (bit=1)
} APATNODE;
/// Another patricia binary tree node, to search integer value from string
typedef struct _patnode {
/**
* @brief Node value
*
* Integer value if this is leaf node (in case both @a left0 and @a right1
* are NULL), or threshold bit if this is branch node (otherwise)
*
*/
union {
int data; ///< Integer value at leaf
int thres_bit; ///< Threshold bit at branch
} value;
struct _patnode *left0; ///< Link to left node (bit=0)
struct _patnode *right1; ///< Link to right node (bit=1)
} PATNODE;
#ifdef __cplusplus
extern "C" {
#endif
int testbit(char *str, int slen, int bitplace);
int testbit_max(char *str, int bitplace, int maxbitplace);
int where_the_bit_differ(char *str1, char *str2);
PATNODE *make_ptree(char **words, int *data, int wordsnum, int bitplace, BMALLOC_BASE **mroot);
void disp_ptree(PATNODE *node, int level);
int ptree_search_data(char *str, PATNODE *rootnode);
int ptree_replace_data(char *str, int val, PATNODE *node);
PATNODE *ptree_make_root_node(int data, BMALLOC_BASE **mroot);
void ptree_add_entry(char *str, int data, char *matchstr, PATNODE **rootnode, BMALLOC_BASE **mroot);
void *aptree_search_data(char *str, APATNODE *rootnode);
APATNODE *aptree_make_root_node(void *data, BMALLOC_BASE **mroot);
void aptree_add_entry(char *str, void *data, char *matchstr, APATNODE **rootnode, BMALLOC_BASE **mroot);
void aptree_remove_entry(char *str, APATNODE **rootnode);
void aptree_traverse_and_do(APATNODE *node, void (*callback)(void *));
boolean aptree_write(FILE *fp, APATNODE *root, boolean (*save_data_func)(void *, FILE *fp));
boolean aptree_read(FILE *fp, APATNODE **root, BMALLOC_BASE **mroot, void *data, boolean (*load_data_func)(void **, void *, FILE *fp));
#ifdef __cplusplus
}
#endif
#endif /* __PATRICIA_TREE_H__ */