summaryrefslogtreecommitdiff
path: root/src/deque.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/deque.c')
-rw-r--r--src/deque.c52
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;
+}