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}