diff options
Diffstat (limited to 'src/deque.c')
| -rw-r--r-- | src/deque.c | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/src/deque.c b/src/deque.c index bc39e0e..4124d1a 100644 --- a/src/deque.c +++ b/src/deque.c @@ -1,6 +1,6 @@ /* * Double-ended queues - * Copyright Jan Engelhardt, 2002-2008 + * Copyright Jan Engelhardt, 2025 * * This file is part of libHX. libHX is free software; you can * redistribute it and/or modify it under the terms of the GNU Lesser @@ -8,7 +8,9 @@ * either version 2.1 or (at your option) any later version. */ #include <errno.h> +#include <limits.h> #include <stdarg.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <libHX/deque.h> @@ -162,22 +164,62 @@ EXPORT_SYMBOL void HXdeque_genocide2(struct HXdeque *dq, void (*xfree)(void *)) free(dq); } -EXPORT_SYMBOL void ** -HXdeque_to_vec(const struct HXdeque *dq, unsigned int *num) +static void ** +HXdeque_to_veci(const struct HXdeque *dq, size_t *num, bool sentinel) { const struct HXdeque_node *trav; void **ret, **p; - ret = malloc((dq->items + 1) * sizeof(void *)); + ret = malloc((dq->items + sentinel) * sizeof(void *)); if (ret == NULL) return NULL; p = ret; for (trav = dq->first; trav != NULL; trav = trav->next) *p++ = trav->ptr; - *p = NULL; + if (sentinel) + *p = NULL; if (num != NULL) *num = dq->items; return ret; } + +EXPORT_SYMBOL void ** +HXdeque_to_vec(const struct HXdeque *dq, size_t *num) +{ + return HXdeque_to_veci(dq, num, true); +} + +EXPORT_SYMBOL void ** +HXdeque_to_vecx(const struct HXdeque *dq, size_t *num) +{ + return HXdeque_to_veci(dq, num, false); +} + +char **HXdeque_to_vec_strdup(const struct HXdeque *dq, size_t *num) +{ + const struct HXdeque_node *iter; + char **ret, **p; + int se; + + ret = malloc((dq->items + 1) * sizeof(char *)); + if (ret == nullptr) + return nullptr; + p = ret; + for (iter = dq->first; iter != nullptr; ++p, iter = iter->next) { + *p = strdup(iter->ptr); + if (*p == nullptr) + goto out; + } + *p = nullptr; + if (num != nullptr) + *num = dq->items; + return ret; + + out: + se = errno; + HX_zvecfree(ret); + errno = se; + return nullptr; +} |
