diff options
author | James Booth <boothj5@gmail.com> | 2016-04-03 22:30:24 +0100 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2016-04-03 22:30:24 +0100 |
commit | d9344b00fe6d3c77d8e935b7029ac11587e5001f (patch) | |
tree | eda834822f7dc273cc0a029f98c3d429759a6f59 /src/common.c | |
parent | 3086341e6882997009d30f6815f37ddc206eba7e (diff) | |
download | profani-tty-d9344b00fe6d3c77d8e935b7029ac11587e5001f.tar.gz |
Added prof_strstr function
Diffstat (limited to 'src/common.c')
-rw-r--r-- | src/common.c | 72 |
1 files changed, 60 insertions, 12 deletions
diff --git a/src/common.c b/src/common.c index ad66015f..c6ead0ba 100644 --- a/src/common.c +++ b/src/common.c @@ -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; + } +} + |