diff options
-rw-r--r-- | editors/vi.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/editors/vi.c b/editors/vi.c index bff4725..ee3c7fe 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -561,7 +561,7 @@ static void indicate_error(void); // use flash or beep to indicate error 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 char *char_search(char *, const char *, int); // search for pattern starting at p #endif #if ENABLE_FEATURE_VI_COLON static char *get_one_address(char *, int *); // get colon addr, if present @@ -938,7 +938,7 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present p = q; if (*p == '/') p++; - q = char_search(dot, pat, FORWARD, FULL); + q = char_search(dot, pat, (FORWARD << 1) | FULL); if (q != NULL) { *addr = count_lines(text, q); } @@ -1442,7 +1442,7 @@ static void colon(char *buf) char *ls = q; // orig line start char *found; vc4: - found = char_search(q, F, FORWARD, LIMITED); // search cur line only for "find" + found = char_search(q, F, (FORWARD << 1) | LIMITED); // search cur line only for "find" if (found) { uintptr_t bias; // we found the "find" pattern - delete it @@ -1895,13 +1895,14 @@ static char *new_screen(int ro, int co) # 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) +static char *char_search(char *p, const char *pat, int dir_and_range) { struct re_pattern_buffer preg; const char *err; char *q; int i; int size; + int range; re_syntax_options = RE_SYNTAX_POSIX_EXTENDED; if (ignorecase) @@ -1914,10 +1915,11 @@ static char *char_search(char *p, const char *pat, int dir, int range) return p; } + range = (dir_and_range & 1); q = end - 1; // if FULL if (range == LIMITED) q = next_line(p); - if (dir == BACK) { + if (dir_and_range < 0) { // BACK? q = text; if (range == LIMITED) q = prev_line(p); @@ -1945,7 +1947,7 @@ static char *char_search(char *p, const char *pat, int dir, int range) regfree(&preg); if (i < 0) return NULL; - if (dir == FORWARD) + if (dir_and_range > 0) // FORWARD? p = p + i; else p = p - i; @@ -1966,13 +1968,15 @@ static int mycmp(const char *s1, const char *s2, int len) # define mycmp strncmp # endif -static char *char_search(char *p, const char *pat, int dir, int range) +static char *char_search(char *p, const char *pat, int dir_and_range) { char *start, *stop; int len; + int range; len = strlen(pat); - if (dir == FORWARD) { + range = (dir_and_range & 1); + if (dir_and_range > 0) { //FORWARD? stop = end - 1; // assume range is p..end-1 if (range == LIMITED) stop = next_line(p); // range is to next line @@ -1981,7 +1985,7 @@ static char *char_search(char *p, const char *pat, int dir, int range) return start; } } - } else if (dir == BACK) { + } else { //BACK stop = text; // assume range is text..p if (range == LIMITED) stop = prev_line(p); // range is to prev line @@ -3818,7 +3822,7 @@ static void do_cmd(int c) p = dot - 1; } dc4: - q = char_search(p, last_search_pattern + 1, dir, FULL); + q = char_search(p, last_search_pattern + 1, (dir << 1) | FULL); if (q != NULL) { dot = q; // good search, update "dot" msg = NULL; @@ -3829,7 +3833,7 @@ static void do_cmd(int c) if (dir == BACK) { p = end - 1; } - q = char_search(p, last_search_pattern + 1, dir, FULL); + q = char_search(p, last_search_pattern + 1, (dir << 1) | FULL); if (q != NULL) { // found something dot = q; // found new pattern- goto it msg = "search hit BOTTOM, continuing at TOP"; @@ -3845,13 +3849,13 @@ static void do_cmd(int c) } while (--cmdcnt > 0); break; case '{': // {- move backward paragraph - q = char_search(dot, "\n\n", BACK, FULL); + q = char_search(dot, "\n\n", (BACK << 1) | FULL); if (q != NULL) { // found blank line dot = next_line(q); // move to next blank line } break; case '}': // }- move forward paragraph - q = char_search(dot, "\n\n", FORWARD, FULL); + q = char_search(dot, "\n\n", (FORWARD << 1) | FULL); if (q != NULL) { // found blank line dot = next_line(q); // move to next blank line } |