From: Florian Forster Date: Wed, 23 Jun 2010 07:07:04 +0000 (+0200) Subject: src/graph.[ch]: Implement "graph_inst_search_field" and "graph_matches_field". X-Git-Tag: v4.0.0~198^2~6 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=2ab3d5bed954cccd4486ed3c8255f27b0a6ab7eb;p=collection4.git src/graph.[ch]: Implement "graph_inst_search_field" and "graph_matches_field". --- 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);