diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2024-09-09 00:03:33 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2024-09-09 18:22:21 +0200 |
commit | 41ab5cf0289dab60ac1ddc97cf9680ee2468ea6c (patch) | |
tree | 5497c50c7319bd08121afb09d627297ea2b9e17a /src/qreg-commands.c | |
parent | 850fa38db9063e4bd52fba80588bfd3969ff0910 (diff) | |
download | sciteco-41ab5cf0289dab60ac1ddc97cf9680ee2468ea6c.tar.gz |
Xq and ]q inherit the document encoding from the source document (refs #5)
* ^Uq however always sets an UTF8 register as the source
is supposed to be a SciTECO macro which is always UTF-8.
* :^Uq preserves the register's encoding
* teco_doc_set_string() now also sets the encoding
* instead of trying to restore the encoding in teco_doc_undo_set_string(),
we now swap out the document in a teco_doc_t and pass it to an undo token.
* The get_codepage() Q-Reg method has been removed as the same
can now be done with teco_doc_get_string() and the get_string() method.
Diffstat (limited to 'src/qreg-commands.c')
-rw-r--r-- | src/qreg-commands.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/qreg-commands.c b/src/qreg-commands.c index 3e3cd0a..e8be384 100644 --- a/src/qreg-commands.c +++ b/src/qreg-commands.c @@ -372,10 +372,14 @@ teco_state_setqregstring_nobuilding_done(teco_machine_main_t *ctx, gint args = teco_expressions_args(); if (args > 0) { + guint codepage = SC_CP_UTF8; + if (colon_modified && !qreg->vtable->get_string(qreg, NULL, NULL, &codepage, error)) + return NULL; + g_autofree gchar *buffer = NULL; gsize len = 0; - if (qreg->vtable->get_codepage(qreg) == SC_CP_UTF8) { + if (codepage == SC_CP_UTF8) { /* the glib docs wrongly claim that one character can take 6 bytes */ buffer = g_malloc(4*args); for (gint i = args; i > 0; i--) { @@ -410,7 +414,8 @@ teco_state_setqregstring_nobuilding_done(teco_machine_main_t *ctx, } else { /* set register */ if (!qreg->vtable->undo_set_string(qreg, error) || - !qreg->vtable->set_string(qreg, buffer, len, error)) + !qreg->vtable->set_string(qreg, buffer, len, + SC_CP_UTF8, error)) return NULL; } } @@ -423,7 +428,8 @@ teco_state_setqregstring_nobuilding_done(teco_machine_main_t *ctx, } else { /* set register */ if (!qreg->vtable->undo_set_string(qreg, error) || - !qreg->vtable->set_string(qreg, str->data, str->len, error)) + !qreg->vtable->set_string(qreg, str->data, str->len, + SC_CP_UTF8, error)) return NULL; } @@ -487,8 +493,8 @@ teco_state_setqregstring_building_initial(teco_machine_main_t *ctx, GError **err * The expected codepage of string building constructs is determined * by the Q-Register. */ - teco_undo_guint(ctx->expectstring.machine.codepage) = qreg->vtable->get_codepage(qreg); - return TRUE; + teco_undo_guint(ctx->expectstring.machine.codepage); + return qreg->vtable->get_string(qreg, NULL, NULL, &ctx->expectstring.machine.codepage, error); } static teco_state_t * @@ -523,7 +529,7 @@ teco_state_getqregstring_got_register(teco_machine_main_t *ctx, teco_qreg_t *qre g_auto(teco_string_t) str = {NULL, 0}; - if (!qreg->vtable->get_string(qreg, &str.data, &str.len, error)) + if (!qreg->vtable->get_string(qreg, &str.data, &str.len, NULL, error)) return NULL; if (str.len > 0) { @@ -767,8 +773,10 @@ teco_state_copytoqreg_got_register(teco_machine_main_t *ctx, teco_qreg_t *qreg, !qreg->vtable->append_string(qreg, str, len, error)) return NULL; } else { + guint cp = teco_interface_get_codepage(); + if (!qreg->vtable->undo_set_string(qreg, error) || - !qreg->vtable->set_string(qreg, str, len, error)) + !qreg->vtable->set_string(qreg, str, len, cp, error)) return NULL; } |