ESH

Executive Shell
git clone http://git.omkov.net/ESH
Log | Tree | Refs | README | Download

ESH/src/util/stack.c (36 lines, 799 B) -rw-r--r-- file download

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