diff options
Diffstat (limited to 'sbin/bim/command.c')
-rw-r--r-- | sbin/bim/command.c | 292 |
1 files changed, 0 insertions, 292 deletions
diff --git a/sbin/bim/command.c b/sbin/bim/command.c deleted file mode 100644 index 2fbb85442de..00000000000 --- a/sbin/bim/command.c +++ /dev/null @@ -1,292 +0,0 @@ -/* $OpenBSD: command.c,v 1.2 1996/06/23 14:29:57 deraadt Exp $ */ -/* $NetBSD: command.c,v 1.2 1995/03/18 12:28:15 cgd Exp $ */ - -/* - * Copyright (c) 1994 Philip A. Nelson. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Philip A. Nelson. - * 4. The name of Philip A. Nelson may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY PHILIP NELSON ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL PHILIP NELSON BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * command.c - The routines to implement the command processor. - * - * The user must add to "cmdtable.h" all commands that are available. - */ - -#include <stdio.h> -#include <ctype.h> -#include "command.h" -#include "cmdtable.h" - - -/* This allows the user to define the prompt in cmdtable.h */ -#ifndef PROMPT -#define PROMPT "Command (? for help): " -#endif - - -/* Other procedure prototypes. */ -PROTO (void prompt, (char *, int, char *)); -PROTO (int parse, (char *, char **)); -PROTO (CONST struct command *find_entry, (char *)); -PROTO (int StrCmp, (char *, char *)); - -/* A pointer to a function to be called after every command. - A NULL pointer says no function is to be executed. - The int parameter is the "done" flag.. TRUE => last command */ - -PROTO (void (*after_cmd), (int)) = NULL; - -/* This is the command processor loop. */ - -command_loop () -{ - char cmdline [LINELEN]; - char *args [MAXARGS]; - int numargs; - CONST struct command *cmd; - int done = FALSE; - - int ix; - - while (!done) { - prompt(cmdline, LINELEN, PROMPT); - numargs = parse (cmdline, args); - if (numargs == BLANK_LINE) continue; - cmd = find_entry (args[0]); - if (cmd != NULL) - { - done = (*(cmd->fn)) (numargs, args, cmd->syntax); - if (after_cmd != NULL) - (*(after_cmd)) (done); - } - else - printf ("Unknown command\n"); - } -} - -/* This is the command processor for a single command. */ -int -one_command (cmdline) - char *cmdline; -{ - char *args [MAXARGS]; - int numargs; - CONST struct command *cmd; - int done; - - numargs = parse (cmdline, args); - if (numargs == BLANK_LINE) return 0; - cmd = find_entry (args[0]); - if (cmd != NULL) - { - done = (*(cmd->fn)) (numargs, args, cmd->syntax); - if (after_cmd != NULL) - (*(after_cmd)) (done); - return done; - } - else - return 0; -} - -/* prompt procedure.... Write out the prompt and then read - a response. */ - -void prompt (cmdline, linelen, promptstr) - char *cmdline; - int linelen; - char *promptstr; -{ - int incount = 0; - int inchar; - - /* Give the prompt. */ - printf ("%s", promptstr); - fflush (stdout); - - /* Read chars until newline or EOF, toss chars that won't fit in the - array. */ - while (TRUE) - { - inchar = getchar(); - if (inchar == '\n' || inchar == EOF) break; - if (++incount < linelen) *cmdline++ = inchar; - } - *cmdline = 0; -} - - -/* parse the arguments on an input line. It returns an array of - pointers to substrings in the original string. It puts the string - terminator in the original line. */ - -int parse (cmdline, args) - char *cmdline; - char **args; -{ - int index; - int argcnt = BLANK_LINE; - - /* Initialize the args. */ - for (index = 0; index < MAXARGS; index++) - args[index] = NULL; - - /* Start looking for the commands */ - while (*cmdline != 0) - { - while (isspace(*cmdline)) cmdline++; /* skip blanks. */ - if (*cmdline != 0) - { - /* Start of new argument. */ - if (argcnt < MAXARGS) args[argcnt] = cmdline; - while (!isspace(*cmdline) && *cmdline != 0) cmdline++; - if (*cmdline != 0) *cmdline++ = 0; - argcnt++; - } - } - return (argcnt < MAXARGS ? argcnt : MAXARGS -1); -} - - -/* Search cmd_tbl for 1) a command matching what the user typed or 2) - * a unique command which is a superstring of what the user typed. - */ - -CONST struct command * -find_entry (name) -char *name; -{ - CONST struct command *item, *save; - int subcount = 0; - - for (item = cmd_table; item < cmd_table + CMDLEN; item++) - switch (StrCmp (name, item->name)) { - case CMP_MATCH: - return item; - case CMP_SUBSTR: - subcount++; - save = item; - break; - case CMP_NOMATCH: - break; - } - return (subcount == 1)? save : NULL; -} - - -/* Returns CMP_MATCH if strings are the same, CMP_SUBSTR if p1 is a - * proper substring of p2, and CMP_NOMATCH if neither. - */ -int -StrCmp (p1, p2) -register char *p1, *p2; -{ - while (*p1 == *p2 && *p1 != '\0') { - ++p1; - ++p2; - } - if (*p1 == '\0') - return (*p2 == '\0')? CMP_MATCH: CMP_SUBSTR; - return CMP_NOMATCH; -} - - -/* Other routines that may be helpful in evaluating arguments.... - */ - -int -Str2Int (str, num) - char *str; - int *num; -{ - if (!isdigit(*str) && *str != '-') return FALSE; - *num = atoi (str); - return TRUE; -} - - - -#ifndef NO_HELP -/* "?" command handler. Print help and list of commands. - */ -help_cmds () -{ - CONST struct command *q; - - printf("\nFor additional help, type HELP <command>. Commands are:\n"); - for (q = cmd_table; q < cmd_table + CMDLEN; ++q) - if ((q - cmd_table) % 5 == 4) - printf ("%s\n", q -> name); - else - printf ("%-15s", q -> name); - if ((q - cmd_table) % 5 != 0) - printf ("\n"); - printf ("\n"); -} - -/* The default help routine. This may be redefined by the user. */ -int help (num, args, syntax) - int num; - char **args; - char *syntax; -{ - CONST struct command *item; - int index; - int show_cmds = FALSE; - char dummy[2]; - - if (args[0][0] == '?') num = 1; /* Force "no args" for ?. */ - - /* Print help for each argument. */ - if (num > 1) - for (index = 1; index < num; index++) - { - item = find_entry (args[index]); - if (item != NULL) - { - printf ("\n"); - if (item -> syntax[0] != 0) - printf ("Syntax: %s\n", item -> syntax); - printf ("%s\n\n", item -> help); - if (index < num-1) prompt (dummy, 1, "cr to continue:"); - } - else - { - printf ("unknow command %s.\n", args[index]); - show_cmds = TRUE; - } - } - - if (show_cmds || num == 1) - help_cmds (); - - return FALSE; -} -#endif - - |