X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline.c;h=e6662bd339105c2d72cd142a446fa3a21832027e;hb=2e949478bc20b52358b9093a8d3ae88d186fb8fc;hp=6b2421c6e9a41df83cca075672b6661c0c48aeb9;hpb=767419072cd4dfb52541b7fe2715bbb01bc8d561;p=libcmdline.git diff --git a/src/lib/cmdline.c b/src/lib/cmdline.c index 6b2421c..e6662bd 100644 --- a/src/lib/cmdline.c +++ b/src/lib/cmdline.c @@ -66,20 +66,14 @@ #include #include #include - +#include #include #include "cmdline_parse.h" #include "cmdline_rdline.h" #include "cmdline.h" - -#define PROMPT_SUFFIX "> " - - -/**********************/ - -void +static void cmdline_valid_buffer(struct rdline *rdl, const char *buf, __attribute__((unused)) unsigned int size) { @@ -94,7 +88,7 @@ cmdline_valid_buffer(struct rdline *rdl, const char *buf, cmdline_printf(cl, "Bad arguments\n"); } -int +static int cmdline_complete_buffer(struct rdline *rdl, const char *buf, char *dstbuf, unsigned int dstsize, int *state) @@ -103,13 +97,16 @@ cmdline_complete_buffer(struct rdline *rdl, const char *buf, return cmdline_complete(cl, buf, state, dstbuf, dstsize); } -void +int cmdline_write_char(struct rdline *rdl, char c) { + int ret = -1; struct cmdline *cl = rdl->opaque; - if (cl->s_out >= 0) { - write(cl->s_out, &c, 1); - } + + if (cl->s_out >= 0) + ret = write(cl->s_out, &c, 1); + + return ret; } @@ -155,14 +152,33 @@ void cmdline_printf(const struct cmdline *cl, const char *fmt, ...) { va_list ap; - char buffer[BUFSIZ]; +#ifdef _GNU_SOURCE + if (cl->s_out < 0) + return; va_start(ap, fmt); - vsnprintf(buffer, 512, fmt, ap); + vdprintf(cl->s_out, fmt, ap); va_end(ap); - if (cl->s_out >= 0) { - write(cl->s_out, buffer, strlen(buffer)); - } +#else + int ret; + char *buf; + + if (cl->s_out < 0) + return; + + buf = malloc(BUFSIZ); + if (buf == NULL) + return; + va_start(ap, fmt); + ret = vsnprintf(buf, BUFSIZ, fmt, ap); + va_end(ap); + if (ret < 0) + return; + if (ret >= BUFSIZ) + ret = BUFSIZ - 1; + write(cl->s_out, buf, ret); + free(buf); +#endif } int @@ -172,11 +188,10 @@ cmdline_in(struct cmdline *cl, const char *buf, int size) int ret = 0; int i, same; - /* XXX use defines instead of hardcoded values */ for (i=0; irdl, buf[i]); - if (ret == 1) { + if (ret == RDLINE_RES_VALIDATED) { buffer = rdline_get_buffer(&cl->rdl); history = rdline_get_history_item(&cl->rdl, 0); if (history) { @@ -189,8 +204,31 @@ cmdline_in(struct cmdline *cl, const char *buf, int size) rdline_add_history(&cl->rdl, buffer); rdline_newline(&cl->rdl, cl->prompt); } - else if (ret == -2) + else if (ret == RDLINE_RES_EOF) + return -1; + else if (ret == RDLINE_RES_EXITED) return -1; } return i; } + +void +cmdline_quit(struct cmdline *cl) +{ + rdline_quit(&cl->rdl); +} + +void +cmdline_interact(struct cmdline *cl) +{ + char c; + + c = -1; + while (1) { + if (read(cl->s_in, &c, 1) < 0) + break; + if (cmdline_in(cl, &c, 1) < 0) + break; + } + cmdline_free(cl); +}