commit 33960886668653dbb35bbba26d8d993aaf4f4d06
Author:     FRIGN <[email protected]>
AuthorDate: Thu Feb 25 21:44:46 2016 +0100
Commit:     sin <[email protected]>
CommitDate: Fri Feb 26 09:54:46 2016 +0000

    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.

diff --git a/Makefile b/Makefile
index 5fd0b50..266ba86 100644
--- 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
index caf592f..3c05a6e 100644
--- 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
new file mode 100644
index 0000000..597d5ca
--- /dev/null
+++ 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
index 4c973d1..f10bf46 100644
--- 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);

Reply via email to