Use readline compatible i/o.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1044 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1996-11-18 20:36:51 +00:00
parent eafd78f78a
commit 0d06afde69

View File

@@ -46,92 +46,113 @@ RCSID("$Id$");
static SL_cmd * static SL_cmd *
sl_match (SL_cmd *cmds, char *cmd, int exactp) sl_match (SL_cmd *cmds, char *cmd, int exactp)
{ {
SL_cmd *c, *current = NULL, *partial_cmd; SL_cmd *c, *current = NULL, *partial_cmd;
int partial_match = 0; int partial_match = 0;
for (c = cmds; c->name; ++c) { for (c = cmds; c->name; ++c) {
if (c->func) if (c->func)
current = c; current = c;
if (strcmp (cmd, c->name) == 0) if (strcmp (cmd, c->name) == 0)
return current; return current;
else if (strncmp (cmd, c->name, strlen(cmd)) == 0 && else if (strncmp (cmd, c->name, strlen(cmd)) == 0 &&
partial_cmd != current) { partial_cmd != current) {
++partial_match; ++partial_match;
partial_cmd = current; partial_cmd = current;
}
} }
} if (partial_match == 1 && !exactp)
if (partial_match == 1 && !exactp) return partial_cmd;
return partial_cmd; else
else return NULL;
return NULL;
} }
void void
sl_help (SL_cmd *cmds, int argc, char **argv) sl_help (SL_cmd *cmds, int argc, char **argv)
{ {
SL_cmd *c; SL_cmd *c;
if (argc == 1) { if (argc == 1) {
for (c = cmds; c->name; ++c) for (c = cmds; c->name; ++c)
printf ("%s\t%s\n", c->name, c->usage ? c->usage : ""); printf ("%s\t%s\n", c->name, c->usage ? c->usage : "");
} else { } else {
c = sl_match (cmds, argv[1], 0); c = sl_match (cmds, argv[1], 0);
if (c == NULL) if (c == NULL)
printf ("No such command: %s. Try \"help\" for a list of all commands\n", printf ("No such command: %s. Try \"help\" for a list of all commands\n",
argv[1]); argv[1]);
else { else {
printf ("%s\t%s", c->name, c->usage); printf ("%s\t%s", c->name, c->usage);
if((++c)->name && c->func == NULL) { if((++c)->name && c->func == NULL) {
printf ("\nSynonyms:"); printf ("\nSynonyms:");
while (c->name && c->func == NULL) while (c->name && c->func == NULL)
printf ("\t%s", (c++)->name); printf ("\t%s", (c++)->name);
} }
printf ("\n"); printf ("\n");
}
} }
}
} }
#ifndef HAVE_READLINE
static char *
readline(char *prompt)
{
char buf[BUFSIZ];
printf ("%s", prompt);
fflush (stdout);
if(fgets(buf, sizeof(buf), stdin) == NULL)
return NULL;
return strdup(buf);
}
static void
add_history(char *p)
{
}
#endif
int int
sl_loop (SL_cmd *cmds, char *prompt) sl_loop (SL_cmd *cmds, char *prompt)
{ {
char buf[BUFSIZ]; char *buf;
int count; int count;
char *ptr[17]; char *ptr[17];
int i; int i;
for (;;) {
char *p;
char **a = ptr;
SL_cmd *c;
printf ("%s", prompt);
fflush (stdout);
if(fgets (buf, sizeof(buf), stdin) == NULL)
break;
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\0';
p = buf;
count = 0;
for (;;) { for (;;) {
while (*p == ' ' || *p == '\t') char *p;
p++; char **a = ptr;
if (*p == '\0') SL_cmd *c;
break;
*a++ = p; buf = readline(prompt);
++count; if(buf == NULL)
while (*p != '\0' && *p != ' ' && *p != '\t') break;
p++;
if (*p == '\0') if (buf[strlen(buf) - 1] == '\n')
break; buf[strlen(buf) - 1] = '\0';
*p++ = '\0'; p = buf;
count = 0;
add_history(buf);
for (;;) {
while (*p == ' ' || *p == '\t')
p++;
if (*p == '\0')
break;
*a++ = p;
++count;
while (*p != '\0' && *p != ' ' && *p != '\t')
p++;
if (*p == '\0')
break;
*p++ = '\0';
}
c = sl_match (cmds, ptr[0], 0);
if (c)
(*c->func)(count, ptr);
else
printf ("Unrecognized command: %s\n", ptr[0]);
free(buf);
} }
c = sl_match (cmds, ptr[0], 0); return 0;
if (c)
(*c->func)(count, ptr);
else
printf ("Unrecognized command: %s\n", ptr[0]);
}
return 0;
} }