aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2024-08-28 00:03:04 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2024-08-28 00:03:04 +0200
commitfdc185b8faaae44d67f85d2c5a9b9fa48d3e2859 (patch)
tree8a3553c4a1642588f8cdf739f035a99a0467b68e
parent94d12185d873c1808b902e010d305835fbb085f1 (diff)
downloadsciteco-fdc185b8faaae44d67f85d2c5a9b9fa48d3e2859.tar.gz
fixed retrieval of characters with codes larger than 127 - always return unsigned integer
* SCI_GETCHARAT is internally casted to `char`, which may be signed. Characters > 127 therefore become negative and stay so when casted to sptr_t. We therefore cast it back to guchar (unsigned char). * The same is true whenever returning a string's character to SciTECO (teco_int_t) as our string type is `gchar *`. * <^^x> now also works for those characters. Eventually, the parser will probably become UTF8-aware and this will have to be done differently.
-rw-r--r--src/core-commands.c5
-rw-r--r--src/qreg.c7
-rw-r--r--tests/testsuite.at3
3 files changed, 10 insertions, 5 deletions
diff --git a/src/core-commands.c b/src/core-commands.c
index d959f10..52059a8 100644
--- a/src/core-commands.c
+++ b/src/core-commands.c
@@ -1029,7 +1029,8 @@ teco_state_start_get(teco_machine_main_t *ctx, GError **error)
teco_error_range_set(error, "A");
return;
}
- teco_expressions_push(teco_interface_ssm(SCI_GETCHARAT, v, 0));
+ /* internally, the character is casted to signed char */
+ teco_expressions_push((guchar)teco_interface_ssm(SCI_GETCHARAT, v, 0));
}
static teco_state_t *
@@ -1764,7 +1765,7 @@ static teco_state_t *
teco_state_ascii_input(teco_machine_main_t *ctx, gchar chr, GError **error)
{
if (ctx->mode == TECO_MODE_NORMAL)
- teco_expressions_push(chr);
+ teco_expressions_push((guchar)chr);
return &teco_state_start;
}
diff --git a/src/qreg.c b/src/qreg.c
index 96e4e20..f058aff 100644
--- a/src/qreg.c
+++ b/src/qreg.c
@@ -261,7 +261,8 @@ teco_qreg_plain_get_character(teco_qreg_t *qreg, guint position, GError **error)
teco_doc_edit(&qreg->string);
if (position < teco_view_ssm(teco_qreg_view, SCI_GETLENGTH, 0, 0))
- ret = teco_view_ssm(teco_qreg_view, SCI_GETCHARAT, position, 0);
+ /* internally, values are casted to signed char */
+ ret = (guchar)teco_view_ssm(teco_qreg_view, SCI_GETCHARAT, position, 0);
else
g_set_error(error, TECO_ERROR, TECO_ERROR_RANGE,
"Position %u out of range", position);
@@ -407,7 +408,7 @@ teco_qreg_external_get_character(teco_qreg_t *qreg, guint position, GError **err
return -1;
}
- return str.data[position];
+ return (guchar)str.data[position];
}
/**
@@ -510,7 +511,7 @@ teco_qreg_bufferinfo_get_character(teco_qreg_t *qreg, guint position, GError **e
return -1;
}
- return teco_ring_current->filename[position];
+ return (guchar)teco_ring_current->filename[position];
}
/** @static @memberof teco_qreg_t */
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 3965730..6ea95ab 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -81,6 +81,9 @@ AT_CLEANUP
AT_SETUP([8-bit cleanlyness])
AT_CHECK([$SCITECO -e "0:@EUa/f^@^@/ :Qa-4\"N(0/0)' Ga Z= Z-4\"N(0/0)'"], 0, ignore, ignore)
+AT_CHECK([$SCITECO -e "129@I// -A-129\"N(0/0)'"], 0, ignore, ignore)
+AT_CHECK([$SCITECO -e "129@^Ua// 0Qa-129\"N(0/0)'"], 0, ignore, ignore)
+AT_CHECK([$SCITECO -e "@^Ua/^^/ 129:@^Ua// Ma-129\"N(0/0)'"], 0, ignore, ignore)
AT_CLEANUP
AT_SETUP([Automatic EOL normalization])