#include #include #include "stack.h" Stack* CreateStack() { int32_t i; Stack *stack = (Stack*) malloc(sizeof(Stack)); stack->stackCapacity = 4; stack->stackFrames = (StackFrame*) malloc(sizeof(StackFrame) * stack->stackCapacity); for (i = 0; i < stack->stackCapacity; i += 1) { stack->stackFrames[i].nodes = NULL; stack->stackFrames[i].nodeCapacity = 0; stack->stackFrames[i].nodeCount = 0; } stack->stackIndex = 0; PushStackFrame(stack); return stack; } void PushStackFrame(Stack *stack) { stack->stackIndex += 1; if (stack->stackIndex == stack->stackCapacity) { stack->stackCapacity += 1; stack->stackFrames = (StackFrame*) realloc(stack->stackFrames, sizeof(StackFrame) * stack->stackCapacity); stack->stackFrames[stack->stackIndex].nodes = NULL; stack->stackFrames[stack->stackIndex].nodeCapacity = 0; stack->stackFrames[stack->stackIndex].nodeCount = 0; } stack->stackFrames[stack->stackIndex].nodeCount = 0; } void PopStackFrame(Stack *stack) { stack->stackIndex -= 1; } void AddNode(Stack *stack, Node *statementNode) { StackFrame *stackFrame = &stack->stackFrames[stack->stackIndex]; if (stackFrame->nodeCount == stackFrame->nodeCapacity) { stackFrame->nodeCapacity += 1; stackFrame->nodes = (Node**) realloc(stackFrame->nodes, sizeof(Node*) * stackFrame->nodeCapacity); } stackFrame->nodes[stackFrame->nodeCount] = statementNode; stackFrame->nodeCount += 1; } Node** GetNodes(Stack *stack, uint32_t *pCount) { if (stack->stackIndex < 0) { *pCount= 0; return NULL; } *pCount = stack->stackFrames[stack->stackIndex].nodeCount; return stack->stackFrames[stack->stackIndex].nodes; }