diff options
author | obrien <obrien@FreeBSD.org> | 2001-10-01 08:41:27 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2001-10-01 08:41:27 +0000 |
commit | 90300f853673b3879ab4d6a60683ff69b564c58b (patch) | |
tree | f9436ba88ca8f8420af319b0a12dd175381b507b /lib/libedit/search.c | |
parent | f805e363ed51ace3356b37eb173c3d6435c35022 (diff) | |
download | FreeBSD-src-90300f853673b3879ab4d6a60683ff69b564c58b.zip FreeBSD-src-90300f853673b3879ab4d6a60683ff69b564c58b.tar.gz |
+ Sync with NetBSD, bringing in feature enhancements.
+ Convert to ANSI-C function definitions
+ style(9)
Submitted by: kris
Diffstat (limited to 'lib/libedit/search.c')
-rw-r--r-- | lib/libedit/search.c | 851 |
1 files changed, 433 insertions, 418 deletions
diff --git a/lib/libedit/search.c b/lib/libedit/search.c index 24f6697..4d832d7 100644 --- a/lib/libedit/search.c +++ b/lib/libedit/search.c @@ -32,6 +32,8 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $NetBSD: search.c,v 1.10 2001/01/04 15:56:32 christos Exp $ */ #include <sys/cdefs.h> @@ -39,6 +41,8 @@ __FBSDID("$FreeBSD$"); #if !defined(lint) && !defined(SCCSID) static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93"; #endif /* not lint && not SCCSID */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); /* * search.c: History and character search functions @@ -55,7 +59,7 @@ static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93"; /* * Adjust cursor in vi mode to include the character under it */ -#define EL_CURSOR(el) \ +#define EL_CURSOR(el) \ ((el)->el_line.cursor + (((el)->el_map.type == MAP_VI) && \ ((el)->el_map.current == (el)->el_map.alt))) @@ -63,15 +67,17 @@ static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93"; * Initialize the search stuff */ protected int -search_init(el) - EditLine *el; +search_init(EditLine *el) { - el->el_search.patbuf = (char *) el_malloc(EL_BUFSIZ); - el->el_search.patlen = 0; - el->el_search.patdir = -1; - el->el_search.chacha = '\0'; - el->el_search.chadir = -1; - return 0; + + el->el_search.patbuf = (char *) el_malloc(EL_BUFSIZ); + if (el->el_search.patbuf == NULL) + return (-1); + el->el_search.patlen = 0; + el->el_search.patdir = -1; + el->el_search.chacha = '\0'; + el->el_search.chadir = -1; + return (0); } @@ -79,68 +85,67 @@ search_init(el) * Initialize the search stuff */ protected void -search_end(el) - EditLine *el; +search_end(EditLine *el) { - el_free((ptr_t) el->el_search.patbuf); - el->el_search.patbuf = NULL; + + el_free((ptr_t) el->el_search.patbuf); + el->el_search.patbuf = NULL; } + #ifdef REGEXP /* regerror(): * Handle regular expression errors */ public void /*ARGSUSED*/ -regerror(msg) - const char *msg; +regerror(const char *msg) { } #endif + /* el_match(): * Return if string matches pattern */ protected int -el_match(str, pat) - const char *str; - const char *pat; +el_match(const char *str, const char *pat) { #if defined (REGEX) - regex_t re; - int rv; + regex_t re; + int rv; #elif defined (REGEXP) - regexp *rp; - int rv; -#else - extern char *re_comp __P((const char *)); - extern int re_exec __P((const char *)); + regexp *rp; + int rv; +#else + extern char *re_comp(const char *); + extern int re_exec(const char *); #endif - if (strstr(str, pat) != NULL) - return 1; + if (strstr(str, pat) != NULL) + return (1); #if defined(REGEX) - if (regcomp(&re, pat, 0) == 0) { - rv = regexec(&re, str, 0, NULL, 0) == 0; - regfree(&re); - } else { - rv = 0; - } - return rv; + if (regcomp(&re, pat, 0) == 0) { + rv = regexec(&re, str, 0, NULL, 0) == 0; + regfree(&re); + } else { + rv = 0; + } + return (rv); #elif defined(REGEXP) - if ((re = regcomp(pat)) != NULL) { - rv = regexec(re, str); - free((ptr_t) re); - } else { - rv = 0; - } - return rv; + if ((re = regcomp(pat)) != NULL) { + rv = regexec(re, str); + free((ptr_t) re); + } else { + rv = 0; + } + return (rv); #else - if (re_comp(pat) != NULL) - return 0; - else - return re_exec(str) == 1; + if (re_comp(pat) != NULL) + return (0); + else + return (re_exec(str) == 1); #endif } @@ -149,16 +154,14 @@ el_match(str, pat) * return True if the pattern matches the prefix */ protected int -c_hmatch(el, str) - EditLine *el; - const char *str; +c_hmatch(EditLine *el, const char *str) { #ifdef SDEBUG - (void) fprintf(el->el_errfile, "match `%s' with `%s'\n", - el->el_search.patbuf, str); + (void) fprintf(el->el_errfile, "match `%s' with `%s'\n", + el->el_search.patbuf, str); #endif /* SDEBUG */ - return el_match(str, el->el_search.patbuf); + return (el_match(str, el->el_search.patbuf)); } @@ -166,29 +169,29 @@ c_hmatch(el, str) * Set the history seatch pattern */ protected void -c_setpat(el) - EditLine *el; +c_setpat(EditLine *el) { - if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY && - el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) { - el->el_search.patlen = EL_CURSOR(el) - el->el_line.buffer; - if (el->el_search.patlen >= EL_BUFSIZ) - el->el_search.patlen = EL_BUFSIZ -1; - if (el->el_search.patlen >= 0) { - (void) strncpy(el->el_search.patbuf, el->el_line.buffer, - el->el_search.patlen); - el->el_search.patbuf[el->el_search.patlen] = '\0'; + if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY && + el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) { + el->el_search.patlen = EL_CURSOR(el) - el->el_line.buffer; + if (el->el_search.patlen >= EL_BUFSIZ) + el->el_search.patlen = EL_BUFSIZ - 1; + if (el->el_search.patlen != 0) { + (void) strncpy(el->el_search.patbuf, el->el_line.buffer, + el->el_search.patlen); + el->el_search.patbuf[el->el_search.patlen] = '\0'; + } else + el->el_search.patlen = strlen(el->el_search.patbuf); } - else - el->el_search.patlen = strlen(el->el_search.patbuf); - } #ifdef SDEBUG - (void) fprintf(el->el_errfile, "\neventno = %d\n", el->el_history.eventno); - (void) fprintf(el->el_errfile, "patlen = %d\n", el->el_search.patlen); - (void) fprintf(el->el_errfile, "patbuf = \"%s\"\n", el->el_search.patbuf); - (void) fprintf(el->el_errfile, "cursor %d lastchar %d\n", - EL_CURSOR(el) - el->el_line.buffer, - el->el_line.lastchar - el->el_line.buffer); + (void) fprintf(el->el_errfile, "\neventno = %d\n", + el->el_history.eventno); + (void) fprintf(el->el_errfile, "patlen = %d\n", el->el_search.patlen); + (void) fprintf(el->el_errfile, "patbuf = \"%s\"\n", + el->el_search.patbuf); + (void) fprintf(el->el_errfile, "cursor %d lastchar %d\n", + EL_CURSOR(el) - el->el_line.buffer, + el->el_line.lastchar - el->el_line.buffer); #endif } @@ -197,218 +200,241 @@ c_setpat(el) * Emacs incremental search */ protected el_action_t -ce_inc_search(el, dir) - EditLine *el; - int dir; +ce_inc_search(EditLine *el, int dir) { - static char STRfwd[] = { 'f', 'w', 'd', '\0' }, - STRbck[] = { 'b', 'c', 'k', '\0' }; - static char pchar = ':'; /* ':' = normal, '?' = failed */ - static char endcmd[2] = { '\0', '\0' }; - char ch, *cp, *ocursor = el->el_line.cursor, oldpchar = pchar; + static const char STRfwd[] = {'f', 'w', 'd', '\0'}, + STRbck[] = {'b', 'c', 'k', '\0'}; + static char pchar = ':';/* ':' = normal, '?' = failed */ + static char endcmd[2] = {'\0', '\0'}; + char ch, *ocursor = el->el_line.cursor, oldpchar = pchar; + const char *cp; - el_action_t ret = CC_NORM; + el_action_t ret = CC_NORM; - int ohisteventno = el->el_history.eventno, - oldpatlen = el->el_search.patlen, - newdir = dir, - done, redo; + int ohisteventno = el->el_history.eventno; + int oldpatlen = el->el_search.patlen; + int newdir = dir; + int done, redo; - if (el->el_line.lastchar + sizeof(STRfwd) / sizeof(char) + 2 + - el->el_search.patlen >= el->el_line.limit) - return CC_ERROR; + if (el->el_line.lastchar + sizeof(STRfwd) / sizeof(char) + 2 + + el->el_search.patlen >= el->el_line.limit) + return (CC_ERROR); - for (;;) { + for (;;) { - if (el->el_search.patlen == 0) { /* first round */ - pchar = ':'; + if (el->el_search.patlen == 0) { /* first round */ + pchar = ':'; #ifdef ANCHOR - el->el_search.patbuf[el->el_search.patlen++] = '.'; - el->el_search.patbuf[el->el_search.patlen++] = '*'; + el->el_search.patbuf[el->el_search.patlen++] = '.'; + el->el_search.patbuf[el->el_search.patlen++] = '*'; #endif - } - done = redo = 0; - *el->el_line.lastchar++ = '\n'; - for (cp = newdir == ED_SEARCH_PREV_HISTORY ? STRbck : STRfwd; - *cp; *el->el_line.lastchar++ = *cp++) - continue; - *el->el_line.lastchar++ = pchar; - for (cp = &el->el_search.patbuf[1]; - cp < &el->el_search.patbuf[el->el_search.patlen]; - *el->el_line.lastchar++ = *cp++) - continue; - *el->el_line.lastchar = '\0'; - re_refresh(el); - - if (el_getc(el, &ch) != 1) - return ed_end_of_file(el, 0); - - switch (el->el_map.current[(unsigned char) ch]) { - case ED_INSERT: - case ED_DIGIT: - if (el->el_search.patlen > EL_BUFSIZ - 3) - term_beep(el); - else { - el->el_search.patbuf[el->el_search.patlen++] = ch; - *el->el_line.lastchar++ = ch; + } + done = redo = 0; + *el->el_line.lastchar++ = '\n'; + for (cp = (newdir == ED_SEARCH_PREV_HISTORY) ? STRbck : STRfwd; + *cp; *el->el_line.lastchar++ = *cp++) + continue; + *el->el_line.lastchar++ = pchar; + for (cp = &el->el_search.patbuf[1]; + cp < &el->el_search.patbuf[el->el_search.patlen]; + *el->el_line.lastchar++ = *cp++) + continue; *el->el_line.lastchar = '\0'; re_refresh(el); - } - break; - - case EM_INC_SEARCH_NEXT: - newdir = ED_SEARCH_NEXT_HISTORY; - redo++; - break; - - case EM_INC_SEARCH_PREV: - newdir = ED_SEARCH_PREV_HISTORY; - redo++; - break; - - case ED_DELETE_PREV_CHAR: - if (el->el_search.patlen > 1) - done++; - else - term_beep(el); - break; - default: - switch (ch) { - case 0007: /* ^G: Abort */ - ret = CC_ERROR; - done++; - break; - - 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]) { - el->el_line.cursor += el->el_search.patlen - 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_getc(el, &ch) != 1) + return (ed_end_of_file(el, 0)); + + switch (el->el_map.current[(unsigned char) ch]) { + case ED_INSERT: + case ED_DIGIT: + if (el->el_search.patlen > EL_BUFSIZ - 3) term_beep(el); - break; - } - el->el_search.patbuf[el->el_search.patlen++] = - *el->el_line.cursor; - *el->el_line.lastchar++ = *el->el_line.cursor++; + else { + el->el_search.patbuf[el->el_search.patlen++] = + ch; + *el->el_line.lastchar++ = ch; + *el->el_line.lastchar = '\0'; + re_refresh(el); } - el->el_line.cursor = ocursor; - *el->el_line.lastchar = '\0'; - re_refresh(el); break; - } else if (isglob(*cp)) { - term_beep(el); + + case EM_INC_SEARCH_NEXT: + newdir = ED_SEARCH_NEXT_HISTORY; + redo++; break; - } - break; - - default: /* Terminate and execute cmd */ - endcmd[0] = ch; - el_push(el, endcmd); - /*FALLTHROUGH*/ - - case 0033: /* ESC: Terminate */ - ret = CC_REFRESH; - done++; - break; - } - break; - } - while (el->el_line.lastchar > el->el_line.buffer && - *el->el_line.lastchar != '\n') - *el->el_line.lastchar-- = '\0'; - *el->el_line.lastchar = '\0'; + case EM_INC_SEARCH_PREV: + newdir = ED_SEARCH_PREV_HISTORY; + redo++; + break; - if (!done) { + case ED_DELETE_PREV_CHAR: + if (el->el_search.patlen > 1) + done++; + else + term_beep(el); + break; - /* Can't search if unmatched '[' */ - for (cp = &el->el_search.patbuf[el->el_search.patlen-1], ch = ']'; - cp > el->el_search.patbuf; cp--) - if (*cp == '[' || *cp == ']') { - ch = *cp; - break; - } + default: + switch (ch) { + case 0007: /* ^G: Abort */ + ret = CC_ERROR; + done++; + break; - if (el->el_search.patlen > 1 && ch != '[') { - if (redo && newdir == dir) { - if (pchar == '?') { /* wrap around */ - el->el_history.eventno = - newdir == ED_SEARCH_PREV_HISTORY ? 0 : 0x7fffffff; - if (hist_get(el) == CC_ERROR) - /* el->el_history.eventno was fixed by first call */ - (void) hist_get(el); - el->el_line.cursor = newdir == ED_SEARCH_PREV_HISTORY ? - el->el_line.lastchar : el->el_line.buffer; - } else - el->el_line.cursor += - newdir == ED_SEARCH_PREV_HISTORY ? -1 : 1; - } -#ifdef ANCHOR - el->el_search.patbuf[el->el_search.patlen++] = '.'; - el->el_search.patbuf[el->el_search.patlen++] = '*'; -#endif - el->el_search.patbuf[el->el_search.patlen] = '\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) { - /* avoid c_setpat */ - el->el_state.lastcmd = (el_action_t) newdir; - ret = newdir == ED_SEARCH_PREV_HISTORY ? - ed_search_prev_history(el, 0) : - ed_search_next_history(el, 0); - if (ret != CC_ERROR) { - el->el_line.cursor = newdir == ED_SEARCH_PREV_HISTORY ? - 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] = '\0'; - if (ret == CC_ERROR) { - term_beep(el); - if (el->el_history.eventno != ohisteventno) { - el->el_history.eventno = ohisteventno; - if (hist_get(el) == CC_ERROR) - return CC_ERROR; - } - el->el_line.cursor = ocursor; - pchar = '?'; - } else { - pchar = ':'; + 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]) { + el->el_line.cursor += + el->el_search.patlen - 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) { + term_beep(el); + break; + } + el->el_search.patbuf[el->el_search.patlen++] = + *el->el_line.cursor; + *el->el_line.lastchar++ = + *el->el_line.cursor++; + } + el->el_line.cursor = ocursor; + *el->el_line.lastchar = '\0'; + re_refresh(el); + break; + } else if (isglob(*cp)) { + term_beep(el); + break; + } + break; + + default: /* Terminate and execute cmd */ + endcmd[0] = ch; + el_push(el, endcmd); + /* FALLTHROUGH */ + + case 0033: /* ESC: Terminate */ + ret = CC_REFRESH; + done++; + break; + } + break; } - } - ret = ce_inc_search(el, newdir); + while (el->el_line.lastchar > el->el_line.buffer && + *el->el_line.lastchar != '\n') + *el->el_line.lastchar-- = '\0'; + *el->el_line.lastchar = '\0'; - if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') - /* break abort of failed search at last non-failed */ - ret = CC_NORM; + if (!done) { + + /* Can't search if unmatched '[' */ + for (cp = &el->el_search.patbuf[el->el_search.patlen-1], + ch = ']'; + cp > el->el_search.patbuf; + cp--) + if (*cp == '[' || *cp == ']') { + ch = *cp; + break; + } + if (el->el_search.patlen > 1 && ch != '[') { + if (redo && newdir == dir) { + if (pchar == '?') { /* wrap around */ + el->el_history.eventno = + newdir == ED_SEARCH_PREV_HISTORY ? 0 : 0x7fffffff; + if (hist_get(el) == CC_ERROR) + /* el->el_history.event + * no was fixed by + * first call */ + (void) hist_get(el); + el->el_line.cursor = newdir == + ED_SEARCH_PREV_HISTORY ? + el->el_line.lastchar : + el->el_line.buffer; + } else + el->el_line.cursor += + newdir == + ED_SEARCH_PREV_HISTORY ? + -1 : 1; + } +#ifdef ANCHOR + el->el_search.patbuf[el->el_search.patlen++] = + '.'; + el->el_search.patbuf[el->el_search.patlen++] = + '*'; +#endif + el->el_search.patbuf[el->el_search.patlen] = + '\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) { + /* avoid c_setpat */ + el->el_state.lastcmd = + (el_action_t) newdir; + ret = newdir == ED_SEARCH_PREV_HISTORY ? + ed_search_prev_history(el, 0) : + ed_search_next_history(el, 0); + if (ret != CC_ERROR) { + el->el_line.cursor = newdir == + ED_SEARCH_PREV_HISTORY ? + 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] = + '\0'; + if (ret == CC_ERROR) { + term_beep(el); + if (el->el_history.eventno != + ohisteventno) { + el->el_history.eventno = + ohisteventno; + if (hist_get(el) == CC_ERROR) + return (CC_ERROR); + } + el->el_line.cursor = ocursor; + pchar = '?'; + } else { + pchar = ':'; + } + } + ret = ce_inc_search(el, newdir); - } + if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') + /* + * break abort of failed search at last + * non-failed + */ + ret = CC_NORM; - if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) { - /* restore on normal return or error exit */ - pchar = oldpchar; - el->el_search.patlen = oldpatlen; - if (el->el_history.eventno != ohisteventno) { - el->el_history.eventno = ohisteventno; - if (hist_get(el) == CC_ERROR) - return CC_ERROR; - } - el->el_line.cursor = ocursor; - if (ret == CC_ERROR) - re_refresh(el); + } + if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) { + /* restore on normal return or error exit */ + pchar = oldpchar; + el->el_search.patlen = oldpatlen; + if (el->el_history.eventno != ohisteventno) { + el->el_history.eventno = ohisteventno; + if (hist_get(el) == CC_ERROR) + return (CC_ERROR); + } + el->el_line.cursor = ocursor; + if (ret == CC_ERROR) + re_refresh(el); + } + if (done || ret != CC_NORM) + return (ret); } - if (done || ret != CC_NORM) - return ret; - } } @@ -416,91 +442,89 @@ ce_inc_search(el, dir) * Vi search. */ protected el_action_t -cv_search(el, dir) - EditLine *el; - int dir; +cv_search(EditLine *el, int dir) { - char ch; - char tmpbuf[EL_BUFSIZ]; - int tmplen; + char ch; + char tmpbuf[EL_BUFSIZ]; + int tmplen; - tmplen = 0; + tmplen = 0; #ifdef ANCHOR - tmpbuf[tmplen++] = '.'; - tmpbuf[tmplen++] = '*'; + tmpbuf[tmplen++] = '.'; + tmpbuf[tmplen++] = '*'; #endif - el->el_line.buffer[0] = '\0'; - el->el_line.lastchar = el->el_line.buffer; - el->el_line.cursor = el->el_line.buffer; - el->el_search.patdir = dir; + el->el_line.buffer[0] = '\0'; + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + el->el_search.patdir = dir; - c_insert(el, 2); /* prompt + '\n' */ - *el->el_line.cursor++ = '\n'; - *el->el_line.cursor++ = dir == ED_SEARCH_PREV_HISTORY ? '/' : '?'; - re_refresh(el); + c_insert(el, 2); /* prompt + '\n' */ + *el->el_line.cursor++ = '\n'; + *el->el_line.cursor++ = dir == ED_SEARCH_PREV_HISTORY ? '/' : '?'; + re_refresh(el); #ifdef ANCHOR -# define LEN 2 +#define LEN 2 #else -# define LEN 0 +#define LEN 0 #endif - tmplen = c_gets(el, &tmpbuf[LEN]) + LEN; - ch = tmpbuf[tmplen]; - tmpbuf[tmplen] = '\0'; - - if (tmplen == LEN) { - /* - * Use the old pattern, but wild-card it. - */ - if (el->el_search.patlen == 0) { - el->el_line.buffer[0] = '\0'; - el->el_line.lastchar = el->el_line.buffer; - el->el_line.cursor = el->el_line.buffer; - re_refresh(el); - return CC_ERROR; - } + tmplen = c_gets(el, &tmpbuf[LEN]) + LEN; + ch = tmpbuf[tmplen]; + tmpbuf[tmplen] = '\0'; + + if (tmplen == LEN) { + /* + * Use the old pattern, but wild-card it. + */ + if (el->el_search.patlen == 0) { + el->el_line.buffer[0] = '\0'; + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + re_refresh(el); + return (CC_ERROR); + } #ifdef ANCHOR - if (el->el_search.patbuf[0] != '.' && el->el_search.patbuf[0] != '*') { - (void)strncpy(tmpbuf, el->el_search.patbuf, sizeof(tmpbuf) - 1); - el->el_search.patbuf[0] = '.'; - el->el_search.patbuf[1] = '*'; - (void)strncpy(&el->el_search.patbuf[2], tmpbuf, EL_BUFSIZ - 3); - el->el_search.patlen++; - el->el_search.patbuf[el->el_search.patlen++] = '.'; - el->el_search.patbuf[el->el_search.patlen++] = '*'; - el->el_search.patbuf[el->el_search.patlen] = '\0'; - } + if (el->el_search.patbuf[0] != '.' && + el->el_search.patbuf[0] != '*') { + (void) strncpy(tmpbuf, el->el_search.patbuf, + sizeof(tmpbuf) - 1); + el->el_search.patbuf[0] = '.'; + el->el_search.patbuf[1] = '*'; + (void) strncpy(&el->el_search.patbuf[2], tmpbuf, + EL_BUFSIZ - 3); + el->el_search.patlen++; + el->el_search.patbuf[el->el_search.patlen++] = '.'; + el->el_search.patbuf[el->el_search.patlen++] = '*'; + el->el_search.patbuf[el->el_search.patlen] = '\0'; + } #endif - } - else { + } else { #ifdef ANCHOR - tmpbuf[tmplen++] = '.'; - tmpbuf[tmplen++] = '*'; + tmpbuf[tmplen++] = '.'; + tmpbuf[tmplen++] = '*'; #endif - tmpbuf[tmplen] = '\0'; - (void)strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1); - el->el_search.patlen = tmplen; - } - el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */ - el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; - if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : - ed_search_next_history(el, 0)) == CC_ERROR) { - re_refresh(el); - return CC_ERROR; - } - else { - if (ch == 0033) { - re_refresh(el); - *el->el_line.lastchar++ = '\n'; - *el->el_line.lastchar = '\0'; - re_goto_bottom(el); - return CC_NEWLINE; + tmpbuf[tmplen] = '\0'; + (void) strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1); + el->el_search.patlen = tmplen; + } + el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */ + el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; + if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : + ed_search_next_history(el, 0)) == CC_ERROR) { + re_refresh(el); + return (CC_ERROR); + } else { + if (ch == 0033) { + re_refresh(el); + *el->el_line.lastchar++ = '\n'; + *el->el_line.lastchar = '\0'; + re_goto_bottom(el); + return (CC_NEWLINE); + } else + return (CC_REFRESH); } - else - return CC_REFRESH; - } } @@ -508,29 +532,26 @@ cv_search(el, dir) * Look for a pattern inside a line */ protected el_action_t -ce_search_line(el, pattern, dir) - EditLine *el; - char *pattern; - int dir; +ce_search_line(EditLine *el, char *pattern, int dir) { - char *cp; - - if (dir == ED_SEARCH_PREV_HISTORY) { - for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--) - if (el_match(cp, pattern)) { - el->el_line.cursor = cp; - return CC_NORM; - } - return CC_ERROR; - } else { - for (cp = el->el_line.cursor; *cp != '\0' && - cp < el->el_line.limit; cp++) - if (el_match(cp, pattern)) { - el->el_line.cursor = cp; - return CC_NORM; - } - return CC_ERROR; - } + char *cp; + + if (dir == ED_SEARCH_PREV_HISTORY) { + for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--) + if (el_match(cp, pattern)) { + el->el_line.cursor = cp; + return (CC_NORM); + } + return (CC_ERROR); + } else { + for (cp = el->el_line.cursor; *cp != '\0' && + cp < el->el_line.limit; cp++) + if (el_match(cp, pattern)) { + el->el_line.cursor = cp; + return (CC_NORM); + } + return (CC_ERROR); + } } @@ -538,26 +559,25 @@ ce_search_line(el, pattern, dir) * Vi repeat search */ protected el_action_t -cv_repeat_srch(el, c) - EditLine *el; - int c; +cv_repeat_srch(EditLine *el, int c) { + #ifdef SDEBUG - (void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n", - c, el->el_search.patlen, el->el_search.patbuf); + (void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n", + c, el->el_search.patlen, el->el_search.patbuf); #endif - el->el_state.lastcmd = (el_action_t) c; /* Hack to stop c_setpat */ - el->el_line.lastchar = el->el_line.buffer; - - switch (c) { - case ED_SEARCH_NEXT_HISTORY: - return ed_search_next_history(el, 0); - case ED_SEARCH_PREV_HISTORY: - return ed_search_prev_history(el, 0); - default: - return CC_ERROR; - } + el->el_state.lastcmd = (el_action_t) c; /* Hack to stop c_setpat */ + el->el_line.lastchar = el->el_line.buffer; + + switch (c) { + case ED_SEARCH_NEXT_HISTORY: + return (ed_search_next_history(el, 0)); + case ED_SEARCH_PREV_HISTORY: + return (ed_search_prev_history(el, 0)); + default: + return (CC_ERROR); + } } @@ -565,36 +585,33 @@ cv_repeat_srch(el, c) * Vi character search reverse */ protected el_action_t -cv_csearch_back(el, ch, count, tflag) - EditLine *el; - int ch, count, tflag; +cv_csearch_back(EditLine *el, int ch, int count, int tflag) { - char *cp; - - cp = el->el_line.cursor; - while (count--) { - if (*cp == ch) - cp--; - while (cp > el->el_line.buffer && *cp != ch) - cp--; - } - - if (cp < el->el_line.buffer || (cp == el->el_line.buffer && *cp != ch)) - return CC_ERROR; + char *cp; + + cp = el->el_line.cursor; + while (count--) { + if (*cp == ch) + cp--; + while (cp > el->el_line.buffer && *cp != ch) + cp--; + } - if (*cp == ch && tflag) - cp++; + if (cp < el->el_line.buffer || (cp == el->el_line.buffer && *cp != ch)) + return (CC_ERROR); - el->el_line.cursor = cp; + if (*cp == ch && tflag) + cp++; - if (el->el_chared.c_vcmd.action & DELETE) { - el->el_line.cursor++; - cv_delfini(el); - return CC_REFRESH; - } + el->el_line.cursor = cp; - re_refresh_cursor(el); - return CC_NORM; + if (el->el_chared.c_vcmd.action & DELETE) { + el->el_line.cursor++; + cv_delfini(el); + return (CC_REFRESH); + } + re_refresh_cursor(el); + return (CC_NORM); } @@ -602,33 +619,31 @@ cv_csearch_back(el, ch, count, tflag) * Vi character search forward */ protected el_action_t -cv_csearch_fwd(el, ch, count, tflag) - EditLine *el; - int ch, count, tflag; +cv_csearch_fwd(EditLine *el, int ch, int count, int tflag) { - char *cp; - - cp = el->el_line.cursor; - while (count--) { - if(*cp == ch) - cp++; - while (cp < el->el_line.lastchar && *cp != ch) - cp++; - } - - if (cp >= el->el_line.lastchar) - return CC_ERROR; - - if (*cp == ch && tflag) - cp--; - - el->el_line.cursor = cp; - - if (el->el_chared.c_vcmd.action & DELETE) { - el->el_line.cursor++; - cv_delfini(el); - return CC_REFRESH; - } - re_refresh_cursor(el); - return CC_NORM; + char *cp; + + cp = el->el_line.cursor; + while (count--) { + if (*cp == ch) + cp++; + while (cp < el->el_line.lastchar && *cp != ch) + cp++; + } + + if (cp >= el->el_line.lastchar) + return (CC_ERROR); + + if (*cp == ch && tflag) + cp--; + + el->el_line.cursor = cp; + + if (el->el_chared.c_vcmd.action & DELETE) { + el->el_line.cursor++; + cv_delfini(el); + return (CC_REFRESH); + } + re_refresh_cursor(el); + return (CC_NORM); } |