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->size)
146 lstrings_pop_back(lstrings);
152 lstrings_free(lstrings_t* lstrings_ptr)
157 if((*lstrings_ptr)->size)
158 lstrings_clear(*lstrings_ptr);
161 allocator_free(&allocator);
164 *lstrings_ptr = NULL;
170 lstrings_push_front(lstrings_t lstrings, const char* string)
172 link_t what, where, next;
174 if(!lstrings || !string)
177 if(!(what = (link_t)link_new((void*)string)))
180 where = (link_t)(&(lstrings->item));
190 /* the iteration functions are now not permited */
192 lstrings->cur = (link_t)(&(lstrings->item));
198 lstrings_push_back(lstrings_t lstrings, const char* string)
200 link_t what, where, prev;
202 if(!lstrings || !string)
205 if(!(what = (link_t)link_new((void*)string)))
208 where = (link_t)(&(lstrings->item));
217 /* the iteration functions are now not permited */
219 lstrings->cur = (link_t)(&(lstrings->item));
225 lstrings_insert_after(lstrings_t lstrings, const char* what, const char* where)
227 link_t __what, __where, __next;
229 if(!lstrings || !what || !where)
232 if(!(__what = link_new((void*)what)))
235 if((__where = search(lstrings, where)))
238 __next = __where->next;
240 __what->prev = __where;
241 __what->next = __next;
242 __next->prev = __what;
243 __where->next = __what;
251 lstrings_insert_before(lstrings_t lstrings, const char* what, const char* where)
253 link_t __what, __where, __prev;
255 if(!lstrings || !what || !where)
258 if(!(__what = link_new((void*)what)))
261 if((__where = search(lstrings, where)))
264 __prev = __where->prev;
266 __what->next = __where;
267 __what->prev = __prev;
268 __prev->next = __what;
269 __where->prev = __what;
277 lstrings_pop_back(lstrings_t lstrings)
279 link_t link, next, prev;
294 link = lstrings->prev;
304 string = (const char*)link->item;
306 link_free((link_t*)&link);
308 /* the iteration functions are now not permited */
310 lstrings->cur = (link_t)(&(lstrings->item));
316 lstrings_pop_front(lstrings_t lstrings)
319 link_t link, next, prev;
334 link = lstrings->next;
343 string = (const char*)link->item;
345 link_free((link_t*)&link);
347 /* the iteration functions are now not permited */
349 lstrings->cur = (link_t)(&(lstrings->item));
355 lstrings_remove(lstrings_t lstrings, const char* string)
357 link_t link, next, prev;
359 if(!lstrings || !string)
365 if(!(link = search(lstrings, string)))
375 /* the iteration functions are now not permited */
377 lstrings->cur = (link_t)(&(lstrings->item));
379 return link_free((link_t*)&link);
383 lstrings_get_size(lstrings_t lstrings)
391 return lstrings->size;
395 lstrings_contains(lstrings_t lstrings, const char* string)
399 if(!lstrings || !string)
411 cur = lstrings->next;
413 while(cur != ((link_t)&(lstrings->item)))
415 if(!strcmp((const char*)(cur->item), string))
425 lstrings_is_empty(lstrings_t lstrings)
433 return !lstrings->size;
437 lstrings_move_next(lstrings_t lstrings)
445 if(!lstrings->size || (-1 == lstrings->pos))
451 if(lstrings->cur != (link_t)(&(lstrings->item)))
453 lstrings->cur = lstrings->cur->next;
464 lstrings_get(lstrings_t lstrings)
472 if(!lstrings->size || (-1 == lstrings->pos))
478 return (const char*)(lstrings->cur->item);
482 lstrings_set(lstrings_t lstrings, const char* string)
484 const char* prev_string;
486 if(!lstrings || !string)
492 if(!lstrings->size || (-1 == lstrings->pos))
498 prev_string = (const char*)(lstrings->cur->item);
499 lstrings->cur->item = (void*)string;
505 lstrings_get_at(lstrings_t lstrings, int pos)
509 if(!lstrings || pos < 0 || pos >= lstrings->size)
521 cur = lstrings->next;
527 return (const char*)(cur->item);
531 lstrings_set_at(lstrings_t lstrings, int pos, const char* string)
534 const char* prev_string;
536 if(!lstrings || !string)
542 if(pos < 0 || pos >= lstrings->size)
554 cur = lstrings->next;
559 prev_string = (const char*)cur->item;
560 cur->item = (void*)string;
567 lstrings_move_prev(lstrings_t lstrings)
575 if(!lstrings->size || (-1 == lstrings->pos))
581 if(lstrings->cur != (link_t)(&(lstrings->item)))
583 lstrings->cur = lstrings->cur->prev;
594 seek_set(lstrings_t lstrings, int offset)
596 if(offset > lstrings->size)
599 lstrings_rewind(lstrings);
602 lstrings_move_next(lstrings);
608 seek_end(lstrings_t lstrings, int offset)
610 if(offset > lstrings->size)
613 lstrings_unwind(lstrings);
616 lstrings_move_prev(lstrings);
623 seek_cur(lstrings_t lstrings, int offset)
625 if(lstrings->cur == lstrings->next)
627 /* we are at the begin of the lstrings */
628 seek_set(lstrings, offset);
630 else if(lstrings->cur == lstrings->prev)
632 /* we are at the end of the lstrings */
633 seek_end(lstrings, offset);
637 if(offset > (lstrings->size - lstrings->pos + 1))
641 lstrings_move_next(lstrings);
649 lstrings_seek(lstrings_t lstrings, int offset, int whence)
660 return seek_set(lstrings, offset);
663 return seek_cur(lstrings, offset);
666 return seek_end(lstrings, offset);
674 lstrings_tell(lstrings_t lstrings)
682 if(!lstrings->size || (-1 == lstrings->pos))
688 return lstrings->pos;
692 lstrings_getpos(lstrings_t lstrings, int* pos)
694 if(!lstrings || !pos)
700 if(!lstrings->size || (-1 == lstrings->pos))
706 *pos = lstrings->pos;
711 lstrings_setpos(lstrings_t lstrings, int pos)
719 if(pos < 0 || pos >= lstrings->size)
731 lstrings->cur = lstrings->next;
735 lstrings->cur = lstrings->cur->next;
742 lstrings_get_front(lstrings_t lstrings)
756 return (const char*)(lstrings->next->item);
761 lstrings_get_back(lstrings_t lstrings)
775 return (const char*)(lstrings->prev->item);
779 lstrings_to_cstr(lstrings_t lstrings)
786 if(!lstrings || !lstrings->size)
792 if(!(cstr = (char**)calloc(lstrings->size, sizeof(char*))))
795 /* get the first link of the list */
796 cur = lstrings->next;
798 for(i = 0; i < size; i++)
800 if(!(cstr[i] = strdup(cur->item)))
804 for(j = 0; j <i; j++)