Added prof_strstr function

This commit is contained in:
James Booth
2016-04-03 22:30:24 +01:00
parent 3086341e68
commit d9344b00fe
6 changed files with 177 additions and 90 deletions

View File

@@ -199,18 +199,6 @@ str_replace(const char *string, const char *substr,
return newstr;
}
gboolean
str_contains_str(const char *const searchstr, const char *const substr)
{
if (!searchstr) {
return FALSE;
}
if (!substr) {
return FALSE;
}
return g_strrstr(searchstr, substr) != NULL;
}
int
str_contains(const char str[], int size, char ch)
{
@@ -669,3 +657,63 @@ is_notify_enabled(void)
return notify_enabled;
}
gboolean
prof_strstr(const char *const needle, const char *const haystack, gboolean case_sensitive, gboolean whole_word)
{
if (needle == NULL || haystack == NULL) {
return FALSE;
}
char *needle_str = case_sensitive ? strdup(needle) : g_utf8_strdown(needle, -1);
char *haystack_str = case_sensitive ? strdup(haystack) : g_utf8_strdown(haystack, -1);
if (whole_word) {
if (g_strcmp0(needle_str, haystack_str) == 0) {
free(needle_str);
free(haystack_str);
return TRUE;
}
char *pos = g_strrstr(haystack_str, needle_str);
if (pos == NULL) {
free(needle_str);
free(haystack_str);
return FALSE;
}
gboolean at_start = g_str_has_prefix(haystack_str, needle_str);
gboolean at_end = g_str_has_suffix(haystack_str, needle_str);
if (at_start) {
char *next = g_utf8_next_char(pos + strlen(needle_str) - 1);
gunichar nextu = g_utf8_get_char(next);
gboolean result = g_unichar_isalnum(nextu) ? FALSE : TRUE;
free(needle_str);
free(haystack_str);
return result;
} else if (at_end) {
char *prev = g_utf8_prev_char(pos);
gunichar prevu = g_utf8_get_char(prev);
gboolean result = g_unichar_isalnum(prevu) ? FALSE : TRUE;
free(needle_str);
free(haystack_str);
return result;
} else {
char *prev = g_utf8_prev_char(pos);
char *next = g_utf8_next_char(pos + strlen(needle_str) - 1);
gunichar prevu = g_utf8_get_char(prev);
gunichar nextu = g_utf8_get_char(next);
gboolean result = g_unichar_isalnum(prevu) || g_unichar_isalnum(nextu) ? FALSE : TRUE;
free(needle_str);
free(haystack_str);
return result;
}
} else {
gboolean result = g_strrstr(haystack_str, needle_str) != NULL ? TRUE : FALSE;
free(needle_str);
free(haystack_str);
return result;
}
}