diff options
Diffstat (limited to 'main/config.c')
-rw-r--r-- | main/config.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/main/config.c b/main/config.c index 74f42cf72..69621868c 100644 --- a/main/config.c +++ b/main/config.c @@ -723,6 +723,96 @@ const char *ast_variable_find(const struct ast_category *category, const char *v return ast_variable_find_in_list(category->root, variable); } +const struct ast_variable *ast_variable_find_variable_in_list(const struct ast_variable *list, const char *variable_name) +{ + const struct ast_variable *v; + + for (v = list; v; v = v->next) { + if (!strcasecmp(variable_name, v->name)) { + return v; + } + } + return NULL; +} + +int ast_variables_match(const struct ast_variable *left, const struct ast_variable *right) +{ + char *op; + + if (left == right) { + return 1; + } + + if (!(left && right)) { + return 0; + } + + op = strrchr(right->name, ' '); + if (op) { + op++; + } + + return ast_strings_match(left->value, op ? ast_strdupa(op) : NULL, right->value); +} + +int ast_variable_lists_match(const struct ast_variable *left, const struct ast_variable *right, int exact_match) +{ + const struct ast_variable *field; + int right_count = 0; + int left_count = 0; + + if (left == right) { + return 1; + } + + if (!(left && right)) { + return 0; + } + + for (field = right; field; field = field->next) { + char *space = strrchr(field->name, ' '); + const struct ast_variable *old; + char * name = (char *)field->name; + + if (space) { + name = ast_strdup(field->name); + if (!name) { + return 0; + } + name[space - field->name] = '\0'; + } + + old = ast_variable_find_variable_in_list(left, name); + if (name != field->name) { + ast_free(name); + } + + if (exact_match) { + if (!old || strcmp(old->value, field->value)) { + return 0; + } + } else { + if (!ast_variables_match(old, field)) { + return 0; + } + } + + right_count++; + } + + if (exact_match) { + for (field = left; field; field = field->next) { + left_count++; + } + + if (right_count != left_count) { + return 0; + } + } + + return 1; +} + const char *ast_variable_find_in_list(const struct ast_variable *list, const char *variable) { const struct ast_variable *v; |