libcfe  0.12.1
some useful C-functions
cfe_value_extra.c
Go to the documentation of this file.
1 /* kate: indent-mode cstyle; tab-width 4; indent-width 4; */
2 #include "config.h"
3 
4 #include "cfe_value.h"
5 #include "cfe_value_extra.h"
6 
7 #include <glib-object.h>
8 
9 #define ASSIGN_INT(T, G, V) \
10 if(sizeof(gchar) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_CHAR) g_value_set_schar(G, (gchar)V); \
11 else if(sizeof(gint) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_INT) g_value_set_int(G, (gint)V); \
12 else if(sizeof(glong) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_LONG) g_value_set_long(G, (glong)V); \
13 else if(sizeof(gint64) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_INT64) g_value_set_int64(G, (gint64)V);
14 
15 #define ASSIGN_UINT(T, G, V) \
16 if(sizeof(guchar) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_UCHAR) g_value_set_uchar(G, (guchar)V); \
17 else if(sizeof(guint) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_UINT) g_value_set_uint(G, (guint)V); \
18 else if(sizeof(gulong) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_ULONG) g_value_set_ulong(G, (gulong)V); \
19 else if(sizeof(guint64) >= sizeof(T) && G_VALUE_TYPE(G) == G_TYPE_UINT64) g_value_set_uint64(G, (guint64)V);
20 
21 gboolean cfe_value_to_GValue(const cfe_value_t *cfe_value, GValue *gvalue)
22 {
23  GValue tmp = G_VALUE_INIT;
25  GType gtype;
26 
27  if(cfe_value == NULL || gvalue == NULL) return FALSE;
28 
29  if((type = cfe_value_get_type(cfe_value)) == CFE_NIL) return FALSE;
30  if((gtype = cfe_value_type_as_gtype(type)) == G_TYPE_INVALID) return FALSE;
31 
32  /* Check if `gvalue` is already initialized. */
33  if(G_VALUE_TYPE(gvalue) != 0)
34  {
35  /* Check if type of `gvalue` is compatible with `cfe_value`. */
36  if(cfe_value_type_is_compatible(type, G_VALUE_TYPE(gvalue)))
37  g_value_init(&tmp, G_VALUE_TYPE(gvalue));
38  else
39  {
40  /* Types are not compatible by default, see if standard type can be converted. */
41  if(!g_value_type_transformable(gtype, G_VALUE_TYPE(gvalue)))
42  g_value_init(&tmp, gtype);
43  else
44  return FALSE;
45  }
46  }
47  else
48  {
49  g_value_init(gvalue, gtype);
50  g_value_init(&tmp, gtype);
51  }
52 
53  switch(type)
54  {
55  case CFE_BOOLEAN:
56  {
57  int8_t bool;
58  cfe_value_get_boolean(cfe_value, &bool);
59  g_value_set_boolean(&tmp, (gboolean)bool);
60  }
61  break;
62  case CFE_UINT8:
63  {
64  uint8_t i;
65  cfe_value_get_uint8(cfe_value, &i);
66  ASSIGN_UINT(uint8_t, &tmp, i);
67  }
68  break;
69  case CFE_INT8:
70  {
71  int8_t i;
72  cfe_value_get_int8(cfe_value, &i);
73  //g_value_set_schar(&tmp, (gchar)i);
74  ASSIGN_INT(uint8_t, &tmp, i);
75  }
76  break;
77  case CFE_UINT16:
78  {
79  uint16_t i;
80  cfe_value_get_uint16(cfe_value, &i);
81  //g_value_set_uint(&tmp, (guint)i);
82  ASSIGN_UINT(uint16_t, &tmp, i);
83  }
84  break;
85  case CFE_INT16:
86  {
87  int16_t i;
88  cfe_value_get_int16(cfe_value, &i);
89  //g_value_set_int(&tmp, (gint)i);
90  ASSIGN_INT(int16_t, &tmp, i);
91  }
92  break;
93  case CFE_UINT32:
94  {
95  uint32_t i;
96  cfe_value_get_uint32(cfe_value, &i);
97  //g_value_set_uint(&tmp, (guint)i);
98  ASSIGN_UINT(uint32_t, &tmp, i);
99  }
100  break;
101  case CFE_INT32:
102  {
103  int32_t i;
104  cfe_value_get_int32(cfe_value, &i);
105  ASSIGN_INT(int32_t, &tmp, i);
106  }
107  break;
108  case CFE_UINT64:
109  {
110  uint64_t i;
111  cfe_value_get_uint64(cfe_value, &i);
112  //g_value_set_uint64(&tmp, (guint64)i);
113  ASSIGN_UINT(uint64_t, &tmp, i);
114  }
115  break;
116  case CFE_INT64:
117  {
118  int64_t i;
119  cfe_value_get_int64(cfe_value, &i);
120  //g_value_set_int64(&tmp, (gint64)i);
121  ASSIGN_INT(int64_t, &tmp, i);
122  }
123  break;
124  case CFE_FLOAT:
125  {
126  float f;
127  cfe_value_get_float(cfe_value, &f);
128  //g_value_set_float(&tmp, (gfloat)f);
129  if(sizeof(gfloat) >= sizeof(float) && G_VALUE_TYPE(&tmp) == G_TYPE_FLOAT)
130  g_value_set_float(&tmp, (gfloat)f);
131  if(sizeof(gdouble) >= sizeof(float) && G_VALUE_TYPE(&tmp) == G_TYPE_DOUBLE)
132  g_value_set_double(&tmp, (gdouble)f);
133  }
134  break;
135  case CFE_DOUBLE:
136  {
137  double d;
138  cfe_value_get_double(cfe_value, &d);
139  //g_value_set_double(&tmp, (gdouble)d);
140  if(sizeof(gfloat) >= sizeof(double) && G_VALUE_TYPE(&tmp) == G_TYPE_FLOAT)
141  g_value_set_float(&tmp, (gfloat)d);
142  if(sizeof(gdouble) >= sizeof(double) && G_VALUE_TYPE(&tmp) == G_TYPE_DOUBLE)
143  g_value_set_double(&tmp, (gdouble)d);
144  }
145  break;
146  case CFE_LDOUBLE:
147  {
148  long double d;
149  cfe_value_get_long_double(cfe_value, &d);
150  //g_value_set_double(&tmp, (gdouble)d);
151  if(sizeof(gfloat) >= sizeof(long double) && G_VALUE_TYPE(&tmp) == G_TYPE_FLOAT)
152  g_value_set_float(&tmp, (gfloat)d);
153  if(sizeof(gdouble) >= sizeof(long double) && G_VALUE_TYPE(&tmp) == G_TYPE_DOUBLE)
154  g_value_set_double(&tmp, (gdouble)d);
155  }
156  break;
157  case CFE_STRING:
158  {
159  char *str;
160  cfe_value_get_string(cfe_value, &str);
161  g_value_set_string(&tmp, (gchar *)str);
162  }
163  break;
164  case CFE_S_STRING:
165  {
166  char *str;
167  cfe_value_get_string(cfe_value, &str);
168  g_value_set_string(&tmp, (gchar *)str);
169  }
170  break;
171  case CFE_U_STRING:
172  {
173  char *str;
174  cfe_value_get_string(cfe_value, &str);
175  g_value_set_string(&tmp, (gchar *)str);
176  }
177  break;
178  case CFE_POINTER:
179  {
180  void *p;
181  cfe_value_get_pointer(cfe_value, &p);
182  g_value_set_pointer(&tmp, (gpointer)p);
183  }
184  break;
185  case CFE_NULL:
186  {
187  g_value_set_pointer(&tmp, (gpointer)NULL);
188  }
189  break;
190  case CFE_NIL:
191  default:
192  break;
193  }
194 
195  if(G_VALUE_TYPE(&tmp) == 0)
196  return FALSE;
197 
198  g_value_copy(&tmp, gvalue);
199  return TRUE;
200 }
201 
202 gboolean cfe_value_type_is_compatible(const cfe_value_type_t cfe_type, const GType gtype)
203 {
204  switch(cfe_type)
205  {
206  case CFE_BOOLEAN:
207  return (gtype == G_TYPE_BOOLEAN ||
208  (sizeof(gint) >= sizeof(int8_t) && gtype == G_TYPE_INT) ||
209  (sizeof(gchar) >= sizeof(int8_t) && gtype == G_TYPE_CHAR) ||
210  (sizeof(glong) >= sizeof(int8_t) && gtype == G_TYPE_LONG) ||
211  (sizeof(gint64) >= sizeof(int8_t) && gtype == G_TYPE_INT64));
212  case CFE_UINT8:
213  return ((sizeof(guchar) >= sizeof(uint8_t) && gtype == G_TYPE_UCHAR) ||
214  (sizeof(guint) >= sizeof(uint8_t) && gtype == G_TYPE_UINT) ||
215  (sizeof(gulong) >= sizeof(uint8_t) && gtype == G_TYPE_ULONG) ||
216  (sizeof(guint64) >= sizeof(uint8_t) && gtype == G_TYPE_UINT64));
217  case CFE_INT8:
218  return ((sizeof(gchar) >= sizeof(int8_t) && gtype == G_TYPE_CHAR) ||
219  (sizeof(gint) >= sizeof(int8_t) && gtype == G_TYPE_INT) ||
220  (sizeof(glong) >= sizeof(int8_t) && gtype == G_TYPE_LONG) ||
221  (sizeof(gint64) >= sizeof(int8_t) && gtype == G_TYPE_INT64));
222  case CFE_UINT16:
223  return ((sizeof(guint) >= sizeof(uint16_t) && gtype == G_TYPE_UINT) ||
224  (sizeof(gulong) >= sizeof(uint16_t) && gtype == G_TYPE_ULONG) ||
225  (sizeof(guint64) >= sizeof(uint16_t) && gtype == G_TYPE_UINT64));
226  case CFE_INT16:
227  return ((sizeof(gint) >= sizeof(int16_t) && gtype == G_TYPE_INT) ||
228  (sizeof(glong) >= sizeof(int16_t) && gtype == G_TYPE_LONG) ||
229  (sizeof(gint64) >= sizeof(int16_t) && gtype == G_TYPE_INT64));
230  case CFE_UINT32:
231  return ((sizeof(guint) >= sizeof(uint32_t) && gtype == G_TYPE_UINT) ||
232  (sizeof(gulong) >= sizeof(uint32_t) && gtype == G_TYPE_ULONG) ||
233  (sizeof(guint64) >= sizeof(uint32_t) && gtype == G_TYPE_UINT64));
234  case CFE_INT32:
235  return ((sizeof(gint) >= sizeof(int32_t) && gtype == G_TYPE_INT) ||
236  (sizeof(glong) >= sizeof(int32_t) && gtype == G_TYPE_LONG) ||
237  (sizeof(gint64) >= sizeof(int32_t) && gtype == G_TYPE_INT64));
238  case CFE_UINT64:
239  return ((sizeof(guint) >= sizeof(uint64_t) && gtype == G_TYPE_UINT) ||
240  (sizeof(gulong) >= sizeof(uint64_t) && gtype == G_TYPE_ULONG) ||
241  (sizeof(guint64) >= sizeof(uint64_t) && gtype == G_TYPE_UINT64));
242  case CFE_INT64:
243  return ((sizeof(gint) >= sizeof(int64_t) && gtype == G_TYPE_INT) ||
244  (sizeof(glong) >= sizeof(int64_t) && gtype == G_TYPE_LONG) ||
245  (sizeof(gint64) >= sizeof(int64_t) && gtype == G_TYPE_INT64));
246  case CFE_FLOAT:
247  return ((sizeof(gfloat) >= sizeof(float) && gtype == G_TYPE_FLOAT) ||
248  (sizeof(gdouble) >= sizeof(float) && gtype == G_TYPE_DOUBLE));
249  case CFE_DOUBLE:
250  return ((sizeof(gfloat) >= sizeof(double) && gtype == G_TYPE_FLOAT) ||
251  (sizeof(gdouble) >= sizeof(double) && gtype == G_TYPE_DOUBLE));
252  case CFE_LDOUBLE:
253  return ((sizeof(gfloat) >= sizeof(long double) && gtype == G_TYPE_FLOAT) ||
254  (sizeof(gdouble) >= sizeof(long double) && gtype == G_TYPE_DOUBLE));
255  case CFE_STRING:
256  case CFE_S_STRING:
257  case CFE_U_STRING:
258  return (gtype == G_TYPE_STRING);
259  case CFE_POINTER:
260  return (gtype == G_TYPE_POINTER);
261  case CFE_NULL:
262  return (gtype == G_TYPE_POINTER);
263  case CFE_NIL:
264  default:
265  return FALSE;
266  }
267  return FALSE;
268 }
269 
271 {
272  switch(cfe_type)
273  {
274  case CFE_BOOLEAN:
275  return G_TYPE_BOOLEAN;
276  case CFE_UINT8:
277  return G_TYPE_UCHAR;
278  case CFE_INT8:
279  return G_TYPE_CHAR;
280  case CFE_UINT16:
281  if(sizeof(guint) >= sizeof(uint16_t)) return G_TYPE_UINT;
282  else if(sizeof(gulong) >= sizeof(uint16_t)) return G_TYPE_ULONG;
283  else if(sizeof(guint64) >= sizeof(uint16_t)) return G_TYPE_UINT64;
284  break;
285  case CFE_INT16:
286  if(sizeof(gint) >= sizeof(int16_t)) return G_TYPE_INT;
287  else if(sizeof(glong) >= sizeof(int16_t)) return G_TYPE_LONG;
288  else if(sizeof(gint64) >= sizeof(int16_t)) return G_TYPE_INT64;
289  break;
290  case CFE_UINT32:
291  if(sizeof(guint) >= sizeof(uint32_t)) return G_TYPE_UINT;
292  else if(sizeof(gulong) >= sizeof(uint32_t)) return G_TYPE_ULONG;
293  else if(sizeof(guint64) >= sizeof(uint32_t)) return G_TYPE_UINT64;
294  break;
295  case CFE_INT32:
296  if(sizeof(gint) >= sizeof(int32_t)) return G_TYPE_INT;
297  else if(sizeof(glong) >= sizeof(int32_t)) return G_TYPE_LONG;
298  else if(sizeof(gint64) >= sizeof(int32_t)) return G_TYPE_INT64;
299  break;
300  case CFE_UINT64:
301  if(sizeof(guint) >= sizeof(uint64_t)) return G_TYPE_UINT;
302  else if(sizeof(gulong) >= sizeof(uint64_t)) return G_TYPE_ULONG;
303  else if(sizeof(guint64) >= sizeof(uint64_t)) return G_TYPE_UINT64;
304  break;
305  case CFE_INT64:
306  if(sizeof(gint) >= sizeof(int64_t)) return G_TYPE_INT;
307  else if(sizeof(glong) >= sizeof(int64_t)) return G_TYPE_LONG;
308  else if(sizeof(gint64) >= sizeof(int64_t)) return G_TYPE_INT64;
309  break;
310  case CFE_FLOAT:
311  if(sizeof(gfloat) >= sizeof(float)) return G_TYPE_FLOAT;
312  else if(sizeof(gdouble) >= sizeof(float)) return G_TYPE_DOUBLE;
313  break;
314  case CFE_DOUBLE:
315  if(sizeof(gfloat) >= sizeof(double)) return G_TYPE_FLOAT;
316  else if(sizeof(gdouble) >= sizeof(double)) return G_TYPE_DOUBLE;
317  break;
318  case CFE_LDOUBLE:
319  if(sizeof(gfloat) >= sizeof(long double)) return G_TYPE_FLOAT;
320  else if(sizeof(gdouble) >= sizeof(long double)) return G_TYPE_DOUBLE;
321  break;
322  case CFE_STRING:
323  case CFE_S_STRING:
324  case CFE_U_STRING:
325  return G_TYPE_STRING;
326  case CFE_POINTER:
327  return G_TYPE_POINTER;
328  case CFE_NULL:
329  return G_TYPE_POINTER;
330  case CFE_NIL:
331  default:
332  break;
333  }
334  return G_TYPE_INVALID;
335 }
uint8_t cfe_value_get_uint32(const cfe_value_t *v, uint32_t *value)
uint8_t cfe_value_get_int16(const cfe_value_t *v, int16_t *value)
#define ASSIGN_UINT(T, G, V)
uint8_t cfe_value_get_int8(const cfe_value_t *v, int8_t *value)
uint8_t cfe_value_get_string(const cfe_value_t *v, char **value)
cfe_value_type_t type
Definition: cfe_value.c:31
#define ASSIGN_INT(T, G, V)
uint8_t cfe_value_get_uint8(const cfe_value_t *v, uint8_t *value)
uint8_t cfe_value_get_double(const cfe_value_t *v, double *value)
GType cfe_value_type_as_gtype(const cfe_value_type_t cfe_type)
enum cfe_value_type cfe_value_type_t
Definition: cfe_value.h:7
uint8_t cfe_value_get_float(const cfe_value_t *v, float *value)
uint8_t cfe_value_get_long_double(const cfe_value_t *v, long double *value)
gboolean cfe_value_type_is_compatible(const cfe_value_type_t cfe_type, const GType gtype)
uint8_t cfe_value_get_pointer(const cfe_value_t *v, void **value)
uint8_t cfe_value_get_int32(const cfe_value_t *v, int32_t *value)
#define f
cfe_value_type_t cfe_value_get_type(const cfe_value_t *v)
Definition: cfe_value.c:159
uint8_t cfe_value_get_boolean(const cfe_value_t *v, int8_t *value)
uint8_t cfe_value_get_uint64(const cfe_value_t *v, uint64_t *value)
uint8_t cfe_value_get_uint16(const cfe_value_t *v, uint16_t *value)
uint8_t cfe_value_get_int64(const cfe_value_t *v, int64_t *value)
gboolean cfe_value_to_GValue(const cfe_value_t *cfe_value, GValue *gvalue)