X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=src%2Fcstack.c;h=0906ea5b287effa431356ae7875433c4f23fcf13;hb=354cf2e07ccd0d7900f96bffc279093997cbe203;hp=aafb95f1b1915afde522f74044aa145355cc9ece;hpb=6f9f33a6a5c7d677b4f4464218c01580a391cf08;p=smdp.git diff --git a/src/cstack.c b/src/cstack.c index aafb95f..0906ea5 100644 --- a/src/cstack.c +++ b/src/cstack.c @@ -1,6 +1,6 @@ /* * An implementation of a char stack in heap memory. - * Copyright (C) 2014 Michael Goehler + * Copyright (C) 2018 Michael Goehler * * This file is part of mdp. * @@ -19,49 +19,56 @@ * */ +#include +#include // fprintf #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; + cstack_t *stack = NULL; + if((stack = malloc(sizeof(cstack_t))) != NULL) { + stack->content = NULL; + 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; + } else { + fprintf(stderr, "%s\n", "cstack_init() failed to allocate memory."); + exit(EXIT_FAILURE); + } return stack; } -void cstack_push(cstack_t *self, char c) { +void cstack_push(cstack_t *self, wchar_t c) { if(self->size + sizeof(c) > self->alloc) { - self->alloc += (sizeof(char)); - self->content = realloc(self->content, self->alloc); + self->alloc += (sizeof(wchar_t)); + if((self->content = realloc(self->content, self->alloc)) == NULL) { + fprintf(stderr, "%s\n", "cstack_push() failed to reallocate memory."); + exit(EXIT_FAILURE); + } } self->content[++self->head] = c; - self->size += (sizeof(char)); + self->size += (sizeof(wchar_t)); } -char cstack_pop(cstack_t *self) { - self->size -= (sizeof(char)); +wchar_t cstack_pop(cstack_t *self) { + self->size -= (sizeof(wchar_t)); 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; +bool cstack_top(cstack_t *self, wchar_t c) { + return self->head >= 0 && self->content[self->head] == c; } -int cstack_empty(cstack_t *self) { - return self->head == -1; +bool cstack_empty(cstack_t *self) { + return self->head == -1; } void cstack_delete(cstack_t *self) { free(self->content); free(self); } -