aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/TUI/module.jai5
-rw-r--r--modules/UTF8.jai19
2 files changed, 14 insertions, 10 deletions
diff --git a/modules/TUI/module.jai b/modules/TUI/module.jai
index 612f93e..112c666 100644
--- a/modules/TUI/module.jai
+++ b/modules/TUI/module.jai
@@ -560,9 +560,12 @@ read_input_line :: (count_limit: int, is_visible: bool = true) -> string, Key {
case;
if is_escape_code(key) continue;
- buff_idx := get_byte_idx(str, idx);
key_str := to_string(key,, allocator = temporary_allocator);
+ // Get the buffer index to insert the next character.
+ buff_idx, success := get_byte_index(str, idx);
+ if success == false then buff_idx = str.count;
+
// Make sure we have space to append the new character at the end (in case we're trying to do it).
if buff_idx > count_limit - key_str.count then continue;
diff --git a/modules/UTF8.jai b/modules/UTF8.jai
index 205e57d..72d3d75 100644
--- a/modules/UTF8.jai
+++ b/modules/UTF8.jai
@@ -97,8 +97,11 @@ count_characters :: (str: string, $is_null_terminated := false) -> int {
}
// Deletes character by it's index, and moves tail data to take its place.
-delete_character :: (str: *string, character_idx: int) {
- buffer_idx := get_byte_idx(str.*, character_idx);
+delete_character :: (str: *string, character_idx: int) -> success := true {
+ buffer_idx := get_byte_index(str.*, character_idx);
+
+ if buffer_idx < 0 return false;
+
bytes_to_delete := count_character_bytes(str.data[buffer_idx]);
for buffer_idx..str.count-1-bytes_to_delete {
@@ -109,19 +112,17 @@ delete_character :: (str: *string, character_idx: int) {
}
str.count -= bytes_to_delete;
+ return;
}
// Searches for the given character index and returns its byte index on the string.
-get_byte_idx :: (str: string, character_idx: int) -> buffer_idx: int, success: bool {
- if character_idx < 0 then return -1, false;
- if character_idx > str.count then return -2, false;
- if character_idx == 0 then return 0, true;
-
+get_byte_index :: (str: string, character_index: int) -> buffer_index: int, success := true {
buff_idx := 0;
char_idx := 0;
- while buff_idx < str.count && char_idx != character_idx {
+ while buff_idx < str.count {
+ if char_idx == character_index return buff_idx;
buff_idx += count_character_bytes(str[buff_idx]);
char_idx += 1;
}
- return buff_idx, char_idx == character_idx;
+ return -1, false;
}