summaryrefslogtreecommitdiff
path: root/Src/Zle/zle_utils.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2005-02-25 10:20:38 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2005-02-25 10:20:38 +0000
commitddd172ebe2c625d4e894c66f511e803b50b20f78 (patch)
tree30a3462e5c63f91fbb30f5d3eb47bbc250ff9568 /Src/Zle/zle_utils.c
parent29b6b82ade1a38df6a3227ba45f4eafc0b5d6fe0 (diff)
downloadzsh-ddd172ebe2c625d4e894c66f511e803b50b20f78.tar.gz
zsh-ddd172ebe2c625d4e894c66f511e803b50b20f78.zip
20863: fix history (i)searching for Unicode
Diffstat (limited to 'Src/Zle/zle_utils.c')
-rw-r--r--Src/Zle/zle_utils.c70
1 files changed, 59 insertions, 11 deletions
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index a6daac289..1ccf98938 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -466,31 +466,79 @@ findline(int *a, int *b)
*b = findeol();
}
-/* Search for needle in haystack. Haystack is a metafied string while *
- * needle is unmetafied and len-long. Start the search at position *
- * pos. Search forward if dir > 0 otherwise search backward. */
+/*
+ * Return zero if the ZLE string histp length histl and the ZLE string
+ * inputp length inputl are the same. Return -1 if inputp is a prefix
+ * of histp. Return 1 if inputp is the lowercase version of histp.
+ * Return 2 if inputp is the lowercase prefix of histp and return 3
+ * otherwise.
+ */
/**/
-char *
-hstrnstr(char *haystack, int pos, char *needle, int len, int dir, int sens)
+int
+zlinecmp(ZLE_STRING_T histp, int histl, ZLE_STRING_T inputp, int inputl)
{
- char *s = haystack + pos;
+ int cnt;
+
+ if (histl < inputl) {
+ /* Not identical, second string is not a prefix. */
+ return 3;
+ }
+
+ if (!ZS_memcmp(histp, inputp, inputl)) {
+ /* Common prefix is identical */
+ /* If lines are identical return 0 */
+ if (histl == inputl)
+ return 0;
+ /* Second string is a prefix of the first */
+ return -1;
+ }
+
+ for (cnt = inputl; cnt; cnt--) {
+ if (*inputp++ != ZC_tolower(*histp++))
+ return 3;
+ }
+ /* Is second string is lowercase version of first? */
+ if (histl == inputl)
+ return 1;
+ /* Second string is lowercase prefix of first */
+ return 2;
+}
+
+
+/*
+ * Search for needle in haystack. Haystack and needle are ZLE strings
+ * of the indicated length. Start the search at position
+ * pos in haystack. Search forward if dir > 0, otherwise search
+ * backward. sens is used to test against the return value of linecmp.
+ */
+
+/**/
+ZLE_STRING_T
+zlinefind(ZLE_STRING_T haystack, int haylen, int pos,
+ ZLE_STRING_T needle, int needlen, int dir, int sens)
+{
+ ZLE_STRING_T s = haystack + pos;
+ int slen = haylen - pos;
if (dir > 0) {
- while (*s) {
- if (metadiffer(s, needle, len) < sens)
+ while (slen) {
+ if (zlinecmp(s, slen, needle, needlen) < sens)
return s;
- s += 1 + (*s == Meta);
+ s++;
+ slen--;
}
} else {
for (;;) {
- if (metadiffer(s, needle, len) < sens)
+ if (zlinecmp(s, slen, needle, needlen) < sens)
return s;
if (s == haystack)
break;
- s -= 1 + (s != haystack+1 && s[-2] == Meta);
+ s--;
+ slen++;
}
}
+
return NULL;
}