1#include "include/pw.h"
2#include "src/types/string/string_internal.h"
3
4[[nodiscard]] bool pw_string_lstrip(PwValuePtr str)
5{
6 pw_assert_string(str);
7
8 uint8_t* end_ptr;
9 uint8_t* start_ptr = _pw_string_start_end(str, &end_ptr);
10 StrSkipSpaces fn_skip_spaces = _pw_skip_spaces_variants[str->char_size];
11 uint8_t* nonspace_ptr = fn_skip_spaces(start_ptr, end_ptr);
12
13 return _pw_string_do_lcut(str, start_ptr, end_ptr, nonspace_ptr);
14}
15
16[[nodiscard]] bool pw_string_rstrip(PwValuePtr str)
17{
18 pw_assert_string(str);
19
20 uint8_t char_size = str->char_size;
21 uint8_t* end_ptr;
22 uint8_t* start_ptr = _pw_string_start_end(str, &end_ptr);
23
24 if (start_ptr == end_ptr) {
25 return true;
26 }
27 while (start_ptr < end_ptr) {
28 uint8_t* prev_end_ptr = end_ptr;
29 char32_t c = _pw_get_char_reverse(&end_ptr, char_size);
30 if (!pw_isspace(c)) {
31 end_ptr = prev_end_ptr;
32 break;
33 }
34 }
35 if (start_ptr == end_ptr) {
36 pw_destroy(str);
37 *str = PwString("");
38 return true;
39 }
40 return pw_string_truncate(str, (end_ptr - start_ptr) / char_size);
41}
42
43[[nodiscard]] bool pw_string_strip(PwValuePtr str)
44{
45 return pw_string_rstrip(str) && pw_string_lstrip(str);
46}