aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcathook <cat.hook31894@gmail.com>2013-11-26 14:29:53 +0800
committercathook <cat.hook31894@gmail.com>2013-11-26 14:32:14 +0800
commitb05fa4a0fba350843db7b1121b74e1c60da14253 (patch)
tree88bbb7090af87d64eee952dd40a77a38c9371dc8
parente4c361850d46e4ea7f9f2b39c3ae8e2d1b521999 (diff)
downloadctl-b05fa4a0fba350843db7b1121b74e1c60da14253.tar.gz
ctl-b05fa4a0fba350843db7b1121b74e1c60da14253.tar.zst
ctl-b05fa4a0fba350843db7b1121b74e1c60da14253.zip
update
-rw-r--r--include/list.h24
-rw-r--r--src/list.c145
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);