Lines Matching refs:el
55 #include "el.h"
62 #define EL_CURSOR(el) \
63 ((el)->el_line.cursor + (((el)->el_map.type == MAP_VI) && \
64 ((el)->el_map.current == (el)->el_map.alt)))
70 search_init(EditLine *el)
73 el->el_search.patbuf = el_calloc(EL_BUFSIZ,
74 sizeof(*el->el_search.patbuf));
75 if (el->el_search.patbuf == NULL)
77 el->el_search.patbuf[0] = L'\0';
78 el->el_search.patlen = 0;
79 el->el_search.patdir = -1;
80 el->el_search.chacha = L'\0';
81 el->el_search.chadir = CHAR_FWD;
82 el->el_search.chatflg = 0;
91 search_end(EditLine *el)
94 el_free(el->el_search.patbuf);
95 el->el_search.patbuf = NULL;
162 c_hmatch(EditLine *el, const wchar_t *str)
165 (void) fprintf(el->el_errfile, "match `%ls' with `%ls'\n",
166 el->el_search.patbuf, str);
169 return el_match(str, el->el_search.patbuf);
177 c_setpat(EditLine *el)
179 if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY &&
180 el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) {
181 el->el_search.patlen =
182 (size_t)(EL_CURSOR(el) - el->el_line.buffer);
183 if (el->el_search.patlen >= EL_BUFSIZ)
184 el->el_search.patlen = EL_BUFSIZ - 1;
185 (void) wcsncpy(el->el_search.patbuf, el->el_line.buffer,
186 el->el_search.patlen);
187 el->el_search.patbuf[el->el_search.patlen] = '\0';
190 (void) fprintf(el->el_errfile, "\neventno = %d\n",
191 el->el_history.eventno);
192 (void) fprintf(el->el_errfile, "patlen = %ld\n", el->el_search.patlen);
193 (void) fprintf(el->el_errfile, "patbuf = \"%ls\"\n",
194 el->el_search.patbuf);
195 (void) fprintf(el->el_errfile, "cursor %ld lastchar %ld\n",
196 EL_CURSOR(el) - el->el_line.buffer,
197 el->el_line.lastchar - el->el_line.buffer);
206 ce_inc_search(EditLine *el, int dir)
211 wchar_t *ocursor = el->el_line.cursor, oldpchar = pchar, ch;
216 int ohisteventno = el->el_history.eventno;
217 size_t oldpatlen = el->el_search.patlen;
221 if (el->el_line.lastchar + sizeof(STRfwd) /
222 sizeof(*el->el_line.lastchar) + 2 +
223 el->el_search.patlen >= el->el_line.limit)
228 if (el->el_search.patlen == 0) { /* first round */
232 el->el_search.patbuf[el->el_search.patlen++] = '.';
233 el->el_search.patbuf[el->el_search.patlen++] = '*';
239 *el->el_line.lastchar++ = '\n';
241 *cp; *el->el_line.lastchar++ = *cp++)
243 *el->el_line.lastchar++ = pchar;
244 for (cp = &el->el_search.patbuf[LEN];
245 cp < &el->el_search.patbuf[el->el_search.patlen];
246 *el->el_line.lastchar++ = *cp++)
248 *el->el_line.lastchar = '\0';
249 re_refresh(el);
251 if (el_wgetc(el, &ch) != 1)
252 return ed_end_of_file(el, 0);
254 switch (el->el_map.current[(unsigned char) ch]) {
257 if (el->el_search.patlen >= EL_BUFSIZ - LEN)
258 terminal_beep(el);
260 el->el_search.patbuf[el->el_search.patlen++] =
262 *el->el_line.lastchar++ = ch;
263 *el->el_line.lastchar = '\0';
264 re_refresh(el);
280 if (el->el_search.patlen > LEN)
283 terminal_beep(el);
295 for (cp = &el->el_search.patbuf[LEN];; cp++)
296 if (cp >= &el->el_search.patbuf[
297 el->el_search.patlen]) {
298 if (el->el_line.cursor ==
299 el->el_line.buffer)
301 el->el_line.cursor +=
302 el->el_search.patlen - LEN - 1;
303 cp = c__next_word(el->el_line.cursor,
304 el->el_line.lastchar, 1,
306 while (el->el_line.cursor < cp &&
307 *el->el_line.cursor != '\n') {
308 if (el->el_search.patlen >=
310 terminal_beep(el);
313 el->el_search.patbuf[el->el_search.patlen++] =
314 *el->el_line.cursor;
315 *el->el_line.lastchar++ =
316 *el->el_line.cursor++;
318 el->el_line.cursor = ocursor;
319 *el->el_line.lastchar = '\0';
320 re_refresh(el);
323 terminal_beep(el);
330 el_wpush(el, endcmd);
341 while (el->el_line.lastchar > el->el_line.buffer &&
342 *el->el_line.lastchar != '\n')
343 *el->el_line.lastchar-- = '\0';
344 *el->el_line.lastchar = '\0';
349 for (cp = &el->el_search.patbuf[el->el_search.patlen-1],
351 cp >= &el->el_search.patbuf[LEN];
357 if (el->el_search.patlen > LEN && ch != L'[') {
360 el->el_history.eventno =
362 if (hist_get(el) == CC_ERROR)
363 /* el->el_history.event
366 (void) hist_get(el);
367 el->el_line.cursor = newdir ==
369 el->el_line.lastchar :
370 el->el_line.buffer;
372 el->el_line.cursor +=
378 el->el_search.patbuf[el->el_search.patlen++] =
380 el->el_search.patbuf[el->el_search.patlen++] =
383 el->el_search.patbuf[el->el_search.patlen] =
385 if (el->el_line.cursor < el->el_line.buffer ||
386 el->el_line.cursor > el->el_line.lastchar ||
387 (ret = ce_search_line(el, newdir))
390 el->el_state.lastcmd =
394 ed_search_prev_history(el, 0) :
395 ed_search_next_history(el, 0));
397 el->el_line.cursor = newdir ==
399 el->el_line.lastchar :
400 el->el_line.buffer;
401 (void) ce_search_line(el,
405 el->el_search.patlen -= LEN;
406 el->el_search.patbuf[el->el_search.patlen] =
409 terminal_beep(el);
410 if (el->el_history.eventno !=
412 el->el_history.eventno =
414 if (hist_get(el) == CC_ERROR)
417 el->el_line.cursor = ocursor;
423 ret = ce_inc_search(el, newdir);
436 el->el_search.patlen = oldpatlen;
437 if (el->el_history.eventno != ohisteventno) {
438 el->el_history.eventno = ohisteventno;
439 if (hist_get(el) == CC_ERROR)
442 el->el_line.cursor = ocursor;
444 re_refresh(el);
456 cv_search(EditLine *el, int dir)
468 el->el_search.patdir = dir;
470 tmplen = c_gets(el, &tmpbuf[LEN],
483 if (el->el_search.patlen == 0) {
484 re_refresh(el);
488 if (el->el_search.patbuf[0] != '.' &&
489 el->el_search.patbuf[0] != '*') {
490 (void) wcsncpy(tmpbuf, el->el_search.patbuf,
492 el->el_search.patbuf[0] = '.';
493 el->el_search.patbuf[1] = '*';
494 (void) wcsncpy(&el->el_search.patbuf[2], tmpbuf,
496 el->el_search.patlen++;
497 el->el_search.patbuf[el->el_search.patlen++] = '.';
498 el->el_search.patbuf[el->el_search.patlen++] = '*';
499 el->el_search.patbuf[el->el_search.patlen] = '\0';
508 (void) wcsncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
509 el->el_search.patlen = (size_t)tmplen;
511 el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */
512 el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer;
513 if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) :
514 ed_search_next_history(el, 0)) == CC_ERROR) {
515 re_refresh(el);
519 re_refresh(el);
520 return ed_newline(el, 0);
530 ce_search_line(EditLine *el, int dir)
532 wchar_t *cp = el->el_line.cursor;
533 wchar_t *pattern = el->el_search.patbuf;
545 for (; cp >= el->el_line.buffer; cp--) {
548 el->el_line.cursor = cp;
555 for (; *cp != '\0' && cp < el->el_line.limit; cp++) {
558 el->el_line.cursor = cp;
572 cv_repeat_srch(EditLine *el, wint_t c)
577 (void) fprintf(el->el_errfile, "dir %d patlen %ld patbuf %s\n",
578 c, el->el_search.patlen, ct_encode_string(el->el_search.patbuf, &conv));
581 el->el_state.lastcmd = (el_action_t) c; /* Hack to stop c_setpat */
582 el->el_line.lastchar = el->el_line.buffer;
586 return ed_search_next_history(el, 0);
588 return ed_search_prev_history(el, 0);
599 cv_csearch(EditLine *el, int direction, wint_t ch, int count, int tflag)
608 if (el_wgetc(el, &c) != 1)
609 return ed_end_of_file(el, 0);
614 el->el_search.chacha = ch;
615 el->el_search.chadir = direction;
616 el->el_search.chatflg = (char)tflag;
618 cp = el->el_line.cursor;
623 if (cp >= el->el_line.lastchar)
625 if (cp < el->el_line.buffer)
635 el->el_line.cursor = cp;
637 if (el->el_chared.c_vcmd.action != NOP) {
639 el->el_line.cursor++;
640 cv_delfini(el);