cv_csearch(): * Vi character search */
| 594 | * Vi character search |
| 595 | */ |
| 596 | protected el_action_t |
| 597 | cv_csearch(EditLine *el, int direction, Int ch, int count, int tflag) |
| 598 | { |
| 599 | Char *cp; |
| 600 | |
| 601 | if (ch == 0) |
| 602 | return CC_ERROR; |
| 603 | |
| 604 | if (ch == (Int)-1) { |
| 605 | Char c; |
| 606 | if (FUN(el,getc)(el, &c) != 1) |
| 607 | return ed_end_of_file(el, 0); |
| 608 | ch = c; |
| 609 | } |
| 610 | |
| 611 | /* Save for ';' and ',' commands */ |
| 612 | el->el_search.chacha = ch; |
| 613 | el->el_search.chadir = direction; |
| 614 | el->el_search.chatflg = (char)tflag; |
| 615 | |
| 616 | cp = el->el_line.cursor; |
| 617 | while (count--) { |
| 618 | if ((Int)*cp == ch) |
| 619 | cp += direction; |
| 620 | for (;;cp += direction) { |
| 621 | if (cp >= el->el_line.lastchar) |
| 622 | return CC_ERROR; |
| 623 | if (cp < el->el_line.buffer) |
| 624 | return CC_ERROR; |
| 625 | if ((Int)*cp == ch) |
| 626 | break; |
| 627 | } |
| 628 | } |
| 629 | |
| 630 | if (tflag) |
| 631 | cp -= direction; |
| 632 | |
| 633 | el->el_line.cursor = cp; |
| 634 | |
| 635 | if (el->el_chared.c_vcmd.action != NOP) { |
| 636 | if (direction > 0) |
| 637 | el->el_line.cursor++; |
| 638 | cv_delfini(el); |
| 639 | return CC_REFRESH; |
| 640 | } |
| 641 | return CC_CURSOR; |
| 642 | } |
no test coverage detected