diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libspl/Makefile.am | 3 | ||||
-rw-r--r-- | lib/libspl/include/string.h | 53 | ||||
-rw-r--r-- | lib/libspl/strlcat.c | 56 | ||||
-rw-r--r-- | lib/libspl/strlcpy.c | 52 | ||||
-rw-r--r-- | lib/libspl/strnlen.c | 44 |
5 files changed, 50 insertions, 158 deletions
diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am index b7fa795d5..8d0d4d038 100644 --- a/lib/libspl/Makefile.am +++ b/lib/libspl/Makefile.am @@ -22,9 +22,6 @@ USER_C = \ list.c \ mkdirp.c \ page.c \ - strlcat.c \ - strlcpy.c \ - strnlen.c \ timestamp.c \ zone.c \ include/sys/list.h \ diff --git a/lib/libspl/include/string.h b/lib/libspl/include/string.h index 9e5133e0e..8908ce228 100644 --- a/lib/libspl/include/string.h +++ b/lib/libspl/include/string.h @@ -28,9 +28,56 @@ #define _LIBSPL_STRING_H #include_next <string.h> +#include <sys/types.h> -extern size_t strlcat(char *dst, const char *src, size_t dstsize); -extern size_t strlcpy(char *dst, const char *src, size_t len); -extern size_t strnlen(const char *str, size_t maxlen); +/* + * Appends src to the dstsize buffer at dst. The append will never + * overflow the destination buffer and the buffer will always be null + * terminated. Never reference beyond &dst[dstsize-1] when computing + * the length of the pre-existing string. + */ +static inline size_t +strlcat(char *dst, const char *src, size_t dstsize) +{ + char *df = dst; + size_t left = dstsize; + size_t l1; + size_t l2 = strlen(src); + size_t copied; + + while (left-- != 0 && *df != '\0') + df++; + + l1 = df - dst; + + if (dstsize == l1) + return (l1 + l2); + + copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2; + (void) memcpy(dst + l1, src, copied); + dst[l1+copied] = '\0'; + + return (l1 + l2); +} + +/* + * Copies src to the dstsize buffer at dst. The copy will never + * overflow the destination buffer and the buffer will always be null + * terminated. + */ +static inline size_t +strlcpy(char *dst, const char *src, size_t len) +{ + size_t slen = strlen(src); + + if (len == 0) + return (slen); + + size_t copied = (slen >= len) ? len - 1 : slen; + (void) memcpy(dst, src, copied); + dst[copied] = '\0'; + + return (slen); +} #endif diff --git a/lib/libspl/strlcat.c b/lib/libspl/strlcat.c deleted file mode 100644 index a001df7b1..000000000 --- a/lib/libspl/strlcat.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <string.h> -#include <sys/types.h> - -/* - * Appends src to the dstsize buffer at dst. The append will never - * overflow the destination buffer and the buffer will always be null - * terminated. Never reference beyond &dst[dstsize-1] when computing - * the length of the pre-existing string. - */ - -size_t -strlcat(char *dst, const char *src, size_t dstsize) -{ - char *df = dst; - size_t left = dstsize; - size_t l1; - size_t l2 = strlen(src); - size_t copied; - - while (left-- != 0 && *df != '\0') - df++; - l1 = df - dst; - if (dstsize == l1) - return (l1 + l2); - - copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2; - (void) memcpy(dst + l1, src, copied); - dst[l1+copied] = '\0'; - return (l1 + l2); -} diff --git a/lib/libspl/strlcpy.c b/lib/libspl/strlcpy.c deleted file mode 100644 index 2d0daae05..000000000 --- a/lib/libspl/strlcpy.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <string.h> -#include <sys/types.h> - -/* - * Copies src to the dstsize buffer at dst. The copy will never - * overflow the destination buffer and the buffer will always be null - * terminated. - */ - -size_t -strlcpy(char *dst, const char *src, size_t len) -{ - size_t slen = strlen(src); - size_t copied; - - if (len == 0) - return (slen); - - if (slen >= len) - copied = len - 1; - else - copied = slen; - (void) memcpy(dst, src, copied); - dst[copied] = '\0'; - return (slen); -} diff --git a/lib/libspl/strnlen.c b/lib/libspl/strnlen.c deleted file mode 100644 index 9fb8227b9..000000000 --- a/lib/libspl/strnlen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. - * All rights reserved. Use is subject to license terms. - */ - -#include <string.h> -#include <sys/types.h> - -/* - * Returns the number of non-NULL bytes in string argument, - * but not more than maxlen. Does not look past str + maxlen. - */ -size_t -strnlen(const char *str, size_t maxlen) -{ - const char *ptr; - - ptr = memchr(str, 0, maxlen); - if (ptr == NULL) - return (maxlen); - - return (ptr - str); -} |