/src/hoextdown/src/stack.c
Line | Count | Source |
1 | | #include "stack.h" |
2 | | |
3 | | #include "buffer.h" |
4 | | |
5 | | #include <stdlib.h> |
6 | | #include <string.h> |
7 | | #include <assert.h> |
8 | | |
9 | | void |
10 | | hoedown_stack_init(hoedown_stack *st, size_t initial_size) |
11 | 25.7k | { |
12 | 25.7k | assert(st); |
13 | | |
14 | 25.7k | st->item = NULL; |
15 | 25.7k | st->size = st->asize = 0; |
16 | | |
17 | 25.7k | if (!initial_size) |
18 | 0 | initial_size = 8; |
19 | | |
20 | 25.7k | hoedown_stack_grow(st, initial_size); |
21 | 25.7k | } |
22 | | |
23 | | void |
24 | | hoedown_stack_uninit(hoedown_stack *st) |
25 | 25.7k | { |
26 | 25.7k | assert(st); |
27 | | |
28 | 25.7k | free(st->item); |
29 | 25.7k | } |
30 | | |
31 | | void |
32 | | hoedown_stack_grow(hoedown_stack *st, size_t neosz) |
33 | 27.4k | { |
34 | 27.4k | assert(st); |
35 | | |
36 | 27.4k | if (st->asize >= neosz) |
37 | 0 | return; |
38 | | |
39 | 27.4k | st->item = hoedown_realloc(st->item, neosz * sizeof(void *)); |
40 | 27.4k | memset(st->item + st->asize, 0x0, (neosz - st->asize) * sizeof(void *)); |
41 | | |
42 | 27.4k | st->asize = neosz; |
43 | | |
44 | 27.4k | if (st->size > neosz) |
45 | 0 | st->size = neosz; |
46 | 27.4k | } |
47 | | |
48 | | void |
49 | | hoedown_stack_push(hoedown_stack *st, void *item) |
50 | 67.1k | { |
51 | 67.1k | assert(st); |
52 | | |
53 | 67.1k | if (st->size >= st->asize) |
54 | 1.70k | hoedown_stack_grow(st, st->size * 2); |
55 | | |
56 | 67.1k | st->item[st->size++] = item; |
57 | 67.1k | } |
58 | | |
59 | | void * |
60 | | hoedown_stack_pop(hoedown_stack *st) |
61 | 0 | { |
62 | 0 | assert(st); |
63 | |
|
64 | 0 | if (!st->size) |
65 | 0 | return NULL; |
66 | | |
67 | 0 | return st->item[--st->size]; |
68 | 0 | } |
69 | | |
70 | | void * |
71 | | hoedown_stack_top(const hoedown_stack *st) |
72 | 0 | { |
73 | 0 | assert(st); |
74 | |
|
75 | 0 | if (!st->size) |
76 | 0 | return NULL; |
77 | | |
78 | 0 | return st->item[st->size - 1]; |
79 | 0 | } |