diff options
| -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. |
