diff options
Diffstat (limited to 'lib/libedit/vi.c')
-rw-r--r-- | lib/libedit/vi.c | 972 |
1 files changed, 461 insertions, 511 deletions
diff --git a/lib/libedit/vi.c b/lib/libedit/vi.c index db213c9859a5..c58c5b10cc6e 100644 --- a/lib/libedit/vi.c +++ b/lib/libedit/vi.c @@ -32,6 +32,8 @@ * 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. + * + * $NetBSD: vi.c,v 1.7 1999/07/02 15:21:28 simonb Exp $ */ #include <sys/cdefs.h> @@ -39,6 +41,8 @@ __FBSDID("$FreeBSD$"); #if !defined(lint) && !defined(SCCSID) static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93"; #endif /* not lint && not SCCSID */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); /* * vi.c: Vi mode commands. @@ -46,58 +50,56 @@ static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93"; #include "sys.h" #include "el.h" -private el_action_t cv_action __P((EditLine *, int)); +private el_action_t cv_action(EditLine *, int); +private el_action_t cv_paste(EditLine *, int); /* cv_action(): * Handle vi actions. */ private el_action_t -cv_action(el, c) - EditLine *el; - int c; +cv_action(EditLine *el, int c) { - register char *cp, *kp; - - if (el->el_chared.c_vcmd.action & DELETE) { - el->el_chared.c_vcmd.action = NOP; - el->el_chared.c_vcmd.pos = 0; + char *cp, *kp; - el->el_chared.c_undo.isize = 0; - el->el_chared.c_undo.dsize = 0; - kp = el->el_chared.c_undo.buf; - for (cp = el->el_line.buffer; cp < el->el_line.lastchar; cp++) { - *kp++ = *cp; - el->el_chared.c_undo.dsize++; + if (el->el_chared.c_vcmd.action & DELETE) { + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_vcmd.pos = 0; + + el->el_chared.c_undo.isize = 0; + el->el_chared.c_undo.dsize = 0; + kp = el->el_chared.c_undo.buf; + for (cp = el->el_line.buffer; cp < el->el_line.lastchar; cp++) { + *kp++ = *cp; + el->el_chared.c_undo.dsize++; + } + + el->el_chared.c_undo.action = INSERT; + el->el_chared.c_undo.ptr = el->el_line.buffer; + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + if (c & INSERT) + el->el_map.current = el->el_map.key; + + return (CC_REFRESH); } - - el->el_chared.c_undo.action = INSERT; - el->el_chared.c_undo.ptr = el->el_line.buffer; - el->el_line.lastchar = el->el_line.buffer; - el->el_line.cursor = el->el_line.buffer; - if (c & INSERT) - el->el_map.current = el->el_map.key; - - return CC_REFRESH; - } - - el->el_chared.c_vcmd.pos = el->el_line.cursor; - el->el_chared.c_vcmd.action = c; - return CC_ARGHACK; - -#ifdef notdef - /* - * I don't think that this is needed. But we keep it for now - */ - else if (el_chared.c_vcmd.action == NOP) { el->el_chared.c_vcmd.pos = el->el_line.cursor; el->el_chared.c_vcmd.action = c; - return CC_ARGHACK; - } - else { - el->el_chared.c_vcmd.action = 0; - el->el_chared.c_vcmd.pos = 0; - return CC_ERROR; - } + return (CC_ARGHACK); + +#ifdef notdef + /* + * I don't think that this is needed. But we keep it for now + */ + else + if (el_chared.c_vcmd.action == NOP) { + el->el_chared.c_vcmd.pos = el->el_line.cursor; + el->el_chared.c_vcmd.action = c; + return (CC_ARGHACK); + } else { + el->el_chared.c_vcmd.action = 0; + el->el_chared.c_vcmd.pos = 0; + return (CC_ERROR); + } #endif } @@ -105,29 +107,28 @@ cv_action(el, c) /* cv_paste(): * Paste previous deletion before or after the cursor */ -protected el_action_t -cv_paste(el, c) - EditLine *el; - int c; +private el_action_t +cv_paste(EditLine *el, int c) { - char *ptr; - c_undo_t *un = &el->el_chared.c_undo; + char *ptr; + c_undo_t *un = &el->el_chared.c_undo; + #ifdef DEBUG_PASTE - (void) fprintf(el->el_errfile, "Paste: %x \"%s\" +%d -%d\n", - un->action, un->buf, un->isize, un->dsize); + (void) fprintf(el->el_errfile, "Paste: %x \"%s\" +%d -%d\n", + un->action, un->buf, un->isize, un->dsize); #endif - if (un->isize == 0) - return CC_ERROR; + if (un->isize == 0) + return (CC_ERROR); - if (!c && el->el_line.cursor < el->el_line.lastchar) - el->el_line.cursor++; - ptr = el->el_line.cursor; + if (!c && el->el_line.cursor < el->el_line.lastchar) + el->el_line.cursor++; + ptr = el->el_line.cursor; - c_insert(el, un->isize); - if (el->el_line.cursor + un->isize > el->el_line.lastchar) - return CC_ERROR; - (void) memcpy(ptr, un->buf, un->isize); - return CC_REFRESH; + c_insert(el, (int) un->isize); + if (el->el_line.cursor + un->isize > el->el_line.lastchar) + return (CC_ERROR); + (void) memcpy(ptr, un->buf, un->isize); + return (CC_REFRESH); } @@ -137,11 +138,10 @@ cv_paste(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_paste_next(el, c) - EditLine *el; - int c; +vi_paste_next(EditLine *el, int c) { - return cv_paste(el, 0); + + return (cv_paste(el, 0)); } @@ -151,11 +151,10 @@ vi_paste_next(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_paste_prev(el, c) - EditLine *el; - int c; +vi_paste_prev(EditLine *el, int c) { - return cv_paste(el, 1); + + return (cv_paste(el, 1)); } @@ -165,24 +164,22 @@ vi_paste_prev(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_prev_space_word(el, c) - EditLine *el; - int c; +vi_prev_space_word(EditLine *el, int c) { - if (el->el_line.cursor == el->el_line.buffer) - return CC_ERROR; - el->el_line.cursor = cv_prev_word(el, el->el_line.cursor, - el->el_line.buffer, - el->el_state.argument, - c___isword); + if (el->el_line.cursor == el->el_line.buffer) + return (CC_ERROR); - if (el->el_chared.c_vcmd.action & DELETE) { - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cv_prev_word(el, el->el_line.cursor, + el->el_line.buffer, + el->el_state.argument, + c___isword); - return CC_CURSOR; + if (el->el_chared.c_vcmd.action & DELETE) { + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } @@ -192,24 +189,22 @@ vi_prev_space_word(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_prev_word(el, c) - EditLine *el; - int c; +vi_prev_word(EditLine *el, int c) { - if (el->el_line.cursor == el->el_line.buffer) - return CC_ERROR; - el->el_line.cursor = cv_prev_word(el, el->el_line.cursor, - el->el_line.buffer, - el->el_state.argument, - cv__isword); + if (el->el_line.cursor == el->el_line.buffer) + return (CC_ERROR); - if (el->el_chared.c_vcmd.action & DELETE) { - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cv_prev_word(el, el->el_line.cursor, + el->el_line.buffer, + el->el_state.argument, + cv__isword); - return CC_CURSOR; + if (el->el_chared.c_vcmd.action & DELETE) { + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } @@ -219,77 +214,72 @@ vi_prev_word(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_next_space_word(el, c) - EditLine *el; - int c; +vi_next_space_word(EditLine *el, int c) { - if (el->el_line.cursor == el->el_line.lastchar) - return CC_ERROR; - el->el_line.cursor = cv_next_word(el, el->el_line.cursor, - el->el_line.lastchar, - el->el_state.argument, - c___isword); + if (el->el_line.cursor == el->el_line.lastchar) + return (CC_ERROR); - if (el->el_map.type == MAP_VI) - if (el->el_chared.c_vcmd.action & DELETE) { - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cv_next_word(el, el->el_line.cursor, + el->el_line.lastchar, + el->el_state.argument, + c___isword); - return CC_CURSOR; + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action & DELETE) { + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } + /* vi_next_word(): * Vi move to the next word * [w] */ protected el_action_t /*ARGSUSED*/ -vi_next_word(el, c) - EditLine *el; - int c; +vi_next_word(EditLine *el, int c) { - if (el->el_line.cursor == el->el_line.lastchar) - return CC_ERROR; - el->el_line.cursor = cv_next_word(el, el->el_line.cursor, - el->el_line.lastchar, - el->el_state.argument, - cv__isword); + if (el->el_line.cursor == el->el_line.lastchar) + return (CC_ERROR); - if (el->el_map.type == MAP_VI) - if (el->el_chared.c_vcmd.action & DELETE) { - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cv_next_word(el, el->el_line.cursor, + el->el_line.lastchar, + el->el_state.argument, + cv__isword); - return CC_CURSOR; + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action & DELETE) { + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } - /* vi_change_case(): * Vi change case of character under the cursor and advance one character * [~] */ protected el_action_t -vi_change_case(el, c) - EditLine *el; - int c; +vi_change_case(EditLine *el, int c) { - if (el->el_line.cursor < el->el_line.lastchar) { - c = (unsigned char)*el->el_line.cursor; - if (isupper(c)) - *el->el_line.cursor++ = tolower(c); - else if (islower(c)) - *el->el_line.cursor++ = toupper(c); - else - el->el_line.cursor++; - re_fastaddc(el); - return CC_NORM; - } - return CC_ERROR; + + if (el->el_line.cursor < el->el_line.lastchar) { + c = (unsigned char)*el->el_line.cursor; + if (isupper(c)) + *el->el_line.cursor++ = tolower(c); + else if (islower(c)) + *el->el_line.cursor++ = toupper(c); + else + el->el_line.cursor++; + re_fastaddc(el); + return (CC_NORM); + } + return (CC_ERROR); } @@ -299,15 +289,14 @@ vi_change_case(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_change_meta(el, c) - EditLine *el; - int c; +vi_change_meta(EditLine *el, int c) { - /* - * Delete with insert == change: first we delete and then we leave in - * insert mode. - */ - return cv_action(el, DELETE|INSERT); + + /* + * Delete with insert == change: first we delete and then we leave in + * insert mode. + */ + return (cv_action(el, DELETE | INSERT)); } @@ -317,18 +306,17 @@ vi_change_meta(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_insert_at_bol(el, c) - EditLine *el; - int c; +vi_insert_at_bol(EditLine *el, int c) { - el->el_line.cursor = el->el_line.buffer; - el->el_chared.c_vcmd.ins = el->el_line.cursor; - el->el_chared.c_undo.ptr = el->el_line.cursor; - el->el_chared.c_undo.action = DELETE; + el->el_line.cursor = el->el_line.buffer; + el->el_chared.c_vcmd.ins = el->el_line.cursor; - el->el_map.current = el->el_map.key; - return CC_CURSOR; + el->el_chared.c_undo.ptr = el->el_line.cursor; + el->el_chared.c_undo.action = DELETE; + + el->el_map.current = el->el_map.key; + return (CC_CURSOR); } @@ -338,17 +326,16 @@ vi_insert_at_bol(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_replace_char(el, c) - EditLine *el; - int c; +vi_replace_char(EditLine *el, int c) { - el->el_map.current = el->el_map.key; - el->el_state.inputmode = MODE_REPLACE_1; - el->el_chared.c_undo.action = CHANGE; - el->el_chared.c_undo.ptr = el->el_line.cursor; - el->el_chared.c_undo.isize = 0; - el->el_chared.c_undo.dsize = 0; - return CC_ARGHACK; + + el->el_map.current = el->el_map.key; + el->el_state.inputmode = MODE_REPLACE_1; + el->el_chared.c_undo.action = CHANGE; + el->el_chared.c_undo.ptr = el->el_line.cursor; + el->el_chared.c_undo.isize = 0; + el->el_chared.c_undo.dsize = 0; + return (CC_ARGHACK); } @@ -358,17 +345,16 @@ vi_replace_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_replace_mode(el, c) - EditLine *el; - int c; +vi_replace_mode(EditLine *el, int c) { - el->el_map.current = el->el_map.key; - el->el_state.inputmode = MODE_REPLACE; - el->el_chared.c_undo.action = CHANGE; - el->el_chared.c_undo.ptr = el->el_line.cursor; - el->el_chared.c_undo.isize = 0; - el->el_chared.c_undo.dsize = 0; - return CC_ARGHACK; + + el->el_map.current = el->el_map.key; + el->el_state.inputmode = MODE_REPLACE; + el->el_chared.c_undo.action = CHANGE; + el->el_chared.c_undo.ptr = el->el_line.cursor; + el->el_chared.c_undo.isize = 0; + el->el_chared.c_undo.dsize = 0; + return (CC_ARGHACK); } @@ -378,13 +364,12 @@ vi_replace_mode(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_substitute_char(el, c) - EditLine *el; - int c; +vi_substitute_char(EditLine *el, int c) { - c_delafter(el, el->el_state.argument); - el->el_map.current = el->el_map.key; - return CC_REFRESH; + + c_delafter(el, el->el_state.argument); + el->el_map.current = el->el_map.key; + return (CC_REFRESH); } @@ -394,13 +379,12 @@ vi_substitute_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_substitute_line(el, c) - EditLine *el; - int c; +vi_substitute_line(EditLine *el, int c) { - (void) em_kill_line(el, 0); - el->el_map.current = el->el_map.key; - return CC_REFRESH; + + (void) em_kill_line(el, 0); + el->el_map.current = el->el_map.key; + return (CC_REFRESH); } @@ -410,13 +394,12 @@ vi_substitute_line(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_change_to_eol(el, c) - EditLine *el; - int c; +vi_change_to_eol(EditLine *el, int c) { - (void) ed_kill_line(el, 0); - el->el_map.current = el->el_map.key; - return CC_REFRESH; + + (void) ed_kill_line(el, 0); + el->el_map.current = el->el_map.key; + return (CC_REFRESH); } @@ -426,17 +409,16 @@ vi_change_to_eol(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_insert(el, c) - EditLine *el; - int c; +vi_insert(EditLine *el, int c) { - el->el_map.current = el->el_map.key; - el->el_chared.c_vcmd.ins = el->el_line.cursor; - el->el_chared.c_undo.ptr = el->el_line.cursor; - el->el_chared.c_undo.action = DELETE; + el->el_map.current = el->el_map.key; + + el->el_chared.c_vcmd.ins = el->el_line.cursor; + el->el_chared.c_undo.ptr = el->el_line.cursor; + el->el_chared.c_undo.action = DELETE; - return CC_NORM; + return (CC_NORM); } @@ -446,27 +428,24 @@ vi_insert(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_add(el, c) - EditLine *el; - int c; +vi_add(EditLine *el, int c) { - el_action_t ret; + el_action_t ret; - el->el_map.current = el->el_map.key; - if (el->el_line.cursor < el->el_line.lastchar) { - el->el_line.cursor++; - if (el->el_line.cursor > el->el_line.lastchar) - el->el_line.cursor = el->el_line.lastchar; - ret = CC_CURSOR; - } - else - ret = CC_NORM; + el->el_map.current = el->el_map.key; + if (el->el_line.cursor < el->el_line.lastchar) { + el->el_line.cursor++; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + ret = CC_CURSOR; + } else + ret = CC_NORM; - el->el_chared.c_vcmd.ins = el->el_line.cursor; - el->el_chared.c_undo.ptr = el->el_line.cursor; - el->el_chared.c_undo.action = DELETE; + el->el_chared.c_vcmd.ins = el->el_line.cursor; + el->el_chared.c_undo.ptr = el->el_line.cursor; + el->el_chared.c_undo.action = DELETE; - return ret; + return (ret); } @@ -476,18 +455,17 @@ vi_add(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_add_at_eol(el, c) - EditLine *el; - int c; +vi_add_at_eol(EditLine *el, int c) { - el->el_map.current = el->el_map.key; - el->el_line.cursor = el->el_line.lastchar; - /* Mark where insertion begins */ - el->el_chared.c_vcmd.ins = el->el_line.lastchar; - el->el_chared.c_undo.ptr = el->el_line.lastchar; - el->el_chared.c_undo.action = DELETE; - return CC_CURSOR; + el->el_map.current = el->el_map.key; + el->el_line.cursor = el->el_line.lastchar; + + /* Mark where insertion begins */ + el->el_chared.c_vcmd.ins = el->el_line.lastchar; + el->el_chared.c_undo.ptr = el->el_line.lastchar; + el->el_chared.c_undo.action = DELETE; + return (CC_CURSOR); } @@ -497,11 +475,10 @@ vi_add_at_eol(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_delete_meta(el, c) - EditLine *el; - int c; +vi_delete_meta(EditLine *el, int c) { - return cv_action(el, DELETE); + + return (cv_action(el, DELETE)); } @@ -511,23 +488,21 @@ vi_delete_meta(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_end_word(el, c) - EditLine *el; - int c; +vi_end_word(EditLine *el, int c) { - if (el->el_line.cursor == el->el_line.lastchar) - return CC_ERROR; - el->el_line.cursor = cv__endword(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument); + if (el->el_line.cursor == el->el_line.lastchar) + return (CC_ERROR); - if (el->el_chared.c_vcmd.action & DELETE) { - el->el_line.cursor++; - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cv__endword(el->el_line.cursor, + el->el_line.lastchar, el->el_state.argument); - return CC_CURSOR; + if (el->el_chared.c_vcmd.action & DELETE) { + el->el_line.cursor++; + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } @@ -537,23 +512,21 @@ vi_end_word(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_to_end_word(el, c) - EditLine *el; - int c; +vi_to_end_word(EditLine *el, int c) { - if (el->el_line.cursor == el->el_line.lastchar) - return CC_ERROR; - el->el_line.cursor = cv__endword(el->el_line.cursor, el->el_line.lastchar, - el->el_state.argument); + if (el->el_line.cursor == el->el_line.lastchar) + return (CC_ERROR); - if (el->el_chared.c_vcmd.action & DELETE) { - el->el_line.cursor++; - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cv__endword(el->el_line.cursor, + el->el_line.lastchar, el->el_state.argument); - return CC_CURSOR; + if (el->el_chared.c_vcmd.action & DELETE) { + el->el_line.cursor++; + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); } @@ -563,107 +536,104 @@ vi_to_end_word(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_undo(el, c) - EditLine *el; - int c; +vi_undo(EditLine *el, int c) { - char *cp, *kp; - char temp; - int i, size; - c_undo_t *un = &el->el_chared.c_undo; + char *cp, *kp; + char temp; + int i, size; + c_undo_t *un = &el->el_chared.c_undo; #ifdef DEBUG_UNDO - (void) fprintf(el->el_errfile, "Undo: %x \"%s\" +%d -%d\n", - un->action, un->buf, un->isize, un->dsize); + (void) fprintf(el->el_errfile, "Undo: %x \"%s\" +%d -%d\n", + un->action, un->buf, un->isize, un->dsize); #endif - switch (un->action) { - case DELETE: - if (un->dsize == 0) - return CC_NORM; - - (void) memcpy(un->buf, un->ptr, un->dsize); - for (cp = un->ptr; cp <= el->el_line.lastchar; cp++) - *cp = cp[un->dsize]; - - el->el_line.lastchar -= un->dsize; - el->el_line.cursor = un->ptr; - - un->action = INSERT; - un->isize = un->dsize; - un->dsize = 0; - break; - - case DELETE|INSERT: - size = un->isize - un->dsize; - if (size > 0) - i = un->dsize; - else - i = un->isize; - cp = un->ptr; - kp = un->buf; - while (i-- > 0) { - temp = *kp; - *kp++ = *cp; - *cp++ = temp; - } - if (size > 0) { - el->el_line.cursor = cp; - c_insert(el, size); - while (size-- > 0 && cp < el->el_line.lastchar) { - temp = *kp; - *kp++ = *cp; - *cp++ = temp; - } + switch (un->action) { + case DELETE: + if (un->dsize == 0) + return (CC_NORM); + + (void) memcpy(un->buf, un->ptr, un->dsize); + for (cp = un->ptr; cp <= el->el_line.lastchar; cp++) + *cp = cp[un->dsize]; + + el->el_line.lastchar -= un->dsize; + el->el_line.cursor = un->ptr; + + un->action = INSERT; + un->isize = un->dsize; + un->dsize = 0; + break; + + case DELETE | INSERT: + size = un->isize - un->dsize; + if (size > 0) + i = un->dsize; + else + i = un->isize; + cp = un->ptr; + kp = un->buf; + while (i-- > 0) { + temp = *kp; + *kp++ = *cp; + *cp++ = temp; + } + if (size > 0) { + el->el_line.cursor = cp; + c_insert(el, size); + while (size-- > 0 && cp < el->el_line.lastchar) { + temp = *kp; + *kp++ = *cp; + *cp++ = temp; + } + } else if (size < 0) { + size = -size; + for (; cp <= el->el_line.lastchar; cp++) { + *kp++ = *cp; + *cp = cp[size]; + } + el->el_line.lastchar -= size; + } + el->el_line.cursor = un->ptr; + i = un->dsize; + un->dsize = un->isize; + un->isize = i; + break; + + case INSERT: + if (un->isize == 0) + return (CC_NORM); + + el->el_line.cursor = un->ptr; + c_insert(el, (int) un->isize); + (void) memcpy(un->ptr, un->buf, un->isize); + un->action = DELETE; + un->dsize = un->isize; + un->isize = 0; + break; + + case CHANGE: + if (un->isize == 0) + return (CC_NORM); + + el->el_line.cursor = un->ptr; + size = (int) (el->el_line.cursor - el->el_line.lastchar); + if (size < un->isize) + size = un->isize; + cp = un->ptr; + kp = un->buf; + for (i = 0; i < size; i++) { + temp = *kp; + *kp++ = *cp; + *cp++ = temp; + } + un->dsize = 0; + break; + + default: + return (CC_ERROR); } - else if (size < 0) { - size = -size; - for (; cp <= el->el_line.lastchar; cp++) { - *kp++ = *cp; - *cp = cp[size]; - } - el->el_line.lastchar -= size; - } - el->el_line.cursor = un->ptr; - i = un->dsize; - un->dsize = un->isize; - un->isize = i; - break; - - case INSERT: - if (un->isize == 0) - return CC_NORM; - - el->el_line.cursor = un->ptr; - c_insert(el, un->isize); - memcpy(un->ptr, un->buf, un->isize); - un->action = DELETE; - un->dsize = un->isize; - un->isize = 0; - break; - - case CHANGE: - if (un->isize == 0) - return CC_NORM; - - el->el_line.cursor = un->ptr; - size = (int) (el->el_line.cursor - el->el_line.lastchar); - if (size < un->isize) - size = un->isize; - cp = un->ptr; - kp = un->buf; - for(i = 0; i < size; i++) { - temp = *kp; - *kp++ = *cp; - *cp++ = temp; - } - un->dsize = 0; - break; - - default: - return CC_ERROR; - } - return CC_REFRESH; + return (CC_REFRESH); } @@ -673,12 +643,10 @@ vi_undo(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_undo_line(el, c) - EditLine *el; - int c; +vi_undo_line(EditLine *el, int c) { - return hist_get(el); + return hist_get(el); } @@ -688,59 +656,57 @@ vi_undo_line(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_command_mode(el, c) - EditLine *el; - int c; +vi_command_mode(EditLine *el, int c) { - int size; - /* [Esc] cancels pending action */ - el->el_chared.c_vcmd.ins = 0; - el->el_chared.c_vcmd.action = NOP; - el->el_chared.c_vcmd.pos = 0; + int size; - el->el_state.doingarg = 0; - size = el->el_chared.c_undo.ptr - el->el_line.cursor; - if (size < 0) - size = -size; - if (el->el_chared.c_undo.action == (INSERT|DELETE) || - el->el_chared.c_undo.action == DELETE) - el->el_chared.c_undo.dsize = size; - else - el->el_chared.c_undo.isize = size; + /* [Esc] cancels pending action */ + el->el_chared.c_vcmd.ins = 0; + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_vcmd.pos = 0; + + el->el_state.doingarg = 0; + size = el->el_chared.c_undo.ptr - el->el_line.cursor; + if (size < 0) + size = -size; + if (el->el_chared.c_undo.action == (INSERT | DELETE) || + el->el_chared.c_undo.action == DELETE) + el->el_chared.c_undo.dsize = size; + else + el->el_chared.c_undo.isize = size; - el->el_state.inputmode = MODE_INSERT; - el->el_map.current = el->el_map.alt; + el->el_state.inputmode = MODE_INSERT; + el->el_map.current = el->el_map.alt; #ifdef VI_MOVE - if (el->el_line.cursor > el->el_line.buffer) - el->el_line.cursor--; + if (el->el_line.cursor > el->el_line.buffer) + el->el_line.cursor--; #endif - return CC_CURSOR; + return (CC_CURSOR); } + /* vi_zero(): * Vi move to the beginning of line * [0] */ protected el_action_t -vi_zero(el, c) - EditLine *el; - int c; +vi_zero(EditLine *el, int c) { - if (el->el_state.doingarg) { - if (el->el_state.argument > 1000000) - return CC_ERROR; - el->el_state.argument = - (el->el_state.argument * 10) + (c - '0'); - return CC_ARGHACK; - } - else { - el->el_line.cursor = el->el_line.buffer; - if (el->el_chared.c_vcmd.action & DELETE) { - cv_delfini(el); - return CC_REFRESH; - } - return CC_CURSOR; - } + + if (el->el_state.doingarg) { + if (el->el_state.argument > 1000000) + return (CC_ERROR); + el->el_state.argument = + (el->el_state.argument * 10) + (c - '0'); + return (CC_ARGHACK); + } else { + el->el_line.cursor = el->el_line.buffer; + if (el->el_chared.c_vcmd.action & DELETE) { + cv_delfini(el); + return (CC_REFRESH); + } + return (CC_CURSOR); + } } @@ -750,22 +716,21 @@ vi_zero(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_delete_prev_char(el, c) - EditLine *el; - int c; +vi_delete_prev_char(EditLine *el, int c) { - if (el->el_chared.c_vcmd.ins == 0) - return CC_ERROR; - if (el->el_chared.c_vcmd.ins > - el->el_line.cursor - el->el_state.argument) - return CC_ERROR; + if (el->el_chared.c_vcmd.ins == 0) + return (CC_ERROR); - c_delbefore(el, el->el_state.argument); - el->el_line.cursor -= el->el_state.argument; + if (el->el_chared.c_vcmd.ins > + el->el_line.cursor - el->el_state.argument) + return (CC_ERROR); - return CC_REFRESH; -} /* end v_del_char_prev */ + c_delbefore(el, el->el_state.argument); + el->el_line.cursor -= el->el_state.argument; + + return (CC_REFRESH); +} /* vi_list_or_eof(): @@ -774,24 +739,22 @@ vi_delete_prev_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_list_or_eof(el, c) - EditLine *el; - int c; +vi_list_or_eof(EditLine *el, int c) { + #ifdef notyet - if (el->el_line.cursor == el->el_line.lastchar && - el->el_line.cursor == el->el_line.buffer) { + if (el->el_line.cursor == el->el_line.lastchar && + el->el_line.cursor == el->el_line.buffer) { #endif - term_overwrite(el, STReof, 4); /* then do a EOF */ - term__flush(); - return CC_EOF; + term_overwrite(el, STReof, 4); /* then do a EOF */ + term__flush(); + return (CC_EOF); #ifdef notyet - } - else { - re_goto_bottom(el); - *el->el_line.lastchar = '\0'; /* just in case */ - return CC_LIST_CHOICES; - } + } else { + re_goto_bottom(el); + *el->el_line.lastchar = '\0'; /* just in case */ + return (CC_LIST_CHOICES); + } #endif } @@ -802,20 +765,18 @@ vi_list_or_eof(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_kill_line_prev(el, c) - EditLine *el; - int c; +vi_kill_line_prev(EditLine *el, int c) { - char *kp, *cp; + char *kp, *cp; - cp = el->el_line.buffer; - kp = el->el_chared.c_kill.buf; - while (cp < el->el_line.cursor) - *kp++ = *cp++; /* copy it */ - el->el_chared.c_kill.last = kp; - c_delbefore(el, el->el_line.cursor - el->el_line.buffer); - el->el_line.cursor = el->el_line.buffer; /* zap! */ - return CC_REFRESH; + cp = el->el_line.buffer; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.cursor) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + c_delbefore(el, el->el_line.cursor - el->el_line.buffer); + el->el_line.cursor = el->el_line.buffer; /* zap! */ + return (CC_REFRESH); } @@ -825,11 +786,10 @@ vi_kill_line_prev(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_search_prev(el, c) - EditLine *el; - int c; +vi_search_prev(EditLine *el, int c) { - return cv_search(el, ED_SEARCH_PREV_HISTORY); + + return (cv_search(el, ED_SEARCH_PREV_HISTORY)); } @@ -839,11 +799,10 @@ vi_search_prev(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_search_next(el, c) - EditLine *el; - int c; +vi_search_next(EditLine *el, int c) { - return cv_search(el, ED_SEARCH_NEXT_HISTORY); + + return (cv_search(el, ED_SEARCH_NEXT_HISTORY)); } @@ -853,14 +812,13 @@ vi_search_next(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_repeat_search_next(el, c) - EditLine *el; - int c; +vi_repeat_search_next(EditLine *el, int c) { - if (el->el_search.patlen == 0) - return CC_ERROR; - else - return cv_repeat_srch(el, el->el_search.patdir); + + if (el->el_search.patlen == 0) + return (CC_ERROR); + else + return (cv_repeat_srch(el, el->el_search.patdir)); } @@ -870,16 +828,15 @@ vi_repeat_search_next(el, c) */ /*ARGSUSED*/ protected el_action_t -vi_repeat_search_prev(el, c) - EditLine *el; - int c; +vi_repeat_search_prev(EditLine *el, int c) { - if (el->el_search.patlen == 0) - return CC_ERROR; - else - return cv_repeat_srch(el, - el->el_search.patdir == ED_SEARCH_PREV_HISTORY ? - ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY); + + if (el->el_search.patlen == 0) + return (CC_ERROR); + else + return (cv_repeat_srch(el, + el->el_search.patdir == ED_SEARCH_PREV_HISTORY ? + ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY)); } @@ -889,19 +846,17 @@ vi_repeat_search_prev(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_next_char(el, c) - EditLine *el; - int c; +vi_next_char(EditLine *el, int c) { - char ch; + char ch; - if (el_getc(el, &ch) != 1) - return ed_end_of_file(el, 0); + if (el_getc(el, &ch) != 1) + return (ed_end_of_file(el, 0)); - el->el_search.chadir = CHAR_FWD; - el->el_search.chacha = ch; + el->el_search.chadir = CHAR_FWD; + el->el_search.chacha = ch; - return cv_csearch_fwd(el, ch, el->el_state.argument, 0); + return (cv_csearch_fwd(el, ch, el->el_state.argument, 0)); } @@ -912,19 +867,17 @@ vi_next_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_prev_char(el, c) - EditLine *el; - int c; +vi_prev_char(EditLine *el, int c) { - char ch; + char ch; - if (el_getc(el, &ch) != 1) - return ed_end_of_file(el, 0); + if (el_getc(el, &ch) != 1) + return (ed_end_of_file(el, 0)); - el->el_search.chadir = CHAR_BACK; - el->el_search.chacha = ch; + el->el_search.chadir = CHAR_BACK; + el->el_search.chacha = ch; - return cv_csearch_back(el, ch, el->el_state.argument, 0); + return (cv_csearch_back(el, ch, el->el_state.argument, 0)); } @@ -934,16 +887,14 @@ vi_prev_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_to_next_char(el, c) - EditLine *el; - int c; +vi_to_next_char(EditLine *el, int c) { - char ch; + char ch; - if (el_getc(el, &ch) != 1) - return ed_end_of_file(el, 0); + if (el_getc(el, &ch) != 1) + return (ed_end_of_file(el, 0)); - return cv_csearch_fwd(el, ch, el->el_state.argument, 1); + return (cv_csearch_fwd(el, ch, el->el_state.argument, 1)); } @@ -954,15 +905,14 @@ vi_to_next_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_to_prev_char(el, c) - EditLine *el; - int c; +vi_to_prev_char(EditLine *el, int c) { - char ch; - if (el_getc(el, &ch) != 1) - return ed_end_of_file(el, 0); + char ch; + + if (el_getc(el, &ch) != 1) + return (ed_end_of_file(el, 0)); - return cv_csearch_back(el, ch, el->el_state.argument, 1); + return (cv_csearch_back(el, ch, el->el_state.argument, 1)); } @@ -972,16 +922,17 @@ vi_to_prev_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_repeat_next_char(el, c) - EditLine *el; - int c; +vi_repeat_next_char(EditLine *el, int c) { - if (el->el_search.chacha == 0) - return CC_ERROR; - return el->el_search.chadir == CHAR_FWD ? - cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) : - cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0); + if (el->el_search.chacha == 0) + return (CC_ERROR); + + return (el->el_search.chadir == CHAR_FWD + ? cv_csearch_fwd(el, el->el_search.chacha, + el->el_state.argument, 0) + : cv_csearch_back(el, el->el_search.chacha, + el->el_state.argument, 0)); } @@ -991,14 +942,13 @@ vi_repeat_next_char(el, c) */ protected el_action_t /*ARGSUSED*/ -vi_repeat_prev_char(el, c) - EditLine *el; - int c; +vi_repeat_prev_char(EditLine *el, int c) { - if (el->el_search.chacha == 0) - return CC_ERROR; - return el->el_search.chadir == CHAR_BACK ? - cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) : - cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0); + if (el->el_search.chacha == 0) + return (CC_ERROR); + + return el->el_search.chadir == CHAR_BACK ? + cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) : + cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0); } |