diff options
| author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-08-04 23:58:13 +0200 |
|---|---|---|
| committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2026-08-05 00:05:44 +0200 |
| commit | df87077309d06207b234b1231128c205ec11a155 (patch) | |
| tree | b6e4f7306f6fd2dffa39d7e1a8a7001e7050bf38 | |
| parent | 9f73d18094ebedf94cb7b0507c195ada13c1d36a (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.c | 44 | ||||
| -rw-r--r-- | tests/testsuite.at | 5 |
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. |
