From e24d0de486af2c4077837b408d36611acfce2e57 Mon Sep 17 00:00:00 2001 From: James Bonfield Date: Tue, 3 Oct 2023 16:40:17 +0100 Subject: [PATCH] Add C++ casts for external headers. Klist.h and kseq.h use calloc, realloc and memchr in static inline code, but if we wish to permit our external headers to be used from a C++ include then these all need explicit casts as "void *" doesn't work the same in C++ as in C. It's tempting to use `extern "C"` in an `#ifdef __cplusplus` guard, but the nature of these pseudo-template klib headers is such that the code will be expanded up later inside a C++ file so the extern "C" doesn't solve it. See #1674 and #1682 --- htslib/klist.h | 10 +++++----- htslib/kseq.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/htslib/klist.h b/htslib/klist.h index 398f205db2..2486826faf 100644 --- a/htslib/klist.h +++ b/htslib/klist.h @@ -43,7 +43,7 @@ kmptype_t **buf; \ } kmp_##name##_t; \ SCOPE kmp_##name##_t *kmp_init_##name(void) { \ - return calloc(1, sizeof(kmp_##name##_t)); \ + return (kmp_##name##_t *)calloc(1, sizeof(kmp_##name##_t)); \ } \ SCOPE void kmp_destroy_##name(kmp_##name##_t *mp) { \ size_t k; \ @@ -54,14 +54,14 @@ } \ SCOPE kmptype_t *kmp_alloc_##name(kmp_##name##_t *mp) { \ ++mp->cnt; \ - if (mp->n == 0) return calloc(1, sizeof(kmptype_t)); \ + if (mp->n == 0) return (kmptype_t *)calloc(1, sizeof(kmptype_t)); \ return mp->buf[--mp->n]; \ } \ SCOPE void kmp_free_##name(kmp_##name##_t *mp, kmptype_t *p) { \ --mp->cnt; \ if (mp->n == mp->max) { \ mp->max = mp->max? mp->max<<1 : 16; \ - mp->buf = realloc(mp->buf, sizeof(kmptype_t *) * mp->max); \ + mp->buf = (kmptype_t **)realloc(mp->buf, sizeof(kmptype_t *) * mp->max); \ } \ mp->buf[mp->n++] = p; \ } @@ -88,9 +88,9 @@ size_t size; \ } kl_##name##_t; \ SCOPE kl_##name##_t *kl_init_##name(void) { \ - kl_##name##_t *kl = calloc(1, sizeof(kl_##name##_t)); \ + kl_##name##_t *kl = (kl_##name##_t *)calloc(1, sizeof(kl_##name##_t)); \ kl->mp = kmp_init(name); \ - kl->head = kl->tail = kmp_alloc(name, kl->mp); \ + kl->head = kl->tail = kmp_alloc(name, kl->mp); \ kl->head->next = 0; \ return kl; \ } \ diff --git a/htslib/kseq.h b/htslib/kseq.h index e8891706ba..5913f35ad3 100644 --- a/htslib/kseq.h +++ b/htslib/kseq.h @@ -110,10 +110,10 @@ } else break; \ } \ if (delimiter == KS_SEP_LINE) { \ - unsigned char *sep = memchr(ks->buf + ks->begin, '\n', ks->end - ks->begin); \ + unsigned char *sep = (unsigned char *)memchr(ks->buf + ks->begin, '\n', ks->end - ks->begin); \ i = sep != NULL ? sep - ks->buf : ks->end; \ } else if (delimiter > KS_SEP_MAX) { \ - unsigned char *sep = memchr(ks->buf + ks->begin, delimiter, ks->end - ks->begin); \ + unsigned char *sep = (unsigned char *)memchr(ks->buf + ks->begin, delimiter, ks->end - ks->begin); \ i = sep != NULL ? sep - ks->buf : ks->end; \ } else if (delimiter == KS_SEP_SPACE) { \ for (i = ks->begin; i < ks->end; ++i) \