diff --git a/lib/sl/sl.c b/lib/sl/sl.c index a6e025145..8f1e9ec7b 100644 --- a/lib/sl/sl.c +++ b/lib/sl/sl.c @@ -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; }