From: Corinna Vinschen Date: Thu, 28 Jun 2007 17:07:23 +0000 (+0000) Subject: * libc/include/string.h: Add prototypes for stpcpy and stpncpy. X-Git-Tag: preoverlapped~35 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=5d8b97a6942169497ba891acf86725ec87afa60b;p=newlib-cygwin.git * libc/include/string.h: Add prototypes for stpcpy and stpncpy. * libc/string/Makefile.am (ELIX_SOURCES): Add stpcpy.c and stpncpy.c. (CHEWOUT_FILES): Add stpcpy.def and stpncpy.def. * libc/string/Makefile.in: Regenerate. * libc/string/stpcpy.c: New file. * libc/string/stpncpy.c: New file. * libc/string/strings.tex: Add stpcpy and stpncpy. --- diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 7822a6edf..bd610389a 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,14 @@ +2007-06-28 Corinna Vinschen + + * libc/include/string.h: Add prototypes for stpcpy and stpncpy. + * libc/string/Makefile.am (ELIX_SOURCES): Add stpcpy.c and + stpncpy.c. + (CHEWOUT_FILES): Add stpcpy.def and stpncpy.def. + * libc/string/Makefile.in: Regenerate. + * libc/string/stpcpy.c: New file. + * libc/string/stpncpy.c: New file. + * libc/string/strings.tex: Add stpcpy and stpncpy. + 2007-06-27 Eric Blake Support __func__ in assert, as required by C99. diff --git a/newlib/libc/include/string.h b/newlib/libc/include/string.h index c677f6f7b..27c314620 100644 --- a/newlib/libc/include/string.h +++ b/newlib/libc/include/string.h @@ -60,6 +60,8 @@ _PTR _EXFUN(mempcpy,(_PTR, const _PTR, size_t)); extern void *memmem (__const void *, size_t, __const void *, size_t); #endif char *_EXFUN(rindex,(const char *, int)); +char *_EXFUN(stpcpy,(char *, const char *)); +char *_EXFUN(stpncpy,(char *, const char *, size_t)); int _EXFUN(strcasecmp,(const char *, const char *)); char *_EXFUN(strcasestr,(const char *, const char *)); char *_EXFUN(strdup,(const char *)); diff --git a/newlib/libc/string/Makefile.am b/newlib/libc/string/Makefile.am index e0482d82e..94d1868fa 100644 --- a/newlib/libc/string/Makefile.am +++ b/newlib/libc/string/Makefile.am @@ -77,6 +77,8 @@ ELIX_SOURCES = \ bcmp.c \ memccpy.c \ mempcpy.c \ + stpcpy.c \ + stpncpy.c \ strndup.c \ strcasestr.c \ strndup_r.c @@ -105,7 +107,7 @@ index.def rindex.def strcspn.def strpbrk.def swab.def \ memchr.def strcat.def strerror.def strerror_r.def strrchr.def \ memcmp.def strchr.def strlen.def strnlen.def strspn.def \ strcasecmp.def strncasecmp.def strcasestr.def strlwr.def strupr.def \ -memccpy.def mempcpy.def \ +memccpy.def mempcpy.def stpcpy.def stpncpy.def \ wcscat.def wcschr.def wcscmp.def wcscoll.def \ wcscpy.def wcscspn.def \ wcslcat.def wcslcpy.def wcslen.def wcsncat.def \ diff --git a/newlib/libc/string/Makefile.in b/newlib/libc/string/Makefile.in index f5c5bdbe6..8c5406cf0 100644 --- a/newlib/libc/string/Makefile.in +++ b/newlib/libc/string/Makefile.in @@ -90,6 +90,8 @@ am__objects_1 = lib_a-bcopy.$(OBJEXT) lib_a-bzero.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@am__objects_2 = lib_a-bcmp.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@ lib_a-memccpy.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@ lib_a-mempcpy.$(OBJEXT) \ +@ELIX_LEVEL_1_FALSE@ lib_a-stpcpy.$(OBJEXT) \ +@ELIX_LEVEL_1_FALSE@ lib_a-stpncpy.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@ lib_a-strndup.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@ lib_a-strcasestr.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@ lib_a-strndup_r.$(OBJEXT) @@ -100,19 +102,20 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) libstring_la_LIBADD = am__objects_3 = bcopy.lo bzero.lo index.lo memchr.lo memcmp.lo \ memcpy.lo memmove.lo memset.lo rindex.lo strcasecmp.lo \ - strcat.lo strchr.lo strcmp.lo strcoll.lo strcpy.lo strcspn.lo \ - strdup.lo strdup_r.lo strerror.lo strerror_r.lo strlcat.lo \ - strlcpy.lo strlen.lo strlwr.lo strncasecmp.lo strncat.lo \ - strncmp.lo strncpy.lo strnlen.lo strpbrk.lo strrchr.lo \ - strsep.lo strspn.lo strtok.lo strtok_r.lo strupr.lo strxfrm.lo \ - strstr.lo swab.lo u_strerr.lo wcscat.lo wcschr.lo wcscmp.lo \ - wcscoll.lo wcscpy.lo wcscspn.lo wcslcat.lo wcslcpy.lo \ - wcslen.lo wcsncat.lo wcsncmp.lo wcsncpy.lo wcsnlen.lo \ - wcspbrk.lo wcsrchr.lo wcsspn.lo wcsstr.lo wcswidth.lo \ - wcwidth.lo wmemchr.lo wmemcmp.lo wmemcpy.lo wmemmove.lo \ - wmemset.lo + strcat.lo strchr.lo strcmp.lo strcoll.lo strcpy.lo \ + strcspn.lo strdup.lo strdup_r.lo strerror.lo strerror_r.lo \ + strlcat.lo strlcpy.lo strlen.lo strlwr.lo strncasecmp.lo \ + strncat.lo strncmp.lo strncpy.lo strnlen.lo strpbrk.lo \ + strrchr.lo strsep.lo strspn.lo strtok.lo strtok_r.lo \ + strupr.lo strxfrm.lo strstr.lo swab.lo u_strerr.lo wcscat.lo \ + wcschr.lo wcscmp.lo wcscoll.lo wcscpy.lo wcscspn.lo \ + wcslcat.lo wcslcpy.lo wcslen.lo wcsncat.lo wcsncmp.lo \ + wcsncpy.lo wcsnlen.lo wcspbrk.lo wcsrchr.lo wcsspn.lo wcsstr.lo \ + wcswidth.lo wcwidth.lo wmemchr.lo wmemcmp.lo wmemcpy.lo \ + wmemmove.lo wmemset.lo @ELIX_LEVEL_1_FALSE@am__objects_4 = bcmp.lo memccpy.lo mempcpy.lo \ -@ELIX_LEVEL_1_FALSE@ strndup.lo strcasestr.lo strndup_r.lo +@ELIX_LEVEL_1_FALSE@ stpcpy.lo stpncpy.lo strndup.lo \ +@ELIX_LEVEL_1_FALSE@ strcasestr.lo strndup_r.lo @USE_LIBTOOL_TRUE@am_libstring_la_OBJECTS = $(am__objects_3) \ @USE_LIBTOOL_TRUE@ $(am__objects_4) libstring_la_OBJECTS = $(am_libstring_la_OBJECTS) @@ -360,6 +363,8 @@ GENERAL_SOURCES = \ @ELIX_LEVEL_1_FALSE@ELIX_SOURCES = \ @ELIX_LEVEL_1_FALSE@ bcmp.c \ +@ELIX_LEVEL_1_FALSE@ stpcpy.c \ +@ELIX_LEVEL_1_FALSE@ stpncpy.c \ @ELIX_LEVEL_1_FALSE@ memccpy.c \ @ELIX_LEVEL_1_FALSE@ mempcpy.c \ @ELIX_LEVEL_1_FALSE@ strndup.c \ @@ -383,7 +388,7 @@ index.def rindex.def strcspn.def strpbrk.def swab.def \ memchr.def strcat.def strerror.def strerror_r.def strrchr.def \ memcmp.def strchr.def strlen.def strnlen.def strspn.def \ strcasecmp.def strncasecmp.def strcasestr.def strlwr.def strupr.def \ -memccpy.def mempcpy.def \ +memccpy.def mempcpy.def stpcpy.def stpncpy.def \ wcscat.def wcschr.def wcscmp.def wcscoll.def \ wcscpy.def wcscspn.def \ wcslcat.def wcslcpy.def wcslen.def wcsncat.def \ @@ -865,6 +870,18 @@ lib_a-mempcpy.o: mempcpy.c lib_a-mempcpy.obj: mempcpy.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mempcpy.obj `if test -f 'mempcpy.c'; then $(CYGPATH_W) 'mempcpy.c'; else $(CYGPATH_W) '$(srcdir)/mempcpy.c'; fi` +lib_a-stpcpy.o: stpcpy.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-stpcpy.o `test -f 'stpcpy.c' || echo '$(srcdir)/'`stpcpy.c + +lib_a-stpcpy.obj: stpcpy.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-stpcpy.obj `if test -f 'stpcpy.c'; then $(CYGPATH_W) 'stpcpy.c'; else $(CYGPATH_W) '$(srcdir)/stpcpy.c'; fi` + +lib_a-stpncpy.o: stpncpy.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-stpncpy.o `test -f 'stpncpy.c' || echo '$(srcdir)/'`stpncpy.c + +lib_a-stpncpy.obj: stpncpy.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-stpncpy.obj `if test -f 'stpncpy.c'; then $(CYGPATH_W) 'stpncpy.c'; else $(CYGPATH_W) '$(srcdir)/stpncpy.c'; fi` + lib_a-strndup.o: strndup.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strndup.o `test -f 'strndup.c' || echo '$(srcdir)/'`strndup.c diff --git a/newlib/libc/string/stpcpy.c b/newlib/libc/string/stpcpy.c new file mode 100644 index 000000000..62fe79997 --- /dev/null +++ b/newlib/libc/string/stpcpy.c @@ -0,0 +1,91 @@ +/* +FUNCTION + <>---copy string returning a pointer to its end + +INDEX + stpcpy + +ANSI_SYNOPSIS + #include + char *stpcpy(char *<[dst]>, const char *<[src]>); + +TRAD_SYNOPSIS + #include + char *stpcpy(<[dst]>, <[src]>) + char *<[dst]>; + char *<[src]>; + +DESCRIPTION + <> copies the string pointed to by <[src]> + (including the terminating null character) to the array + pointed to by <[dst]>. + +RETURNS + This function returns a pointer to the end of the destination string, + thus pointing to the trailing '\0'. + +PORTABILITY +<> is a GNU extension, candidate for inclusion into POSIX/SUSv4. + +<> requires no supporting OS subroutines. + +QUICKREF + stpcpy gnu +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +char* +_DEFUN (stpcpy, (dst, src), + char *dst _AND + _CONST char *src) +{ +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + long *aligned_dst; + _CONST long *aligned_src; + + /* If SRC or DEST is unaligned, then copy bytes. */ + if (!UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (!DETECTNULL(*aligned_src)) + { + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while ((*dst++ = *src++)) + ; + return --dst; +} diff --git a/newlib/libc/string/stpncpy.c b/newlib/libc/string/stpncpy.c new file mode 100644 index 000000000..fca10d398 --- /dev/null +++ b/newlib/libc/string/stpncpy.c @@ -0,0 +1,114 @@ +/* +FUNCTION + <>---counted copy string returning a pointer to its end + +INDEX + stpncpy + +ANSI_SYNOPSIS + #include + char *stpncpy(char *<[dst]>, const char *<[src]>, size_t <[length]>); + +TRAD_SYNOPSIS + #include + char *stpncpy(<[dst]>, <[src]>, <[length]>) + char *<[dst]>; + char *<[src]>; + size_t <[length]>; + +DESCRIPTION + <> copies not more than <[length]> characters from the + the string pointed to by <[src]> (including the terminating + null character) to the array pointed to by <[dst]>. If the + string pointed to by <[src]> is shorter than <[length]> + characters, null characters are appended to the destination + array until a total of <[length]> characters have been + written. + +RETURNS + This function returns a pointer to the end of the destination string, + thus pointing to the trailing '\0', or, if the destination string is + not null-terminated, pointing to dst + n. + +PORTABILITY +<> is a GNU extension, candidate for inclusion into POSIX/SUSv4. + +<> requires no supporting OS subroutines. + +QUICKREF + stpncpy gnu +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +#define TOO_SMALL(LEN) ((LEN) < sizeof (long)) + +char * +_DEFUN (stpncpy, (dst, src), + char *dst _AND + _CONST char *src _AND + size_t count) +{ + char *ret = NULL; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + long *aligned_dst; + _CONST long *aligned_src; + + /* If SRC and DEST is aligned and count large enough, then copy words. */ + if (!UNALIGNED (src, dst) && !TOO_SMALL (count)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (count >= sizeof (long int) && !DETECTNULL(*aligned_src)) + { + count -= sizeof (long int); + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (count > 0) + { + --count; + if ((*dst++ = *src++) == '\0') + { + ret = dst - 1; + break; + } + } + + while (count-- > 0) + *dst++ = '\0'; + + return ret ? ret : dst; +} diff --git a/newlib/libc/string/strings.tex b/newlib/libc/string/strings.tex index 5d43fd56b..5ba6e0fe5 100644 --- a/newlib/libc/string/strings.tex +++ b/newlib/libc/string/strings.tex @@ -18,6 +18,8 @@ managing areas of memory. The corresponding declarations are in * mempcpy:: Copy memory regions and locate end * memset:: Set an area of memory * rindex:: Reverse search for character in string +* stpcpy:: Copy string returning a pointer to its end +* stpncpy:: Counted copy string returning a pointer to its end * strcasecmp:: Compare strings ignoring case * strcasestr:: Find string segment ignoring case * strcat:: Concatenate strings @@ -81,6 +83,12 @@ managing areas of memory. The corresponding declarations are in @page @include string/rindex.def +@page +@include string/stpcpy.def + +@page +@include string/stpncpy.def + @page @include string/strcasecmp.def