1#include "include/pw.h"
 2#include "src/types/string/string_internal.h"
 3
 4[[nodiscard]] bool pw_substr(PwValuePtr str, unsigned start_pos, unsigned end_pos, PwValuePtr result)
 5{
 6    pw_assert_string(str);
 7
 8    unsigned length;
 9    uint8_t* start_ptr = _pw_string_start_length(str, &length);
10
11    if (end_pos > length) {
12        end_pos = length;
13    }
14    if (start_pos >= end_pos) {
15        length = 0;
16    } else {
17        length = end_pos - start_pos;
18    }
19    if (!_pw_make_empty_string(str->type_id, length, 1, result)) {
20        return false;
21    }
22    if (length) {
23        _pw_string_set_length(result, length);
24        uint8_t char_size = str->char_size;
25        StrAppend fn_append = _pw_str_append_variants[1][char_size];
26        if (!fn_append(result, 0, start_ptr + start_pos * char_size, start_ptr + end_pos * char_size)) {
27            return false;
28        }
29    }
30    return true;
31}