1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <errno.h>
7 #include "utils_array.h"
9 struct str_array_s
10 {
11 char **ptr;
12 size_t size;
13 };
15 str_array_t *array_create (void) /* {{{ */
16 {
17 str_array_t *a;
19 a = malloc (sizeof (*a));
20 if (a == NULL)
21 return (NULL);
23 memset (a, 0, sizeof (*a));
24 a->ptr = NULL;
25 a->size = 0;
27 return (a);
28 } /* }}} str_array_t *array_create */
30 void array_destroy (str_array_t *a) /* {{{ */
31 {
32 if (a == NULL)
33 return;
35 free (a->ptr);
36 a->ptr = NULL;
37 a->size = 0;
39 free (a);
40 } /* }}} void array_destroy */
42 int array_append (str_array_t *a, const char *entry) /* {{{ */
43 {
44 char **ptr;
46 if ((entry == NULL) || (a == NULL))
47 return (EINVAL);
49 ptr = realloc (a->ptr, sizeof (*a->ptr) * (a->size + 1));
50 if (ptr == NULL)
51 return (ENOMEM);
52 a->ptr = ptr;
53 ptr = a->ptr + a->size;
55 *ptr = strdup (entry);
56 if (*ptr == NULL)
57 return (ENOMEM);
59 a->size++;
60 return (0);
61 } /* }}} int array_append */
63 int array_append_format (str_array_t *a, const char *format, ...) /* {{{ */
64 {
65 char buffer[1024];
66 va_list ap;
67 int status;
69 va_start (ap, format);
70 status = vsnprintf (buffer, sizeof (buffer), format, ap);
71 va_end(ap);
73 if ((status < 0) || (((size_t) status) >= sizeof (buffer)))
74 return (ENOMEM);
76 return (array_append (a, buffer));
77 } /* }}} int array_append_format */
79 int array_argc (str_array_t *a) /* {{{ */
80 {
81 if (a == NULL)
82 return (-1);
84 return ((int) a->size);
85 } /* }}} int array_argc */
87 char **array_argv (str_array_t *a) /* {{{ */
88 {
89 if ((a == NULL) || (a->size == 0))
90 return (NULL);
92 return (a->ptr);
93 } /* }}} char **array_argv */
95 /* vim: set sw=2 sts=2 et fdm=marker : */