/* casm - Simple, portable assembler Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.co.uk) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ------------------------------------------------------------------------- Collection for macros. */ #include #include #include #include "global.h" #include "stack.h" /* ---------------------------------------- TYPES */ typedef struct stackitem { void *data; struct stackitem *next; } StackItem; struct stack { StackItem *items; int size; }; /* ---------------------------------------- INTERFACES */ Stack *StackCreate(void) { Stack *s; s = Malloc(sizeof *s); s->items = NULL; s->size = 0; return s; } void StackPush(Stack *stack, void *item) { if (stack) { StackItem *i; i = Malloc(sizeof *i); i->next = stack->items; i->data = item; stack->items = i; stack->size++; } } void *StackPop(Stack *stack) { void *item = NULL; if (stack && stack->items) { StackItem *next = stack->items->next; item = stack->items->data; free(stack->items); stack->items = next; stack->size--; } return item; } void *StackPeek(Stack *stack) { void *item = NULL; if (stack && stack->items) { item = stack->items->data; } return item; } int StackSize(Stack *stack) { return stack ? stack->size : 0; } void StackFree(Stack *stack) { if (stack) { StackItem *i = stack->items; while(i) { StackItem *t = i; i = i->next; free(t); } free(stack); } } /* vim: ai sw=4 ts=8 expandtab */