sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

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:
MMakefile | 1+
Mjoin.c | 2+-
Alibutil/strmem.c | 23+++++++++++++++++++++++
Mutil.h | 2++
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);