Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 May 1998 16:12:42 -0400 (EDT)
From:      meuston@jmrodgers.com
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/6516: [Patch] Assorted errors in libedit
Message-ID:  <199805042012.QAA16093@gw.jmrodgers.com>

next in thread | raw e-mail | index | archive | help

>Number:         6516
>Category:       bin
>Synopsis:       [Patch] Assorted errors in libedit
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon May  4 13:20:01 PDT 1998
>Last-Modified:
>Originator:     Max Euston
>Organization:
>Release:        FreeBSD 2.2.5-STABLE i386
>Environment:

	-STABLE (also in -CURRENT)

>Description:
[tagged "Priority==medium" since this was one of the first complaints
 I had when I first installed FreeBSD and "first impressions count"]

Assorted problems with the history edit functions in libedit.  This
affects sh, ftp (and others?).

(All command keys assume the vi- mode of editing).

1) The 'r' command does not reposition the cursor when it is done.
   [ed_insert() needs to return CC_CURSOR since it automatically calls
   vi_command_mode() if MODE_REPLACE_1].

2) The [count] prefix to commands does not work.  [read_getcmd()
   looped while "cmd==0", but ED_ARGUMENT_DIGIT is the first
   (lexographically) command and is assigned a command code of 0.
   read_getcmd() needs to loop while ED_UNASSIGNED].
   [vi_replace_char() and vi_replace_mode() need to return
   CC_ARGHACK instead of CC_NORM since both commands require another
   argument (the character to substitute)].

3) The 'w' and 'b' commands use the emacs(?) definition of a word
   instead of the vi definition of a word.

4) The 'u' command does not work after the 'r' command.  [ed_insert()
   needs to set ...c_undo.action=CHANGE if MODE_REPLACE*].

5) There is no 'U' command (to undo *all* editing on the current line).

There are more bugs in libedit, but these are the (IMO) big ones I have
found (they are the ones that bothered me).

>How-To-Repeat:

(try to) use the vi- style commands above.

>Fix:

diff -u /usr/src/lib/libedit/chared.c ./chared.c
--- /usr/src/lib/libedit/chared.c	Fri Feb 20 17:18:28 1998
+++ ./chared.c	Thu Apr 30 12:47:28 1998
@@ -153,10 +153,25 @@
 
 
 /* cv__isword():
- *	Return if p is part of a word according to vi
+ *	Return type of word for p according to vi
  */
 protected int
 cv__isword(p)
+    int p;
+{
+    if (isspace((unsigned char) p))
+        return 0;
+    if ((unsigned char) p == '_' || isalnum((unsigned char) p))
+        return 1;
+    return 2;
+}
+
+
+/* c___isword():
+ *	Return if p is part of a space-delimited word (!isspace)
+ */
+protected int
+c___isword(p)
     int p;
 {
     return !isspace((unsigned char) p);


diff -u /usr/src/lib/libedit/chared.h ./chared.h
--- /usr/src/lib/libedit/chared.h	Tue May 30 01:42:55 1995
+++ ./chared.h	Tue Mar 31 13:03:46 1998
@@ -138,6 +138,7 @@
 protected void  cv_delfini	__P((EditLine *));
 protected char *cv__endword	__P((char *, char *, int));
 protected int   ce__isword	__P((int));
+protected int   c___isword	__P((int));
 protected void  cv_undo		__P((EditLine *, int, int, char *));
 protected char *cv_next_word	__P((EditLine*, char *, char *, int,
 				     int (*)(int)));


diff -u /usr/src/lib/libedit/common.c ./common.c
--- /usr/src/lib/libedit/common.c	Fri Feb 20 17:18:29 1998
+++ ./common.c	Fri May  1 15:30:43 1998
@@ -110,8 +110,11 @@
 	re_refresh(el);
     }
 
+    if (el->el_state.inputmode == MODE_REPLACE_1 || el->el_state.inputmode == MODE_REPLACE)
+	el->el_chared.c_undo.action=CHANGE;
+
     if (el->el_state.inputmode == MODE_REPLACE_1)
-	(void) vi_command_mode(el, 0);
+	return vi_command_mode(el, 0);
 
     return CC_NORM;
 }


diff -u /usr/src/lib/libedit/map.c ./map.c
--- /usr/src/lib/libedit/map.c	Fri Feb 20 17:18:36 1998
+++ ./map.c	Fri May  1 13:10:53 1998
@@ -701,7 +701,7 @@
     /*  82 */	VI_REPLACE_MODE,	/* R */
     /*  83 */	VI_SUBSTITUTE_LINE,	/* S */
     /*  84 */	VI_TO_PREV_CHAR,	/* T */
-    /*  85 */	ED_UNASSIGNED,		/* U */
+    /*  85 */	VI_UNDO_LINE,		/* U */
     /*  86 */	ED_UNASSIGNED,		/* V */
     /*  87 */	VI_NEXT_SPACE_WORD,	/* W */
     /*  88 */	ED_DELETE_PREV_CHAR,	/* X */


diff -u /usr/src/lib/libedit/read.c ./read.c
--- /usr/src/lib/libedit/read.c	Fri Feb 20 17:18:37 1998
+++ ./read.c	Fri May  1 13:12:30 1998
@@ -196,10 +196,10 @@
     el_action_t *cmdnum;
     char *ch;
 {
-    el_action_t  cmd = 0;
+    el_action_t  cmd = ED_UNASSIGNED;
     int     num;
 
-    while (cmd == 0 || cmd == ED_SEQUENCE_LEAD_IN) {
+    while (cmd == ED_UNASSIGNED || cmd == ED_SEQUENCE_LEAD_IN) {
 	if ((num = el_getc(el, ch)) != 1)	/* if EOF or error */
 	    return num;
 


diff -u /usr/src/lib/libedit/vi.c ./vi.c
--- /usr/src/lib/libedit/vi.c	Fri Feb 20 17:18:48 1998
+++ ./vi.c	Fri May  1 13:10:38 1998
@@ -173,7 +173,7 @@
     el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
 				      el->el_line.buffer,
 			 	      el->el_state.argument,
-				      cv__isword);
+				      c___isword);
 
     if (el->el_chared.c_vcmd.action & DELETE) {
 	cv_delfini(el);
@@ -186,7 +186,7 @@
 
 /* vi_prev_word():
  *	Vi move to the previous word
- *	[B]
+ *	[b]
  */
 protected el_action_t
 /*ARGSUSED*/
@@ -200,7 +200,7 @@
     el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
 				      el->el_line.buffer,
 			 	      el->el_state.argument,
-				      ce__isword);
+				      cv__isword);
 
     if (el->el_chared.c_vcmd.action & DELETE) {
 	cv_delfini(el);
@@ -227,7 +227,7 @@
     el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
 				      el->el_line.lastchar,
 				      el->el_state.argument,
-				      cv__isword);
+				      c___isword);
 
     if (el->el_map.type == MAP_VI)
 	if (el->el_chared.c_vcmd.action & DELETE) {
@@ -254,7 +254,7 @@
     el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
 				      el->el_line.lastchar,
 				      el->el_state.argument,
-				      ce__isword);
+				      cv__isword);
 
     if (el->el_map.type == MAP_VI)
 	if (el->el_chared.c_vcmd.action & DELETE) {
@@ -346,7 +346,7 @@
     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_NORM;
+    return CC_ARGHACK;
 }
 
 
@@ -366,13 +366,13 @@
     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_NORM;
+    return CC_ARGHACK;
 }
 
 
 /* vi_substitute_char():
  *	Vi replace character under the cursor and enter insert mode
- *	[r]
+ *	[s]
  */
 protected el_action_t
 /*ARGSUSED*/
@@ -448,7 +448,8 @@
     EditLine *el;
     int c;
 {
-    int 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++;
@@ -661,6 +662,21 @@
     }
 
     return CC_REFRESH;
+}
+
+
+/* vi_undo_line():
+ *	Vi undo all changes
+ *	[U]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_undo_line(el, c)
+    EditLine *el;
+    int c;
+{
+
+    return hist_get(el);
 }
 
 
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199805042012.QAA16093>