/*
* An implementation of a char stack in heap memory.
- * Copyright (C) 2014 Michael Goehler
+ * Copyright (C) 2016 Michael Goehler
*
* This file is part of mdp.
*
*
*/
+#include <wchar.h>
+#include <stdio.h> // fprintf
#include <stdlib.h> // 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);
}
-