aboutsummaryrefslogtreecommitdiff
path: root/deps/sysobj_early/src/strstr_word.c
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2024-04-22 00:35:53 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2024-04-22 00:35:53 -0300
commit5f01c706267c595de92406a32e7f31ef5056c2d0 (patch)
treed1e74ef54efc41ada622900fe3e2a50dee44a237 /deps/sysobj_early/src/strstr_word.c
parent09fcc751ef158898c315ebc9299a0fa3a722d914 (diff)
New upstream version 2.0.3preupstream/2.0.3pre
Diffstat (limited to 'deps/sysobj_early/src/strstr_word.c')
-rw-r--r--deps/sysobj_early/src/strstr_word.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/deps/sysobj_early/src/strstr_word.c b/deps/sysobj_early/src/strstr_word.c
new file mode 100644
index 00000000..0b51e4ac
--- /dev/null
+++ b/deps/sysobj_early/src/strstr_word.c
@@ -0,0 +1,80 @@
+/*
+ * sysobj - https://github.com/bp0/verbose-spork
+ * Copyright (C) 2018 Burt P. <pburt0@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/* versions of strstr() and strcasestr() where the match must be preceded and
+ * succeded by a non-alpha-numeric character. */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <ctype.h>
+
+static char *_strstr(const char *haystack, const char *needle, int anycase) {
+ return anycase
+ ? strcasestr(haystack, needle)
+ : strstr(haystack, needle);
+}
+
+static char *_strstr_word(const char *haystack, const char *needle,
+ int anycase, int prefix_ok, int suffix_ok) {
+
+ if (!haystack || !needle)
+ return NULL;
+
+ char *c;
+ const char *p = haystack;
+ size_t l = strlen(needle);
+ while((c = _strstr(p, needle, anycase))) {
+ const char *before = (c == haystack) ? NULL : c-1;
+ const char *after = c + l;
+ int ok = 1, wbs = 1, wbe = 1;
+ if (isalnum(*after)) wbe = 0;
+ if (before && isalnum(*before)) wbs = 0;
+ if (!wbe && !prefix_ok) ok = 0;
+ if (!wbs && !suffix_ok) ok = 0;
+ if (!(wbs || wbe)) ok = 0;
+ if (ok) return c;
+ p++;
+ }
+ return NULL;
+}
+
+char *strstr_word(const char *haystack, const char *needle) {
+ return _strstr_word(haystack, needle, 0, 0, 0);
+}
+
+char *strcasestr_word(const char *haystack, const char *needle) {
+ return _strstr_word(haystack, needle, 1, 0, 0);
+}
+
+char *strstr_word_prefix(const char *haystack, const char *needle) {
+ return _strstr_word(haystack, needle, 0, 1, 0);
+}
+
+char *strcasestr_word_prefix(const char *haystack, const char *needle) {
+ return _strstr_word(haystack, needle, 1, 1, 0);
+}
+
+char *strstr_word_suffix(const char *haystack, const char *needle) {
+ return _strstr_word(haystack, needle, 0, 0, 1);
+}
+
+char *strcasestr_word_suffix(const char *haystack, const char *needle) {
+ return _strstr_word(haystack, needle, 1, 0, 1);
+}