From 0645c9fc2c7f801ba3c7d68a17c137a63ada299f Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 18 Feb 2025 21:58:34 +0100 Subject: Implement new output functionality --- lib/perfdata.h | 203 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 lib/perfdata.h (limited to 'lib/perfdata.h') diff --git a/lib/perfdata.h b/lib/perfdata.h new file mode 100644 index 00000000..74583ee5 --- /dev/null +++ b/lib/perfdata.h @@ -0,0 +1,203 @@ +#pragma once + +#include "../config.h" + +#include +#include + +// 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); -- cgit v1.2.3-74-g34f1