8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
0
|
// Copyright (C) 2023, Jakob Wakeling |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
1
|
// All rights reserved. |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
2
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
3
|
#include "stack.h" |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
4
|
#include "util.h" |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
5
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
6
|
#include <stdlib.h> |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
7
|
#include <string.h> |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
8
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
9
|
/* Initialise a stack. */ |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
10
|
stack stack_init(u64 el, void (*free)(void *)) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
11
|
return (stack){ .el = el, .free = free }; |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
12
|
} |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
13
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
14
|
/* Uninitialise a stack. */ |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
15
|
void stack_free(stack *s) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
16
|
if (s) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
17
|
if (s->free) for (u64 i = 0; i < s->al; i += 1) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
18
|
void *e; memcpy(&e, s->a + i * s->el, s->el); s->free(e); |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
19
|
} |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
20
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
21
|
free(s->a); |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
22
|
} |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
23
|
} |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
24
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
25
|
/* Push a pointer to the top of a stack. */ |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
26
|
void _stack_push(stack *s, void *e) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
27
|
s->a = xrealloc(s->a, (s->ac += 1) * s->el); |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
28
|
memcpy(s->a + (s->al * s->el), &e, s->el); s->al += 1; |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
29
|
} |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
30
|
|
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
31
|
/* Pop a pointer from the top of a stack. */ |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
32
|
void *stack_pop(stack *s) { |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
33
|
void *e; memcpy(&e, s->a + ((s->al -= 1) * s->el), s->el); return e; |
8344335 |
Jakob Wakeling |
2023-12-27 15:41:39 |
34
|
} |
|
|
|
35
|
|