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}