4c66a15f424d56a6f0df9968dc9519d8d567cf2a
1 #include <stdlib.h>
2 #include <string.h>
3 #include <errno.h>
5 #include "rrd_args.h"
7 rrd_args_t *ra_create (void) /* {{{ */
8 {
9 rrd_args_t *ra;
11 ra = malloc (sizeof (*ra));
12 if (ra == NULL)
13 return (NULL);
14 memset (ra, 0, sizeof (*ra));
16 ra->options = array_create ();
17 ra->data = array_create ();
18 ra->calc = array_create ();
19 ra->areas = array_create ();
20 ra->lines = array_create ();
22 if ((ra->options == NULL)
23 || (ra->data == NULL)
24 || (ra->calc == NULL)
25 || (ra->areas == NULL)
26 || (ra->lines == NULL))
27 {
28 ra_destroy (ra);
29 return (NULL);
30 }
32 return (ra);
33 } /* }}} rrd_args_t *ra_create */
35 void ra_destroy (rrd_args_t *ra) /* {{{ */
36 {
37 if (ra == NULL)
38 return;
40 array_destroy (ra->options);
41 array_destroy (ra->data);
42 array_destroy (ra->calc);
43 array_destroy (ra->areas);
44 array_destroy (ra->lines);
46 free (ra);
47 } /* }}} void ra_destroy */
49 int ra_argc (rrd_args_t *ra)
50 {
51 if (ra == NULL)
52 return (-EINVAL);
54 return (array_argc (ra->options)
55 + array_argc (ra->data)
56 + array_argc (ra->calc)
57 + array_argc (ra->areas)
58 + array_argc (ra->lines));
59 } /* }}} int ra_argc */
61 char **ra_argv (rrd_args_t *ra) /* {{{ */
62 {
63 size_t argc;
64 char **argv;
66 size_t pos;
67 int tmp;
69 if (ra == NULL)
70 return (NULL);
72 tmp = ra_argc (ra);
73 if (tmp < 0)
74 return (NULL);
75 argc = (size_t) tmp;
77 argv = calloc (argc + 1, sizeof (*argv));
78 if (argv == NULL)
79 return (NULL);
81 pos = 0;
82 argv[0] = NULL;
84 #define APPEND_FIELD(field) do \
85 { \
86 size_t ary_argc; \
87 char **ary_argv; \
88 \
89 ary_argc = (size_t) array_argc (ra->field); \
90 ary_argv = array_argv (ra->field); \
91 if ((ary_argc > 0) && (ary_argv != NULL)) \
92 { \
93 memcpy (argv + pos, ary_argv, ary_argc * sizeof (*ary_argv)); \
94 pos += ary_argc; \
95 argv[pos] = NULL; \
96 } \
97 } while (0)
99 APPEND_FIELD (options);
100 APPEND_FIELD (data);
101 APPEND_FIELD (calc);
102 APPEND_FIELD (areas);
103 APPEND_FIELD (lines);
105 #undef APPEND_FIELD
107 return (argv);
108 } /* }}} char **ra_argv */
110 void ra_argv_free (char **argv) /* {{{ */
111 {
112 /* The pointers contained in the "argv" come from "array_argv". We don't need
113 * to free them. We only need to free what we actually alloced directly in
114 * "ra_argv". */
115 free (argv);
116 } /* }}} void ra_argv_free */
118 /* vim: set sw=2 sts=2 et fdm=marker : */