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}