src/action_list_graphs.c: Properly escape HTML.
[collection4.git] / src / utils_array.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <errno.h>
6
7 #include "utils_array.h"
8
9 struct str_array_s
10 {
11   char **ptr;
12   size_t size;
13 };
14
15 str_array_t *array_create (void) /* {{{ */
16 {
17   str_array_t *a;
18
19   a = malloc (sizeof (*a));
20   if (a == NULL)
21     return (NULL);
22
23   memset (a, 0, sizeof (*a));
24   a->ptr = NULL;
25   a->size = 0;
26
27   return (a);
28 } /* }}} str_array_t *array_create */
29
30 void array_destroy (str_array_t *a) /* {{{ */
31 {
32   if (a == NULL)
33     return;
34
35   free (a->ptr);
36   a->ptr = NULL;
37   a->size = 0;
38
39   free (a);
40 } /* }}} void array_destroy */
41
42 int array_append (str_array_t *a, const char *entry) /* {{{ */
43 {
44   char **ptr;
45
46   if ((entry == NULL) || (a == NULL))
47     return (EINVAL);
48
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;
54
55   *ptr = strdup (entry);
56   if (*ptr == NULL)
57     return (ENOMEM);
58
59   a->size++;
60   return (0);
61 } /* }}} int array_append */
62
63 int array_append_format (str_array_t *a, const char *format, ...) /* {{{ */
64 {
65   char buffer[1024];
66   va_list ap;
67   int status;
68
69   va_start (ap, format);
70   status = vsnprintf (buffer, sizeof (buffer), format, ap);
71   va_end(ap);
72
73   if ((status < 0) || (((size_t) status) >= sizeof (buffer)))
74     return (ENOMEM);
75
76   return (array_append (a, buffer));
77 } /* }}} int array_append_format */
78
79 int array_argc (str_array_t *a) /* {{{ */
80 {
81   if (a == NULL)
82     return (-1);
83
84   return ((int) a->size);
85 } /* }}} int array_argc */
86
87 char **array_argv (str_array_t *a) /* {{{ */
88 {
89   if ((a == NULL) || (a->size == 0))
90     return (NULL);
91
92   return (a->ptr);
93 } /* }}} char **array_argv */
94
95 /* vim: set sw=2 sts=2 et fdm=marker : */