|
5 | 5 |
|
6 | 6 | #define MAX(a, b) ((a) > (b) ? (a) : (b)) |
7 | 7 |
|
8 | | -#define VEC_RESIZE(vec, _cap) \ |
9 | | - void *tmp = realloc((vec).data, (_cap) * sizeof((vec).data[0])); \ |
10 | | - assert(tmp != NULL); \ |
11 | | - (vec).data = tmp; \ |
12 | | - (vec).cap = (_cap); |
13 | | - |
14 | | -#define VEC_GROW(vec, _cap) \ |
15 | | - if ((vec).cap < (_cap)) { \ |
16 | | - VEC_RESIZE((vec), (_cap)); \ |
| 8 | +#define VEC_RESIZE(vec, _cap) \ |
| 9 | + do { \ |
| 10 | + void *tmp = realloc((vec).data, (_cap) * sizeof((vec).data[0])); \ |
| 11 | + assert(tmp != NULL); \ |
| 12 | + (vec).data = tmp; \ |
| 13 | + (vec).cap = (_cap); \ |
| 14 | + } while (0) |
| 15 | + |
| 16 | +#define VEC_GROW(vec, _cap) \ |
| 17 | + if ((vec).cap < (_cap)) { \ |
| 18 | + VEC_RESIZE((vec), (_cap)); \ |
17 | 19 | } |
18 | 20 |
|
19 | | -#define VEC_PUSH(vec, el) \ |
20 | | - if ((vec).cap == (vec).len) { \ |
21 | | - VEC_RESIZE((vec), MAX(16, (vec).len * 2)); \ |
22 | | - } \ |
23 | | - (vec).data[(vec).len++] = (el); |
| 21 | +#define VEC_PUSH(vec, el) \ |
| 22 | + do { \ |
| 23 | + if ((vec).cap == (vec).len) { \ |
| 24 | + VEC_RESIZE((vec), MAX(16, (vec).len * 2)); \ |
| 25 | + } \ |
| 26 | + (vec).data[(vec).len++] = (el); \ |
| 27 | + } while (0) |
24 | 28 |
|
25 | 29 | #define VEC_POP(vec) (vec).len--; |
26 | 30 |
|
27 | | -#define VEC_NEW \ |
28 | | - { .len = 0, .cap = 0, .data = NULL } |
| 31 | +#define VEC_NEW { .len = 0, .cap = 0, .data = NULL } |
29 | 32 |
|
30 | 33 | #define VEC_BACK(vec) ((vec).data[(vec).len - 1]) |
31 | 34 |
|
32 | | -#define VEC_FREE(vec) \ |
33 | | - { \ |
34 | | - if ((vec).data != NULL) \ |
35 | | - free((vec).data); \ |
| 35 | +#define VEC_FREE(vec) \ |
| 36 | + { \ |
| 37 | + if ((vec).data != NULL) \ |
| 38 | + free((vec).data); \ |
36 | 39 | } |
37 | 40 |
|
38 | 41 | #define VEC_CLEAR(vec) (vec).len = 0; |
39 | 42 |
|
40 | | -#define QUEUE_RESIZE(queue, _cap) \ |
41 | | - do { \ |
42 | | - void *tmp = realloc((queue).data, (_cap) * sizeof((queue).data[0])); \ |
43 | | - assert(tmp != NULL); \ |
44 | | - (queue).data = tmp; \ |
45 | | - (queue).cap = (_cap); \ |
| 43 | +#define QUEUE_RESIZE(queue, _cap) \ |
| 44 | + do { \ |
| 45 | + void *tmp = calloc((_cap), sizeof((queue).data[0])); \ |
| 46 | + assert(tmp != NULL); \ |
| 47 | + uint32_t count = (queue).tail - (queue).head; \ |
| 48 | + for (uint32_t i = 0; i < count; i++) { \ |
| 49 | + ((uint16_t *)tmp)[i] = (queue).data[((queue).head + i) % (queue).cap]; \ |
| 50 | + } \ |
| 51 | + if ((queue).data != NULL) \ |
| 52 | + free((queue).data); \ |
| 53 | + (queue).data = tmp; \ |
| 54 | + (queue).head = 0; \ |
| 55 | + (queue).tail = count; \ |
| 56 | + (queue).cap = (_cap); \ |
46 | 57 | } while (0) |
47 | 58 |
|
48 | | -#define QUEUE_GROW(queue, _cap) \ |
49 | | - do { \ |
50 | | - if ((queue).cap < (_cap)) { \ |
51 | | - QUEUE_RESIZE((queue), (_cap)); \ |
52 | | - } \ |
| 59 | +#define QUEUE_GROW(queue, _cap) \ |
| 60 | + do { \ |
| 61 | + if ((queue).cap < (_cap)) { \ |
| 62 | + QUEUE_RESIZE((queue), (_cap)); \ |
| 63 | + } \ |
53 | 64 | } while (0) |
54 | 65 |
|
55 | | -#define QUEUE_PUSH(queue, el) \ |
56 | | - do { \ |
57 | | - if ((queue).cap == 0) { \ |
58 | | - QUEUE_RESIZE((queue), 16); \ |
59 | | - } else if ((queue).cap == ((queue).tail - (queue).head)) { \ |
60 | | - QUEUE_RESIZE((queue), (queue).cap * 2); \ |
61 | | - } \ |
62 | | - (queue).data[(queue).tail % (queue).cap] = (el); \ |
63 | | - (queue).tail++; \ |
| 66 | +#define QUEUE_PUSH(queue, el) \ |
| 67 | + do { \ |
| 68 | + if ((queue).cap == 0) { \ |
| 69 | + QUEUE_RESIZE((queue), 16); \ |
| 70 | + } else if ((queue).cap == ((queue).tail - (queue).head)) { \ |
| 71 | + QUEUE_RESIZE((queue), (queue).cap * 2); \ |
| 72 | + } \ |
| 73 | + (queue).data[(queue).tail % (queue).cap] = (el); \ |
| 74 | + (queue).tail++; \ |
64 | 75 | } while (0) |
65 | 76 |
|
66 | | -#define QUEUE_POP(queue) \ |
67 | | - do { \ |
68 | | - assert((queue).head < (queue).tail); \ |
69 | | - (queue).head++; \ |
| 77 | +#define QUEUE_POP(queue) \ |
| 78 | + do { \ |
| 79 | + assert((queue).head < (queue).tail); \ |
| 80 | + (queue).head++; \ |
70 | 81 | } while (0) |
71 | 82 |
|
72 | 83 | #define QUEUE_FRONT(queue) (queue).data[(queue).head % (queue).cap] |
73 | 84 |
|
74 | 85 | #define QUEUE_EMPTY(queue) ((queue).head == (queue).tail) |
75 | 86 |
|
76 | | -#define QUEUE_NEW \ |
| 87 | +#define QUEUE_NEW \ |
77 | 88 | { .head = 0, .tail = 0, .cap = 0, .data = NULL } |
78 | 89 |
|
79 | | -#define QUEUE_FREE(queue) \ |
80 | | - do { \ |
81 | | - if ((queue).data != NULL) \ |
82 | | - free((queue).data); \ |
| 90 | +#define QUEUE_FREE(queue) \ |
| 91 | + do { \ |
| 92 | + if ((queue).data != NULL) \ |
| 93 | + free((queue).data); \ |
83 | 94 | } while (0) |
84 | 95 |
|
85 | | -#define QUEUE_CLEAR(queue) \ |
86 | | - do { \ |
87 | | - (queue).head = 0; \ |
88 | | - (queue).tail = 0; \ |
| 96 | +#define QUEUE_CLEAR(queue) \ |
| 97 | + do { \ |
| 98 | + (queue).head = 0; \ |
| 99 | + (queue).tail = 0; \ |
89 | 100 | } while (0) |
90 | 101 |
|
91 | 102 | enum TokenType { |
|
0 commit comments