diff options
Diffstat (limited to 'contrib/ncurses/tack/menu.c')
-rw-r--r-- | contrib/ncurses/tack/menu.c | 421 |
1 files changed, 0 insertions, 421 deletions
diff --git a/contrib/ncurses/tack/menu.c b/contrib/ncurses/tack/menu.c deleted file mode 100644 index b4c8c05..0000000 --- a/contrib/ncurses/tack/menu.c +++ /dev/null @@ -1,421 +0,0 @@ -/* -** Copyright (C) 1991, 1997 Free Software Foundation, Inc. -** -** This file is part of TACK. -** -** TACK is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2, or (at your option) -** any later version. -** -** TACK is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with TACK; see the file COPYING. If not, write to -** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -** Boston, MA 02110-1301, USA -*/ - -#include <tack.h> - -MODULE_ID("$Id: menu.c,v 1.3 2005/09/17 19:49:16 tom Exp $") - -/* - Menu control - */ - -static void test_byname(struct test_menu *, int *, int *); - -struct test_list *augment_test; -char prompt_string[80]; /* menu prompt storage */ - -/* -** menu_prompt() -** -** Print the menu prompt string. -*/ -void -menu_prompt(void) -{ - ptext(&prompt_string[1]); -} - -/* -** menu_test_loop(test-structure, state, control-character) -** -** This function implements the repeat test function. -*/ -static void -menu_test_loop( - struct test_list *test, - int *state, - int *ch) -{ - int nch, p; - - if ((test->flags & MENU_REP_MASK) && (augment_test != test)) { - /* set the augment variable (first time only) */ - p = (test->flags >> 8) & 15; - if ((test->flags & MENU_REP_MASK) == MENU_LM1) { - augment = lines - 1; - } else - if ((test->flags & MENU_ONE_MASK) == MENU_ONE) { - augment = 1; - } else - if ((test->flags & MENU_LC_MASK) == MENU_lines) { - augment = lines * p / 10; - } else - if ((test->flags & MENU_LC_MASK) == MENU_columns) { - augment = columns * p / 10; - } else { - augment = 1; - } - augment_test = test; - set_augment_txt(); - } - do { - if ((test->flags | *state) & MENU_CLEAR) { - put_clear(); - } else - if (line_count + test->lines_needed >= lines) { - put_clear(); - } - nch = 0; - if (test->test_procedure) { - /* The procedure takes precedence so I can pass - the menu entry as an argument. - */ - can_test(test->caps_done, FLAG_TESTED); - can_test(test->caps_tested, FLAG_TESTED); - test->test_procedure(test, state, &nch); - } else - if (test->sub_menu) { - /* nested menu's */ - menu_display(test->sub_menu, &nch); - *state = 0; - if (nch == 'q' || nch == 's') { - /* Quit and skip are killed here */ - nch = '?'; - } - } else { - break; /* cya */ - } - if (nch == '\r' || nch == '\n' || nch == 'n') { - nch = 0; - break; - } - } while (nch == 'r'); - *ch = nch; -} - -/* -** menu_display(menu-structure, flags) -** -** This function implements menu control. -*/ -void -menu_display( - struct test_menu *menu, - int *last_ch) -{ - int test_state = 0, run_standard_tests; - int hot_topic, ch = 0, nch = 0; - struct test_list *mt; - struct test_list *repeat_tests = 0; - int repeat_state = 0; - int prompt_length; - - prompt_length = strlen(prompt_string); - if (menu->ident) { - sprintf(&prompt_string[prompt_length], "/%s", menu->ident); - } - hot_topic = menu->default_action; - run_standard_tests = menu->standard_tests ? - menu->standard_tests[0] : -1; - if (!last_ch) { - last_ch = &ch; - } - while (1) { - if (ch == 0) { - /* Display the menu */ - put_crlf(); - if (menu->menu_function) { - /* - this function may be used to restrict menu - entries. If used it must print the title. - */ - menu->menu_function(menu); - } else - if (menu->menu_title) { - ptextln(menu->menu_title); - } - for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) { - if (mt->menu_entry) { - ptext(" "); - ptextln(mt->menu_entry); - } - } - if (menu->standard_tests) { - ptext(" "); - ptextln(menu->standard_tests); - ptextln(" r) repeat test"); - ptextln(" s) skip to next test"); - } - ptextln(" q) quit"); - ptextln(" ?) help"); - } - if (ch == 0 || ch == REQUEST_PROMPT) { - put_crlf(); - ptext(&prompt_string[1]); - if (hot_topic) { - ptext(" ["); - putchp(hot_topic); - ptext("]"); - } - ptext(" > "); - /* read a character */ - ch = wait_here(); - } - if (ch == '\r' || ch == '\n') { - ch = hot_topic; - } - if (ch == 'q') { - break; - } - if (ch == '?') { - ch = 0; - continue; - } - nch = ch; - ch = 0; - /* Run one of the standard tests (by request) */ - for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) { - if (mt->menu_entry && (nch == mt->menu_entry[0])) { - if (mt->flags & MENU_MENU) { - test_byname(menu, &test_state, &nch); - } else { - menu_test_loop(mt, &test_state, &nch); - } - ch = nch; - if ((mt->flags & MENU_COMPLETE) && ch == 0) { - /* top level */ - hot_topic = 'q'; - ch = '?'; - } - } - } - if (menu->standard_tests && nch == 'r') { - menu->resume_tests = repeat_tests; - test_state = repeat_state; - nch = run_standard_tests; - } - if (nch == run_standard_tests) { - if (!(mt = menu->resume_tests)) { - mt = menu->tests; - } - if (mt->flags & MENU_LAST) { - mt = menu->tests; - } - /* Run the standard test suite */ - for ( ; (mt->flags & MENU_LAST) == 0; ) { - if ((mt->flags & MENU_NEXT) == MENU_NEXT) { - repeat_tests = mt; - repeat_state = test_state; - nch = run_standard_tests; - menu_test_loop(mt, &test_state, &nch); - if (nch != 0 && nch != 'n') { - ch = nch; - break; - } - if (test_state & MENU_STOP) { - break; - } - } - mt++; - } - if (ch == 0) { - ch = hot_topic; - } - menu->resume_tests = mt; - menu->resume_state = test_state; - menu->resume_char = ch; - - if (ch == run_standard_tests) { - /* pop up a level */ - break; - } - } - } - *last_ch = ch; - prompt_string[prompt_length] = '\0'; -} - -/* -** generic_done_message(test_list) -** -** Print the Done message and request input. -*/ -void -generic_done_message( - struct test_list *test, - int *state, - int *ch) -{ - char done_message[128]; - - if (test->caps_done) { - sprintf(done_message, "(%s) Done ", test->caps_done); - ptext(done_message); - } else { - ptext("Done "); - } - *ch = wait_here(); - if (*ch == '\r' || *ch == '\n' || *ch == 'n') { - *ch = 0; - } - if (*ch == 's') { - *state |= MENU_STOP; - *ch = 0; - } -} - -/* -** menu_clear_screen(test, state, ch) -** -** Just clear the screen. -*/ -void -menu_clear_screen( - struct test_list *test GCC_UNUSED, - int *state GCC_UNUSED, - int *ch GCC_UNUSED) -{ - put_clear(); -} - -/* -** menu_reset_init(test, state, ch) -** -** Send the reset and init strings. -*/ -void -menu_reset_init( - struct test_list *test GCC_UNUSED, - int *state GCC_UNUSED, - int *ch GCC_UNUSED) -{ - reset_init(); - put_crlf(); -} - -/* -** subtest_menu(test, state, ch) -** -** Scan the menu looking for something to execute -** Return TRUE if we found anything. -*/ -int -subtest_menu( - struct test_list *test, - int *state, - int *ch) -{ - struct test_list *mt; - - if (*ch) { - for (mt = test; (mt->flags & MENU_LAST) == 0; mt++) { - if (mt->menu_entry && (*ch == mt->menu_entry[0])) { - *ch = 0; - menu_test_loop(mt, state, ch); - return TRUE; - } - } - } - return FALSE; -} - -/* -** menu_can_scan(menu-structure) -** -** Recursively scan the menu tree and find which cap names can be tested. -*/ -void -menu_can_scan( - const struct test_menu *menu) -{ - struct test_list *mt; - - for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) { - can_test(mt->caps_done, FLAG_CAN_TEST); - can_test(mt->caps_tested, FLAG_CAN_TEST); - if (!(mt->test_procedure)) { - if (mt->sub_menu) { - menu_can_scan(mt->sub_menu); - } - } - } -} - -/* -** menu_search(menu-structure, cap) -** -** Recursively search the menu tree and execute any tests that use cap. -*/ -static void -menu_search( - struct test_menu *menu, - int *state, - int *ch, - char *cap) -{ - struct test_list *mt; - int nch; - - for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) { - nch = 0; - if (cap_match(mt->caps_done, cap) - || cap_match(mt->caps_tested, cap)) { - menu_test_loop(mt, state, &nch); - } - if (!(mt->test_procedure)) { - if (mt->sub_menu) { - menu_search(mt->sub_menu, state, &nch, cap); - } - } - if (*state & MENU_STOP) { - break; - } - if (nch != 0 && nch != 'n') { - *ch = nch; - break; - } - } -} - -/* -** test_byname(menu, state, ch) -** -** Get a cap name then run all tests that use that cap. -*/ -static void -test_byname( - struct test_menu *menu, - int *state GCC_UNUSED, - int *ch) -{ - int test_state = 0; - char cap[32]; - - if (tty_can_sync == SYNC_NOT_TESTED) { - verify_time(); - } - ptext("enter name: "); - read_string(cap, sizeof(cap)); - if (cap[0]) { - menu_search(menu, &test_state, ch, cap); - } - *ch = '?'; -} |