about summary refs log tree commit diff stats
path: root/src/common.c
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2016-04-03 22:30:24 +0100
committerJames Booth <boothj5@gmail.com>2016-04-03 22:30:24 +0100
commitd9344b00fe6d3c77d8e935b7029ac11587e5001f (patch)
treeeda834822f7dc273cc0a029f98c3d429759a6f59 /src/common.c
parent3086341e6882997009d30f6815f37ddc206eba7e (diff)
downloadprofani-tty-d9344b00fe6d3c77d8e935b7029ac11587e5001f.tar.gz
Added prof_strstr function
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c72
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;
+    }
+}
+