X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_search.c;h=ba5927be18e4dee45b4654898e75691f2350393e;hb=693d0fc42b7f32eddc61c266dc4fb2dc716c8ea6;hp=cb01a41268921f529d27494bf1453cdcaa79d1df;hpb=7004fc9c03aa95adc214eb15ca2400487d122d58;p=collection4.git diff --git a/src/utils_search.c b/src/utils_search.c index cb01a41..ba5927b 100644 --- a/src/utils_search.c +++ b/src/utils_search.c @@ -25,8 +25,10 @@ #include #include #include +#include #include "utils_search.h" +#include "graph_instance.h" #include "utils_array.h" #include @@ -43,6 +45,9 @@ struct search_info_s str_array_t *terms; }; +/* + * Private functions + */ static char *read_quoted_string (const char **buffer) /* {{{ */ { const char *ptr = *buffer; @@ -150,6 +155,42 @@ static char *next_token (const char **buffer) /* {{{ */ return (ret); } /* }}} char *next_token */ +static int store_token_field (char **field, const char *token) /* {{{ */ +{ + char *copy; + + if ((field == NULL) || (token == NULL)) + return (EINVAL); + + copy = strdup (token); + if (copy == NULL) + return (ENOMEM); + + free (*field); + *field = copy; + + return (0); +} /* }}} int store_token_field */ + +static int store_token (search_info_t *si, const char *token) /* {{{ */ +{ + if (strncmp ("host:", token, strlen ("host:")) == 0) + return (store_token_field (&si->host, token + strlen ("host:"))); + else if (strncmp ("plugin:", token, strlen ("plugin:")) == 0) + return (store_token_field (&si->plugin, token + strlen ("plugin:"))); + else if (strncmp ("plugin_instance:", token, strlen ("plugin_instance:")) == 0) + return (store_token_field (&si->plugin_instance, token + strlen ("plugin_instance:"))); + else if (strncmp ("type:", token, strlen ("type:")) == 0) + return (store_token_field (&si->type, token + strlen ("type:"))); + else if (strncmp ("type_instance:", token, strlen ("type_instance:")) == 0) + return (store_token_field (&si->type_instance, token + strlen ("type_instance:"))); + + return (array_append (si->terms, token)); +} /* }}} int store_token */ + +/* + * Public functions + */ search_info_t *search_parse (const char *search) /* {{{ */ { const char *ptr; @@ -172,8 +213,7 @@ search_info_t *search_parse (const char *search) /* {{{ */ while ((token = next_token (&ptr)) != NULL) { - array_append (si->terms, token); - + store_token (si, token); free (token); } @@ -194,4 +234,42 @@ void search_destroy (search_info_t *si) /* {{{ */ array_destroy (si->terms); } /* }}} void search_destroy */ +_Bool search_graph_inst_matches (search_info_t *si, /* {{{ */ + graph_config_t *cfg, graph_instance_t *inst) +{ + char **argv; + int argc; + int i; + + if ((si == NULL) || (cfg == NULL) || (inst == NULL)) + return (0); + + if ((si->host != NULL) + && !inst_matches_field (inst, GIF_HOST, si->host)) + return (0); + else if ((si->plugin != NULL) + && !inst_matches_field (inst, GIF_PLUGIN, si->plugin)) + return (0); + else if ((si->plugin_instance != NULL) + && !inst_matches_field (inst, GIF_PLUGIN_INSTANCE, si->plugin_instance)) + return (0); + else if ((si->type != NULL) + && !inst_matches_field (inst, GIF_TYPE, si->type)) + return (0); + else if ((si->type_instance != NULL) + && !inst_matches_field (inst, GIF_TYPE_INSTANCE, si->type_instance)) + return (0); + + if (si->terms == NULL) + return (1); + + argc = array_argc (si->terms); + argv = array_argv (si->terms); + for (i = 0; i < argc; i++) + if (!inst_matches_string (cfg, inst, argv[i])) + return (0); + + return (1); +} /* }}} _Bool search_graph_inst_matches */ + /* vim: set sw=2 sts=2 et fdm=marker : */