diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2013-04-21 15:51:41 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-04-21 15:51:41 +0200 |
commit | 264f37363dba6b19d1c6f7db79bc049a1cb5c44b (patch) | |
tree | 13a3883806c82083e455c73401c528026e969b9f | |
parent | d96ffda62e9f9c88a6e43dc1926c5b775a611166 (diff) | |
download | busybox-w32-264f37363dba6b19d1c6f7db79bc049a1cb5c44b.tar.gz busybox-w32-264f37363dba6b19d1c6f7db79bc049a1cb5c44b.tar.bz2 busybox-w32-264f37363dba6b19d1c6f7db79bc049a1cb5c44b.zip |
vi: make regexp search case-insensitive if ":set ignorecase" is active
Reported by Dan Moinescu <dan@moinescu.net>.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/vi.c | 68 |
1 files changed, 28 insertions, 40 deletions
diff --git a/editors/vi.c b/editors/vi.c index 3615ee469..097f309c8 100644 --- a/editors/vi.c +++ b/editors/vi.c | |||
@@ -1707,65 +1707,53 @@ static char *new_screen(int ro, int co) | |||
1707 | // search for pattern starting at p | 1707 | // search for pattern starting at p |
1708 | static char *char_search(char *p, const char *pat, int dir, int range) | 1708 | static char *char_search(char *p, const char *pat, int dir, int range) |
1709 | { | 1709 | { |
1710 | char *q; | ||
1711 | struct re_pattern_buffer preg; | 1710 | struct re_pattern_buffer preg; |
1711 | const char *err; | ||
1712 | char *q; | ||
1712 | int i; | 1713 | int i; |
1713 | int size; | 1714 | int size; |
1714 | 1715 | ||
1715 | re_syntax_options = RE_SYNTAX_POSIX_EXTENDED; | 1716 | re_syntax_options = RE_SYNTAX_POSIX_EXTENDED; |
1716 | preg.translate = 0; | 1717 | if (ignorecase) |
1717 | preg.fastmap = 0; | 1718 | re_syntax_options = RE_SYNTAX_POSIX_EXTENDED | RE_ICASE; |
1718 | preg.buffer = 0; | 1719 | |
1719 | preg.allocated = 0; | 1720 | memset(&preg, 0, sizeof(preg)); |
1721 | err = re_compile_pattern(pat, strlen(pat), &preg); | ||
1722 | if (err != NULL) { | ||
1723 | status_line_bold("bad search pattern '%s': %s", pat, err); | ||
1724 | return p; | ||
1725 | } | ||
1720 | 1726 | ||
1721 | // assume a LIMITED forward search | 1727 | // assume a LIMITED forward search |
1722 | q = next_line(p); | ||
1723 | q = end_line(q); | ||
1724 | q = end - 1; | 1728 | q = end - 1; |
1725 | if (dir == BACK) { | 1729 | if (dir == BACK) |
1726 | q = prev_line(p); | ||
1727 | q = text; | 1730 | q = text; |
1728 | } | ||
1729 | // count the number of chars to search over, forward or backward | ||
1730 | size = q - p; | ||
1731 | if (size < 0) | ||
1732 | size = p - q; | ||
1733 | // RANGE could be negative if we are searching backwards | 1731 | // RANGE could be negative if we are searching backwards |
1734 | range = q - p; | 1732 | range = q - p; |
1735 | |||
1736 | q = (char *)re_compile_pattern(pat, strlen(pat), (struct re_pattern_buffer *)&preg); | ||
1737 | if (q != 0) { | ||
1738 | // The pattern was not compiled | ||
1739 | status_line_bold("bad search pattern: '%s': %s", pat, q); | ||
1740 | i = 0; // return p if pattern not compiled | ||
1741 | goto cs1; | ||
1742 | } | ||
1743 | |||
1744 | q = p; | 1733 | q = p; |
1734 | size = range; | ||
1745 | if (range < 0) { | 1735 | if (range < 0) { |
1736 | size = -size; | ||
1746 | q = p - size; | 1737 | q = p - size; |
1747 | if (q < text) | 1738 | if (q < text) |
1748 | q = text; | 1739 | q = text; |
1749 | } | 1740 | } |
1750 | // search for the compiled pattern, preg, in p[] | 1741 | // search for the compiled pattern, preg, in p[] |
1751 | // range < 0- search backward | 1742 | // range < 0: search backward |
1752 | // range > 0- search forward | 1743 | // range > 0: search forward |
1753 | // 0 < start < size | 1744 | // 0 < start < size |
1754 | // re_search() < 0 not found or error | 1745 | // re_search() < 0: not found or error |
1755 | // re_search() > 0 index of found pattern | 1746 | // re_search() >= 0: index of found pattern |
1756 | // struct pattern char int int int struct reg | 1747 | // struct pattern char int int int struct reg |
1757 | // re_search (*pattern_buffer, *string, size, start, range, *regs) | 1748 | // re_search(*pattern_buffer, *string, size, start, range, *regs) |
1758 | i = re_search(&preg, q, size, 0, range, 0); | 1749 | i = re_search(&preg, q, size, /*start:*/ 0, range, /*struct re_registers*:*/ NULL); |
1759 | if (i == -1) { | 1750 | regfree(&preg); |
1760 | p = 0; | 1751 | if (i < 0) |
1761 | i = 0; // return NULL if pattern not found | 1752 | return NULL; |
1762 | } | 1753 | if (dir == FORWARD) |
1763 | cs1: | ||
1764 | if (dir == FORWARD) { | ||
1765 | p = p + i; | 1754 | p = p + i; |
1766 | } else { | 1755 | else |
1767 | p = p - i; | 1756 | p = p - i; |
1768 | } | ||
1769 | return p; | 1757 | return p; |
1770 | } | 1758 | } |
1771 | 1759 | ||
@@ -1790,7 +1778,7 @@ static char *char_search(char *p, const char *pat, int dir, int range) | |||
1790 | 1778 | ||
1791 | len = strlen(pat); | 1779 | len = strlen(pat); |
1792 | if (dir == FORWARD) { | 1780 | if (dir == FORWARD) { |
1793 | stop = end - 1; // assume range is p - end-1 | 1781 | stop = end - 1; // assume range is p..end-1 |
1794 | if (range == LIMITED) | 1782 | if (range == LIMITED) |
1795 | stop = next_line(p); // range is to next line | 1783 | stop = next_line(p); // range is to next line |
1796 | for (start = p; start < stop; start++) { | 1784 | for (start = p; start < stop; start++) { |
@@ -1799,7 +1787,7 @@ static char *char_search(char *p, const char *pat, int dir, int range) | |||
1799 | } | 1787 | } |
1800 | } | 1788 | } |
1801 | } else if (dir == BACK) { | 1789 | } else if (dir == BACK) { |
1802 | stop = text; // assume range is text - p | 1790 | stop = text; // assume range is text..p |
1803 | if (range == LIMITED) | 1791 | if (range == LIMITED) |
1804 | stop = prev_line(p); // range is to prev line | 1792 | stop = prev_line(p); // range is to prev line |
1805 | for (start = p - len; start >= stop; start--) { | 1793 | for (start = p - len; start >= stop; start--) { |