commit 33960886668653dbb35bbba26d8d993aaf4f4d06
parent e8eeb19fcd9760dca4318e931a16000a6d617be5
Author: FRIGN <dev@frign.de>
Date: Thu, 25 Feb 2016 21:44:46 +0100
Implement strmem() and use it in join(1)
We want our delimiters to also contain 0 characters and have them
handled gracefully.
To accomplish this, I wrote a function strmem(), which looks for a
certain, arbitrarily long memory subset in a given string.
memmem() is a GNU extension and forces you to call strlen every time.
Diffstat:
4 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
@@ -75,6 +75,7 @@ LIBUTILSRC =\
libutil/strcasestr.c\
libutil/strlcat.c\
libutil/strlcpy.c\
+ libutil/strmem.c\
libutil/strsep.c\
libutil/strtonum.c\
libutil/unescape.c
diff --git a/join.c b/join.c
@@ -225,7 +225,7 @@ makeline(char *s, size_t len)
beg = sp;
if (sep) {
- if (!(end = utfutf(sp, sep)))
+ if (!(end = strmem(sp, sep, seplen)))
eol = 1;
if (!eol) {
diff --git a/libutil/strmem.c b/libutil/strmem.c
@@ -0,0 +1,23 @@
+/* See LICENSE file for copyright and license details. */
+#include <stddef.h>
+#include <string.h>
+
+char *
+strmem(char *haystack, char *needle, size_t needlelen)
+{
+ size_t i;
+
+ for (i = 0; i < needlelen; i++) {
+ if (haystack[i] == '\0') {
+ return NULL;
+ }
+ }
+
+ for (; haystack[i]; i++) {
+ if (!(memcmp(haystack + i - needlelen, needle, needlelen))) {
+ return (haystack + i - needlelen);
+ }
+ }
+
+ return NULL;
+}
diff --git a/util.h b/util.h
@@ -58,6 +58,8 @@ size_t estrlcpy(char *, const char *, size_t);
#undef strsep
char *strsep(char **, const char *);
+char *strmem(char *, char *, size_t);
+
/* regex */
int enregcomp(int, regex_t *, const char *, int);
int eregcomp(regex_t *, const char *, int);