Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cf3cbe2 authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds
Browse files

[PATCH] kconfig: allow variable argumnts for range



This allows variable arguments in the range option for int and hex config
symbols.

Signed-off-by: default avatarRoman Zippel <zippel@linux-m68k.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 90389160
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -151,6 +151,12 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
}
}


static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
{
	return sym2->type == S_INT || sym2->type == S_HEX ||
	       (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
}

void sym_check_prop(struct symbol *sym)
void sym_check_prop(struct symbol *sym)
{
{
	struct property *prop;
	struct property *prop;
@@ -185,8 +191,8 @@ void sym_check_prop(struct symbol *sym)
			if (sym->type != S_INT && sym->type != S_HEX)
			if (sym->type != S_INT && sym->type != S_HEX)
				prop_warn(prop, "range is only allowed "
				prop_warn(prop, "range is only allowed "
				                "for int or hex symbols");
				                "for int or hex symbols");
			if (!sym_string_valid(sym, prop->expr->left.sym->name) ||
			if (!menu_range_valid_sym(sym, prop->expr->left.sym) ||
			    !sym_string_valid(sym, prop->expr->right.sym->name))
			    !menu_range_valid_sym(sym, prop->expr->right.sym))
				prop_warn(prop, "range is invalid");
				prop_warn(prop, "range is invalid");
			break;
			break;
		default:
		default:
+54 −4
Original line number Original line Diff line number Diff line
@@ -141,6 +141,55 @@ struct property *sym_get_range_prop(struct symbol *sym)
	return NULL;
	return NULL;
}
}


static int sym_get_range_val(struct symbol *sym, int base)
{
	sym_calc_value(sym);
	switch (sym->type) {
	case S_INT:
		base = 10;
		break;
	case S_HEX:
		base = 16;
		break;
	default:
		break;
	}
	return strtol(sym->curr.val, NULL, base);
}

static void sym_validate_range(struct symbol *sym)
{
	struct property *prop;
	int base, val, val2;
	char str[64];

	switch (sym->type) {
	case S_INT:
		base = 10;
		break;
	case S_HEX:
		base = 16;
		break;
	default:
		return;
	}
	prop = sym_get_range_prop(sym);
	if (!prop)
		return;
	val = strtol(sym->curr.val, NULL, base);
	val2 = sym_get_range_val(prop->expr->left.sym, base);
	if (val >= val2) {
		val2 = sym_get_range_val(prop->expr->right.sym, base);
		if (val <= val2)
			return;
	}
	if (sym->type == S_INT)
		sprintf(str, "%d", val2);
	else
		sprintf(str, "0x%x", val2);
	sym->curr.val = strdup(str);
}

static void sym_calc_visibility(struct symbol *sym)
static void sym_calc_visibility(struct symbol *sym)
{
{
	struct property *prop;
	struct property *prop;
@@ -301,6 +350,7 @@ void sym_calc_value(struct symbol *sym)
	sym->curr = newval;
	sym->curr = newval;
	if (sym_is_choice(sym) && newval.tri == yes)
	if (sym_is_choice(sym) && newval.tri == yes)
		sym->curr.val = sym_calc_choice(sym);
		sym->curr.val = sym_calc_choice(sym);
	sym_validate_range(sym);


	if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
	if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
		sym_set_changed(sym);
		sym_set_changed(sym);
@@ -489,8 +539,8 @@ bool sym_string_within_range(struct symbol *sym, const char *str)
		if (!prop)
		if (!prop)
			return true;
			return true;
		val = strtol(str, NULL, 10);
		val = strtol(str, NULL, 10);
		return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&
		return val >= sym_get_range_val(prop->expr->left.sym, 10) &&
		       val <= strtol(prop->expr->right.sym->name, NULL, 10);
		       val <= sym_get_range_val(prop->expr->right.sym, 10);
	case S_HEX:
	case S_HEX:
		if (!sym_string_valid(sym, str))
		if (!sym_string_valid(sym, str))
			return false;
			return false;
@@ -498,8 +548,8 @@ bool sym_string_within_range(struct symbol *sym, const char *str)
		if (!prop)
		if (!prop)
			return true;
			return true;
		val = strtol(str, NULL, 16);
		val = strtol(str, NULL, 16);
		return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&
		return val >= sym_get_range_val(prop->expr->left.sym, 16) &&
		       val <= strtol(prop->expr->right.sym->name, NULL, 16);
		       val <= sym_get_range_val(prop->expr->right.sym, 16);
	case S_BOOLEAN:
	case S_BOOLEAN:
	case S_TRISTATE:
	case S_TRISTATE:
		switch (str[0]) {
		switch (str[0]) {