JunkBox_Lib  1.10.2
tlist.h
Go to the documentation of this file.
1 #ifndef __JBXL_TINY_LIST_H_
2 #define __JBXL_TINY_LIST_H_
3 
13 #include "buffer.h"
14 
15 
16 struct _tList_data;
17 struct _tList;
18 
19 
20 struct _tList_data {
21  int id;
22  int lv;
25  void* ptr;
26  int sz;
27  struct _tList* lst;
28 };
29 
30 
43 typedef struct _tList_data tList_data;
44 
45 
46 struct _tList {
47  struct _tList_data ldat;
48 
49  struct _tList* next;
50  struct _tList* prev;
51  struct _tList* altp;
52  struct _tList* yngr;
53 
54  struct _tList* esis;
55  struct _tList* ysis;
56 
57  int depth;
58  int num;
59  int ctrl;
60  int ctrl_alt;
61  int state;
62 };
63 
64 
88 typedef struct _tList tList;
89 
90 
91 // Anchor Node
92 #define TLIST_ANCHOR_NODE JBXL_STATE_ANCHOR
93 
94 
95 // for strncmp_tList()
96 #define TLIST_MATCH_COMPLETE 0
97 #define TLIST_MATCH_TLISTKEY -1
98 #define TLIST_MATCH_STRINGKEY -2
99 #define TLIST_MATCH_STRKEY -2
100 
101 
103 // List Data
104 
106 
107 tList_data make_tList_data (int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
108 tList_data make_tList_data_bystr(int id, int lv, const char* key, const char* val, void* ptr, int sz);
109 #define make_tList_data_byBuffer(i, l, k, v, d, s) make_tList_data((i), (l), (k), (v), (d), (s))
110 #define make_tList_data_int(k, v) make_tList_data_bystr((k), (v), NULL, NULL, NULL, 0)
111 #define make_tList_data_str(k, v) make_tList_data_bystr(0, 0, (char*)(k), (char*)(v), NULL, 0)
112 #define make_tList_data_Buffer(k, v) make_tList_data(0, 0, (k), (v), NULL, 0)
113 
117 
118 
120 // Tiny List Node
121 
122 tList* new_tList_node(void);
124 tList* del_tList_node(tList** node);
125 tList* free_tList_node(tList* node);
126 tList* dup_tList_node (tList* node);
127 tList* move_tList_node(tList* pp, tList* node);
128 tList* swap_tList_node(tList* pp1, tList* pp2);
129 
132 #define new_tList_anchor() add_tList_node_anchor()
133 #define del_tList_anchor(t) del_tList_anchor_node((t))
134 
135 
136 // 追加は new_tList_node() を使用
138 tList* add_tList_node_bystr (tList* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz);
139 tList* add_tList_node_byBuffer(tList* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
140 #define add_tList_node_anchor() add_tList_node_bystr(NULL, TLIST_ANCHOR_NODE, 0, NULL, NULL, NULL, 0)
141 #define add_tList_node_int(p, k, v) add_tList_node_bystr((p), (k), (v), NULL, NULL, NULL, 0)
142 #define add_tList_node_str(p, k, v) add_tList_node_bystr((p), 0, 0, (char*)(k), (char*)(v), NULL, 0)
143 #define add_tList_node_null(p) add_tList_node_bystr((p), 0, 0, NULL, NULL, NULL, 0)
144 #define add_tList_node_Buffer(p, k, v) add_tList_node_byBuffer((p), 0, 0, (k), (v), NULL, 0)
145 
146 // 設定
148 void set_tList_node_bystr (tList* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz);
149 void set_tList_node_byBuffer(tList* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
150 #define set_tList_node_int(p, k, v) set_tList_node_bystr((p), (k), (v), NULL, NULL, NULL, 0)
151 #define set_tList_node_str(p, k, v) set_tList_node_bystr((p), 0, 0, (char*)(k), (char*)(v), NULL, 0)
152 #define set_tList_node_Buffer(p, k, v) set_tList_node_byBuffer((p), 0, 0, (k), (v), NULL, 0)
153 
154 // 検索して更新.無ければ追加.(追加は new_tList_node()を使用)
155 tList* update_tList_node (tList* pp, tList* pt);
157 tList* update_tList_node_bystr(tList* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz);
158 tList* update_tList_node_byBuffer(tList* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
159 #define update_tList_node_int(p, k, v) update_tList_node_bystr((p), (k), (v), NULL, NULL, NULL, 0)
160 #define update_tList_node_str(p, k, v) update_tList_node_bystr((p), 0, 0, (char*)(k), (char*)(v), NULL, 0)
161 #define update_tList_node_Buffer(p, k, v) update_tList_node_byBuffer((p), 0, 0, (k), (v), NULL, 0)
162 
163 
165 // Tiny List
166 
167 tList* del_tList(tList** pp);
168 void del_all_tList(tList** pp);
169 int del_tList_key(tList** pp, const char* key, int no);
170 
171 tList* add_tList_end(tList* pp, tList* pt);
172 tList* insert_tList(tList* pp, tList* pt);
173 tList* dup_tList(tList* pp);
174 void print_tList(FILE* fp, tList* pp);
175 void dump_tList(FILE* fp, tList* pp);
176 int count_tList(tList* pp);
177 
178 #define add_tList(p, t) insert_tList((p), (t))
179 #define add_tList_node(p, t) insert_tList((p), (t))
180 #define insert_tList_node(p, t) insert_tList((p), (t))
181 #define new_tList() new_tList_node()
182 
183 tList* find_tList_top(tList* pp);
184 tList* find_tList_end(tList* pp);
185 
186 // 検索 リストへのポインタを返す
187 // len: 1以上:一致させる長さ,0:完全一致,-1:pl->keyの長さに合わせる,-2:keyの長さに合わせる
188 tList* strncmp_tList (tList* pl, const char* key, int len, int no);
189 tList* strnrvscmp_tList(tList* pl, const char* key, int len, int no);
190 tList* strstr_tList (tList* pl, const char* key, int len, int no);
191 
192 tList* strncasecmp_tList (tList* pl, const char* key, int len, int no);
193 tList* strncaservscmp_tList(tList* pl, const char* key, int len, int no);
194 tList* strstrcase_tList (tList* pl, const char* key, int len, int no);
195 
196 tList* strncmp_back_tList (tList* pl, const char* key, int len, int no);
197 tList* strnrvscmp_back_tList(tList* pl, const char* key, int len, int no);
198 tList* strstr_back_tList (tList* pl, const char* key, int len, int no);
199 
200 tList* strncasecmp_back_tList (tList* pl, const char* key, int len, int no);
201 tList* strncaservscmp_back_tList(tList* pl, const char* key, int len, int no);
202 tList* strstrcase_back_tList (tList* pl, const char* key, int len, int no);
203 
204 // 検索
205 tList* search_id_tList (tList* lt, int id, int no);
206 tList* search_key_tList(tList* lt, const char* key, int no);
207 
208 // 検索 ldat.val のコピーを返す
209 Buffer buffer_key_tList(tList* lt, const char* key, int no);
210 Buffer buffer_key_value_tList(tList* lt, const char* key, char* data, int no);
211 
212 // Tools
213 tList* awk_tList (char* str, char cc);
214 tList* cawk_tList(char* str, char cc);
215 tList* awk_Buffer_tList (Buffer buf, char cc);
216 tList* cawk_Buffer_tList(Buffer buf, char cc);
217 char* get_str_join_tList(tList* lp, const char* deli);
218 Buffer get_Buffer_join_tList(tList* lp, const char* deli);
219 
220 // 値変更
221 int set_value_tList(tList* lt, const char* key, int no, const char* value, int mode);
222 int replace_value_tList(tList* lt, const char* key, int no, const char* srcval, char* value);
223 
224 int set_value_tList_node(tList* lt, const char* value);
225 int replace_value_tList_node(tList* lt, const char* srcval, const char* value);
226 
227 // for Configuration File
228 char* get_str_param_tList(tList* lt, const char* key, const char* dflt);
229 int get_int_param_tList(tList* lt, const char* key, int dflt);
230 double get_double_param_tList(tList* lt, const char* key, double dflt);
231 float get_float_param_tList (tList* lt, const char* key, float dflt);
232 int get_bool_param_tList (tList* lt, const char* key, int dflt);
233 
234 #define get_strparam_tList(l, k, d) get_str_param_tList((l), (k), (d))
235 #define get_intparam_tList(l, k, d) get_int_param_tList((l), (k), (d))
236 #define get_doubleparam_tList(l, k, d) get_double_param_tList((l), (k), (d))
237 #define get_boolparam_tList(l, k, d) get_bool_param_tList((l), (k), (d))
238 
239 
241 // File I/O with Tiny List
242 
243 tList* read_tList_fp(FILE* fp, int mode);
244 tList* read_tList_file(const char* fn, int mode);
245 tList* read_index_tList_fp(FILE* fp, char deli);
246 tList* read_index_tList_file(const char* fn, char deli);
247 
248 tList* read_Buffer_tList_fp(FILE* fp);
249 tList* read_Buffer_tList_file(const char* fn);
250 int save_Buffer_tList_fp(FILE* fp, tList* lt);
251 int save_Buffer_tList_file(const char* fn, tList* lt);
252 
253 
254 #endif // __JBXL_TINY_LIST_H_
255 
Buffer型サポートヘッダ
unsigned char ** buf
Definition: jpeg_tool.h:96
unsigned char unsigned long * len
Definition: jpeg_tool.h:96
Definition: buffer.h:35
int sz
*ptrのサイズ
Definition: tlist.h:26
int lv
ノード値(整数)
Definition: tlist.h:22
Buffer val
ノード値(文字列)
Definition: tlist.h:24
int id
ノードID
Definition: tlist.h:21
Buffer key
ノードのキー
Definition: tlist.h:23
void * ptr
汎用(構造体など)
Definition: tlist.h:25
struct _tList * lst
リストデータへのポインタ
Definition: tlist.h:27
Definition: tlist.h:46
int ctrl
制御用
Definition: tlist.h:59
struct _tList * esis
前の姉妹ノードへのポインタ for tTree
Definition: tlist.h:54
struct _tList_data ldat
データ
Definition: tlist.h:47
int ctrl_alt
制御用2
Definition: tlist.h:60
int num
子ノードの数 for tTree
Definition: tlist.h:58
int state
ノードの状態
Definition: tlist.h:61
struct _tList * prev
親ノードへのポインタ
Definition: tlist.h:50
struct _tList * yngr
子(末っ子)ノードへのポインタ for tTree
Definition: tlist.h:52
int depth
深さ for tTree
Definition: tlist.h:57
struct _tList * next
子ノードへのポインタ(通常は yngr)
Definition: tlist.h:49
struct _tList * altp
他のノードへのポインタ
Definition: tlist.h:51
struct _tList * ysis
次の姉妹ノードへのポインタ for tTree
Definition: tlist.h:55
int del_tList_key(tList **pp, const char *key, int no)
plからサーチして,no番目の keyのノードを削除する.
Definition: tlist.c:805
tList_data make_tList_data_bystr(int id, int lv, const char *key, const char *val, void *ptr, int sz)
文字列データを指定してノードデータを作成
Definition: tlist.c:89
tList * find_tList_end(tList *pp)
リストの最後のノードを探す.
Definition: tlist.c:1023
tList * read_Buffer_tList_file(const char *fn)
ファイルから Buffer型変数を 2つずつ読み込んで,リストのキー部とバッファ部に格納し返す.
Definition: tlist.c:2286
tList * search_id_tList(tList *lt, int id, int no)
リストの中から no番目の idノード(ldat.id)を探し出し,tListのポインタを返す.
Definition: tlist.c:1541
tList * cawk_Buffer_tList(Buffer buf, char cc)
Buffer 中の文字列を区切り文字で区切って,各項目をリストのキー部に入れて返す.連続文字列対応.
Definition: tlist.c:1914
int replace_value_tList(tList *lt, const char *key, int no, const char *srcval, char *value)
リスト(lt)中の no番目の keyノードの値の srcvalの部分を value に置き換える.
Definition: tlist.c:1742
void set_tList_node_bydata(tList *pp, tList_data ldat)
リストのノードに値を設定する.
Definition: tlist.c:513
Buffer buffer_key_tList(tList *lt, const char *key, int no)
リストの中から no番目の keyノード(ldat.key)を探し出し,ldat.valのコピーを返す.
Definition: tlist.c:1595
double get_double_param_tList(tList *lt, const char *key, double dflt)
keyに対応する値を double型実数として読み出す.キーがない場合は,デフォルト値 dflt を返す.
Definition: tlist.c:2041
tList * strncasecmp_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるノードのサーチ.大文字小文字を無視する
Definition: tlist.c:1094
tList * strncasecmp_back_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるリストの後方からのノードのサーチ.大文字小文字を無視.
Definition: tlist.c:1337
tList * update_tList_node_bystr(tList *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
keyで検索し,ノードがあればノードをコピーする.無ければ最後に追加する(new)
Definition: tlist.c:668
int save_Buffer_tList_fp(FILE *fp, tList *lt)
リストのキー部とバッファ部の Buffer型変数をファイルポンタが指すファイルへ書き込む.
Definition: tlist.c:2370
void print_tList(FILE *fp, tList *pp)
リストの表示.ポインタ pp以降の全てのノードを fpに表示する.
Definition: tlist.c:928
void del_tList_data(tList_data **ldat)
ノードデータを削除する.
Definition: tlist.c:149
tList * new_tList_anchor_node(void)
リスト用の ANCHORノードを動的に生成.
Definition: tlist.c:371
tList * strstrcase_back_tList(tList *pl, const char *key, int len, int no)
char* 型変数による後方からのノードの部分文字列サーチ.大文字小文字を無視.
Definition: tlist.c:1497
tList * update_tList_node_byBuffer(tList *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
key.bufで検索し,ノードがあれば設定する.無ければ最後に追加する(new).
Definition: tlist.c:703
tList * cawk_tList(char *str, char cc)
文字列を区切り文字で区切って,各項目をリストのキー部に入れて返す.連続文字列対応.
Definition: tlist.c:1844
tList * dup_tList(tList *pp)
リストを複製する.
Definition: tlist.c:843
tList_data make_tList_data(int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
データを指定してノードデータを作成
Definition: tlist.c:50
tList * read_tList_file(const char *fn, int mode)
ファイルから一行ずつ読み込んでリストのキー部に格納.空行はリストに加えない.
Definition: tlist.c:2127
tList * read_index_tList_fp(FILE *fp, char deli)
ファイルポインタが示すファイルから一行ずつ読み込んで,deliを区切り文字にしてリストのキー部とデータ部に格納.
Definition: tlist.c:2246
Buffer buffer_key_value_tList(tList *lt, const char *key, char *data, int no)
リストの中から no番目の keyノードを探し出し,ノード値が data で始まる場合,そのノード値を返す.
Definition: tlist.c:1626
char * get_str_join_tList(tList *lp, const char *deli)
リストの一連のキー部を deliを区切りにして結合して,その文字列を返す. 要 free
Definition: tlist.c:1941
int get_bool_param_tList(tList *lt, const char *key, int dflt)
keyに対応する値を 論理値(実際は整数)として読み出す.キーがない場合は,デフォルト値 dflt を返す.
Definition: tlist.c:2091
tList * update_tList_node(tList *pp, tList *pt)
pt->keyで検索し,ノードがあればノードをコピーする.無ければ最後にノードを追加する(new).
Definition: tlist.c:609
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
Definition: tlist.c:198
tList * search_key_tList(tList *lt, const char *key, int no)
リストの中から no番目の keyノード(ldat.key)を探し出し,tListへのポインタを返す.大文字小文字を無視.
Definition: tlist.c:1571
Buffer get_Buffer_join_tList(tList *lp, const char *deli)
リストの一連のキー部を deliを区切りにして結合して返す.
Definition: tlist.c:1953
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition: tlist.c:769
tList * add_tList_end(tList *pp, tList *pt)
リストppの最後に リストptを追加する.
Definition: tlist.c:877
tList * dup_tList_node(tList *node)
ノードデータを複製する (new).ノードのポインタは複製しない.
Definition: tlist.c:287
int set_value_tList_node(tList *lt, const char *value)
lt->ldat.val に文字列を設定する(置き換える).
Definition: tlist.c:1714
int count_tList(tList *pp)
リストの ppノード以降のノードの数を数える.
Definition: tlist.c:979
tList * read_Buffer_tList_fp(FILE *fp)
ファイルポインタから Buffer型変数を 2つずつ読み込んで,リストのキー部とバッファ部に格納し返す.
Definition: tlist.c:2308
float get_float_param_tList(tList *lt, const char *key, float dflt)
keyに対応する値を float型実数として読み出す.キーがない場合は,デフォルト値 dflt を返す.
Definition: tlist.c:2066
tList * free_tList_node(tList *node)
リスト用ノードのバッファ部(データ)の解放.
Definition: tlist.c:243
tList * strncaservscmp_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるノードのサーチ.文字の後方から比べる.大文字小文字を無視.
Definition: tlist.c:1170
tList * read_index_tList_file(const char *fn, char deli)
ファイルから一行ずつ読み込んで,deliを区切り文字にしてリストのキー部とデータ部に格納.
Definition: tlist.c:2219
tList * strstr_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるノードの部分文字列サーチ.
Definition: tlist.c:1206
int get_int_param_tList(tList *lt, const char *key, int dflt)
keyに対応する値を 整数として読み出す.キーがない場合は,デフォルト値 dflt を返す..
Definition: tlist.c:2016
void clear_tList_data(tList_data *ldat)
ノードデータのバッファ部をクリアする.データ自身は削除しない.
Definition: tlist.c:120
tList * awk_tList(char *str, char cc)
文字列を区切り文字で区切って,各項目をリストのキー部に入れて返す.
Definition: tlist.c:1805
int set_value_tList(tList *lt, const char *key, int no, const char *value, int mode)
リスト(lt)中の no番目の keyノードの値に valueを設定する.
Definition: tlist.c:1675
tList * del_tList_node(tList **node)
リスト用のノードを削除.
Definition: tlist.c:270
tList * move_tList_node(tList *pp, tList *node)
nodeを現在のリストから切り離し,ppへ移動する.
Definition: tlist.c:321
tList * insert_tList(tList *pp, tList *pt)
ノードppの直ぐ後ろに ptを挿入する.
Definition: tlist.c:903
tList * add_tList_node_bystr(tList *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
文字列データからリスト用ノードを生成し(new),それをリストに追加.
Definition: tlist.c:462
tList * del_tList_anchor_node(tList *node)
ANCHORノードを削除して,TOPのポインターを返す.
Definition: tlist.c:387
tList_data dup_tList_data(tList_data ldat)
ノードデータの複製を作成する
Definition: tlist.c:169
tList * strstr_back_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるリストの後方からのノードの部分文字列サーチ.
Definition: tlist.c:1451
tList * strstrcase_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるノードの部分文字列サーチ.大文字小文字を無視.
Definition: tlist.c:1250
tList * swap_tList_node(tList *pp1, tList *pp2)
pp1ノード と pp2ノードを入れ替える.
Definition: tlist.c:342
int save_Buffer_tList_file(const char *fn, tList *lt)
リストのキー部とバッファ部の Buffer型変数をファイルへ書き込む.
Definition: tlist.c:2344
tList * strnrvscmp_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるノードのサーチ.文字の後方から比べる
Definition: tlist.c:1132
tList_data init_tList_data(void)
空のノードデータを静的に作成.データを初期化するのに使用する.
Definition: tlist.c:26
int replace_value_tList_node(tList *lt, const char *srcval, const char *value)
lt->ldat.val のsrcval部分を value に置き換える.
Definition: tlist.c:1779
tList * awk_Buffer_tList(Buffer buf, char cc)
Buffer 中の文字列を区切り文字で区切って,各項目をリストのキー部に入れて返す.
Definition: tlist.c:1883
tList * strncmp_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるノードのサーチ.
Definition: tlist.c:1056
tList make_tList_node(tList_data data)
リスト用ノードを静的に作成する.
Definition: tlist.c:223
void set_tList_node_bystr(tList *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
文字列データからリストのノードに値を設定する.それぞれのデータは複製されて設定される.
Definition: tlist.c:536
tList * strncaservscmp_back_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるリストの後方からのノードのサーチ.文字も後方から比べる.大文字小文字を無視.
Definition: tlist.c:1413
tList * add_tList_node_byBuffer(tList *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
Buffer データからリスト用ノードを生成し(new),それをリストに追加.
Definition: tlist.c:492
tList * del_tList(tList **pp)
指定したリストノード以降のリストを削除.
Definition: tlist.c:735
void set_tList_node_byBuffer(tList *pp, int id, int lv, Buffer key, Buffer val, void *ptr, int sz)
リストのノードに値を設定する.それぞれのデータは複製されて設定される.
Definition: tlist.c:575
tList * find_tList_top(tList *pp)
リストの最初のノードを探す.
Definition: tlist.c:1002
tList * update_tList_node_bydata(tList *pp, char *key, tList_data ldat)
keyで検索し,ノードがあればノードをコピーする.無ければ最後にノードを追加する(new).
Definition: tlist.c:635
char * get_str_param_tList(tList *lt, const char *key, const char *dflt)
keyに対応する値を 文字列として読み出す.キーがない場合は,デフォルト値 dflt を返す.要 free().
Definition: tlist.c:1994
tList * strnrvscmp_back_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるリストの後方からのノードのサーチ.文字も後方から比べる.
Definition: tlist.c:1375
tList * strncmp_back_tList(tList *pl, const char *key, int len, int no)
char* 型変数によるリストの後方からのノードのサーチ.
Definition: tlist.c:1299
tList * add_tList_node_bydata(tList *pp, tList_data ldat)
データ(ldat)からリスト用ノードを生成し(new),それを指定したリストの後ろに追加.
Definition: tlist.c:417
tList * read_tList_fp(FILE *fp, int mode)
ファイルポインタが示すファイルから一行ずつ読み込んでリストのキー部に格納.
Definition: tlist.c:2158
void dump_tList(FILE *fp, tList *pp)
val.buf を 16進ダンプする.他のデータは通常通り表示する.
Definition: tlist.c:952