aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/search.c
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2024-08-29 01:56:50 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2024-09-09 18:22:21 +0200
commit7c592561af3bbbad2eaf865247811ba2bd590c2e (patch)
tree75b27cf40fb9ba8d646eb00e05be5f91d116b493 /src/search.c
parentc71ed30cf0c554d288edfe87842082cc9ec393a7 (diff)
downloadsciteco-7c592561af3bbbad2eaf865247811ba2bd590c2e.tar.gz
Glyph to byte offset mapping is now using the line character index (refs #5)
* This works reasonably well unless lines are exceedingly long (as on a line we always count characters). The following test case is still slow (on Unicode buffers): 10000<@I/XX/> <%a-1:J;> While the following is now also fast: 10000<@I/X^J/> <%a-1:J;> * Commands with relative character offsets (C, R, A, D) have a special optimization where they always count characters beginning at dot, as long as the argument is now exceedingly large. This means they are fast even on exceedingly long lines. * The remaining commands (search, EC/EG, Xq) now accept glyph indexes.
Diffstat (limited to 'src/search.c')
-rw-r--r--src/search.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/search.c b/src/search.c
index 46407d0..88b0e16 100644
--- a/src/search.c
+++ b/src/search.c
@@ -38,11 +38,8 @@
#include "search.h"
typedef struct {
- /*
- * FIXME: Should perhaps all be teco_int_t?
- */
- gint dot;
- gint from, to;
+ gssize dot;
+ gssize from, to;
gint count;
teco_buffer_t *from_buffer, *to_buffer;
@@ -79,16 +76,16 @@ teco_state_search_initial(teco_machine_main_t *ctx, GError **error)
return FALSE;
if (v1 <= v2) {
teco_search_parameters.count = 1;
- teco_search_parameters.from = (gint)v1;
- teco_search_parameters.to = (gint)v2;
+ teco_search_parameters.from = teco_glyphs2bytes(v1);
+ teco_search_parameters.to = teco_glyphs2bytes(v2);
} else {
teco_search_parameters.count = -1;
- teco_search_parameters.from = (gint)v2;
- teco_search_parameters.to = (gint)v1;
+ teco_search_parameters.from = teco_glyphs2bytes(v2);
+ teco_search_parameters.to = teco_glyphs2bytes(v1);
}
- if (!teco_validate_pos(teco_search_parameters.from) ||
- !teco_validate_pos(teco_search_parameters.to)) {
+ if (teco_search_parameters.from < 0 ||
+ teco_search_parameters.to < 0) {
/*
* FIXME: In derived classes, the command name will
* no longer be correct.