Skip to content

Commit e5b2f10

Browse files
committed
Add string contains functions
1 parent 346445e commit e5b2f10

File tree

3 files changed

+206
-0
lines changed

3 files changed

+206
-0
lines changed

include/scratchcpp/string_functions.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ extern "C"
2323

2424
LIBSCRATCHCPP_EXPORT int string_compare_raw_case_insensitive(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2);
2525
LIBSCRATCHCPP_EXPORT int string_compare_case_insensitive(const StringPtr *str1, const StringPtr *str2);
26+
27+
LIBSCRATCHCPP_EXPORT bool string_contains_raw_case_sensitive(const char16_t *str, const char16_t *substr);
28+
LIBSCRATCHCPP_EXPORT bool string_contains_case_sensitive(const StringPtr *str, const StringPtr *substr);
29+
30+
LIBSCRATCHCPP_EXPORT bool string_contains_raw_case_insensitive(const char16_t *str, const char16_t *substr);
31+
LIBSCRATCHCPP_EXPORT bool string_contains_case_insensitive(const StringPtr *str, const StringPtr *substr);
2632
}
2733

2834
} // namespace libscratchcpp

src/scratch/string_functions.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,76 @@ extern "C"
110110
{
111111
return string_compare_raw_case_insensitive_inline(str1->data, str1->size, str2->data, str2->size);
112112
}
113+
114+
inline bool string_contains_raw_case_sensitive_inline(const char16_t *str, const char16_t *substr)
115+
{
116+
size_t i = 0;
117+
118+
while (*str != u'\0') {
119+
if (*str == substr[i]) {
120+
i++;
121+
122+
if (substr[i] == u'\0')
123+
return true;
124+
} else
125+
i = 0;
126+
127+
str++;
128+
}
129+
130+
return false;
131+
}
132+
133+
/*! Returns true if the string contains the given substring (case sensitive). */
134+
bool string_contains_raw_case_sensitive(const char16_t *str, const char16_t *substr)
135+
{
136+
return string_contains_raw_case_sensitive_inline(str, substr);
137+
}
138+
139+
/*! Returns true if the string contains the given substring (case sensitive). */
140+
bool string_contains_case_sensitive(const StringPtr *str, const StringPtr *substr)
141+
{
142+
return string_contains_raw_case_sensitive_inline(str->data, substr->data);
143+
}
144+
145+
inline bool string_contains_raw_case_insensitive_inline(const char16_t *str, const char16_t *substr)
146+
{
147+
size_t i = 0;
148+
char32_t cp1, cp2;
149+
150+
while (*str != u'\0') {
151+
std::u32string cp1_str, cp2_str;
152+
unicode::utf16::decode(str, 1, cp1_str);
153+
unicode::utf16::decode(substr + i, 1, cp2_str);
154+
155+
cp1 = unicode::simple_lowercase_mapping(cp1_str.front());
156+
cp2 = unicode::simple_lowercase_mapping(cp2_str.front());
157+
158+
if (cp1 == cp2) {
159+
i++;
160+
161+
if (substr[i] == u'\0')
162+
return true;
163+
} else
164+
i = 0;
165+
166+
str++;
167+
}
168+
169+
return false;
170+
}
171+
172+
/*! Returns true if the string contains the given substring (case insensitive). */
173+
bool string_contains_raw_case_insensitive(const char16_t *str, const char16_t *substr)
174+
{
175+
return string_contains_raw_case_insensitive_inline(str, substr);
176+
}
177+
178+
/*! Returns true if the string contains the given substring (case insensitive). */
179+
bool string_contains_case_insensitive(const StringPtr *str, const StringPtr *substr)
180+
{
181+
return string_contains_raw_case_insensitive_inline(str->data, substr->data);
182+
}
113183
}
114184

115185
} // namespace libscratchcpp

test/scratch_classes/string_functions_test.cpp

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,133 @@ TEST(StringFunctionsTest, CompareCaseInsensitive)
265265
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
266266
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
267267
}
268+
269+
TEST(StringFunctionsTest, ContainsCaseSensitive)
270+
{
271+
StringPtr str, substr;
272+
273+
string_assign_cstring(&str, "abc");
274+
string_assign_cstring(&substr, "a");
275+
ASSERT_TRUE(string_contains_case_sensitive(&str, &substr));
276+
ASSERT_TRUE(string_contains_raw_case_sensitive(str.data, substr.data));
277+
278+
string_assign_cstring(&str, "abc");
279+
string_assign_cstring(&substr, "e");
280+
ASSERT_FALSE(string_contains_case_sensitive(&str, &substr));
281+
ASSERT_FALSE(string_contains_raw_case_sensitive(str.data, substr.data));
282+
283+
string_assign_cstring(&str, "Hello world");
284+
string_assign_cstring(&substr, "ello");
285+
ASSERT_TRUE(string_contains_case_sensitive(&str, &substr));
286+
ASSERT_TRUE(string_contains_raw_case_sensitive(str.data, substr.data));
287+
288+
string_assign_cstring(&str, "Hello world");
289+
string_assign_cstring(&substr, "eLlo");
290+
ASSERT_FALSE(string_contains_case_sensitive(&str, &substr));
291+
ASSERT_FALSE(string_contains_raw_case_sensitive(str.data, substr.data));
292+
293+
string_assign_cstring(&str, "test ste");
294+
string_assign_cstring(&substr, "ste");
295+
ASSERT_TRUE(string_contains_case_sensitive(&str, &substr));
296+
ASSERT_TRUE(string_contains_raw_case_sensitive(str.data, substr.data));
297+
298+
string_assign_cstring(&str, "Hello world");
299+
string_assign_cstring(&substr, "olld");
300+
ASSERT_FALSE(string_contains_case_sensitive(&str, &substr));
301+
ASSERT_FALSE(string_contains_raw_case_sensitive(str.data, substr.data));
302+
303+
string_assign_cstring(&str, "ábČ");
304+
string_assign_cstring(&substr, "á");
305+
ASSERT_TRUE(string_contains_case_sensitive(&str, &substr));
306+
ASSERT_TRUE(string_contains_raw_case_sensitive(str.data, substr.data));
307+
308+
string_assign_cstring(&str, "ábČ");
309+
string_assign_cstring(&substr, "");
310+
ASSERT_TRUE(string_contains_case_sensitive(&str, &substr));
311+
ASSERT_TRUE(string_contains_raw_case_sensitive(str.data, substr.data));
312+
313+
string_assign_cstring(&str, "ábČ");
314+
string_assign_cstring(&substr, "");
315+
ASSERT_FALSE(string_contains_case_sensitive(&str, &substr));
316+
ASSERT_FALSE(string_contains_raw_case_sensitive(str.data, substr.data));
317+
318+
string_assign_cstring(&str, "ábČ");
319+
string_assign_cstring(&substr, "ďá");
320+
ASSERT_FALSE(string_contains_case_sensitive(&str, &substr));
321+
ASSERT_FALSE(string_contains_raw_case_sensitive(str.data, substr.data));
322+
323+
string_assign_cstring(&str, "Lorem💀ipsum");
324+
string_assign_cstring(&substr, "m💀");
325+
ASSERT_TRUE(string_contains_case_sensitive(&str, &substr));
326+
ASSERT_TRUE(string_contains_raw_case_sensitive(str.data, substr.data));
327+
328+
string_assign_cstring(&str, "Lorem ipsum");
329+
string_assign_cstring(&substr, "💀");
330+
ASSERT_FALSE(string_contains_case_sensitive(&str, &substr));
331+
ASSERT_FALSE(string_contains_raw_case_sensitive(str.data, substr.data));
332+
}
333+
334+
TEST(StringFunctionsTest, ContainsCaseInsensitive)
335+
{
336+
StringPtr str, substr;
337+
338+
string_assign_cstring(&str, "abc");
339+
string_assign_cstring(&substr, "a");
340+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
341+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
342+
343+
string_assign_cstring(&str, "abc");
344+
string_assign_cstring(&substr, "e");
345+
ASSERT_FALSE(string_contains_case_insensitive(&str, &substr));
346+
ASSERT_FALSE(string_contains_raw_case_insensitive(str.data, substr.data));
347+
348+
string_assign_cstring(&str, "Hello world");
349+
string_assign_cstring(&substr, "ello");
350+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
351+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
352+
353+
string_assign_cstring(&str, "Hello world");
354+
string_assign_cstring(&substr, "eLlo");
355+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
356+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
357+
358+
string_assign_cstring(&str, "test ste");
359+
string_assign_cstring(&substr, "ste");
360+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
361+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
362+
363+
string_assign_cstring(&str, "Hello world");
364+
string_assign_cstring(&substr, "olld");
365+
ASSERT_FALSE(string_contains_case_insensitive(&str, &substr));
366+
ASSERT_FALSE(string_contains_raw_case_insensitive(str.data, substr.data));
367+
368+
string_assign_cstring(&str, "ábČ");
369+
string_assign_cstring(&substr, "á");
370+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
371+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
372+
373+
string_assign_cstring(&str, "ábČ");
374+
string_assign_cstring(&substr, "");
375+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
376+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
377+
378+
string_assign_cstring(&str, "ábČ");
379+
string_assign_cstring(&substr, "");
380+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
381+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
382+
383+
string_assign_cstring(&str, "ábČ");
384+
string_assign_cstring(&substr, "ďá");
385+
ASSERT_FALSE(string_contains_case_insensitive(&str, &substr));
386+
ASSERT_FALSE(string_contains_raw_case_insensitive(str.data, substr.data));
387+
388+
string_assign_cstring(&str, "Lorem💀ipsum");
389+
string_assign_cstring(&substr, "m💀");
390+
ASSERT_TRUE(string_contains_case_insensitive(&str, &substr));
391+
ASSERT_TRUE(string_contains_raw_case_insensitive(str.data, substr.data));
392+
393+
string_assign_cstring(&str, "Lorem ipsum");
394+
string_assign_cstring(&substr, "💀");
395+
ASSERT_FALSE(string_contains_case_insensitive(&str, &substr));
396+
ASSERT_FALSE(string_contains_raw_case_insensitive(str.data, substr.data));
397+
}

0 commit comments

Comments
 (0)