stringlist2.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifdef HAVE_CONFIG_H
00030 # include <config.h>
00031 #endif
00032
00033 #include <gwenhywfar/gwenhywfarapi.h>
00034 #include <gwenhywfar/misc.h>
00035 #include "stringlist2_p.h"
00036 #include "debug.h"
00037 #include <stdlib.h>
00038 #include <assert.h>
00039 #include <string.h>
00040 #ifdef HAVE_STRINGS_H
00041 # include <strings.h>
00042 #endif
00043
00044
00045 GWEN_STRINGLIST2 *GWEN_StringList2_new(){
00046 GWEN_STRINGLIST2 *sl2;
00047 GWEN_REFPTR_INFO *rpi;
00048
00049 GWEN_NEW_OBJECT(GWEN_STRINGLIST2, sl2);
00050 rpi=GWEN_RefPtrInfo_new();
00051 GWEN_RefPtrInfo_SetFreeFn(rpi,
00052 (GWEN_REFPTR_INFO_FREE_FN)free);
00053 sl2->listPtr=GWEN_List_new();
00054 GWEN_List_SetRefPtrInfo(sl2->listPtr, rpi);
00055 GWEN_RefPtrInfo_free(rpi);
00056
00057 return sl2;
00058 }
00059
00060
00061
00062 void GWEN_StringList2_free(GWEN_STRINGLIST2 *sl2){
00063 if (sl2) {
00064 GWEN_List_free(sl2->listPtr);
00065 GWEN_FREE_OBJECT(sl2);
00066 }
00067 }
00068
00069
00070
00071 GWEN_STRINGLIST2 *GWEN_StringList2_dup(GWEN_STRINGLIST2 *sl2){
00072 GWEN_STRINGLIST2 *nsl2;
00073
00074 GWEN_NEW_OBJECT(GWEN_STRINGLIST2, nsl2);
00075 nsl2->listPtr=GWEN_List_dup(sl2->listPtr);
00076 nsl2->senseCase=sl2->senseCase;
00077
00078 return nsl2;
00079 }
00080
00081
00082
00083 void GWEN_StringList2_SetSenseCase(GWEN_STRINGLIST2 *sl2, int i){
00084 assert(sl2);
00085 sl2->senseCase=i;
00086 }
00087
00088
00089
00090 int GWEN_StringList2_AppendString(GWEN_STRINGLIST2 *sl2,
00091 const char *s,
00092 int take,
00093 GWEN_STRINGLIST2_INSERTMODE m) {
00094 GWEN_REFPTR *rp;
00095
00096 assert(sl2);
00097 assert(s);
00098
00099 if (m!=GWEN_StringList2_IntertMode_AlwaysAdd) {
00100 GWEN_STRINGLIST2_ITERATOR *it;
00101
00102 it=GWEN_StringList2__GetString(sl2, s);
00103 if (it) {
00104 if (m==GWEN_StringList2_IntertMode_NoDouble) {
00105 if (take)
00106 free((void*)s);
00107 GWEN_StringList2Iterator_free(it);
00108 return 0;
00109 }
00110 if (m==GWEN_StringList2_IntertMode_Reuse) {
00111 GWEN_ListIterator_IncLinkCount((GWEN_LIST_ITERATOR*)it);
00112 if (take)
00113 free((void*)s);
00114 GWEN_StringList2Iterator_free(it);
00115 return 0;
00116 }
00117 GWEN_StringList2Iterator_free(it);
00118 }
00119 }
00120
00121 if (take)
00122 rp=GWEN_RefPtr_new((void*)s, GWEN_List_GetRefPtrInfo(sl2->listPtr));
00123 else
00124 rp=GWEN_RefPtr_new(strdup(s), GWEN_List_GetRefPtrInfo(sl2->listPtr));
00125 GWEN_RefPtr_AddFlags(rp, GWEN_REFPTR_FLAGS_AUTODELETE);
00126 GWEN_List_PushBackRefPtr(sl2->listPtr, rp);
00127 return 1;
00128 }
00129
00130
00131
00132 int GWEN_StringList2_InsertString(GWEN_STRINGLIST2 *sl2,
00133 const char *s,
00134 int take,
00135 GWEN_STRINGLIST2_INSERTMODE m) {
00136 GWEN_REFPTR *rp;
00137
00138 assert(sl2);
00139 assert(s);
00140
00141 if (m!=GWEN_StringList2_IntertMode_AlwaysAdd) {
00142 GWEN_STRINGLIST2_ITERATOR *it;
00143
00144 it=GWEN_StringList2__GetString(sl2, s);
00145 if (it) {
00146 if (m==GWEN_StringList2_IntertMode_NoDouble) {
00147 if (take)
00148 free((void*)s);
00149 GWEN_StringList2Iterator_free(it);
00150 return 0;
00151 }
00152 if (m==GWEN_StringList2_IntertMode_Reuse) {
00153 GWEN_ListIterator_IncLinkCount((GWEN_LIST_ITERATOR*)it);
00154 if (take)
00155 free((void*)s);
00156 GWEN_StringList2Iterator_free(it);
00157 return 0;
00158 }
00159 GWEN_StringList2Iterator_free(it);
00160 }
00161 }
00162
00163 if (take)
00164 rp=GWEN_RefPtr_new((void*)s, GWEN_List_GetRefPtrInfo(sl2->listPtr));
00165 else
00166 rp=GWEN_RefPtr_new(strdup(s), GWEN_List_GetRefPtrInfo(sl2->listPtr));
00167 GWEN_RefPtr_AddFlags(rp, GWEN_REFPTR_FLAGS_AUTODELETE);
00168 GWEN_List_PushFrontRefPtr(sl2->listPtr, rp);
00169 return 1;
00170 }
00171
00172
00173
00174 int GWEN_StringList2_RemoveString(GWEN_STRINGLIST2 *sl2,
00175 const char *s){
00176 GWEN_STRINGLIST2_ITERATOR *it;
00177
00178 it=GWEN_StringList2__GetString(sl2, s);
00179 if (it) {
00180 int lc;
00181
00182 lc=GWEN_ListIterator_GetLinkCount(it);
00183 GWEN_List_Erase(sl2->listPtr, it);
00184 GWEN_StringList2Iterator_free(it);
00185 if (lc<2)
00186 return 1;
00187 }
00188
00189 return 0;
00190 }
00191
00192
00193
00194 int GWEN_StringList2_HasString(const GWEN_STRINGLIST2 *sl2,
00195 const char *s){
00196 GWEN_STRINGLIST2_ITERATOR *it;
00197 int gotIt;
00198
00199 it=GWEN_StringList2_First(sl2);
00200 gotIt=0;
00201 if (it) {
00202 const char *t;
00203
00204 t=GWEN_StringList2Iterator_Data(it);
00205 if (sl2->senseCase) {
00206 while(t) {
00207 if (strcmp(s, t)) {
00208 gotIt=1;
00209 break;
00210 }
00211 t=GWEN_StringList2Iterator_Next(it);
00212 }
00213 }
00214 else {
00215 while(t) {
00216 if (strcasecmp(s, t)) {
00217 gotIt=1;
00218 break;
00219 }
00220 t=GWEN_StringList2Iterator_Next(it);
00221 }
00222 }
00223 GWEN_StringList2Iterator_free(it);
00224 }
00225
00226 return gotIt;
00227 }
00228
00229
00230
00231 GWEN_STRINGLIST2_ITERATOR*
00232 GWEN_StringList2__GetString(const GWEN_STRINGLIST2 *sl2,
00233 const char *s){
00234 GWEN_STRINGLIST2_ITERATOR *it;
00235 GWEN_REFPTR *rp;
00236
00237 it=GWEN_StringList2_First(sl2);
00238 if (it) {
00239 rp=GWEN_ListIterator_DataRefPtr((GWEN_LIST_ITERATOR*)it);
00240
00241 if (sl2->senseCase) {
00242 while(rp) {
00243 const char *t;
00244
00245 t=(const char*)GWEN_RefPtr_GetData(rp);
00246 assert(t);
00247 if (strcmp(s, t)==0)
00248 return it;
00249 rp=GWEN_ListIterator_NextRefPtr((GWEN_LIST_ITERATOR*)it);
00250 }
00251 }
00252 else {
00253 while(rp) {
00254 const char *t;
00255
00256 t=(const char*)GWEN_RefPtr_GetData(rp);
00257 assert(t);
00258 if (strcasecmp(s, t)==0)
00259 return it;
00260 rp=GWEN_ListIterator_NextRefPtr((GWEN_LIST_ITERATOR*)it);
00261 }
00262 }
00263 GWEN_StringList2Iterator_free(it);
00264 }
00265
00266 return 0;
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 GWEN_STRINGLIST2_ITERATOR *GWEN_StringList2_First(const GWEN_STRINGLIST2 *l) {
00284 assert(l);
00285 return (GWEN_STRINGLIST2_ITERATOR*) GWEN_List_First(l->listPtr);
00286 }
00287
00288
00289
00290 GWEN_STRINGLIST2_ITERATOR *GWEN_StringList2_Last(const GWEN_STRINGLIST2 *l) {
00291 assert(l);
00292 return (GWEN_STRINGLIST2_ITERATOR*) GWEN_List_Last(l->listPtr);
00293 }
00294
00295
00296
00297 void GWEN_StringList2Iterator_free(GWEN_STRINGLIST2_ITERATOR *li) {
00298 assert(li);
00299 GWEN_ListIterator_free((GWEN_LIST_ITERATOR*)li);
00300 }
00301
00302
00303 const char *GWEN_StringList2Iterator_Previous(GWEN_STRINGLIST2_ITERATOR *li) {
00304 assert(li);
00305 return (const char*) GWEN_ListIterator_Previous((GWEN_LIST_ITERATOR*)li);
00306 }
00307
00308
00309 const char *GWEN_StringList2Iterator_Next(GWEN_STRINGLIST2_ITERATOR *li) {
00310 assert(li);
00311 return (const char*) GWEN_ListIterator_Next((GWEN_LIST_ITERATOR*)li);
00312 }
00313
00314
00315 const char *GWEN_StringList2Iterator_Data(GWEN_STRINGLIST2_ITERATOR *li) {
00316 assert(li);
00317 return (const char*) GWEN_ListIterator_Data((GWEN_LIST_ITERATOR*)li);
00318 }
00319
00320
00321
00322 GWEN_REFPTR*
00323 GWEN_StringList2Iterator_DataRefPtr(GWEN_STRINGLIST2_ITERATOR *li) {
00324 assert(li);
00325 return (GWEN_REFPTR*) GWEN_ListIterator_DataRefPtr((GWEN_LIST_ITERATOR*)li);
00326 }
00327
00328
00329
00330 unsigned int
00331 GWEN_StringList2Iterator_GetLinkCount(const GWEN_STRINGLIST2_ITERATOR *li){
00332 assert(li);
00333 return GWEN_ListIterator_GetLinkCount((const GWEN_LIST_ITERATOR*)li);
00334 }
00335
00336
00337
00338 void GWEN_StringList2_Dump(const GWEN_STRINGLIST2 *sl2){
00339 GWEN_STRINGLIST2_ITERATOR *it;
00340
00341 it=GWEN_StringList2_First(sl2);
00342 if (it) {
00343 const char *t;
00344 int i;
00345
00346 t=GWEN_StringList2Iterator_Data(it);
00347 i=0;
00348 while(t) {
00349 fprintf(stderr, "String %d: \"%s\" [%d]\n", i, t,
00350 GWEN_StringList2Iterator_GetLinkCount(it));
00351 t=GWEN_StringList2Iterator_Next(it);
00352 }
00353 GWEN_StringList2Iterator_free(it);
00354 }
00355 else {
00356 fprintf(stderr, "Empty string list.\n");
00357 }
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367