diff options
author | cathook <cat.hook31894@gmail.com> | 2013-12-02 02:33:34 +0800 |
---|---|---|
committer | cathook <cat.hook31894@gmail.com> | 2013-12-02 02:33:34 +0800 |
commit | 5697b629bed5567020d7f2a8fd3e1a97202111f0 (patch) | |
tree | c684ea816de3e8d7d6a7e029f6f9c97372dd7e1d | |
parent | b5cbca0573f62fd63afb2e4b66b6f74195bc82b8 (diff) | |
download | ctl-5697b629bed5567020d7f2a8fd3e1a97202111f0.tar.gz ctl-5697b629bed5567020d7f2a8fd3e1a97202111f0.tar.zst ctl-5697b629bed5567020d7f2a8fd3e1a97202111f0.zip |
untested
-rw-r--r-- | include/stack.h | 14 | ||||
-rw-r--r-- | src/stack.c | 103 |
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; +} |