//dstack.h
#define DSTACK void*
#define ITEM int
DSTACK createDStack(int initSize,int growSize);
bool releaseDStack(DSTACK stack);
void pushStack(DSTACK stack,ITEM item);
ITEM popStack(DSTACK stack);
//dstack.cpp
#include "stdafx.h"
#include <windows.h>
#include "DSTACK.H"
#include <stdlib.h>
typedef struct
{
int * esp;
int * bottom;
int * top;
int currSize;
int growSize;
int currOffset;
CRITICAL_SECTION cs;
}DStack;
typedef struct
{
DStack * ref;
}DStackRef;
void _expandStack(DStackRef* stackref )
{
DStack * stack = stackref->ref;
DStack * newstack = new DStack();
newstack->bottom = (int*)malloc((stack->currSize + stack->growSize)* 4 );
newstack->currSize = stack->currSize + stack->growSize;
newstack->top = (int*)newstack->bottom + newstack->currSize;
newstack->growSize = stack->growSize;
memcpy(newstack->bottom,stack->bottom,stack->currSize*4);
newstack->esp = newstack->bottom + (stack->esp - stack->bottom);
free(stack->bottom);
stackref->ref = newstack;
}
DSTACK createDStack(int initSize,int growSize)
{
DStackRef * stackref = new DStackRef();
DStack * stack = new DStack();
stack->bottom = (int*)malloc(initSize * 4 );
stack->currSize = initSize;
stack->growSize = growSize;
stack->esp = stack->bottom ;
stack->top = (int*)stack->bottom + initSize;
stack->currOffset = 0;
stackref->ref = stack;
return (DSTACK)(stackref);
}
bool releaseDStack(DSTACK stack)
{
DStackRef * stackref = (DStackRef *)stack;
DStack * stk = stackref->ref;
free(stk->bottom);
delete stk;
delete stackref;
return true;
}
void pushStack(DSTACK stack,ITEM item)
{
DStackRef * stackref = (DStackRef *)stack;
DStack * stk = stackref->ref;
if(stk->esp==stk->top )
{
_expandStack(stackref);
stk = stackref->ref;
}
*(stk->esp) = (int)item;
stk->esp++;
stk->currOffset++;
}
ITEM popStack(DSTACK stack)
{
DStackRef * stackref = (DStackRef *)stack;
DStack * stk = stackref->ref;
if(stk->esp==stk->bottom)
return NULL;
stk->esp--;
stk->currOffset--;
int value = *(stk->esp);
return ITEM(value);
}