-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharena.c
93 lines (75 loc) · 2.58 KB
/
arena.c
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "arena.h"
#include <ctype.h>
#include <stddef.h>
#include <stdio.h>
#define malloc(A, P, N) arena_malloc(A, N, sizeof(*(P)), alignof(typeof(*(P))))
#define calloc(A, P, N) arena_calloc(A, N, sizeof(*(P)), alignof(typeof(*(P))))
#define realloc(A, P, N) arena_realloc(A, P, N, sizeof(*(P)), alignof(typeof(*(P))))
#define memdup(A, P, N) arena_memdup(A, P, N, sizeof(*(P)), alignof(typeof(*(P))))
#define strdup(A, S) memdup(A, S, strlen(S) + 1)
#define strapp(A, S1, S2) strcat(realloc(A, S1, strlen(S1) + strlen(S2) + 1), S2)
void temporary(Arena arena);
void permanent(Arena *arena, Arena scratch);
void dump(const void *begin, const void *end);
int main(void) {
constexpr long mega_byte = 1 << 20;
Arena arena = arena_create(mega_byte);
char *string = strdup(&arena, "arena");
dump(arena.data, arena.begin);
printf("\n");
temporary(arena);
dump(arena.data, arena.begin);
printf("\n");
Arena scratch = arena_scratch_create(&arena, mega_byte / 2);
permanent(&arena, scratch);
dump(arena.data, arena.begin);
printf("\n");
arena_scratch_destroy(&arena, scratch);
strapp(&arena, string, " allocator");
dump(arena.data, arena.begin);
printf("\n");
printf("occupied: %ld\n", arena_occupied(&arena));
printf("available: %ld\n", arena_available(&arena));
arena_destroy(&arena);
}
void temporary(Arena arena) {
char *string = strdup(&arena, "tempo");
dump(arena.data, arena.begin);
printf("\n");
strapp(&arena, string, "rary");
dump(arena.data, arena.begin);
printf("\n");
}
void permanent(Arena *arena, Arena scratch) {
char *string = strdup(arena, "perma");
dump(arena->data, arena->begin);
printf("\n");
strdup(&scratch, "scratch");
dump(scratch.data, scratch.begin);
printf("\n");
strapp(arena, string, "nent");
dump(arena->data, arena->begin);
printf("\n");
}
void dump(const void *begin, const void *end) {
constexpr int offset = 16;
printf("%-8s %-*s %s\n", "offset", 3 * offset, "data", "ascii");
for (const char *byte = begin; byte < (char *)end; byte += offset) {
printf("%08tx ", byte - (char *)begin);
for (int i = 0; i < offset; i++) {
if (byte + i < (char *)end) {
printf("%02x ", (unsigned char)byte[i]);
}
else {
printf(" ");
}
}
printf(" ");
for (int i = 0; i < offset; i++) {
if (byte + i < (char *)end) {
printf("%c", isprint(byte[i]) ? byte[i] : '.');
}
}
printf("\n");
}
}