Skip to content

Commit 884239d

Browse files
committed
Make klist cope with OoM situations; Improve c++ compatibility
1 parent 8f729b6 commit 884239d

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

klist.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
kmptype_t **buf; \
4343
} kmp_##name##_t; \
4444
SCOPE kmp_##name##_t *kmp_init_##name(void) { \
45-
return calloc(1, sizeof(kmp_##name##_t)); \
45+
return (kmp_##name##_t *)calloc(1, sizeof(kmp_##name##_t)); \
4646
} \
4747
SCOPE void kmp_destroy_##name(kmp_##name##_t *mp) { \
4848
size_t k; \
@@ -53,14 +53,16 @@
5353
} \
5454
SCOPE kmptype_t *kmp_alloc_##name(kmp_##name##_t *mp) { \
5555
++mp->cnt; \
56-
if (mp->n == 0) return calloc(1, sizeof(kmptype_t)); \
56+
if (mp->n == 0) return (kmptype_t*)calloc(1,sizeof(kmptype_t)); \
5757
return mp->buf[--mp->n]; \
5858
} \
5959
SCOPE void kmp_free_##name(kmp_##name##_t *mp, kmptype_t *p) { \
6060
--mp->cnt; \
6161
if (mp->n == mp->max) { \
62-
mp->max = mp->max? mp->max<<1 : 16; \
63-
mp->buf = realloc(mp->buf, sizeof(kmptype_t *) * mp->max); \
62+
size_t new_max = mp->max ? mp->max<<1 : 16; \
63+
void* nb = realloc(mp->buf, sizeof(kmptype_t *) * new_max); \
64+
if (!nb) { kmpfree_f(p); free(p); return; } \
65+
mp->max = new_max; mp->buf = (kmptype_t **)nb; \
6466
} \
6567
mp->buf[mp->n++] = p; \
6668
}
@@ -87,9 +89,12 @@
8789
size_t size; \
8890
} kl_##name##_t; \
8991
SCOPE kl_##name##_t *kl_init_##name(void) { \
90-
kl_##name##_t *kl = calloc(1, sizeof(kl_##name##_t)); \
92+
kl_##name##_t *kl = (kl_##name##_t *)calloc(1, sizeof(kl_##name##_t)); \
93+
if (!kl) return 0; \
9194
kl->mp = kmp_init(name); \
95+
if (!kl->mp) { free(kl); return 0; } \
9296
kl->head = kl->tail = kmp_alloc(name, kl->mp); \
97+
if (!kl->head) { free(kl->mp); free(kl); return 0; } \
9398
kl->head->next = 0; \
9499
return kl; \
95100
} \
@@ -103,6 +108,7 @@
103108
} \
104109
SCOPE kltype_t *kl_pushp_##name(kl_##name##_t *kl) { \
105110
kl1_##name *q, *p = kmp_alloc(name, kl->mp); \
111+
if (!p) return 0; \
106112
q = kl->tail; p->next = 0; kl->tail->next = p; kl->tail = p; \
107113
++kl->size; \
108114
return &q->data; \
@@ -118,6 +124,7 @@
118124
} \
119125
static inline kltype_t *kl_unshiftp_##name(kl_##name##_t *kl) { \
120126
kl1_##name *q, *p = kmp_alloc(name, kl->mp); \
127+
if (!p) return 0; \
121128
q = kl->head; p->next = q; kl->head = p; \
122129
++kl->size; \
123130
return &p->data; \
@@ -138,6 +145,7 @@
138145
kl1_##name *c) { \
139146
if (c->next == 0) return 0; \
140147
kl1_##name *p = kmp_alloc(name, kl->mp); \
148+
if (!p) return 0; \
141149
p->next = c->next; c->next = p; \
142150
++kl->size; \
143151
return &p->data; \

0 commit comments

Comments
 (0)