diff options
author | Ralf Corsepius <ralf.corsepius@rtems.org> | 2002-12-12 03:59:25 +0000 |
---|---|---|
committer | Ralf Corsepius <ralf.corsepius@rtems.org> | 2002-12-12 03:59:25 +0000 |
commit | 7fe03217c8facf2fd90b29c31928e6d090f4e19c (patch) | |
tree | e7dfd9e9146944f1529dc5edab5b25dc4c22cd9f /c/src/libmisc/monitor/mon-command.c | |
parent | 2002-12-12 Ralf Corsepius <corsepius@faw.uni-ulm.de> (diff) | |
download | rtems-7fe03217c8facf2fd90b29c31928e6d090f4e19c.tar.bz2 |
2002-12-12 Ralf Corsepius <corsepius@faw.uni-ulm.de>
* .cvsignore: Moved to rtems/cpukit/libmisc.
* ChangeLog: Moved to rtems/cpukit/libmisc.
* Makefile.am: Moved to rtems/cpukit/libmisc.
* README: Moved to rtems/cpukit/libmisc.
* configure.ac: Moved to rtems/cpukit/libmisc.
* capture/Makefile.am: Moved to rtems/cpukit/libmisc.
* capture/README: Moved to rtems/cpukit/libmisc.
* capture/capture-cli.c: Moved to rtems/cpukit/libmisc.
* capture/capture-cli.h: Moved to rtems/cpukit/libmisc.
* capture/capture.c: Moved to rtems/cpukit/libmisc.
* capture/capture.h: Moved to rtems/cpukit/libmisc.
* cpuuse/Makefile.am: Moved to rtems/cpukit/libmisc.
* cpuuse/README: Moved to rtems/cpukit/libmisc.
* cpuuse/cpuuse.c: Moved to rtems/cpukit/libmisc.
* cpuuse/cpuuse.h: Moved to rtems/cpukit/libmisc.
* devnull/.cvsignore: Moved to rtems/cpukit/libmisc.
* devnull/Makefile.am: Moved to rtems/cpukit/libmisc.
* devnull/devnull.c: Moved to rtems/cpukit/libmisc.
* devnull/devnull.h: Moved to rtems/cpukit/libmisc.
* dummy/.cvsignore: Moved to rtems/cpukit/libmisc.
* dummy/Makefile.am: Moved to rtems/cpukit/libmisc.
* dummy/README: Moved to rtems/cpukit/libmisc.
* dummy/dummy.c: Moved to rtems/cpukit/libmisc.
* dumpbuf/.cvsignore: Moved to rtems/cpukit/libmisc.
* dumpbuf/Makefile.am: Moved to rtems/cpukit/libmisc.
* dumpbuf/dumpbuf.c: Moved to rtems/cpukit/libmisc.
* dumpbuf/dumpbuf.h: Moved to rtems/cpukit/libmisc.
* monitor/.cvsignore: Moved to rtems/cpukit/libmisc.
* monitor/Makefile.am: Moved to rtems/cpukit/libmisc.
* monitor/README: Moved to rtems/cpukit/libmisc.
* monitor/mon-command.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-config.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-dname.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-driver.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-extension.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-itask.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-manager.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-monitor.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-mpci.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-object.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-prmisc.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-queue.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-server.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-symbols.c: Moved to rtems/cpukit/libmisc.
* monitor/mon-task.c: Moved to rtems/cpukit/libmisc.
* monitor/monitor.h: Moved to rtems/cpukit/libmisc.
* monitor/symbols.h: Moved to rtems/cpukit/libmisc.
* mw-fb/.cvsignore: Moved to rtems/cpukit/libmisc.
* mw-fb/Makefile.am: Moved to rtems/cpukit/libmisc.
* mw-fb/mw_fb.c: Moved to rtems/cpukit/libmisc.
* mw-fb/mw_fb.h: Moved to rtems/cpukit/libmisc.
* mw-fb/mw_uid.c: Moved to rtems/cpukit/libmisc.
* mw-fb/mw_uid.h: Moved to rtems/cpukit/libmisc.
* rtmonuse/.cvsignore: Moved to rtems/cpukit/libmisc.
* rtmonuse/Makefile.am: Moved to rtems/cpukit/libmisc.
* rtmonuse/rtmonuse.c: Moved to rtems/cpukit/libmisc.
* rtmonuse/rtmonuse.h: Moved to rtems/cpukit/libmisc.
* serdbg/.cvsignore: Moved to rtems/cpukit/libmisc.
* serdbg/Makefile.am: Moved to rtems/cpukit/libmisc.
* serdbg/README: Moved to rtems/cpukit/libmisc.
* serdbg/serdbg.c: Moved to rtems/cpukit/libmisc.
* serdbg/serdbg.h: Moved to rtems/cpukit/libmisc.
* serdbg/serdbgcnf.h: Moved to rtems/cpukit/libmisc.
* serdbg/serdbgio.c: Moved to rtems/cpukit/libmisc.
* serdbg/termios_printk.c: Moved to rtems/cpukit/libmisc.
* serdbg/termios_printk.h: Moved to rtems/cpukit/libmisc.
* serdbg/termios_printk_cnf.h: Moved to rtems/cpukit/libmisc.
* shell/.cvsignore: Moved to rtems/cpukit/libmisc.
* shell/Makefile.am: Moved to rtems/cpukit/libmisc.
* shell/README: Moved to rtems/cpukit/libmisc.
* shell/cmds.c: Moved to rtems/cpukit/libmisc.
* shell/shell.c: Moved to rtems/cpukit/libmisc.
* shell/shell.h: Moved to rtems/cpukit/libmisc.
* stackchk/.cvsignore: Moved to rtems/cpukit/libmisc.
* stackchk/Makefile.am: Moved to rtems/cpukit/libmisc.
* stackchk/README: Moved to rtems/cpukit/libmisc.
* stackchk/check.c: Moved to rtems/cpukit/libmisc.
* stackchk/internal.h: Moved to rtems/cpukit/libmisc.
* stackchk/stackchk.h: Moved to rtems/cpukit/libmisc.
* untar/.cvsignore: Moved to rtems/cpukit/libmisc.
* untar/Makefile.am: Moved to rtems/cpukit/libmisc.
* untar/README: Moved to rtems/cpukit/libmisc.
* untar/untar.c: Moved to rtems/cpukit/libmisc.
* untar/untar.h: Moved to rtems/cpukit/libmisc.
* wrapup/.cvsignore: Moved to rtems/cpukit/libmisc.
* wrapup/Makefile.am: Moved to rtems/cpukit/libmisc.
Diffstat (limited to 'c/src/libmisc/monitor/mon-command.c')
-rw-r--r-- | c/src/libmisc/monitor/mon-command.c | 733 |
1 files changed, 0 insertions, 733 deletions
diff --git a/c/src/libmisc/monitor/mon-command.c b/c/src/libmisc/monitor/mon-command.c deleted file mode 100644 index 54f35cb04f..0000000000 --- a/c/src/libmisc/monitor/mon-command.c +++ /dev/null @@ -1,733 +0,0 @@ -/* - * Command parsing routines for RTEMS monitor - * - * TODO: - * - * $Id$ - */ - -#include <rtems.h> - -#include <rtems/monitor.h> - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -/* - * 2001-01-30 KJO (vac4050@cae597.rsc.raytheon.com): - * Fixed rtems_monitor_command_lookup() to accept partial - * commands to uniqeness. Added support for setting - * the monitor prompt via an environment variable: - * RTEMS_MONITOR_PROMPT - * - * CCJ: 26-3-2000, adding command history and command line - * editing. This code is donated from My Right Boot and not - * covered by GPL, only the RTEMS license. - */ - -/* - * Some key labels to define special keys. - */ - -#define KEYS_EXTENDED (0x8000) -#define KEYS_NORMAL_MASK (0x00ff) -#define KEYS_INS (0) -#define KEYS_DEL (1) -#define KEYS_UARROW (2) -#define KEYS_DARROW (3) -#define KEYS_LARROW (4) -#define KEYS_RARROW (5) -#define KEYS_HOME (6) -#define KEYS_END (7) -#define KEYS_F1 (8) -#define KEYS_F2 (9) -#define KEYS_F3 (10) -#define KEYS_F4 (11) -#define KEYS_F5 (12) -#define KEYS_F6 (13) -#define KEYS_F7 (14) -#define KEYS_F8 (15) -#define KEYS_F9 (16) -#define KEYS_F10 (17) - -#define RTEMS_COMMAND_BUFFER_SIZE (75) - -static char monitor_prompt[32]; -#ifndef RTEMS_UNIX -static char buffer[RTEMS_COMMAND_BUFFER_SIZE]; -static int pos; -static int logged_in; -#endif -/* - * History data. - */ - -#define RTEMS_COMMAND_HISTORIES (20) - -#ifndef RTEMS_UNIX -static char history_buffer[RTEMS_COMMAND_HISTORIES][RTEMS_COMMAND_BUFFER_SIZE]; -static int history_pos[RTEMS_COMMAND_HISTORIES]; -static int history; -static int history_next; -#endif - -/* - * Translation tables. Not sure if this is the best way to - * handle this, how-ever I wish to avoid the overhead of - * including a more complete and standard environment such - * as ncurses. - */ - -struct translation_table -{ - char expecting; - struct translation_table *branch; - unsigned int key; -}; - -static struct translation_table trans_two[] = -{ - { '~', 0, KEYS_INS }, - { 0, 0, 0 } -}; - -static struct translation_table trans_three[] = -{ - { '~', 0, KEYS_DEL }, - { 0, 0, 0 } -}; - -static struct translation_table trans_tab_csi[] = -{ - { '2', trans_two, 0 }, - { '3', trans_three, 0 }, - { 'A', 0, KEYS_UARROW }, - { 'B', 0, KEYS_DARROW }, - { 'D', 0, KEYS_LARROW }, - { 'C', 0, KEYS_RARROW }, - { 'F', 0, KEYS_END }, - { 'H', 0, KEYS_HOME }, - { 0, 0, 0 } -}; - -static struct translation_table trans_tab_O[] = -{ - { '1', 0, KEYS_F1 }, - { '2', 0, KEYS_F2 }, - { '3', 0, KEYS_F3 }, - { '4', 0, KEYS_F4 }, - { '5', 0, KEYS_F5 }, - { '6', 0, KEYS_F6 }, - { '7', 0, KEYS_F7 }, - { '8', 0, KEYS_F8 }, - { '9', 0, KEYS_F9 }, - { ':', 0, KEYS_F10 }, - { 'P', 0, KEYS_F1 }, - { 'Q', 0, KEYS_F2 }, - { 'R', 0, KEYS_F3 }, - { 'S', 0, KEYS_F4 }, - { 'T', 0, KEYS_F5 }, - { 'U', 0, KEYS_F6 }, - { 'V', 0, KEYS_F7 }, - { 'W', 0, KEYS_F8 }, - { 'X', 0, KEYS_F9 }, - { 'Y', 0, KEYS_F10 }, - { 0, 0, 0 } -}; - -static struct translation_table trans_tab[] = -{ - { '[', trans_tab_csi, 0 }, /* CSI command sequences */ - { 'O', trans_tab_O, 0 }, /* O are the fuction keys */ - { 0, 0, 0 } -}; - -/* - * Perform a basic tranlation for some ANSI/VT100 key codes. - * This code could do with a timeout on the ESC as it is - * now lost from the input stream. It is not* used by the - * line editor below so considiered not worth the effort. - */ - -static unsigned int -rtems_monitor_getchar ( -) -{ - struct translation_table *translation = 0; - for (;;) - { - char c = getchar (); - if (c == 27) - translation = trans_tab; - else - { - /* - * If no translation happing just pass through - * and return the key. - */ - if (translation) - { - /* - * Scan the current table for the key, and if found - * see if this key is a fork. If so follow it and - * wait else return the extended key. - */ - int index = 0; - int branched = 0; - while ((translation[index].expecting != '\0') || - (translation[index].key != '\0')) - { - if (translation[index].expecting == c) - { - /* - * A branch is take if more keys are to come. - */ - if (translation[index].branch == 0) - return KEYS_EXTENDED | translation[index].key; - else - { - translation = translation[index].branch; - branched = 1; - break; - } - } - index++; - } - /* - * Who knows what these keys are, just drop them. - */ - if (!branched) - translation = 0; - } - else - return c; - } - } -} - -#ifndef RTEMS_UNIX -/* - * The line editor with history. - */ - -static int -rtems_monitor_line_editor ( - char *command -) -{ - int repeating = 0; - - memset (buffer, 0, RTEMS_COMMAND_BUFFER_SIZE); - history = history_next; - pos = 0; - - if (!logged_in) - printf ("\nMonitor ready, press enter to login.\n\n"); - else - printf ("%s $ ", monitor_prompt); - - while (1) - { - unsigned int extended_key = rtems_monitor_getchar (); - char c = extended_key & KEYS_NORMAL_MASK; - - /* - * Make the extended_key usable as a boolean. - */ - extended_key &= ~KEYS_NORMAL_MASK; - - if (!extended_key && !logged_in) - { - if (c == '\n') - { - logged_in = 1; - /* - * The prompt has changed from `>' to `$' to help know - * which version of the monitor code people are using. - */ - printf("%s $ ", monitor_prompt); - } - } - else - { - if (extended_key) - { - switch (c) - { - case KEYS_END: - printf (buffer + pos); - pos = (int) strlen (buffer); - break; - - case KEYS_HOME: - printf ("\r%s $ ", monitor_prompt); - pos = 0; - break; - - case KEYS_LARROW: - if (pos > 0) - { - pos--; - putchar ('\b'); - } - break; - - case KEYS_RARROW: - if ((pos < RTEMS_COMMAND_BUFFER_SIZE) && (buffer[pos] != '\0')) - { - putchar (buffer[pos]); - pos++; - } - break; - - case KEYS_UARROW: - /* - * If we are moving up the histories then we need to save the working - * buffer. - */ - if (history) - { - int end; - int bs; - if (history == history_next) - { - memcpy (history_buffer[history_next], buffer, - RTEMS_COMMAND_BUFFER_SIZE); - history_pos[history_next] = pos; - } - history--; - memcpy (buffer, history_buffer[history], - RTEMS_COMMAND_BUFFER_SIZE); - pos = history_pos[history]; - printf ("\r%*c", RTEMS_COMMAND_BUFFER_SIZE, ' '); - printf ("\r%s $ %s", monitor_prompt, buffer); - end = (int) strlen (buffer); - for (bs = 0; bs < (end - pos); bs++) - putchar ('\b'); - } - break; - - case KEYS_DARROW: - if (history < history_next) - { - int end; - int bs; - history++; - memcpy (buffer, history_buffer[history], - RTEMS_COMMAND_BUFFER_SIZE); - pos = history_pos[history]; - printf ("\r%*c", RTEMS_COMMAND_BUFFER_SIZE, ' '); - printf ("\r%s $ %s", monitor_prompt, buffer); - end = (int) strlen (buffer); - for (bs = 0; bs < (end - pos); bs++) - putchar ('\b'); - } - break; - - case KEYS_DEL: - if (buffer[pos] != '\0') - { - int end; - int bs; - strcpy (&buffer[pos], &buffer[pos + 1]); - printf ("\r%s $ %s", monitor_prompt, buffer); - end = (int) strlen (buffer); - for (bs = 0; bs < (end - pos); bs++) - putchar ('\b'); - } - break; - } - } - else - { - switch (c) - { - case '\b': - case '\x7e': - case '\x7f': - if (pos > 0) - { - int bs; - pos--; - strcpy (buffer + pos, buffer + pos + 1); - printf ("\b%s \b", buffer + pos); - for (bs = 0; bs < ((int) strlen (buffer) - pos); bs++) - putchar ('\b'); - } - break; - - case '\n': - /* - * Process the command. - */ - printf ("\n"); - repeating = 1; - /* - * Only process the history if we have a command and - *a history. - */ - if (strlen (buffer)) - { - if (history_next && (history == history_next)) - { - /* - * Do not place the last command into the history - *if the same. - */ - if (strcmp (history_buffer[history_next - 1], buffer)) - repeating = 0; - } - else - repeating = 0; - } - if (!repeating) - { - memcpy (history_buffer[history_next], buffer, - RTEMS_COMMAND_BUFFER_SIZE); - history_pos[history_next] = pos; - if (history_next < (RTEMS_COMMAND_HISTORIES - 1)) - history_next++; - else - { - memmove (history_buffer[0], history_buffer[1], - RTEMS_COMMAND_BUFFER_SIZE * (RTEMS_COMMAND_HISTORIES - 1)); - memmove (&history_pos[0], &history_pos[1], - sizeof (history_pos[0]) * (RTEMS_COMMAND_HISTORIES - 1)); - } - } - else - { -#ifdef ENABLE_ENTER_REPEATS - if (history_next) - memcpy (buffer, history_buffer[history_next - 1], - RTEMS_COMMAND_BUFFER_SIZE); -#endif - } - memmove (command, buffer, RTEMS_COMMAND_BUFFER_SIZE); - return repeating; - break; - - default: - if ((pos < (RTEMS_COMMAND_BUFFER_SIZE - 1)) && - (c >= ' ') && (c <= 'z')) - { - int end; - end = strlen (buffer); - if ((pos < end) && (end < RTEMS_COMMAND_BUFFER_SIZE)) - { - int ch, bs; - for (ch = end + 1; ch > pos; ch--) - buffer[ch] = buffer[ch - 1]; - printf (buffer + pos); - for (bs = 0; bs < (end - pos + 1); bs++) - putchar ('\b'); - } - buffer[pos++] = c; - if (pos > end) - buffer[pos] = '\0'; - putchar (c); - } - break; - } - } - } - } -} -#endif - -/* - * make_argv(cp): token-count - * Break up the command line in 'cp' into global argv[] and argc (return - * value). - */ - -int -rtems_monitor_make_argv( - char *cp, - int *argc_p, - char **argv) -{ - int argc = 0; - - while ((cp = strtok(cp, " \t\n\r"))) - { - argv[argc++] = cp; - cp = (char *) NULL; - } - argv[argc] = (char *) NULL; /* end of argv */ - - return *argc_p = argc; -} - - -/* - * Read and break up a monitor command - * - * We have to loop on the gets call, since it will return NULL under UNIX - * RTEMS when we get a signal (eg: SIGALRM). - */ - -int -rtems_monitor_command_read(char *command, - int *argc, - char **argv) -{ - char *env_prompt; - - env_prompt = getenv("RTEMS_MONITOR_PROMPT"); - - /* - * put node number in the prompt if we are multiprocessing - */ - if (!rtems_configuration_get_user_multiprocessing_table ()) - sprintf (monitor_prompt, "%s", - (env_prompt == NULL) ? MONITOR_PROMPT: env_prompt); - else if (rtems_monitor_default_node != rtems_monitor_node) - sprintf (monitor_prompt, "%d-%s-%d", rtems_monitor_node, - (env_prompt == NULL) ? MONITOR_PROMPT : env_prompt, - rtems_monitor_default_node); - else - sprintf (monitor_prompt, "%d-%s", rtems_monitor_node, - (env_prompt == NULL) ? MONITOR_PROMPT : env_prompt); - -#if defined(RTEMS_UNIX) - /* RTEMS on unix gets so many interrupt system calls this is hosed */ - printf ("%s> ", monitor_prompt); - fflush (stdout); - while (gets(command) == (char *) 0) - ; -#else - rtems_monitor_line_editor (command); -#endif - - return rtems_monitor_make_argv (command, argc, argv); -} - -/* - * Look up a command in a command table - * - */ - -rtems_monitor_command_entry_t * -rtems_monitor_command_lookup( - rtems_monitor_command_entry_t *table, - int argc, - char **argv -) -{ - int command_length; - rtems_monitor_command_entry_t *found_it = NULL; - - command_length = strlen (argv[0]); - - if ((table == 0) || (argv[0] == 0)) - return 0; - - while (table) - { - if (table->command) - { - - /* - * Check for ambiguity - */ - if (!strncmp (table->command, argv[0], command_length)) - { - if (found_it) - { - return 0; - } - - else - found_it = table; - } - } - table = table->next; - } - - /* - * No ambiguity (the possible partial command was unique after all) - */ - if (found_it) - { - if (table->command_function == 0) - return 0; - - return found_it; - } - - return 0; -} - -void -rtems_monitor_show_help ( - rtems_monitor_command_entry_t *help_cmd, - int max_cmd_len -) -{ -#define MAX_HELP_LINE_LENGTH (75 - max_cmd_len - 2) - - if (help_cmd && help_cmd->command) - { - const char *help = help_cmd->usage; - int help_len = strlen (help); - int spaces = max_cmd_len - strlen (help_cmd->command); - int show_this_line = 0; - int line_one = 1; - int c; - - printf ("%s", help_cmd->command); - - if (help_len == 0) - { - printf (" - No help associated.\n"); - return; - } - - while (help_len) - { - printf ("%*c", spaces, ' '); - - if (line_one) - printf (" - "); - - spaces = max_cmd_len + 2; - line_one = 0; - - /* - * See if greater then the line length if so, work back - * from the end for a space, tab or lf or cr. - */ - - if (help_len > MAX_HELP_LINE_LENGTH) - { - for (show_this_line = MAX_HELP_LINE_LENGTH - 1; - show_this_line; - show_this_line--) - if ((help[show_this_line] == ' ') || - (help[show_this_line] == '\n') || - (help[show_this_line] == '\r')) - break; - - /* - * If show_this_line is 0, it is a very long word !! - */ - - if (show_this_line == 0) - show_this_line = MAX_HELP_LINE_LENGTH - 1; - } - else - show_this_line = help_len; - - for (c = 0; c < show_this_line; c++) - if ((help[c] == '\r') || (help[c] == '\n')) - show_this_line = c; - else - putchar (help[c]); - - printf ("\n"); - - help += show_this_line; - help_len -= show_this_line; - - /* - * Move past the line feeds or what ever else is being skipped. - */ - - while (help_len) - { - if ((*help != '\r') && (*help != '\n')) - break; - - if (*help != ' ') - { - help++; - help_len--; - break; - } - help++; - help_len--; - } - } - } -} - -void -rtems_monitor_command_usage( - rtems_monitor_command_entry_t *table, - char *command_string -) -{ - rtems_monitor_command_entry_t *command = table; - int max_cmd_len = 0; - - /* if first entry in table is a usage, then print it out */ - - if (command_string && (*command_string != '\0')) - { - char *argv[2]; - - argv[0] = command_string; - argv[1] = 0; - - command = rtems_monitor_command_lookup (table, 1, argv); - - if (command) - rtems_monitor_show_help (command, strlen (command_string)); - else - printf ("Unrecognised command; try just 'help'\n"); - return; - } - - /* - * Find the largest command size. - */ - - while (command) - { - int len = strlen (command->command); - - if (len > max_cmd_len) - max_cmd_len = len; - - command = command->next; - } - - max_cmd_len++; - - command = table; - - /* - * Now some nice formatting for the help. - */ - - while (command) - { - rtems_monitor_show_help (command, max_cmd_len); - command = command->next; - } -} - - -void -rtems_monitor_help_cmd( - int argc, - char **argv, - unsigned32 command_arg, - boolean verbose -) -{ - int arg; - rtems_monitor_command_entry_t *command; - - command = (rtems_monitor_command_entry_t *) command_arg; - - if (argc == 1) - rtems_monitor_command_usage(command, 0); - else - { - for (arg = 1; argv[arg]; arg++) - rtems_monitor_command_usage(command, argv[arg]); - } -} |