summaryrefslogtreecommitdiffstats
path: root/lib/perfdata.h
blob: 74583ee54cd8f3381010e404327f4af417265bce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#pragma once

#include "../config.h"

#include <inttypes.h>
#include <stdbool.h>

// Enum for the specific type of a perfdata_value
typedef enum pd_value_type {
	PD_TYPE_NONE = 0,
	PD_TYPE_INT,
	PD_TYPE_UINT,
	PD_TYPE_DOUBLE
} pd_value_type;

typedef struct {
	enum pd_value_type type;
	union {
		long long pd_int;
		unsigned long long pd_uint;
		double pd_double;
	};
} mp_perfdata_value;

#define MP_OUTSIDE false
#define MP_INSIDE  true

/*
 * New range type with generic numerical values
 */
typedef struct mp_range_struct {
	mp_perfdata_value start;
	bool start_infinity; /* false (default) or true */

	mp_perfdata_value end;
	bool end_infinity;

	bool alert_on_inside_range; /* OUTSIDE (default) or INSIDE */
} mp_range;

/*
 * Old range type with floating point values
 */
typedef struct range_struct {
	double start;
	bool start_infinity;
	double end;
	int end_infinity;
	int alert_on; /* OUTSIDE (default) or INSIDE */
	char *text;   /* original unparsed text input */
} range;

/*
 * Perfdata type for storing perfdata output
 */
typedef struct perfdata_struct {
	char *label;
	char *uom;
	mp_perfdata_value value;

	bool warn_present;
	mp_range warn;

	bool crit_present;
	mp_range crit;

	bool min_present;
	mp_perfdata_value min;

	bool max_present;
	mp_perfdata_value max;
} mp_perfdata;

/*
 * List of mp_perfdata values
 */
typedef struct pd_list_struct {
	mp_perfdata data;
	struct pd_list_struct *next;
} pd_list;

/*
 * ============
 * Initializers
 * ============
 */
/*
 * Initialize mp_perfdata value. Always use this to generate a new one
 */
mp_perfdata perfdata_init(void);

/*
 * Initialize pd_list value. Always use this to generate a new one
 */
pd_list *pd_list_init(void);

/*
 * Initialize a new mp_range value, with unset values (start and end are infinite
 */
mp_range mp_range_init(void);

/*
 * Worker functions
 */

mp_range mp_range_set_start(mp_range, mp_perfdata_value);
mp_range mp_range_set_end(mp_range, mp_perfdata_value);

/*
 * Parsing a range from a string
 */

typedef enum {
	MP_PARSING_SUCCES = 0,
	MP_PARSING_FAILURE,
	MP_RANGE_PARSING_FAILURE,
	MP_RANGE_PARSING_UNDERFLOW,
	MP_RANGE_PARSING_OVERFLOW,
	MP_RANGE_PARSING_INVALID_CHAR,
} mp_range_parser_error;

typedef struct mp_range_parsed {
	mp_range_parser_error error;
	mp_range range;
} mp_range_parsed;

mp_range_parsed mp_parse_range_string(const char * /*input*/);

/*
 * Appends a mp_perfdata value to a pd_list
 */
void pd_list_append(pd_list[1], mp_perfdata);

#define mp_set_pd_value(P, V)                                                                                                              \
	_Generic((V),                                                                                                                          \
		float: mp_set_pd_value_float,                                                                                                      \
		double: mp_set_pd_value_double,                                                                                                    \
		int: mp_set_pd_value_int,                                                                                                          \
		unsigned int: mp_set_pd_value_u_int,                                                                                               \
		long: mp_set_pd_value_long,                                                                                                        \
		unsigned long: mp_set_pd_value_u_long,                                                                                             \
		long long: mp_set_pd_value_long_long,                                                                                              \
		unsigned long long: mp_set_pd_value_u_long_long)(P, V)

mp_perfdata mp_set_pd_value_float(mp_perfdata, float);
mp_perfdata mp_set_pd_value_double(mp_perfdata, double);
mp_perfdata mp_set_pd_value_int(mp_perfdata, int);
mp_perfdata mp_set_pd_value_u_int(mp_perfdata, unsigned int);
mp_perfdata mp_set_pd_value_long(mp_perfdata, long);
mp_perfdata mp_set_pd_value_u_long(mp_perfdata, unsigned long);
mp_perfdata mp_set_pd_value_long_long(mp_perfdata, long long);
mp_perfdata mp_set_pd_value_u_long_long(mp_perfdata, unsigned long long);

#define mp_create_pd_value(V)                                                                                                              \
	_Generic((V),                                                                                                                          \
		float: mp_create_pd_value_float,                                                                                                   \
		double: mp_create_pd_value_double,                                                                                                 \
		int: mp_create_pd_value_int,                                                                                                       \
		unsigned int: mp_create_pd_value_u_int,                                                                                            \
		long: mp_create_pd_value_long,                                                                                                     \
		unsigned long: mp_create_pd_value_u_long,                                                                                          \
		long long: mp_create_pd_value_long_long,                                                                                           \
		unsigned long long: mp_create_pd_value_u_long_long)(V)

mp_perfdata_value mp_create_pd_value_float(float);
mp_perfdata_value mp_create_pd_value_double(double);
mp_perfdata_value mp_create_pd_value_int(int);
mp_perfdata_value mp_create_pd_value_u_int(unsigned int);
mp_perfdata_value mp_create_pd_value_long(long);
mp_perfdata_value mp_create_pd_value_u_long(unsigned long);
mp_perfdata_value mp_create_pd_value_long_long(long long);
mp_perfdata_value mp_create_pd_value_u_long_long(unsigned long long);

/*
 * Free the memory used by a pd_list
 */
void pd_list_free(pd_list[1]);

int cmp_perfdata_value(mp_perfdata_value, mp_perfdata_value);

// =================
// String formatters
// =================
/*
 * Generate string from mp_perfdata value
 */
char *pd_to_string(mp_perfdata);

/*
 * Generate string from perfdata_value value
 */
char *pd_value_to_string(mp_perfdata_value);

/*
 * Generate string from pd_list value for the final output
 */
char *pd_list_to_string(pd_list);

/*
 * Generate string from a mp_range value
 */
char *mp_range_to_string(mp_range);
char *fmt_range(range);