10 #define __DEFAULT_BLOCK_CAPACITY 128
29 if(!(link = (link_t)allocator_alloc(allocator)))
32 link->next = link->prev = NULL;
39 link_free(link_t* ref)
44 allocator_dealloc(allocator, *ref);
51 search(lstrings_t lstrings, const char* string)
53 register link_t cur = lstrings->next;
55 while(cur != ((link_t)&(lstrings->item)))
57 if(!strcmp((const char*)(cur->item),string))
74 if(!(lstrings = (lstrings_t)calloc(1,sizeof(s_lstrings_t))))
79 if(!(allocator = allocator_new(__DEFAULT_BLOCK_CAPACITY, sizeof(s_link_t), NULL)))
86 lstrings->next = lstrings->prev = lstrings->cur = (link_t)(&(lstrings->item));
95 lstrings_rewind(lstrings_t lstrings)
109 lstrings->cur = lstrings->next;
116 lstrings_unwind(lstrings_t lstrings)
130 lstrings->cur = lstrings->prev;
131 lstrings->pos = lstrings->size - 1;
137 lstrings_clear(lstrings_t lstrings)
145 while(lstrings_pop_back(lstrings));
151 lstrings_free(lstrings_t* lstrings_ptr)
156 if((*lstrings_ptr)->size)
157 lstrings_clear(*lstrings_ptr);
160 allocator_free(&allocator);
163 *lstrings_ptr = NULL;
169 lstrings_push_front(lstrings_t lstrings, const char* string)
171 link_t what, where, next;
173 if(!lstrings || !string)
176 if(!(what = (link_t)link_new((void*)string)))
179 where = (link_t)(&(lstrings->item));
189 /* the iteration functions are now not permited */
191 lstrings->cur = (link_t)(&(lstrings->item));
197 lstrings_push_back(lstrings_t lstrings, const char* string)
199 link_t what, where, prev;
201 if(!lstrings || !string)
204 if(!(what = (link_t)link_new((void*)string)))
207 where = (link_t)(&(lstrings->item));
216 /* the iteration functions are now not permited */
218 lstrings->cur = (link_t)(&(lstrings->item));
224 lstrings_insert_after(lstrings_t lstrings, const char* what, const char* where)
226 link_t __what, __where, __next;
228 if(!lstrings || !what || !where)
231 if(!(__what = link_new((void*)what)))
234 if((__where = search(lstrings, where)))
237 __next = __where->next;
239 __what->prev = __where;
240 __what->next = __next;
241 __next->prev = __what;
242 __where->next = __what;
250 lstrings_insert_before(lstrings_t lstrings, const char* what, const char* where)
252 link_t __what, __where, __prev;
254 if(!lstrings || !what || !where)
257 if(!(__what = link_new((void*)what)))
260 if((__where = search(lstrings, where)))
263 __prev = __where->prev;
265 __what->next = __where;
266 __what->prev = __prev;
267 __prev->next = __what;
268 __where->prev = __what;
276 lstrings_pop_back(lstrings_t lstrings)
278 link_t link, next, prev;
293 link = lstrings->prev;
303 string = (const char*)link->item;
305 link_free((link_t*)&link);
307 /* the iteration functions are now not permited */
309 lstrings->cur = (link_t)(&(lstrings->item));
315 lstrings_pop_front(lstrings_t lstrings)
318 link_t link, next, prev;
333 link = lstrings->next;
342 string = (const char*)link->item;
344 link_free((link_t*)&link);
346 /* the iteration functions are now not permited */
348 lstrings->cur = (link_t)(&(lstrings->item));
354 lstrings_remove(lstrings_t lstrings, const char* string)
356 link_t link, next, prev;
358 if(!lstrings || !string)
364 if(!(link = search(lstrings, string)))
374 /* the iteration functions are now not permited */
376 lstrings->cur = (link_t)(&(lstrings->item));
378 return link_free((link_t*)&link);
382 lstrings_get_size(lstrings_t lstrings)
390 return lstrings->size;
394 lstrings_contains(lstrings_t lstrings, const char* string)
398 if(!lstrings || !string)
410 cur = lstrings->next;
412 while(cur != ((link_t)&(lstrings->item)))
414 if(!strcmp((const char*)(cur->item), string))
424 lstrings_is_empty(lstrings_t lstrings)
432 return !lstrings->size;
436 lstrings_move_next(lstrings_t lstrings)
444 if(!lstrings->size || (-1 == lstrings->pos))
450 if(lstrings->cur != (link_t)(&(lstrings->item)))
452 lstrings->cur = lstrings->cur->next;
463 lstrings_get(lstrings_t lstrings)
471 if(!lstrings->size || (-1 == lstrings->pos))
477 return (const char*)(lstrings->cur->item);
481 lstrings_set(lstrings_t lstrings, const char* string)
483 const char* prev_string;
485 if(!lstrings || !string)
491 if(!lstrings->size || (-1 == lstrings->pos))
497 prev_string = (const char*)(lstrings->cur->item);
498 lstrings->cur->item = (void*)string;
504 lstrings_get_at(lstrings_t lstrings, int pos)
508 if(!lstrings || pos < 0 || pos >= lstrings->size)
520 cur = lstrings->next;
526 return (const char*)(cur->item);
530 lstrings_set_at(lstrings_t lstrings, int pos, const char* string)
533 const char* prev_string;
535 if(!lstrings || !string)
541 if(pos < 0 || pos >= lstrings->size)
553 cur = lstrings->next;
558 prev_string = (const char*)cur->item;
559 cur->item = (void*)string;
566 lstrings_move_prev(lstrings_t lstrings)
574 if(!lstrings->size || (-1 == lstrings->pos))
580 if(lstrings->cur != (link_t)(&(lstrings->item)))
582 lstrings->cur = lstrings->cur->prev;
593 seek_set(lstrings_t lstrings, int offset)
595 if(offset > lstrings->size)
598 lstrings_rewind(lstrings);
601 lstrings_move_next(lstrings);
607 seek_end(lstrings_t lstrings, int offset)
609 if(offset > lstrings->size)
612 lstrings_unwind(lstrings);
615 lstrings_move_prev(lstrings);
622 seek_cur(lstrings_t lstrings, int offset)
624 if(lstrings->cur == lstrings->next)
626 /* we are at the begin of the lstrings */
627 seek_set(lstrings, offset);
629 else if(lstrings->cur == lstrings->prev)
631 /* we are at the end of the lstrings */
632 seek_end(lstrings, offset);
636 if(offset > (lstrings->size - lstrings->pos + 1))
640 lstrings_move_next(lstrings);
648 lstrings_seek(lstrings_t lstrings, int offset, int whence)
659 return seek_set(lstrings, offset);
662 return seek_cur(lstrings, offset);
665 return seek_end(lstrings, offset);
673 lstrings_tell(lstrings_t lstrings)
681 if(!lstrings->size || (-1 == lstrings->pos))
687 return lstrings->pos;
691 lstrings_getpos(lstrings_t lstrings, int* pos)
693 if(!lstrings || !pos)
699 if(!lstrings->size || (-1 == lstrings->pos))
705 *pos = lstrings->pos;
710 lstrings_setpos(lstrings_t lstrings, int pos)
718 if(pos < 0 || pos >= lstrings->size)
730 lstrings->cur = lstrings->next;
734 lstrings->cur = lstrings->cur->next;
741 lstrings_get_front(lstrings_t lstrings)
755 return (const char*)(lstrings->next->item);
760 lstrings_get_back(lstrings_t lstrings)
774 return (const char*)(lstrings->prev->item);
778 lstrings_to_cstr(lstrings_t lstrings)
785 if(!lstrings || !lstrings->size)
791 if(!(cstr = (char**)calloc(lstrings->size, sizeof(char*))))
794 /* get the first link of the list */
795 cur = lstrings->next;
797 for(i = 0; i < size; i++)
799 if(!(cstr[i] = strdup(cur->item)))
803 for(j = 0; j <i; j++)