aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2013-04-21 15:51:41 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2013-04-21 15:51:41 +0200
commit264f37363dba6b19d1c6f7db79bc049a1cb5c44b (patch)
tree13a3883806c82083e455c73401c528026e969b9f
parentd96ffda62e9f9c88a6e43dc1926c5b775a611166 (diff)
downloadbusybox-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.c68
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
1708static char *char_search(char *p, const char *pat, int dir, int range) 1708static 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--) {