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
何の制御(制限)も受けていないノード.デフォルト.