Skip to content

Commit 9500e72

Browse files
committed
fix(scanner): adjust container allocations
1 parent b9b32fa commit 9500e72

File tree

1 file changed

+64
-53
lines changed

1 file changed

+64
-53
lines changed

src/scanner.c

Lines changed: 64 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -5,87 +5,98 @@
55

66
#define MAX(a, b) ((a) > (b) ? (a) : (b))
77

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)); \
1719
}
1820

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)
2428

2529
#define VEC_POP(vec) (vec).len--;
2630

27-
#define VEC_NEW \
28-
{ .len = 0, .cap = 0, .data = NULL }
31+
#define VEC_NEW { .len = 0, .cap = 0, .data = NULL }
2932

3033
#define VEC_BACK(vec) ((vec).data[(vec).len - 1])
3134

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); \
3639
}
3740

3841
#define VEC_CLEAR(vec) (vec).len = 0;
3942

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); \
4657
} while (0)
4758

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+
} \
5364
} while (0)
5465

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++; \
6475
} while (0)
6576

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++; \
7081
} while (0)
7182

7283
#define QUEUE_FRONT(queue) (queue).data[(queue).head % (queue).cap]
7384

7485
#define QUEUE_EMPTY(queue) ((queue).head == (queue).tail)
7586

76-
#define QUEUE_NEW \
87+
#define QUEUE_NEW \
7788
{ .head = 0, .tail = 0, .cap = 0, .data = NULL }
7889

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); \
8394
} while (0)
8495

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; \
89100
} while (0)
90101

91102
enum TokenType {

0 commit comments

Comments
 (0)