config: fix relational operators for bool and tristate symbols
Since commit 31847b67bec0 ("kconfig: allow use of relations other than
(in)equality") it is possible to use relational operators in Kconfig
statements. However, those operators give unexpected results when
applied to bool/tristate values:
	(n < y) = y (correct)
	(m < y) = y (correct)
	(n < m) = n (wrong)
This happens because relational operators process bool and tristate
symbols as strings and m sorts before n. It makes little sense to do a
lexicographical compare on bool and tristate values though.
Documentation/kbuild/kconfig-language.txt states that expression can have
a value of 'n', 'm' or 'y' (or 0, 1, 2 respectively for calculations).
Let's make it so for relational comparisons with bool/tristate
expressions as well and document them. If at least one symbol is an
actual string then the lexicographical compare works just as before.
Signed-off-by: Nicolas Pitre <nico@linaro.org>
Acked-by: Randy Dunlap <rdunlap@infradead.org>
Tested-by: Randy Dunlap <rdunlap@infradead.org>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
[rebased against OpenWrt kconfig, slightly reword commit message]
(backported from upstream 9059a3493efea6492451430c7e2fa0af799a2abb)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 75dcaf3d23)
			
			
This commit is contained in:
		 Nicolas Pitre
					Nicolas Pitre
				
			
				
					committed by
					
						 Jo-Philipp Wich
						Jo-Philipp Wich
					
				
			
			
				
	
			
			
			 Jo-Philipp Wich
						Jo-Philipp Wich
					
				
			
						parent
						
							17ee485731
						
					
				
				
					commit
					e7ccc34478
				
			| @@ -893,7 +893,10 @@ static enum string_value_kind expr_parse_string(const char *str, | |||||||
| 	switch (type) { | 	switch (type) { | ||||||
| 	case S_BOOLEAN: | 	case S_BOOLEAN: | ||||||
| 	case S_TRISTATE: | 	case S_TRISTATE: | ||||||
| 		return k_string; | 		val->s = !strcmp(str, "n") ? 0 : | ||||||
|  | 			 !strcmp(str, "m") ? 1 : | ||||||
|  | 			 !strcmp(str, "y") ? 2 : -1; | ||||||
|  | 		return k_signed; | ||||||
| 	case S_INT: | 	case S_INT: | ||||||
| 		val->s = strtoll(str, &tail, 10); | 		val->s = strtoll(str, &tail, 10); | ||||||
| 		kind = k_signed; | 		kind = k_signed; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user