summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Src/Zle/zle_hist.c86
-rw-r--r--Src/Zle/zle_utils.c76
3 files changed, 93 insertions, 76 deletions
diff --git a/ChangeLog b/ChangeLog
index 7a1582150..f9a2a8882 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-04-11 Peter Stephenson <pws@csr.com>
+
+ * unposted: Src/zle_hist.c, Src/zle_utils.c: move zlecmp() and
+ zlefind() unaltered into zle_hist.c as statics in preparation
+ for surgery on the zle_text interface. (You should see the
+ waiting list for surgery, though.)
+
2008-04-09 Peter Stephenson <pws@csr.com>
* 24806: Doc/Zsh/params.yo, Completion/Zsh/Context/_subscript: fix
diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c
index 38f32b97c..2fdda1696 100644
--- a/Src/Zle/zle_hist.c
+++ b/Src/Zle/zle_hist.c
@@ -49,6 +49,10 @@ ZLE_STRING_T previous_search = NULL;
/**/
int previous_search_len = 0;
+
+/*** History text manipulation utilities ***/
+
+
struct zle_text {
ZLE_STRING_T text;
int len;
@@ -133,6 +137,88 @@ forget_edits(void)
}
}
+
+/*** Search utilities ***/
+
+
+/*
+ * 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.
+ */
+
+static int
+zlinecmp(ZLE_STRING_T histp, int histl, ZLE_STRING_T inputp, int inputl)
+{
+ 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 ((ZLE_INT_T)*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.
+ */
+
+static 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 (slen) {
+ if (zlinecmp(s, slen, needle, needlen) < sens)
+ return s;
+ s++;
+ slen--;
+ }
+ } else {
+ for (;;) {
+ if (zlinecmp(s, slen, needle, needlen) < sens)
+ return s;
+ if (s == haystack)
+ break;
+ s--;
+ slen++;
+ }
+ }
+
+ return NULL;
+}
+
+
+/*** Widgets ***/
+
+
/**/
int
uphistory(UNUSED(char **args))
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 1027f2083..cacf6b483 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -617,82 +617,6 @@ findline(int *a, int *b)
}
/*
- * 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.
- */
-
-/**/
-int
-zlinecmp(ZLE_STRING_T histp, int histl, ZLE_STRING_T inputp, int inputl)
-{
- 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 ((ZLE_INT_T)*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 (slen) {
- if (zlinecmp(s, slen, needle, needlen) < sens)
- return s;
- s++;
- slen--;
- }
- } else {
- for (;;) {
- if (zlinecmp(s, slen, needle, needlen) < sens)
- return s;
- if (s == haystack)
- break;
- s--;
- slen++;
- }
- }
-
- return NULL;
-}
-
-/*
* Query the user, and return 1 for yes, 0 for no. The question is assumed to
* have been printed already, and the cursor is left immediately after the
* response echoed. (Might cause a problem if this takes it onto the next