summaryrefslogtreecommitdiff
path: root/search.c
diff options
context:
space:
mode:
Diffstat (limited to 'search.c')
-rw-r--r--search.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/search.c b/search.c
index 51730ae..c4c552d 100644
--- a/search.c
+++ b/search.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1993
+/* Copyright (c) 1993-2002
* Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
* Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
* Copyright (c) 1987 Oliver Laumann
@@ -38,6 +38,8 @@ extern struct win *fore;
#ifdef COPY_PASTE
+int search_ic;
+
/********************************************************************
* VI style Search
*/
@@ -133,7 +135,7 @@ matchword(pattern, y, sx, ex)
char *pattern;
int y, sx, ex;
{
- char *ip, *ipe, *cp, *pp;
+ unsigned char *ip, *ipe, *cp, *pp;
struct mline *ml;
/* *sigh* to make WIN work */
@@ -145,12 +147,19 @@ int y, sx, ex;
for (;sx <= ex; sx++)
{
cp = ip++;
- pp = pattern;
- while (*cp++ == *pp++)
- if (*pp == 0)
- return sx;
- else if (cp == ipe)
- break;
+ pp = (unsigned char *)pattern;
+ for (;;)
+ {
+ if (*cp != *pp)
+ if (!search_ic || ((*cp ^ *pp) & 0xdf) || (*cp | 0x20) < 'a' || (*cp | 0x20) > 'z')
+ break;
+ cp++;
+ pp++;
+ if (*pp == 0)
+ return sx;
+ if (cp == ipe)
+ break;
+ }
}
return -1;
}
@@ -178,7 +187,7 @@ int l, p, end, dir;
{
int tab[256];
int i, q;
- char *s, c;
+ unsigned char *s, c;
int w = flayer->l_width;
/* *sigh* to make WIN work */
@@ -194,21 +203,27 @@ int l, p, end, dir;
for (i = 0; i < 256; i++)
tab[i] = l * dir;
for (i = 0; i < l - 1; i++, str += dir)
- tab[(int)(unsigned char) *str] = (l - 1 - i) * dir;
+ {
+ q = *(unsigned char *)str;
+ tab[q] = (l - 1 - i) * dir;
+ if (search_ic && (q | 0x20) >= 'a' && ((q | 0x20) <= 'z'))
+ tab[q ^ 0x20] = (l - 1 - i) * dir;
+ }
if (dir > 0)
p += l - 1;
debug1("first char to match: %c\n", *str);
while (p >= 0 && p < end)
{
q = p;
- s = str;
+ s = (unsigned char *)str;
for (i = 0;;)
{
c = (WIN(q / w))->image[q % w];
if (i == 0)
p += tab[(int)(unsigned char) c];
if (c != *s)
- break;
+ if (!search_ic || ((c ^ *s) & 0xdf) || (c | 0x20) < 'a' || (c | 0x20) > 'z')
+ break;
q -= dir;
s -= dir;
if (++i == l)
@@ -289,7 +304,7 @@ char *data; /* dummy */
y = pos / flayer->l_width;
LAY_CALL_UP
(
- RedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0);
+ LayRedisplayLine(INPUTLINE, 0, flayer->l_width - 1, 0);
revto(x, y);
if (W2D(markdata->cy) == INPUTLINE)
revto_line(markdata->cx, markdata->cy, INPUTLINE > 0 ? INPUTLINE - 1 : 1);