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