X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=config%2Fmenu.c;h=f3bffa309333061ed5d852e7c00132107017add5;hb=320cfce45cb7016f265df42c9512414fb8e5d1e1;hp=a5241859326a90cd1828734121c465bd01704b17;hpb=c39bbd9df12751bec93d0de908e2117ac480477d;p=carl9170fw.git diff --git a/config/menu.c b/config/menu.c index a524185..f3bffa3 100644 --- a/config/menu.c +++ b/config/menu.c @@ -48,7 +48,7 @@ void menu_add_entry(struct symbol *sym) { struct menu *menu; - menu = malloc(sizeof(*menu)); + menu = xmalloc(sizeof(*menu)); memset(menu, 0, sizeof(*menu)); menu->sym = sym; menu->parent = current_menu; @@ -507,12 +507,12 @@ const char *menu_get_help(struct menu *menu) return ""; } -static int get_prompt_str(struct gstr *r, struct property *prop, struct menu - **jumps, int jump_nb) +static void get_prompt_str(struct gstr *r, struct property *prop, + struct list_head *head) { int i, j; - char header[4]; struct menu *submenu[8], *menu, *location = NULL; + struct jump_key *jump; str_printf(r, _("Prompt: %s\n"), _(prop->text)); str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name, @@ -530,7 +530,9 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu if (location == NULL && accessible) location = menu; } - if (jumps && jump_nb < JUMP_NB && location) { + if (head && location) { + jump = xmalloc(sizeof(struct jump_key)); + if (menu_is_visible(prop->menu)) { /* * There is not enough room to put the hint at the @@ -538,19 +540,27 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu * last "Location" line even when it would belong on * the former. */ - jumps[jump_nb] = prop->menu; + jump->target = prop->menu; } else - jumps[jump_nb] = location; - snprintf(header, 4, "(%d)", jump_nb + 1); - } else - location = NULL; + jump->target = location; + + if (list_empty(head)) + jump->index = 0; + else + jump->index = list_entry(head->prev, struct jump_key, + entries)->index + 1; + + list_add_tail(&jump->entries, head); + } if (i > 0) { str_printf(r, _(" Location:\n")); - for (j = 1; --i >= 0; j += 2) { + for (j = 4; --i >= 0; j += 2) { menu = submenu[i]; - str_printf(r, "%s%*c-> %s", menu == location ? header - : " ", j, ' ', _(menu_get_prompt(menu))); + if (head && location && menu == location) + jump->offset = r->len - 1; + str_printf(r, "%*c-> %s", j, ' ', + _(menu_get_prompt(menu))); if (menu->sym) { str_printf(r, " (%s [=%s])", menu->sym->name ? menu->sym->name : _(""), @@ -559,20 +569,16 @@ static int get_prompt_str(struct gstr *r, struct property *prop, struct menu str_append(r, "\n"); } } - - return location ? 1 : 0; } /* - * jumps is optional and may be NULL - * returns the number of jumps inserted + * head is optional and may be NULL */ -int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, - int jump_nb) +void get_symbol_str(struct gstr *r, struct symbol *sym, + struct list_head *head) { bool hit; struct property *prop; - int i = 0; if (sym && sym->name) { str_printf(r, "Symbol: %s [=%s]\n", sym->name, @@ -588,7 +594,7 @@ int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, } } for_all_prompts(sym, prop) - i += get_prompt_str(r, prop, jumps, jump_nb + i); + get_prompt_str(r, prop, head); hit = false; for_all_properties(sym, prop, P_SELECT) { if (!hit) { @@ -606,18 +612,16 @@ int get_symbol_str(struct gstr *r, struct symbol *sym, struct menu **jumps, str_append(r, "\n"); } str_append(r, "\n\n"); - - return i; } -struct gstr get_relations_str(struct symbol **sym_arr, struct menu **jumps) +struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head) { struct symbol *sym; struct gstr res = str_new(); - int i, jump_nb = 0; + int i; for (i = 0; sym_arr && (sym = sym_arr[i]); i++) - jump_nb += get_symbol_str(&res, sym, jumps, jump_nb); + get_symbol_str(&res, sym, head); if (!i) str_append(&res, _("No matches found.\n")); return res; @@ -636,5 +640,5 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help) } str_printf(help, "%s\n", _(help_text)); if (sym) - get_symbol_str(help, sym, NULL, 0); + get_symbol_str(help, sym, NULL); }