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