src/rrd_args.[ch]: Split up the "draw" part (into "areas" and "lines").
[collection4.git] / src / rrd_args.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <errno.h>
4
5 #include "rrd_args.h"
6
7 rrd_args_t *ra_create (void) /* {{{ */
8 {
9   rrd_args_t *ra;
10
11   ra = malloc (sizeof (*ra));
12   if (ra == NULL)
13     return (NULL);
14   memset (ra, 0, sizeof (*ra));
15
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 ();
21
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   }
31
32   return (ra);
33 } /* }}} rrd_args_t *ra_create */
34
35 void ra_destroy (rrd_args_t *ra) /* {{{ */
36 {
37   if (ra == NULL)
38     return;
39
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);
45
46   free (ra);
47 } /* }}} void ra_destroy */
48
49 int ra_argc (rrd_args_t *ra)
50 {
51   if (ra == NULL)
52     return (-EINVAL);
53
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 */
60
61 char **ra_argv (rrd_args_t *ra) /* {{{ */
62 {
63   size_t argc;
64   char **argv;
65
66   size_t pos;
67   int tmp;
68
69   if (ra == NULL)
70     return (NULL);
71
72   tmp = ra_argc (ra);
73   if (tmp < 0)
74     return (NULL);
75   argc = (size_t) tmp;
76
77   argv = calloc (argc + 1, sizeof (*argv));
78   if (argv == NULL)
79     return (NULL);
80
81   pos = 0;
82   argv[0] = NULL;
83
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)
98  
99   APPEND_FIELD (options);
100   APPEND_FIELD (data);
101   APPEND_FIELD (calc);
102   APPEND_FIELD (areas);
103   APPEND_FIELD (lines);
104
105 #undef APPEND_FIELD
106
107   return (argv);
108 } /* }}} char **ra_argv */
109
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 */
117
118 /* vim: set sw=2 sts=2 et fdm=marker : */