123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- #include <string.h>
- #include "header.h"
- #include "termbox.h"
- #include "util.h"
- char pquery[STRBUF_M];
- char pwith[STRBUF_M];
- void query_replace(void)
- {
- point_t o_point = curbp->b_point;
- point_t l_point = -1;
- point_t found, mark;
- char question[STRBUF_L];
- int slen, rlen;
- int numsub = 0;
- int ask = TRUE, last = FALSE, c;
- struct tb_event ev;
- const char *qmsg = "Query replace";
- char *querymsg;
- if(pquery[0] != '\0' && pwith[0] != '\0') {
- asprintf(&querymsg, "%s (default %s -> %s): ", qmsg, pquery, pwith);
- } else {
- asprintf(&querymsg, "%s: ", qmsg);
- }
- memset(searchtext, 0, STRBUF_M);
- memset(replace, 0, STRBUF_M);
- if (!getinput(querymsg, (char*)searchtext, STRBUF_M, F_CLEAR, TRUE))
- return;
- if(searchtext[0] == '\0') {
- strncpy(searchtext, pquery, STRBUF_M);
- strncpy(replace, pwith, STRBUF_M);
- } else if (!getinput("With: ", (char*)replace, STRBUF_M, F_CLEAR, TRUE))
- return;
- memcpy(pquery, searchtext, STRBUF_M);
- memcpy(pwith, replace, STRBUF_M);
- slen = strlen(searchtext);
- rlen = strlen(replace);
-
- sprintf(question, "Replace '%s' with '%s' ? ", searchtext, replace);
-
- numsub = 0;
- while(TRUE) {
- found = search_forward(curbp, curbp->b_point, searchtext);
-
- if (found == -1) {
- curbp->b_point = (l_point == -1 ? o_point : l_point);
- break;
- }
- curbp->b_point = found;
-
- curbp->b_point -= slen;
- search_dir = 1;
- found_point = found;
- if (ask == TRUE) {
- msg(question);
- clrtoeol(strlen(question), MSGLINE);
- qprompt:
- update_display();
- if(execute_kbd_macro) {
- use_kbd_macro(&ev);
- } else if(tb_poll_event(&ev) != TB_OK)
- return;
- if(!ev.mod)
- c = ev.ch;
- else
- c = ev.key;
- if(record_input) {
- record_buffer[record_buffer_index] = ev;
- record_buffer_index++;
- }
- switch (c) {
- case 'y':
- break;
- case 'n':
- curbp->b_point = found;
- continue;
- case '!':
- ask = FALSE;
- found_point = -1;
- break;
- case 'l':
- last = TRUE;
- break;
- case TB_KEY_CTRL_G:
- case TB_KEY_ESC:
- case TB_KEY_ENTER:
- case 'q':
- found_point = -1;
- shift_pmark(TRUE, o_point);
- shift_pmark(TRUE, curbp->b_point);
- curwp->w_update = TRUE;
- msg("%d substitutions", numsub);
- return;
- default:
- msg("(y)es, (n)o, (!)do the rest, (l)last, (q)uit");
- goto qprompt;
- }
- }
- mark = curbp->b_mark;
- curbp->b_mark = curbp->b_point + slen;
- undoset(REPLACE, rlen);
- curbp->b_mark = mark;
- if (rlen > slen) {
- movegap(curbp, found);
-
- if (rlen - slen < curbp->b_egap - curbp->b_gap)
- growgap(curbp, rlen - slen);
-
- curbp->b_gap = curbp->b_gap + (rlen - slen);
- } else if (slen > rlen) {
- movegap(curbp, found);
-
- curbp->b_gap = curbp->b_gap - (slen - rlen);
- } else {
-
- }
-
- l_point = curbp->b_point;
- memcpy(ptr(curbp, curbp->b_point), replace, rlen * sizeof (char_t));
- curbp->b_flags |= B_MODIFIED;
- curbp->b_point = found - (slen - rlen);
- numsub++;
- if(last)
- break;
- }
- found_point = -1;
- shift_pmark(TRUE, o_point);
- shift_pmark(TRUE, curbp->b_point);
- if(curbp->b_point > curbp->b_epage && !ask) {
- curbp->b_reframe = TRUE;
- }
- msg("%d substitutions", numsub);
- }
|