aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcathook <cat.hook31894@gmail.com>2013-12-02 02:33:34 +0800
committercathook <cat.hook31894@gmail.com>2013-12-02 02:33:34 +0800
commit5697b629bed5567020d7f2a8fd3e1a97202111f0 (patch)
treec684ea816de3e8d7d6a7e029f6f9c97372dd7e1d
parentb5cbca0573f62fd63afb2e4b66b6f74195bc82b8 (diff)
downloadctl-5697b629bed5567020d7f2a8fd3e1a97202111f0.tar.gz
ctl-5697b629bed5567020d7f2a8fd3e1a97202111f0.tar.zst
ctl-5697b629bed5567020d7f2a8fd3e1a97202111f0.zip
untested
-rw-r--r--include/stack.h14
-rw-r--r--src/stack.c103
2 files changed, 110 insertions, 7 deletions
diff --git a/include/stack.h b/include/stack.h
index 87e3c9a..a8815b4 100644
--- a/include/stack.h
+++ b/include/stack.h
@@ -1,14 +1,14 @@
-#ifndef __QUEUE_H__
-#define __QUEUE_H__
+#ifndef __STACK_H__
+#define __STACK_H__
#include "utility.h"
-pvoid ctl_stack_initX(ppvoid q, uint size);
-pvoid ctl_stack_freeX(ppvoid q);
+pvoid ctl_stack_initX(ppvoid s, uint size);
+pvoid ctl_stack_freeX(ppvoid s);
uint ctl_stack_getEntrySizeX(ppcvoid q);
-pcvoid ctl_stack_getTopX (ppcvoid q);
int ctl_stack_isEmptyX (ppcvoid q);
+pcvoid ctl_stack_getX (ppcvoid q);
pcvoid ctl_stack_addX(ppvoid q, pcvoid data);
int ctl_stack_delX(ppvoid q);
@@ -19,12 +19,12 @@ pvoid ctl_stack_copyX(ppcvoid q, ppvoid q2);
#define ctl_stack_free(X) ctl_stack_freeX(ppVoid(X))
#define ctl_stack_getEntrySize(X) ctl_stack_getEntrySizeX(ppcVoid(X))
-#define ctl_stack_getFront(X) ctl_stack_getFrontX (ppcVoid(X))
#define ctl_stack_isEmpty(X) ctl_stack_isEmptyX (ppcVoid(X))
+#define ctl_stack_get(X) ctl_stack_getX (ppcVoid(X))
#define ctl_stack_add(X,Y) ctl_stack_addX(ppVoid(X),pcVoid(Y))
#define ctl_stack_del(X) ctl_stack_delX(ppVoid(X))
#define ctl_stack_copy(X,Y) ctl_stack_copyX(ppcVoid(X),ppVoid(Y))
-#endif /* __QUEUE_H__ */
+#endif /* __STACK_H__ */
diff --git a/src/stack.c b/src/stack.c
new file mode 100644
index 0000000..0cd95b3
--- /dev/null
+++ b/src/stack.c
@@ -0,0 +1,103 @@
+#include "stack.h"
+#include "utility.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+
+struct StackHeadStruct;
+struct StackNodeStruct;
+
+struct StackNodeStruct{
+ struct StackHeadStruct* head;
+ struct StackNodeStruct* prev;
+ char buf[];
+};
+struct StackHeadStruct{
+ uint size;
+ struct StackNodeStruct* top;
+ struct StackNodeStruct data;
+};
+
+typedef struct StackNodeStruct StackNode;
+typedef struct StackHeadStruct StackHead;
+
+#define getHead(X) (((StackNode*)(pChar(X)-offsetof(StackNode, buf)))->head)
+#define getSize(X) (sizeof(StackNode) + (getHead(X)->size))
+
+pvoid ctl_stack_initX(ppvoid q, uint size){
+ StackHead* head = (StackHead*)ctl_malloc(sizeof(StackHead));
+ head->size = size;
+ head->top = NULL;
+ head->data.head = head;
+ head->data.prev = NULL;
+ if(q != NULL){
+ *q = pVoid(head->data.buf);
+ }
+ return pVoid(head->data.buf);
+}
+pvoid ctl_stack_freeX(ppvoid q){
+ StackHead* head = getHead(*q);
+ StackNode* node;
+ StackNode* temp;
+ for(node = head->top; node != NULL; node = temp){
+ temp = node->prev;
+ free(node);
+ }
+ free(head);
+ *q = NULL;
+ return NULL;
+}
+
+uint ctl_stack_getEntrySizeX(ppcvoid q){
+ return getHead(*q)->size;
+}
+
+pcvoid ctl_stack_getX(ppcvoid q){
+ return *q;
+}
+int ctl_stack_isEmptyX(ppcvoid q){
+ return (getHead(*q)->top == NULL ? 1 : 0);
+}
+
+pcvoid ctl_stack_addX(ppvoid q, pcvoid data){
+ StackHead* head = getHead(*q);
+ StackNode* temp = (StackNode*)ctl_malloc(getSize(*q));
+ temp->head = head;
+ temp->prev = head->top;
+ memcpy(temp->buf, data, head->size);
+ head->top = temp;
+ *q = pVoid(head->top->buf);
+ return *q;
+}
+int ctl_stack_delX(ppvoid q){
+ StackHead* head = getHead(*q);
+ StackNode* temp = head->top->prev;
+ free(head->top);
+ head->top = temp;
+ if(temp == NULL){
+ *q = pVoid(head->data.buf);
+ return 1;
+ }else{
+ *q = pVoid(head->top->buf);
+ return 0;
+ }
+}
+
+pvoid ctl_stack_copyX(ppcvoid q, ppvoid q2){
+ ctl_stack_initX(q2, getHead(q)->size);
+ if(!ctl_stack_isEmpty(q)){
+ StackNode* node = getHead(q)->top;
+ StackNode* nod2;
+ StackHead* hea2 = getHead(*q2);
+ ctl_stack_addX(q2, node->buf);
+ nod2 = hea2->top;
+ for(node = node->prev; node != NULL; node = node->prev){
+ nod2->prev = (StackNode*)ctl_malloc(getSize(q2));
+ nod2->prev->head = getHead(q2);
+ nod2->prev->prev = NULL;
+ memcpy(nod2->prev->buf, node->buf, getHead(q2)->size);
+ }
+ }
+ return *q2;
+}