I can't even
This commit is contained in:
parent
805f633af0
commit
dcce0ed11b
11 changed files with 611 additions and 165 deletions
|
|
@ -1,61 +1,72 @@
|
|||
#ifdef _STACK_TYPE
|
||||
#ifdef _STACK_NAME
|
||||
#ifndef _STACK_GENERIC_H
|
||||
#define _STACK_GENERIC_H
|
||||
|
||||
|
||||
#ifndef _STACK_REALLOC
|
||||
#define _STACK_REALLOC(p, s) realloc(p,s)
|
||||
#endif
|
||||
#ifndef _STACK_MEMSET
|
||||
#define _STACK_MEMSET(p, c, s) memset(p,c,s)
|
||||
#endif
|
||||
#ifndef _STACK_STEP
|
||||
#define _STACK_STEP 8
|
||||
#endif
|
||||
#ifndef _STACK_CAT
|
||||
#define _STACK_CAT_I(a,b) a ## b
|
||||
#define _STACK_CAT(a,b) _STACK_CAT_I(a,b)
|
||||
#endif
|
||||
#define STACK_STEP 8
|
||||
|
||||
|
||||
// TODO: add a rolling hash
|
||||
struct _STACK_NAME {
|
||||
_STACK_TYPE *items;
|
||||
int size, idx;
|
||||
};
|
||||
|
||||
|
||||
int _STACK_CAT(stack_grow_,_STACK_NAME)(struct _STACK_NAME *stack, int step)
|
||||
{
|
||||
if (!stack)
|
||||
return -1;
|
||||
stack->items = _STACK_REALLOC(stack->items, (stack->size+step)*sizeof(_STACK_TYPE));
|
||||
if(!stack->items)
|
||||
return -1;
|
||||
_STACK_MEMSET(&(stack->items[stack->size]), 0, step*sizeof(*(stack->items)));
|
||||
stack->size += step;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int _STACK_CAT(stack_push_,_STACK_NAME)(struct _STACK_NAME *stack, _STACK_TYPE *e)
|
||||
{
|
||||
if (!stack || !e)
|
||||
return -1;
|
||||
if (stack->idx >= stack->size)
|
||||
if (_STACK_CAT(stack_grow_,_STACK_NAME)(stack, _STACK_STEP))
|
||||
return -1;
|
||||
stack->items[stack->idx++] = *e;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int _STACK_CAT(stack_clear_,_STACK_NAME)(struct _STACK_NAME *stack)
|
||||
{
|
||||
if (!stack)
|
||||
return -1;
|
||||
stack->idx = 0;
|
||||
}
|
||||
#define STACK_DECL(stackname, type) \
|
||||
struct stackname { \
|
||||
type *items; \
|
||||
int size, idx; \
|
||||
}; \
|
||||
\
|
||||
\
|
||||
struct stackname stackname##_init(void) { return (struct stackname){0}; } \
|
||||
\
|
||||
\
|
||||
int stackname##_grow(struct stackname *stack, int step) \
|
||||
{ \
|
||||
if (!stack) \
|
||||
return -1; \
|
||||
stack->items = realloc(stack->items, (stack->size+step)*sizeof(type)); \
|
||||
if(!stack->items) \
|
||||
return -1; \
|
||||
memset(&(stack->items[stack->size]), 0, step*sizeof(*(stack->items))); \
|
||||
stack->size += step; \
|
||||
return 0; \
|
||||
} \
|
||||
\
|
||||
\
|
||||
int stackname##_push(struct stackname *stack, type *e) \
|
||||
{ \
|
||||
if (!stack || !e) \
|
||||
return -1; \
|
||||
if (stack->idx >= stack->size) \
|
||||
if (stackname##_grow(stack, STACK_STEP)) \
|
||||
return -1; \
|
||||
stack->items[stack->idx++] = *e; \
|
||||
return 0; \
|
||||
} \
|
||||
\
|
||||
\
|
||||
type stackname##_pop(struct stackname *stack) \
|
||||
{ \
|
||||
if (!stack || stack->idx == 0 || stack->size == 0) \
|
||||
return (type){0}; \
|
||||
return stack->items[stack->idx--]; \
|
||||
} \
|
||||
\
|
||||
\
|
||||
int stackname##_clear(struct stackname *stack) \
|
||||
{ \
|
||||
if (!stack) \
|
||||
return -1; \
|
||||
stack->idx = 0; \
|
||||
return 0; \
|
||||
} \
|
||||
\
|
||||
\
|
||||
int stackname##_free(struct stackname *stack) \
|
||||
{ \
|
||||
if (stack) { \
|
||||
stackname##_clear(stack); \
|
||||
if (stack->items) \
|
||||
free(stack->items); \
|
||||
} \
|
||||
return 0; \
|
||||
} \
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue