1#include "include/pw.h"
2#include "src/types/string/string_internal.h"
3
4[[nodiscard]] bool pw_string_erase(PwValuePtr str, unsigned start_pos, unsigned end_pos)
5{
6 unsigned length = pw_strlen(str);
7 if (start_pos >= length || start_pos >= end_pos) {
8 return true;
9 }
10 if (!_pw_string_copy_on_write(str)) {
11 return false;
12 }
13 if (end_pos >= length) {
14 // truncate
15 length = start_pos;
16 } else {
17 // erase in-place (simpler approach)
18 // XXX or make substring by concatenating parts?
19 uint8_t* start_ptr = _pw_string_start(str);
20 uint8_t char_size = str->char_size;
21 memmove(start_ptr + start_pos * char_size, start_ptr + end_pos * char_size, (length - end_pos) * char_size);
22 length -= end_pos - start_pos;
23 }
24 _pw_string_set_length(str, length);
25
26 if (str->embedded) {
27 // clean remainder for fast comparison to work
28 unsigned i = str->char_size * length;
29 while (i < sizeof(str->str_1)) {
30 str->str_1[i++] = 0;
31 }
32 }
33 return true;
34}