Skip to content

Commit ab45d19

Browse files
Roman ZippelSam Ravnborg
authored andcommitted
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>
1 parent 7fc925f commit ab45d19

File tree

4 files changed

+81
-32
lines changed

4 files changed

+81
-32
lines changed

scripts/kconfig/expr.c

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,73 +1013,73 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2)
10131013
#endif
10141014
}
10151015

1016-
void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
1016+
void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
10171017
{
10181018
if (!e) {
1019-
fn(data, "y");
1019+
fn(data, NULL, "y");
10201020
return;
10211021
}
10221022

10231023
if (expr_compare_type(prevtoken, e->type) > 0)
1024-
fn(data, "(");
1024+
fn(data, NULL, "(");
10251025
switch (e->type) {
10261026
case E_SYMBOL:
10271027
if (e->left.sym->name)
1028-
fn(data, e->left.sym->name);
1028+
fn(data, e->left.sym, e->left.sym->name);
10291029
else
1030-
fn(data, "<choice>");
1030+
fn(data, NULL, "<choice>");
10311031
break;
10321032
case E_NOT:
1033-
fn(data, "!");
1033+
fn(data, NULL, "!");
10341034
expr_print(e->left.expr, fn, data, E_NOT);
10351035
break;
10361036
case E_EQUAL:
1037-
fn(data, e->left.sym->name);
1038-
fn(data, "=");
1039-
fn(data, e->right.sym->name);
1037+
fn(data, e->left.sym, e->left.sym->name);
1038+
fn(data, NULL, "=");
1039+
fn(data, e->right.sym, e->right.sym->name);
10401040
break;
10411041
case E_UNEQUAL:
1042-
fn(data, e->left.sym->name);
1043-
fn(data, "!=");
1044-
fn(data, e->right.sym->name);
1042+
fn(data, e->left.sym, e->left.sym->name);
1043+
fn(data, NULL, "!=");
1044+
fn(data, e->right.sym, e->right.sym->name);
10451045
break;
10461046
case E_OR:
10471047
expr_print(e->left.expr, fn, data, E_OR);
1048-
fn(data, " || ");
1048+
fn(data, NULL, " || ");
10491049
expr_print(e->right.expr, fn, data, E_OR);
10501050
break;
10511051
case E_AND:
10521052
expr_print(e->left.expr, fn, data, E_AND);
1053-
fn(data, " && ");
1053+
fn(data, NULL, " && ");
10541054
expr_print(e->right.expr, fn, data, E_AND);
10551055
break;
10561056
case E_CHOICE:
1057-
fn(data, e->right.sym->name);
1057+
fn(data, e->right.sym, e->right.sym->name);
10581058
if (e->left.expr) {
1059-
fn(data, " ^ ");
1059+
fn(data, NULL, " ^ ");
10601060
expr_print(e->left.expr, fn, data, E_CHOICE);
10611061
}
10621062
break;
10631063
case E_RANGE:
1064-
fn(data, "[");
1065-
fn(data, e->left.sym->name);
1066-
fn(data, " ");
1067-
fn(data, e->right.sym->name);
1068-
fn(data, "]");
1064+
fn(data, NULL, "[");
1065+
fn(data, e->left.sym, e->left.sym->name);
1066+
fn(data, NULL, " ");
1067+
fn(data, e->right.sym, e->right.sym->name);
1068+
fn(data, NULL, "]");
10691069
break;
10701070
default:
10711071
{
10721072
char buf[32];
10731073
sprintf(buf, "<unknown type %d>", e->type);
1074-
fn(data, buf);
1074+
fn(data, NULL, buf);
10751075
break;
10761076
}
10771077
}
10781078
if (expr_compare_type(prevtoken, e->type) > 0)
1079-
fn(data, ")");
1079+
fn(data, NULL, ")");
10801080
}
10811081

1082-
static void expr_print_file_helper(void *data, const char *str)
1082+
static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
10831083
{
10841084
fwrite(str, strlen(str), 1, data);
10851085
}
@@ -1089,7 +1089,7 @@ void expr_fprint(struct expr *e, FILE *out)
10891089
expr_print(e, expr_print_file_helper, out, E_NONE);
10901090
}
10911091

1092-
static void expr_print_gstr_helper(void *data, const char *str)
1092+
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
10931093
{
10941094
str_append((struct gstr*)data, str);
10951095
}

scripts/kconfig/lkc_proto.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ P(prop_get_type_name,const char *,(enum prop_type type));
3939

4040
/* expr.c */
4141
P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
42-
P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
42+
P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken));

scripts/kconfig/qconf.cc

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,8 @@ void ConfigInfoView::setShowDebug(bool b)
925925
_showDebug = b;
926926
if (menu)
927927
menuInfo();
928+
else if (sym)
929+
symbolInfo();
928930
emit showDebugChanged(b);
929931
}
930932
}
@@ -943,15 +945,44 @@ void ConfigInfoView::setSource(const QString& name)
943945
const char *p = name.latin1();
944946

945947
menu = NULL;
948+
sym = NULL;
946949

947950
switch (p[0]) {
948951
case 'm':
949-
if (sscanf(p, "m%p", &menu) == 1)
952+
struct menu *m;
953+
954+
if (sscanf(p, "m%p", &m) == 1 && menu != m) {
955+
menu = m;
950956
menuInfo();
957+
}
958+
break;
959+
case 's':
960+
struct symbol *s;
961+
962+
if (sscanf(p, "s%p", &s) == 1 && sym != s) {
963+
sym = s;
964+
symbolInfo();
965+
}
951966
break;
952967
}
953968
}
954969

970+
void ConfigInfoView::symbolInfo(void)
971+
{
972+
QString str;
973+
974+
str += "<big>Symbol: <b>";
975+
str += print_filter(sym->name);
976+
str += "</b></big><br><br>value: ";
977+
str += print_filter(sym_get_string_value(sym));
978+
str += "<br>visibility: ";
979+
str += sym->visible == yes ? "y" : sym->visible == mod ? "m" : "n";
980+
str += "<br>";
981+
str += debug_info(sym);
982+
983+
setText(str);
984+
}
985+
955986
void ConfigInfoView::menuInfo(void)
956987
{
957988
struct symbol* sym;
@@ -965,12 +996,20 @@ void ConfigInfoView::menuInfo(void)
965996
head += "</b></big>";
966997
if (sym->name) {
967998
head += " (";
999+
if (showDebug())
1000+
head += QString().sprintf("<a href=\"s%p\">", sym);
9681001
head += print_filter(sym->name);
1002+
if (showDebug())
1003+
head += "</a>";
9691004
head += ")";
9701005
}
9711006
} else if (sym->name) {
9721007
head += "<big><b>";
1008+
if (showDebug())
1009+
head += QString().sprintf("<a href=\"s%p\">", sym);
9731010
head += print_filter(sym->name);
1011+
if (showDebug())
1012+
head += "</a>";
9741013
head += "</b></big>";
9751014
}
9761015
head += "<br><br>";
@@ -1015,9 +1054,9 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
10151054
switch (prop->type) {
10161055
case P_PROMPT:
10171056
case P_MENU:
1018-
debug += "prompt: ";
1057+
debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
10191058
debug += print_filter(_(prop->text));
1020-
debug += "<br>";
1059+
debug += "</a><br>";
10211060
break;
10221061
case P_DEFAULT:
10231062
debug += "default: ";
@@ -1088,9 +1127,17 @@ QString ConfigInfoView::print_filter(const QString &str)
10881127
return res;
10891128
}
10901129

1091-
void ConfigInfoView::expr_print_help(void *data, const char *str)
1130+
void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char *str)
10921131
{
1093-
reinterpret_cast<QString*>(data)->append(print_filter(str));
1132+
QString* text = reinterpret_cast<QString*>(data);
1133+
QString str2 = print_filter(str);
1134+
1135+
if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
1136+
*text += QString().sprintf("<a href=\"s%p\">", sym);
1137+
*text += str2;
1138+
*text += "</a>";
1139+
} else
1140+
*text += str2;
10941141
}
10951142

10961143
QPopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)

scripts/kconfig/qconf.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,15 @@ public slots:
260260
void showDebugChanged(bool);
261261

262262
protected:
263+
void symbolInfo(void);
263264
void menuInfo(void);
264265
QString debug_info(struct symbol *sym);
265266
static QString print_filter(const QString &str);
266-
static void expr_print_help(void *data, const char *str);
267+
static void expr_print_help(void *data, struct symbol *sym, const char *str);
267268
QPopupMenu* createPopupMenu(const QPoint& pos);
268269
void contentsContextMenuEvent(QContextMenuEvent *e);
269270

271+
struct symbol *sym;
270272
struct menu *menu;
271273
bool _showDebug;
272274
};

0 commit comments

Comments
 (0)