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