aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <rhaberkorn@fmsbw.de>2026-08-04 23:58:13 +0200
committerRobin Haberkorn <rhaberkorn@fmsbw.de>2026-08-05 00:05:44 +0200
commitdf87077309d06207b234b1231128c205ec11a155 (patch)
treeb6e4f7306f6fd2dffa39d7e1a8a7001e7050bf38
parent9f73d18094ebedf94cb7b0507c195ada13c1d36a (diff)
fixed dot after an unsuccessful interactive searchHEADmaster-fmsbw-cimaster
If you had a partial success during interactive searching, dot would be left at that position since the failure handling only reset via SCI_GOTOPOS. This is now fixed by restoring the initial dot in glyphs as well. All existing occurrences of "dot" have been renamed to "pos" for consistency. (Nowadays, "dot" should be reserved for glyph positions since this is what `.` returns. Especially if both kinds of positions are used in the same code.) A test case has been added. This has been broken since 685507922b0b75da5935076395a5b1ec1ef58356.
-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.