00001 #ifndef __JBXL_TINY_LIST_H_
00002 #define __JBXL_TINY_LIST_H_
00003
00013 #include "buffer.h"
00014
00015
00016 struct _tList_data;
00017 struct _tList;
00018
00019
00020 struct _tList_data {
00021 int id;
00022 int lv;
00023 Buffer key;
00024 Buffer val;
00025 void* ptr;
00026 int sz;
00027 struct _tList* lst;
00028 };
00029
00030
00043 typedef struct _tList_data tList_data;
00044
00045
00046 struct _tList {
00047 struct _tList_data ldat;
00048
00049 struct _tList* next;
00050 struct _tList* prev;
00051 struct _tList* altp;
00052 struct _tList* yngr;
00053
00054 struct _tList* esis;
00055 struct _tList* ysis;
00056
00057 int depth;
00058 int num;
00059 int ctrl;
00060 int state;
00061 };
00062
00063
00083 typedef struct _tList tList;
00084
00085
00086
00087 #define TLIST_ANCHOR_NODE JBXL_STATE_ANCHOR
00088
00089
00090
00091 #define TLIST_MATCH_COMPLETE 0
00092 #define TLIST_MATCH_TLISTKEY -1
00093 #define TLIST_MATCH_STRINGKEY -2
00094 #define TLIST_MATCH_STRKEY -2
00095
00096
00098
00099
00100 tList_data init_tList_data(void);
00101
00102 tList_data make_tList_data (int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
00103 tList_data make_tList_data_bystr(int id, int lv, const char* key, const char* val, void* ptr, int sz);
00104 #define make_tList_data_byBuffer(i, l, k, v, d, s) make_tList_data((i), (l), (k), (v), (d), (s))
00105 #define make_tList_data_int(k, v) make_tList_data_bystr((k), (v), NULL, NULL, NULL, 0)
00106 #define make_tList_data_str(k, v) make_tList_data_bystr(0, 0, (char*)(k), (char*)(v), NULL, 0)
00107 #define make_tList_data_Buffer(k, v) make_tList_data(0, 0, (k), (v), NULL, 0)
00108
00109 void free_tList_data(tList_data* ldat);
00110 void del_tList_data(tList_data** ldat);
00111 tList_data dup_tList_data(tList_data ldat);
00112
00113
00115
00116
00117 tList* new_tList_node(void);
00118 tList make_tList_node(tList_data data);
00119 tList* del_tList_node(tList** node);
00120 tList* free_tList_node(tList* node);
00121 tList* dup_tList_node (tList* node);
00122 tList* move_tList_node(tList* pp, tList* node);
00123 tList* swap_tList_node(tList* pp1, tList* pp2);
00124
00125 tList* new_tList_anchor_node(void);
00126 tList* del_tList_anchor_node(tList* node);
00127 #define new_tList_anchor() add_tList_node_anchor()
00128 #define del_tList_anchor(t) del_tList_anchor_node((t))
00129
00130
00131
00132 tList* add_tList_node_bydata (tList* pp, tList_data ldat);
00133 tList* add_tList_node_bystr (tList* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz);
00134 tList* add_tList_node_byBuffer(tList* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
00135 #define add_tList_node_anchor() add_tList_node_bystr(NULL, TLIST_ANCHOR_NODE, 0, NULL, NULL, NULL, 0)
00136 #define add_tList_node_int(p, k, v) add_tList_node_bystr((p), (k), (v), NULL, NULL, NULL, 0)
00137 #define add_tList_node_str(p, k, v) add_tList_node_bystr((p), 0, 0, (char*)(k), (char*)(v), NULL, 0)
00138 #define add_tList_node_null(p) add_tList_node_bystr((p), 0, 0, NULL, NULL, NULL, 0)
00139 #define add_tList_node_Buffer(p, k, v) add_tList_node_byBuffer((p), 0, 0, (k), (v), NULL, 0)
00140
00141
00142 void set_tList_node_bydata (tList* pp, tList_data ldat);
00143 void set_tList_node_bystr (tList* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz);
00144 void set_tList_node_byBuffer(tList* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
00145 #define set_tList_node_int(p, k, v) set_tList_node_bystr((p), (k), (v), NULL, NULL, NULL, 0)
00146 #define set_tList_node_str(p, k, v) set_tList_node_bystr((p), 0, 0, (char*)(k), (char*)(v), NULL, 0)
00147 #define set_tList_node_Buffer(p, k, v) set_tList_node_byBuffer((p), 0, 0, (k), (v), NULL, 0)
00148
00149
00150 tList* update_tList_node (tList* pp, tList* pt);
00151 tList* update_tList_node_bydata(tList* pp, char* key, tList_data ldat);
00152 tList* update_tList_node_bystr(tList* pp, int id, int lv, const char* key, const char* val, void* ptr, int sz);
00153 tList* update_tList_node_byBuffer(tList* pp, int id, int lv, Buffer key, Buffer val, void* ptr, int sz);
00154 #define update_tList_node_int(p, k, v) update_tList_node_bystr((p), (k), (v), NULL, NULL, NULL, 0)
00155 #define update_tList_node_str(p, k, v) update_tList_node_bystr((p), 0, 0, (char*)(k), (char*)(v), NULL, 0)
00156 #define update_tList_node_Buffer(p, k, v) update_tList_node_byBuffer((p), 0, 0, (k), (v), NULL, 0)
00157
00158
00160
00161
00162 tList* del_tList(tList** pp);
00163 void del_all_tList(tList** pp);
00164 int del_tList_key(tList** pp, const char* key, int no);
00165
00166 tList* add_tList_end(tList* pp, tList* pt);
00167 tList* insert_tList(tList* pp, tList* pt);
00168 tList* dup_tList(tList* pp);
00169 void print_tList(FILE* fp, tList* pp);
00170 void dump_tList(FILE* fp, tList* pp);
00171 int count_tList(tList* pp);
00172
00173 #define add_tList(p, t) insert_tList((p), (t))
00174 #define add_tList_node(p, t) insert_tList((p), (t))
00175 #define insert_tList_node(p, t) insert_tList((p), (t))
00176 #define new_tList() new_tList_node()
00177
00178 tList* find_tList_top(tList* pp);
00179 tList* find_tList_end(tList* pp);
00180
00181
00182
00183 tList* strncmp_tList (tList* pl, const char* key, int len, int no);
00184 tList* strnrvscmp_tList(tList* pl, const char* key, int len, int no);
00185 tList* strstr_tList (tList* pl, const char* key, int len, int no);
00186
00187 tList* strncasecmp_tList (tList* pl, const char* key, int len, int no);
00188 tList* strncaservscmp_tList(tList* pl, const char* key, int len, int no);
00189 tList* strstrcase_tList (tList* pl, const char* key, int len, int no);
00190
00191 tList* strncmp_back_tList (tList* pl, const char* key, int len, int no);
00192 tList* strnrvscmp_back_tList(tList* pl, const char* key, int len, int no);
00193 tList* strstr_back_tList (tList* pl, const char* key, int len, int no);
00194
00195 tList* strncasecmp_back_tList (tList* pl, const char* key, int len, int no);
00196 tList* strncaservscmp_back_tList(tList* pl, const char* key, int len, int no);
00197 tList* strstrcase_back_tList (tList* pl, const char* key, int len, int no);
00198
00199
00200 tList* search_id_tList (tList* lt, int id, int no);
00201 tList* search_key_tList(tList* lt, const char* key, int no);
00202
00203
00204 Buffer buffer_key_tList(tList* lt, const char* key, int no);
00205 Buffer buffer_key_value_tList(tList* lt, const char* key, char* data, int no);
00206
00207
00208 tList* awk_tList (char* str, char cc);
00209 tList* cawk_tList(char* str, char cc);
00210 tList* awk_Buffer_tList (Buffer buf, char cc);
00211 tList* cawk_Buffer_tList(Buffer buf, char cc);
00212 char* get_str_join_tList(tList* lp, const char* deli);
00213 Buffer get_Buffer_join_tList(tList* lp, const char* deli);
00214
00215
00216 int set_value_tList(tList* lt, const char* key, int no, const char* value, int mode);
00217 int replace_value_tList(tList* lt, const char* key, int no, const char* srcval, char* value);
00218
00219 int set_value_tList_node(tList* lt, const char* value);
00220 int replace_value_tList_node(tList* lt, const char* srcval, const char* value);
00221
00222
00223 char* get_str_param_tList(tList* lt, const char* key, const char* dflt);
00224 int get_int_param_tList(tList* lt, const char* key, int dflt);
00225 double get_double_param_tList(tList* lt, const char* key, double dflt);
00226 float get_float_param_tList (tList* lt, const char* key, float dflt);
00227 int get_bool_param_tList (tList* lt, const char* key, int dflt);
00228
00229 #define get_strparam_tList(l, k, d) get_str_param_tList((l), (k), (d))
00230 #define get_intparam_tList(l, k, d) get_int_param_tList((l), (k), (d))
00231 #define get_doubleparam_tList(l, k, d) get_double_param_tList((l), (k), (d))
00232 #define get_boolparam_tList(l, k, d) get_bool_param_tList((l), (k), (d))
00233
00234
00236
00237
00238 tList* read_tList_fp(FILE* fp, int mode);
00239 tList* read_tList_file(const char* fn, int mode);
00240 tList* read_index_tList_fp(FILE* fp, char deli);
00241 tList* read_index_tList_file(const char* fn, char deli);
00242
00243 tList* read_Buffer_tList_fp(FILE* fp);
00244 tList* read_Buffer_tList_file(const char* fn);
00245 int save_Buffer_tList_fp(FILE* fp, tList* lt);
00246 int save_Buffer_tList_file(const char* fn, tList* lt);
00247
00248
00249 #endif // __JBXL_TINY_LIST_H_
00250