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 *
sl_match (SL_cmd *cmds, char *cmd, int exactp)
{
SL_cmd *c, *current = NULL, *partial_cmd;
int partial_match = 0;
SL_cmd *c, *current = NULL, *partial_cmd;
int partial_match = 0;
for (c = cmds; c->name; ++c) {
if (c->func)
current = c;
if (strcmp (cmd, c->name) == 0)
return current;
else if (strncmp (cmd, c->name, strlen(cmd)) == 0 &&
partial_cmd != current) {
++partial_match;
partial_cmd = current;
for (c = cmds; c->name; ++c) {
if (c->func)
current = c;
if (strcmp (cmd, c->name) == 0)
return current;
else if (strncmp (cmd, c->name, strlen(cmd)) == 0 &&
partial_cmd != current) {
++partial_match;
partial_cmd = current;
}
}
}
if (partial_match == 1 && !exactp)
return partial_cmd;
else
return NULL;
if (partial_match == 1 && !exactp)
return partial_cmd;
else
return NULL;
}
void
sl_help (SL_cmd *cmds, int argc, char **argv)
{
SL_cmd *c;
SL_cmd *c;
if (argc == 1) {
for (c = cmds; c->name; ++c)
printf ("%s\t%s\n", c->name, c->usage ? c->usage : "");
} else {
c = sl_match (cmds, argv[1], 0);
if (c == NULL)
printf ("No such command: %s. Try \"help\" for a list of all commands\n",
argv[1]);
else {
printf ("%s\t%s", c->name, c->usage);
if((++c)->name && c->func == NULL) {
printf ("\nSynonyms:");
while (c->name && c->func == NULL)
printf ("\t%s", (c++)->name);
}
printf ("\n");
if (argc == 1) {
for (c = cmds; c->name; ++c)
printf ("%s\t%s\n", c->name, c->usage ? c->usage : "");
} else {
c = sl_match (cmds, argv[1], 0);
if (c == NULL)
printf ("No such command: %s. Try \"help\" for a list of all commands\n",
argv[1]);
else {
printf ("%s\t%s", c->name, c->usage);
if((++c)->name && c->func == NULL) {
printf ("\nSynonyms:");
while (c->name && c->func == NULL)
printf ("\t%s", (c++)->name);
}
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
sl_loop (SL_cmd *cmds, char *prompt)
{
char buf[BUFSIZ];
int count;
char *ptr[17];
int i;
char *buf;
int count;
char *ptr[17];
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 (;;) {
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';
char *p;
char **a = ptr;
SL_cmd *c;
buf = readline(prompt);
if(buf == NULL)
break;
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\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);
if (c)
(*c->func)(count, ptr);
else
printf ("Unrecognized command: %s\n", ptr[0]);
}
return 0;
return 0;
}