28 if (pp==NULL)
return NULL;
29 memset(pp, 0,
sizeof(
tTree));
42 if (pp==NULL)
return NULL;
43 memset(pp, 0,
sizeof(
tTree));
78 memset(&pp, 0,
sizeof(
tTree));
99 if (node==NULL)
return NULL;
100 if (pp==NULL)
return node;
103 if (node==NULL)
return NULL;
107 node->esis = pp->yngr;
109 if (pp->yngr!=NULL) pp->yngr->ysis = node;
110 if (pp->next==NULL) pp->next = node;
113 node->depth = pp->depth + 1;
116 if (node->next!=NULL) {
117 node->next->depth = node->depth + 1;
143 if (pp==NULL)
return pt;
149 if (pp->yngr!=NULL) pp->yngr->ysis = pt;
150 if (pp->next==NULL) pp->next = pt;
153 pt->depth = pp->depth + 1;
227 if (node==NULL)
return NULL;
228 if (pp==NULL)
return node;
230 if (pp->next!=NULL) pp->next->esis = node;
231 node->ysis = pp->next;
237 node->depth = pp->depth + 1;
240 if (node->next!=NULL) {
241 node->next->depth = node->depth + 1;
267 if (pp==NULL)
return pt;
269 if (pp->next!=NULL) pp->next->esis = pt;
276 pt->depth = pp->depth + 1;
346 if (node==NULL)
return NULL;
348 if (node->next!=NULL) {
357 ss->prev = node->prev;
358 while (ss->ysis!=NULL) {
360 ss->prev = node->prev;
363 ss->ysis = node->ysis;
364 node->next->esis = node->esis;
365 if (node->ysis!=NULL) node->ysis->esis = ss;
366 if (node->esis!=NULL) node->esis->ysis = node->next;
368 if (node->prev!=NULL) {
369 if (node->prev->next==node) node->prev->next = node->next;
370 if (node->prev->yngr==node) node->prev->yngr = ss;
375 if (node->prev!=NULL) {
376 if (node->prev->next==node) node->prev->next = node->ysis;
377 if (node->prev->yngr==node) node->prev->yngr = node->esis;
379 if (node->ysis!=NULL) node->ysis->esis = node->esis;
380 if (node->esis!=NULL) node->esis->ysis = node->ysis;
383 tTree* pp = node->prev;
385 if (node->prev!=NULL) node->prev->num += node->num - 1;
402 if (node==NULL || *node==NULL)
return NULL;
427 if (node==NULL || pp==NULL)
return NULL;
430 if (node->next!=NULL) {
436 ss->prev = node->prev;
437 while (ss->ysis!=NULL) {
439 ss->prev = node->prev;
442 ss->ysis = node->ysis;
443 node->next->esis = node->esis;
444 if (node->ysis!=NULL) node->ysis->esis = ss;
445 if (node->esis!=NULL) node->esis->ysis = node->next;
447 if (node->prev!=NULL) {
448 if (node->prev->next==node) node->prev->next = node->next;
449 if (node->prev->yngr==node) node->prev->yngr = ss;
453 if (node->prev!=NULL) {
454 if (node->prev->next==node) node->prev->next = node->ysis;
455 if (node->prev->yngr==node) node->prev->yngr = node->esis;
457 if (node->ysis!=NULL) node->ysis->esis = node->esis;
458 if (node->esis!=NULL) node->esis->ysis = node->ysis;
460 if (node->prev!=NULL) node->prev->num += node->num - 1;
465 node->esis = pp->yngr;
467 if (pp->yngr!=NULL) pp->yngr->ysis = node;
468 if (pp->next==NULL) pp->next = node;
471 node->depth = pp->depth + 1;
474 if (node->next!=NULL) {
475 node->next->depth = node->depth + 1;
504 if (
ex_strncmp((
char*)(tp->ldat).key.buf, (
char*)key, len)) {
505 if (
ex_strncmp((
char*)(tp->ldat.val.buf), (
char*)src, len)) {
536 if (pp==NULL || *pp==NULL)
return;
543 PRINT_MESG(
"JBXL::del_delete_node_tTree: WARNING: top node is not ANCHOR node. top addresses are not guaranteed.\n");
553 if (pp==NULL || *pp==NULL)
return;
556 while(tp->esis!=NULL) tp = tp->esis;
582 if (pp==NULL || *pp==NULL)
return;
589 PRINT_MESG(
"JBXL::del_non_keep_node_tTree: WARNING: top node is not ANCHOR node. top addresses are not guaranteed.\n");
599 if (pp==NULL || *pp==NULL)
return;
602 while(tp->esis!=NULL) tp = tp->esis;
632 if (pp==NULL || *pp==NULL)
return NULL;
641 if ((*pp)->ysis!=NULL) pt->next = (*pp)->ysis;
642 else pt->next = (*pp)->esis;
644 if (pt->yngr==*pp) pt->yngr = (*pp)->esis;
647 if ((*pp)->ysis!=NULL) (*pp)->ysis->esis = (*pp)->esis;
648 if ((*pp)->esis!=NULL) (*pp)->esis->ysis = (*pp)->ysis;
668 if (pp==NULL || *pp==NULL)
return NULL;
692 if (pp==NULL || *pp==NULL)
return NULL;
723 if (pp==NULL || *pp==NULL)
return NULL;
727 while (pm->esis!=NULL) pm = pm->esis;
756 if (pp==NULL || *pp==NULL)
return;
759 while (pm->prev!=NULL) pm = pm->prev;
784 if (tt==NULL)
return NULL;
785 if (tp==NULL)
return tt;
787 while(tt->esis!=NULL) tt = tt->esis;
789 if (tp->yngr!=NULL) tp->yngr->ysis = tt;
790 if (tp->next==NULL) tp->next = tt;
797 tm->depth = tp->depth + 1;
799 if (tm->next!=NULL) {
800 tm->next->depth = tm->depth + 1;
824 if (tt==NULL)
return NULL;
825 if (tt->prev==NULL)
return tt;
827 if (tt->prev->next==tt) tt->prev->next = tt->ysis;
828 if (tt->prev->yngr==tt) tt->prev->yngr = tt->esis;
830 if (tt->ysis!=NULL) tt->ysis->esis = tt->esis;
831 if (tt->esis!=NULL) tt->esis->ysis = tt->ysis;
834 if (tt->next!=NULL) {
860 if (tp==NULL)
return pp;
866 pt->next = pt->prev = pt->yngr = pt->ysis = pt->esis = NULL;
924 if (tp==NULL || tt==NULL)
return;
929 if ((tt->ldat).key.buf==NULL)
return;
930 if (tl!=NULL && (tl->ldat).key.buf==NULL)
return;
931 while (tl!=NULL && strcmp((
char*)((tl->ldat).key.buf), (
char*)((tt->ldat).key.buf))) tl = tl->ysis;
943 else if (nl->next!=NULL && nt->next!=NULL) {
971 tTree* pt = tt->prev;
972 tTree* yt = tt->ysis;
973 tTree* et = tt->esis;
975 if (tl->esis!=NULL) tl->esis->ysis = tt;
976 if (tl->ysis!=NULL) tl->ysis->esis = tt;
977 if (tl->prev!=NULL) {
978 if (tl->prev->next==tl) tl->prev->next = tt;
979 if (tl->prev->yngr==tl) tl->prev->yngr = tt;
985 tt->depth = tl->depth;
986 if (tt->next!=NULL) {
987 tt->next->depth = tt->depth + 1;
991 if (et!=NULL) et->ysis = tl;
992 if (yt!=NULL) yt->esis = tl;
994 if (pt->next==tt) pt->next = tl;
995 if (pt->yngr==tt) pt->yngr = tl;
1002 if (tl->next!=NULL) {
1003 tl->next->depth = dt + 1;
1021 if (pp==NULL)
return;
1025 while (pt->ysis!=NULL) {
1028 if (pt->next!=NULL) {
1029 pt->next->depth = depth + 1;
1035 while (pt->esis!=NULL) {
1038 if (pt->next!=NULL) {
1039 pt->next->depth = depth + 1;
1044 if (pp->next!=NULL) {
1045 pp->next->depth = depth + 1;
1065 if (fp==NULL) fp = stderr;
1074 for(i=1; i<pp->depth; i++) fprintf(fp,
"%s", space);
1075 fprintf(fp,
" -> ");
1077 fprintf(fp,
"%d: %d %d %s %s\n", pp->depth, ld.id, ld.lv, ld.key.buf, ld.val.buf);
1085 fprintf(fp,
"(Tree is NULL)\n");
1104 if (fp==NULL) fp = stderr;
1111 fprintf(fp,
"[%d]: [%d] [%d] [%s] [%s]\n", pp->depth, ld.id, ld.lv, ld.key.buf, ld.val.buf);
1119 fprintf(fp,
"(Tree is NULL)\n");
1134 if (pp==NULL)
return NULL;
1136 while(pp->prev!=NULL) pp = pp->prev;
1137 while(pp->yngr!=NULL) pp = pp->yngr;
1155 if (pp==NULL)
return 0;
1156 while(pp->esis!=NULL) pp = pp->esis;
1195 if (pp==NULL)
return NULL;
1196 if (len<=-3)
return NULL;
1199 if (
ex_strncmp((
char*)(pp->ldat).key.buf, key, len)) {
1201 if (no==nn)
return pp;
1231 if (pp==NULL)
return NULL;
1232 if (len<=-3)
return NULL;
1237 if (no==nn)
return pp;
1284 while (ta!=NULL && tb!=NULL) {
1287 if ((ta->ldat).key.buf!=NULL && (tb->ldat).key.buf!=NULL) {
1288 if (strcmp((
char*)((ta->ldat).key.buf), (
char*)((tb->ldat).key.buf)))
break;
1297 if (tb==NULL)
return ts;
1301 if (tb!=NULL)
return NULL;
1335 if (tp==NULL || tr==NULL)
return FALSE;
1342 if (tt==NULL)
return FALSE;
1347 while (tb!=NULL && ret) {
1348 if (tb->next==NULL) ret =
TRUE;
1350 else if (tb->next!=NULL && ta->next==NULL) ret =
FALSE;
1398 if (ret)
return TRUE;
1400 if (pp->next!=NULL) {
1422 while (pp->esis!=NULL) pp = pp->esis;
1452 while(pp->esis!=NULL) pp = pp->esis;
1473 if (ret && te->altp!=NULL) {
1475 lm->altp = te->altp;
1477 if (lp==NULL) lp = lt;
1481 if (pp->next!=NULL) {
1485 if (lp==NULL) lp = lt;
1490 if (!ret) pp = pp->ysis;
1519 if (pp==NULL || pt==NULL)
return FALSE;
1520 while(pp->esis!=NULL) pp = pp->esis;
1544 if (pt->altp!=NULL) {
1546 pt->altp->ldat.id = pt->ldat.id;
1547 pt->altp->ldat.lv = pt->ldat.lv;
1548 pt->altp->ldat.sz = pt->ldat.sz;
1550 if (pt->ldat.key.buf!=NULL) {
1552 pt->altp->ldat.key =
dup_Buffer(pt->ldat.key);
1554 if (pt->ldat.val.buf!=NULL) {
1556 pt->altp->ldat.val =
dup_Buffer(pt->ldat.val);
1559 if (pt->ldat.ptr!=NULL && pt->ldat.sz>0) {
1560 if (pt->altp->ldat.ptr!=NULL) free(pt->altp->ldat.ptr);
1561 pt->altp->ldat.ptr = (
void*)malloc(pt->ldat.sz);
1562 if (pt->altp->ldat.ptr!=NULL) memcpy(pt->altp->ldat.ptr, pt->ldat.ptr, pt->ldat.sz);
1565 if (pt->ldat.lst!=NULL) {
1567 pt->altp->ldat.lst =
dup_tList(pt->ldat.lst);
1606 if (pp==NULL || pt==NULL)
return val;
1608 while(pp->esis!=NULL) pp = pp->esis;
1613 if (tt->altp!=NULL) {
1634 if (
ex_strncmp((
char*)(pp->ldat).key.buf, key, len)) {
1636 if (no==*nn)
return pp;
1638 if (pp->next!=NULL) {
1640 if (tt!=NULL)
return tt;
1657 if (
ex_strncmp((
char*)(pp->ldat).key.buf, key, len)) {
1659 if (no==*nn)
return pp;
1661 if (pp->ysis!=NULL) {
1663 if (tt!=NULL)
return tt;
1682 if (no==*nn)
return pp;
1684 if (pp->next!=NULL) {
1686 if (tt!=NULL)
return tt;
1705 if (no==*nn)
return pp;
1707 if (pp->ysis!=NULL) {
1709 if (tt!=NULL)
return tt;
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
#define make_Buffer_bystr(str)
set_Buffer()
#define JBXL_STATE_ANCHOR
アンカーノード
tList * dup_tList(tList *pp)
リストを複製する.
tList_data make_tList_data_bystr(int id, int lv, const char *key, const char *val, void *ptr, int sz)
文字列データを指定してノードデータを作成
tList * dup_tList_node(tList *node)
ノードデータを複製する (new).ノードのポインタは複製しない.
tList_data make_tList_data(int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
データを指定してノードデータを作成
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
tList * insert_tList(tList *pp, tList *pt)
ノードppの直ぐ後ろに ptを挿入する.
tList * find_tList_end(tList *pl)
リストの最後のノードを探す.
void clear_tList_data(tList_data *ldat)
ノードデータのバッファ部をクリアする.データ自身は削除しない.
tList_data init_tList_data(void)
空のノードデータを静的に作成.データを初期化するのに使用する.
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
void del_delete_node_tTree(tTree **pp)
ctrl==TREE_DELETE_NODE を削除する.
tTree * _next_strncasecmp_horizon_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.horizon は擬似的な横方向探索
tTree * free_tTree_node(tTree *node)
ツリーノードの解放.解放されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)
tTree * new_tTree_anchor_node(void)
ツリー用の ANCHORノードを動的に生成.
tTree * del_tTree_node(tTree **node)
ツリーノードの削除.削除されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)
tTree * _next_strncmp_vertical_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.vertical は縦方向探索
Buffer get_value_tTree(tTree *pp, tTree *pt)
同じパターンの枝を検索し,一致した枝があれば,その枝の最後のノードの値を返す.
tTree * add_tTree_node(tTree *pp, tTree *node)
ツリー ppへノード nodeを末っ子として追加.
void exchange_tTree(tTree *tl, tTree *tt)
ツリー tlと ツリー ttを交換する.
tTree * cmp_sisters_tTree(tTree *tp, tTree *tr)
tpの姉妹ノードが trの姉妹ノードと同じキー値を持っているかどうかを検査する.
tTree * add_tTree(tTree *tp, tTree *tt)
ツリー tpへ ツリー ttを追加.
void adjust_tTree_depth(tTree *pp)
指定したノード ppを基準にして,木の深さを測り直す
tTree * add_tTree_node_byBuffer(tTree *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
ノードを末っ子としてリストに追加.
void print_tTree(FILE *fp, tTree *pp)
ツリーの表示.ポインタ ノードのキー部のバッファをfpに表示する.
tTree * strncmp_tTree(tTree *pp, const char *key, int len, int no)
ツリーノードのキー値のサーチ
tTree * strncasecmp_tTree(tTree *pp, const char *key, int len, int no)
ツリーノードのキー値のサーチ.大文字小文字を無視する.
void del_all_tTree(tTree **pp)
ツリーの全ノードの削除.ポインタ ppのノードを含むツリー全体を削除する.
tTree * move_tTree_node(tTree *pp, tTree *node)
nodeを現在のツリーから切り離し,ppへ移動する.
void del_non_keep_node_tTree(tTree **pp)
ctrl==TREE_KEEP_NODE 以外を削除する.
tTree * insert_tTree_node_bydata(tTree *pp, tList_data ldat)
ノードをつくり出し,それを ppの子ノード(長子)として追加.
tTree * del_tTree_anchor_node(tTree *node)
ANCHORノードを削除して,TOP(長女)へのポインターを返す.
tTree * del_tTree(tTree **pp)
指定したノード以下のツリーを削除する.
int replace_tTree_node(tTree *pp, tTree *pt)
同じパターンの枝を検索し,ptのノードの属性で置き換える.
int count_tTree(tTree *pp)
ツリーの ppノード以降のノードの数を数える.
tTree * del_sisters_children_tTree(tTree **pp)
指定したノードの姉妹ツリー,子ツリーを削除する.
tTree * dup_merge_tTree(tTree *pp, tTree *tp)
ツリー ppの直下にツリー tpを複製する.
tTree * del_sisters_tTree(tTree **pp)
指定したノード以下のXMLツリー(ppの姉妹を含む)を削除する.
tTree * insert_tTree_node_byBuffer(tTree *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
ノードを長子としてリストに追加.
int replace_all_tTree_node(tTree *tp, char *key, char *src, char *dst, int len)
対象の全てのノードのノード値を dst に書き換える.
tTree * _next_strncmp_horizon_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.horizon は擬似的な横方向探索
tTree * del_children_tTree(tTree **pp)
指定したノードの子ツリーを削除する.指定したノードは削除しない.
int check_match_tTree(tTree *tp, tTree *tr)
tpが trと同じパターン(キー値)を持っているかどうかを検査する.
void _del_delete_node_tTree(tTree **pp)
tTree * insert_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを長子としてリストに追加.
void _clear_tTree_ctrl(tTree *pp)
ppツリーの ctrlをクリアする.
tList * find_match_tTree_endlist(tTree *pp, tTree *pt)
pp内で ptと同じパターンの枝を全て探して,その枝の最後のノードへの情報を返す.
void merge_tTree(tTree *tp, tTree *tt)
ツリー tp にツリー tt を結合する.結合後,tt の内容は壊れる(tpとノードを交換した形になる).
void _del_non_keep_node_tTree(tTree **pp)
tTree * insert_tTree_node(tTree *pp, tTree *node)
ツリー ppへノード nodeを長子として追加.
void print_tTree_tree(FILE *fp, tTree *pp, const char *space)
ツリーの表示.ポインタ ノードのキー部のバッファをfpに表示する.
tTree make_tTree_node(tList_data data)
ツリー用ノードを静的に作成.
tTree * add_tTree_node_bydata(tTree *pp, tList_data ldat)
データから Treeノードをつくり出し,それを ppの子ノード(末っ子)として追加.
tTree * _next_strncasecmp_vertical_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.vertical は縦方向探索
tTree * find_tTree_end(tTree *pp)
ツリーの最終ノードを見つける.
tTree * add_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを末っ子としてリストに追加.
tTree * div_tTree(tTree *tt)
ツリー tp から ツリー ttを分離する.
tTree * new_tTree_node(void)
ツリー用の空ノードを動的に生成.
void _copy_tTree_byctrl(tTree *pt)
同じパターンの枝を検索し,ptのノードの属性をコピーする.
int find_match_tTree(tTree *pp, tTree *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.
tList * _find_match_tTree_endlist_rcsv(tTree *pp, tTree *pt, tTree *te)
find_match_tTree_endlist() の補助関数
Tiny Tree Graph 構造ライブラリヘッダ
#define TREE_ANCHOR_NODE
ldat.ctrl リスト制御用
#define TREE_NOSIS_NODE
このノードの姉妹ノードは処理しない.一部の関数のみ有効.
#define TREE_NOCMP_NODE
比較対照から外すノード.通常は無条件で一致させる.
#define TREE_NOCMP_COPY_NODE
比較対照から外し,最後にコピー処理を行うノード.通常は無条件で一致させる.
#define TREE_ALREADY_FOUND_NODE
検索などにおいて既に見つけたノード.見つけたことを確定したノード.
#define TREE_COPY_NODE
後でコピー処理を行うノード.copy_tTree_byctrl()など.
#define TREE_DELETE_NODE
後で削除処理を行うノード.
#define TREE_KEEP_NODE
削除などの処理対象から外すノードに設定.
#define TREE_NOCTRL_NODE
何の制御(制限)も受けていないノード.デフォルト.