X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=src%2Fcstack.c;fp=src%2Fcstack.c;h=aafb95f1b1915afde522f74044aa145355cc9ece;hb=6f9f33a6a5c7d677b4f4464218c01580a391cf08;hp=0000000000000000000000000000000000000000;hpb=3abe61887adc463e2d00c000012d1e2cff15f56f;p=smdp.git diff --git a/src/cstack.c b/src/cstack.c new file mode 100644 index 0000000..aafb95f --- /dev/null +++ b/src/cstack.c @@ -0,0 +1,67 @@ +/* + * An implementation of a char stack in heap memory. + * Copyright (C) 2014 Michael Goehler + * + * This file is part of mdp. + * + * 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 . + * + */ + +#include // malloc, realloc + +#include "cstack.h" + +cstack_t *cstack_init() { + cstack_t *stack = malloc(sizeof(cstack_t)); + stack->content = (void*)0; + stack->alloc = stack->size = 0; + stack->head = -1; + stack->push = cstack_push; + stack->pop = cstack_pop; + stack->top = cstack_top; + stack->empty = cstack_empty; + stack->delete = cstack_delete; + return stack; +} + +void cstack_push(cstack_t *self, char c) { + if(self->size + sizeof(c) > self->alloc) { + self->alloc += (sizeof(char)); + self->content = realloc(self->content, self->alloc); + } + self->content[++self->head] = c; + self->size += (sizeof(char)); +} + +char cstack_pop(cstack_t *self) { + self->size -= (sizeof(char)); + return self->content[self->head--]; +} + +int cstack_top(cstack_t *self, char c) { + if(self->head >= 0 && self->content[self->head] == c) + return 1; + return 0; +} + +int cstack_empty(cstack_t *self) { + return self->head == -1; +} + +void cstack_delete(cstack_t *self) { + free(self->content); + free(self); +} +