From 33960886668653dbb35bbba26d8d993aaf4f4d06 Mon Sep 17 00:00:00 2001 From: FRIGN Date: Thu, 25 Feb 2016 21:44:46 +0100 Subject: [PATCH] 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. --- Makefile | 1 + join.c | 2 +- libutil/strmem.c | 23 +++++++++++++++++++++++ util.h | 2 ++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 libutil/strmem.c 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 +#include + +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);