scripts/addToolsVersion: properly handle .in vs. .in.2
While most components have their version in the .in file, some
have it in the .in.2 (eg. elf2flt).
Currently, to handle this case, we indiscriminately munge both files,
but this is wrong: in the elf2flt case, if we add a binutils version,
we do not want it to be added to elf2flt, and conversely.
So, for each tool, we need to explicitly know what file to munge.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 struct dialog_info dlg;
28 static void set_mono_theme(void)
30 dlg.screen.atr = A_NORMAL;
31 dlg.shadow.atr = A_NORMAL;
32 dlg.dialog.atr = A_NORMAL;
33 dlg.title.atr = A_BOLD;
34 dlg.border.atr = A_NORMAL;
35 dlg.button_active.atr = A_REVERSE;
36 dlg.button_inactive.atr = A_DIM;
37 dlg.button_key_active.atr = A_REVERSE;
38 dlg.button_key_inactive.atr = A_BOLD;
39 dlg.button_label_active.atr = A_REVERSE;
40 dlg.button_label_inactive.atr = A_NORMAL;
41 dlg.inputbox.atr = A_NORMAL;
42 dlg.inputbox_border.atr = A_NORMAL;
43 dlg.searchbox.atr = A_NORMAL;
44 dlg.searchbox_title.atr = A_BOLD;
45 dlg.searchbox_border.atr = A_NORMAL;
46 dlg.position_indicator.atr = A_BOLD;
47 dlg.menubox.atr = A_NORMAL;
48 dlg.menubox_border.atr = A_NORMAL;
49 dlg.item.atr = A_NORMAL;
50 dlg.item_selected.atr = A_REVERSE;
52 dlg.tag_selected.atr = A_REVERSE;
53 dlg.tag_key.atr = A_BOLD;
54 dlg.tag_key_selected.atr = A_REVERSE;
55 dlg.check.atr = A_BOLD;
56 dlg.check_selected.atr = A_REVERSE;
57 dlg.uarrow.atr = A_BOLD;
58 dlg.darrow.atr = A_BOLD;
61 #define DLG_COLOR(dialog, f, b, h) \
63 dlg.dialog.fg = (f); \
64 dlg.dialog.bg = (b); \
65 dlg.dialog.hl = (h); \
68 static void set_classic_theme(void)
70 DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true);
71 DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true);
72 DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false);
73 DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true);
74 DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true);
75 DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true);
76 DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false);
77 DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true);
78 DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false);
79 DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true);
80 DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true);
81 DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false);
82 DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false);
83 DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false);
84 DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true);
85 DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true);
86 DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true);
87 DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false);
88 DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true);
89 DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false);
90 DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true);
91 DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true);
92 DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true);
93 DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true);
94 DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true);
95 DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false);
96 DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true);
97 DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true);
98 DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true);
101 static void set_blackbg_theme(void)
103 DLG_COLOR(screen, COLOR_RED, COLOR_BLACK, true);
104 DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false);
105 DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false);
106 DLG_COLOR(title, COLOR_RED, COLOR_BLACK, false);
107 DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true);
109 DLG_COLOR(button_active, COLOR_YELLOW, COLOR_RED, false);
110 DLG_COLOR(button_inactive, COLOR_YELLOW, COLOR_BLACK, false);
111 DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_RED, true);
112 DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false);
113 DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, false);
114 DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_BLACK, true);
116 DLG_COLOR(inputbox, COLOR_YELLOW, COLOR_BLACK, false);
117 DLG_COLOR(inputbox_border, COLOR_YELLOW, COLOR_BLACK, false);
119 DLG_COLOR(searchbox, COLOR_YELLOW, COLOR_BLACK, false);
120 DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_BLACK, true);
121 DLG_COLOR(searchbox_border, COLOR_BLACK, COLOR_BLACK, true);
123 DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK, false);
125 DLG_COLOR(menubox, COLOR_YELLOW, COLOR_BLACK, false);
126 DLG_COLOR(menubox_border, COLOR_BLACK, COLOR_BLACK, true);
128 DLG_COLOR(item, COLOR_WHITE, COLOR_BLACK, false);
129 DLG_COLOR(item_selected, COLOR_WHITE, COLOR_RED, false);
131 DLG_COLOR(tag, COLOR_RED, COLOR_BLACK, false);
132 DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_RED, true);
133 DLG_COLOR(tag_key, COLOR_RED, COLOR_BLACK, false);
134 DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED, true);
136 DLG_COLOR(check, COLOR_YELLOW, COLOR_BLACK, false);
137 DLG_COLOR(check_selected, COLOR_YELLOW, COLOR_RED, true);
139 DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false);
140 DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false);
143 static void set_bluetitle_theme(void)
146 DLG_COLOR(title, COLOR_BLUE, COLOR_WHITE, true);
147 DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true);
148 DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_BLUE, true);
149 DLG_COLOR(searchbox_title, COLOR_BLUE, COLOR_WHITE, true);
150 DLG_COLOR(position_indicator, COLOR_BLUE, COLOR_WHITE, true);
151 DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true);
152 DLG_COLOR(tag_key, COLOR_BLUE, COLOR_WHITE, true);
159 static int set_theme(const char *theme)
163 set_bluetitle_theme();
164 else if (strcmp(theme, "classic") == 0)
166 else if (strcmp(theme, "bluetitle") == 0)
167 set_bluetitle_theme();
168 else if (strcmp(theme, "blackbg") == 0)
170 else if (strcmp(theme, "mono") == 0)
176 static void init_one_color(struct dialog_color *color)
181 init_pair(pair, color->fg, color->bg);
183 color->atr = A_BOLD | COLOR_PAIR(pair);
185 color->atr = COLOR_PAIR(pair);
188 static void init_dialog_colors(void)
190 init_one_color(&dlg.screen);
191 init_one_color(&dlg.shadow);
192 init_one_color(&dlg.dialog);
193 init_one_color(&dlg.title);
194 init_one_color(&dlg.border);
195 init_one_color(&dlg.button_active);
196 init_one_color(&dlg.button_inactive);
197 init_one_color(&dlg.button_key_active);
198 init_one_color(&dlg.button_key_inactive);
199 init_one_color(&dlg.button_label_active);
200 init_one_color(&dlg.button_label_inactive);
201 init_one_color(&dlg.inputbox);
202 init_one_color(&dlg.inputbox_border);
203 init_one_color(&dlg.searchbox);
204 init_one_color(&dlg.searchbox_title);
205 init_one_color(&dlg.searchbox_border);
206 init_one_color(&dlg.position_indicator);
207 init_one_color(&dlg.menubox);
208 init_one_color(&dlg.menubox_border);
209 init_one_color(&dlg.item);
210 init_one_color(&dlg.item_selected);
211 init_one_color(&dlg.tag);
212 init_one_color(&dlg.tag_selected);
213 init_one_color(&dlg.tag_key);
214 init_one_color(&dlg.tag_key_selected);
215 init_one_color(&dlg.check);
216 init_one_color(&dlg.check_selected);
217 init_one_color(&dlg.uarrow);
218 init_one_color(&dlg.darrow);
222 * Setup for color display
224 static void color_setup(const char *theme)
228 use_color = set_theme(theme);
229 if (use_color && has_colors()) {
231 init_dialog_colors();
237 * Set window to attribute 'attr'
239 void attr_clear(WINDOW * win, int height, int width, chtype attr)
244 for (i = 0; i < height; i++) {
246 for (j = 0; j < width; j++)
252 void dialog_clear(void)
254 attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
255 /* Display background title if it exists ... - SLH */
256 if (dlg.backtitle != NULL) {
259 wattrset(stdscr, dlg.screen.atr);
260 mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
262 for (i = 1; i < COLS - 1; i++)
263 waddch(stdscr, ACS_HLINE);
265 wnoutrefresh(stdscr);
269 * Do some initialization for dialog
271 int init_dialog(const char *backtitle)
275 initscr(); /* Init curses */
276 getmaxyx(stdscr, height, width);
277 if (height < 19 || width < 80) {
279 return -ERRDISPLAYTOOSMALL;
282 dlg.backtitle = backtitle;
283 color_setup(getenv("MENUCONFIG_COLOR"));
285 keypad(stdscr, TRUE);
293 void set_dialog_backtitle(const char *backtitle)
295 dlg.backtitle = backtitle;
299 * End using dialog functions.
301 void end_dialog(int x, int y)
303 /* move cursor back to original position */
309 /* Print the title of the dialog. Center the title and truncate
310 * tile if wider than dialog (- 2 chars).
312 void print_title(WINDOW *dialog, const char *title, int width)
315 int tlen = MIN(width - 2, strlen(title));
316 wattrset(dialog, dlg.title.atr);
317 mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
318 mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
324 * Print a string of text in a window, automatically wrap around to the
325 * next line if the string is too long to fit on one line. Newline
326 * characters '\n' are replaced by spaces. We start on a new line
327 * if there is no room for at least 4 nonblanks following a double-space.
329 void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
331 int newl, cur_x, cur_y;
332 int i, prompt_len, room, wlen;
333 char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
335 strcpy(tempstr, prompt);
337 prompt_len = strlen(tempstr);
342 for (i = 0; i < prompt_len; i++) {
343 if (tempstr[i] == '\n')
347 if (prompt_len <= width - x * 2) { /* If prompt is short */
348 wmove(win, y, (width - prompt_len) / 2);
349 waddstr(win, tempstr);
355 while (word && *word) {
356 sp = strchr(word, ' ');
360 /* Wrap to next line if either the word does not fit,
361 or it is the first word of a new sentence, and it is
362 short, and the next word does not fit. */
363 room = width - cur_x;
366 (newl && wlen < 4 && sp
367 && wlen + 1 + strlen(sp) > room
368 && (!(sp2 = strchr(sp, ' '))
369 || wlen + 1 + (sp2 - sp) > room))) {
373 wmove(win, cur_y, cur_x);
375 getyx(win, cur_y, cur_x);
377 if (sp && *sp == ' ') {
378 cur_x++; /* double space */
379 while (*++sp == ' ') ;
391 void print_button(WINDOW * win, const char *label, int y, int x, int selected)
396 wattrset(win, selected ? dlg.button_active.atr
397 : dlg.button_inactive.atr);
399 temp = strspn(label, " ");
401 wattrset(win, selected ? dlg.button_label_active.atr
402 : dlg.button_label_inactive.atr);
403 for (i = 0; i < temp; i++)
405 wattrset(win, selected ? dlg.button_key_active.atr
406 : dlg.button_key_inactive.atr);
407 waddch(win, label[0]);
408 wattrset(win, selected ? dlg.button_label_active.atr
409 : dlg.button_label_inactive.atr);
410 waddstr(win, (char *)label + 1);
411 wattrset(win, selected ? dlg.button_active.atr
412 : dlg.button_inactive.atr);
414 wmove(win, y, x + temp + 1);
418 * Draw a rectangular box with line drawing characters
421 draw_box(WINDOW * win, int y, int x, int height, int width,
422 chtype box, chtype border)
427 for (i = 0; i < height; i++) {
428 wmove(win, y + i, x);
429 for (j = 0; j < width; j++)
431 waddch(win, border | ACS_ULCORNER);
432 else if (i == height - 1 && !j)
433 waddch(win, border | ACS_LLCORNER);
434 else if (!i && j == width - 1)
435 waddch(win, box | ACS_URCORNER);
436 else if (i == height - 1 && j == width - 1)
437 waddch(win, box | ACS_LRCORNER);
439 waddch(win, border | ACS_HLINE);
440 else if (i == height - 1)
441 waddch(win, box | ACS_HLINE);
443 waddch(win, border | ACS_VLINE);
444 else if (j == width - 1)
445 waddch(win, box | ACS_VLINE);
447 waddch(win, box | ' ');
452 * Draw shadows along the right and bottom edge to give a more 3D look
455 void draw_shadow(WINDOW * win, int y, int x, int height, int width)
459 if (has_colors()) { /* Whether terminal supports color? */
460 wattrset(win, dlg.shadow.atr);
461 wmove(win, y + height, x + 2);
462 for (i = 0; i < width; i++)
463 waddch(win, winch(win) & A_CHARTEXT);
464 for (i = y + 1; i < y + height + 1; i++) {
465 wmove(win, i, x + width);
466 waddch(win, winch(win) & A_CHARTEXT);
467 waddch(win, winch(win) & A_CHARTEXT);
474 * Return the position of the first alphabetic character in a string.
476 int first_alpha(const char *string, const char *exempt)
478 int i, in_paren = 0, c;
480 for (i = 0; i < strlen(string); i++) {
481 c = tolower(string[i]);
483 if (strchr("<[(", c))
485 if (strchr(">])", c) && in_paren > 0)
488 if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
496 * ncurses uses ESC to detect escaped char sequences. This resutl in
497 * a small timeout before ESC is actually delivered to the application.
498 * lxdialog suggest <ESC> <ESC> which is correctly translated to two
499 * times esc. But then we need to ignore the second esc to avoid stepping
500 * out one menu too much. Filter away all escaped key sequences since
501 * keypad(FALSE) turn off ncurses support for escape sequences - and thats
502 * needed to make notimeout() do as expected.
504 int on_key_esc(WINDOW *win)
516 } while (key3 != ERR);
519 if (key == KEY_ESC && key2 == ERR)
521 else if (key != ERR && key != KEY_ESC && key2 == ERR)
527 /* redraw screen in new size */
528 int on_key_resize(void)
534 struct dialog_list *item_cur;
535 struct dialog_list item_nil;
536 struct dialog_list *item_head;
538 void item_reset(void)
540 struct dialog_list *p, *next;
542 for (p = item_head; p; p = next) {
547 item_cur = &item_nil;
550 void item_make(const char *fmt, ...)
553 struct dialog_list *p = malloc(sizeof(*p));
560 memset(p, 0, sizeof(*p));
563 vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap);
567 void item_add_str(const char *fmt, ...)
572 avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
575 vsnprintf(item_cur->node.str + strlen(item_cur->node.str),
577 item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0';
581 void item_set_tag(char tag)
583 item_cur->node.tag = tag;
585 void item_set_data(void *ptr)
587 item_cur->node.data = ptr;
590 void item_set_selected(int val)
592 item_cur->node.selected = val;
595 int item_activate_selected(void)
598 if (item_is_selected())
603 void *item_data(void)
605 return item_cur->node.data;
610 return item_cur->node.tag;
616 struct dialog_list *p;
618 for (p = item_head; p; p = p->next)
634 struct dialog_list *p;
636 for (p = item_head; p; p = p->next) {
644 const char *item_str(void)
646 return item_cur->node.str;
649 int item_is_selected(void)
651 return (item_cur->node.selected != 0);
654 int item_is_tag(char tag)
656 return (item_cur->node.tag == tag);