| 1326 | } |
| 1327 | |
| 1328 | static void |
| 1329 | process_menu_window(winid window, struct WinDesc *cw) |
| 1330 | { |
| 1331 | tty_menu_item *page_start, *page_end, *curr; |
| 1332 | long count; |
| 1333 | int n, attr_n, curr_page, page_lines, resp_len, previous_page_lines; |
| 1334 | boolean finished, counting, reset_count, show_obj_syms, |
| 1335 | only_if_no_headers = (iflags.menuobjsyms & 4) != 0; |
| 1336 | char *cp, *rp, resp[QBUFSZ], gacc[QBUFSZ], *msave, *morestr, really_morc; |
| 1337 | #define MENU_EXPLICIT_CHOICE 0x7f /* pseudo menu manipulation char */ |
| 1338 | |
| 1339 | curr_page = page_lines = 0; |
| 1340 | page_start = page_end = 0; |
| 1341 | msave = cw->morestr; /* save the morestr */ |
| 1342 | cw->morestr = morestr = (char *) alloc((unsigned) QBUFSZ); |
| 1343 | counting = FALSE; |
| 1344 | count = 0L; |
| 1345 | reset_count = TRUE; |
| 1346 | finished = FALSE; |
| 1347 | previous_page_lines = 0; |
| 1348 | |
| 1349 | /* collect group accelerators; for PICK_NONE, they're ignored; |
| 1350 | for PICK_ONE, only those which match exactly one entry will be |
| 1351 | accepted; for PICK_ANY, those which match any entry are okay */ |
| 1352 | gacc[0] = '\0'; |
| 1353 | if (cw->how != PICK_NONE) { |
| 1354 | int i, gcnt[128]; |
| 1355 | #define GSELIDX(c) ((c) & 127) /* guard against `signed char' */ |
| 1356 | |
| 1357 | for (i = 0; i < SIZE(gcnt); i++) |
| 1358 | gcnt[i] = 0; |
| 1359 | for (n = 0, curr = cw->mlist; curr; curr = curr->next) |
| 1360 | if (curr->gselector && curr->gselector != curr->selector) { |
| 1361 | ++n; |
| 1362 | ++gcnt[GSELIDX(curr->gselector)]; |
| 1363 | } |
| 1364 | |
| 1365 | if (n > 0) /* at least one group accelerator found */ |
| 1366 | for (rp = gacc, curr = cw->mlist; curr; curr = curr->next) |
| 1367 | if (curr->gselector |
| 1368 | && (curr->gselector != curr->selector |
| 1369 | /* '$' is both a selector "letter" and a group |
| 1370 | accelerator; including it in gacc allows gold to |
| 1371 | be selected via group when not on current page */ |
| 1372 | || curr->gselector == GOLD_SYM) |
| 1373 | && !strchr(gacc, curr->gselector) |
| 1374 | && (cw->how == PICK_ANY |
| 1375 | || gcnt[GSELIDX(curr->gselector)] == 1)) { |
| 1376 | *rp++ = curr->gselector; |
| 1377 | *rp = '\0'; /* re-terminate for strchr() */ |
| 1378 | } |
| 1379 | #undef GSELIDX |
| 1380 | } |
| 1381 | resp_len = 0; /* lint suppression */ |
| 1382 | |
| 1383 | show_obj_syms = iflags.use_menu_glyphs; |
| 1384 | if (only_if_no_headers) { |
| 1385 | for (curr = cw->mlist; curr; curr = curr->next) |
no test coverage detected