libc: Add strchrnul(), a glibc extension
authorFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 3 Mar 2013 19:04:26 +0000 (20:04 +0100)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Mon, 4 Mar 2013 10:51:31 +0000 (11:51 +0100)
* This function behaves like strchr() but returns a pointer to the
  terminating \0 byte of the string instead of NULL if the character
  was not found

* It was first implemented in glibc-2.1.1

Obtained-from: FreeBSD

include/string.h
lib/libc/string/Makefile.inc
lib/libc/string/strchr.3
lib/libc/string/strchrnul.c [new file with mode: 0644]

index f6cd927..71cd7eb 100644 (file)
@@ -79,6 +79,7 @@ char    *stpncpy(char * __restrict, const char * __restrict, size_t);
 #endif
 #if __BSD_VISIBLE
 char   *strcasestr(const char *, const char *) __pure;
+char   *strchrnul(const char *, int) __pure;
 #endif
 #if !defined(_KERNEL_VIRTUAL)
 char   *strcat(char * __restrict, const char * __restrict);
index 5ec2e77..84649f1 100644 (file)
@@ -11,7 +11,8 @@ MISRCS+=bcmp.c bcopy.c bzero.c ffs.c ffsl.c ffsll.c fls.c flsl.c flsll.c \
        index.c memccpy.c memchr.c memrchr.c memcmp.c \
        memcpy.c memmem.c memmove.c mempcpy.c memset.c rindex.c stpcpy.c \
        stpncpy.c \
-       strcasecmp.c strcat.c strcasestr.c strchr.c strcmp.c strcoll.c \
+       strcasecmp.c strcat.c strcasestr.c strchr.c strchrnul.c \
+       strcmp.c strcoll.c \
        strcpy.c strcspn.c strdup.c strerror.c strlcat.c strlcpy.c strlen.c \
        strmode.c strncat.c strncmp.c strncpy.c strndup.c strnlen.c strnstr.c \
        strpbrk.c strrchr.c strsep.c strsignal.c strspn.c strstr.c strtok.c \
@@ -48,7 +49,8 @@ MLINKS+=memchr.3 memrchr.3
 MLINKS+=memcpy.3 mempcpy.3
 MLINKS+=strcasecmp.3 strncasecmp.3
 MLINKS+=strcat.3 strncat.3
-MLINKS+=strchr.3 strrchr.3
+MLINKS+=strchr.3 strrchr.3 \
+       strchr.3 strchrnul.3
 MLINKS+=strcmp.3 strncmp.3
 MLINKS+=strcpy.3 stpcpy.3 \
        strcpy.3 stpncpy.3 \
index 9834329..e56868f 100644 (file)
 .\"
 .\"     @(#)strchr.3   8.2 (Berkeley) 4/19/94
 .\" $FreeBSD: src/lib/libc/string/strchr.3,v 1.13 2007/01/09 00:28:12 imp Exp $
-.\" $DragonFly: src/lib/libc/string/strchr.3,v 1.2 2003/06/17 04:26:46 dillon Exp $
 .\"
-.Dd April 19, 1994
+.Dd March 3, 2013
 .Dt STRCHR 3
 .Os
 .Sh NAME
 .Nm strchr ,
-.Nm strrchr
+.Nm strrchr ,
+.Nm strrchrnul
 .Nd locate character in string
 .Sh LIBRARY
 .Lb libc
@@ -48,6 +48,8 @@
 .Fn strchr "const char *s" "int c"
 .Ft "char *"
 .Fn strrchr "const char *s" "int c"
+.Ft "char *"
+.Fn strchrnul "const char *s" "int c"
 .Sh DESCRIPTION
 The
 .Fn strchr
@@ -57,7 +59,7 @@ function locates the first occurrence of
 .Vt char )
 in the string pointed to by
 .Fa s .
-The terminating null character is considered part of the string;
+The terminating nul character is considered part of the string;
 therefore if
 .Fa c
 is
@@ -71,6 +73,17 @@ function is identical to
 .Fn strchr
 except it locates the last occurrence of
 .Fa c .
+.Pp
+.Fn strchrnul
+is identical to
+.Fn strchr
+except that it returns a pointer to the nul character at the end of
+.Fa s
+instead of
+.Dv NULL
+if the 
+.Fa c
+character is not found.
 .Sh RETURN VALUES
 The functions
 .Fn strchr
@@ -79,6 +92,13 @@ and
 return a pointer to the located character, or
 .Dv NULL
 if the character does not appear in the string.
+.Fn strchrnul
+returns a pointer to the located character, or to the terminating nul
+character at the end of
+.Fa s
+if
+.Fa c
+is not found in the string.
 .Sh SEE ALSO
 .Xr memchr 3 ,
 .Xr memmem 3 ,
@@ -95,3 +115,7 @@ and
 .Fn strrchr
 conform to
 .St -isoC .
+.Pp
+The
+.Fn strchrnul
+function first appeared in glibc 2.1.1
diff --git a/lib/libc/string/strchrnul.c b/lib/libc/string/strchrnul.c
new file mode 100644 (file)
index 0000000..a1a6719
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2013 Niclas Zeising
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/libc/string/strchrnul.c,v 1.1 2013/02/14 01:18:03 svnexp Exp $
+ */
+
+#include <string.h>
+
+char *
+strchrnul(const char *p, int ch)
+{
+       char c;
+
+       c = ch;
+       for (;; ++p) {
+               if (*p == c || *p == '\0')
+                       return ((char *)p);
+       }
+       /* NOTREACHED */
+}