make vi REGEX support compile again

walter harms wharms at bfs.de
Tue Jun 21 16:33:23 UTC 2011


Hi list,
vi supports regex, the bb vi did this also until someone broke it.
This patch does a bit of clean up and make the regex support compile
again. This is not production stuff.
The code has some room for improvements but i want to make it working first.

The big question: REGEX_SEARCH
 should it depend on something or is it a selectable feature ?


re,
 wh

Signed-off-by: harms <wharms at bfs.de>

diff --git a/editors/vi.c b/editors/vi.c
index 3656fee..e7e04fa 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -33,6 +33,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 +367,7 @@ 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"
+//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 +1562,17 @@ 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);
-}
+
+//#define  REGEX_SEARCH
+#ifdef 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 +1595,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 +1629,49 @@ static char *char_search(char *p, const char *pat, int dir, int range)
 		p = p - i;
 	}
 	return p;
-#endif /* REGEX_SEARCH */
 }
+
+#else
+
+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);
+}
+
+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'


More information about the busybox mailing list