Search for a string within another string starting at position start-pos (1-indexed)
| 1811 | |
| 1812 | // Search for a string within another string starting at position start-pos (1-indexed) |
| 1813 | FORCE_INLINE |
| 1814 | gdv_int32 locate_utf8_utf8_int32(gdv_int64 context, const char* sub_str, |
| 1815 | gdv_int32 sub_str_len, const char* str, |
| 1816 | gdv_int32 str_len, gdv_int32 start_pos) { |
| 1817 | if (start_pos < 1) { |
| 1818 | gdv_fn_context_set_error_msg(context, "Start position must be greater than 0"); |
| 1819 | return 0; |
| 1820 | } |
| 1821 | |
| 1822 | if (str_len == 0 || sub_str_len == 0) { |
| 1823 | return 0; |
| 1824 | } |
| 1825 | |
| 1826 | gdv_int32 byte_pos = utf8_byte_pos(context, str, str_len, start_pos - 1); |
| 1827 | if (byte_pos < 0 || byte_pos >= str_len) { |
| 1828 | return 0; |
| 1829 | } |
| 1830 | for (gdv_int32 i = byte_pos; i <= str_len - sub_str_len; ++i) { |
| 1831 | if (memcmp(str + i, sub_str, sub_str_len) == 0) { |
| 1832 | return utf8_length(context, str, i) + 1; |
| 1833 | } |
| 1834 | } |
| 1835 | return 0; |
| 1836 | } |
| 1837 | |
| 1838 | FORCE_INLINE |
| 1839 | const char* replace_with_max_len_utf8_utf8_utf8(gdv_int64 context, const char* text, |