From 2ab3d5bed954cccd4486ed3c8255f27b0a6ab7eb Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Wed, 23 Jun 2010 09:07:04 +0200 Subject: [PATCH] src/graph.[ch]: Implement "graph_inst_search_field" and "graph_matches_field". --- src/graph.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/graph.h | 16 +++++++++++++++- src/graph_list.c | 2 +- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/graph.c b/src/graph.c index f6f40d5..02b3ebf 100644 --- a/src/graph.c +++ b/src/graph.c @@ -267,13 +267,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) @@ -363,6 +383,33 @@ 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; + + if ((cfg == NULL) || (field_value == NULL) || (callback == NULL)) + return (EINVAL); + + if (!graph_matches_field (cfg, field, field_value)) + return (0); + + for (i = 0; i < cfg->instances_num; i++) + { + if (inst_matches_field (cfg->instances[i], field, field_value)) + { + int status; + + 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)) diff --git a/src/graph.h b/src/graph.h index 18d168c..d303a85 100644 --- a/src/graph.h +++ b/src/graph.h @@ -2,6 +2,7 @@ #define GRAPH_H 1 #include "graph_types.h" +#include "graph_ident.h" #include "oconfig.h" #include "utils_array.h" @@ -27,7 +28,14 @@ graph_def_t *graph_get_defs (graph_config_t *cfg); int graph_add_def (graph_config_t *cfg, graph_def_t *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); + +/* Compares the given string with the appropriate field of the selector. If the + * selector field is "/all/" or "/any/", returns true without checking the + * instances. See "graph_inst_search_field" for finding all matching instances. + * */ +_Bool graph_matches_field (graph_config_t *cfg, + graph_ident_field_t field, const char *field_value); int graph_inst_foreach (graph_config_t *cfg, inst_callback_t cb, void *user_data); @@ -41,6 +49,12 @@ graph_instance_t *graph_inst_find_matching (graph_config_t *cfg, int graph_inst_search (graph_config_t *cfg, const char *term, graph_inst_callback_t callback, void *user_data); +/* Iterates over all instances and calls "inst_matches_field". If that method + * returns true, calls the callback with the graph and instance pointers. */ +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); + int graph_compare (graph_config_t *cfg, const graph_ident_t *ident); int graph_clear_instances (graph_config_t *cfg); diff --git a/src/graph_list.c b/src/graph_list.c index 62a4ed3..0dc0006 100644 --- a/src/graph_list.c +++ b/src/graph_list.c @@ -73,7 +73,7 @@ static int gl_register_file (const graph_ident_t *file, /* {{{ */ graph_config_t *cfg = gl_active[i]; int status; - if (!graph_matches (cfg, file)) + if (!graph_matches_ident (cfg, file)) continue; status = graph_add_file (cfg, file); -- 2.11.0