JunkBox_Lib  1.10.2
ttree.c File Reference

Tiny Tree Graph 構造ライブラリ More...

#include "ttree.h"
#include "jbxl_state.h"
Include dependency graph for ttree.c:

Go to the source code of this file.

Functions

tTreenew_tTree_node (void)
 ツリー用の空ノードを動的に生成. More...
 
tTreenew_tTree_anchor_node (void)
 ツリー用の ANCHORノードを動的に生成. More...
 
tTreedel_tTree_anchor_node (tTree *node)
 ANCHORノードを削除して,TOP(長女)へのポインターを返す. More...
 
tTree make_tTree_node (tList_data data)
 ツリー用ノードを静的に作成. More...
 
tTreeadd_tTree_node (tTree *pp, tTree *node)
 ツリー ppへノード nodeを末っ子として追加. More...
 
tTreeadd_tTree_node_bydata (tTree *pp, tList_data ldat)
 データから Treeノードをつくり出し,それを ppの子ノード(末っ子)として追加. More...
 
tTreeadd_tTree_node_byBuffer (tTree *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
 ノードを末っ子としてリストに追加. More...
 
tTreeadd_tTree_node_bystr (tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
 ノードを末っ子としてリストに追加. More...
 
tTreeinsert_tTree_node (tTree *pp, tTree *node)
 ツリー ppへノード nodeを長子として追加. More...
 
tTreeinsert_tTree_node_bydata (tTree *pp, tList_data ldat)
 ノードをつくり出し,それを ppの子ノード(長子)として追加. More...
 
tTreeinsert_tTree_node_byBuffer (tTree *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
 ノードを長子としてリストに追加. More...
 
tTreeinsert_tTree_node_bystr (tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
 ノードを長子としてリストに追加. More...
 
tTreefree_tTree_node (tTree *node)
 ツリーノードの解放.解放されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める) More...
 
tTreedel_tTree_node (tTree **node)
 ツリーノードの削除.削除されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める) More...
 
tTreemove_tTree_node (tTree *pp, tTree *node)
 nodeを現在のツリーから切り離し,ppへ移動する. More...
 
int replace_all_tTree_node (tTree *tp, char *key, char *src, char *dst, int len)
 対象の全てのノードのノード値を dst に書き換える. More...
 
void del_delete_node_tTree (tTree **pp)
 ctrl==TREE_DELETE_NODE を削除する. More...
 
void _del_delete_node_tTree (tTree **pp)
 
void del_non_keep_node_tTree (tTree **pp)
 ctrl==TREE_KEEP_NODE 以外を削除する. More...
 
void _del_non_keep_node_tTree (tTree **pp)
 
tTreedel_tTree (tTree **pp)
 指定したノード以下のツリーを削除する. More...
 
tTreedel_children_tTree (tTree **pp)
 指定したノードの子ツリーを削除する.指定したノードは削除しない. More...
 
tTreedel_sisters_tTree (tTree **pp)
 指定したノード以下のXMLツリー(ppの姉妹を含む)を削除する. More...
 
tTreedel_sisters_children_tTree (tTree **pp)
 指定したノードの姉妹ツリー,子ツリーを削除する. More...
 
void del_all_tTree (tTree **pp)
 ツリーの全ノードの削除.ポインタ ppのノードを含むツリー全体を削除する. More...
 
tTreeadd_tTree (tTree *tp, tTree *tt)
 ツリー tpへ ツリー ttを追加. More...
 
tTreediv_tTree (tTree *tt)
 ツリー tp から ツリー ttを分離する. More...
 
tTreedup_merge_tTree (tTree *pp, tTree *tp)
 ツリー ppの直下にツリー tpを複製する. More...
 
void merge_tTree (tTree *tp, tTree *tt)
 ツリー tp にツリー tt を結合する.結合後,tt の内容は壊れる(tpとノードを交換した形になる). More...
 
void exchange_tTree (tTree *tl, tTree *tt)
 ツリー tlと ツリー ttを交換する. More...
 
void adjust_tTree_depth (tTree *pp)
 指定したノード ppを基準にして,木の深さを測り直す More...
 
void print_tTree_tree (FILE *fp, tTree *pp, const char *space)
 ツリーの表示.ポインタ ノードのキー部のバッファをfpに表示する. More...
 
void print_tTree (FILE *fp, tTree *pp)
 ツリーの表示.ポインタ ノードのキー部のバッファをfpに表示する. More...
 
tTreefind_tTree_end (tTree *pp)
 ツリーの最終ノードを見つける. More...
 
int count_tTree (tTree *pp)
 ツリーの ppノード以降のノードの数を数える. More...
 
tTreestrncmp_tTree (tTree *pp, const char *key, int len, int no)
 ツリーノードのキー値のサーチ More...
 
tTreestrncasecmp_tTree (tTree *pp, const char *key, int len, int no)
 ツリーノードのキー値のサーチ.大文字小文字を無視する. More...
 
tTreecmp_sisters_tTree (tTree *tp, tTree *tr)
 tpの姉妹ノードが trの姉妹ノードと同じキー値を持っているかどうかを検査する. More...
 
int check_match_tTree (tTree *tp, tTree *tr)
 tpが trと同じパターン(キー値)を持っているかどうかを検査する. More...
 
int find_match_tTree (tTree *pp, tTree *pt)
 ツリー pp内で ツリー ptと同じパターンの枝を探す. More...
 
void _clear_tTree_ctrl (tTree *pp)
 ppツリーの ctrlをクリアする. More...
 
tListfind_match_tTree_endlist (tTree *pp, tTree *pt)
 pp内で ptと同じパターンの枝を全て探して,その枝の最後のノードへの情報を返す. More...
 
tList_find_match_tTree_endlist_rcsv (tTree *pp, tTree *pt, tTree *te)
 find_match_tTree_endlist() の補助関数 More...
 
int replace_tTree_node (tTree *pp, tTree *pt)
 同じパターンの枝を検索し,ptのノードの属性で置き換える. More...
 
void _copy_tTree_byctrl (tTree *pt)
 同じパターンの枝を検索し,ptのノードの属性をコピーする. More...
 
Buffer get_value_tTree (tTree *pp, tTree *pt)
 同じパターンの枝を検索し,一致した枝があれば,その枝の最後のノードの値を返す. More...
 
tTree_next_strncmp_vertical_tTree (tTree *pp, const char *key, int len, int no, int *nn)
 tTree 検索用補助関数.vertical は縦方向探索 More...
 
tTree_next_strncmp_horizon_tTree (tTree *pp, const char *key, int len, int no, int *nn)
 tTree 検索用補助関数.horizon は擬似的な横方向探索 More...
 
tTree_next_strncasecmp_vertical_tTree (tTree *pp, const char *key, int len, int no, int *nn)
 tTree 検索用補助関数.vertical は縦方向探索 More...
 
tTree_next_strncasecmp_horizon_tTree (tTree *pp, const char *key, int len, int no, int *nn)
 tTree 検索用補助関数.horizon は擬似的な横方向探索 More...
 

Detailed Description

Version
Author
Fumi.Iseki (C)
Date
2008 2/1

Definition in file ttree.c.

Function Documentation

◆ _clear_tTree_ctrl()

void _clear_tTree_ctrl ( tTree pp)

void _clear_tTree_ctrl(tTree* pp)

ppツリーの ctrlをクリアする. find_match_tTree(tTree* pp, tTree* pt) の補助関数

Definition at line 1420 of file ttree.c.

1421 {
1422  while (pp->esis!=NULL) pp = pp->esis;
1423 
1424  while (pp!=NULL) {
1425  pp->ctrl = TREE_NOCTRL_NODE;
1426  if (pp->next!=NULL) _clear_tTree_ctrl(pp->next);
1427  pp = pp->ysis;
1428  }
1429 }
void _clear_tTree_ctrl(tTree *pp)
ppツリーの ctrlをクリアする.
Definition: ttree.c:1420
#define TREE_NOCTRL_NODE
何の制御(制限)も受けていないノード.デフォルト.
Definition: ttree.h:52

References TREE_NOCTRL_NODE.

Referenced by _find_match_tTree_endlist_rcsv(), _find_match_xml_endlist_rcsv(), find_match_tTree(), find_match_tTree_endlist(), find_match_xml(), find_match_xml_end_node(), find_match_xml_endlist(), get_xml_content(), get_xml_node(), and set_xml_end_node().

Here is the caller graph for this function:

◆ _copy_tTree_byctrl()

void _copy_tTree_byctrl ( tTree pt)

void _copy_tTree_byctrl(tTree* pt)

replace_tTree_node() の補助関数.

ツリー ptにおいて,pt->ctrl が TREE_COPY_NODE または TREE_NOCMP_COPY_NODE の場合, pt->altp のノードへ ptの属性をコピーする.
pt->ldat.sz には正確に pt->ldat.ptrのサイズが設定されている必要がある.

Definition at line 1541 of file ttree.c.

1542 {
1543  while(pt!=NULL) {
1544  if (pt->altp!=NULL) {
1545  if (pt->ctrl==TREE_COPY_NODE || pt->ctrl==TREE_NOCMP_COPY_NODE) {
1546  pt->altp->ldat.id = pt->ldat.id;
1547  pt->altp->ldat.lv = pt->ldat.lv;
1548  pt->altp->ldat.sz = pt->ldat.sz;
1549 
1550  if (pt->ldat.key.buf!=NULL) {
1551  free_Buffer(&(pt->altp->ldat.key));
1552  pt->altp->ldat.key = dup_Buffer(pt->ldat.key);
1553  }
1554  if (pt->ldat.val.buf!=NULL) {
1555  free_Buffer(&(pt->altp->ldat.val));
1556  pt->altp->ldat.val = dup_Buffer(pt->ldat.val);
1557  }
1558 
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);
1563  }
1564 
1565  if (pt->ldat.lst!=NULL) {
1566  del_all_tList(&(pt->altp->ldat.lst));
1567  pt->altp->ldat.lst = dup_tList(pt->ldat.lst);
1568  }
1569  }
1570  }
1571 
1572  if (pt->next!=NULL) _copy_tTree_byctrl(pt->next);
1573  pt = pt->ysis;
1574  }
1575 
1576  return;
1577 }
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Definition: buffer.c:128
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
Definition: buffer.c:211
tList * dup_tList(tList *pp)
リストを複製する.
Definition: tlist.c:843
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition: tlist.c:769
void _copy_tTree_byctrl(tTree *pt)
同じパターンの枝を検索し,ptのノードの属性をコピーする.
Definition: ttree.c:1541
#define TREE_NOCMP_COPY_NODE
比較対照から外し,最後にコピー処理を行うノード.通常は無条件で一致させる.
Definition: ttree.h:54
#define TREE_COPY_NODE
後でコピー処理を行うノード.copy_tTree_byctrl()など.
Definition: ttree.h:55

References del_all_tList(), dup_Buffer(), dup_tList(), free_Buffer(), TREE_COPY_NODE, and TREE_NOCMP_COPY_NODE.

Referenced by replace_tTree_node(), and set_xml_end_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _del_delete_node_tTree()

void _del_delete_node_tTree ( tTree **  pp)

Definition at line 551 of file ttree.c.

552 {
553  if (pp==NULL || *pp==NULL) return;
554 
555  tTree* tp = *pp;
556  while(tp->esis!=NULL) tp = tp->esis;
557 
558  while(tp!=NULL) {
559  if (tp->next) _del_delete_node_tTree(&(tp->next));
560  // delete own
561  if (tp->ctrl==TREE_DELETE_NODE || tp->ctrl_alt==TREE_DELETE_NODE) {
562  tTree* tt = tp;
563  del_tTree_node(&tp);
564  tp = tt;
565  }
566  tp = tp->ysis;
567  }
568  return;
569 }
void _del_delete_node_tTree(tTree **pp)
Definition: ttree.c:551
tTree * del_tTree_node(tTree **node)
ツリーノードの削除.削除されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)
Definition: ttree.c:400
#define TREE_DELETE_NODE
後で削除処理を行うノード.
Definition: ttree.h:57

References del_tTree_node(), and TREE_DELETE_NODE.

Referenced by del_delete_node_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _del_non_keep_node_tTree()

void _del_non_keep_node_tTree ( tTree **  pp)

Definition at line 597 of file ttree.c.

598 {
599  if (pp==NULL || *pp==NULL) return;
600 
601  tTree* tp = *pp;
602  while(tp->esis!=NULL) tp = tp->esis;
603 
604  while(tp!=NULL) {
605  if (tp->next) _del_non_keep_node_tTree(&(tp->next));
606  // delete own
607  if (tp->ctrl!=TREE_KEEP_NODE && tp->ctrl_alt!=TREE_KEEP_NODE) {
608  tTree* tt = tp;
609  del_tTree_node(&tp);
610  tp = tt;
611  }
612  tp = tp->ysis;
613  }
614  return;
615 }
void _del_non_keep_node_tTree(tTree **pp)
Definition: ttree.c:597
#define TREE_KEEP_NODE
削除などの処理対象から外すノードに設定.
Definition: ttree.h:58

References del_tTree_node(), and TREE_KEEP_NODE.

Referenced by del_non_keep_node_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _find_match_tTree_endlist_rcsv()

tList* _find_match_tTree_endlist_rcsv ( tTree pp,
tTree pt,
tTree te 
)

tList* _find_match_tTree_endlist_rcsv(tTree* pp, tTree* pt, tTree* te)

find_match_tTree_endlist() の補助関数

Definition at line 1466 of file ttree.c.

1467 {
1468  tList* lt = NULL;
1469  tList* lp = NULL;
1470 
1471  while(pp!=NULL) {
1472  int ret = check_match_tTree(pp, pt);
1473  if (ret && te->altp!=NULL) {
1474  tList* lm = new_tList_node();
1475  lm->altp = te->altp;
1476  lt = insert_tList(lt, lm);
1477  if (lp==NULL) lp = lt;
1478  te->altp = NULL;
1479  }
1480 
1481  if (pp->next!=NULL) {
1482  tList* lm = _find_match_tTree_endlist_rcsv(pp->next, pt, te);
1483  if (lm!=NULL) {
1484  lt = insert_tList(lt, lm);
1485  if (lp==NULL) lp = lt;
1486  _clear_tTree_ctrl(pp->next);
1487  }
1488  }
1489 
1490  if (!ret) pp = pp->ysis; // 見つかった場合はもう一度.見つからなかった場合へ次へ.
1491  }
1492 
1493  return lp;
1494 }
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
Definition: tlist.c:198
tList * insert_tList(tList *pp, tList *pt)
ノードppの直ぐ後ろに ptを挿入する.
Definition: tlist.c:903
tList * _find_match_tTree_endlist_rcsv(tTree *pp, tTree *pt, tTree *te)
find_match_tTree_endlist() の補助関数
Definition: ttree.c:1466
int check_match_tTree(tTree *tp, tTree *tr)
tpが trと同じパターン(キー値)を持っているかどうかを検査する.
Definition: ttree.c:1325

References _clear_tTree_ctrl(), check_match_tTree(), insert_tList(), and new_tList_node().

Referenced by find_match_tTree_endlist().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _next_strncasecmp_horizon_tTree()

tTree* _next_strncasecmp_horizon_tTree ( tTree pp,
const char *  key,
int  len,
int  no,
int *  nn 
)

tTree* _next_strncasecmp_horizon_tTree (tTree* pp, const char* key, int len, int no, int* nn)

tTree 検索用補助関数.horizon は擬似的な横方向探索(完全な横方向探索ではない)

Definition at line 1700 of file ttree.c.

1701 {
1702  do {
1703  if (ex_strncasecmp((char*)(pp->ldat).key.buf, key, len)) {
1704  (*nn)++;
1705  if (no==*nn) return pp;
1706  }
1707  if (pp->ysis!=NULL) {
1708  tTree* tt = _next_strncasecmp_horizon_tTree(pp->ysis, key, len, no, nn);
1709  if (tt!=NULL) return tt;
1710  }
1711  pp = pp->next;
1712  } while(pp!=NULL);
1713 
1714  return NULL;
1715 }
unsigned char unsigned long * len
Definition: jpeg_tool.h:96
int ex_strncasecmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
Definition: tools.c:820
tTree * _next_strncasecmp_horizon_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.horizon は擬似的な横方向探索
Definition: ttree.c:1700

References ex_strncasecmp(), and len.

Here is the call graph for this function:

◆ _next_strncasecmp_vertical_tTree()

tTree* _next_strncasecmp_vertical_tTree ( tTree pp,
const char *  key,
int  len,
int  no,
int *  nn 
)

tTree* _next_strncasecmp_vertical_tTree(tTree* pp, const char* key, int len, int no, int* nn)

tTree 検索用補助関数.vertical は縦方向探索

Definition at line 1677 of file ttree.c.

1678 {
1679  do {
1680  if (ex_strncasecmp((char*)(pp->ldat).key.buf, key, len)) {
1681  (*nn)++;
1682  if (no==*nn) return pp;
1683  }
1684  if (pp->next!=NULL) {
1685  tTree* tt = _next_strncasecmp_vertical_tTree(pp->next, key, len, no, nn);
1686  if (tt!=NULL) return tt;
1687  }
1688  pp = pp->ysis;
1689  } while(pp!=NULL);
1690 
1691  return NULL;
1692 }
tTree * _next_strncasecmp_vertical_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.vertical は縦方向探索
Definition: ttree.c:1677

References ex_strncasecmp(), and len.

Referenced by strncasecmp_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _next_strncmp_horizon_tTree()

tTree* _next_strncmp_horizon_tTree ( tTree pp,
const char *  key,
int  len,
int  no,
int *  nn 
)

tTree* _next_strncmp_horizon_tTree (tTree* pp, const char* key, int len, int no, int* nn)

tTree 検索用補助関数.horizon は擬似的な横方向探索(完全な横方向探索ではない)

Definition at line 1654 of file ttree.c.

1655 {
1656  do {
1657  if (ex_strncmp((char*)(pp->ldat).key.buf, key, len)) {
1658  (*nn)++;
1659  if (no==*nn) return pp;
1660  }
1661  if (pp->ysis!=NULL) {
1662  tTree* tt = _next_strncmp_horizon_tTree(pp->ysis, key, len, no, nn);
1663  if (tt!=NULL) return tt;
1664  }
1665  pp = pp->next;
1666  } while(pp!=NULL);
1667 
1668  return NULL;
1669 }
int ex_strncmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.一致するなら TRUE
Definition: tools.c:784
tTree * _next_strncmp_horizon_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.horizon は擬似的な横方向探索
Definition: ttree.c:1654

References ex_strncmp(), and len.

Here is the call graph for this function:

◆ _next_strncmp_vertical_tTree()

tTree* _next_strncmp_vertical_tTree ( tTree pp,
const char *  key,
int  len,
int  no,
int *  nn 
)

tTree* _next_strncmp_vertical_tTree(tTree* pp, const char* key, int len, int no, int* nn)

tTree 検索用補助関数.vertical は縦方向探索

Definition at line 1631 of file ttree.c.

1632 {
1633  do {
1634  if (ex_strncmp((char*)(pp->ldat).key.buf, key, len)) {
1635  (*nn)++;
1636  if (no==*nn) return pp;
1637  }
1638  if (pp->next!=NULL) {
1639  tTree* tt = _next_strncmp_vertical_tTree(pp->next, key, len, no, nn);
1640  if (tt!=NULL) return tt;
1641  }
1642  pp = pp->ysis;
1643  } while(pp!=NULL);
1644 
1645  return NULL;
1646 }
tTree * _next_strncmp_vertical_tTree(tTree *pp, const char *key, int len, int no, int *nn)
tTree 検索用補助関数.vertical は縦方向探索
Definition: ttree.c:1631

References ex_strncmp(), and len.

Referenced by strncmp_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_tTree()

tTree* add_tTree ( tTree tp,
tTree tt 
)

tTree* add_tTree(tTree* tp, tTree* tt)

ツリー tpへ ツリー ttを追加.
add_tTree_node() との相違は,add_tTree()が先頭(tt)の姉妹ノードもツリー tpに追加する点にある.

Parameters
tp追加するツリーの親となるノードへのポインタ.
tt追加するツリーへのポインタ.
Returns
追加したツリーのノードへのポインタ.失敗した場合は NULL

Definition at line 778 of file ttree.c.

779 {
780  int nn;
781  tTree* tm;
782  tTree* tw;
783 
784  if (tt==NULL) return NULL;
785  if (tp==NULL) return tt;
786 
787  while(tt->esis!=NULL) tt = tt->esis;
788  tt->esis = tp->yngr;
789  if (tp->yngr!=NULL) tp->yngr->ysis = tt;
790  if (tp->next==NULL) tp->next = tt;
791 
792  nn = 0;
793  tm = tw = tt;
794  while (tm!=NULL) {
795  nn++;
796  tm->prev = tp;
797  tm->depth = tp->depth + 1;
798 
799  if (tm->next!=NULL) {
800  tm->next->depth = tm->depth + 1;
801  adjust_tTree_depth(tm->next);
802  }
803  tw = tm;
804  tm = tm->ysis;
805  }
806 
807  tp->yngr = tw;
808  tp->num += nn;
809 
810  return tt;
811 }
void adjust_tTree_depth(tTree *pp)
指定したノード ppを基準にして,木の深さを測り直す
Definition: ttree.c:1016

References adjust_tTree_depth().

Referenced by dup_merge_tTree(), join_json(), json_insert_child(), and merge_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_tTree_node()

tTree* add_tTree_node ( tTree pp,
tTree node 
)

tTree* add_tTree_node(tTree* pp, tTree* node)

ツリー ppへノード nodeを追加.ポインタ ppが指すノードの子(末っ子)ノードとして node(そのもの)を追加する.
node が子ノードを持つ場合は,それも追加される.
node が姉妹ノードを持っていてもそれらは無視する(処理しない).

Parameters
pp追加するノードの親となるノードへのポインタ.
node追加するノードへのポインタ.node->next 以下がツリーでも良い.
Returns
追加したノードへのポインタ.失敗した場合は NULL

Definition at line 97 of file ttree.c.

98 {
99  if (node==NULL) return NULL;
100  if (pp==NULL) return node;
101 
102  if (node->ldat.id==TREE_ANCHOR_NODE) node = node->next;
103  if (node==NULL) return NULL;
104 
105  node->prev = pp;
106  node->ysis = NULL;
107  node->esis = pp->yngr;
108 
109  if (pp->yngr!=NULL) pp->yngr->ysis = node;
110  if (pp->next==NULL) pp->next = node;
111  pp->yngr = node;
112 
113  node->depth = pp->depth + 1;
114  pp->num++;
115 
116  if (node->next!=NULL) {
117  node->next->depth = node->depth + 1;
118  adjust_tTree_depth(node->next);
119  }
120 
121  return node;
122 }
#define TREE_ANCHOR_NODE
ldat.ctrl リスト制御用
Definition: ttree.h:51

References adjust_tTree_depth(), and TREE_ANCHOR_NODE.

Referenced by json_array_parse(), and json_parse_prop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_tTree_node_byBuffer()

tTree* add_tTree_node_byBuffer ( tTree pp,
int  id,
int  lv,
Buffer  key,
Buffer  val,
void *  ptr,
int  sz 
)

tTree* add_tTree_node_byBuffer(tTree* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz)

データからノードをつくり出し,それを末っ子としてリストに追加.
リストポインタ ppが指すノードの後につくり出した ノードを挿入する.

Parameters
pp追加する場所の手前のノードへのポインタ.
id追加するデータ.
lv追加するデータ.
key追加するデータ. 複製
val追加するデータ. 複製
ptr汎用データへのポインタ 複製
sz*ptr のサイズ
Returns
追加したノードへのポインタ.

Definition at line 175 of file ttree.c.

176 {
177  tTree* pt;
178  tList_data ldat;
179 
180  ldat = make_tList_data(id, lv, key, val, ptr, sz);
181  pt = add_tTree_node_bydata(pp, ldat);
182 
183  return pt;
184 }
tList_data make_tList_data(int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
データを指定してノードデータを作成
Definition: tlist.c:50
tTree * add_tTree_node_bydata(tTree *pp, tList_data ldat)
データから Treeノードをつくり出し,それを ppの子ノード(末っ子)として追加.
Definition: ttree.c:135

References add_tTree_node_bydata(), and make_tList_data().

Here is the call graph for this function:

◆ add_tTree_node_bydata()

tTree* add_tTree_node_bydata ( tTree pp,
tList_data  ldat 
)

tTree* add_tTree_node_bydata(tTree* pp, tList_data ldat)

データから Treeノードをつくり出し,それを ppの子ノード(末っ子)として追加.
ldat は指定されたものがそのまま使用される.

Parameters
pp追加するノードの親となるノードへのポインタ.
ldat追加するノードデータ.このデータがそのまま使用される.
Returns
追加したノードへのポインタ.

Definition at line 135 of file ttree.c.

136 {
137  tTree* pt;
138 
139  pt = new_tTree_node();
140  pt->ldat = ldat;
141  pt->depth = 0;
142 
143  if (pp==NULL) return pt;
144 
145  pt->prev = pp;
146  pt->ysis = NULL;
147  pt->esis = pp->yngr;
148 
149  if (pp->yngr!=NULL) pp->yngr->ysis = pt;
150  if (pp->next==NULL) pp->next = pt;
151  pp->yngr = pt;
152 
153  pt->depth = pp->depth + 1;
154  pp->num++;
155 
156  return pt;
157 }
tTree * new_tTree_node(void)
ツリー用の空ノードを動的に生成.
Definition: ttree.c:23

References new_tTree_node().

Referenced by add_tTree_node_byBuffer(), and add_tTree_node_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_tTree_node_bystr()

tTree* add_tTree_node_bystr ( tTree pp,
int  id,
int  lv,
const char *  key,
const char *  val,
void *  ptr,
int  sz 
)

tTree* add_tTree_node_bystr(tTree* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz)

データからノードをつくり出し,それを末っ子としてリストに追加.
リストポインタ ppが指すノードの後につくり出した ノードを挿入する.

Parameters
pp追加する場所の手前のノードへのポインタ.
id追加するデータ.
lv追加するデータ.
key追加するデータ. 複製
val追加するデータ. 複製
ptr汎用データへのポインタ 複製
sz*ptr のサイズ
Returns
追加したノードへのポインタ.

Definition at line 202 of file ttree.c.

203 {
204  tTree* pt;
205  tList_data ldat;
206 
207  ldat = make_tList_data_bystr(id, lv, key, val, ptr, sz);
208  pt = add_tTree_node_bydata(pp, ldat);
209 
210  return pt;
211 }
tList_data make_tList_data_bystr(int id, int lv, const char *key, const char *val, void *ptr, int sz)
文字列データを指定してノードデータを作成
Definition: tlist.c:89

References add_tTree_node_bydata(), and make_tList_data_bystr().

Referenced by add_xml_content_node(), add_xml_node(), bvh_parse_hierarchy(), json_append_array_int_val(), json_append_array_real_val(), json_append_array_str_val(), json_append_obj_int_val(), json_append_obj_real_val(), json_append_obj_str_val(), llsd_bin_main_parse(), and xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ adjust_tTree_depth()

void adjust_tTree_depth ( tTree pp)

void adjust_tTree_depth(tTree* pp)

指定したノード ppを基準にして,木の深さを測り直す

Parameters
pp基準となるノードへのポインタ

Definition at line 1016 of file ttree.c.

1017 {
1018  int depth;
1019  tTree* pt;
1020 
1021  if (pp==NULL) return;
1022 
1023  depth = pp->depth;
1024  pt = pp;
1025  while (pt->ysis!=NULL) {
1026  pt = pt->ysis;
1027  pt->depth = depth;
1028  if (pt->next!=NULL) {
1029  pt->next->depth = depth + 1;
1030  adjust_tTree_depth(pt->next);
1031  }
1032  }
1033 
1034  pt = pp;
1035  while (pt->esis!=NULL) {
1036  pt = pt->esis;
1037  pt->depth = depth;
1038  if (pt->next!=NULL) {
1039  pt->next->depth = depth + 1;
1040  adjust_tTree_depth(pt->next);
1041  }
1042  }
1043 
1044  if (pp->next!=NULL) {
1045  pp->next->depth = depth + 1;
1046  adjust_tTree_depth(pp->next);
1047  }
1048 
1049  return;
1050 }

Referenced by add_tTree(), add_tTree_node(), close_xml(), div_tTree(), exchange_tTree(), free_tTree_node(), insert_tTree_node(), merge_tTree(), move_tTree_node(), replace_tTree_node(), and set_xml_end_node().

Here is the caller graph for this function:

◆ check_match_tTree()

int check_match_tTree ( tTree tp,
tTree tr 
)

int check_match_tTree(tTree* tp, tTree* tr)

ツリー tpが ツリー trと同じパターン(キー値)を持っているかどうかを検査する.
tp のトップと tr のトップはキー値が一致している必要がある.一致していなければ,同じパターンは無しとする.
ただし,tr->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).

一度見つけた tpの枝の最後のノードに対しては ctrlを TREE_ALREADY_FOUND_NODE を設定するので,続けてチェックする 場合などは ctrl をクリアする必要がある.

もし同じツリーパターンがある場合,trの各ノードの altpには,一番最初に見つかった対応する tpの各ノードへのポインタが格納される.

Parameters
tp検索対象のツリー
tr検索パターンのツリー
Return values
TRUEtp中に trと同じいツリーパターンが存在する.trの各ノードの altpには,一番最初に見つかった対応する tpの各ノードへのポインタが格納される.
FALSEtpに同じツリーパターンは無い.この場合,trのaltpの値は不定となる.

Definition at line 1325 of file ttree.c.

1326 {
1327  int ret;
1328  tTree* te;
1329  tTree* ts;
1330 
1331  tTree* tt;
1332  tTree* ta;
1333  tTree* tb;
1334 
1335  if (tp==NULL || tr==NULL) return FALSE;
1336 
1337  te = find_tList_end(tr);
1338 
1339  ts = tp;
1340  while (ts!=NULL) {
1341  tt = cmp_sisters_tTree(ts, tr); // その階層でキー値が全て一致しているか確認
1342  if (tt==NULL) return FALSE; // 一致していなければ,FALSE
1343 
1344  ta = tt; // 比べられるツリー
1345  tb = tr; // 比べるパターン
1346  ret = TRUE;
1347  while (tb!=NULL && ret) {
1348  if (tb->next==NULL) ret = TRUE;
1349  // ->ta, ->tb->tx: FALSE
1350  else if (tb->next!=NULL && ta->next==NULL) ret = FALSE;
1351  // ->ta->xa, ->tb->xb: xaとxbをチェック
1352  else ret = check_match_tTree(ta->next, tb->next);
1353 
1354  ta = ta->ysis;
1355  tb = tb->ysis;
1356  }
1357 
1358  if (ret) {
1359  if (tr==te) tt->ctrl = TREE_ALREADY_FOUND_NODE;
1360  return TRUE;
1361  }
1362 
1363  ts = tt->ysis;
1364  }
1365 
1366  return FALSE;
1367 }
#define TRUE
Definition: common.h:226
#define FALSE
Definition: common.h:223
tList * find_tList_end(tList *pl)
リストの最後のノードを探す.
Definition: tlist.c:1023
tTree * cmp_sisters_tTree(tTree *tp, tTree *tr)
tpの姉妹ノードが trの姉妹ノードと同じキー値を持っているかどうかを検査する.
Definition: ttree.c:1274
#define TREE_ALREADY_FOUND_NODE
検索などにおいて既に見つけたノード.見つけたことを確定したノード.
Definition: ttree.h:59

References cmp_sisters_tTree(), FALSE, find_tList_end(), TREE_ALREADY_FOUND_NODE, and TRUE.

Referenced by _find_match_tTree_endlist_rcsv(), and find_match_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cmp_sisters_tTree()

tTree* cmp_sisters_tTree ( tTree tp,
tTree tr 
)

tTree* cmp_sisters_tTree(tTree* tp, tTree* tr)

ノードtpの姉妹ノードが ノードtrの姉妹ノードと同じパターン(キー値を比較)を持っているかどうかを検査する.

ただし,tr->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).
また tp->ctrl が TREE_ALREADY_FOUND_NODE の場合は,常に一致しない.
もし同じノードパターンがある場合,trの各ノードの altpには,対応する tpの各ノードへのポインタが格納される.

Parameters
tp比べる姉妹ノードの長女ノード
tr探す姉妹ノードパターンの長女ノード
Returns
tp中で trと同じパターンが始まるノードへのポインタ.trの各ノードの altpには,対応する tpの各ノードへのポインタが格納される.
Return values
NULLtpに同じ姉妹パターンは無い.この場合,trのaltpの値は不定となる.
以下の場合,cmp_sisters_tTree(tp, tr) は (3)へのポインタを返す.また trの Aノード の altp には (3) へのポインタが,trの Xノードのaltpには(4)へのポインタが格納される. 最初に見つかったパターンのみ評価される.
tp tr
--> A (1) --> A A, B, X は キー値(ldat.key.buf)
--> B (2) --> X
--> A (3)
--> X (4)
--> A (5)
--> X (6)

Definition at line 1274 of file ttree.c.

1275 {
1276  tTree* ta;
1277  tTree* tb = NULL;
1278  tTree* ts;
1279 
1280  ts = tp;
1281  while (ts!=NULL){
1282  ta = ts;
1283  tb = tr;
1284  while (ta!=NULL && tb!=NULL) {
1285  if (ta->ctrl==TREE_ALREADY_FOUND_NODE) break;
1286  if (tb->ctrl!=TREE_NOCMP_NODE && tb->ctrl!=TREE_NOCMP_COPY_NODE) {
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;
1289  }
1290  else break;
1291  }
1292  tb->altp = ta;
1293  ta = ta->ysis;
1294  tb = tb->ysis;
1295  }
1296 
1297  if (tb==NULL) return ts;
1298 
1299  ts = ts->ysis;
1300  }
1301  if (tb!=NULL) return NULL;
1302 
1303  return ts;
1304 }
#define TREE_NOCMP_NODE
比較対照から外すノード.通常は無条件で一致させる.
Definition: ttree.h:53

References TREE_ALREADY_FOUND_NODE, TREE_NOCMP_COPY_NODE, and TREE_NOCMP_NODE.

Referenced by check_match_tTree().

Here is the caller graph for this function:

◆ count_tTree()

int count_tTree ( tTree pp)

int count_tTree(tTree* pp)

ツリーの ppノード以降のノードの数を数える.

Parameters
pp数え始めるノードへのポインタ.姉妹ノードも数える.
Returns
ノードの数.

Definition at line 1151 of file ttree.c.

1152 {
1153  int cnt = 0;
1154 
1155  if (pp==NULL) return 0;
1156  while(pp->esis!=NULL) pp = pp->esis;
1157 
1158  do {
1159  cnt++;
1160  if (pp->next!=NULL) cnt += count_tTree(pp->next);
1161  pp = pp->ysis;
1162  } while(pp!=NULL);
1163 
1164  return cnt;
1165 }
int count_tTree(tTree *pp)
ツリーの ppノード以降のノードの数を数える.
Definition: ttree.c:1151

Referenced by json_inverse_parse(), json_inverse_parse_opt(), and xml_inverse_parse().

Here is the caller graph for this function:

◆ del_all_tTree()

void del_all_tTree ( tTree **  pp)

void del_all_tTree(tTree** pp)

ツリーの全ノードの削除.ポインタ ppのノードを含むツリー全体を削除する.
pp はツリー中であれば,どこを指していても良い.

Parameters
*pp削除を開始するノードへのポインタ.ツリー中であれば,どこを指していても良い.

Definition at line 752 of file ttree.c.

753 {
754  tTree* pm;
755 
756  if (pp==NULL || *pp==NULL) return;
757 
758  pm = *pp;
759  while (pm->prev!=NULL) pm = pm->prev;
760  del_tTree(&pm);
761 
762  *pp = NULL;
763  return;
764 }
tTree * del_tTree(tTree **pp)
指定したノード以下のツリーを削除する.
Definition: ttree.c:628

References del_tTree().

Here is the call graph for this function:

◆ del_children_tTree()

tTree* del_children_tTree ( tTree **  pp)

tTree* del_children_tTree(tTree** pp)

指定したノードの子ツリーを削除する.指定したノードは削除しない.

Parameters
*pp削除する子ツリーの親ノード
Returns
削除したツリーの親ノードへのポインタ.*pp がそのまま返る.

Definition at line 666 of file ttree.c.

667 {
668  if (pp==NULL || *pp==NULL) return NULL;
669 
670  if ((*pp)->next!=NULL) del_sisters_children_tTree(&((*pp)->next));
671 
672  (*pp)->num = 0;
673  (*pp)->next = NULL;
674  (*pp)->yngr = NULL;
675 
676  return *pp;
677 }
tTree * del_sisters_children_tTree(tTree **pp)
指定したノードの姉妹ツリー,子ツリーを削除する.
Definition: ttree.c:718

References del_sisters_children_tTree().

Here is the call graph for this function:

◆ del_delete_node_tTree()

void del_delete_node_tTree ( tTree **  pp)

void del_delete_node_tTree(tTree** pp)

ctrl または ctrl_alt が TREE_DELETE_NODE の ノードを削除する

pp は アンカーノードである必要がある. アンカーノードでない場合,*ppが削除されるとリストを見失う.

Definition at line 534 of file ttree.c.

535 {
536  if (pp==NULL || *pp==NULL) return;
537 
538  tTree* tp = *pp;
539  if (tp->ldat.id==TREE_ANCHOR_NODE) {
540  tp = tp->next;
541  }
542  else {
543  PRINT_MESG("JBXL::del_delete_node_tTree: WARNING: top node is not ANCHOR node. top addresses are not guaranteed.\n");
544  }
545 
547  return;
548 }
#define PRINT_MESG
環境依存用の出力関数.print_message()
Definition: tools.h:475

References _del_delete_node_tTree(), PRINT_MESG, and TREE_ANCHOR_NODE.

Here is the call graph for this function:

◆ del_non_keep_node_tTree()

void del_non_keep_node_tTree ( tTree **  pp)

void del_non_keep_node_tTree(tTree** pp)

ctrl または ctrl_alt が TREE_KEEP_NODE 以外のノードを削除する

pp は アンカーノードである必要がある. アンカーノードでない場合,*ppが削除されるとリストを見失う.

Definition at line 580 of file ttree.c.

581 {
582  if (pp==NULL || *pp==NULL) return;
583 
584  tTree* tp = *pp;
585  if (tp->ldat.id==TREE_ANCHOR_NODE) {
586  tp = tp->next;
587  }
588  else {
589  PRINT_MESG("JBXL::del_non_keep_node_tTree: WARNING: top node is not ANCHOR node. top addresses are not guaranteed.\n");
590  }
591 
593  return;
594 }

References _del_non_keep_node_tTree(), PRINT_MESG, and TREE_ANCHOR_NODE.

Here is the call graph for this function:

◆ del_sisters_children_tTree()

tTree* del_sisters_children_tTree ( tTree **  pp)

tTree* del_sisters_children_tTree(tTree** pp)

指定したノードの姉妹ツリー,子ツリーを削除する.
指定したノードも削除する.

Parameters
*pp削除するツリーの起点ノード
Returns
削除したツリー郡の親ノードへのポインタ.
Attention
再帰処理用.親ノードに対する処理は行わないので,別途呼び出し側で行うこと.

Definition at line 718 of file ttree.c.

719 {
720  tTree* pm;
721  tTree* pt;
722 
723  if (pp==NULL || *pp==NULL) return NULL;
724  pt = (*pp)->prev;
725 
726  pm = *pp;
727  while (pm->esis!=NULL) pm = pm->esis;
728  while (pm!=NULL) {
729  tTree* pw = pm;
730  if (pm->next!=NULL) del_sisters_children_tTree(&(pm->next));
731  pm = pm->ysis;
732  clear_tList_data(&(pw->ldat));
733  free(pw);
734  }
735  *pp = NULL;
736 
737  pt->next = NULL;
738  pt->yngr = NULL;
739 
740  return pt;
741 }
void clear_tList_data(tList_data *ldat)
ノードデータのバッファ部をクリアする.データ自身は削除しない.
Definition: tlist.c:120

References clear_tList_data().

Referenced by del_children_tTree(), del_sisters_tTree(), and del_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ del_sisters_tTree()

tTree* del_sisters_tTree ( tTree **  pp)

tTree* del_sisters_tTree(tTree** pp)

指定したノード以下のXMLツリー(ppの姉妹を含む)を削除する.

Parameters
[in,out]*pp削除するツリーの先頭ノード.削除後は NULLになる.
Returns
削除したXMLツリーの親ノードへのポインタ.

Definition at line 688 of file ttree.c.

689 {
690  tTree* pt;
691 
692  if (pp==NULL || *pp==NULL) return NULL;
693 
694  pt = (*pp)->prev;
695  if (pt!=NULL) {
696  pt->next = NULL;
697  pt->yngr = NULL;
698  pt->num = 0;
699  }
700 
702 
703  return pt;
704 }

References del_sisters_children_tTree().

Here is the call graph for this function:

◆ del_tTree()

tTree* del_tTree ( tTree **  pp)

tTree* del_tTree(tTree** pp)

指定したノード以下のツリーを削除する. 姉妹ノードは削除しない.

Parameters
[in]*pp削除するツリーの先頭ノード
[out]*ppNULL
Returns
削除したツリーの親ノードへのポインタ.

Definition at line 628 of file ttree.c.

629 {
630  tTree* pt;
631 
632  if (pp==NULL || *pp==NULL) return NULL;
633 
634  // 子ノードの削除
635  if ((*pp)->next!=NULL) del_sisters_children_tTree(&((*pp)->next));
636 
637  // 自分自身の削除
638  pt = (*pp)->prev;
639  if (pt!=NULL) {
640  if (pt->next==*pp) {
641  if ((*pp)->ysis!=NULL) pt->next = (*pp)->ysis;
642  else pt->next = (*pp)->esis;
643  }
644  if (pt->yngr==*pp) pt->yngr = (*pp)->esis;
645  pt->num--;
646  }
647  if ((*pp)->ysis!=NULL) (*pp)->ysis->esis = (*pp)->esis;
648  if ((*pp)->esis!=NULL) (*pp)->esis->ysis = (*pp)->ysis;
649 
650  clear_tList_data(&((*pp)->ldat));
651  free(*pp);
652  *pp = NULL;
653 
654  return pt;
655 }

References clear_tList_data(), and del_sisters_children_tTree().

Referenced by clear_BVHData(), and del_all_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ del_tTree_anchor_node()

tTree* del_tTree_anchor_node ( tTree node)

Definition at line 53 of file ttree.c.

54 {
55  tTree* pp = node;
56 
57  if (node!=NULL && node->ldat.id==TREE_ANCHOR_NODE) {
58  pp = node->next;
59  free_tTree_node(node);
60  free(node);
61  }
62 
63  return pp;
64 }
tTree * free_tTree_node(tTree *node)
ツリーノードの解放.解放されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)
Definition: ttree.c:344

References free_tTree_node(), and TREE_ANCHOR_NODE.

Referenced by dup_merge_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ del_tTree_node()

tTree* del_tTree_node ( tTree **  node)

tTree* del_tTree_node(tTree** node)

ツリーノードの削除.削除されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)
node は動的に確保された変数でなければならない.

Parameters
*node削除するノードへのポインタ.
Returns
削除したノードの親ノードへのポインタ.

Definition at line 400 of file ttree.c.

401 {
402  if (node==NULL || *node==NULL) return NULL;
403 
404  tTree* pp = free_tTree_node(*node);
405  free(*node);
406  *node = NULL;
407 
408  return pp;
409 }

References free_tTree_node().

Referenced by _del_delete_node_tTree(), and _del_non_keep_node_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ div_tTree()

tTree* div_tTree ( tTree tt)

tTree* div_tTree(tTree* tp, tTree* tt)

ツリー tp から ツリー ttを分離する.

Parameters
ttツリーへの分離ポイント.
Returns
分離したツリーの元親ノードへのポインタ.失敗した場合は NULL

Definition at line 822 of file ttree.c.

823 {
824  if (tt==NULL) return NULL;
825  if (tt->prev==NULL) return tt;
826 
827  if (tt->prev->next==tt) tt->prev->next = tt->ysis;
828  if (tt->prev->yngr==tt) tt->prev->yngr = tt->esis;
829 
830  if (tt->ysis!=NULL) tt->ysis->esis = tt->esis;
831  if (tt->esis!=NULL) tt->esis->ysis = tt->ysis;
832 
833  tt->depth = 0;
834  if (tt->next!=NULL) {
835  tt->next->depth = 1;
836  adjust_tTree_depth(tt->next);
837  }
838 
839  tt->prev->num--;
840  tt->prev = NULL;
841 
842  return tt;
843 }

References adjust_tTree_depth().

Referenced by merge_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ dup_merge_tTree()

tTree* dup_merge_tTree ( tTree pp,
tTree tp 
)

tTree* dup_merge_tTree(tTree* pp, tTree* tp)

ツリー ppの直下に(Yunger Sisterとして)ツリー tpを複製する.
pp がNULLの場合は,ツリーの深さは調整されない

Parameters
pp複製されたツリーのトップとなるノード
tp複製するツリー
Returns
複製されたツリーへのポインタ.pp がNULLでない場合は pp
pp がNULLの場合は,新しく複製したツリーのトップ.

Definition at line 858 of file ttree.c.

859 {
860  if (tp==NULL) return pp;
861 
862  if (pp!=NULL) {
863  if (tp->ctrl!=TREE_NOSIS_NODE) while(tp->esis!=NULL) tp = tp->esis;
864  while(tp!=NULL) {
865  tTree* pt = dup_tList_node(tp);
866  pt->next = pt->prev = pt->yngr = pt->ysis = pt->esis = NULL;
867  add_tTree(pp, pt);
868  if (tp->next!=NULL) dup_merge_tTree(pt, tp->next);
869  if (tp->ctrl!=TREE_NOSIS_NODE) tp = tp->ysis;
870  else tp = NULL;
871  }
872  }
873  else {
874  pp = new_tTree_anchor_node();
875  dup_merge_tTree(pp, tp);
876  pp = del_tTree_anchor_node(pp);
877  }
878 
879  return pp;
880 }
tList * dup_tList_node(tList *node)
ノードデータを複製する (new).ノードのポインタは複製しない.
Definition: tlist.c:287
tTree * del_tTree_anchor_node(tTree *node)
ANCHORノードを削除して,TOP(長女)へのポインターを返す.
Definition: ttree.c:53
tTree * new_tTree_anchor_node(void)
ツリー用の ANCHORノードを動的に生成.
Definition: ttree.c:37
tTree * add_tTree(tTree *tp, tTree *tt)
ツリー tpへ ツリー ttを追加.
Definition: ttree.c:778
tTree * dup_merge_tTree(tTree *pp, tTree *tp)
ツリー ppの直下にツリー tpを複製する.
Definition: ttree.c:858
#define TREE_NOSIS_NODE
このノードの姉妹ノードは処理しない.一部の関数のみ有効.
Definition: ttree.h:56

References add_tTree(), del_tTree_anchor_node(), dup_tList_node(), new_tTree_anchor_node(), and TREE_NOSIS_NODE.

Referenced by dup_merge_xml().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ exchange_tTree()

void exchange_tTree ( tTree tl,
tTree tt 
)

void exchange_tTree(tTree* tl, tTree* tt)

ツリー tlと ツリー ttを交換する.

Parameters
tl交換対象のツリー
tt交換対象のツリー

Definition at line 968 of file ttree.c.

969 {
970  int dt = tt->depth;
971  tTree* pt = tt->prev;
972  tTree* yt = tt->ysis;
973  tTree* et = tt->esis;
974 
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;
980  }
981 
982  tt->ysis = tl->ysis;
983  tt->esis = tl->esis;
984  tt->prev = tl->prev;
985  tt->depth = tl->depth;
986  if (tt->next!=NULL) {
987  tt->next->depth = tt->depth + 1;
988  adjust_tTree_depth(tt->next);
989  }
990 
991  if (et!=NULL) et->ysis = tl;
992  if (yt!=NULL) yt->esis = tl;
993  if (pt!=NULL) {
994  if (pt->next==tt) pt->next = tl;
995  if (pt->yngr==tt) pt->yngr = tl;
996  }
997 
998  tl->ysis = yt;
999  tl->esis = et;
1000  tl->prev = pt;
1001  tl->depth = dt;
1002  if (tl->next!=NULL) {
1003  tl->next->depth = dt + 1;
1004  adjust_tTree_depth(tl->next);
1005  }
1006 }

References adjust_tTree_depth().

Referenced by merge_tTree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_match_tTree()

int find_match_tTree ( tTree pp,
tTree pt 
)

int find_match_tTree(tTree* pp, tTree* pt)

ツリー pp内で ツリー ptと同じパターンの枝を探す.
同じパターンの探索では キー値のみを比較し,ノード値は比較しない.
ただし,pt->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).

もし同じツリーパターンがある場合,trの各ノードの altpには,一番最初に見つかった対応する ppの各ノードへ のポインタが格納される.

check_match_tTree() との違い.

Parameters
pp検索対象のツリー
pt検索パターンのツリー
Return values
TRUEpp中に pt同じいツリーパターンが存在する.ptの各ノードの altpには,一番最初に見つかった対応する ppの各ノードへのポインタが格納される.
FALSEppに同じツリーパターンは無い.この場合,ptのaltpの値は不定となる.

Definition at line 1390 of file ttree.c.

1391 {
1392  int ret;
1393  tTree* pm;
1394 
1395  pm = pp;
1396  while(pp!=NULL) {
1397  ret = check_match_tTree(pp, pt);
1398  if (ret) return TRUE;
1399 
1400  if (pp->next!=NULL) {
1401  ret = find_match_tTree(pp->next, pt);
1402  if (ret) {
1403  _clear_tTree_ctrl(pm);
1404  return TRUE;
1405  }
1406  }
1407  pp = pp->ysis;
1408  }
1409 
1410  return FALSE;
1411 }
int find_match_tTree(tTree *pp, tTree *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.
Definition: ttree.c:1390

References _clear_tTree_ctrl(), check_match_tTree(), FALSE, and TRUE.

Referenced by find_match_xml_end_node(), get_value_tTree(), and replace_tTree_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_match_tTree_endlist()

tList* find_match_tTree_endlist ( tTree pp,
tTree pt 
)

tList* find_match_tTree_endlist(tTree* pp, tTree* pt)

ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝の最後のノードへの情報をリストにして返す.
該当ノードへのポインタは 返された各リストのaltp が保持している.

比較では キー値のみを比較し,ノード値は比較しない. また,pt->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).

Parameters
pp検索対象のツリー
pt検索パターンのツリー
Returns
該当ノードへのポインタを保持するリスト.

Definition at line 1446 of file ttree.c.

1447 {
1448  tTree* te;
1449  tList* lp;
1450 
1451  te = find_tTree_end(pt);
1452  while(pp->esis!=NULL) pp = pp->esis;
1453 
1454  lp = _find_match_tTree_endlist_rcsv(pp, pt, te);
1455  if (lp!=NULL) _clear_tTree_ctrl(pp);
1456 
1457  return lp;
1458 }
tTree * find_tTree_end(tTree *pp)
ツリーの最終ノードを見つける.
Definition: ttree.c:1132

References _clear_tTree_ctrl(), _find_match_tTree_endlist_rcsv(), and find_tTree_end().

Here is the call graph for this function:

◆ find_tTree_end()

tTree* find_tTree_end ( tTree pp)

tTree* find_tTree_end(tTree* pp)

ツリーの最終ノードを見つける.最終ノード:最後に追加されたノード.

Definition at line 1132 of file ttree.c.

1133 {
1134  if (pp==NULL) return NULL;
1135 
1136  while(pp->prev!=NULL) pp = pp->prev; // Top を探す
1137  while(pp->yngr!=NULL) pp = pp->yngr;
1138 
1139  return pp;
1140 }

Referenced by find_match_tTree_endlist(), and get_value_tTree().

Here is the caller graph for this function:

◆ free_tTree_node()

tTree* free_tTree_node ( tTree node)

tTree* free_tTree_node(tTree* node)

ツリーノードの削除.削除されたノードが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)

Returns
削除したノードの親ノードへのポインタ.

Definition at line 344 of file ttree.c.

345 {
346  if (node==NULL) return NULL;
347 
348  if (node->next!=NULL) { // 子ノードを持つ場合
349  tTree* ss;
350 
351  if (node->ldat.id!=TREE_ANCHOR_NODE) {
352  node->next->depth--;
353  adjust_tTree_depth(node->next);
354  }
355 
356  ss = node->next;
357  ss->prev = node->prev;
358  while (ss->ysis!=NULL) {
359  ss = ss->ysis;
360  ss->prev = node->prev;
361  }
362 
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;
367 
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;
371  }
372  }
373 
374  else { // 子ノードを持たない場合
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;
378  }
379  if (node->ysis!=NULL) node->ysis->esis = node->esis;
380  if (node->esis!=NULL) node->esis->ysis = node->ysis;
381  }
382 
383  tTree* pp = node->prev;
384  clear_tList_data(&(node->ldat));
385  if (node->prev!=NULL) node->prev->num += node->num - 1;
386 
387  return pp;
388 }

References adjust_tTree_depth(), clear_tList_data(), and TREE_ANCHOR_NODE.

Referenced by del_tTree_anchor_node(), and del_tTree_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_value_tTree()

Buffer get_value_tTree ( tTree pp,
tTree pt 
)

Buffer get_value_tTree(tTree* pp, tTree* pt)

ツリー pp内で ツリー ptと同じパターンの枝を検索し,ppに一致したパターンの 枝があれば,その枝の最後のノードの値を返す.

Parameters
pp検索対象のツリー
pt検索するパターン
Returns
ptの最後のノードに対応する ppのノードのノード値
以下の場合,Y(*) のノード値が返る.
tp tr
A --> B --> E C --> M --> Y
--> C --> M --> X
--> Y(*)
--> N

Definition at line 1600 of file ttree.c.

1601 {
1602  int fnd;
1603  Buffer val;
1604 
1605  val = init_Buffer();
1606  if (pp==NULL || pt==NULL) return val;
1607 
1608  while(pp->esis!=NULL) pp = pp->esis;
1609 
1610  fnd = find_match_tTree(pp, pt);
1611  if (fnd) {
1612  tTree* tt = find_tTree_end(pt);
1613  if (tt->altp!=NULL) {
1614  val = dup_Buffer(tt->altp->ldat.val);
1615  }
1616  }
1617 
1618  return val;
1619 }
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Definition: buffer.c:47
Definition: buffer.h:35

References dup_Buffer(), find_match_tTree(), find_tTree_end(), and init_Buffer().

Here is the call graph for this function:

◆ insert_tTree_node()

tTree* insert_tTree_node ( tTree pp,
tTree node 
)

tTree* insert_tTree_node(tTree* pp, tTree* node)

ツリー ppへノード nodeを追加.ポインタ ppが指すノードの子(長子)ノードとして node(そのもの)を追加する.
node が子ノードを持つ場合は,それも追加される.
node が姉妹ノードを持っていてもそれらは無視する(処理しない).

Parameters
pp追加するノードの親となるノードへのポインタ.
node追加するノードへのポインタ.node->next 以下がツリーでも良い.
Returns
追加したノードへのポインタ.失敗した場合は NULL

Definition at line 225 of file ttree.c.

226 {
227  if (node==NULL) return NULL;
228  if (pp==NULL) return node;
229 
230  if (pp->next!=NULL) pp->next->esis = node;
231  node->ysis = pp->next;
232  node->esis = NULL;
233 
234  pp->next = node;
235  node->prev = pp;
236 
237  node->depth = pp->depth + 1;
238  pp->num++;
239 
240  if (node->next!=NULL) {
241  node->next->depth = node->depth + 1;
242  adjust_tTree_depth(node->next);
243  }
244 
245  return node;
246 }

References adjust_tTree_depth().

Here is the call graph for this function:

◆ insert_tTree_node_byBuffer()

tTree* insert_tTree_node_byBuffer ( tTree pp,
int  id,
int  lv,
Buffer  key,
Buffer  val,
void *  ptr,
int  sz 
)

tTree* insert_tTree_node_byBuffer(tTree* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz)

データからノードをつくり出し,それを長子としてリストに追加.
リストポインタ ppが指すノードの後につくり出した ノードを挿入する.

Parameters
pp追加する場所の手前のノードへのポインタ.
id追加するデータ.
lv追加するデータ.
key追加するデータ. 複製
val追加するデータ. 複製
ptr汎用データへのポインタ 複製
sz*ptr のサイズ
Returns
追加したノードへのポインタ.

Definition at line 298 of file ttree.c.

299 {
300  tTree* pt;
301  tList_data ldat;
302 
303  ldat = make_tList_data(id, lv, key, val, ptr, sz);
304  pt = insert_tTree_node_bydata(pp, ldat);
305 
306  return pt;
307 }
tTree * insert_tTree_node_bydata(tTree *pp, tList_data ldat)
ノードをつくり出し,それを ppの子ノード(長子)として追加.
Definition: ttree.c:259

References insert_tTree_node_bydata(), and make_tList_data().

Here is the call graph for this function:

◆ insert_tTree_node_bydata()

tTree* insert_tTree_node_bydata ( tTree pp,
tList_data  ldat 
)

tTree* insert_tTree_node_bydata(tTree* pp, tList_data ldat)

データから tTreeノードをつくり出し,それを ppの子ノード(長子)として追加.
ldat は指定されたものがそのまま使用される.

Parameters
pp追加するノードの親となるノードへのポインタ.
ldat追加するノードデータ.このデータがそのまま使用される.
Returns
追加したノードへのポインタ.

Definition at line 259 of file ttree.c.

260 {
261  tTree* pt;
262 
263  pt = new_tTree_node();
264  pt->ldat = ldat;
265  pt->depth = 0;
266 
267  if (pp==NULL) return pt;
268  //
269  if (pp->next!=NULL) pp->next->esis = pt;
270  pt->ysis = pp->next;
271  pt->esis = NULL;
272 
273  pp->next = pt;
274  pt->prev = pp;
275 
276  pt->depth = pp->depth + 1;
277  pp->num++;
278 
279  return pt;
280 }

References new_tTree_node().

Referenced by insert_tTree_node_byBuffer(), and insert_tTree_node_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ insert_tTree_node_bystr()

tTree* insert_tTree_node_bystr ( tTree pp,
int  id,
int  lv,
const char *  key,
const char *  val,
void *  ptr,
int  sz 
)

tTree* insert_tTree_node_bystr(tTree* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz)

データからノードをつくり出し,それを長子としてリストに追加.
リストポインタ ppが指すノードの後につくり出した ノードを挿入する.

Parameters
pp追加する場所の手前のノードへのポインタ.
id追加するデータ.
lv追加するデータ.
key追加するデータ. 複製
val追加するデータ. 複製
ptr汎用データへのポインタ 複製
sz*ptr のサイズ
Returns
追加したノードへのポインタ.

Definition at line 325 of file ttree.c.

326 {
327  tTree* pt;
328  tList_data ldat;
329 
330  ldat = make_tList_data_bystr(id, lv, key, val, ptr, sz);
331  pt = insert_tTree_node_bydata(pp, ldat);
332 
333  return pt;
334 }

References insert_tTree_node_bydata(), and make_tList_data_bystr().

Referenced by insert_xml_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ make_tTree_node()

tTree make_tTree_node ( tList_data  data)

tTree make_tTree_node(tList_data data)

ツリー用ノードを静的に作成.

Parameters
dataノードデータ
Returns
作られたノード.

Definition at line 74 of file ttree.c.

75 {
76  tTree pp;
77 
78  memset(&pp, 0, sizeof(tTree));
79  pp.ldat = data;
80  pp.state = JBXL_NORMAL;
81 
82  return pp;
83 }
#define JBXL_NORMAL
正常
Definition: jbxl_state.h:32

References JBXL_NORMAL.

◆ merge_tTree()

void merge_tTree ( tTree tp,
tTree tt 
)

void merge_tTree(tTree* tp, tTree* tt)

ツリー tp にツリー tt を結合する.結合後,tt の内容は壊れる(tpとノードを交換した形になる).

tt が tpの一部と同じ構造(キー値)を持つ場合,末端ノードは ttのノードで置き換える.tp に存在しない枝は追加される.
ツリーの深さは tpを深さを元に再計算される.

Parameters
[in,out]tpin: tt の結合ポイント.out: 結合後のツリー.
[in,out]ttin: 結合するツリー.out: 内容は破壊される.要注意
tp tr
A --> B --> E A --> B --> X
--> C --> M --> X --> C --> M
--> Y --> D
--> N
以上の場合,merge_tTree(tp, tr) を実行すると以下のようになる.
tp
A --> B --> E
--> X (tr)
--> C --> M (tr)
--> N
--> D (tr)
tt
A --> B
--> C --> M --> X (tp)
--> Y (tp)

Definition at line 917 of file ttree.c.

918 {
919  tTree* tl;
920  tTree* nt;
921  tTree* nl;
922  int depth;
923 
924  if (tp==NULL || tt==NULL) return;
925 
926  depth = tp->depth;
927  tl = tp;
928  while (tt!=NULL) {
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;
932 
933  nt = tt;
934  nl = tl;
935  tt = tt->ysis;
936 
937  if (tl==NULL) {
938  div_tTree(nt);
939  add_tTree(tp->prev, nt);
940  tl = nt;
941  return;
942  }
943  else if (nl->next!=NULL && nt->next!=NULL) {
944  merge_tTree(nl->next, nt->next);
945  tl = tl->ysis;
946  }
947  else {
948  tl = tl->ysis;
949  exchange_tTree(nl, nt);
950  }
951  }
952 
953  tp->depth = depth;
954  adjust_tTree_depth(tp);
955 
956  return;
957 }
void exchange_tTree(tTree *tl, tTree *tt)
ツリー tlと ツリー ttを交換する.
Definition: ttree.c:968
tTree * div_tTree(tTree *tt)
ツリー tp から ツリー ttを分離する.
Definition: ttree.c:822
void merge_tTree(tTree *tp, tTree *tt)
ツリー tp にツリー tt を結合する.結合後,tt の内容は壊れる(tpとノードを交換した形になる).
Definition: ttree.c:917

References add_tTree(), adjust_tTree_depth(), div_tTree(), and exchange_tTree().

Here is the call graph for this function:

◆ move_tTree_node()

tTree* move_tTree_node ( tTree pp,
tTree node 
)

tTree* move_tTree_node(tTree* pp, tTree* node)

nodeを現在のツリーから切り離し,ppへ移動する.

元のツリーに於いて,nodeが子ノードを持つ場合は,その子ノードを格上げする(木構造を詰める)
移動に於いては,node が姉妹ノードを持っていてもそれらは無視する.
nodeを削除しないで del_tTree_node(), add_tTree_node() を実行するようなもの.

Parameters
pp移動先で親となるノードへのポインタ.
node移動するノードへのポインタ.node->next 以下がツリーでも良い.
Returns
移動したノードノードへのポインタ.

Definition at line 425 of file ttree.c.

426 {
427  if (node==NULL || pp==NULL) return NULL;
428 
429  // ノードの切り離し
430  if (node->next!=NULL) { // 子ノードを持つ場合
431  tTree* ss;
432  node->next->depth--;
433  adjust_tTree_depth(node->next);
434 
435  ss = node->next;
436  ss->prev = node->prev;
437  while (ss->ysis!=NULL) {
438  ss = ss->ysis;
439  ss->prev = node->prev;
440  }
441 
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;
446 
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;
450  }
451  }
452  else { // 子ノードを持たない場合
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;
456  }
457  if (node->ysis!=NULL) node->ysis->esis = node->esis;
458  if (node->esis!=NULL) node->esis->ysis = node->ysis;
459  }
460  if (node->prev!=NULL) node->prev->num += node->num - 1;
461 
462  // ノードの再結合(移動)
463  node->prev = pp;
464  node->ysis = NULL;
465  node->esis = pp->yngr;
466 
467  if (pp->yngr!=NULL) pp->yngr->ysis = node;
468  if (pp->next==NULL) pp->next = node;
469  pp->yngr = node;
470 
471  node->depth = pp->depth + 1;
472  pp->num++;
473 
474  if (node->next!=NULL) {
475  node->next->depth = node->depth + 1;
476  adjust_tTree_depth(node->next);
477  }
478 
479  return node;
480 }

References adjust_tTree_depth().

Here is the call graph for this function:

◆ new_tTree_anchor_node()

tTree* new_tTree_anchor_node ( void  )

Definition at line 37 of file ttree.c.

38 {
39  tTree* pp;
40 
41  pp = (tList*)malloc(sizeof(tTree));
42  if (pp==NULL) return NULL;
43  memset(pp, 0, sizeof(tTree));
44  pp->ldat = init_tList_data();
45  pp->ldat.id = TREE_ANCHOR_NODE;
46  pp->depth = -1;
47  pp->state = JBXL_STATE_ANCHOR; // TREE_ANCHOR_NODE と同じ
48 
49  return pp;
50 }
#define JBXL_STATE_ANCHOR
アンカーノード
Definition: jbxl_state.h:30
tList_data init_tList_data(void)
空のノードデータを静的に作成.データを初期化するのに使用する.
Definition: tlist.c:26

References init_tList_data(), JBXL_STATE_ANCHOR, and TREE_ANCHOR_NODE.

Referenced by dup_merge_tTree(), and xml_parse_seq().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ new_tTree_node()

tTree* new_tTree_node ( void  )

tTree* new_tTree_node(void)

ツリー用の空ノードを動的に生成.

Returns
生成されたノードへのポインタ.

Definition at line 23 of file ttree.c.

24 {
25  tTree* pp;
26 
27  pp = (tList*)malloc(sizeof(tTree));
28  if (pp==NULL) return NULL;
29  memset(pp, 0, sizeof(tTree));
30  pp->ldat = init_tList_data();
31  pp->state = JBXL_NORMAL;
32 
33  return pp;
34 }

References init_tList_data(), and JBXL_NORMAL.

Referenced by add_tTree_node_bydata(), and insert_tTree_node_bydata().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_tTree()

void print_tTree ( FILE *  fp,
tTree pp 
)

void print_tTree(FILE* fp, tTree* pp)

ツリーの表示.ポインタ pp以降の全てのノードのキー部のバッファを fpに表示する. pp->ctrl が TREE_NOSIS_NODE の場合は,ppの姉妹ノードは出力しない.

Parameters
fp出力するファイルへのポインタ.NULLの場合は stderr
pp表示を開始するノードへのポインタ.

Definition at line 1102 of file ttree.c.

1103 {
1104  if (fp==NULL) fp = stderr;
1105 
1106  if (pp!=NULL) {
1107  if (pp->ctrl!=TREE_NOSIS_NODE) while(pp->esis!=NULL) pp = pp->esis;
1108  do {
1109  tList_data ld = pp->ldat;
1110  //
1111  fprintf(fp, "[%d]: [%d] [%d] [%s] [%s]\n", pp->depth, ld.id, ld.lv, ld.key.buf, ld.val.buf);
1112  if (pp->next!=NULL) print_tTree(fp, pp->next);
1113 
1114  if (pp->ctrl!=TREE_NOSIS_NODE) pp = pp->ysis;
1115  else pp = NULL;
1116  } while(pp!=NULL);
1117  }
1118  else {
1119  fprintf(fp, "(Tree is NULL)\n");
1120  }
1121  fflush(fp);
1122 
1123  return;
1124 }
void print_tTree(FILE *fp, tTree *pp)
ツリーの表示.ポインタ ノードのキー部のバッファをfpに表示する.
Definition: ttree.c:1102

References TREE_NOSIS_NODE.

◆ print_tTree_tree()

void print_tTree_tree ( FILE *  fp,
tTree pp,
const char *  space 
)

void print_tTree_tree(FILE* fp, tTree* pp, const char* space)

ツリーの表示.ポインタ pp以降の全てのノードのキー部のバッファを fpに表示する. pp->ctrl が TREE_NOSIS_NODE の場合は,ppの姉妹ノードは出力しない.

Parameters
fp出力するファイルへのポインタ.NULLの場合は stderr
pp表示を開始するノードへのポインタ.
space出力の書式を揃えるための空白.

Definition at line 1063 of file ttree.c.

1064 {
1065  if (fp==NULL) fp = stderr;
1066 
1067  if (pp!=NULL) {
1068  if (pp->ctrl!=TREE_NOSIS_NODE) while(pp->esis!=NULL) pp = pp->esis;
1069  do {
1070  int i;
1071  tList_data ld = pp->ldat;
1072 
1073  if (pp->depth>=1) {
1074  for(i=1; i<pp->depth; i++) fprintf(fp, "%s", space);
1075  fprintf(fp, " -> ");
1076  }
1077  fprintf(fp, "%d: %d %d %s %s\n", pp->depth, ld.id, ld.lv, ld.key.buf, ld.val.buf);
1078  if (pp->next!=NULL) print_tTree_tree(fp, pp->next, space);
1079 
1080  if (pp->ctrl!=TREE_NOSIS_NODE) pp = pp->ysis;
1081  else pp = NULL;
1082  } while(pp!=NULL);
1083  }
1084  else {
1085  fprintf(fp, "(Tree is NULL)\n");
1086  }
1087  fflush(fp);
1088 
1089  return;
1090 }
void print_tTree_tree(FILE *fp, tTree *pp, const char *space)
ツリーの表示.ポインタ ノードのキー部のバッファをfpに表示する.
Definition: ttree.c:1063

References TREE_NOSIS_NODE.

◆ replace_all_tTree_node()

int replace_all_tTree_node ( tTree tp,
char *  key,
char *  src,
char *  dst,
int  len 
)

void replace_all_tTree_node(tTree* pp, char* key, char* src, char* dst, int len)

ツリー pp内で keyをキー,srcをノード値として持つ全てのノードのノード値を dst に書き換える.

Parameters
tp置換対象のツリー
keyサーチキー
src置換対象のノード値
dst置換後のノード値
len1以上: 一致させる長さ.
lenTLIST_MATCH_COMPLETE (0): 完全一致.
lenTLIST_MATCH_TLISTKEY (-1): pl->key.buf の長さに合わせる.
lenTLIST_MATCH_STRINGKEY (-2): key の長さに合わせる.
Returns
置き換えたノードの数

Definition at line 499 of file ttree.c.

500 {
501  int nn = 0;
502 
503  do {
504  if (ex_strncmp((char*)(tp->ldat).key.buf, (char*)key, len)) {
505  if (ex_strncmp((char*)(tp->ldat.val.buf), (char*)src, len)) {
506  free_Buffer(&(tp->ldat.val));
507  tp->ldat.val = make_Buffer_bystr(dst);
508  nn++;
509  }
510  }
511 
512  if (tp->next!=NULL) nn += replace_all_tTree_node(tp->next, key, src, dst, len);
513 
514  tp = tp->ysis;
515  } while(tp!=NULL);
516 
517  return nn;
518 }
#define make_Buffer_bystr(str)
set_Buffer()
Definition: buffer.h:57
int replace_all_tTree_node(tTree *tp, char *key, char *src, char *dst, int len)
対象の全てのノードのノード値を dst に書き換える.
Definition: ttree.c:499

References ex_strncmp(), free_Buffer(), len, and make_Buffer_bystr.

Here is the call graph for this function:

◆ replace_tTree_node()

int replace_tTree_node ( tTree pp,
tTree pt 
)

void replace_tTree_node(tTree* pp, tTree* pt)

ツリー pp内で ツリー ptと同じパターン(キー値を比較)の枝を検索し,ppに一致したパターンの枝があれば,
その枝の各ノードに対して,対応するそれぞれの(pt->ctrl が TREE_COPY_NODE または TREE_NOCMP_COPY_NODE である)
ptのノードの属性で置き換える.
パターンの一致(検索)では ldat.key(キー値)が比較される.

置き換える属性は ldat.id, ldat.lv, ldat.sz, ldat.key, ldat.val, ldat.ptr, ldat.lst
置き換えを行うのは pt->ctrl が TREE_COPY_NODE または TREE_NOCMP_COPY_NODE の場合のみである.(重要)
ldat.val, ldat.ptr, ldat.lst については,ptで値が設定されていなければ,置き換えを行わない.

Parameters
pp置き換え対象のツリー
pt置き換えるツリー
Return values
TRUE置換する枝を見つけた.正常に置換されたかどうかは不明.
FALSE置換する枝を見つけられなかった.

Definition at line 1515 of file ttree.c.

1516 {
1517  int ret;
1518 
1519  if (pp==NULL || pt==NULL) return FALSE;
1520  while(pp->esis!=NULL) pp = pp->esis;
1521 
1522  ret = find_match_tTree(pp, pt);
1523  if (ret) {
1524  _copy_tTree_byctrl(pt);
1525  adjust_tTree_depth(pp);
1526  }
1527 
1528  return ret;
1529 }

References _copy_tTree_byctrl(), adjust_tTree_depth(), FALSE, and find_match_tTree().

Here is the call graph for this function:

◆ strncasecmp_tTree()

tTree* strncasecmp_tTree ( tTree pp,
const char *  key,
int  len,
int  no 
)

tTree* strncasecmp_tTree(tTree* pp, const char* key, int len, int no)

ツリーノードのキー値のサーチ.大文字小文字を無視する.
ポインタ pp以降のノードで,キー部の文字列が keyと前方一致(部分的も可)するノードの内 no番目にあるのを捜し出す.

Parameters
ppサーチを開始するノードへのポインタ.
keyサーチキー(文字列).大文字,小文字を区別しない.
len1以上: 一致させる長さ.
lenTLIST_MATCH_COMPLETE (0): 完全一致.
lenTLIST_MATCH_TLISTKEY (-1): pl->key.buf の長さに合わせる.
lenTLIST_MATCH_STRINGKEY (-2): key の長さに合わせる.
no一致した物の中で何番目の物を返すか指定する.1から数える.
Returns
一致したノードへのポインタ
Return values
NULL一致したものが無い

Definition at line 1226 of file ttree.c.

1227 {
1228  tTree* pt = NULL;
1229  int nn = 0;
1230 
1231  if (pp==NULL) return NULL;
1232  if (len<=-3) return NULL;
1233  if (no<=0) no = 1;
1234 
1235  if (ex_strncasecmp((char*)(pp->ldat).key.buf, key, len)) {
1236  nn++;
1237  if (no==nn) return pp;
1238  }
1239  if (pp->next!=NULL) pt = _next_strncasecmp_vertical_tTree(pp->next, key, len, no, &nn);
1240 
1241  return pt;
1242 }

References _next_strncasecmp_vertical_tTree(), ex_strncasecmp(), and len.

Here is the call graph for this function:

◆ strncmp_tTree()

tTree* strncmp_tTree ( tTree pp,
const char *  key,
int  len,
int  no 
)

tTree* strncmp_tTree(tTree* pp, const char* key, int len, int no)

ツリーノードのキー値のサーチ.
ポインタ pp以降のノードで,キー部の文字列が keyと前方一致(部分的も可)するノードの内 no番目にあるのを捜し出す.

Parameters
ppサーチを開始するノードへのポインタ.
keyサーチキー(文字列).
len1以上: 一致させる長さ.
lenTLIST_MATCH_COMPLETE (0): 完全一致.
lenTLIST_MATCH_TLISTKEY (-1): pl->key.buf の長さに合わせる.
lenTLIST_MATCH_STRINGKEY (-2): key の長さに合わせる.
no一致した物の中で何番目の物を返すか指定する.1から数える.
Returns
一致したノードへのポインタ
Return values
NULL一致したものが無い

Definition at line 1190 of file ttree.c.

1191 {
1192  tTree* pt = NULL;
1193  int nn = 0;
1194 
1195  if (pp==NULL) return NULL;
1196  if (len<=-3) return NULL;
1197  if (no<=0) no = 1;
1198 
1199  if (ex_strncmp((char*)(pp->ldat).key.buf, key, len)) {
1200  nn++;
1201  if (no==nn) return pp;
1202  }
1203  if (pp->next!=NULL) pt = _next_strncmp_vertical_tTree(pp->next, key, len, no, &nn);
1204 
1205  return pt;
1206 }

References _next_strncmp_vertical_tTree(), ex_strncmp(), and len.

Referenced by get_node_content().

Here is the call graph for this function:
Here is the caller graph for this function: