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}