1 /*
2 ** Zabbix
3 ** Copyright (C) 2001-2021 Zabbix SIA
4 **
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
14 **
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 **/
19 
20 #ifndef ZABBIX_ZBXVARIANT_H
21 #define ZABBIX_ZBXVARIANT_H
22 
23 #include "common.h"
24 #include "zbxalgo.h"
25 
26 typedef union
27 {
28 	zbx_uint64_t		ui64;
29 	double			dbl;
30 
31 	/* null terminated string */
32 	char			*str;
33 
34 	/* length prefixed (4 bytes) binary data */
35 	void			*bin;
36 
37 	zbx_vector_dbl_t	*dbl_vector;
38 
39 	/* null terminated error message */
40 	char			*err;
41 }
42 zbx_variant_data_t;
43 
44 struct zbx_variant
45 {
46 	unsigned char		type;
47 	zbx_variant_data_t	data;
48 };
49 
50 #define ZBX_VARIANT_NONE	0
51 #define ZBX_VARIANT_STR		1
52 #define ZBX_VARIANT_DBL		2
53 #define ZBX_VARIANT_UI64	3
54 #define ZBX_VARIANT_BIN		4
55 #define ZBX_VARIANT_DBL_VECTOR	5
56 #define ZBX_VARIANT_ERR	6
57 
58 void	zbx_variant_clear(zbx_variant_t *value);
59 void	zbx_variant_set_none(zbx_variant_t *value);
60 void	zbx_variant_set_str(zbx_variant_t *value, char *text);
61 void	zbx_variant_set_dbl(zbx_variant_t *value, double value_dbl);
62 void	zbx_variant_set_ui64(zbx_variant_t *value, zbx_uint64_t value_ui64);
63 void	zbx_variant_set_bin(zbx_variant_t *value, void *value_bin);
64 void	zbx_variant_set_error(zbx_variant_t *value, char *error);
65 void	zbx_variant_set_dbl_vector(zbx_variant_t *value, zbx_vector_dbl_t *dbl_vector);
66 
67 void	zbx_variant_copy(zbx_variant_t *value, const zbx_variant_t *source);
68 int	zbx_variant_set_numeric(zbx_variant_t *value, const char *text);
69 
70 int	zbx_variant_convert(zbx_variant_t *value, int type);
71 const char	*zbx_get_variant_type_desc(unsigned char type);
72 const char	*zbx_variant_value_desc(const zbx_variant_t *value);
73 const char	*zbx_variant_type_desc(const zbx_variant_t *value);
74 
75 int	zbx_variant_compare(const zbx_variant_t *value1, const zbx_variant_t *value2);
76 
77 void	*zbx_variant_data_bin_copy(const void *bin);
78 void	*zbx_variant_data_bin_create(const void *data, zbx_uint32_t size);
79 zbx_uint32_t	zbx_variant_data_bin_get(const void *bin, void **data);
80 
81 int	zbx_variant_to_value_type(zbx_variant_t *value, unsigned char value_type, int dbl_precision, char **errmsg);
82 
83 ZBX_VECTOR_DECL(var, zbx_variant_t)
84 
85 #endif
86