diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | compat_strnlen.c | 43 | ||||
-rw-r--r-- | config.h.post | 19 | ||||
-rw-r--r-- | config.h.pre | 1 | ||||
-rwxr-xr-x | configure | 1 | ||||
-rw-r--r-- | test-strnlen.c | 8 |
6 files changed, 66 insertions, 9 deletions
@@ -59,6 +59,7 @@ TESTSRCS = test-fgetln.c \ test-ohash.c \ test-strlcat.c \ test-strlcpy.c \ + test-strnlen.c \ test-strptime.c SRCS = Makefile \ @@ -78,6 +79,7 @@ SRCS = Makefile \ compat_strcasestr.c \ compat_strlcat.c \ compat_strlcpy.c \ + compat_strnlen.c \ compat_strsep.c \ config.h.post \ config.h.pre \ @@ -197,6 +199,7 @@ COMPAT_OBJS = compat_fgetln.o \ compat_strcasestr.o \ compat_strlcat.o \ compat_strlcpy.o \ + compat_strnlen.o \ compat_strsep.o arch.o: arch.in diff --git a/compat_strnlen.c b/compat_strnlen.c new file mode 100644 index 00000000..386c4898 --- /dev/null +++ b/compat_strnlen.c @@ -0,0 +1,43 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STRNLEN + +int dummy; + +#else + +/* ($)OpenBSD: strnlen.c,v 1.4 2012/04/26 01:22:31 matthew Exp $ */ + +/* + * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <string.h> + +size_t +strnlen(const char *str, size_t maxlen) +{ + const char *cp; + + for (cp = str; maxlen != 0 && *cp != '\0'; cp++, maxlen--) + ; + + return (size_t)(cp - str); +} + +#endif diff --git a/config.h.post b/config.h.post index 0a700426..fe8f015e 100644 --- a/config.h.post +++ b/config.h.post @@ -1,5 +1,3 @@ -#include <sys/types.h> - #if !defined(__BEGIN_DECLS) # ifdef __cplusplus # define __BEGIN_DECLS extern "C" { @@ -15,6 +13,13 @@ # endif #endif +#ifndef HAVE_FGETLN +extern char *fgetln(FILE *, size_t *); +#endif +#ifndef HAVE_GETSUBOPT +extern int getsubopt(char **, char * const *, char **); +extern char *suboptarg; +#endif #ifndef HAVE_STRCASESTR extern char *strcasestr(const char *, const char *); #endif @@ -24,15 +29,11 @@ extern size_t strlcat(char *, const char *, size_t); #ifndef HAVE_STRLCPY extern size_t strlcpy(char *, const char *, size_t); #endif +#ifndef HAVE_STRNLEN +extern size_t strnlen(const char *, size_t); +#endif #ifndef HAVE_STRSEP extern char *strsep(char **, const char *); #endif -#ifndef HAVE_GETSUBOPT -extern int getsubopt(char **, char * const *, char **); -extern char *suboptarg; -#endif -#ifndef HAVE_FGETLN -extern char *fgetln(FILE *, size_t *); -#endif #endif /* MANDOC_CONFIG_H */ diff --git a/config.h.pre b/config.h.pre index bc594784..52a8159a 100644 --- a/config.h.pre +++ b/config.h.pre @@ -5,4 +5,5 @@ # define _GNU_SOURCE /* strptime(), getsubopt() */ #endif +#include <sys/types.h> #include <stdio.h> @@ -37,6 +37,7 @@ runtest ohash OHASH runtest strcasestr STRCASESTR runtest strlcat STRLCAT runtest strlcpy STRLCPY +runtest strnlen STRNLEN runtest strptime STRPTIME runtest strsep STRSEP echo diff --git a/test-strnlen.c b/test-strnlen.c new file mode 100644 index 00000000..0bb69791 --- /dev/null +++ b/test-strnlen.c @@ -0,0 +1,8 @@ +#include <string.h> + +int +main(void) +{ + const char s[1] = { 'a' }; + return(1 != strnlen(s, 1)); +} |