summaryrefslogtreecommitdiffstats
path: root/lib/libedit/search.c
diff options
context:
space:
mode:
authorotto <otto@openbsd.org>2003-11-25 20:12:38 +0000
committerotto <otto@openbsd.org>2003-11-25 20:12:38 +0000
commit6e02e0734f7f8794106eaef64fd6a0fef01f5480 (patch)
tree09387ebc529839bde9e87243aea25fbac1f5cc47 /lib/libedit/search.c
parentobvious fix for gcc3. (diff)
downloadwireguard-openbsd-6e02e0734f7f8794106eaef64fd6a0fef01f5480.tar.xz
wireguard-openbsd-6e02e0734f7f8794106eaef64fd6a0fef01f5480.zip
Sync libedit to NetBSD libedit as of Nov 8, 2003.
Tested by jmc@ djm@ and myself
Diffstat (limited to 'lib/libedit/search.c')
-rw-r--r--lib/libedit/search.c71
1 files changed, 43 insertions, 28 deletions
diff --git a/lib/libedit/search.c b/lib/libedit/search.c
index 84c8c24cf01..74fb5d91b53 100644
--- a/lib/libedit/search.c
+++ b/lib/libedit/search.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: search.c,v 1.9 2003/10/31 08:42:24 otto Exp $ */
-/* $NetBSD: search.c,v 1.15 2003/08/07 16:44:33 agc Exp $ */
+/* $OpenBSD: search.c,v 1.10 2003/11/25 20:12:38 otto Exp $ */
+/* $NetBSD: search.c,v 1.19 2003/10/25 06:42:41 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93";
#else
-static const char rcsid[] = "$OpenBSD: search.c,v 1.9 2003/10/31 08:42:24 otto Exp $";
+static const char rcsid[] = "$OpenBSD: search.c,v 1.10 2003/11/25 20:12:38 otto Exp $";
#endif
#endif /* not lint && not SCCSID */
@@ -223,8 +223,11 @@ ce_inc_search(EditLine *el, int dir)
if (el->el_search.patlen == 0) { /* first round */
pchar = ':';
#ifdef ANCHOR
+#define LEN 2
el->el_search.patbuf[el->el_search.patlen++] = '.';
el->el_search.patbuf[el->el_search.patlen++] = '*';
+#else
+#define LEN 0
#endif
}
done = redo = 0;
@@ -233,7 +236,7 @@ ce_inc_search(EditLine *el, int dir)
*cp; *el->el_line.lastchar++ = *cp++)
continue;
*el->el_line.lastchar++ = pchar;
- for (cp = &el->el_search.patbuf[1];
+ for (cp = &el->el_search.patbuf[LEN];
cp < &el->el_search.patbuf[el->el_search.patlen];
*el->el_line.lastchar++ = *cp++)
continue;
@@ -246,7 +249,7 @@ ce_inc_search(EditLine *el, int dir)
switch (el->el_map.current[(unsigned char) ch]) {
case ED_INSERT:
case ED_DIGIT:
- if (el->el_search.patlen > EL_BUFSIZ - 3)
+ if (el->el_search.patlen >= EL_BUFSIZ - LEN)
term_beep(el);
else {
el->el_search.patbuf[el->el_search.patlen++] =
@@ -268,7 +271,7 @@ ce_inc_search(EditLine *el, int dir)
break;
case ED_DELETE_PREV_CHAR:
- if (el->el_search.patlen > 1)
+ if (el->el_search.patlen > LEN)
done++;
else
term_beep(el);
@@ -283,17 +286,18 @@ ce_inc_search(EditLine *el, int dir)
case 0027: /* ^W: Append word */
/* No can do if globbing characters in pattern */
- for (cp = &el->el_search.patbuf[1];; cp++)
- if (cp >= &el->el_search.patbuf[el->el_search.patlen]) {
+ for (cp = &el->el_search.patbuf[LEN];; cp++)
+ if (cp >= &el->el_search.patbuf[
+ el->el_search.patlen]) {
el->el_line.cursor +=
- el->el_search.patlen - 1;
+ el->el_search.patlen - LEN - 1;
cp = c__next_word(el->el_line.cursor,
el->el_line.lastchar, 1,
ce__isword);
while (el->el_line.cursor < cp &&
*el->el_line.cursor != '\n') {
- if (el->el_search.patlen >
- EL_BUFSIZ - 3) {
+ if (el->el_search.patlen >=
+ EL_BUFSIZ - LEN) {
term_beep(el);
break;
}
@@ -335,13 +339,13 @@ ce_inc_search(EditLine *el, int dir)
/* Can't search if unmatched '[' */
for (cp = &el->el_search.patbuf[el->el_search.patlen-1],
ch = ']';
- cp > el->el_search.patbuf;
+ cp >= &el->el_search.patbuf[LEN];
cp--)
if (*cp == '[' || *cp == ']') {
ch = *cp;
break;
}
- if (el->el_search.patlen > 1 && ch != '[') {
+ if (el->el_search.patlen > LEN && ch != '[') {
if (redo && newdir == dir) {
if (pchar == '?') { /* wrap around */
el->el_history.eventno =
@@ -371,9 +375,8 @@ ce_inc_search(EditLine *el, int dir)
'\0';
if (el->el_line.cursor < el->el_line.buffer ||
el->el_line.cursor > el->el_line.lastchar ||
- (ret = ce_search_line(el,
- &el->el_search.patbuf[1],
- newdir)) == CC_ERROR) {
+ (ret = ce_search_line(el, newdir))
+ == CC_ERROR) {
/* avoid c_setpat */
el->el_state.lastcmd =
(el_action_t) newdir;
@@ -386,11 +389,11 @@ ce_inc_search(EditLine *el, int dir)
el->el_line.lastchar :
el->el_line.buffer;
(void) ce_search_line(el,
- &el->el_search.patbuf[1],
newdir);
}
}
- el->el_search.patbuf[--el->el_search.patlen] =
+ el->el_search.patlen -= LEN;
+ el->el_search.patbuf[el->el_search.patlen] =
'\0';
if (ret == CC_ERROR) {
term_beep(el);
@@ -449,9 +452,6 @@ cv_search(EditLine *el, int dir)
#ifdef ANCHOR
tmpbuf[0] = '.';
tmpbuf[1] = '*';
-#define LEN 2
-#else
-#define LEN 0
#endif
tmplen = LEN;
@@ -517,24 +517,39 @@ cv_search(EditLine *el, int dir)
* Look for a pattern inside a line
*/
protected el_action_t
-ce_search_line(EditLine *el, char *pattern, int dir)
+ce_search_line(EditLine *el, int dir)
{
- char *cp;
+ char *cp = el->el_line.cursor;
+ char *pattern = el->el_search.patbuf;
+ char oc, *ocp;
+#ifdef ANCHOR
+ ocp = &pattern[1];
+ oc = *ocp;
+ *ocp = '^';
+#else
+ ocp = pattern;
+ oc = *ocp;
+#endif
if (dir == ED_SEARCH_PREV_HISTORY) {
- for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--)
- if (el_match(cp, pattern)) {
+ for (; cp >= el->el_line.buffer; cp--) {
+ if (el_match(cp, ocp)) {
+ *ocp = oc;
el->el_line.cursor = cp;
return (CC_NORM);
}
+ }
+ *ocp = oc;
return (CC_ERROR);
} else {
- for (cp = el->el_line.cursor; *cp != '\0' &&
- cp < el->el_line.limit; cp++)
- if (el_match(cp, pattern)) {
+ for (; *cp != '\0' && cp < el->el_line.limit; cp++) {
+ if (el_match(cp, ocp)) {
+ *ocp = oc;
el->el_line.cursor = cp;
return (CC_NORM);
}
+ }
+ *ocp = oc;
return (CC_ERROR);
}
}