[git commit] vi: fix regex search, make it selectable in config

Denys Vlasenko vda.linux at googlemail.com
Mon Jun 27 00:59:37 UTC 2011


commit: http://git.busybox.net/busybox/commit/?id=b9ba580917b59e4770ba99db7c61288f2476eb61
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
char_search                                          134     214     +80
find_pair                                            187     169     -18
mycmp                                                 37       -     -37

Signed-off-by: Walter Harms <wharms at bfs.de>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/Config.src    |  117 --------------------------
 editors/Kbuild.src    |    1 -
 editors/vi.c          |  221 ++++++++++++++++++++++++++++++++++++++++---------
 include/applets.src.h |    1 -
 4 files changed, 181 insertions(+), 159 deletions(-)

diff --git a/editors/Config.src b/editors/Config.src
index 201ee6e..af1e1de 100644
--- a/editors/Config.src
+++ b/editors/Config.src
@@ -67,123 +67,6 @@ config SED
 	  sed is used to perform text transformations on a file
 	  or input from a pipeline.
 
-config VI
-	bool "vi"
-	default y
-	help
-	  'vi' is a text editor. More specifically, it is the One True
-	  text editor <grin>. It does, however, have a rather steep
-	  learning curve. If you are not already comfortable with 'vi'
-	  you may wish to use something else.
-
-config FEATURE_VI_MAX_LEN
-	int "Maximum screen width in vi"
-	range 256 16384
-	default 4096
-	depends on VI
-	help
-	  Contrary to what you may think, this is not eating much.
-	  Make it smaller than 4k only if you are very limited on memory.
-
-config FEATURE_VI_8BIT
-	bool "Allow vi to display 8-bit chars (otherwise shows dots)"
-	default n
-	depends on VI
-	help
-	  If your terminal can display characters with high bit set,
-	  you may want to enable this. Note: vi is not Unicode-capable.
-	  If your terminal combines several 8-bit bytes into one character
-	  (as in Unicode mode), this will not work properly.
-
-config FEATURE_VI_COLON
-	bool "Enable \":\" colon commands (no \"ex\" mode)"
-	default y
-	depends on VI
-	help
-	  Enable a limited set of colon commands for vi. This does not
-	  provide an "ex" mode.
-
-config FEATURE_VI_YANKMARK
-	bool "Enable yank/put commands and mark cmds"
-	default y
-	depends on VI
-	help
-	  This will enable you to use yank and put, as well as mark in
-	  busybox vi.
-
-config FEATURE_VI_SEARCH
-	bool "Enable search and replace cmds"
-	default y
-	depends on VI
-	help
-	  Select this if you wish to be able to do search and replace in
-	  busybox vi.
-
-config FEATURE_VI_USE_SIGNALS
-	bool "Catch signals"
-	default y
-	depends on VI
-	help
-	  Selecting this option will make busybox vi signal aware. This will
-	  make busybox vi support SIGWINCH to deal with Window Changes, catch
-	  Ctrl-Z and Ctrl-C and alarms.
-
-config FEATURE_VI_DOT_CMD
-	bool "Remember previous cmd and \".\" cmd"
-	default y
-	depends on VI
-	help
-	  Make busybox vi remember the last command and be able to repeat it.
-
-config FEATURE_VI_READONLY
-	bool "Enable -R option and \"view\" mode"
-	default y
-	depends on VI
-	help
-	  Enable the read-only command line option, which allows the user to
-	  open a file in read-only mode.
-
-config FEATURE_VI_SETOPTS
-	bool "Enable set-able options, ai ic showmatch"
-	default y
-	depends on VI
-	help
-	  Enable the editor to set some (ai, ic, showmatch) options.
-
-config FEATURE_VI_SET
-	bool "Support for :set"
-	default y
-	depends on VI
-	help
-	  Support for ":set".
-
-config FEATURE_VI_WIN_RESIZE
-	bool "Handle window resize"
-	default y
-	depends on VI
-	help
-	  Make busybox vi behave nicely with terminals that get resized.
-
-config FEATURE_VI_ASK_TERMINAL
-	bool "Use 'tell me cursor position' ESC sequence to measure window"
-	default y
-	depends on VI
-	help
-	  If terminal size can't be retrieved and $LINES/$COLUMNS are not set,
-	  this option makes vi perform a last-ditch effort to find it:
-	  vi positions cursor to 999,999 and asks terminal to report real
-	  cursor position using "ESC [ 6 n" escape sequence, then reads stdin.
-
-	  This is not clean but helps a lot on serial lines and such.
-
-config FEATURE_VI_OPTIMIZE_CURSOR
-	bool "Optimize cursor movement"
-	default y
-	depends on VI
-	help
-	  This will make the cursor movement faster, but requires more memory
-	  and it makes the applet a tiny bit larger.
-
 config FEATURE_ALLOW_EXEC
 	bool "Allow vi and awk to execute shell commands"
 	default y
diff --git a/editors/Kbuild.src b/editors/Kbuild.src
index 2f23ae1..8888cba 100644
--- a/editors/Kbuild.src
+++ b/editors/Kbuild.src
@@ -12,4 +12,3 @@ lib-$(CONFIG_CMP)       += cmp.o
 lib-$(CONFIG_DIFF)      += diff.o
 lib-$(CONFIG_ED)        += ed.o
 lib-$(CONFIG_SED)       += sed.o
-lib-$(CONFIG_VI)        += vi.o
diff --git a/editors/vi.c b/editors/vi.c
index 3656fee..3f4ccdc 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -21,6 +21,134 @@
  *	An "ex" line oriented mode- maybe using "cmdedit"
  */
 
+//config:config VI
+//config:	bool "vi"
+//config:	default y
+//config:	help
+//config:	  'vi' is a text editor. More specifically, it is the One True
+//config:	  text editor <grin>. It does, however, have a rather steep
+//config:	  learning curve. If you are not already comfortable with 'vi'
+//config:	  you may wish to use something else.
+//config:
+//config:config FEATURE_VI_MAX_LEN
+//config:	int "Maximum screen width in vi"
+//config:	range 256 16384
+//config:	default 4096
+//config:	depends on VI
+//config:	help
+//config:	  Contrary to what you may think, this is not eating much.
+//config:	  Make it smaller than 4k only if you are very limited on memory.
+//config:
+//config:config FEATURE_VI_8BIT
+//config:	bool "Allow vi to display 8-bit chars (otherwise shows dots)"
+//config:	default n
+//config:	depends on VI
+//config:	help
+//config:	  If your terminal can display characters with high bit set,
+//config:	  you may want to enable this. Note: vi is not Unicode-capable.
+//config:	  If your terminal combines several 8-bit bytes into one character
+//config:	  (as in Unicode mode), this will not work properly.
+//config:
+//config:config FEATURE_VI_COLON
+//config:	bool "Enable \":\" colon commands (no \"ex\" mode)"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Enable a limited set of colon commands for vi. This does not
+//config:	  provide an "ex" mode.
+//config:
+//config:config FEATURE_VI_YANKMARK
+//config:	bool "Enable yank/put commands and mark cmds"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  This will enable you to use yank and put, as well as mark in
+//config:	  busybox vi.
+//config:
+//config:config FEATURE_VI_SEARCH
+//config:	bool "Enable search and replace cmds"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Select this if you wish to be able to do search and replace in
+//config:	  busybox vi.
+//config:
+//config:config FEATURE_VI_REGEX_SEARCH
+//config:	bool "Enable regex in search and replace"
+//config:	default n   # Uses GNU regex, which may be unavailable. FIXME
+//config:	depends on FEATURE_VI_SEARCH
+//config:	help
+//config:	  Use extended regex search.
+//config:
+//config:config FEATURE_VI_USE_SIGNALS
+//config:	bool "Catch signals"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Selecting this option will make busybox vi signal aware. This will
+//config:	  make busybox vi support SIGWINCH to deal with Window Changes, catch
+//config:	  Ctrl-Z and Ctrl-C and alarms.
+//config:
+//config:config FEATURE_VI_DOT_CMD
+//config:	bool "Remember previous cmd and \".\" cmd"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Make busybox vi remember the last command and be able to repeat it.
+//config:
+//config:config FEATURE_VI_READONLY
+//config:	bool "Enable -R option and \"view\" mode"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Enable the read-only command line option, which allows the user to
+//config:	  open a file in read-only mode.
+//config:
+//config:config FEATURE_VI_SETOPTS
+//config:	bool "Enable set-able options, ai ic showmatch"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Enable the editor to set some (ai, ic, showmatch) options.
+//config:
+//config:config FEATURE_VI_SET
+//config:	bool "Support for :set"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Support for ":set".
+//config:
+//config:config FEATURE_VI_WIN_RESIZE
+//config:	bool "Handle window resize"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  Make busybox vi behave nicely with terminals that get resized.
+//config:
+//config:config FEATURE_VI_ASK_TERMINAL
+//config:	bool "Use 'tell me cursor position' ESC sequence to measure window"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  If terminal size can't be retrieved and $LINES/$COLUMNS are not set,
+//config:	  this option makes vi perform a last-ditch effort to find it:
+//config:	  vi positions cursor to 999,999 and asks terminal to report real
+//config:	  cursor position using "ESC [ 6 n" escape sequence, then reads stdin.
+//config:
+//config:	  This is not clean but helps a lot on serial lines and such.
+//config:
+//config:config FEATURE_VI_OPTIMIZE_CURSOR
+//config:	bool "Optimize cursor movement"
+//config:	default y
+//config:	depends on VI
+//config:	help
+//config:	  This will make the cursor movement faster, but requires more memory
+//config:	  and it makes the applet a tiny bit larger.
+
+//applet:IF_VI(APPLET(vi, BB_DIR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_VI) += vi.o
+
 //usage:#define vi_trivial_usage
 //usage:       "[OPTIONS] [FILE]..."
 //usage:#define vi_full_usage "\n\n"
@@ -33,6 +161,7 @@
 //usage:	)
 //usage:     "\n	-H	Short help regarding available features"
 
+#include <regex.h>
 #include "libbb.h"
 
 /* the CRASHME code is unmaintained, and doesn't currently build */
@@ -366,7 +495,6 @@ static void Hit_Return(void);
 
 #if ENABLE_FEATURE_VI_SEARCH
 static char *char_search(char *, const char *, int, int);	// search for pattern starting at p
-static int mycmp(const char *, const char *, int);	// string cmp based in "ignorecase"
 #endif
 #if ENABLE_FEATURE_VI_COLON
 static char *get_one_address(char *, int *);	// get colon addr, if present
@@ -1561,48 +1689,16 @@ static char *new_screen(int ro, int co)
 }
 
 #if ENABLE_FEATURE_VI_SEARCH
-static int mycmp(const char *s1, const char *s2, int len)
-{
-	if (ENABLE_FEATURE_VI_SETOPTS && ignorecase) {
-		return strncasecmp(s1, s2, len);
-	}
-	return strncmp(s1, s2, len);
-}
+
+# if ENABLE_FEATURE_VI_REGEX_SEARCH
 
 // search for pattern starting at p
 static char *char_search(char *p, const char *pat, int dir, int range)
 {
-#ifndef REGEX_SEARCH
-	char *start, *stop;
-	int len;
-
-	len = strlen(pat);
-	if (dir == FORWARD) {
-		stop = end - 1;	// assume range is p - end-1
-		if (range == LIMITED)
-			stop = next_line(p);	// range is to next line
-		for (start = p; start < stop; start++) {
-			if (mycmp(start, pat, len) == 0) {
-				return start;
-			}
-		}
-	} else if (dir == BACK) {
-		stop = text;	// assume range is text - p
-		if (range == LIMITED)
-			stop = prev_line(p);	// range is to prev line
-		for (start = p - len; start >= stop; start--) {
-			if (mycmp(start, pat, len) == 0) {
-				return start;
-			}
-		}
-	}
-	// pattern not found
-	return NULL;
-#else /* REGEX_SEARCH */
 	char *q;
 	struct re_pattern_buffer preg;
 	int i;
-	int size, range;
+	int size;
 
 	re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
 	preg.translate = 0;
@@ -1625,7 +1721,7 @@ static char *char_search(char *p, const char *pat, int dir, int range)
 	// RANGE could be negative if we are searching backwards
 	range = q - p;
 
-	q = re_compile_pattern(pat, strlen(pat), &preg);
+	q = (char *)re_compile_pattern(pat, strlen(pat), (struct re_pattern_buffer *)&preg);
 	if (q != 0) {
 		// The pattern was not compiled
 		status_line_bold("bad search pattern: \"%s\": %s", pat, q);
@@ -1659,8 +1755,53 @@ static char *char_search(char *p, const char *pat, int dir, int range)
 		p = p - i;
 	}
 	return p;
-#endif /* REGEX_SEARCH */
 }
+
+# else
+
+#  if ENABLE_FEATURE_VI_SETOPTS
+static int mycmp(const char *s1, const char *s2, int len)
+{
+	if (ignorecase) {
+		return strncasecmp(s1, s2, len);
+	}
+	return strncmp(s1, s2, len);
+}
+#  else
+#   define mycmp strncmp
+#  endif
+
+static char *char_search(char *p, const char *pat, int dir, int range)
+{
+	char *start, *stop;
+	int len;
+
+	len = strlen(pat);
+	if (dir == FORWARD) {
+		stop = end - 1;	// assume range is p - end-1
+		if (range == LIMITED)
+			stop = next_line(p);	// range is to next line
+		for (start = p; start < stop; start++) {
+			if (mycmp(start, pat, len) == 0) {
+				return start;
+			}
+		}
+	} else if (dir == BACK) {
+		stop = text;	// assume range is text - p
+		if (range == LIMITED)
+			stop = prev_line(p);	// range is to prev line
+		for (start = p - len; start >= stop; start--) {
+			if (mycmp(start, pat, len) == 0) {
+				return start;
+			}
+		}
+	}
+	// pattern not found
+	return NULL;
+}
+
+# endif
+
 #endif /* FEATURE_VI_SEARCH */
 
 static char *char_insert(char *p, char c) // insert the char c at 'p'
@@ -2022,8 +2163,8 @@ static void show_help(void)
 	"\n\tNamed buffers with \"x"
 #endif
 #if ENABLE_FEATURE_VI_READONLY
-	"\n\tReadonly if vi is called as \"view\""
-	"\n\tReadonly with -R command line arg"
+	//not implemented: "\n\tReadonly if vi is called as \"view\""
+	//redundant: usage text says this too: "\n\tReadonly with -R command line arg"
 #endif
 #if ENABLE_FEATURE_VI_SET
 	"\n\tSome colon mode commands with \':\'"
diff --git a/include/applets.src.h b/include/applets.src.h
index c6d99fe..2d55ffe 100644
--- a/include/applets.src.h
+++ b/include/applets.src.h
@@ -399,7 +399,6 @@ IF_USLEEP(APPLET_NOFORK(usleep, usleep, BB_DIR_BIN, BB_SUID_DROP, usleep))
 IF_UUDECODE(APPLET(uudecode, BB_DIR_USR_BIN, BB_SUID_DROP))
 IF_UUENCODE(APPLET(uuencode, BB_DIR_USR_BIN, BB_SUID_DROP))
 IF_VCONFIG(APPLET(vconfig, BB_DIR_SBIN, BB_SUID_DROP))
-IF_VI(APPLET(vi, BB_DIR_BIN, BB_SUID_DROP))
 /* Needs to be run by root or be suid root - needs to change uid and gid: */
 IF_VLOCK(APPLET(vlock, BB_DIR_USR_BIN, BB_SUID_REQUIRE))
 IF_VOLNAME(APPLET(volname, BB_DIR_USR_BIN, BB_SUID_DROP))
-- 
1.7.3.4



More information about the busybox-cvs mailing list