Skip to content

Commit

Permalink
kconfig: create links in info window
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Roman Zippel authored and Sam Ravnborg committed Jun 9, 2006
1 parent 7fc925f commit ab45d19
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 32 deletions.
50 changes: 25 additions & 25 deletions scripts/kconfig/expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion scripts/kconfig/lkc_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ P(prop_get_type_name,const char *,(enum prop_type type));

/* expr.c */
P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken));
57 changes: 52 additions & 5 deletions scripts/kconfig/qconf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -925,6 +925,8 @@ void ConfigInfoView::setShowDebug(bool b)
_showDebug = b;
if (menu)
menuInfo();
else if (sym)
symbolInfo();
emit showDebugChanged(b);
}
}
Expand All @@ -943,15 +945,44 @@ void ConfigInfoView::setSource(const QString& name)
const char *p = name.latin1();

menu = NULL;
sym = NULL;

switch (p[0]) {
case 'm':
if (sscanf(p, "m%p", &menu) == 1)
struct menu *m;

if (sscanf(p, "m%p", &m) == 1 && menu != m) {
menu = m;
menuInfo();
}
break;
case 's':
struct symbol *s;

if (sscanf(p, "s%p", &s) == 1 && sym != s) {
sym = s;
symbolInfo();
}
break;
}
}

void ConfigInfoView::symbolInfo(void)
{
QString str;

str += "<big>Symbol: <b>";
str += print_filter(sym->name);
str += "</b></big><br><br>value: ";
str += print_filter(sym_get_string_value(sym));
str += "<br>visibility: ";
str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
str += "<br>";
str += debug_info(sym);

setText(str);
}

void ConfigInfoView::menuInfo(void)
{
struct symbol* sym;
Expand All @@ -965,12 +996,20 @@ void ConfigInfoView::menuInfo(void)
head += "</b></big>";
if (sym->name) {
head += " (";
if (showDebug())
head += QString().sprintf("<a href=\"s%p\">", sym);
head += print_filter(sym->name);
if (showDebug())
head += "</a>";
head += ")";
}
} else if (sym->name) {
head += "<big><b>";
if (showDebug())
head += QString().sprintf("<a href=\"s%p\">", sym);
head += print_filter(sym->name);
if (showDebug())
head += "</a>";
head += "</b></big>";
}
head += "<br><br>";
Expand Down Expand Up @@ -1015,9 +1054,9 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
switch (prop->type) {
case P_PROMPT:
case P_MENU:
debug += "prompt: ";
debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
debug += print_filter(_(prop->text));
debug += "<br>";
debug += "</a><br>";
break;
case P_DEFAULT:
debug += "default: ";
Expand Down Expand Up @@ -1088,9 +1127,17 @@ QString ConfigInfoView::print_filter(const QString &str)
return res;
}

void ConfigInfoView::expr_print_help(void *data, const char *str)
void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
{
reinterpret_cast<QString*>(data)->append(print_filter(str));
QString* text = reinterpret_cast<QString*>(data);
QString str2 = print_filter(str);

if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
*text += QString().sprintf("<a href=\"s%p\">", sym);
*text += str2;
*text += "</a>";
} else
*text += str2;
}

QPopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)
Expand Down
4 changes: 3 additions & 1 deletion scripts/kconfig/qconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,13 +260,15 @@ public slots:
void showDebugChanged(bool);

protected:
void symbolInfo(void);
void menuInfo(void);
QString debug_info(struct symbol *sym);
static QString print_filter(const QString &str);
static void expr_print_help(void *data, const char *str);
static void expr_print_help(void *data, struct symbol *sym, const char *str);
QPopupMenu* createPopupMenu(const QPoint& pos);
void contentsContextMenuEvent(QContextMenuEvent *e);

struct symbol *sym;
struct menu *menu;
bool _showDebug;
};
Expand Down

0 comments on commit ab45d19

Please sign in to comment.