1 #include "sdlskk_internal.h"
2 #include <stdlib.h>
3
SDLSKK_StrList_new(void)4 SDLSKK_StrList* SDLSKK_StrList_new( void )
5 {
6 SDLSKK_StrList* list = SDLSKK_malloc( sizeof(SDLSKK_StrList) );
7 SDLSKK_ListElement *begin, *end;
8 begin = SDLSKK_malloc( sizeof(SDLSKK_ListElement) );
9 end = SDLSKK_malloc( sizeof(SDLSKK_ListElement) );
10 list->begin = begin;
11 list->end = end;
12 begin->next = end;
13 begin->prev = NULL;
14 end->prev = begin;
15 end->next = NULL;
16 begin->val = end->val = NULL;
17 return list;
18 }
19
SDLSKK_StrList_find(SDLSKK_StrList * list,SDLSKK_Char * val)20 SDLSKK_ListElement* SDLSKK_StrList_find( SDLSKK_StrList* list, SDLSKK_Char* val )
21 {
22 SDLSKK_ListElement* element;
23 for( element = list->begin->next;
24 element != list->end;
25 element = element->next ){
26 if( SDLSKK_str_equal( element->val, val ) ){
27 return element;
28 }
29 }
30 return NULL;
31 }
32
33 /* prev -> locate -> next ==> prev -> new_element -> locate -> next */
SDLSKK_StrList_insert(SDLSKK_StrList * list,SDLSKK_ListElement * locate,SDLSKK_Char * val,int save)34 void SDLSKK_StrList_insert( SDLSKK_StrList* list, SDLSKK_ListElement *locate,
35 SDLSKK_Char* val, int save )
36 {
37 SDLSKK_ListElement* new_element = SDLSKK_malloc( sizeof(SDLSKK_ListElement) );
38 new_element->val = val;
39 new_element->prev = locate->prev;
40 new_element->next = locate;
41 new_element->save = save;
42 locate->prev->next = new_element;
43 locate->prev = new_element;
44 }
45
SDLSKK_StrList_push(SDLSKK_StrList * list,SDLSKK_Char * val,int save)46 void SDLSKK_StrList_push( SDLSKK_StrList* list, SDLSKK_Char* val, int save )
47 {
48 SDLSKK_StrList_insert( list, list->end, val, save );
49 }
50
SDLSKK_StrList_shift(SDLSKK_StrList * list,SDLSKK_Char * val,int save)51 void SDLSKK_StrList_shift( SDLSKK_StrList* list, SDLSKK_Char* val, int save )
52 {
53 SDLSKK_StrList_insert( list, list->begin->next, val, save );
54 }
55
SDLSKK_StrList_delete(SDLSKK_StrList * list)56 void SDLSKK_StrList_delete( SDLSKK_StrList* list )
57 {
58 SDLSKK_ListElement* element;
59 SDLSKK_ListElement* next_element;
60
61 for( element = list->begin; element != NULL; ){
62 next_element = element->next;
63 free( element );
64 element = next_element;
65 }
66 free( list );
67 return;
68 }
69
SDLSKK_StrList_delete_all(SDLSKK_StrList * list)70 void SDLSKK_StrList_delete_all( SDLSKK_StrList* list )
71 {
72 SDLSKK_ListElement* element;
73 SDLSKK_ListElement* next_element;
74
75 for( element = list->begin; element != NULL; ){
76 next_element = element->next;
77 free( element->val );
78 free( element );
79 element = next_element;
80 }
81 free( list );
82 return;
83 }
84