X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_rdline.c;h=91217bea19aa5b5e6ae1be3b72ebca04f0ad2610;hb=12df0462d324d6aaced9491955628c46b9ea853c;hp=d439be74574dc48861eb5ebfd5641eb9426e6115;hpb=369246d596ca24a9193b730c5aba2ec8837fb134;p=libcmdline.git diff --git a/src/lib/cmdline_rdline.c b/src/lib/cmdline_rdline.c index d439be7..91217be 100644 --- a/src/lib/cmdline_rdline.c +++ b/src/lib/cmdline_rdline.c @@ -1,3 +1,37 @@ +/*- + * Copyright (c) <2010>, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - 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. + * + * - Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE + * COPYRIGHT OWNER OR CONTRIBUTORS 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. + */ + /* * Copyright (c) 2009, Olivier MATZ * All rights reserved. @@ -57,7 +91,8 @@ isblank2(char c) return 0; } -void rdline_init(struct rdline *rdl, +void +rdline_init(struct rdline *rdl, rdline_write_char_t *write_char, rdline_validate_t *validate, rdline_complete_t *complete) @@ -100,6 +135,12 @@ rdline_stop(struct rdline *rdl) rdl->status = RDLINE_INIT; } +void +rdline_quit(struct rdline *rdl) +{ + rdl->status = RDLINE_EXITED; +} + void rdline_restart(struct rdline *rdl) { @@ -123,22 +164,25 @@ rdline_get_buffer(struct rdline *rdl) } static void -display_right_buffer(struct rdline *rdl) +display_right_buffer(struct rdline *rdl, int force) { unsigned int i; char tmp; + if (!force && CIRBUF_IS_EMPTY(&rdl->right)) + return; + rdline_puts(rdl, vt100_clear_right); - if (!CIRBUF_IS_EMPTY(&rdl->right)) { - CIRBUF_FOREACH(&rdl->right, i, tmp) { - rdl->write_char(rdl, tmp); - } + CIRBUF_FOREACH(&rdl->right, i, tmp) { + rdl->write_char(rdl, tmp); + } + if (!CIRBUF_IS_EMPTY(&rdl->right)) rdline_miniprintf(rdl, vt100_multi_left, CIRBUF_GET_LEN(&rdl->right)); - } } -void rdline_redisplay(struct rdline *rdl) +void +rdline_redisplay(struct rdline *rdl) { unsigned int i; char tmp; @@ -149,7 +193,7 @@ void rdline_redisplay(struct rdline *rdl) CIRBUF_FOREACH(&rdl->left, i, tmp) { rdl->write_char(rdl, tmp); } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } int @@ -162,12 +206,14 @@ rdline_char_in(struct rdline *rdl, char c) char *buf; #endif + if (rdl->status == RDLINE_EXITED) + return RDLINE_RES_EXITED; if (rdl->status != RDLINE_RUNNING) - return -1; + return RDLINE_RES_NOT_RUNNING; cmd = vt100_parser(&rdl->vt100, c); if (cmd == -2) - return 0; + return RDLINE_RES_SUCCESS; if (cmd >= 0) { switch (cmd) { @@ -228,11 +274,12 @@ rdline_char_in(struct rdline *rdl, char c) case CMDLINE_KEY_BKSPACE: if(!cirbuf_del_tail_safe(&rdl->left)) { rdline_puts(rdl, vt100_bs); - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } break; case CMDLINE_KEY_META_BKSPACE: + case CMDLINE_KEY_CTRL_W: while (! CIRBUF_IS_EMPTY(&rdl->left) && isblank2(cirbuf_get_tail(&rdl->left))) { rdline_puts(rdl, vt100_bs); cirbuf_del_tail(&rdl->left); @@ -241,7 +288,7 @@ rdline_char_in(struct rdline *rdl, char c) rdline_puts(rdl, vt100_bs); cirbuf_del_tail(&rdl->left); } - display_right_buffer(rdl); + display_right_buffer(rdl, 1); break; case CMDLINE_KEY_SUPPR: @@ -249,10 +296,10 @@ rdline_char_in(struct rdline *rdl, char c) if (cmd == CMDLINE_KEY_CTRL_D && CIRBUF_IS_EMPTY(&rdl->left) && CIRBUF_IS_EMPTY(&rdl->right)) { - return -2; + return RDLINE_RES_EOF; } if (!cirbuf_del_head_safe(&rdl->right)) { - display_right_buffer(rdl); + display_right_buffer(rdl, 1); } break; @@ -297,7 +344,7 @@ rdline_char_in(struct rdline *rdl, char c) rdl->write_char(rdl, rdl->kill_buf[i]); i++; } - display_right_buffer(rdl); + display_right_buffer(rdl, 0); break; #endif /* !NO_RDLINE_KILL_BUF */ @@ -331,12 +378,12 @@ rdline_char_in(struct rdline *rdl, char c) &complete_state); /* no completion or error */ if (ret <= 0) { - return 2; + return RDLINE_RES_COMPLETE; } tmp_size = strlen(tmp_buf); /* add chars */ - if (ret == 2) { + if (ret == RDLINE_RES_COMPLETE) { i=0; while(CIRBUF_GET_LEN(&rdl->right) + CIRBUF_GET_LEN(&rdl->left) < RDLINE_BUF_SIZE && @@ -345,8 +392,8 @@ rdline_char_in(struct rdline *rdl, char c) rdl->write_char(rdl, tmp_buf[i]); i++; } - display_right_buffer(rdl); - return 2; /* ?? */ + display_right_buffer(rdl, 1); + return RDLINE_RES_COMPLETE; /* ?? */ } /* choice */ @@ -363,7 +410,7 @@ rdline_char_in(struct rdline *rdl, char c) rdline_redisplay(rdl); } - return 2; + return RDLINE_RES_COMPLETE; case CMDLINE_KEY_RETURN: case CMDLINE_KEY_RETURN2: @@ -377,7 +424,10 @@ rdline_char_in(struct rdline *rdl, char c) if (rdl->validate) rdl->validate(rdl, rdl->left_buf, CIRBUF_GET_LEN(&rdl->left)+2); - return 1; + /* user may have stopped rdline */ + if (rdl->status == RDLINE_EXITED) + return RDLINE_RES_EXITED; + return RDLINE_RES_VALIDATED; #ifndef NO_RDLINE_HISTORY case CMDLINE_KEY_UP_ARR: @@ -423,23 +473,23 @@ rdline_char_in(struct rdline *rdl, char c) break; } - return 0; + return RDLINE_RES_SUCCESS; } - if (! isprint(c)) - return 0; + if (!isprint((int)c)) + return RDLINE_RES_SUCCESS; /* standard chars */ if (CIRBUF_GET_LEN(&rdl->left) + CIRBUF_GET_LEN(&rdl->right) >= RDLINE_BUF_SIZE) - return 0; + return RDLINE_RES_SUCCESS; if (cirbuf_add_tail_safe(&rdl->left, c)) - return 0; + return RDLINE_RES_SUCCESS; rdl->write_char(rdl, c); - display_right_buffer(rdl); + display_right_buffer(rdl, 0); - return 0; + return RDLINE_RES_SUCCESS; } @@ -587,9 +637,9 @@ rdline_miniprintf(struct rdline *rdl, const char * buf, unsigned int val) } /* val is never more than 255 */ while (div) { - c = val / div; + c = (char)(val / div); if (c || started) { - rdl->write_char(rdl, c+'0'); + rdl->write_char(rdl, (char)(c+'0')); started = 1; } val %= div;