summaryrefslogtreecommitdiff
path: root/src/stack.c
blob: 4898d836a52066b318b669294a8b40d0f620481f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "./include/stack.h"
#include "./include/hash_table.h"
#include "./include/macros.h"
#include <stdlib.h>

stack_t *init_stack(int ht_size) {
  stack_t *s = (stack_t *)malloc(sizeof(stack_t));
  if (s == NULL)
    die("malloc on stack");
  s->stack = NULL;
  s->cur = -1;
  return s;
}

void stack_push(stack_t *s, hash_table_t *h) {
  if (s->stack == NULL) {
    s->stack = malloc(sizeof(hash_table_t *));
    if (s->stack == NULL)
      die("malloc on stack within stack");
  } else {
    s->stack = realloc(s->stack, 2 + s->cur);
  }
  s->cur++;
  s->stack[s->cur] = h;
}

hash_table_t *stack_peek(stack_t *s) { return s->stack[s->cur]; }

hash_table_t *stack_pop(stack_t *s) {
  hash_table_t *h = s->stack[s->cur];
  s->stack[s->cur] = NULL;
  s->cur--;
  return h;
}