aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/search.c44
-rw-r--r--tests/testsuite.at5
2 files changed, 29 insertions, 20 deletions
diff --git a/src/search.c b/src/search.c
index 844c459..e1f3bc6 100644
--- a/src/search.c
+++ b/src/search.c
@@ -43,7 +43,9 @@
#include "search.h"
typedef struct {
- gssize dot;
+ teco_int_t dot; /*< dot before search in glyphs */
+ gssize pos; /*< dot before search in bytes */
+
gssize from, to;
gint count;
@@ -120,7 +122,8 @@ teco_state_search_initial(teco_machine_main_t *ctx, GError **error)
teco_interface_get_codepage());
teco_undo_search_parameters(teco_search_parameters);
- teco_search_parameters.dot = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
+ teco_search_parameters.dot = teco_current_doc_get_dot();
+ teco_search_parameters.pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
teco_int_t v1, v2;
if (!teco_expressions_pop_num_calc(&v2, teco_num_sign, error))
@@ -152,11 +155,11 @@ teco_state_search_initial(teco_machine_main_t *ctx, GError **error)
} else {
teco_search_parameters.count = (gint)v2;
if (v2 >= 0) {
- teco_search_parameters.from = teco_search_parameters.dot;
+ teco_search_parameters.from = teco_search_parameters.pos;
teco_search_parameters.to = teco_interface_ssm(SCI_GETLENGTH, 0, 0);
} else {
teco_search_parameters.from = 0;
- teco_search_parameters.to = teco_search_parameters.dot;
+ teco_search_parameters.to = teco_search_parameters.pos;
}
}
@@ -1015,7 +1018,7 @@ teco_state_search_process(teco_machine_main_t *ctx, teco_string_t str, gsize new
teco_buffer_edit(buffer);
if (buffer == teco_search_parameters.to_buffer) {
- if (!teco_do_search(&re, 0, teco_search_parameters.dot, &count, error))
+ if (!teco_do_search(&re, 0, teco_search_parameters.pos, &count, error))
return FALSE;
break;
}
@@ -1031,7 +1034,7 @@ teco_state_search_process(teco_machine_main_t *ctx, teco_string_t str, gsize new
teco_buffer_edit(buffer);
if (buffer == teco_search_parameters.to_buffer) {
- if (!teco_do_search(&re, teco_search_parameters.dot,
+ if (!teco_do_search(&re, teco_search_parameters.pos,
teco_interface_ssm(SCI_GETLENGTH, 0, 0),
&count, error))
return FALSE;
@@ -1057,7 +1060,8 @@ teco_state_search_process(teco_machine_main_t *ctx, teco_string_t str, gsize new
return TRUE;
failure:
- teco_interface_ssm(SCI_GOTOPOS, teco_search_parameters.dot, 0);
+ teco_interface_ssm(SCI_GOTOPOS, teco_search_parameters.pos, 0);
+ teco_current_doc_set_dot(teco_search_parameters.dot);
return TRUE;
}
@@ -1202,7 +1206,7 @@ teco_state_search_all_initial(teco_machine_main_t *ctx, GError **error)
teco_interface_get_codepage());
teco_undo_search_parameters(teco_search_parameters);
- teco_search_parameters.dot = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
+ teco_search_parameters.pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
teco_int_t v1, v2;
@@ -1238,11 +1242,11 @@ teco_state_search_all_initial(teco_machine_main_t *ctx, GError **error)
}
if (teco_search_parameters.count >= 0) {
- teco_search_parameters.from = teco_search_parameters.dot;
+ teco_search_parameters.from = teco_search_parameters.pos;
teco_search_parameters.to = teco_interface_ssm(SCI_GETLENGTH, 0, 0);
} else {
teco_search_parameters.from = 0;
- teco_search_parameters.to = teco_search_parameters.dot;
+ teco_search_parameters.to = teco_search_parameters.pos;
}
return TRUE;
@@ -1329,25 +1333,25 @@ teco_state_search_kill_done(teco_machine_main_t *ctx, teco_string_t str, GError
if (teco_is_failure(search_state))
return &teco_state_start;
- sptr_t dot = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
+ sptr_t pos = teco_interface_ssm(SCI_GETCURRENTPOS, 0, 0);
teco_interface_ssm(SCI_BEGINUNDOACTION, 0, 0);
- if (teco_search_parameters.dot < dot) {
+ if (teco_search_parameters.pos < pos) {
/* kill forwards */
sptr_t anchor = teco_interface_ssm(SCI_GETANCHOR, 0, 0);
teco_int_t len_glyphs = teco_interface_bytes2glyphs_absdot(anchor) -
- teco_interface_bytes2glyphs_absdot(teco_search_parameters.dot);
+ teco_interface_bytes2glyphs_absdot(teco_search_parameters.pos);
if (teco_current_doc_must_undo())
- undo__teco_interface_ssm(SCI_GOTOPOS, dot, 0);
+ undo__teco_interface_ssm(SCI_GOTOPOS, pos, 0);
teco_interface_ssm(SCI_GOTOPOS, anchor, 0);
- teco_interface_ssm(SCI_DELETERANGE, teco_search_parameters.dot,
- anchor - teco_search_parameters.dot);
+ teco_interface_ssm(SCI_DELETERANGE, teco_search_parameters.pos,
+ anchor - teco_search_parameters.pos);
/* NOTE: An undo action is not always created. */
if (teco_current_doc_must_undo() &&
- teco_search_parameters.dot != anchor)
+ teco_search_parameters.pos != anchor)
undo__teco_interface_ssm(SCI_UNDO, 0, 0);
/* fix up ranges (^Y) */
@@ -1360,13 +1364,13 @@ teco_state_search_kill_done(teco_machine_main_t *ctx, teco_string_t str, GError
teco_current_doc_set_dot(teco_ranges[0].from);
} else {
/* kill backwards */
- teco_current_doc_set_dot(teco_interface_bytes2glyphs_absdot(dot));
+ teco_current_doc_set_dot(teco_interface_bytes2glyphs_absdot(pos));
- teco_interface_ssm(SCI_DELETERANGE, dot, teco_search_parameters.dot - dot);
+ teco_interface_ssm(SCI_DELETERANGE, pos, teco_search_parameters.pos - pos);
/* NOTE: An undo action is not always created. */
if (teco_current_doc_must_undo() &&
- teco_search_parameters.dot != dot)
+ teco_search_parameters.pos != pos)
undo__teco_interface_ssm(SCI_UNDO, 0, 0);
}
teco_interface_ssm(SCI_ENDUNDOACTION, 0, 0);
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 074e973..571b5b7 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -686,6 +686,11 @@ TE_CHECK_CMDLINE([[@^Um{:@S/XXX/} :Mm"S(0/0)' Mm"S(0/0)']], 0, ignore, stderr)
AT_FAIL_IF([$GREP "^Error:" stderr])
AT_CLEANUP
+AT_SETUP([Dot after unsuccessful interactive search])
+TE_CHECK_CMDLINE([[@I/ABC/J :@S/CX/"S(0/0)' ."N(0/0)']], 0, ignore, stderr)
+AT_FAIL_IF([$GREP "^Error:" stderr])
+AT_CLEANUP
+
AT_SETUP([Overwriting builtin registers])
# Initializes registers in batch mode, which are later replaced during startup
# of interactive mode.