mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
kconfig: create links in info window
Extend the expression print helper function to allow customization of the symbol output and use it to add links to the info window. Signed-off-by: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
parent
7fc925fd6a
commit
ab45d190fd
4 changed files with 81 additions and 32 deletions
|
@ -1013,73 +1013,73 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
|||
#endif
|
||||
}
|
||||
|
||||
void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
|
||||
void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
|
||||
{
|
||||
if (!e) {
|
||||
fn(data, "y");
|
||||
fn(data, NULL, "y");
|
||||
return;
|
||||
}
|
||||
|
||||
if (expr_compare_type(prevtoken, e->type) > 0)
|
||||
fn(data, "(");
|
||||
fn(data, NULL, "(");
|
||||
switch (e->type) {
|
||||
case E_SYMBOL:
|
||||
if (e->left.sym->name)
|
||||
fn(data, e->left.sym->name);
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
else
|
||||
fn(data, "<choice>");
|
||||
fn(data, NULL, "<choice>");
|
||||
break;
|
||||
case E_NOT:
|
||||
fn(data, "!");
|
||||
fn(data, NULL, "!");
|
||||
expr_print(e->left.expr, fn, data, E_NOT);
|
||||
break;
|
||||
case E_EQUAL:
|
||||
fn(data, e->left.sym->name);
|
||||
fn(data, "=");
|
||||
fn(data, e->right.sym->name);
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
fn(data, NULL, "=");
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
break;
|
||||
case E_UNEQUAL:
|
||||
fn(data, e->left.sym->name);
|
||||
fn(data, "!=");
|
||||
fn(data, e->right.sym->name);
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
fn(data, NULL, "!=");
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
break;
|
||||
case E_OR:
|
||||
expr_print(e->left.expr, fn, data, E_OR);
|
||||
fn(data, " || ");
|
||||
fn(data, NULL, " || ");
|
||||
expr_print(e->right.expr, fn, data, E_OR);
|
||||
break;
|
||||
case E_AND:
|
||||
expr_print(e->left.expr, fn, data, E_AND);
|
||||
fn(data, " && ");
|
||||
fn(data, NULL, " && ");
|
||||
expr_print(e->right.expr, fn, data, E_AND);
|
||||
break;
|
||||
case E_CHOICE:
|
||||
fn(data, e->right.sym->name);
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
if (e->left.expr) {
|
||||
fn(data, " ^ ");
|
||||
fn(data, NULL, " ^ ");
|
||||
expr_print(e->left.expr, fn, data, E_CHOICE);
|
||||
}
|
||||
break;
|
||||
case E_RANGE:
|
||||
fn(data, "[");
|
||||
fn(data, e->left.sym->name);
|
||||
fn(data, " ");
|
||||
fn(data, e->right.sym->name);
|
||||
fn(data, "]");
|
||||
fn(data, NULL, "[");
|
||||
fn(data, e->left.sym, e->left.sym->name);
|
||||
fn(data, NULL, " ");
|
||||
fn(data, e->right.sym, e->right.sym->name);
|
||||
fn(data, NULL, "]");
|
||||
break;
|
||||
default:
|
||||
{
|
||||
char buf[32];
|
||||
sprintf(buf, "<unknown type %d>", e->type);
|
||||
fn(data, buf);
|
||||
fn(data, NULL, buf);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (expr_compare_type(prevtoken, e->type) > 0)
|
||||
fn(data, ")");
|
||||
fn(data, NULL, ")");
|
||||
}
|
||||
|
||||
static void expr_print_file_helper(void *data, const char *str)
|
||||
static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
|
||||
{
|
||||
fwrite(str, strlen(str), 1, data);
|
||||
}
|
||||
|
@ -1089,7 +1089,7 @@ void expr_fprint(struct expr *e, FILE *out)
|
|||
expr_print(e, expr_print_file_helper, out, E_NONE);
|
||||
}
|
||||
|
||||
static void expr_print_gstr_helper(void *data, const char *str)
|
||||
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
|
||||
{
|
||||
str_append((struct gstr*)data, str);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue