1#include "include/pw.h"
 2#include "src/types/string/string_internal.h"
 3
 4
 5[[nodiscard]] bool _pw_substring_eq_z(PwValuePtr a, unsigned start_pos, unsigned end_pos, void* b, uint8_t b_char_size)
 6{
 7    pw_assert_string(a);
 8    unsigned a_length;
 9    uint8_t* a_ptr = _pw_string_start_length(a, &a_length);
10
11    if (end_pos > a_length) {
12        end_pos = a_length;
13    }
14    if (end_pos < start_pos) {
15        return false;
16    }
17    if (_pw_unlikely(b_char_size == 4)) {
18        if (0 == *(char32_t*) b) {
19            return start_pos == end_pos;
20        }
21    } else {
22        if (0 == *(char*) b) {;
23            return start_pos == end_pos;
24        }
25    }
26    uint8_t char_size = a->char_size;
27    StrEqualZ fn_equalz = _pw_str_equalz_variants[char_size][b_char_size];
28    int match = fn_equalz(a_ptr + start_pos * char_size, end_pos - start_pos, b);
29    return (match == PW_NEQ)? false : true;  // partial match means equal
30}
31
32[[nodiscard]] bool _pw_startswith_z(PwValuePtr str, void* prefix, uint8_t prefix_char_size)
33{
34    pw_assert_string(str);
35    unsigned length;
36    uint8_t* str_start_ptr = _pw_string_start_length(str, &length);
37    StrEqualZ fn_equalz = _pw_str_equalz_variants[str->char_size][prefix_char_size];
38    int match = fn_equalz(str_start_ptr, length, prefix);
39    return (match == PW_NEQ)? false : true;  // partial match means equal
40}
41
42[[nodiscard]] bool _pw_endswith_z(PwValuePtr str, void* suffix, uint8_t suffix_char_size)
43{
44    pw_assert_string(str);
45    unsigned suffix_len;
46    switch (suffix_char_size) {
47        case 0: suffix_len = utf8_strlen(suffix); break;
48        case 1: suffix_len = strlen(suffix); break;
49        case 4: suffix_len = utf32_strlen(suffix); break;
50        default:
51            pw_panic("Bad char size for suffix");
52    }
53    unsigned str_len;
54    uint8_t* str_start_ptr = _pw_string_start_length(str, &str_len);
55    if (_pw_unlikely(str_len < suffix_len)) {
56        return false;
57    }
58    uint8_t str_char_size = str->char_size;
59    StrEqualZ fn_equalz = _pw_str_equalz_variants[str_char_size][suffix_char_size];
60    int match = fn_equalz(str_start_ptr + (str_len - suffix_len) * str_char_size, suffix_len, suffix);
61    return (match == PW_EQ)? true : false;  // nust be exact match
62}