Add longest match to the rule-checking
This fixes cases where you have several keyboards with a common prefix, like algernon, and algernon-master
This commit is contained in:
parent
b26ded3ab1
commit
1c69acb7d5
1 changed files with 41 additions and 2 deletions
43
Makefile
43
Makefile
|
@ -152,16 +152,55 @@ COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER
|
||||||
# $1 The list to be checked
|
# $1 The list to be checked
|
||||||
# If a match is found, then RULE_FOUND is set to true
|
# If a match is found, then RULE_FOUND is set to true
|
||||||
# and MATCHED_ITEM to the item that was matched
|
# and MATCHED_ITEM to the item that was matched
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3
|
||||||
ifneq ($1,)
|
ifneq ($1,)
|
||||||
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
||||||
MATCHED_ITEM := $$(firstword $1)
|
MATCHED_ITEM := $$(firstword $1)
|
||||||
else
|
else
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$$(wordlist 2,9999,$1)))
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
# A recursive helper function for finding the longest match
|
||||||
|
# $1 The list to be checed
|
||||||
|
# It works by always removing the currently matched item from the list
|
||||||
|
# and call itself recursively, until a match is found
|
||||||
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
|
||||||
|
# Stop the recursion when the list is empty
|
||||||
|
ifneq ($1,)
|
||||||
|
RULE_BEFORE := $$(RULE)
|
||||||
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
|
||||||
|
# If a match is found in the current list, otherwise just return what we had before
|
||||||
|
ifeq ($$(RULE_FOUND),true)
|
||||||
|
# Save the best match so far and call itself recursivel
|
||||||
|
BEST_MATCH := $$(MATCHED_ITEM)
|
||||||
|
BEST_MATCH_RULE := $$(RULE)
|
||||||
|
RULE_FOUND := false
|
||||||
|
RULE := $$(RULE_BEFORE)
|
||||||
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$$(filter-out $$(MATCHED_ITEM),$1)))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
# Recursively try to find the longest match for the start of the rule to be checked
|
||||||
|
# $1 The list to be checked
|
||||||
|
# If a match is found, then RULE_FOUND is set to true
|
||||||
|
# and MATCHED_ITEM to the item that was matched
|
||||||
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
||||||
|
BEST_MATCH :=
|
||||||
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$1))
|
||||||
|
ifneq ($$(BEST_MATCH),)
|
||||||
|
RULE_FOUND := true
|
||||||
|
RULE := $$(BEST_MATCH_RULE)
|
||||||
|
MATCHED_ITEM := $$(BEST_MATCH)
|
||||||
|
else
|
||||||
|
RULE_FOUND := false
|
||||||
|
MATCHED_ITEM :=
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
|
||||||
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
||||||
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue