summaryrefslogtreecommitdiff
path: root/main/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/config.c')
-rw-r--r--main/config.c90
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;