X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=inline;f=src%2Fgraph.c;h=01f0791dfa8ac7ea7fd761ced83c3070216fde45;hb=95cad1f9e58e9f1a5480e62fc2cdd2c3de33a863;hp=f6f40d57c3668230e42b25dee8e4cffb51ee1d9d;hpb=7b68199fab8170cb1c383652379f4b41f1ecf0af;p=collection4.git diff --git a/src/graph.c b/src/graph.c index f6f40d5..01f0791 100644 --- a/src/graph.c +++ b/src/graph.c @@ -8,8 +8,9 @@ #include #include "graph.h" -#include "graph_list.h" #include "graph_ident.h" +#include "graph_instance.h" +#include "graph_list.h" #include "graph_def.h" #include "graph_config.h" #include "common.h" @@ -216,7 +217,7 @@ int graph_get_params (graph_config_t *cfg, /* {{{ */ #define COPY_FIELD(field) do { \ const char *str = ident_get_##field (cfg->select); \ char uri_str[1024]; \ - uri_escape (uri_str, str, sizeof (uri_str)); \ + uri_escape_copy (uri_str, str, sizeof (uri_str)); \ strlcat (buffer, #field, buffer_size); \ strlcat (buffer, "=", buffer_size); \ strlcat (buffer, uri_str, buffer_size); \ @@ -267,13 +268,33 @@ int graph_add_def (graph_config_t *cfg, graph_def_t *def) /* {{{ */ return (def_append (cfg->defs, def)); } /* }}} int graph_add_def */ -_Bool graph_matches (graph_config_t *cfg, const graph_ident_t *ident) /* {{{ */ +_Bool graph_matches_ident (graph_config_t *cfg, const graph_ident_t *ident) /* {{{ */ { if ((cfg == NULL) || (ident == NULL)) return (0); return (ident_matches (cfg->select, ident)); -} /* }}} _Bool graph_matches */ +} /* }}} _Bool graph_matches_ident */ + +_Bool graph_matches_field (graph_config_t *cfg, /* {{{ */ + graph_ident_field_t field, const char *field_value) +{ + const char *selector_value; + + if ((cfg == NULL) || (field_value == NULL)) + return (0); + + selector_value = ident_get_field (cfg->select, field); + if (selector_value == NULL) + return (0); + + if (IS_ALL (selector_value) || IS_ANY (selector_value)) + return (1); + else if (strcasecmp (selector_value, field_value) == 0) + return (1); + + return (0); +} /* }}} _Bool graph_matches_field */ int graph_inst_foreach (graph_config_t *cfg, /* {{{ */ inst_callback_t cb, void *user_data) @@ -315,12 +336,36 @@ graph_instance_t *graph_inst_find_matching (graph_config_t *cfg, /* {{{ */ return (NULL); for (i = 0; i < cfg->instances_num; i++) - if (inst_matches_ident (cfg->instances[i], ident)) + if (inst_ident_matches (cfg->instances[i], ident)) return (cfg->instances[i]); return (NULL); } /* }}} graph_instance_t *graph_inst_find_matching */ +int graph_inst_find_all_matching (graph_config_t *cfg, /* {{{ */ + const graph_ident_t *ident, + graph_inst_callback_t callback, void *user_data) +{ + size_t i; + + if ((cfg == NULL) || (ident == NULL) || (callback == NULL)) + return (EINVAL); + + for (i = 0; i < cfg->instances_num; i++) + { + int status; + + if (!inst_matches_ident (cfg->instances[i], ident)) + continue; + + status = (*callback) (cfg, cfg->instances[i], user_data); + if (status != 0) + return (status); + } + + return (0); +} /* }}} int graph_inst_find_all_matching */ + int graph_inst_search (graph_config_t *cfg, const char *term, /* {{{ */ graph_inst_callback_t cb, void *user_data) @@ -363,6 +408,43 @@ int graph_inst_search (graph_config_t *cfg, const char *term, /* {{{ */ return (0); } /* }}} int graph_inst_search */ +int graph_inst_search_field (graph_config_t *cfg, /* {{{ */ + graph_ident_field_t field, const char *field_value, + graph_inst_callback_t callback, void *user_data) +{ + size_t i; + const char *selector_field; + _Bool need_check_instances = 0; + + if ((cfg == NULL) || (field_value == NULL) || (callback == NULL)) + return (EINVAL); + + if (!graph_matches_field (cfg, field, field_value)) + return (0); + + selector_field = ident_get_field (cfg->select, field); + if (selector_field == NULL) + return (-1); + + if (IS_ALL (selector_field) || IS_ANY (selector_field)) + need_check_instances = 1; + + for (i = 0; i < cfg->instances_num; i++) + { + int status; + + if (need_check_instances + && !inst_matches_field (cfg->instances[i], field, field_value)) + continue; + + status = (*callback) (cfg, cfg->instances[i], user_data); + if (status != 0) + return (status); + } + + return (0); +} /* }}} int graph_inst_search_field */ + int graph_compare (graph_config_t *cfg, const graph_ident_t *ident) /* {{{ */ { if ((cfg == NULL) || (ident == NULL))