summaryrefslogtreecommitdiff
path: root/src/lib/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/utils.c')
-rw-r--r--src/lib/utils.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/lib/utils.c b/src/lib/utils.c
index 6f6a65ae..fdbcd9d9 100644
--- a/src/lib/utils.c
+++ b/src/lib/utils.c
@@ -20,6 +20,10 @@
* Foundation, Inc., http://www.fsf.org/about/contact/.
*/
+#define _POSIX_C_SOURCE 200809L
+
+#include <ouroboros/utils.h>
+
#include <stdlib.h>
#include <string.h>
@@ -52,3 +56,58 @@ char * path_strip(const char * src)
return dst;
}
+
+size_t argvlen(const char ** argv)
+{
+ size_t argc = 0;
+
+ if (argv == NULL)
+ return 0;
+
+ while (*argv++ != NULL)
+ argc++;
+
+ return argc;
+}
+
+void argvfree(char ** argv)
+{
+ char ** argv_dup;
+
+ if (argv == NULL)
+ return;
+
+ argv_dup = argv;
+ while (*argv_dup != NULL)
+ free(*(argv_dup++));
+
+ free(argv);
+}
+
+char ** argvdup(char ** argv)
+{
+ int argc = 0;
+ char ** argv_dup = argv;
+ int i;
+
+ if (argv == NULL)
+ return NULL;
+
+ while (*(argv_dup++) != NULL)
+ argc++;
+
+ argv_dup = malloc((argc + 1) * sizeof(*argv_dup));
+ if (argv_dup == NULL)
+ return NULL;
+
+ for (i = 0; i < argc; ++i) {
+ argv_dup[i] = strdup(argv[i]);
+ if (argv_dup[i] == NULL) {
+ argvfree(argv_dup);
+ return NULL;
+ }
+ }
+
+ argv_dup[argc] = NULL;
+ return argv_dup;
+}