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}