summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-09-22 15:28:36 +0000
committerLaurent Bercot <ska@appnovation.com>2023-09-22 15:28:36 +0000
commit753ceac3272a8c4f150ace8b4695991a85345c3c (patch)
treef9e62f7d544f634bc6e8b13b194f10182c980d91 /src
parentaebe8604605b41803c43c1def87549569b821b27 (diff)
downloadskalibs-753ceac3272a8c4f150ace8b4695991a85345c3c.tar.xz
Revamp case functions, add strcasestr() fallback
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/skalibs/bytestr.h1
-rw-r--r--src/include/skalibs/posixplz.h1
-rw-r--r--src/libposixplz/strcasestr.c28
-rw-r--r--src/libstddjb/case_lowerb.c7
-rw-r--r--src/libstddjb/case_lowers.c7
-rw-r--r--src/libstddjb/case_startb.c1
-rw-r--r--src/libstddjb/case_str.c33
-rw-r--r--src/libstddjb/case_upperb.c7
-rw-r--r--src/libstddjb/case_uppers.c7
9 files changed, 46 insertions, 46 deletions
diff --git a/src/include/skalibs/bytestr.h b/src/include/skalibs/bytestr.h
index 78fb8a1..30695f8 100644
--- a/src/include/skalibs/bytestr.h
+++ b/src/include/skalibs/bytestr.h
@@ -49,6 +49,5 @@ extern void case_upperb (char *, size_t) ;
#define case_equalb(a, n, b) (!strncasecmp(a, (b), n))
#define case_starts(s, t) case_startb(s, strlen(s), t)
extern int case_startb (char const *, size_t, char const *) gccattr_pure ;
-extern size_t case_str (char const *, char const *) gccattr_pure ;
#endif
diff --git a/src/include/skalibs/posixplz.h b/src/include/skalibs/posixplz.h
index 6dfe954..9eef116 100644
--- a/src/include/skalibs/posixplz.h
+++ b/src/include/skalibs/posixplz.h
@@ -24,6 +24,7 @@ extern char **environ ;
*/
extern void *memmem (void const *, size_t, void const *, size_t) gccattr_pure ;
+extern char *strcasestr (char const *, char const *) gccattr_pure ;
extern int getpeereid (int, uid_t *, gid_t *) ;
diff --git a/src/libposixplz/strcasestr.c b/src/libposixplz/strcasestr.c
new file mode 100644
index 0000000..2347267
--- /dev/null
+++ b/src/libposixplz/strcasestr.c
@@ -0,0 +1,28 @@
+/* ISC license. */
+
+#include <skalibs/sysdeps.h>
+
+#ifndef SKALIBS_HASSTRCASESTR
+
+#include <string.h>
+
+#include <skalibs/bytestr.h>
+
+ /* XXX: copies strings on the stack, careful with long strings */
+
+char *strcasestr (char const *haystack, char const *needle)
+{
+ size_t nlen = strlen(needle) ;
+ size_t hlen = strlen(haystack) ;
+ char *p ;
+ char lneedle[nlen + 1] ;
+ char lhaystack[hlen + 1] ;
+ memcpy(lneedle, needle, nlen + 1) ;
+ memcpy(lhaystack, haystack, hlen + 1) ;
+ case_lowerb(lneedle, nlen) ;
+ case_lowerb(lhaystack, hlen) ;
+ p = strstr(lhaystack, lneedle) ;
+ return p ? haystack + (p - lhaystack) : 0 ;
+}
+
+#endif
diff --git a/src/libstddjb/case_lowerb.c b/src/libstddjb/case_lowerb.c
index 66284df..7cc5331 100644
--- a/src/libstddjb/case_lowerb.c
+++ b/src/libstddjb/case_lowerb.c
@@ -1,13 +1,14 @@
/* ISC license. */
+#include <ctype.h>
+
#include <skalibs/bytestr.h>
void case_lowerb (char *s, size_t len)
{
- unsigned char const d = 'a' - 'A' ;
while (len--)
{
- if (('A' <= *s) && (*s <= 'Z')) *s += d ;
- ++s ;
+ int c = tolower(*s) ;
+ *s++ = (unsigned char)c ;
}
}
diff --git a/src/libstddjb/case_lowers.c b/src/libstddjb/case_lowers.c
index 349eade..a674f28 100644
--- a/src/libstddjb/case_lowers.c
+++ b/src/libstddjb/case_lowers.c
@@ -1,13 +1,14 @@
/* ISC license. */
+#include <ctype.h>
+
#include <skalibs/bytestr.h>
void case_lowers (char *s)
{
- unsigned char const d = 'a' - 'A' ;
while (*s)
{
- if (('A' <= *s) && (*s <= 'Z')) *s += d ;
- ++s ;
+ int c = tolower(*s) ;
+ *s++ = (unsigned char)c ;
}
}
diff --git a/src/libstddjb/case_startb.c b/src/libstddjb/case_startb.c
index 42e12f2..8b98631 100644
--- a/src/libstddjb/case_startb.c
+++ b/src/libstddjb/case_startb.c
@@ -2,6 +2,7 @@
#include <string.h>
#include <strings.h>
+
#include <skalibs/bytestr.h>
int case_startb (char const *s, size_t slen, char const *t)
diff --git a/src/libstddjb/case_str.c b/src/libstddjb/case_str.c
deleted file mode 100644
index 59f157f..0000000
--- a/src/libstddjb/case_str.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* ISC license. */
-
-#include <skalibs/sysdeps.h>
-
-#ifdef SKALIBS_HASSTRCASESTR
-
-#include <skalibs/nonposix.h>
-#include <string.h>
-#include <skalibs/bytestr.h>
-
-size_t case_str (char const *haystack, char const *needle)
-{
- char *p = strcasestr(haystack, needle) ;
- return p ? p - haystack : strlen(haystack) ;
-}
-
-#else
-
-#include <string.h>
-#include <strings.h>
-#include <skalibs/bytestr.h>
-
-size_t case_str (char const *haystack, char const *needle)
-{
- size_t nlen = strlen(needle) ;
- char const *p = haystack ;
- if (!nlen) return 0 ;
- for (; *p ; p++)
- if (!strncasecmp(p, needle, nlen)) return p - haystack ;
- return strlen(haystack) ;
-}
-
-#endif
diff --git a/src/libstddjb/case_upperb.c b/src/libstddjb/case_upperb.c
index 78ece8f..f245f4d 100644
--- a/src/libstddjb/case_upperb.c
+++ b/src/libstddjb/case_upperb.c
@@ -1,13 +1,14 @@
/* ISC license. */
+#include <ctype.h>
+
#include <skalibs/bytestr.h>
void case_upperb (char *s, size_t len)
{
- unsigned char const d = 'a' - 'A' ;
while (len--)
{
- if (('a' <= *s) && (*s <= 'z')) *s -= d ;
- ++s ;
+ int c = toupper(*s) ;
+ *s++ = (unsigned char)c ;
}
}
diff --git a/src/libstddjb/case_uppers.c b/src/libstddjb/case_uppers.c
index da0837c..4191711 100644
--- a/src/libstddjb/case_uppers.c
+++ b/src/libstddjb/case_uppers.c
@@ -1,13 +1,14 @@
/* ISC license. */
+#include <ctype.h>
+
#include <skalibs/bytestr.h>
void case_uppers (char *s)
{
- unsigned char const d = 'a' - 'A' ;
while (*s)
{
- if (('a' <= *s) && (*s <= 'z')) *s -= d ;
- ++s ;
+ int c = toupper(*s) ;
+ *s++ = (unsigned char)c ;
}
}