diff options
Diffstat (limited to 'scripts/kconfig/expr.c')
-rw-r--r-- | scripts/kconfig/expr.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 330e7c0048a8..65531a7f28a8 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c | |||
@@ -1013,6 +1013,48 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2) | |||
1013 | #endif | 1013 | #endif |
1014 | } | 1014 | } |
1015 | 1015 | ||
1016 | static inline struct expr * | ||
1017 | expr_get_leftmost_symbol(const struct expr *e) | ||
1018 | { | ||
1019 | |||
1020 | if (e == NULL) | ||
1021 | return NULL; | ||
1022 | |||
1023 | while (e->type != E_SYMBOL) | ||
1024 | e = e->left.expr; | ||
1025 | |||
1026 | return expr_copy(e); | ||
1027 | } | ||
1028 | |||
1029 | /* | ||
1030 | * Given expression `e1' and `e2', returns the leaf of the longest | ||
1031 | * sub-expression of `e1' not containing 'e2. | ||
1032 | */ | ||
1033 | struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2) | ||
1034 | { | ||
1035 | struct expr *ret; | ||
1036 | |||
1037 | switch (e1->type) { | ||
1038 | case E_OR: | ||
1039 | return expr_alloc_and( | ||
1040 | expr_simplify_unmet_dep(e1->left.expr, e2), | ||
1041 | expr_simplify_unmet_dep(e1->right.expr, e2)); | ||
1042 | case E_AND: { | ||
1043 | struct expr *e; | ||
1044 | e = expr_alloc_and(expr_copy(e1), expr_copy(e2)); | ||
1045 | e = expr_eliminate_dups(e); | ||
1046 | ret = (!expr_eq(e, e1)) ? e1 : NULL; | ||
1047 | expr_free(e); | ||
1048 | break; | ||
1049 | } | ||
1050 | default: | ||
1051 | ret = e1; | ||
1052 | break; | ||
1053 | } | ||
1054 | |||
1055 | return expr_get_leftmost_symbol(ret); | ||
1056 | } | ||
1057 | |||
1016 | void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) | 1058 | void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) |
1017 | { | 1059 | { |
1018 | if (!e) { | 1060 | if (!e) { |