diff options
author | cathook <cat.hook31894@gmail.com> | 2013-11-26 14:29:53 +0800 |
---|---|---|
committer | cathook <cat.hook31894@gmail.com> | 2013-11-26 14:32:14 +0800 |
commit | b05fa4a0fba350843db7b1121b74e1c60da14253 (patch) | |
tree | 88bbb7090af87d64eee952dd40a77a38c9371dc8 | |
parent | e4c361850d46e4ea7f9f2b39c3ae8e2d1b521999 (diff) | |
download | ctl-b05fa4a0fba350843db7b1121b74e1c60da14253.tar.gz ctl-b05fa4a0fba350843db7b1121b74e1c60da14253.tar.zst ctl-b05fa4a0fba350843db7b1121b74e1c60da14253.zip |
update
-rw-r--r-- | include/list.h | 24 | ||||
-rw-r--r-- | src/list.c | 145 |
2 files changed, 167 insertions, 2 deletions
diff --git a/include/list.h b/include/list.h index 58913c4..c436a8a 100644 --- a/include/list.h +++ b/include/list.h @@ -114,6 +114,18 @@ /* Instead of return a pointer, it will change the */ /* pointer you given. */ /* */ +/* */ +/* iterDel(addr of the iterator) */ +/* Delete the iterator you given, returning a pointer*/ +/* to the next iterator */ +/* */ +/* iterDelPrev(addr of the iterator) */ +/* Delete the previous of the iterator you given. */ +/* */ +/* iterDelPrev(addr of the iterator) */ +/* Delete the next of the iterator you given. */ +/* */ +/* */ /**********************************************************/ pvoid ctl_list_initX(ppvoid l, size_t size, uint count); @@ -126,7 +138,7 @@ pcvoid ctl_list_getBackX (ppcvoid l); pvoid ctl_list_getFirstX (ppcvoid l); pvoid ctl_list_getLastX (ppcvoid l); -int ctl_list_setSizeX (ppvoid l); +int ctl_list_setSizeX (ppvoid l, uint count); pvoid ctl_list_setFrontX(ppvoid l, pcvoid data); pvoid ctl_list_setBackX (ppvoid l, pcvoid data); @@ -149,6 +161,10 @@ pvoid ctl_list_iterSetEntryX(ppvoid i, pcvoid *data); pvoid ctl_list_iterGoNextX(ppcvoid i); pvoid ctl_list_iterGoPrevX(ppcvoid i); +pvoid ctl_list_iterDelX (ppvoid i); +pvoid ctl_list_iterDelPrevX(ppvoid i); +pvoid ctl_list_iterDelNextX(ppvoid i); + #define ctl_list_init(X,Y,Z) ctl_list_initX(ppVoid(X),Y,Z) #define ctl_list_free(X) ctl_list_freeX(ppVoid(X)) @@ -160,7 +176,7 @@ pvoid ctl_list_iterGoPrevX(ppcvoid i); #define ctl_list_getFirst(X) ctl_list_getFirstX (ppcVoid(X)) #define ctl_list_getLast(X) ctl_list_getLastX (ppcVoid(X)) -#define ctl_list_setSize(X) ctl_list_setSizeX (ppVoid(l)) +#define ctl_list_setSize(X,Y) ctl_list_setSizeX (ppVoid(l),Y) #define ctl_list_setFront(X,Y) ctl_list_setFrontX(ppVoid(X),pcVoid(Y)) #define ctl_list_setBack(X,Y) ctl_list_setBackX (ppVoid(X),pcVoid(Y)) @@ -183,4 +199,8 @@ pvoid ctl_list_iterGoPrevX(ppcvoid i); #define ctl_list_iterGoNext(X) ctl_list_iterGoNextX(ppcVoid(X)) #define ctl_list_iterGoPrev(X) ctl_list_iterGoPrevX(ppcVoid(X)) +#define ctl_list_iterDel(X) ctl_list_iterDelX (ppVoid(X)) +#define ctl_list_iterDelPrev(X) ctl_list_iterDelPrevX(ppVoid(X)) +#define ctl_list_iterDelNext(X) ctl_list_iterDelNextX(ppVoid(X)) + #endif /* __list_h__ */ diff --git a/src/list.c b/src/list.c new file mode 100644 index 0000000..ceb13cc --- /dev/null +++ b/src/list.c @@ -0,0 +1,145 @@ +#include "list.h" + +struct ListNodeStruct; +struct ListHeaderStruct; + +struct ListNodeStruct{ + struct ListHeaderStruct *head; + struct ListNodeStruct *prev; + struct ListNodeStruct *next; + char buf[]; +}; + +struct ListHeaderStruct{ + size_t size; + uint count; + struct ListNodeStruct data; +}; + +typedef struct ListNodeStruct ListNode; +typedef struct ListHeaderStruct ListHeader; + +#define getHeader(X) (*(ListHeader**)(pChar(X)-offsetof(ListNode,buf))) +#define getNodeSize(X) ((X)->size + sizeof(ListNode)) + +/******************** static functions ********************/ +static void addNode0(ListHeader *l){ + ListNode *tmp = (ListNode*)ctl_malloc(getNodeSize(l)); + tmp->head = l; + tmp->prev = NULL; + tmp->next = NULL; + l->count = 1; + l->data.prev = tmp; + l->data.next = tmp; +} +static void addNodeBack(ListHeader *l){ + ListNode *tmp = (ListNode*)ctl_malloc(getNodeSize(l)); + tmp->head = l; + tmp->next = NULL; + tmp->prev = l->data.next; + l->data.next->next = tmp; + l->data.next = tmp; + l->count++; +} +static void addNodeFront(ListHeader *l){ + ListNode *tmp = (ListNode*)ctl_malloc(getNodeSize(l)); + tmp->head = l; + tmp->prev = NULL; + tmp->next = l->data.prev; + l->data.prev->prev = tmp; + l->data.prev = tmp; + l->count++; +} + +/***************** initalize & destructure ****************/ +pvoid ctl_list_initX(ppvoid l, size_t size, uint count){ + ListHeader *tmp = (ListHeader*)ctl_malloc(sizeof(ListHeader)); + tmp->size = size; + tmp->count = count; + tmp->data.head = tmp; + tmp->data.prev = NULL; + tmp->data.next = NULL; + if(count > 0){ + addNode0(tmp); + int i; + for(i = 1; i < count; i++) + addNodeBack(tmp); + if(l != NULL){ + l = tmp->data.prev->buf; + } + return tmp->data.prev->buf; + }else{ + if(l != NULL){ + l = tmp->data.buf; + } + return tmp->data.buf; + } +} + +pvoid ctl_list_freeX(ppvoid l){ + ListHead* tmp = getHeader(*l); + while(l->data.prev != NULL){ + ListNode *ntmp = l->data.prev; + l->data.prev = l->data.prev->next; + free(ntmp); + } + free(tmp); + *l = NULL; + return NULL; +} + +/**************** about get??? methods ********************/ +int ctl_list_getSizeX(ppcvoid l){ + return getHeader(*l)->count; +} +int ctl_list_getEntrySizeX(ppcvoid l){ + return getHeader(*l)->size; +} +pcvoid ctl_list_getFrontX(ppcvoid l){ + return getHeader(*l)->data.prev->buf; +} +pcvoid ctl_list_getBackX(ppcvoid l){ + return getHeader(*l)->data->next->buf; +} +pvoid ctl_list_getFirstX(ppcvoid l){ + return getHeader(*l)->data.prev->buf; +} +pvoid ctl_list_getLastX(ppcvoid l){ + return getHeader(*l)->data.next->buf; +} + +/**************** about set??? methods ********************/ +int ctl_list_setSizeX (ppvoid l, uint count){ + ListHeader *tmp = getHeader(*l); + if(tmp->count > count){ + int i, ii = tmp->count - ctl_max(count, 1); + for(i = 0; i < ii; i++){ + + } + } +} +pvoid ctl_list_setFrontX(ppvoid l, pcvoid data); +pvoid ctl_list_setBackX (ppvoid l, pcvoid data); + +int ctl_list_addFrontX(ppvoid l, pcvoid data); +int ctl_list_delFrontX(ppvoid l, pcvoid data); +int ctl_list_addBackX (ppvoid l, pcvoid data); +int ctl_list_delBackX (ppvoid l, pcvoid data); + +int ctl_list_catX (ppvoid l, ppcvoid l2); +pvoid ctl_list_copyX (ppvoid l, ppcvoid l2); +int ctl_list_replaceX(ppvoid i1, uint ct1, ppcvoid j1, int ct2); +void ctl_list_swapX (ppvoid i1, ppvoid i2, ppvoid j1, ppvoid j2); + +pcvoid ctl_list_iterGetEntryX(ppcvoid i); +pvoid ctl_list_iterGetNextX (ppcvoid i); +pvoid ctl_list_iterGetPrevX (ppcvoid i); + +pvoid ctl_list_iterSetEntryX(ppvoid i, pcvoid *data); + +pvoid ctl_list_iterGoNextX(ppcvoid i); +pvoid ctl_list_iterGoPrevX(ppcvoid i); + +pvoid ctl_list_iterDelX (ppvoid i); +pvoid ctl_list_iterDelPrevX(ppvoid i); +pvoid ctl_list_iterDelNextX(ppvoid i); |