diff options
Diffstat (limited to 'string')
148 files changed, 0 insertions, 20537 deletions
diff --git a/string/Depend b/string/Depend deleted file mode 100644 index f3e1156a4e..0000000000 --- a/string/Depend +++ /dev/null @@ -1 +0,0 @@ -localedata diff --git a/string/Makefile b/string/Makefile deleted file mode 100644 index f317d02a8c..0000000000 --- a/string/Makefile +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (C) 1991-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. - -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. - -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. - -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -# -# Sub-makefile for string portion of library. -# -subdir := string - -include ../Makeconfig - -headers := string.h strings.h memory.h endian.h bits/endian.h \ - argz.h envz.h byteswap.h bits/byteswap.h bits/byteswap-16.h \ - bits/string.h bits/string2.h bits/string3.h \ - bits/strings_fortified.h bits/uintn-identity.h - -routines := strcat strchr strcmp strcoll strcpy strcspn \ - strverscmp strdup strndup \ - strerror _strerror strlen strnlen \ - strncat strncmp strncpy \ - strrchr strpbrk strsignal strspn strstr strtok \ - strtok_r strxfrm memchr memcmp memmove memset \ - mempcpy bcopy bzero ffs ffsll stpcpy stpncpy \ - strcasecmp strncase strcasecmp_l strncase_l \ - memccpy memcpy wordcopy strsep strcasestr \ - swab strfry memfrob memmem rawmemchr strchrnul \ - $(addprefix argz-,append count create ctsep next \ - delete extract insert stringify \ - addsep replace) \ - envz basename \ - strcoll_l strxfrm_l string-inlines memrchr \ - xpg-strerror strerror_l explicit_bzero - -strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ - stpcpy stpncpy strcat strchr strcmp strcpy strcspn \ - strlen strncmp strncpy strpbrk strrchr strspn memmem \ - strstr strcasestr strnlen strcasecmp strncasecmp \ - strncat rawmemchr strchrnul bcopy bzero memrchr \ - explicit_bzero -tests := tester inl-tester noinl-tester testcopy test-ffs \ - tst-strlen stratcliff tst-svc tst-inlcall \ - bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \ - tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \ - bug-strtok1 $(addprefix test-,$(strop-tests)) \ - bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \ - tst-strtok_r bug-strcoll2 tst-cmp tst-xbzero-opt \ - test-endian-types - -# This test allocates a lot of memory and can run for a long time. -xtests = tst-strcoll-overflow - -ifeq ($(run-built-tests),yes) -tests-special += $(objpfx)tst-svc-cmp.out -endif - -include ../Rules - -CFLAGS-inl-tester.c = -fno-builtin -CFLAGS-noinl-tester.c = -fno-builtin -CFLAGS-tst-strlen.c = -fno-builtin -CFLAGS-stratcliff.c = -fno-builtin -CFLAGS-test-ffs.c = -fno-builtin -CFLAGS-tst-inlcall.c = -fno-builtin -CFLAGS-tst-xbzero-opt.c = -O3 -# BZ 21006: Resolve all functions but at least explicit_bzero at startup. -# Otherwise the test fails on s390x as the memcpy in prepare_test_buffer is -# done by loading r4 / r5 with the test_pattern and using store multiple -# instruction to store r4 / r5 to buf. If explicit_bzero would be resolved in -# setup_explicit_clear, r4 / r5 would be stored to stack by _dl_runtime_resolve -# and the call to memmem in count_test_patterns will find a hit of the -# test_pattern on the stack. -LDFLAGS-tst-xbzero-opt = -z now - -# Called during TLS initialization. -CFLAGS-memcpy.c = $(no-stack-protector) -CFLAGS-wordcopy.c = $(no-stack-protector) - -ifeq ($(run-built-tests),yes) -$(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out - cmp $^ > $@; \ - $(evaluate-test) - -LOCALES := de_DE.UTF-8 en_US.ISO-8859-1 en_US.UTF-8 \ - tr_TR.ISO-8859-9 tr_TR.UTF-8 cs_CZ.UTF-8 \ - da_DK.ISO-8859-1 en_GB.UTF-8 -include ../gen-locales.mk - -$(objpfx)test-strcasecmp.out: $(gen-locales) -$(objpfx)test-strncasecmp.out: $(gen-locales) -$(objpfx)tst-strxfrm.out: $(gen-locales) -$(objpfx)tst-strxfrm2.out: $(gen-locales) -# bug-strcoll2 needs cs_CZ.UTF-8 and da_DK.ISO-8859-1. -$(objpfx)bug-strcoll2.out: $(gen-locales) -$(objpfx)tst-strcoll-overflow.out: $(gen-locales) - -endif diff --git a/string/Versions b/string/Versions deleted file mode 100644 index 9b709d12a9..0000000000 --- a/string/Versions +++ /dev/null @@ -1,88 +0,0 @@ -libc { - GLIBC_2.0 { - # functions with required interface outside normal name space - __argz_count; __argz_stringify; __argz_next; - - # functions used in inline functions or macros - __bzero; __strtok_r; - - # functions used in other libraries - __ffs; __mempcpy; __stpncpy; __stpcpy; __strcasecmp; __strdup; - __strerror_r; - - # a* - argz_add; argz_add_sep; argz_append; argz_count; argz_create; - argz_create_sep; argz_delete; argz_extract; argz_insert; argz_next; - argz_replace; argz_stringify; - - # b* - basename; bcmp; bcopy; bzero; - - # e* - envz_add; envz_entry; envz_get; envz_merge; envz_remove; - envz_strip; - - # f* - ffs; - - # i* - index; - - # m* - memccpy; memchr; memcmp; memcpy; memfrob; memmem; memmove; memset; - - # r* - rindex; - - # s* - stpcpy; stpncpy; strcasecmp; strcat; strchr; strcmp; strcoll; strcpy; - strcspn; strdup; strerror; strerror_r; strfry; strlen; strncasecmp; - strncat; strncmp; strncpy; strndup; strnlen; strpbrk; strrchr; strsep; - strsignal; strspn; strstr; strtok; strtok_r; strxfrm; swab; - } - GLIBC_2.1 { - # functions used in macros and other libraries - __rawmemchr; __strcasestr; - - # f* - ffsl; ffsll; - - # m* - mempcpy; - - # r* - rawmemchr; - - # s* - strcasestr; strverscmp; - } - GLIBC_2.1.1 { - # extern inline functions used by <bits/string2.h> - __mempcpy_small; __stpcpy_small; __strcspn_c1; __strcspn_c2; __strcspn_c3; - __strcpy_small; __strspn_c1; __strspn_c2; __strspn_c3; __strpbrk_c2; - __strpbrk_c3; __strsep_1c; __strsep_2c; __strsep_3c; __strsep_g; - __strtok_r_1c; - - # s* - strchrnul; __strverscmp; - } - GLIBC_2.2 { - # functions used in macros. - __strndup; - - # m* - memrchr; - } - GLIBC_2.3.4 { - # x* - __xpg_strerror_r; - } - GLIBC_2.6 { - strerror_l; - } - GLIBC_2.24 { - } - GLIBC_2.25 { - explicit_bzero; - } -} diff --git a/string/_strerror.c b/string/_strerror.c deleted file mode 100644 index 4d3a52d906..0000000000 --- a/string/_strerror.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <libintl.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/param.h> -#include <_itoa.h> - -/* It is critical here that we always use the `dcgettext' function for - the message translation. Since <libintl.h> only defines the macro - `dgettext' to use `dcgettext' for optimizing programs this is not - always guaranteed. */ -#ifndef dgettext -# include <locale.h> /* We need LC_MESSAGES. */ -# define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES) -#endif - -/* Return a string describing the errno code in ERRNUM. */ -char * -__strerror_r (int errnum, char *buf, size_t buflen) -{ - if (__builtin_expect (errnum < 0 || errnum >= _sys_nerr_internal - || _sys_errlist_internal[errnum] == NULL, 0)) - { - /* Buffer we use to print the number in. For a maximum size for - `int' of 8 bytes we never need more than 20 digits. */ - char numbuf[21]; - const char *unk = _("Unknown error "); - size_t unklen = strlen (unk); - char *p, *q; - bool negative = errnum < 0; - - numbuf[20] = '\0'; - p = _itoa_word (abs (errnum), &numbuf[20], 10, 0); - - /* Now construct the result while taking care for the destination - buffer size. */ - q = __mempcpy (buf, unk, MIN (unklen, buflen)); - if (negative && unklen < buflen) - { - *q++ = '-'; - ++unklen; - } - if (unklen < buflen) - memcpy (q, p, MIN ((size_t) (&numbuf[21] - p), buflen - unklen)); - - /* Terminate the string in any case. */ - if (buflen > 0) - buf[buflen - 1] = '\0'; - - return buf; - } - - return (char *) _(_sys_errlist_internal[errnum]); -} -weak_alias (__strerror_r, strerror_r) -libc_hidden_def (__strerror_r) diff --git a/string/argz-addsep.c b/string/argz-addsep.c deleted file mode 100644 index eab6d3ef17..0000000000 --- a/string/argz-addsep.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> - - -error_t -__argz_add_sep (char **argz, size_t *argz_len, const char *string, int delim) -{ - size_t nlen = strlen (string) + 1; - - if (nlen > 1) - { - const char *rp; - char *wp; - - *argz = (char *) realloc (*argz, *argz_len + nlen); - if (*argz == NULL) - return ENOMEM; - - wp = *argz + *argz_len; - rp = string; - do - if (*rp == delim) - { - if (wp > *argz && wp[-1] != '\0') - *wp++ = '\0'; - else - --nlen; - } - else - *wp++ = *rp; - while (*rp++ != '\0'); - - *argz_len += nlen; - } - - return 0; -} -weak_alias (__argz_add_sep, argz_add_sep) diff --git a/string/argz-append.c b/string/argz-append.c deleted file mode 100644 index 09015016e6..0000000000 --- a/string/argz-append.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.ai.mit.edu> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <string.h> -#include <stdlib.h> - -/* Add BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */ -error_t -__argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len) -{ - size_t new_argz_len = *argz_len + buf_len; - char *new_argz = realloc (*argz, new_argz_len); - if (new_argz) - { - memcpy (new_argz + *argz_len, buf, buf_len); - *argz = new_argz; - *argz_len = new_argz_len; - return 0; - } - else - return ENOMEM; -} -weak_alias (__argz_append, argz_append) - -/* Add STR to the argz vector in ARGZ & ARGZ_LEN. This should be moved into - argz.c in libshouldbelibc. */ -error_t -__argz_add (char **argz, size_t *argz_len, const char *str) -{ - return __argz_append (argz, argz_len, str, strlen (str) + 1); -} -weak_alias (__argz_add, argz_add) diff --git a/string/argz-count.c b/string/argz-count.c deleted file mode 100644 index 64e2e69b12..0000000000 --- a/string/argz-count.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.ai.mit.edu> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <string.h> - -/* Returns the number of strings in ARGZ. */ -size_t -__argz_count (const char *argz, size_t len) -{ - size_t count = 0; - while (len > 0) - { - size_t part_len = strlen(argz); - argz += part_len + 1; - len -= part_len + 1; - count++; - } - return count; -} -libc_hidden_def (__argz_count) -weak_alias (__argz_count, argz_count) diff --git a/string/argz-create.c b/string/argz-create.c deleted file mode 100644 index f7d429b5b6..0000000000 --- a/string/argz-create.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.ai.mit.edu> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <stdlib.h> -#include <string.h> - -/* Make a '\0' separated arg vector from a unix argv vector, returning it in - ARGZ, and the total length in LEN. If a memory allocation error occurs, - ENOMEM is returned, otherwise 0. */ -error_t -__argz_create (char *const argv[], char **argz, size_t *len) -{ - int argc; - size_t tlen = 0; - char *const *ap; - char *p; - - for (argc = 0; argv[argc] != NULL; ++argc) - tlen += strlen (argv[argc]) + 1; - - if (tlen == 0) - *argz = NULL; - else - { - *argz = malloc (tlen); - if (*argz == NULL) - return ENOMEM; - - for (p = *argz, ap = argv; *ap; ++ap, ++p) - p = __stpcpy (p, *ap); - } - *len = tlen; - - return 0; -} -weak_alias (__argz_create, argz_create) diff --git a/string/argz-ctsep.c b/string/argz-ctsep.c deleted file mode 100644 index 7fc1511a4b..0000000000 --- a/string/argz-ctsep.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> - - -error_t -__argz_create_sep (const char *string, int delim, char **argz, size_t *len) -{ - size_t nlen = strlen (string) + 1; - - if (nlen > 1) - { - const char *rp; - char *wp; - - *argz = (char *) malloc (nlen); - if (*argz == NULL) - return ENOMEM; - - rp = string; - wp = *argz; - do - if (*rp == delim) - { - if (wp > *argz && wp[-1] != '\0') - *wp++ = '\0'; - else - --nlen; - } - else - *wp++ = *rp; - while (*rp++ != '\0'); - - if (nlen == 0) - { - free (*argz); - *argz = NULL; - *len = 0; - } - - *len = nlen; - } - else - { - *argz = NULL; - *len = 0; - } - - return 0; -} -weak_alias (__argz_create_sep, argz_create_sep) diff --git a/string/argz-delete.c b/string/argz-delete.c deleted file mode 100644 index 183ac0d43c..0000000000 --- a/string/argz-delete.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.org> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <string.h> -#include <stdlib.h> - -/* Delete ENTRY from ARGZ & ARGZ_LEN, if any. */ -void -argz_delete (char **argz, size_t *argz_len, char *entry) -{ - if (entry) - /* Get rid of the old value for NAME. */ - { - size_t entry_len = strlen (entry) + 1; - *argz_len -= entry_len; - memmove (entry, entry + entry_len, *argz_len - (entry - *argz)); - if (*argz_len == 0) - { - free (*argz); - *argz = 0; - } - } -} -libc_hidden_def (argz_delete) diff --git a/string/argz-extract.c b/string/argz-extract.c deleted file mode 100644 index 13345e894f..0000000000 --- a/string/argz-extract.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.org> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> - -/* Puts pointers to each string in ARGZ, plus a terminating 0 element, into - ARGV, which must be large enough to hold them all. */ -void -__argz_extract (const char *argz, size_t len, char **argv) -{ - while (len > 0) - { - size_t part_len = strlen (argz); - *argv++ = (char *) argz; - argz += part_len + 1; - len -= part_len + 1; - } - *argv = 0; -} -weak_alias (__argz_extract, argz_extract) diff --git a/string/argz-insert.c b/string/argz-insert.c deleted file mode 100644 index e4c78407ff..0000000000 --- a/string/argz-insert.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.ai.mit.edu> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <string.h> -#include <stdlib.h> - -/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an - existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end. - Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN, - ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not - in ARGZ, EINVAL is returned, else if memory can't be allocated for the new - ARGZ, ENOMEM is returned, else 0. */ -error_t -__argz_insert (char **argz, size_t *argz_len, char *before, const char *entry) -{ - if (! before) - return __argz_add (argz, argz_len, entry); - - if (before < *argz || before >= *argz + *argz_len) - return EINVAL; - - if (before > *argz) - /* Make sure before is actually the beginning of an entry. */ - while (before[-1]) - before--; - - { - size_t after_before = *argz_len - (before - *argz); - size_t entry_len = strlen (entry) + 1; - size_t new_argz_len = *argz_len + entry_len; - char *new_argz = realloc (*argz, new_argz_len); - - if (new_argz) - { - before = new_argz + (before - *argz); - memmove (before + entry_len, before, after_before); - memmove (before, entry, entry_len); - *argz = new_argz; - *argz_len = new_argz_len; - return 0; - } - else - return ENOMEM; - } -} -weak_alias (__argz_insert, argz_insert) diff --git a/string/argz-next.c b/string/argz-next.c deleted file mode 100644 index 9c2fa33cc2..0000000000 --- a/string/argz-next.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Iterate through the elements of an argz block. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.org> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <string.h> - -char * -__argz_next (const char *argz, size_t argz_len, const char *entry) -{ - if (entry) - { - if (entry < argz + argz_len) - entry = strchr (entry, '\0') + 1; - - return entry >= argz + argz_len ? NULL : (char *) entry; - } - else - if (argz_len > 0) - return (char *) argz; - else - return NULL; -} -weak_alias (__argz_next, argz_next) diff --git a/string/argz-replace.c b/string/argz-replace.c deleted file mode 100644 index 6464e9bdbb..0000000000 --- a/string/argz-replace.c +++ /dev/null @@ -1,134 +0,0 @@ -/* String replacement in an argz vector - Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.ai.mit.edu> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include <string.h> -#include <argz.h> - -/* Append BUF, of length BUF_LEN to *TO, of length *TO_LEN, reallocating and - updating *TO & *TO_LEN appropriately. If an allocation error occurs, - *TO's old value is freed, and *TO is set to 0. */ -static void -str_append (char **to, size_t *to_len, const char *buf, const size_t buf_len) -{ - size_t new_len = *to_len + buf_len; - char *new_to = realloc (*to, new_len + 1); - - if (new_to) - { - *((char *) __mempcpy (new_to + *to_len, buf, buf_len)) = '\0'; - *to = new_to; - *to_len = new_len; - } - else - { - free (*to); - *to = 0; - } -} - -/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating - ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be - incremented by number of replacements performed. */ -error_t -__argz_replace (char **argz, size_t *argz_len, const char *str, const char *with, - unsigned *replace_count) -{ - error_t err = 0; - - if (str && *str) - { - char *arg = 0; - char *src = *argz; - size_t src_len = *argz_len; - char *dst = 0; - size_t dst_len = 0; - int delayed_copy = 1; /* True while we've avoided copying anything. */ - size_t str_len = strlen (str), with_len = strlen (with); - - while (!err && (arg = argz_next (src, src_len, arg))) - { - char *match = strstr (arg, str); - if (match) - { - char *from = match + str_len; - size_t to_len = match - arg; - char *to = __strndup (arg, to_len); - - while (to && from) - { - str_append (&to, &to_len, with, with_len); - if (to) - { - match = strstr (from, str); - if (match) - { - str_append (&to, &to_len, from, match - from); - from = match + str_len; - } - else - { - str_append (&to, &to_len, from, strlen (from)); - from = 0; - } - } - } - - if (to) - { - if (delayed_copy) - /* We avoided copying SRC to DST until we found a match; - now that we've done so, copy everything from the start - of SRC. */ - { - if (arg > src) - err = __argz_append (&dst, &dst_len, src, (arg - src)); - delayed_copy = 0; - } - if (! err) - err = __argz_add (&dst, &dst_len, to); - free (to); - } - else - err = ENOMEM; - - if (replace_count) - (*replace_count)++; - } - else if (! delayed_copy) - err = __argz_add (&dst, &dst_len, arg); - } - - if (! err) - { - if (! delayed_copy) - /* We never found any instances of str. */ - { - free (src); - *argz = dst; - *argz_len = dst_len; - } - } - else if (dst_len > 0) - free (dst); - } - - return err; -} -weak_alias (__argz_replace, argz_replace) diff --git a/string/argz-stringify.c b/string/argz-stringify.c deleted file mode 100644 index 5499264d38..0000000000 --- a/string/argz-stringify.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.org> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <argz.h> -#include <string.h> - -/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's - except the last into the character SEP. */ -void -__argz_stringify (char *argz, size_t len, int sep) -{ - if (len > 0) - while (1) - { - size_t part_len = __strnlen (argz, len); - argz += part_len; - len -= part_len; - if (len-- <= 1) /* includes final '\0' we want to stop at */ - break; - *argz++ = sep; - } -} -libc_hidden_def (__argz_stringify) -weak_alias (__argz_stringify, argz_stringify) diff --git a/string/argz.h b/string/argz.h deleted file mode 100644 index f9d0ac9950..0000000000 --- a/string/argz.h +++ /dev/null @@ -1,182 +0,0 @@ -/* Routines for dealing with '\0' separated arg vectors. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _ARGZ_H -#define _ARGZ_H 1 - -#include <features.h> - -#define __need_error_t -#include <errno.h> -#include <string.h> /* Need size_t, and strchr is called below. */ - -#ifndef __error_t_defined -typedef int error_t; -#endif - - -__BEGIN_DECLS - -/* Make a '\0' separated arg vector from a unix argv vector, returning it in - ARGZ, and the total length in LEN. If a memory allocation error occurs, - ENOMEM is returned, otherwise 0. The result can be destroyed using free. */ -extern error_t __argz_create (char *const __argv[], char **__restrict __argz, - size_t *__restrict __len) __THROW; -extern error_t argz_create (char *const __argv[], char **__restrict __argz, - size_t *__restrict __len) __THROW; - -/* Make a '\0' separated arg vector from a SEP separated list in - STRING, returning it in ARGZ, and the total length in LEN. If a - memory allocation error occurs, ENOMEM is returned, otherwise 0. - The result can be destroyed using free. */ -extern error_t __argz_create_sep (const char *__restrict __string, - int __sep, char **__restrict __argz, - size_t *__restrict __len) __THROW; -extern error_t argz_create_sep (const char *__restrict __string, - int __sep, char **__restrict __argz, - size_t *__restrict __len) __THROW; - -/* Returns the number of strings in ARGZ. */ -extern size_t __argz_count (const char *__argz, size_t __len) - __THROW __attribute_pure__; -extern size_t argz_count (const char *__argz, size_t __len) - __THROW __attribute_pure__; - -/* Puts pointers to each string in ARGZ into ARGV, which must be large enough - to hold them all. */ -extern void __argz_extract (const char *__restrict __argz, size_t __len, - char **__restrict __argv) __THROW; -extern void argz_extract (const char *__restrict __argz, size_t __len, - char **__restrict __argv) __THROW; - -/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's - except the last into the character SEP. */ -extern void __argz_stringify (char *__argz, size_t __len, int __sep) __THROW; -extern void argz_stringify (char *__argz, size_t __len, int __sep) __THROW; - -/* Append BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */ -extern error_t __argz_append (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __buf, size_t __buf_len) - __THROW; -extern error_t argz_append (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __buf, size_t __buf_len) - __THROW; - -/* Append STR to the argz vector in ARGZ & ARGZ_LEN. */ -extern error_t __argz_add (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __str) __THROW; -extern error_t argz_add (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __str) __THROW; - -/* Append SEP separated list in STRING to the argz vector in ARGZ & - ARGZ_LEN. */ -extern error_t __argz_add_sep (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __string, int __delim) - __THROW; -extern error_t argz_add_sep (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __string, int __delim) - __THROW; - -/* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there. */ -extern void __argz_delete (char **__restrict __argz, - size_t *__restrict __argz_len, - char *__restrict __entry) __THROW; -extern void argz_delete (char **__restrict __argz, - size_t *__restrict __argz_len, - char *__restrict __entry) __THROW; - -/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an - existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end. - Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN, - ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not - in ARGZ, EINVAL is returned, else if memory can't be allocated for the new - ARGZ, ENOMEM is returned, else 0. */ -extern error_t __argz_insert (char **__restrict __argz, - size_t *__restrict __argz_len, - char *__restrict __before, - const char *__restrict __entry) __THROW; -extern error_t argz_insert (char **__restrict __argz, - size_t *__restrict __argz_len, - char *__restrict __before, - const char *__restrict __entry) __THROW; - -/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating - ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be - incremented by number of replacements performed. */ -extern error_t __argz_replace (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __str, - const char *__restrict __with, - unsigned int *__restrict __replace_count); -extern error_t argz_replace (char **__restrict __argz, - size_t *__restrict __argz_len, - const char *__restrict __str, - const char *__restrict __with, - unsigned int *__restrict __replace_count); - -/* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there - are no more. If entry is NULL, then the first entry is returned. This - behavior allows two convenient iteration styles: - - char *entry = 0; - while ((entry = argz_next (argz, argz_len, entry))) - ...; - - or - - char *entry; - for (entry = argz; entry; entry = argz_next (argz, argz_len, entry)) - ...; -*/ -extern char *__argz_next (const char *__restrict __argz, size_t __argz_len, - const char *__restrict __entry) __THROW; -extern char *argz_next (const char *__restrict __argz, size_t __argz_len, - const char *__restrict __entry) __THROW; - -#ifdef __USE_EXTERN_INLINES -__extern_inline char * -__NTH (__argz_next (const char *__argz, size_t __argz_len, - const char *__entry)) -{ - if (__entry) - { - if (__entry < __argz + __argz_len) - __entry = strchr (__entry, '\0') + 1; - - return __entry >= __argz + __argz_len ? (char *) NULL : (char *) __entry; - } - else - return __argz_len > 0 ? (char *) __argz : 0; -} -__extern_inline char * -__NTH (argz_next (const char *__argz, size_t __argz_len, - const char *__entry)) -{ - return __argz_next (__argz, __argz_len, __entry); -} -#endif /* Use extern inlines. */ - -__END_DECLS - -#endif /* argz.h */ diff --git a/string/basename.c b/string/basename.c deleted file mode 100644 index 0f379680b7..0000000000 --- a/string/basename.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Return the name-within-directory of a file name. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -char * -__basename (const char *filename) -{ - char *p = strrchr (filename, '/'); - return p ? p + 1 : (char *) filename; -} -libc_hidden_def (__basename) -weak_alias (__basename, basename) -libc_hidden_weak (basename) diff --git a/string/bcopy.c b/string/bcopy.c deleted file mode 100644 index 24fe494fec..0000000000 --- a/string/bcopy.c +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -void -bcopy (const void *src, void *dest, size_t len) -{ - memmove (dest, src, len); -} diff --git a/string/bits/string2.h b/string/bits/string2.h deleted file mode 100644 index 6a26e2bc68..0000000000 --- a/string/bits/string2.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Machine-independant string function optimizations. - Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _STRING_H -# error "Never use <bits/string2.h> directly; include <string.h> instead." -#endif - -#ifndef __NO_STRING_INLINES - -/* Unlike the definitions in the header <bits/string.h> the - definitions contained here are not optimized down to assembler - level. Those optimizations are not always a good idea since this - means the code size increases a lot. Instead the definitions here - optimize some functions in a way which do not dramatically - increase the code size and which do not use assembler. The main - trick is to use GCC's `__builtin_constant_p' function. - - Every function XXX which has a defined version in - <bits/string.h> must be accompanied by a symbol _HAVE_STRING_ARCH_XXX - to make sure we don't get redefinitions. - - We must use here macros instead of inline functions since the - trick won't work with the latter. */ - -#ifndef __STRING_INLINE -# ifdef __cplusplus -# define __STRING_INLINE inline -# else -# define __STRING_INLINE __extern_inline -# endif -#endif - -/* Dereferencing a pointer arg to run sizeof on it fails for the void - pointer case, so we use this instead. - Note that __x is evaluated twice. */ -#define __string2_1bptr_p(__x) \ - ((size_t)(const void *)((__x) + 1) - (size_t)(const void *)(__x) == 1) - -/* Set N bytes of S to 0. */ -#if !defined _HAVE_STRING_ARCH_memset -# define __bzero(s, n) __builtin_memset (s, '\0', n) -#endif - - -/* Copy SRC to DEST, returning pointer to final NUL byte. */ -#ifdef __USE_GNU -# ifndef _HAVE_STRING_ARCH_stpcpy -# define __stpcpy(dest, src) __builtin_stpcpy (dest, src) -/* In glibc we use this function frequently but for namespace reasons - we have to use the name `__stpcpy'. */ -# define stpcpy(dest, src) __stpcpy (dest, src) -# endif -#endif - - -/* Copy no more than N characters of SRC to DEST. */ -#ifndef _HAVE_STRING_ARCH_strncpy -# define strncpy(dest, src, n) __builtin_strncpy (dest, src, n) -#endif - - -/* Append no more than N characters from SRC onto DEST. */ -#ifndef _HAVE_STRING_ARCH_strncat -# ifdef _USE_STRING_ARCH_strchr -# define strncat(dest, src, n) \ - (__extension__ ({ char *__dest = (dest); \ - __builtin_constant_p (src) && __builtin_constant_p (n) \ - ? (strlen (src) < ((size_t) (n)) \ - ? strcat (__dest, src) \ - : (*((char *) __mempcpy (strchr (__dest, '\0'), \ - src, n)) = '\0', __dest)) \ - : strncat (dest, src, n); })) -# else -# define strncat(dest, src, n) __builtin_strncat (dest, src, n) -# endif -#endif - - -/* Return the length of the initial segment of S which - consists entirely of characters not in REJECT. */ -#ifndef _HAVE_STRING_ARCH_strcspn -# define strcspn(s, reject) __builtin_strcspn (s, reject) -#endif - - -/* Return the length of the initial segment of S which - consists entirely of characters in ACCEPT. */ -#ifndef _HAVE_STRING_ARCH_strspn -# define strspn(s, accept) __builtin_strspn (s, accept) -#endif - - -/* Find the first occurrence in S of any character in ACCEPT. */ -#ifndef _HAVE_STRING_ARCH_strpbrk -# define strpbrk(s, accept) __builtin_strpbrk (s, accept) -#endif - - -#ifndef _FORCE_INLINES -# undef __STRING_INLINE -#endif - -#endif /* No string inlines. */ diff --git a/string/bits/string3.h b/string/bits/string3.h deleted file mode 100644 index 738226d49b..0000000000 --- a/string/bits/string3.h +++ /dev/null @@ -1,156 +0,0 @@ -/* Copyright (C) 2004-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _STRING_H -# error "Never use <bits/string3.h> directly; include <string.h> instead." -#endif - -#if !__GNUC_PREREQ (5,0) -__warndecl (__warn_memset_zero_len, - "memset used with constant zero length parameter; this could be due to transposed parameters"); -#endif - -#ifndef __cplusplus -/* XXX This is temporarily. We should not redefine any of the symbols - and instead integrate the error checking into the original - definitions. */ -# undef memcpy -# undef memmove -# undef memset -# undef strcat -# undef strcpy -# undef strncat -# undef strncpy -# ifdef __USE_GNU -# undef mempcpy -# undef stpcpy -# endif -# ifdef __USE_MISC -# undef bcopy -# undef bzero -# endif -#endif - - -__fortify_function void * -__NTH (memcpy (void *__restrict __dest, const void *__restrict __src, - size_t __len)) -{ - return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); -} - -__fortify_function void * -__NTH (memmove (void *__dest, const void *__src, size_t __len)) -{ - return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); -} - -#ifdef __USE_GNU -__fortify_function void * -__NTH (mempcpy (void *__restrict __dest, const void *__restrict __src, - size_t __len)) -{ - return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest)); -} -#endif - - -/* The first two tests here help to catch a somewhat common problem - where the second and third parameter are transposed. This is - especially problematic if the intended fill value is zero. In this - case no work is done at all. We detect these problems by referring - non-existing functions. */ -__fortify_function void * -__NTH (memset (void *__dest, int __ch, size_t __len)) -{ - /* GCC-5.0 and newer implements these checks in the compiler, so we don't - need them here. */ -#if !__GNUC_PREREQ (5,0) - if (__builtin_constant_p (__len) && __len == 0 - && (!__builtin_constant_p (__ch) || __ch != 0)) - { - __warn_memset_zero_len (); - return __dest; - } -#endif - return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); -} - -#ifdef __USE_MISC -# include <bits/strings_fortified.h> - -void __explicit_bzero_chk (void *__dest, size_t __len, size_t __destlen) - __THROW __nonnull ((1)); - -__fortify_function void -__NTH (explicit_bzero (void *__dest, size_t __len)) -{ - __explicit_bzero_chk (__dest, __len, __bos0 (__dest)); -} -#endif - -__fortify_function char * -__NTH (strcpy (char *__restrict __dest, const char *__restrict __src)) -{ - return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); -} - -#ifdef __USE_GNU -__fortify_function char * -__NTH (stpcpy (char *__restrict __dest, const char *__restrict __src)) -{ - return __builtin___stpcpy_chk (__dest, __src, __bos (__dest)); -} -#endif - - -__fortify_function char * -__NTH (strncpy (char *__restrict __dest, const char *__restrict __src, - size_t __len)) -{ - return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); -} - -/* XXX We have no corresponding builtin yet. */ -extern char *__stpncpy_chk (char *__dest, const char *__src, size_t __n, - size_t __destlen) __THROW; -extern char *__REDIRECT_NTH (__stpncpy_alias, (char *__dest, const char *__src, - size_t __n), stpncpy); - -__fortify_function char * -__NTH (stpncpy (char *__dest, const char *__src, size_t __n)) -{ - if (__bos (__dest) != (size_t) -1 - && (!__builtin_constant_p (__n) || __n > __bos (__dest))) - return __stpncpy_chk (__dest, __src, __n, __bos (__dest)); - return __stpncpy_alias (__dest, __src, __n); -} - - -__fortify_function char * -__NTH (strcat (char *__restrict __dest, const char *__restrict __src)) -{ - return __builtin___strcat_chk (__dest, __src, __bos (__dest)); -} - - -__fortify_function char * -__NTH (strncat (char *__restrict __dest, const char *__restrict __src, - size_t __len)) -{ - return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest)); -} diff --git a/string/bits/strings_fortified.h b/string/bits/strings_fortified.h deleted file mode 100644 index 411e7863d6..0000000000 --- a/string/bits/strings_fortified.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Fortify macros for strings.h functions. - Copyright (C) 2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef __STRINGS_FORTIFIED -# define __STRINGS_FORTIFIED 1 - -__fortify_function void -__NTH (bcopy (const void *__src, void *__dest, size_t __len)) -{ - (void) __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); -} - -__fortify_function void -__NTH (bzero (void *__dest, size_t __len)) -{ - (void) __builtin___memset_chk (__dest, '\0', __len, __bos0 (__dest)); -} - -#endif diff --git a/string/bug-envz1.c b/string/bug-envz1.c deleted file mode 100644 index 931a0559fe..0000000000 --- a/string/bug-envz1.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Test for bug BZ #2703. */ -#include <stdio.h> -#include <envz.h> -#include <stdlib.h> -#include <string.h> - -static const struct -{ - const char *s; - int in_result; -} strs[] = -{ - { "a=1", 1 }, - { "b=2", 1 }, - { "(*)", 0 }, - { "(*)", 0 }, - { "e=5", 1 }, - { "f=", 1 }, - { "(*)", 0 }, - { "h=8", 1 }, - { "i=9", 1 }, - { "j", 0 } -}; - -#define nstrs (sizeof (strs) / sizeof (strs[0])) - - -int -do_test (void) -{ - - size_t size = 0; - char *str = malloc (100); - if (str == NULL) - { - puts ("out of memory"); - return 1; - } - - char **argz = &str; - - for (int i = 0; i < nstrs; ++i) - argz_add_sep (argz, &size, strs[i].s, '\0'); - - printf ("calling envz_strip with size=%zu\n", size); - envz_strip (argz, &size); - - int result = 0; - printf ("new size=%zu\n", size); - for (int i = 0; i < nstrs; ++i) - if (strs[i].in_result) - { - char name[2]; - name[0] = strs[i].s[0]; - name[1] = '\0'; - - char *e = envz_entry (*argz, size, name); - if (e == NULL) - { - printf ("entry '%s' not found\n", name); - result = 1; - } - else if (strcmp (e, strs[i].s) != 0) - { - printf ("entry '%s' does not match: is '%s', expected '%s'\n", - name, e, strs[i].s); - result = 1; - } - } - - free (*argz); - return result; -} - -#include <support/test-driver.c> diff --git a/string/bug-strcoll1.c b/string/bug-strcoll1.c deleted file mode 100644 index b6510d926f..0000000000 --- a/string/bug-strcoll1.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <locale.h> - -int -main (void) -{ - const char t1[] = "0-0-0-0-0-0-0-0-0-0.COM"; - const char t2[] = "00000-00000.COM"; - int res1; - int res2; - - setlocale (LC_ALL, "en_US.ISO-8859-1"); - - res1 = strcoll (t1, t2); - printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, res1); - res2 = strcoll (t2, t1); - printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, res2); - - return ((res1 == 0 && res2 != 0) - || (res1 != 0 && res2 == 0) - || (res1 < 0 && res2 < 0) - || (res1 > 0 && res2 > 0)); -} diff --git a/string/bug-strcoll2.c b/string/bug-strcoll2.c deleted file mode 100644 index ff33007df6..0000000000 --- a/string/bug-strcoll2.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Bug 18589: sort-test.sh fails at random. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <string.h> -#include <locale.h> - -/* An incorrect strcoll optimization resulted in incorrect - results from strcoll for cs_CZ and da_DK. */ - -int -test_cs_CZ (void) -{ - const char t1[] = "config"; - const char t2[] = "choose"; - if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL) - { - perror ("setlocale"); - return 1; - } - /* In Czech the digraph ch sorts after c, therefore we expect - config to sort before choose. */ - int a = strcoll (t1, t2); - int b = strcoll (t2, t1); - printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a); - printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b); - if (a < 0 && b > 0) - { - puts ("PASS: config < choose"); - return 0; - } - else - { - puts ("FAIL: Wrong sorting in cs_CZ.UTF-8."); - return 1; - } -} - -int -test_da_DK (void) -{ - const char t1[] = "AS"; - const char t2[] = "AA"; - if (setlocale (LC_ALL, "da_DK.ISO-8859-1") == NULL) - { - perror ("setlocale"); - return 1; - } - /* AA should be treated as the last letter of the Danish alphabet, - hence sorting after AS. */ - int a = strcoll (t1, t2); - int b = strcoll (t2, t1); - printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a); - printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b); - if (a < 0 && b > 0) - { - puts ("PASS: AS < AA"); - return 0; - } - else - { - puts ("FAIL: Wrong sorting in da_DK.ISO-8859-1"); - return 1; - } -} - -int -do_test (void) -{ - int err = 0; - err |= test_cs_CZ (); - err |= test_da_DK (); - return err; -} - -#include <support/test-driver.c> diff --git a/string/bug-strncat1.c b/string/bug-strncat1.c deleted file mode 100644 index f1b5c37c5c..0000000000 --- a/string/bug-strncat1.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Test case by Joseph S. Myers <jsm28@cam.ac.uk>. */ -#undef __USE_STRING_INLINES -#define __USE_STRING_INLINES -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -char d[3] = "\0\1\2"; - -int -main (void) -{ - strncat (d, "\5\6", 1); - if (d[0] != '\5') - { - puts ("d[0] != '\\5'"); - exit (1); - } - if (d[1] != '\0') - { - puts ("d[1] != '\\0'"); - exit (1); - } - if (d[2] != '\2') - { - puts ("d[2] != '\\2'"); - exit (1); - } - - return 0; -} diff --git a/string/bug-strpbrk1.c b/string/bug-strpbrk1.c deleted file mode 100644 index 28238b0f50..0000000000 --- a/string/bug-strpbrk1.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Test case by Joseph S. Myers <jsm28@cam.ac.uk>. */ -#undef __USE_STRING_INLINES -#define __USE_STRING_INLINES -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -int -main (void) -{ - const char *a = "abc"; - const char *b = a; - - strpbrk (b++, ""); - if (b != a + 1) - return 1; - - return 0; -} diff --git a/string/bug-strspn1.c b/string/bug-strspn1.c deleted file mode 100644 index a657bafc43..0000000000 --- a/string/bug-strspn1.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Test case by Joseph S. Myers <jsm28@cam.ac.uk>. */ -#undef __USE_STRING_INLINES -#define __USE_STRING_INLINES -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -int -main (void) -{ - const char *a = "abc"; - const char *b = a; - - strspn (b++, ""); - if (b != a + 1) - return 1; - - return 0; -} diff --git a/string/bug-strtok1.c b/string/bug-strtok1.c deleted file mode 100644 index a47b2f3531..0000000000 --- a/string/bug-strtok1.c +++ /dev/null @@ -1,44 +0,0 @@ -/* See BZ #2126. */ -#include <string.h> -#include <stdio.h> - -int -do_test (void) -{ - const char str[] = "axaaba"; - char *token; - char *cp; - char *l; - int result = 0; - - puts ("test strtok"); - cp = strdupa (str); - printf ("cp = %p, len = %zu\n", cp, strlen (cp)); - token = strtok (cp, "ab"); - result |= token == NULL || strcmp (token, "x"); - printf ("token: %s (%d)\n", token ? token : "NULL", result); - token = strtok(0, "ab"); - result |= token != NULL; - printf ("token: %s (%d)\n", token ? token : "NULL", result); - token = strtok(0, "a"); - result |= token != NULL; - printf ("token: %s (%d)\n", token ? token : "NULL", result); - - puts ("test strtok_r"); - cp = strdupa (str); - size_t len = strlen (cp); - printf ("cp = %p, len = %zu\n", cp, len); - token = strtok_r (cp, "ab", &l); - result |= token == NULL || strcmp (token, "x"); - printf ("token: %s, next = %p (%d)\n", token ? token : "NULL", l, result); - token = strtok_r(0, "ab", &l); - result |= token != NULL || l != cp + len; - printf ("token: %s, next = %p (%d)\n", token ? token : "NULL", l, result); - token = strtok_r(0, "a", &l); - result |= token != NULL || l != cp + len; - printf ("token: %s, next = %p (%d)\n", token ? token : "NULL", l, result); - - return result; -} - -#include <support/test-driver.c> diff --git a/string/byteswap.h b/string/byteswap.h deleted file mode 100644 index 4ec8ac7713..0000000000 --- a/string/byteswap.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _BYTESWAP_H -#define _BYTESWAP_H 1 - -#include <features.h> - -/* Get the machine specific, optimized definitions. */ -#include <bits/byteswap.h> - - -/* The following definitions must all be macros since otherwise some - of the possible optimizations are not possible. */ - -/* Return a value with all bytes in the 16 bit argument swapped. */ -#define bswap_16(x) __bswap_16 (x) - -/* Return a value with all bytes in the 32 bit argument swapped. */ -#define bswap_32(x) __bswap_32 (x) - -/* Return a value with all bytes in the 64 bit argument swapped. */ -#define bswap_64(x) __bswap_64 (x) - -#endif /* byteswap.h */ diff --git a/string/bzero.c b/string/bzero.c deleted file mode 100644 index 9de1f89d10..0000000000 --- a/string/bzero.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef __bzero - -/* Set N bytes of S to 0. */ -void -__bzero (void *s, size_t len) -{ - memset (s, '\0', len); -} -weak_alias (__bzero, bzero) diff --git a/string/endian.h b/string/endian.h deleted file mode 100644 index dcc9a65df7..0000000000 --- a/string/endian.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _ENDIAN_H -#define _ENDIAN_H 1 - -#include <features.h> - -/* Definitions for byte order, according to significance of bytes, - from low addresses to high addresses. The value is what you get by - putting '4' in the most significant byte, '3' in the second most - significant byte, '2' in the second least significant byte, and '1' - in the least significant byte, and then writing down one digit for - each byte, starting with the byte at the lowest address at the left, - and proceeding to the byte with the highest address at the right. */ - -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 -#define __PDP_ENDIAN 3412 - -/* This file defines `__BYTE_ORDER' for the particular machine. */ -#include <bits/endian.h> - -/* Some machines may need to use a different endianness for floating point - values. */ -#ifndef __FLOAT_WORD_ORDER -# define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#ifdef __USE_MISC -# define LITTLE_ENDIAN __LITTLE_ENDIAN -# define BIG_ENDIAN __BIG_ENDIAN -# define PDP_ENDIAN __PDP_ENDIAN -# define BYTE_ORDER __BYTE_ORDER -#endif - -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) LO, HI -#elif __BYTE_ORDER == __BIG_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) HI, LO -#endif - - -#if defined __USE_MISC && !defined __ASSEMBLER__ -/* Conversion interfaces. */ -# include <bits/byteswap.h> -# include <bits/uintn-identity.h> - -# if __BYTE_ORDER == __LITTLE_ENDIAN -# define htobe16(x) __bswap_16 (x) -# define htole16(x) __uint16_identity (x) -# define be16toh(x) __bswap_16 (x) -# define le16toh(x) __uint16_identity (x) - -# define htobe32(x) __bswap_32 (x) -# define htole32(x) __uint32_identity (x) -# define be32toh(x) __bswap_32 (x) -# define le32toh(x) __uint32_identity (x) - -# define htobe64(x) __bswap_64 (x) -# define htole64(x) __uint64_identity (x) -# define be64toh(x) __bswap_64 (x) -# define le64toh(x) __uint64_identity (x) - -# else -# define htobe16(x) __uint16_identity (x) -# define htole16(x) __bswap_16 (x) -# define be16toh(x) __uint16_identity (x) -# define le16toh(x) __bswap_16 (x) - -# define htobe32(x) __uint32_identity (x) -# define htole32(x) __bswap_32 (x) -# define be32toh(x) __uint32_identity (x) -# define le32toh(x) __bswap_32 (x) - -# define htobe64(x) __uint64_identity (x) -# define htole64(x) __bswap_64 (x) -# define be64toh(x) __uint64_identity (x) -# define le64toh(x) __bswap_64 (x) -# endif -#endif - -#endif /* endian.h */ diff --git a/string/envz.c b/string/envz.c deleted file mode 100644 index 02fb5cc28a..0000000000 --- a/string/envz.c +++ /dev/null @@ -1,172 +0,0 @@ -/* Routines for dealing with '\0' separated environment vectors - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Miles Bader <miles@gnu.org> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <malloc.h> -#include <string.h> - -#include <envz.h> - -/* The character separating names from values in an envz. */ -#define SEP '=' - -/* Returns a pointer to the entry in ENVZ for NAME, or 0 if there is none. - If NAME contains the separator character, only the portion before it is - used in the comparison. */ -char * -envz_entry (const char *envz, size_t envz_len, const char *name) -{ - while (envz_len) - { - const char *p = name; - const char *entry = envz; /* Start of this entry. */ - - /* See how far NAME and ENTRY match. */ - while (envz_len && *p == *envz && *p && *p != SEP) - p++, envz++, envz_len--; - - if ((*envz == '\0' || *envz == SEP) && (*p == '\0' || *p == SEP)) - /* Bingo! */ - return (char *) entry; - - /* No match, skip to the next entry. */ - while (envz_len && *envz) - envz++, envz_len--; - if (envz_len) - envz++, envz_len--; /* skip '\0' */ - } - - return 0; -} -libc_hidden_def (envz_entry) - -/* Returns a pointer to the value portion of the entry in ENVZ for NAME, or 0 - if there is none. */ -char * -envz_get (const char *envz, size_t envz_len, const char *name) -{ - char *entry = envz_entry (envz, envz_len, name); - if (entry) - { - while (*entry && *entry != SEP) - entry++; - if (*entry) - entry++; - else - entry = 0; /* A null entry. */ - } - return entry; -} - -/* Remove the entry for NAME from ENVZ & ENVZ_LEN, if any. */ -void -envz_remove (char **envz, size_t *envz_len, const char *name) -{ - char *entry = envz_entry (*envz, *envz_len, name); - if (entry) - argz_delete (envz, envz_len, entry); -} -libc_hidden_def (envz_remove) - -/* Adds an entry for NAME with value VALUE to ENVZ & ENVZ_LEN. If an entry - with the same name already exists in ENVZ, it is removed. If VALUE is - NULL, then the new entry will a special null one, for which envz_get will - return NULL, although envz_entry will still return an entry; this is handy - because when merging with another envz, the null entry can override an - entry in the other one. Null entries can be removed with envz_strip (). */ -error_t -envz_add (char **envz, size_t *envz_len, const char *name, const char *value) -{ - envz_remove (envz, envz_len, name); - - if (value) - /* Add the new value, if there is one. */ - { - size_t name_len = strlen (name); - size_t value_len = strlen (value); - size_t old_envz_len = *envz_len; - size_t new_envz_len = old_envz_len + name_len + 1 + value_len + 1; - char *new_envz = realloc (*envz, new_envz_len); - - if (new_envz) - { - memcpy (new_envz + old_envz_len, name, name_len); - new_envz[old_envz_len + name_len] = SEP; - memcpy (new_envz + old_envz_len + name_len + 1, value, value_len); - new_envz[new_envz_len - 1] = 0; - - *envz = new_envz; - *envz_len = new_envz_len; - - return 0; - } - else - return ENOMEM; - } - else - /* Add a null entry. */ - return __argz_add (envz, envz_len, name); -} - -/* Adds each entry in ENVZ2 to ENVZ & ENVZ_LEN, as if with envz_add(). If - OVERRIDE is true, then values in ENVZ2 will supersede those with the same - name in ENV, otherwise not. */ -error_t -envz_merge (char **envz, size_t *envz_len, const char *envz2, - size_t envz2_len, int override) -{ - error_t err = 0; - - while (envz2_len && ! err) - { - char *old = envz_entry (*envz, *envz_len, envz2); - size_t new_len = strlen (envz2) + 1; - - if (! old) - err = __argz_append (envz, envz_len, envz2, new_len); - else if (override) - { - argz_delete (envz, envz_len, old); - err = __argz_append (envz, envz_len, envz2, new_len); - } - - envz2 += new_len; - envz2_len -= new_len; - } - - return err; -} - -/* Remove null entries. */ -void -envz_strip (char **envz, size_t *envz_len) -{ - char *entry = *envz; - size_t left = *envz_len; - while (left) - { - size_t entry_len = strlen (entry) + 1; - left -= entry_len; - if (! strchr (entry, SEP)) - /* Null entry. */ - memmove (entry, entry + entry_len, left); - else - entry += entry_len; - } - *envz_len = entry - *envz; -} diff --git a/string/envz.h b/string/envz.h deleted file mode 100644 index 330cdd3d8a..0000000000 --- a/string/envz.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Routines for dealing with '\0' separated environment vectors - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _ENVZ_H -#define _ENVZ_H 1 - -#include <features.h> - -#include <errno.h> - -/* Envz's are argz's too, and should be created etc., using the same - routines. */ -#include <argz.h> - -__BEGIN_DECLS - -/* Returns a pointer to the entry in ENVZ for NAME, or 0 if there is none. */ -extern char *envz_entry (const char *__restrict __envz, size_t __envz_len, - const char *__restrict __name) - __THROW __attribute_pure__; - -/* Returns a pointer to the value portion of the entry in ENVZ for NAME, or 0 - if there is none. */ -extern char *envz_get (const char *__restrict __envz, size_t __envz_len, - const char *__restrict __name) - __THROW __attribute_pure__; - -/* Adds an entry for NAME with value VALUE to ENVZ & ENVZ_LEN. If an entry - with the same name already exists in ENVZ, it is removed. If VALUE is - NULL, then the new entry will a special null one, for which envz_get will - return NULL, although envz_entry will still return an entry; this is handy - because when merging with another envz, the null entry can override an - entry in the other one. Null entries can be removed with envz_strip (). */ -extern error_t envz_add (char **__restrict __envz, - size_t *__restrict __envz_len, - const char *__restrict __name, - const char *__restrict __value) __THROW; - -/* Adds each entry in ENVZ2 to ENVZ & ENVZ_LEN, as if with envz_add(). If - OVERRIDE is true, then values in ENVZ2 will supersede those with the same - name in ENV, otherwise not. */ -extern error_t envz_merge (char **__restrict __envz, - size_t *__restrict __envz_len, - const char *__restrict __envz2, - size_t __envz2_len, int __override) __THROW; - -/* Remove the entry for NAME from ENVZ & ENVZ_LEN, if any. */ -extern void envz_remove (char **__restrict __envz, - size_t *__restrict __envz_len, - const char *__restrict __name) __THROW; - -/* Remove null entries. */ -extern void envz_strip (char **__restrict __envz, - size_t *__restrict __envz_len) __THROW; - -__END_DECLS - -#endif /* envz.h */ diff --git a/string/explicit_bzero.c b/string/explicit_bzero.c deleted file mode 100644 index 8dadf45ea8..0000000000 --- a/string/explicit_bzero.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Erasure of sensitive data, generic implementation. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* An assembler implementation of explicit_bzero can be created as an - assembler alias of an optimized bzero implementation. - Architecture-specific implementations also need to define - __explicit_bzero_chk. */ - -#include <string.h> - -/* glibc-internal users use __explicit_bzero_chk, and explicit_bzero - redirects to that. */ -#undef explicit_bzero - -/* Set LEN bytes of S to 0. The compiler will not delete a call to - this function, even if S is dead after the call. */ -void -explicit_bzero (void *s, size_t len) -{ - memset (s, '\0', len); - /* Compiler barrier. */ - asm volatile ("" ::: "memory"); -} diff --git a/string/ffs.c b/string/ffs.c deleted file mode 100644 index 367cbbfb84..0000000000 --- a/string/ffs.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#define ffsl __something_else -#include <string.h> - -#undef ffs - -/* Find the first bit set in I. */ -int -__ffs (int i) -{ - static const unsigned char table[] = - { - 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 - }; - unsigned int a; - unsigned int x = i & -i; - - a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); - - return table[x >> a] + a; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) - -#if ULONG_MAX == UINT_MAX -#undef ffsl -weak_alias (__ffs, ffsl) -#endif diff --git a/string/ffsll.c b/string/ffsll.c deleted file mode 100644 index 5e403ef938..0000000000 --- a/string/ffsll.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <limits.h> -#define ffsl __something_else -#include <string.h> - -#undef ffsll - -/* Find the first bit set in I. */ -int -ffsll (long long int i) -{ - unsigned long long int x = i & -i; - - if (x <= 0xffffffff) - return ffs (i); - else - return 32 + ffs (i >> 32); -} - -#if ULONG_MAX != UINT_MAX -#undef ffsl -weak_alias (ffsll, ffsl) -#endif diff --git a/string/inl-tester.c b/string/inl-tester.c deleted file mode 100644 index 88528e5ed8..0000000000 --- a/string/inl-tester.c +++ /dev/null @@ -1,6 +0,0 @@ -/* We want to test the inline functions here. */ - -#define DO_STRING_INLINES -#undef __USE_STRING_INLINES -#define __USE_STRING_INLINES 1 -#include "tester.c" diff --git a/string/memccpy.c b/string/memccpy.c deleted file mode 100644 index 605a453a69..0000000000 --- a/string/memccpy.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef __memccpy -#undef memccpy - -#ifdef MEMCCPY -# define __memccpy MEMCCPY -#endif - -/* Copy no more than N bytes of SRC to DEST, stopping when C is found. - Return the position in DEST one byte past where C was copied, or - NULL if C was not found in the first N bytes of SRC. */ -void * -__memccpy (void *dest, const void *src, int c, size_t n) -{ - void *p = memchr (src, c, n); - - if (p != NULL) - return __mempcpy (dest, src, p - src + 1); - - memcpy (dest, src, n); - return NULL; -} - -weak_alias (__memccpy, memccpy) diff --git a/string/memchr.c b/string/memchr.c deleted file mode 100644 index f6708fd917..0000000000 --- a/string/memchr.c +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Based on strlen implementation by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se) and - commentary by Jim Blandy (jimb@ai.mit.edu); - adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), - and implemented by Roland McGrath (roland@ai.mit.edu). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _LIBC -# include <config.h> -#endif - -#include <string.h> - -#include <stddef.h> - -#include <limits.h> - -#undef __memchr -#ifdef _LIBC -# undef memchr -#endif - -#ifndef weak_alias -# define __memchr memchr -#endif - -#ifndef MEMCHR -# define MEMCHR __memchr -#endif - -/* Search no more than N bytes of S for C. */ -void * -MEMCHR (void const *s, int c_in, size_t n) -{ - /* On 32-bit hardware, choosing longword to be a 32-bit unsigned - long instead of a 64-bit uintmax_t tends to give better - performance. On 64-bit hardware, unsigned long is generally 64 - bits already. Change this typedef to experiment with - performance. */ - typedef unsigned long int longword; - - const unsigned char *char_ptr; - const longword *longword_ptr; - longword repeated_one; - longword repeated_c; - unsigned char c; - - c = (unsigned char) c_in; - - /* Handle the first few bytes by reading one byte at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s; - n > 0 && (size_t) char_ptr % sizeof (longword) != 0; - --n, ++char_ptr) - if (*char_ptr == c) - return (void *) char_ptr; - - longword_ptr = (const longword *) char_ptr; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to any size longwords. */ - - /* Compute auxiliary longword values: - repeated_one is a value which has a 1 in every byte. - repeated_c has c in every byte. */ - repeated_one = 0x01010101; - repeated_c = c | (c << 8); - repeated_c |= repeated_c << 16; - if (0xffffffffU < (longword) -1) - { - repeated_one |= repeated_one << 31 << 1; - repeated_c |= repeated_c << 31 << 1; - if (8 < sizeof (longword)) - { - size_t i; - - for (i = 64; i < sizeof (longword) * 8; i *= 2) - { - repeated_one |= repeated_one << i; - repeated_c |= repeated_c << i; - } - } - } - - /* Instead of the traditional loop which tests each byte, we will test a - longword at a time. The tricky part is testing if *any of the four* - bytes in the longword in question are equal to c. We first use an xor - with repeated_c. This reduces the task to testing whether *any of the - four* bytes in longword1 is zero. - - We compute tmp = - ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7). - That is, we perform the following operations: - 1. Subtract repeated_one. - 2. & ~longword1. - 3. & a mask consisting of 0x80 in every byte. - Consider what happens in each byte: - - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff, - and step 3 transforms it into 0x80. A carry can also be propagated - to more significant bytes. - - If a byte of longword1 is nonzero, let its lowest 1 bit be at - position k (0 <= k <= 7); so the lowest k bits are 0. After step 1, - the byte ends in a single bit of value 0 and k bits of value 1. - After step 2, the result is just k bits of value 1: 2^k - 1. After - step 3, the result is 0. And no carry is produced. - So, if longword1 has only non-zero bytes, tmp is zero. - Whereas if longword1 has a zero byte, call j the position of the least - significant zero byte. Then the result has a zero at positions 0, ..., - j-1 and a 0x80 at position j. We cannot predict the result at the more - significant bytes (positions j+1..3), but it does not matter since we - already have a non-zero bit at position 8*j+7. - - So, the test whether any byte in longword1 is zero is equivalent to - testing whether tmp is nonzero. */ - - while (n >= sizeof (longword)) - { - longword longword1 = *longword_ptr ^ repeated_c; - - if ((((longword1 - repeated_one) & ~longword1) - & (repeated_one << 7)) != 0) - break; - longword_ptr++; - n -= sizeof (longword); - } - - char_ptr = (const unsigned char *) longword_ptr; - - /* At this point, we know that either n < sizeof (longword), or one of the - sizeof (longword) bytes starting at char_ptr is == c. On little-endian - machines, we could determine the first such byte without any further - memory accesses, just by looking at the tmp result from the last loop - iteration. But this does not work on big-endian machines. Choose code - that works in both cases. */ - - for (; n > 0; --n, ++char_ptr) - { - if (*char_ptr == c) - return (void *) char_ptr; - } - - return NULL; -} -#ifdef weak_alias -weak_alias (__memchr, memchr) -#endif -libc_hidden_builtin_def (memchr) diff --git a/string/memcmp.c b/string/memcmp.c deleted file mode 100644 index c53ab3185d..0000000000 --- a/string/memcmp.c +++ /dev/null @@ -1,364 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#undef __ptr_t -#define __ptr_t void * - -#if defined HAVE_STRING_H || defined _LIBC -# include <string.h> -#endif - -#undef memcmp - -#ifndef MEMCMP -# define MEMCMP memcmp -#endif - -#ifdef _LIBC - -# include <memcopy.h> -# include <endian.h> - -# if __BYTE_ORDER == __BIG_ENDIAN -# define WORDS_BIGENDIAN -# endif - -#else /* Not in the GNU C library. */ - -# include <sys/types.h> - -/* Type to use for aligned memory operations. - This should normally be the biggest type supported by a single load - and store. Must be an unsigned type. */ -# define op_t unsigned long int -# define OPSIZ (sizeof(op_t)) - -/* Threshold value for when to enter the unrolled loops. */ -# define OP_T_THRES 16 - -/* Type to use for unaligned operations. */ -typedef unsigned char byte; - -# ifndef WORDS_BIGENDIAN -# define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) -# else -# define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2))) -# endif - -#endif /* In the GNU C library. */ - -#ifdef WORDS_BIGENDIAN -# define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1) -#else -# define CMP_LT_OR_GT(a, b) memcmp_bytes ((a), (b)) -#endif - -/* BE VERY CAREFUL IF YOU CHANGE THIS CODE! */ - -/* The strategy of this memcmp is: - - 1. Compare bytes until one of the block pointers is aligned. - - 2. Compare using memcmp_common_alignment or - memcmp_not_common_alignment, regarding the alignment of the other - block after the initial byte operations. The maximum number of - full words (of type op_t) are compared in this way. - - 3. Compare the few remaining bytes. */ - -#ifndef WORDS_BIGENDIAN -/* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine. - A and B are known to be different. - This is needed only on little-endian machines. */ - -static int memcmp_bytes (op_t, op_t) __THROW; - -static int -memcmp_bytes (op_t a, op_t b) -{ - long int srcp1 = (long int) &a; - long int srcp2 = (long int) &b; - op_t a0, b0; - - do - { - a0 = ((byte *) srcp1)[0]; - b0 = ((byte *) srcp2)[0]; - srcp1 += 1; - srcp2 += 1; - } - while (a0 == b0); - return a0 - b0; -} -#endif - -static int memcmp_common_alignment (long, long, size_t) __THROW; - -/* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t' - objects (not LEN bytes!). Both SRCP1 and SRCP2 should be aligned for - memory operations on `op_t's. */ -static int -memcmp_common_alignment (long int srcp1, long int srcp2, size_t len) -{ - op_t a0, a1; - op_t b0, b1; - - switch (len % 4) - { - default: /* Avoid warning about uninitialized local variables. */ - case 2: - a0 = ((op_t *) srcp1)[0]; - b0 = ((op_t *) srcp2)[0]; - srcp1 -= 2 * OPSIZ; - srcp2 -= 2 * OPSIZ; - len += 2; - goto do1; - case 3: - a1 = ((op_t *) srcp1)[0]; - b1 = ((op_t *) srcp2)[0]; - srcp1 -= OPSIZ; - srcp2 -= OPSIZ; - len += 1; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return 0; - a0 = ((op_t *) srcp1)[0]; - b0 = ((op_t *) srcp2)[0]; - goto do3; - case 1: - a1 = ((op_t *) srcp1)[0]; - b1 = ((op_t *) srcp2)[0]; - srcp1 += OPSIZ; - srcp2 += OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - /* Fall through. */ - } - - do - { - a0 = ((op_t *) srcp1)[0]; - b0 = ((op_t *) srcp2)[0]; - if (a1 != b1) - return CMP_LT_OR_GT (a1, b1); - - do3: - a1 = ((op_t *) srcp1)[1]; - b1 = ((op_t *) srcp2)[1]; - if (a0 != b0) - return CMP_LT_OR_GT (a0, b0); - - do2: - a0 = ((op_t *) srcp1)[2]; - b0 = ((op_t *) srcp2)[2]; - if (a1 != b1) - return CMP_LT_OR_GT (a1, b1); - - do1: - a1 = ((op_t *) srcp1)[3]; - b1 = ((op_t *) srcp2)[3]; - if (a0 != b0) - return CMP_LT_OR_GT (a0, b0); - - srcp1 += 4 * OPSIZ; - srcp2 += 4 * OPSIZ; - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - if (a1 != b1) - return CMP_LT_OR_GT (a1, b1); - return 0; -} - -static int memcmp_not_common_alignment (long, long, size_t) __THROW; - -/* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN - `op_t' objects (not LEN bytes!). SRCP2 should be aligned for memory - operations on `op_t', but SRCP1 *should be unaligned*. */ -static int -memcmp_not_common_alignment (long int srcp1, long int srcp2, size_t len) -{ - op_t a0, a1, a2, a3; - op_t b0, b1, b2, b3; - op_t x; - int shl, shr; - - /* Calculate how to shift a word read at the memory operation - aligned srcp1 to make it aligned for comparison. */ - - shl = 8 * (srcp1 % OPSIZ); - shr = 8 * OPSIZ - shl; - - /* Make SRCP1 aligned by rounding it down to the beginning of the `op_t' - it points in the middle of. */ - srcp1 &= -OPSIZ; - - switch (len % 4) - { - default: /* Avoid warning about uninitialized local variables. */ - case 2: - a1 = ((op_t *) srcp1)[0]; - a2 = ((op_t *) srcp1)[1]; - b2 = ((op_t *) srcp2)[0]; - srcp1 -= 1 * OPSIZ; - srcp2 -= 2 * OPSIZ; - len += 2; - goto do1; - case 3: - a0 = ((op_t *) srcp1)[0]; - a1 = ((op_t *) srcp1)[1]; - b1 = ((op_t *) srcp2)[0]; - srcp2 -= 1 * OPSIZ; - len += 1; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return 0; - a3 = ((op_t *) srcp1)[0]; - a0 = ((op_t *) srcp1)[1]; - b0 = ((op_t *) srcp2)[0]; - srcp1 += 1 * OPSIZ; - goto do3; - case 1: - a2 = ((op_t *) srcp1)[0]; - a3 = ((op_t *) srcp1)[1]; - b3 = ((op_t *) srcp2)[0]; - srcp1 += 2 * OPSIZ; - srcp2 += 1 * OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - /* Fall through. */ - } - - do - { - a0 = ((op_t *) srcp1)[0]; - b0 = ((op_t *) srcp2)[0]; - x = MERGE(a2, shl, a3, shr); - if (x != b3) - return CMP_LT_OR_GT (x, b3); - - do3: - a1 = ((op_t *) srcp1)[1]; - b1 = ((op_t *) srcp2)[1]; - x = MERGE(a3, shl, a0, shr); - if (x != b0) - return CMP_LT_OR_GT (x, b0); - - do2: - a2 = ((op_t *) srcp1)[2]; - b2 = ((op_t *) srcp2)[2]; - x = MERGE(a0, shl, a1, shr); - if (x != b1) - return CMP_LT_OR_GT (x, b1); - - do1: - a3 = ((op_t *) srcp1)[3]; - b3 = ((op_t *) srcp2)[3]; - x = MERGE(a1, shl, a2, shr); - if (x != b2) - return CMP_LT_OR_GT (x, b2); - - srcp1 += 4 * OPSIZ; - srcp2 += 4 * OPSIZ; - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - x = MERGE(a2, shl, a3, shr); - if (x != b3) - return CMP_LT_OR_GT (x, b3); - return 0; -} - -int -MEMCMP (const __ptr_t s1, const __ptr_t s2, size_t len) -{ - op_t a0; - op_t b0; - long int srcp1 = (long int) s1; - long int srcp2 = (long int) s2; - op_t res; - - if (len >= OP_T_THRES) - { - /* There are at least some bytes to compare. No need to test - for LEN == 0 in this alignment loop. */ - while (srcp2 % OPSIZ != 0) - { - a0 = ((byte *) srcp1)[0]; - b0 = ((byte *) srcp2)[0]; - srcp1 += 1; - srcp2 += 1; - res = a0 - b0; - if (res != 0) - return res; - len -= 1; - } - - /* SRCP2 is now aligned for memory operations on `op_t'. - SRCP1 alignment determines if we can do a simple, - aligned compare or need to shuffle bits. */ - - if (srcp1 % OPSIZ == 0) - res = memcmp_common_alignment (srcp1, srcp2, len / OPSIZ); - else - res = memcmp_not_common_alignment (srcp1, srcp2, len / OPSIZ); - if (res != 0) - return res; - - /* Number of bytes remaining in the interval [0..OPSIZ-1]. */ - srcp1 += len & -OPSIZ; - srcp2 += len & -OPSIZ; - len %= OPSIZ; - } - - /* There are just a few bytes to compare. Use byte memory operations. */ - while (len != 0) - { - a0 = ((byte *) srcp1)[0]; - b0 = ((byte *) srcp2)[0]; - srcp1 += 1; - srcp2 += 1; - res = a0 - b0; - if (res != 0) - return res; - len -= 1; - } - - return 0; -} -libc_hidden_builtin_def(memcmp) -#ifdef weak_alias -# undef bcmp -weak_alias (memcmp, bcmp) -#endif diff --git a/string/memcpy.c b/string/memcpy.c deleted file mode 100644 index 974f65ef94..0000000000 --- a/string/memcpy.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Copy memory to memory until the specified number of bytes - has been copied. Overlap is NOT handled correctly. - Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <memcopy.h> - -#undef memcpy - -void * -memcpy (void *dstpp, const void *srcpp, size_t len) -{ - unsigned long int dstp = (long int) dstpp; - unsigned long int srcp = (long int) srcpp; - - /* Copy from the beginning to the end. */ - - /* If there not too few bytes to copy, use word copy. */ - if (len >= OP_T_THRES) - { - /* Copy just a few bytes to make DSTP aligned. */ - len -= (-dstp) % OPSIZ; - BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ); - - /* Copy whole pages from SRCP to DSTP by virtual address manipulation, - as much as possible. */ - - PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len); - - /* Copy from SRCP to DSTP taking advantage of the known alignment of - DSTP. Number of bytes remaining is put in the third argument, - i.e. in LEN. This number may vary from machine to machine. */ - - WORD_COPY_FWD (dstp, srcp, len, len); - - /* Fall out and copy the tail. */ - } - - /* There are just a few bytes to copy. Use byte memory operations. */ - BYTE_COPY_FWD (dstp, srcp, len); - - return dstpp; -} -libc_hidden_builtin_def (memcpy) diff --git a/string/memfrob.c b/string/memfrob.c deleted file mode 100644 index 91e162e28f..0000000000 --- a/string/memfrob.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -void * -memfrob (void *s, size_t n) -{ - char *p = (char *) s; - - while (n-- > 0) - *p++ ^= 42; - - return s; -} diff --git a/string/memmem.c b/string/memmem.c deleted file mode 100644 index 54fca4966d..0000000000 --- a/string/memmem.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This particular implementation was written by Eric Blake, 2008. */ - -#ifndef _LIBC -# include <config.h> -#endif - -/* Specification of memmem. */ -#include <string.h> - -#ifndef _LIBC -# define __builtin_expect(expr, val) (expr) -# define __memmem memmem -#endif - -#define RETURN_TYPE void * -#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l)) -#include "str-two-way.h" - -#undef memmem - -/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK - if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in - HAYSTACK. */ -void * -__memmem (const void *haystack_start, size_t haystack_len, - const void *needle_start, size_t needle_len) -{ - /* Abstract memory is considered to be an array of 'unsigned char' values, - not an array of 'char' values. See ISO C 99 section 6.2.6.1. */ - const unsigned char *haystack = (const unsigned char *) haystack_start; - const unsigned char *needle = (const unsigned char *) needle_start; - - if (needle_len == 0) - /* The first occurrence of the empty string is deemed to occur at - the beginning of the string. */ - return (void *) haystack; - - /* Sanity check, otherwise the loop might search through the whole - memory. */ - if (__glibc_unlikely (haystack_len < needle_len)) - return NULL; - - /* Use optimizations in memchr when possible, to reduce the search - size of haystack using a linear algorithm with a smaller - coefficient. However, avoid memchr for long needles, since we - can often achieve sublinear performance. */ - if (needle_len < LONG_NEEDLE_THRESHOLD) - { - haystack = memchr (haystack, *needle, haystack_len); - if (!haystack || __builtin_expect (needle_len == 1, 0)) - return (void *) haystack; - haystack_len -= haystack - (const unsigned char *) haystack_start; - if (haystack_len < needle_len) - return NULL; - return two_way_short_needle (haystack, haystack_len, needle, needle_len); - } - else - return two_way_long_needle (haystack, haystack_len, needle, needle_len); -} -libc_hidden_def (__memmem) -weak_alias (__memmem, memmem) -libc_hidden_weak (memmem) - -#undef LONG_NEEDLE_THRESHOLD diff --git a/string/memmove.c b/string/memmove.c deleted file mode 100644 index d8c2116b01..0000000000 --- a/string/memmove.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copy memory to memory until the specified number of bytes - has been copied. Overlap is handled correctly. - Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <memcopy.h> - -/* All this is so that bcopy.c can #include - this file after defining some things. */ -#ifndef a1 -#define a1 dest /* First arg is DEST. */ -#define a1const -#define a2 src /* Second arg is SRC. */ -#define a2const const -#undef memmove -#endif -#if !defined(RETURN) || !defined(rettype) -#define RETURN(s) return (s) /* Return DEST. */ -#define rettype void * -#endif - -#ifndef MEMMOVE -#define MEMMOVE memmove -#endif - -rettype -inhibit_loop_to_libcall -MEMMOVE (a1const void *a1, a2const void *a2, size_t len) -{ - unsigned long int dstp = (long int) dest; - unsigned long int srcp = (long int) src; - - /* This test makes the forward copying code be used whenever possible. - Reduces the working set. */ - if (dstp - srcp >= len) /* *Unsigned* compare! */ - { - /* Copy from the beginning to the end. */ - -#if MEMCPY_OK_FOR_FWD_MEMMOVE - dest = memcpy (dest, src, len); -#else - /* If there not too few bytes to copy, use word copy. */ - if (len >= OP_T_THRES) - { - /* Copy just a few bytes to make DSTP aligned. */ - len -= (-dstp) % OPSIZ; - BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ); - - /* Copy whole pages from SRCP to DSTP by virtual address - manipulation, as much as possible. */ - - PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len); - - /* Copy from SRCP to DSTP taking advantage of the known - alignment of DSTP. Number of bytes remaining is put - in the third argument, i.e. in LEN. This number may - vary from machine to machine. */ - - WORD_COPY_FWD (dstp, srcp, len, len); - - /* Fall out and copy the tail. */ - } - - /* There are just a few bytes to copy. Use byte memory operations. */ - BYTE_COPY_FWD (dstp, srcp, len); -#endif /* MEMCPY_OK_FOR_FWD_MEMMOVE */ - } - else - { - /* Copy from the end to the beginning. */ - srcp += len; - dstp += len; - - /* If there not too few bytes to copy, use word copy. */ - if (len >= OP_T_THRES) - { - /* Copy just a few bytes to make DSTP aligned. */ - len -= dstp % OPSIZ; - BYTE_COPY_BWD (dstp, srcp, dstp % OPSIZ); - - /* Copy from SRCP to DSTP taking advantage of the known - alignment of DSTP. Number of bytes remaining is put - in the third argument, i.e. in LEN. This number may - vary from machine to machine. */ - - WORD_COPY_BWD (dstp, srcp, len, len); - - /* Fall out and copy the tail. */ - } - - /* There are just a few bytes to copy. Use byte memory operations. */ - BYTE_COPY_BWD (dstp, srcp, len); - } - - RETURN (dest); -} -#ifndef memmove -libc_hidden_builtin_def (memmove) -#endif diff --git a/string/memory.h b/string/memory.h deleted file mode 100644 index 36ad3808f8..0000000000 --- a/string/memory.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* - * SVID - */ - -#ifndef _MEMORY_H -#define _MEMORY_H 1 - -#include <features.h> - - -#ifndef _STRING_H -# include <string.h> -#endif /* string.h */ - - -#endif /* memory.h */ diff --git a/string/mempcpy.c b/string/mempcpy.c deleted file mode 100644 index 7a8718e79f..0000000000 --- a/string/mempcpy.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copy memory to memory until the specified number of bytes - has been copied, return pointer to following byte. - Overlap is NOT handled correctly. - Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define NO_MEMPCPY_STPCPY_REDIRECT -#include <string.h> - -#undef mempcpy -#undef __mempcpy - -#ifndef MEMPCPY -# define MEMPCPY __mempcpy -#endif - -void * -MEMPCPY (void *dest, const void *src, size_t len) -{ - return memcpy (dest, src, len) + len; -} -libc_hidden_def (__mempcpy) -weak_alias (__mempcpy, mempcpy) -libc_hidden_builtin_def (mempcpy) diff --git a/string/memrchr.c b/string/memrchr.c deleted file mode 100644 index 0ecfe08842..0000000000 --- a/string/memrchr.c +++ /dev/null @@ -1,200 +0,0 @@ -/* memrchr -- find the last occurrence of a byte in a memory block - Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Based on strlen implementation by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se) and - commentary by Jim Blandy (jimb@ai.mit.edu); - adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), - and implemented by Roland McGrath (roland@ai.mit.edu). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#undef __ptr_t -#define __ptr_t void * - -#if defined _LIBC -# include <string.h> -# include <memcopy.h> -#endif - -#if defined HAVE_LIMITS_H || defined _LIBC -# include <limits.h> -#endif - -#define LONG_MAX_32_BITS 2147483647 - -#ifndef LONG_MAX -# define LONG_MAX LONG_MAX_32_BITS -#endif - -#include <sys/types.h> - -#undef __memrchr -#undef memrchr - -#ifndef weak_alias -# define __memrchr memrchr -#endif - -/* Search no more than N bytes of S for C. */ -__ptr_t -#ifndef MEMRCHR -__memrchr -#else -MEMRCHR -#endif - (const __ptr_t s, int c_in, size_t n) -{ - const unsigned char *char_ptr; - const unsigned long int *longword_ptr; - unsigned long int longword, magic_bits, charmask; - unsigned char c; - - c = (unsigned char) c_in; - - /* Handle the last few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s + n; - n > 0 && ((unsigned long int) char_ptr - & (sizeof (longword) - 1)) != 0; - --n) - if (*--char_ptr == c) - return (__ptr_t) char_ptr; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (const unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - magic_bits = -1; - magic_bits = magic_bits / 0xff * 0xfe << 1 >> 1 | 1; - - /* Set up a longword, each of whose bytes is C. */ - charmask = c | (c << 8); - charmask |= charmask << 16; -#if LONG_MAX > LONG_MAX_32_BITS - charmask |= charmask << 32; -#endif - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - while (n >= sizeof (longword)) - { - /* We tentatively exit the loop if adding MAGIC_BITS to - LONGWORD fails to change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-30 is set, there will be a carry - into bit 31, so all of the hole bits will be changed. - - The one misfire occurs when bits 24-30 are clear and bit - 31 is set; in this case, the hole at bit 31 is not - changed. If we had access to the processor carry flag, - we could close this loophole by putting the fourth hole - at bit 32! - - So it ignores everything except 128's, when they're aligned - properly. - - 3) But wait! Aren't we looking for C, not zero? - Good point. So what we do is XOR LONGWORD with a longword, - each of whose bytes is C. This turns each byte that is C - into a zero. */ - - longword = *--longword_ptr ^ charmask; - - /* Add MAGIC_BITS to LONGWORD. */ - if ((((longword + magic_bits) - - /* Set those bits that were unchanged by the addition. */ - ^ ~longword) - - /* Look at only the hole bits. If any of the hole bits - are unchanged, most likely one of the bytes was a - zero. */ - & ~magic_bits) != 0) - { - /* Which of the bytes was C? If none of them were, it was - a misfire; continue the search. */ - - const unsigned char *cp = (const unsigned char *) longword_ptr; - -#if LONG_MAX > 2147483647 - if (cp[7] == c) - return (__ptr_t) &cp[7]; - if (cp[6] == c) - return (__ptr_t) &cp[6]; - if (cp[5] == c) - return (__ptr_t) &cp[5]; - if (cp[4] == c) - return (__ptr_t) &cp[4]; -#endif - if (cp[3] == c) - return (__ptr_t) &cp[3]; - if (cp[2] == c) - return (__ptr_t) &cp[2]; - if (cp[1] == c) - return (__ptr_t) &cp[1]; - if (cp[0] == c) - return (__ptr_t) cp; - } - - n -= sizeof (longword); - } - - char_ptr = (const unsigned char *) longword_ptr; - - while (n-- > 0) - { - if (*--char_ptr == c) - return (__ptr_t) char_ptr; - } - - return 0; -} -#ifndef MEMRCHR -# ifdef weak_alias -weak_alias (__memrchr, memrchr) -# endif -#endif diff --git a/string/memset.c b/string/memset.c deleted file mode 100644 index 549790c356..0000000000 --- a/string/memset.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <memcopy.h> - -#undef memset - -void * -inhibit_loop_to_libcall -memset (void *dstpp, int c, size_t len) -{ - long int dstp = (long int) dstpp; - - if (len >= 8) - { - size_t xlen; - op_t cccc; - - cccc = (unsigned char) c; - cccc |= cccc << 8; - cccc |= cccc << 16; - if (OPSIZ > 4) - /* Do the shift in two steps to avoid warning if long has 32 bits. */ - cccc |= (cccc << 16) << 16; - - /* There are at least some bytes to set. - No need to test for LEN == 0 in this alignment loop. */ - while (dstp % OPSIZ != 0) - { - ((byte *) dstp)[0] = c; - dstp += 1; - len -= 1; - } - - /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */ - xlen = len / (OPSIZ * 8); - while (xlen > 0) - { - ((op_t *) dstp)[0] = cccc; - ((op_t *) dstp)[1] = cccc; - ((op_t *) dstp)[2] = cccc; - ((op_t *) dstp)[3] = cccc; - ((op_t *) dstp)[4] = cccc; - ((op_t *) dstp)[5] = cccc; - ((op_t *) dstp)[6] = cccc; - ((op_t *) dstp)[7] = cccc; - dstp += 8 * OPSIZ; - xlen -= 1; - } - len %= OPSIZ * 8; - - /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */ - xlen = len / OPSIZ; - while (xlen > 0) - { - ((op_t *) dstp)[0] = cccc; - dstp += OPSIZ; - xlen -= 1; - } - len %= OPSIZ; - } - - /* Write the last few bytes. */ - while (len > 0) - { - ((byte *) dstp)[0] = c; - dstp += 1; - len -= 1; - } - - return dstpp; -} -libc_hidden_builtin_def (memset) diff --git a/string/noinl-tester.c b/string/noinl-tester.c deleted file mode 100644 index 2e994f73f9..0000000000 --- a/string/noinl-tester.c +++ /dev/null @@ -1,4 +0,0 @@ -/* We don't want to test any of the inline functions here. */ - -#define __NO_STRING_INLINES 1 -#include "tester.c" diff --git a/string/rawmemchr.c b/string/rawmemchr.c deleted file mode 100644 index 42a3f8aaba..0000000000 --- a/string/rawmemchr.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <libc-diag.h> - -#ifndef RAWMEMCHR -# define RAWMEMCHR __rawmemchr -#endif - -/* Find the first occurrence of C in S. */ -void * -RAWMEMCHR (const void *s, int c) -{ - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 8 warns about the size passed to memchr being larger than - PTRDIFF_MAX; the use of SIZE_MAX is deliberate here. */ - DIAG_IGNORE_NEEDS_COMMENT (8, "-Wstringop-overflow="); -#endif - if (c != '\0') - return memchr (s, c, (size_t)-1); - DIAG_POP_NEEDS_COMMENT; - return (char *)s + strlen (s); -} -libc_hidden_def (__rawmemchr) -weak_alias (__rawmemchr, rawmemchr) diff --git a/string/stpcpy.c b/string/stpcpy.c deleted file mode 100644 index 1603fb319b..0000000000 --- a/string/stpcpy.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#define NO_MEMPCPY_STPCPY_REDIRECT -#include <string.h> - -#undef __stpcpy -#undef stpcpy - -#ifndef STPCPY -# define STPCPY __stpcpy -#endif - -/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ -char * -STPCPY (char *dest, const char *src) -{ - size_t len = strlen (src); - return memcpy (dest, src, len + 1) + len; -} -weak_alias (__stpcpy, stpcpy) -libc_hidden_def (__stpcpy) -libc_hidden_builtin_def (stpcpy) diff --git a/string/stpncpy.c b/string/stpncpy.c deleted file mode 100644 index 9b8ef348e5..0000000000 --- a/string/stpncpy.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 1993-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifdef _LIBC -# include <string.h> -#else -# include <sys/types.h> -#endif - -#ifndef STPNCPY -# ifdef weak_alias -# define STPNCPY __stpncpy -weak_alias (__stpncpy, stpncpy) -# else -# define STPNCPY stpncpy -# endif -#endif - -/* Copy no more than N characters of SRC to DEST, returning the address of - the terminating '\0' in DEST, if any, or else DEST + N. */ -char * -STPNCPY (char *dest, const char *src, size_t n) -{ - size_t size = __strnlen (src, n); - memcpy (dest, src, size); - dest += size; - if (size == n) - return dest; - return memset (dest, '\0', n - size); -} -#ifdef weak_alias -libc_hidden_def (__stpncpy) -#endif diff --git a/string/str-two-way.h b/string/str-two-way.h deleted file mode 100644 index 599c867ffd..0000000000 --- a/string/str-two-way.h +++ /dev/null @@ -1,527 +0,0 @@ -/* Byte-wise substring search, using the Two-Way algorithm. - Copyright (C) 2008-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Eric Blake <ebb9@byu.net>, 2008. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Before including this file, you need to include <string.h> (and - <config.h> before that, if not part of libc), and define: - RETURN_TYPE A macro that expands to the return type. - AVAILABLE(h, h_l, j, n_l) - A macro that returns nonzero if there are - at least N_L bytes left starting at H[J]. - H is 'unsigned char *', H_L, J, and N_L - are 'size_t'; H_L is an lvalue. For - NUL-terminated searches, H_L can be - modified each iteration to avoid having - to compute the end of H up front. - - For case-insensitivity, you may optionally define: - CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L - characters of P1 and P2 are equal. - CANON_ELEMENT(c) A macro that canonicalizes an element right after - it has been fetched from one of the two strings. - The argument is an 'unsigned char'; the result - must be an 'unsigned char' as well. - - Other macros you may optionally define: - RET0_IF_0(a) Documented below at default definition. - CHECK_EOL Same. - - This file undefines the macros listed above, and defines - LONG_NEEDLE_THRESHOLD. -*/ - -#include <limits.h> -#include <stdint.h> -#include <sys/param.h> /* Defines MAX. */ - -/* We use the Two-Way string matching algorithm, which guarantees - linear complexity with constant space. Additionally, for long - needles, we also use a bad character shift table similar to the - Boyer-Moore algorithm to achieve improved (potentially sub-linear) - performance. - - See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260 - and http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm -*/ - -/* Point at which computing a bad-byte shift table is likely to be - worthwhile. Small needles should not compute a table, since it - adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a - speedup no greater than a factor of NEEDLE_LEN. The larger the - needle, the better the potential performance gain. On the other - hand, on non-POSIX systems with CHAR_BIT larger than eight, the - memory required for the table is prohibitive. */ -#if CHAR_BIT < 10 -# define LONG_NEEDLE_THRESHOLD 32U -#else -# define LONG_NEEDLE_THRESHOLD SIZE_MAX -#endif - -#ifndef CANON_ELEMENT -# define CANON_ELEMENT(c) c -#endif -#ifndef CMP_FUNC -# define CMP_FUNC memcmp -#endif - -/* Check for end-of-line in strstr and strcasestr routines. - We piggy-back matching procedure for detecting EOL where possible, - and use AVAILABLE macro otherwise. */ -#ifndef CHECK_EOL -# define CHECK_EOL (0) -#endif - -/* Return NULL if argument is '\0'. */ -#ifndef RET0_IF_0 -# define RET0_IF_0(a) /* nothing */ -#endif - -/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN. - Return the index of the first byte in the right half, and set - *PERIOD to the global period of the right half. - - The global period of a string is the smallest index (possibly its - length) at which all remaining bytes in the string are repetitions - of the prefix (the last repetition may be a subset of the prefix). - - When NEEDLE is factored into two halves, a local period is the - length of the smallest word that shares a suffix with the left half - and shares a prefix with the right half. All factorizations of a - non-empty NEEDLE have a local period of at least 1 and no greater - than NEEDLE_LEN. - - A critical factorization has the property that the local period - equals the global period. All strings have at least one critical - factorization with the left half smaller than the global period. - - Given an ordered alphabet, a critical factorization can be computed - in linear time, with 2 * NEEDLE_LEN comparisons, by computing the - larger of two ordered maximal suffixes. The ordered maximal - suffixes are determined by lexicographic comparison of - periodicity. */ -static size_t -critical_factorization (const unsigned char *needle, size_t needle_len, - size_t *period) -{ - /* Index of last byte of left half, or SIZE_MAX. */ - size_t max_suffix, max_suffix_rev; - size_t j; /* Index into NEEDLE for current candidate suffix. */ - size_t k; /* Offset into current period. */ - size_t p; /* Intermediate period. */ - unsigned char a, b; /* Current comparison bytes. */ - - /* Invariants: - 0 <= j < NEEDLE_LEN - 1 - -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed) - min(max_suffix, max_suffix_rev) < global period of NEEDLE - 1 <= p <= global period of NEEDLE - p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j] - 1 <= k <= p - */ - - /* Perform lexicographic search. */ - max_suffix = SIZE_MAX; - j = 0; - k = p = 1; - while (j + k < needle_len) - { - a = CANON_ELEMENT (needle[j + k]); - b = CANON_ELEMENT (needle[max_suffix + k]); - if (a < b) - { - /* Suffix is smaller, period is entire prefix so far. */ - j += k; - k = 1; - p = j - max_suffix; - } - else if (a == b) - { - /* Advance through repetition of the current period. */ - if (k != p) - ++k; - else - { - j += p; - k = 1; - } - } - else /* b < a */ - { - /* Suffix is larger, start over from current location. */ - max_suffix = j++; - k = p = 1; - } - } - *period = p; - - /* Perform reverse lexicographic search. */ - max_suffix_rev = SIZE_MAX; - j = 0; - k = p = 1; - while (j + k < needle_len) - { - a = CANON_ELEMENT (needle[j + k]); - b = CANON_ELEMENT (needle[max_suffix_rev + k]); - if (b < a) - { - /* Suffix is smaller, period is entire prefix so far. */ - j += k; - k = 1; - p = j - max_suffix_rev; - } - else if (a == b) - { - /* Advance through repetition of the current period. */ - if (k != p) - ++k; - else - { - j += p; - k = 1; - } - } - else /* a < b */ - { - /* Suffix is larger, start over from current location. */ - max_suffix_rev = j++; - k = p = 1; - } - } - - /* Choose the longer suffix. Return the first byte of the right - half, rather than the last byte of the left half. */ - if (max_suffix_rev + 1 < max_suffix + 1) - return max_suffix + 1; - *period = p; - return max_suffix_rev + 1; -} - -/* Return the first location of non-empty NEEDLE within HAYSTACK, or - NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This - method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD. - Performance is guaranteed to be linear, with an initialization cost - of 2 * NEEDLE_LEN comparisons. - - If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at - most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. - If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * - HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */ -static RETURN_TYPE -two_way_short_needle (const unsigned char *haystack, size_t haystack_len, - const unsigned char *needle, size_t needle_len) -{ - size_t i; /* Index into current byte of NEEDLE. */ - size_t j; /* Index into current window of HAYSTACK. */ - size_t period; /* The period of the right half of needle. */ - size_t suffix; /* The index of the right half of needle. */ - - /* Factor the needle into two halves, such that the left half is - smaller than the global period, and the right half is - periodic (with a period as large as NEEDLE_LEN - suffix). */ - suffix = critical_factorization (needle, needle_len, &period); - - /* Perform the search. Each iteration compares the right half - first. */ - if (CMP_FUNC (needle, needle + period, suffix) == 0) - { - /* Entire needle is periodic; a mismatch can only advance by the - period, so use memory to avoid rescanning known occurrences - of the period. */ - size_t memory = 0; - j = 0; - while (AVAILABLE (haystack, haystack_len, j, needle_len)) - { - const unsigned char *pneedle; - const unsigned char *phaystack; - - /* Scan for matches in right half. */ - i = MAX (suffix, memory); - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (i < needle_len && (CANON_ELEMENT (*pneedle++) - == CANON_ELEMENT (*phaystack++))) - ++i; - if (needle_len <= i) - { - /* Scan for matches in left half. */ - i = suffix - 1; - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (memory < i + 1 && (CANON_ELEMENT (*pneedle--) - == CANON_ELEMENT (*phaystack--))) - --i; - if (i + 1 < memory + 1) - return (RETURN_TYPE) (haystack + j); - /* No match, so remember how many repetitions of period - on the right half were scanned. */ - j += period; - memory = needle_len - period; - } - else - { - j += i - suffix + 1; - memory = 0; - } - } - } - else - { - const unsigned char *phaystack = &haystack[suffix]; - /* The comparison always starts from needle[suffix], so cache it - and use an optimized first-character loop. */ - unsigned char needle_suffix = CANON_ELEMENT (needle[suffix]); - -#if CHECK_EOL - /* We start matching from the SUFFIX'th element, so make sure we - don't hit '\0' before that. */ - if (haystack_len < suffix + 1 - && !AVAILABLE (haystack, haystack_len, 0, suffix + 1)) - return NULL; -#endif - - /* The two halves of needle are distinct; no extra memory is - required, and any mismatch results in a maximal shift. */ - period = MAX (suffix, needle_len - suffix) + 1; - j = 0; - while (1 -#if !CHECK_EOL - && AVAILABLE (haystack, haystack_len, j, needle_len) -#endif - ) - { - unsigned char haystack_char; - const unsigned char *pneedle; - - /* TODO: The first-character loop can be sped up by adapting - longword-at-a-time implementation of memchr/strchr. */ - if (needle_suffix - != (haystack_char = CANON_ELEMENT (*phaystack++))) - { - RET0_IF_0 (haystack_char); -#if !CHECK_EOL - ++j; -#endif - continue; - } - -#if CHECK_EOL - /* Calculate J if it wasn't kept up-to-date in the first-character - loop. */ - j = phaystack - &haystack[suffix] - 1; -#endif - - /* Scan for matches in right half. */ - i = suffix + 1; - pneedle = &needle[i]; - while (i < needle_len) - { - if (CANON_ELEMENT (*pneedle++) - != (haystack_char = CANON_ELEMENT (*phaystack++))) - { - RET0_IF_0 (haystack_char); - break; - } - ++i; - } - if (needle_len <= i) - { - /* Scan for matches in left half. */ - i = suffix - 1; - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (i != SIZE_MAX) - { - if (CANON_ELEMENT (*pneedle--) - != (haystack_char = CANON_ELEMENT (*phaystack--))) - { - RET0_IF_0 (haystack_char); - break; - } - --i; - } - if (i == SIZE_MAX) - return (RETURN_TYPE) (haystack + j); - j += period; - } - else - j += i - suffix + 1; - -#if CHECK_EOL - if (!AVAILABLE (haystack, haystack_len, j, needle_len)) - break; -#endif - - phaystack = &haystack[suffix + j]; - } - } - ret0: __attribute__ ((unused)) - return NULL; -} - -/* Return the first location of non-empty NEEDLE within HAYSTACK, or - NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This - method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN. - Performance is guaranteed to be linear, with an initialization cost - of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations. - - If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at - most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, - and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible. - If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * - HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and - sublinear performance is not possible. */ -static RETURN_TYPE -two_way_long_needle (const unsigned char *haystack, size_t haystack_len, - const unsigned char *needle, size_t needle_len) -{ - size_t i; /* Index into current byte of NEEDLE. */ - size_t j; /* Index into current window of HAYSTACK. */ - size_t period; /* The period of the right half of needle. */ - size_t suffix; /* The index of the right half of needle. */ - size_t shift_table[1U << CHAR_BIT]; /* See below. */ - - /* Factor the needle into two halves, such that the left half is - smaller than the global period, and the right half is - periodic (with a period as large as NEEDLE_LEN - suffix). */ - suffix = critical_factorization (needle, needle_len, &period); - - /* Populate shift_table. For each possible byte value c, - shift_table[c] is the distance from the last occurrence of c to - the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE. - shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */ - for (i = 0; i < 1U << CHAR_BIT; i++) - shift_table[i] = needle_len; - for (i = 0; i < needle_len; i++) - shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1; - - /* Perform the search. Each iteration compares the right half - first. */ - if (CMP_FUNC (needle, needle + period, suffix) == 0) - { - /* Entire needle is periodic; a mismatch can only advance by the - period, so use memory to avoid rescanning known occurrences - of the period. */ - size_t memory = 0; - size_t shift; - j = 0; - while (AVAILABLE (haystack, haystack_len, j, needle_len)) - { - const unsigned char *pneedle; - const unsigned char *phaystack; - - /* Check the last byte first; if it does not match, then - shift to the next possible match location. */ - shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; - if (0 < shift) - { - if (memory && shift < period) - { - /* Since needle is periodic, but the last period has - a byte out of place, there can be no match until - after the mismatch. */ - shift = needle_len - period; - } - memory = 0; - j += shift; - continue; - } - /* Scan for matches in right half. The last byte has - already been matched, by virtue of the shift table. */ - i = MAX (suffix, memory); - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (i < needle_len - 1 && (CANON_ELEMENT (*pneedle++) - == CANON_ELEMENT (*phaystack++))) - ++i; - if (needle_len - 1 <= i) - { - /* Scan for matches in left half. */ - i = suffix - 1; - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (memory < i + 1 && (CANON_ELEMENT (*pneedle--) - == CANON_ELEMENT (*phaystack--))) - --i; - if (i + 1 < memory + 1) - return (RETURN_TYPE) (haystack + j); - /* No match, so remember how many repetitions of period - on the right half were scanned. */ - j += period; - memory = needle_len - period; - } - else - { - j += i - suffix + 1; - memory = 0; - } - } - } - else - { - /* The two halves of needle are distinct; no extra memory is - required, and any mismatch results in a maximal shift. */ - size_t shift; - period = MAX (suffix, needle_len - suffix) + 1; - j = 0; - while (AVAILABLE (haystack, haystack_len, j, needle_len)) - { - const unsigned char *pneedle; - const unsigned char *phaystack; - - /* Check the last byte first; if it does not match, then - shift to the next possible match location. */ - shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; - if (0 < shift) - { - j += shift; - continue; - } - /* Scan for matches in right half. The last byte has - already been matched, by virtue of the shift table. */ - i = suffix; - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (i < needle_len - 1 && (CANON_ELEMENT (*pneedle++) - == CANON_ELEMENT (*phaystack++))) - ++i; - if (needle_len - 1 <= i) - { - /* Scan for matches in left half. */ - i = suffix - 1; - pneedle = &needle[i]; - phaystack = &haystack[i + j]; - while (i != SIZE_MAX && (CANON_ELEMENT (*pneedle--) - == CANON_ELEMENT (*phaystack--))) - --i; - if (i == SIZE_MAX) - return (RETURN_TYPE) (haystack + j); - j += period; - } - else - j += i - suffix + 1; - } - } - return NULL; -} - -#undef AVAILABLE -#undef CANON_ELEMENT -#undef CMP_FUNC -#undef RET0_IF_0 -#undef RETURN_TYPE -#undef CHECK_EOL diff --git a/string/stratcliff.c b/string/stratcliff.c deleted file mode 100644 index e28b0c5058..0000000000 --- a/string/stratcliff.c +++ /dev/null @@ -1,561 +0,0 @@ -/* Test for string function add boundaries of usable memory. - Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define _GNU_SOURCE 1 - -/* Make sure we don't test the optimized inline functions if we want to - test the real implementation. */ -#undef __USE_STRING_INLINES - -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <sys/mman.h> -#include <sys/param.h> - -#ifndef CHAR -# define L(c) c -# define CHAR char -# define MEMSET memset -# define STRLEN strlen -# define STRNLEN strnlen -# define STRCHR strchr -# define STRRCHR strrchr -# define STRCPY strcpy -# define STRNCPY strncpy -# define MEMCMP memcmp -# define STPCPY stpcpy -# define STPNCPY stpncpy -# define MEMCPY memcpy -# define MEMPCPY mempcpy -# define MEMCHR memchr -# define STRCMP strcmp -# define STRNCMP strncmp -#endif - - -#define STRINGIFY(s) STRINGIFY2 (s) -#define STRINGIFY2(s) #s - - -int -do_test (void) -{ - int size = sysconf (_SC_PAGESIZE); - int nchars = size / sizeof (CHAR); - CHAR *adr; - CHAR *dest; - int result = 0; - - adr = (CHAR *) mmap (NULL, 3 * size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); - dest = (CHAR *) mmap (NULL, 3 * size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); - if (adr == MAP_FAILED || dest == MAP_FAILED) - { - if (errno == ENOSYS) - puts ("No test, mmap not available."); - else - { - printf ("mmap failed: %m"); - result = 1; - } - } - else - { - int inner, middle, outer; - - mprotect (adr, size, PROT_NONE); - mprotect (adr + 2 * nchars, size, PROT_NONE); - adr += nchars; - - mprotect (dest, size, PROT_NONE); - mprotect (dest + 2 * nchars, size, PROT_NONE); - dest += nchars; - - MEMSET (adr, L('T'), nchars); - - /* strlen/wcslen test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) - { - adr[inner] = L('\0'); - - if (STRLEN (&adr[outer]) != (size_t) (inner - outer)) - { - printf ("%s flunked for outer = %d, inner = %d\n", - STRINGIFY (STRLEN), outer, inner); - result = 1; - } - - adr[inner] = L('T'); - } - } - - /* strnlen/wcsnlen test */ - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) - { - adr[inner] = L('\0'); - - if (STRNLEN (&adr[outer], inner - outer + 1) - != (size_t) (inner - outer)) - { - printf ("%s flunked for outer = %d, inner = %d\n", - STRINGIFY (STRNLEN), outer, inner); - result = 1; - } - - adr[inner] = L('T'); - } - } - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner <= nchars; ++inner) - { - if (STRNLEN (&adr[outer], inner - outer) - != (size_t) (inner - outer)) - { - printf ("%s flunked bounded for outer = %d, inner = %d\n", - STRINGIFY (STRNLEN), outer, inner); - result = 1; - } - } - } - - /* strchr/wcschr test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) - { - for (inner = middle; inner < nchars; ++inner) - { - adr[middle] = L('V'); - adr[inner] = L('\0'); - - CHAR *cp = STRCHR (&adr[outer], L('V')); - - if ((inner == middle && cp != NULL) - || (inner != middle - && (cp - &adr[outer]) != middle - outer)) - { - printf ("%s flunked for outer = %d, middle = %d, " - "inner = %d\n", - STRINGIFY (STRCHR), outer, middle, inner); - result = 1; - } - - adr[inner] = L('T'); - adr[middle] = L('T'); - } - } - } - - /* Special test. */ - adr[nchars - 1] = L('\0'); - if (STRCHR (&adr[nchars - 1], L('\n')) != NULL) - { - printf ("%s flunked test of empty string at end of page\n", - STRINGIFY (STRCHR)); - result = 1; - } - - /* strrchr/wcsrchr test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) - { - for (inner = middle; inner < nchars; ++inner) - { - adr[middle] = L('V'); - adr[inner] = L('\0'); - - CHAR *cp = STRRCHR (&adr[outer], L('V')); - - if ((inner == middle && cp != NULL) - || (inner != middle - && (cp - &adr[outer]) != middle - outer)) - { - printf ("%s flunked for outer = %d, middle = %d, " - "inner = %d\n", - STRINGIFY (STRRCHR), outer, middle, inner); - result = 1; - } - - adr[inner] = L('T'); - adr[middle] = L('T'); - } - } - } - - /* memchr test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) - { - adr[middle] = L('V'); - - CHAR *cp = MEMCHR (&adr[outer], L('V'), 3 * size); - - if (cp - &adr[outer] != middle - outer) - { - printf ("%s flunked for outer = %d, middle = %d\n", - STRINGIFY (MEMCHR), outer, middle); - result = 1; - } - - adr[middle] = L('T'); - } - } - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - CHAR *cp = MEMCHR (&adr[outer], L('V'), nchars - outer); - - if (cp != NULL) - { - printf ("%s flunked for outer = %d\n", - STRINGIFY (MEMCHR), outer); - result = 1; - } - } - - /* These functions only exist for single-byte characters. */ -#ifndef WCSTEST - /* rawmemchr test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) - { - adr[middle] = L('V'); - - CHAR *cp = rawmemchr (&adr[outer], L('V')); - - if (cp - &adr[outer] != middle - outer) - { - printf ("%s flunked for outer = %d, middle = %d\n", - STRINGIFY (rawmemchr), outer, middle); - result = 1; - } - - adr[middle] = L('T'); - } - } - - /* memrchr test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) - { - adr[middle] = L('V'); - - CHAR *cp = memrchr (&adr[outer], L('V'), nchars - outer); - - if (cp - &adr[outer] != middle - outer) - { - printf ("%s flunked for outer = %d, middle = %d\n", - STRINGIFY (memrchr), outer, middle); - result = 1; - } - - adr[middle] = L('T'); - } - } - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - CHAR *cp = memrchr (&adr[outer], L('V'), nchars - outer); - - if (cp != NULL) - { - printf ("%s flunked for outer = %d\n", - STRINGIFY (memrchr), outer); - result = 1; - } - } -#endif - - /* strcpy/wcscpy test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) - { - adr[inner] = L('\0'); - - if (STRCPY (dest, &adr[outer]) != dest - || STRLEN (dest) != (size_t) (inner - outer)) - { - printf ("%s flunked for outer = %d, inner = %d\n", - STRINGIFY (STRCPY), outer, inner); - result = 1; - } - - adr[inner] = L('T'); - } - } - - /* strcmp/wcscmp tests */ - for (outer = 1; outer < 32; ++outer) - for (middle = 0; middle < 16; ++middle) - { - MEMSET (adr + middle, L('T'), 256); - adr[256] = L('\0'); - MEMSET (dest + nchars - outer, L('T'), outer - 1); - dest[nchars - 1] = L('\0'); - - if (STRCMP (adr + middle, dest + nchars - outer) <= 0) - { - printf ("%s 1 flunked for outer = %d, middle = %d\n", - STRINGIFY (STRCMP), outer, middle); - result = 1; - } - - if (STRCMP (dest + nchars - outer, adr + middle) >= 0) - { - printf ("%s 2 flunked for outer = %d, middle = %d\n", - STRINGIFY (STRCMP), outer, middle); - result = 1; - } - } - - /* strncmp/wcsncmp tests */ - for (outer = 1; outer < 32; ++outer) - for (middle = 0; middle < 16; ++middle) - { - MEMSET (adr + middle, L('T'), 256); - adr[256] = L('\0'); - MEMSET (dest + nchars - outer, L('T'), outer - 1); - dest[nchars - 1] = L('U'); - - for (inner = 0; inner < outer; ++inner) - { - if (STRNCMP (adr + middle, dest + nchars - outer, inner) != 0) - { - printf ("%s 1 flunked for outer = %d, middle = %d, " - "inner = %d\n", - STRINGIFY (STRNCMP), outer, middle, inner); - result = 1; - } - - if (STRNCMP (dest + nchars - outer, adr + middle, inner) != 0) - { - printf ("%s 2 flunked for outer = %d, middle = %d, " - "inner = %d\n", - STRINGIFY (STRNCMP), outer, middle, inner); - result = 1; - } - } - - if (STRNCMP (adr + middle, dest + nchars - outer, outer) >= 0) - { - printf ("%s 1 flunked for outer = %d, middle = %d, full\n", - STRINGIFY (STRNCMP), outer, middle); - result = 1; - } - - if (STRNCMP (dest + nchars - outer, adr + middle, outer) <= 0) - { - printf ("%s 2 flunked for outer = %d, middle = %d, full\n", - STRINGIFY (STRNCMP), outer, middle); - result = 1; - } - } - - /* strncpy/wcsncpy tests */ - adr[nchars - 1] = L('T'); - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - size_t len; - - for (len = 0; len < nchars - outer; ++len) - { - if (STRNCPY (dest, &adr[outer], len) != dest - || MEMCMP (dest, &adr[outer], len) != 0) - { - printf ("outer %s flunked for outer = %d, len = %Zd\n", - STRINGIFY (STRNCPY), outer, len); - result = 1; - } - } - } - adr[nchars - 1] = L('\0'); - - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) - { - size_t len; - - adr[inner] = L('\0'); - - for (len = 0; len < nchars - outer + 64; ++len) - { - if (STRNCPY (dest, &adr[outer], len) != dest - || MEMCMP (dest, &adr[outer], - MIN (inner - outer, len)) != 0 - || (inner - outer < len - && STRLEN (dest) != (inner - outer))) - { - printf ("%s flunked for outer = %d, inner = %d, " - "len = %Zd\n", - STRINGIFY (STRNCPY), outer, inner, len); - result = 1; - } - if (STRNCPY (dest + 1, &adr[outer], len) != dest + 1 - || MEMCMP (dest + 1, &adr[outer], - MIN (inner - outer, len)) != 0 - || (inner - outer < len - && STRLEN (dest + 1) != (inner - outer))) - { - printf ("%s+1 flunked for outer = %d, inner = %d, " - "len = %Zd\n", - STRINGIFY (STRNCPY), outer, inner, len); - result = 1; - } - } - - adr[inner] = L('T'); - } - } - - /* stpcpy/wcpcpy test */ - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) - { - adr[inner] = L('\0'); - - if ((STPCPY (dest, &adr[outer]) - dest) != inner - outer) - { - printf ("%s flunked for outer = %d, inner = %d\n", - STRINGIFY (STPCPY), outer, inner); - result = 1; - } - - adr[inner] = L('T'); - } - } - - /* stpncpy/wcpncpy test */ - adr[nchars - 1] = L('T'); - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - size_t len; - - for (len = 0; len < nchars - outer; ++len) - { - if (STPNCPY (dest, &adr[outer], len) != dest + len - || MEMCMP (dest, &adr[outer], len) != 0) - { - printf ("outer %s flunked for outer = %d, len = %Zd\n", - STRINGIFY (STPNCPY), outer, len); - result = 1; - } - } - } - adr[nchars - 1] = L('\0'); - - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) - { - adr[middle] = L('\0'); - - for (inner = 0; inner < nchars - outer; ++ inner) - { - if ((STPNCPY (dest, &adr[outer], inner) - dest) - != MIN (inner, middle - outer)) - { - printf ("%s flunked for outer = %d, middle = %d, " - "inner = %d\n", - STRINGIFY (STPNCPY), outer, middle, inner); - result = 1; - } - } - - adr[middle] = L('T'); - } - } - - /* memcpy/wmemcpy test */ - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - for (inner = 0; inner < nchars - outer; ++inner) - if (MEMCPY (dest, &adr[outer], inner) != dest) - { - printf ("%s flunked for outer = %d, inner = %d\n", - STRINGIFY (MEMCPY), outer, inner); - result = 1; - } - - /* mempcpy/wmempcpy test */ - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - for (inner = 0; inner < nchars - outer; ++inner) - if (MEMPCPY (dest, &adr[outer], inner) != dest + inner) - { - printf ("%s flunked for outer = %d, inner = %d\n", - STRINGIFY (MEMPCPY), outer, inner); - result = 1; - } - - /* This function only exists for single-byte characters. */ -#ifndef WCSTEST - /* memccpy test */ - memset (adr, '\0', nchars); - for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - for (inner = 0; inner < nchars - outer; ++inner) - if (memccpy (dest, &adr[outer], L('\1'), inner) != NULL) - { - printf ("memccpy flunked full copy for outer = %d, inner = %d\n", - outer, inner); - result = 1; - } - for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - for (middle = 0; middle < nchars - outer; ++middle) - { - memset (dest, L('\2'), middle + 1); - for (inner = 0; inner < middle; ++inner) - { - adr[outer + inner] = L('\1'); - - if (memccpy (dest, &adr[outer], '\1', middle + 128) - != dest + inner + 1) - { - printf ("\ -memccpy flunked partial copy for outer = %d, middle = %d, inner = %d\n", - outer, middle, inner); - result = 1; - } - else if (dest[inner + 1] != L('\2')) - { - printf ("\ -memccpy copied too much for outer = %d, middle = %d, inner = %d\n", - outer, middle, inner); - result = 1; - } - adr[outer + inner] = L('\0'); - } - } -#endif - } - - return result; -} - -#include <support/test-driver.c> diff --git a/string/strcasecmp.c b/string/strcasecmp.c deleted file mode 100644 index 2d6ae0fa9d..0000000000 --- a/string/strcasecmp.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <ctype.h> -#include <string.h> - -#ifndef _LIBC -# define __strcasecmp strcasecmp -# define TOLOWER(Ch) tolower (Ch) -#else -# include <locale/localeinfo.h> -# ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define __strcasecmp __strcasecmp_l -# endif -# define TOLOWER(Ch) __tolower_l ((Ch), loc) -#endif - -#ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define LOCALE_PARAM , __locale_t loc -#else -# define LOCALE_PARAM -#endif - -/* Compare S1 and S2, ignoring case, returning less than, equal to or - greater than zero if S1 is lexicographically less than, - equal to or greater than S2. */ -int -__strcasecmp (const char *s1, const char *s2 LOCALE_PARAM) -{ -#if defined _LIBC && !defined USE_IN_EXTENDED_LOCALE_MODEL - __locale_t loc = _NL_CURRENT_LOCALE; -#endif - const unsigned char *p1 = (const unsigned char *) s1; - const unsigned char *p2 = (const unsigned char *) s2; - int result; - - if (p1 == p2) - return 0; - - while ((result = TOLOWER (*p1) - TOLOWER (*p2++)) == 0) - if (*p1++ == '\0') - break; - - return result; -} -#ifndef __strcasecmp -libc_hidden_def (__strcasecmp) -weak_alias (__strcasecmp, strcasecmp) -#endif diff --git a/string/strcasecmp_l.c b/string/strcasecmp_l.c deleted file mode 100644 index 78271ad2ef..0000000000 --- a/string/strcasecmp_l.c +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define USE_IN_EXTENDED_LOCALE_MODEL 1 -#include "strcasecmp.c" - -libc_hidden_def (__strcasecmp_l) -weak_alias (__strcasecmp_l, strcasecmp_l) diff --git a/string/strcasestr.c b/string/strcasestr.c deleted file mode 100644 index 2acf003155..0000000000 --- a/string/strcasestr.c +++ /dev/null @@ -1,104 +0,0 @@ -/* Return the offset of one string within another. - Copyright (C) 1994-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* - * My personal strstr() implementation that beats most other algorithms. - * Until someone tells me otherwise, I assume that this is the - * fastest implementation of strstr() in C. - * I deliberately chose not to comment it. You should have at least - * as much fun trying to understand it, as I had to write it :-). - * - * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */ - -/* Specification. */ -#include <string.h> - -#include <ctype.h> -#include <stdbool.h> -#include <strings.h> - -#define TOLOWER(Ch) tolower (Ch) - -/* Two-Way algorithm. */ -#define RETURN_TYPE char * -#define AVAILABLE(h, h_l, j, n_l) \ - (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \ - && ((h_l) = (j) + (n_l))) -#define CHECK_EOL (1) -#define RET0_IF_0(a) if (!a) goto ret0 -#define CANON_ELEMENT(c) TOLOWER (c) -#define CMP_FUNC(p1, p2, l) \ - __strncasecmp ((const char *) (p1), (const char *) (p2), l) -#include "str-two-way.h" - -#undef strcasestr -#undef __strcasestr - -#ifndef STRCASESTR -#define STRCASESTR __strcasestr -#endif - - -/* Find the first occurrence of NEEDLE in HAYSTACK, using - case-insensitive comparison. This function gives unspecified - results in multibyte locales. */ -char * -STRCASESTR (const char *haystack_start, const char *needle_start) -{ - const char *haystack = haystack_start; - const char *needle = needle_start; - size_t needle_len; /* Length of NEEDLE. */ - size_t haystack_len; /* Known minimum length of HAYSTACK. */ - bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */ - - /* Determine length of NEEDLE, and in the process, make sure - HAYSTACK is at least as long (no point processing all of a long - NEEDLE if HAYSTACK is too short). */ - while (*haystack && *needle) - { - ok &= (TOLOWER ((unsigned char) *haystack) - == TOLOWER ((unsigned char) *needle)); - haystack++; - needle++; - } - if (*needle) - return NULL; - if (ok) - return (char *) haystack_start; - needle_len = needle - needle_start; - haystack = haystack_start + 1; - haystack_len = needle_len - 1; - - /* Perform the search. Abstract memory is considered to be an array - of 'unsigned char' values, not an array of 'char' values. See - ISO C 99 section 6.2.6.1. */ - if (needle_len < LONG_NEEDLE_THRESHOLD) - return two_way_short_needle ((const unsigned char *) haystack, - haystack_len, - (const unsigned char *) needle_start, - needle_len); - return two_way_long_needle ((const unsigned char *) haystack, haystack_len, - (const unsigned char *) needle_start, - needle_len); -} - -#undef LONG_NEEDLE_THRESHOLD - -#ifndef NO_ALIAS -weak_alias (__strcasestr, strcasestr) -#endif diff --git a/string/strcat.c b/string/strcat.c deleted file mode 100644 index 8373fabc1d..0000000000 --- a/string/strcat.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef strcat - -#ifndef STRCAT -# define STRCAT strcat -#endif - -/* Append SRC on the end of DEST. */ -char * -STRCAT (char *dest, const char *src) -{ - strcpy (dest + strlen (dest), src); - return dest; -} -libc_hidden_builtin_def (strcat) diff --git a/string/strchr.c b/string/strchr.c deleted file mode 100644 index 50e4172853..0000000000 --- a/string/strchr.c +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Based on strlen implementation by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se) and - bug fix and commentary by Jim Blandy (jimb@ai.mit.edu); - adaptation to strchr suggested by Dick Karpinski (dick@cca.ucsf.edu), - and implemented by Roland McGrath (roland@ai.mit.edu). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdlib.h> - -#undef strchr - -#ifndef STRCHR -# define STRCHR strchr -#endif - -/* Find the first occurrence of C in S. */ -char * -STRCHR (const char *s, int c_in) -{ - const unsigned char *char_ptr; - const unsigned long int *longword_ptr; - unsigned long int longword, magic_bits, charmask; - unsigned char c; - - c = (unsigned char) c_in; - - /* Handle the first few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s; - ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0; - ++char_ptr) - if (*char_ptr == c) - return (void *) char_ptr; - else if (*char_ptr == '\0') - return NULL; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - magic_bits = -1; - magic_bits = magic_bits / 0xff * 0xfe << 1 >> 1 | 1; - - /* Set up a longword, each of whose bytes is C. */ - charmask = c | (c << 8); - charmask |= charmask << 16; - if (sizeof (longword) > 4) - /* Do the shift in two steps to avoid a warning if long has 32 bits. */ - charmask |= (charmask << 16) << 16; - if (sizeof (longword) > 8) - abort (); - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - for (;;) - { - /* We tentatively exit the loop if adding MAGIC_BITS to - LONGWORD fails to change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-30 is set, there will be a carry - into bit 31, so all of the hole bits will be changed. - - The one misfire occurs when bits 24-30 are clear and bit - 31 is set; in this case, the hole at bit 31 is not - changed. If we had access to the processor carry flag, - we could close this loophole by putting the fourth hole - at bit 32! - - So it ignores everything except 128's, when they're aligned - properly. - - 3) But wait! Aren't we looking for C as well as zero? - Good point. So what we do is XOR LONGWORD with a longword, - each of whose bytes is C. This turns each byte that is C - into a zero. */ - - longword = *longword_ptr++; - - /* Add MAGIC_BITS to LONGWORD. */ - if ((((longword + magic_bits) - - /* Set those bits that were unchanged by the addition. */ - ^ ~longword) - - /* Look at only the hole bits. If any of the hole bits - are unchanged, most likely one of the bytes was a - zero. */ - & ~magic_bits) != 0 || - - /* That caught zeroes. Now test for C. */ - ((((longword ^ charmask) + magic_bits) ^ ~(longword ^ charmask)) - & ~magic_bits) != 0) - { - /* Which of the bytes was C or zero? - If none of them were, it was a misfire; continue the search. */ - - const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); - - if (*cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (sizeof (longword) > 4) - { - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - if (*++cp == c) - return (char *) cp; - else if (*cp == '\0') - return NULL; - } - } - } - - return NULL; -} - -#ifdef weak_alias -# undef index -weak_alias (strchr, index) -#endif -libc_hidden_builtin_def (strchr) diff --git a/string/strchrnul.c b/string/strchrnul.c deleted file mode 100644 index d62dc9c595..0000000000 --- a/string/strchrnul.c +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Based on strlen implementation by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se) and - bug fix and commentary by Jim Blandy (jimb@ai.mit.edu); - adaptation to strchr suggested by Dick Karpinski (dick@cca.ucsf.edu), - and implemented by Roland McGrath (roland@ai.mit.edu). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <memcopy.h> -#include <stdlib.h> - -#undef __strchrnul -#undef strchrnul - -#ifndef STRCHRNUL -# define STRCHRNUL __strchrnul -#endif - -/* Find the first occurrence of C in S or the final NUL byte. */ -char * -STRCHRNUL (const char *s, int c_in) -{ - const unsigned char *char_ptr; - const unsigned long int *longword_ptr; - unsigned long int longword, magic_bits, charmask; - unsigned char c; - - c = (unsigned char) c_in; - - /* Handle the first few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s; - ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0; - ++char_ptr) - if (*char_ptr == c || *char_ptr == '\0') - return (void *) char_ptr; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - magic_bits = -1; - magic_bits = magic_bits / 0xff * 0xfe << 1 >> 1 | 1; - - /* Set up a longword, each of whose bytes is C. */ - charmask = c | (c << 8); - charmask |= charmask << 16; - if (sizeof (longword) > 4) - /* Do the shift in two steps to avoid a warning if long has 32 bits. */ - charmask |= (charmask << 16) << 16; - if (sizeof (longword) > 8) - abort (); - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - for (;;) - { - /* We tentatively exit the loop if adding MAGIC_BITS to - LONGWORD fails to change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-30 is set, there will be a carry - into bit 31, so all of the hole bits will be changed. - - The one misfire occurs when bits 24-30 are clear and bit - 31 is set; in this case, the hole at bit 31 is not - changed. If we had access to the processor carry flag, - we could close this loophole by putting the fourth hole - at bit 32! - - So it ignores everything except 128's, when they're aligned - properly. - - 3) But wait! Aren't we looking for C as well as zero? - Good point. So what we do is XOR LONGWORD with a longword, - each of whose bytes is C. This turns each byte that is C - into a zero. */ - - longword = *longword_ptr++; - - /* Add MAGIC_BITS to LONGWORD. */ - if ((((longword + magic_bits) - - /* Set those bits that were unchanged by the addition. */ - ^ ~longword) - - /* Look at only the hole bits. If any of the hole bits - are unchanged, most likely one of the bytes was a - zero. */ - & ~magic_bits) != 0 || - - /* That caught zeroes. Now test for C. */ - ((((longword ^ charmask) + magic_bits) ^ ~(longword ^ charmask)) - & ~magic_bits) != 0) - { - /* Which of the bytes was C or zero? - If none of them were, it was a misfire; continue the search. */ - - const unsigned char *cp = (const unsigned char *) (longword_ptr - 1); - - if (*cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (sizeof (longword) > 4) - { - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - if (*++cp == c || *cp == '\0') - return (char *) cp; - } - } - } - - /* This should never happen. */ - return NULL; -} - -weak_alias (__strchrnul, strchrnul) diff --git a/string/strcmp.c b/string/strcmp.c deleted file mode 100644 index a818285ea2..0000000000 --- a/string/strcmp.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef strcmp - -#ifndef STRCMP -# define STRCMP strcmp -#endif - -/* Compare S1 and S2, returning less than, equal to or - greater than zero if S1 is lexicographically less than, - equal to or greater than S2. */ -int -STRCMP (const char *p1, const char *p2) -{ - const unsigned char *s1 = (const unsigned char *) p1; - const unsigned char *s2 = (const unsigned char *) p2; - unsigned char c1, c2; - - do - { - c1 = (unsigned char) *s1++; - c2 = (unsigned char) *s2++; - if (c1 == '\0') - return c1 - c2; - } - while (c1 == c2); - - return c1 - c2; -} -libc_hidden_builtin_def (strcmp) diff --git a/string/strcoll.c b/string/strcoll.c deleted file mode 100644 index 8996bf90f4..0000000000 --- a/string/strcoll.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@cygnus.com>, 1995. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#ifndef STRING_TYPE -# define STRING_TYPE char -# define STRCOLL strcoll -# define STRCOLL_L __strcoll_l -# define USE_HIDDEN_DEF -#endif - -#include "../locale/localeinfo.h" - - -int -STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2) -{ - return STRCOLL_L (s1, s2, _NL_CURRENT_LOCALE); -} - -#ifdef USE_HIDDEN_DEF -libc_hidden_def (STRCOLL) -#endif diff --git a/string/strcoll_l.c b/string/strcoll_l.c deleted file mode 100644 index 8fd55b000a..0000000000 --- a/string/strcoll_l.c +++ /dev/null @@ -1,363 +0,0 @@ -/* Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@gnu.org>, 1995. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - - -#include <assert.h> -#include <langinfo.h> -#include <locale.h> -#include <stddef.h> -#include <stdint.h> -#include <string.h> -#include <sys/param.h> - -#ifndef STRING_TYPE -# define STRING_TYPE char -# define USTRING_TYPE unsigned char -# define STRCOLL __strcoll_l -# define STRCMP strcmp -# define WEIGHT_H "../locale/weight.h" -# define SUFFIX MB -# define L(arg) arg -#endif - -#define CONCAT(a,b) CONCAT1(a,b) -#define CONCAT1(a,b) a##b - -#include "../locale/localeinfo.h" -#include WEIGHT_H - -/* Track status while looking for sequences in a string. */ -typedef struct -{ - int len; /* Length of the current sequence. */ - size_t val; /* Position of the sequence relative to the - previous non-ignored sequence. */ - size_t idxmax; /* Maximum index in sequences. */ - size_t idxcnt; /* Current count of indices. */ - size_t backw; /* Current Backward sequence index. */ - size_t backw_stop; /* Index where the backward sequences stop. */ - const USTRING_TYPE *us; /* The string. */ - unsigned char rule; /* Saved rule for the first sequence. */ - int32_t idx; /* Index to weight of the current sequence. */ - int32_t save_idx; /* Save looked up index of a forward - sequence after the last backward - sequence. */ - const USTRING_TYPE *back_us; /* Beginning of the backward sequence. */ -} coll_seq; - -/* Get next sequence. Traverse the string as required. */ -static __always_inline void -get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets, - const USTRING_TYPE *weights, const int32_t *table, - const USTRING_TYPE *extra, const int32_t *indirect, - int pass) -{ - size_t val = seq->val = 0; - int len = seq->len; - size_t backw_stop = seq->backw_stop; - size_t backw = seq->backw; - size_t idxcnt = seq->idxcnt; - size_t idxmax = seq->idxmax; - int32_t idx = seq->idx; - const USTRING_TYPE *us = seq->us; - - while (len == 0) - { - ++val; - if (backw_stop != ~0ul) - { - /* There is something pushed. */ - if (backw == backw_stop) - { - /* The last pushed character was handled. Continue - with forward characters. */ - if (idxcnt < idxmax) - { - idx = seq->save_idx; - backw_stop = ~0ul; - } - else - { - /* Nothing anymore. The backward sequence ended with - the last sequence in the string. Note that len is - still zero. */ - idx = 0; - break; - } - } - else - { - /* XXX Traverse BACKW sequences from the beginning of - BACKW_STOP to get the next sequence. Is ther a quicker way - to do this? */ - size_t i = backw_stop; - us = seq->back_us; - while (i < backw) - { - int32_t tmp = findidx (table, indirect, extra, &us, -1); - idx = tmp & 0xffffff; - i++; - } - --backw; - us = seq->us; - } - } - else - { - backw_stop = idxmax; - int32_t prev_idx = idx; - - while (*us != L('\0')) - { - int32_t tmp = findidx (table, indirect, extra, &us, -1); - unsigned char rule = tmp >> 24; - prev_idx = idx; - idx = tmp & 0xffffff; - idxcnt = idxmax++; - - /* Save the rule for the first sequence. */ - if (__glibc_unlikely (idxcnt == 0)) - seq->rule = rule; - - if ((rulesets[rule * nrules + pass] - & sort_backward) == 0) - /* No more backward characters to push. */ - break; - ++idxcnt; - } - - if (backw_stop >= idxcnt) - { - /* No sequence at all or just one. */ - if (idxcnt == idxmax || backw_stop > idxcnt) - /* Note that len is still zero. */ - break; - - backw_stop = ~0ul; - } - else - { - /* We pushed backward sequences. If the stream ended with the - backward sequence, then we process the last sequence we - found. Otherwise we process the sequence before the last - one since the last one was a forward sequence. */ - seq->back_us = seq->us; - seq->us = us; - backw = idxcnt; - if (idxmax > idxcnt) - { - backw--; - seq->save_idx = idx; - idx = prev_idx; - } - if (backw > backw_stop) - backw--; - } - } - - /* With GCC 5.3 when compiling with -Os the compiler complains - that idx, taken from seq->idx (seq1 or seq2 from STRCOLL) may - be used uninitialized. In general this can't possibly be true - since seq1.idx and seq2.idx are initialized to zero in the - outer function. Only one case where seq->idx is restored from - seq->save_idx might result in an uninitialized idx value, but - it is guarded by a sequence of checks against backw_stop which - ensures that seq->save_idx was saved to first and contains a - valid value. */ - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_Os_NEEDS_COMMENT (5, "-Wmaybe-uninitialized"); - len = weights[idx++]; - DIAG_POP_NEEDS_COMMENT; - /* Skip over indices of previous levels. */ - for (int i = 0; i < pass; i++) - { - idx += len; - len = weights[idx]; - idx++; - } - } - - /* Update the structure. */ - seq->val = val; - seq->len = len; - seq->backw_stop = backw_stop; - seq->backw = backw; - seq->idxcnt = idxcnt; - seq->idxmax = idxmax; - seq->us = us; - seq->idx = idx; -} - -/* Compare two sequences. */ -static __always_inline int -do_compare (coll_seq *seq1, coll_seq *seq2, int position, - const USTRING_TYPE *weights) -{ - int seq1len = seq1->len; - int seq2len = seq2->len; - size_t val1 = seq1->val; - size_t val2 = seq2->val; - int idx1 = seq1->idx; - int idx2 = seq2->idx; - int result = 0; - - /* Test for position if necessary. */ - if (position && val1 != val2) - { - result = val1 > val2 ? 1 : -1; - goto out; - } - - /* Compare the two sequences. */ - do - { - if (weights[idx1] != weights[idx2]) - { - /* The sequences differ. */ - result = weights[idx1] - weights[idx2]; - goto out; - } - - /* Increment the offsets. */ - ++idx1; - ++idx2; - - --seq1len; - --seq2len; - } - while (seq1len > 0 && seq2len > 0); - - if (position && seq1len != seq2len) - result = seq1len - seq2len; - -out: - seq1->len = seq1len; - seq2->len = seq2len; - seq1->idx = idx1; - seq2->idx = idx2; - return result; -} - -int -STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) -{ - struct __locale_data *current = l->__locales[LC_COLLATE]; - uint_fast32_t nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; - /* We don't assign the following values right away since it might be - unnecessary in case there are no rules. */ - const unsigned char *rulesets; - const int32_t *table; - const USTRING_TYPE *weights; - const USTRING_TYPE *extra; - const int32_t *indirect; - - if (nrules == 0) - return STRCMP (s1, s2); - - /* Catch empty strings. */ - if (__glibc_unlikely (*s1 == '\0') || __glibc_unlikely (*s2 == '\0')) - return (*s1 != '\0') - (*s2 != '\0'); - - rulesets = (const unsigned char *) - current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULESETS)].string; - table = (const int32_t *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_TABLE,SUFFIX))].string; - weights = (const USTRING_TYPE *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_WEIGHT,SUFFIX))].string; - extra = (const USTRING_TYPE *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string; - indirect = (const int32_t *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string; - - assert (((uintptr_t) table) % __alignof__ (table[0]) == 0); - assert (((uintptr_t) weights) % __alignof__ (weights[0]) == 0); - assert (((uintptr_t) extra) % __alignof__ (extra[0]) == 0); - assert (((uintptr_t) indirect) % __alignof__ (indirect[0]) == 0); - - int result = 0, rule = 0; - - coll_seq seq1, seq2; - seq1.len = 0; - seq1.idxmax = 0; - seq1.rule = 0; - seq2.len = 0; - seq2.idxmax = 0; - - for (int pass = 0; pass < nrules; ++pass) - { - seq1.idxcnt = 0; - seq1.idx = 0; - seq2.idx = 0; - seq1.backw_stop = ~0ul; - seq1.backw = ~0ul; - seq2.idxcnt = 0; - seq2.backw_stop = ~0ul; - seq2.backw = ~0ul; - - /* We need the elements of the strings as unsigned values since they - are used as indices. */ - seq1.us = (const USTRING_TYPE *) s1; - seq2.us = (const USTRING_TYPE *) s2; - - /* We assume that if a rule has defined `position' in one section - this is true for all of them. Please note that the localedef programs - makes sure that `position' is not used at the first level. */ - - int position = rulesets[rule * nrules + pass] & sort_position; - - while (1) - { - get_next_seq (&seq1, nrules, rulesets, weights, table, - extra, indirect, pass); - get_next_seq (&seq2, nrules, rulesets, weights, table, - extra, indirect, pass); - /* See whether any or both strings are empty. */ - if (seq1.len == 0 || seq2.len == 0) - { - if (seq1.len == seq2.len) - { - /* Both strings ended and are equal at this level. Do a - byte-level comparison to ensure that we don't waste time - going through multiple passes for totally equal strings - before proceeding to subsequent passes. */ - if (pass == 0 && STRCMP (s1, s2) == 0) - return result; - else - break; - } - - /* This means one string is shorter than the other. Find out - which one and return an appropriate value. */ - return seq1.len == 0 ? -1 : 1; - } - - result = do_compare (&seq1, &seq2, position, weights); - if (result != 0) - return result; - } - - rule = seq1.rule; - } - - return result; -} -libc_hidden_def (STRCOLL) - -#ifndef WIDE_CHAR_VERSION -weak_alias (__strcoll_l, strcoll_l) -#endif diff --git a/string/strcpy.c b/string/strcpy.c deleted file mode 100644 index 120da44ee7..0000000000 --- a/string/strcpy.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stddef.h> -#include <string.h> - -#undef strcpy - -#ifndef STRCPY -# define STRCPY strcpy -#endif - -/* Copy SRC to DEST. */ -char * -STRCPY (char *dest, const char *src) -{ - return memcpy (dest, src, strlen (src) + 1); -} -libc_hidden_builtin_def (strcpy) diff --git a/string/strcspn.c b/string/strcspn.c deleted file mode 100644 index 1035552a8e..0000000000 --- a/string/strcspn.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include <libc-pointer-arith.h> - -#undef strcspn - -#ifndef STRCSPN -# define STRCSPN strcspn -#endif - -/* Return the length of the maximum initial segment of S - which contains no characters from REJECT. */ -size_t -STRCSPN (const char *str, const char *reject) -{ - if (__glibc_unlikely (reject[0] == '\0') || - __glibc_unlikely (reject[1] == '\0')) - return __strchrnul (str, reject [0]) - str; - - /* Use multiple small memsets to enable inlining on most targets. */ - unsigned char table[256]; - unsigned char *p = memset (table, 0, 64); - memset (p + 64, 0, 64); - memset (p + 128, 0, 64); - memset (p + 192, 0, 64); - - unsigned char *s = (unsigned char*) reject; - unsigned char tmp; - do - p[tmp = *s++] = 1; - while (tmp); - - s = (unsigned char*) str; - if (p[s[0]]) return 0; - if (p[s[1]]) return 1; - if (p[s[2]]) return 2; - if (p[s[3]]) return 3; - - s = (unsigned char *) PTR_ALIGN_DOWN (s, 4); - - unsigned int c0, c1, c2, c3; - do - { - s += 4; - c0 = p[s[0]]; - c1 = p[s[1]]; - c2 = p[s[2]]; - c3 = p[s[3]]; - } - while ((c0 | c1 | c2 | c3) == 0); - - size_t count = s - (unsigned char *) str; - return (c0 | c1) != 0 ? count - c0 + 1 : count - c2 + 3; -} -libc_hidden_builtin_def (strcspn) diff --git a/string/strdup.c b/string/strdup.c deleted file mode 100644 index 40993fce1a..0000000000 --- a/string/strdup.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#if defined _LIBC || defined STDC_HEADERS -# include <stdlib.h> -# include <string.h> -#else -char *malloc (); -char *memcpy (); -#endif - -#undef __strdup -#undef strdup - -#ifndef weak_alias -# define __strdup strdup -#endif - -/* Duplicate S, returning an identical malloc'd string. */ -char * -__strdup (const char *s) -{ - size_t len = strlen (s) + 1; - void *new = malloc (len); - - if (new == NULL) - return NULL; - - return (char *) memcpy (new, s, len); -} -#ifdef libc_hidden_def -libc_hidden_def (__strdup) -#endif -#ifdef weak_alias -weak_alias (__strdup, strdup) -#endif diff --git a/string/strerror.c b/string/strerror.c deleted file mode 100644 index 0d235c6b6b..0000000000 --- a/string/strerror.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <libintl.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> - -/* Return a string describing the errno code in ERRNUM. - The storage is good only until the next call to strerror. - Writing to the storage causes undefined behavior. */ -libc_freeres_ptr (static char *buf); - -char * -strerror (int errnum) -{ - char *ret = __strerror_r (errnum, NULL, 0); - int saved_errno; - - if (__glibc_likely (ret != NULL)) - return ret; - saved_errno = errno; - if (buf == NULL) - buf = malloc (1024); - __set_errno (saved_errno); - if (buf == NULL) - return _("Unknown error"); - return __strerror_r (errnum, buf, 1024); -} diff --git a/string/strerror_l.c b/string/strerror_l.c deleted file mode 100644 index 03a3257dfd..0000000000 --- a/string/strerror_l.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2007-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <libintl.h> -#include <locale.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/param.h> - - -static __thread char *last_value; - - -static const char * -translate (const char *str, locale_t loc) -{ - locale_t oldloc = __uselocale (loc); - const char *res = _(str); - __uselocale (oldloc); - return res; -} - - -/* Return a string describing the errno code in ERRNUM. */ -char * -strerror_l (int errnum, locale_t loc) -{ - - - if (__builtin_expect (errnum < 0 || errnum >= _sys_nerr_internal - || _sys_errlist_internal[errnum] == NULL, 0)) - { - free (last_value); - if (__asprintf (&last_value, "%s%d", - translate ("Unknown error ", loc), errnum) == -1) - last_value = NULL; - - return last_value; - } - - return (char *) translate (_sys_errlist_internal[errnum], loc); -} - - -#ifdef _LIBC -# ifdef _LIBC_REENTRANT -/* This is called when a thread is exiting to free the last_value string. */ -static void __attribute__ ((section ("__libc_thread_freeres_fn"))) -strerror_thread_freeres (void) -{ - free (last_value); -} -text_set_element (__libc_thread_subfreeres, strerror_thread_freeres); -text_set_element (__libc_subfreeres, strerror_thread_freeres); -# endif -#endif diff --git a/string/strfry.c b/string/strfry.c deleted file mode 100644 index 9d1bd88d4d..0000000000 --- a/string/strfry.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdlib.h> -#include <time.h> -#include <unistd.h> - -char * -strfry (char *string) -{ - static int init; - static struct random_data rdata; - - if (!init) - { - static char state[32]; - rdata.state = NULL; - __initstate_r (time ((time_t *) NULL) ^ getpid (), - state, sizeof (state), &rdata); - init = 1; - } - - size_t len = strlen (string); - if (len > 0) - for (size_t i = 0; i < len - 1; ++i) - { - int32_t j; - __random_r (&rdata, &j); - j = j % (len - i) + i; - - char c = string[i]; - string[i] = string[j]; - string[j] = c; - } - - return string; -} diff --git a/string/string-inlines.c b/string/string-inlines.c deleted file mode 100644 index fa4a1594b2..0000000000 --- a/string/string-inlines.c +++ /dev/null @@ -1,570 +0,0 @@ -/* Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* <bits/string.h> and <bits/string2.h> declare some extern inline - functions. These functions are declared additionally here if - inlining is not possible. */ - -#undef __USE_STRING_INLINES -#define __USE_STRING_INLINES -#define _FORCE_INLINES -#define __STRING_INLINE /* empty */ -#define __NO_INLINE__ - -#include <string.h> -#undef index -#undef rindex - -#undef __NO_INLINE__ -#include <bits/string.h> -#include <bits/string2.h> - -#include "shlib-compat.h" - -#if SHLIB_COMPAT (libc, GLIBC_2_1_1, GLIBC_2_25) -/* The inline functions are not used from GLIBC 2.25 and forward, however - they are required to provide the symbols through string-inlines.c - (if inlining is not possible for compatibility reasons). */ - -char * -__old_strtok_r_1c (char *__s, char __sep, char **__nextp) -{ - char *__result; - if (__s == NULL) - __s = *__nextp; - while (*__s == __sep) - ++__s; - __result = NULL; - if (*__s != '\0') - { - __result = __s++; - while (*__s != '\0') - if (*__s++ == __sep) - { - __s[-1] = '\0'; - break; - } - } - *__nextp = __s; - return __result; -} -compat_symbol (libc, __old_strtok_r_1c, __strtok_r_1c, GLIBC_2_1_1); - -char * -__old_strsep_1c (char **__s, char __reject) -{ - char *__retval = *__s; - if (__retval != NULL && (*__s = strchr (__retval, __reject)) != NULL) - *(*__s)++ = '\0'; - return __retval; -} -compat_symbol (libc, __old_strsep_1c, __strsep_1c, GLIBC_2_1_1); - -char * -__old_strsep_2c (char **__s, char __reject1, char __reject2) -{ - char *__retval = *__s; - if (__retval != NULL) - { - char *__cp = __retval; - while (1) - { - if (*__cp == '\0') - { - __cp = NULL; - break; - } - if (*__cp == __reject1 || *__cp == __reject2) - { - *__cp++ = '\0'; - break; - } - ++__cp; - } - *__s = __cp; - } - return __retval; -} -compat_symbol (libc, __old_strsep_2c, __strsep_2c, GLIBC_2_1_1); - -char * -__old_strsep_3c (char **__s, char __reject1, char __reject2, char __reject3) -{ - char *__retval = *__s; - if (__retval != NULL) - { - char *__cp = __retval; - while (1) - { - if (*__cp == '\0') - { - __cp = NULL; - break; - } - if (*__cp == __reject1 || *__cp == __reject2 || *__cp == __reject3) - { - *__cp++ = '\0'; - break; - } - ++__cp; - } - *__s = __cp; - } - return __retval; -} -compat_symbol (libc, __old_strsep_3c, __strsep_3c, GLIBC_2_1_1); -#endif - -#if SHLIB_COMPAT (libc, GLIBC_2_1_1, GLIBC_2_24) -/* The inline functions are not used from GLIBC 2.24 and forward, however - they are required to provide the symbols through string-inlines.c - (if inlining is not possible for compatibility reasons). */ -size_t -__old_strcspn_c1 (const char *__s, int __reject) -{ - size_t __result = 0; - while (__s[__result] != '\0' && __s[__result] != __reject) - ++__result; - return __result; -} -compat_symbol (libc, __old_strcspn_c1, __strcspn_c1, GLIBC_2_1_1); - -size_t -__old_strcspn_c2 (const char *__s, int __reject1, int __reject2) -{ - size_t __result = 0; - while (__s[__result] != '\0' && __s[__result] != __reject1 - && __s[__result] != __reject2) - ++__result; - return __result; -} -compat_symbol (libc, __old_strcspn_c2, __strcspn_c2, GLIBC_2_1_1); - -size_t -__old_strcspn_c3 (const char *__s, int __reject1, int __reject2, - int __reject3) -{ - size_t __result = 0; - while (__s[__result] != '\0' && __s[__result] != __reject1 - && __s[__result] != __reject2 && __s[__result] != __reject3) - ++__result; - return __result; -} -compat_symbol (libc, __old_strcspn_c3, __strcspn_c3, GLIBC_2_1_1); - -size_t -__old_strspn_c1 (const char *__s, int __accept) -{ - size_t __result = 0; - /* Please note that __accept never can be '\0'. */ - while (__s[__result] == __accept) - ++__result; - return __result; -} -compat_symbol (libc, __old_strspn_c1, __strspn_c1, GLIBC_2_1_1); - -size_t -__old_strspn_c2 (const char *__s, int __accept1, int __accept2) -{ - size_t __result = 0; - /* Please note that __accept1 and __accept2 never can be '\0'. */ - while (__s[__result] == __accept1 || __s[__result] == __accept2) - ++__result; - return __result; -} -compat_symbol (libc, __old_strspn_c2, __strspn_c2, GLIBC_2_1_1); - -size_t -__old_strspn_c3 (const char *__s, int __accept1, int __accept2, - int __accept3) -{ - size_t __result = 0; - /* Please note that __accept1 to __accept3 never can be '\0'. */ - while (__s[__result] == __accept1 || __s[__result] == __accept2 - || __s[__result] == __accept3) - ++__result; - return __result; -} -compat_symbol (libc, __old_strspn_c3, __strspn_c3, GLIBC_2_1_1); - -char * -__old_strpbrk_c2 (const char *__s, int __accept1, int __accept2) -{ - /* Please note that __accept1 and __accept2 never can be '\0'. */ - while (*__s != '\0' && *__s != __accept1 && *__s != __accept2) - ++__s; - return *__s == '\0' ? NULL : (char *) (size_t) __s; -} -compat_symbol (libc, __old_strpbrk_c2, __strpbrk_c2, GLIBC_2_1_1); - -char * -__old_strpbrk_c3 (const char *__s, int __accept1, int __accept2, int __accept3) -{ - /* Please note that __accept1 to __accept3 never can be '\0'. */ - while (*__s != '\0' && *__s != __accept1 && *__s != __accept2 - && *__s != __accept3) - ++__s; - return *__s == '\0' ? NULL : (char *) (size_t) __s; -} -compat_symbol (libc, __old_strpbrk_c3, __strpbrk_c3, GLIBC_2_1_1); - -/* These are a few types we need for the optimizations if we cannot - use unaligned memory accesses. */ -# define __STRING2_COPY_TYPE(N) \ - typedef struct { unsigned char __arr[N]; } \ - __attribute__ ((__packed__)) __STRING2_COPY_ARR##N -__STRING2_COPY_TYPE (2); -__STRING2_COPY_TYPE (3); -__STRING2_COPY_TYPE (4); -__STRING2_COPY_TYPE (5); -__STRING2_COPY_TYPE (6); -__STRING2_COPY_TYPE (7); -__STRING2_COPY_TYPE (8); -# undef __STRING2_COPY_TYPE - - -# if _STRING_INLINE_unaligned -void * -__old_mempcpy_small (void *__dest1, - char __src0_1, char __src2_1, char __src4_1, char __src6_1, - __uint16_t __src0_2, __uint16_t __src4_2, - __uint32_t __src0_4, __uint32_t __src4_4, - size_t __srclen) -{ - union { - __uint32_t __ui; - __uint16_t __usi; - unsigned char __uc; - unsigned char __c; - } *__u = __dest1; - switch ((unsigned int) __srclen) - { - case 1: - __u->__c = __src0_1; - __u = __extension__ ((void *) __u + 1); - break; - case 2: - __u->__usi = __src0_2; - __u = __extension__ ((void *) __u + 2); - break; - case 3: - __u->__usi = __src0_2; - __u = __extension__ ((void *) __u + 2); - __u->__c = __src2_1; - __u = __extension__ ((void *) __u + 1); - break; - case 4: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - break; - case 5: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__c = __src4_1; - __u = __extension__ ((void *) __u + 1); - break; - case 6: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__usi = __src4_2; - __u = __extension__ ((void *) __u + 2); - break; - case 7: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__usi = __src4_2; - __u = __extension__ ((void *) __u + 2); - __u->__c = __src6_1; - __u = __extension__ ((void *) __u + 1); - break; - case 8: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__ui = __src4_4; - __u = __extension__ ((void *) __u + 4); - break; - } - return (void *) __u; -} - -# else - -void * -__old_mempcpy_small (void *__dest, char __src1, - __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3, - __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5, - __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7, - __STRING2_COPY_ARR8 __src8, size_t __srclen) -{ - union { - char __c; - __STRING2_COPY_ARR2 __sca2; - __STRING2_COPY_ARR3 __sca3; - __STRING2_COPY_ARR4 __sca4; - __STRING2_COPY_ARR5 __sca5; - __STRING2_COPY_ARR6 __sca6; - __STRING2_COPY_ARR7 __sca7; - __STRING2_COPY_ARR8 __sca8; - } *__u = __dest; - switch ((unsigned int) __srclen) - { - case 1: - __u->__c = __src1; - break; - case 2: - __extension__ __u->__sca2 = __src2; - break; - case 3: - __extension__ __u->__sca3 = __src3; - break; - case 4: - __extension__ __u->__sca4 = __src4; - break; - case 5: - __extension__ __u->__sca5 = __src5; - break; - case 6: - __extension__ __u->__sca6 = __src6; - break; - case 7: - __extension__ __u->__sca7 = __src7; - break; - case 8: - __extension__ __u->__sca8 = __src8; - break; - } - return __extension__ ((void *) __u + __srclen); -} -# endif -compat_symbol (libc, __old_mempcpy_small, __mempcpy_small, GLIBC_2_1_1); - -# if _STRING_INLINE_unaligned -char * -__old_strcpy_small (char *__dest, - __uint16_t __src0_2, __uint16_t __src4_2, - __uint32_t __src0_4, __uint32_t __src4_4, - size_t __srclen) -{ - union { - __uint32_t __ui; - __uint16_t __usi; - unsigned char __uc; - } *__u = (void *) __dest; - switch ((unsigned int) __srclen) - { - case 1: - __u->__uc = '\0'; - break; - case 2: - __u->__usi = __src0_2; - break; - case 3: - __u->__usi = __src0_2; - __u = __extension__ ((void *) __u + 2); - __u->__uc = '\0'; - break; - case 4: - __u->__ui = __src0_4; - break; - case 5: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__uc = '\0'; - break; - case 6: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__usi = __src4_2; - break; - case 7: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__usi = __src4_2; - __u = __extension__ ((void *) __u + 2); - __u->__uc = '\0'; - break; - case 8: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__ui = __src4_4; - break; - } - return __dest; -} - -# else - -char * -__old_strcpy_small (char *__dest, - __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3, - __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5, - __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7, - __STRING2_COPY_ARR8 __src8, size_t __srclen) -{ - union { - char __c; - __STRING2_COPY_ARR2 __sca2; - __STRING2_COPY_ARR3 __sca3; - __STRING2_COPY_ARR4 __sca4; - __STRING2_COPY_ARR5 __sca5; - __STRING2_COPY_ARR6 __sca6; - __STRING2_COPY_ARR7 __sca7; - __STRING2_COPY_ARR8 __sca8; - } *__u = (void *) __dest; - switch ((unsigned int) __srclen) - { - case 1: - __u->__c = '\0'; - break; - case 2: - __extension__ __u->__sca2 = __src2; - break; - case 3: - __extension__ __u->__sca3 = __src3; - break; - case 4: - __extension__ __u->__sca4 = __src4; - break; - case 5: - __extension__ __u->__sca5 = __src5; - break; - case 6: - __extension__ __u->__sca6 = __src6; - break; - case 7: - __extension__ __u->__sca7 = __src7; - break; - case 8: - __extension__ __u->__sca8 = __src8; - break; - } - return __dest; -} -# endif -compat_symbol (libc, __old_strcpy_small, __strcpy_small, GLIBC_2_1_1); - -# if _STRING_INLINE_unaligned -char * -__old_stpcpy_small (char *__dest, - __uint16_t __src0_2, __uint16_t __src4_2, - __uint32_t __src0_4, __uint32_t __src4_4, - size_t __srclen) -{ - union { - unsigned int __ui; - unsigned short int __usi; - unsigned char __uc; - char __c; - } *__u = (void *) __dest; - switch ((unsigned int) __srclen) - { - case 1: - __u->__uc = '\0'; - break; - case 2: - __u->__usi = __src0_2; - __u = __extension__ ((void *) __u + 1); - break; - case 3: - __u->__usi = __src0_2; - __u = __extension__ ((void *) __u + 2); - __u->__uc = '\0'; - break; - case 4: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 3); - break; - case 5: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__uc = '\0'; - break; - case 6: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__usi = __src4_2; - __u = __extension__ ((void *) __u + 1); - break; - case 7: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__usi = __src4_2; - __u = __extension__ ((void *) __u + 2); - __u->__uc = '\0'; - break; - case 8: - __u->__ui = __src0_4; - __u = __extension__ ((void *) __u + 4); - __u->__ui = __src4_4; - __u = __extension__ ((void *) __u + 3); - break; - } - return &__u->__c; -} - -# else - -char * -__old_stpcpy_small (char *__dest, - __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3, - __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5, - __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7, - __STRING2_COPY_ARR8 __src8, size_t __srclen) -{ - union { - char __c; - __STRING2_COPY_ARR2 __sca2; - __STRING2_COPY_ARR3 __sca3; - __STRING2_COPY_ARR4 __sca4; - __STRING2_COPY_ARR5 __sca5; - __STRING2_COPY_ARR6 __sca6; - __STRING2_COPY_ARR7 __sca7; - __STRING2_COPY_ARR8 __sca8; - } *__u = (void *) __dest; - switch ((unsigned int) __srclen) - { - case 1: - __u->__c = '\0'; - break; - case 2: - __extension__ __u->__sca2 = __src2; - break; - case 3: - __extension__ __u->__sca3 = __src3; - break; - case 4: - __extension__ __u->__sca4 = __src4; - break; - case 5: - __extension__ __u->__sca5 = __src5; - break; - case 6: - __extension__ __u->__sca6 = __src6; - break; - case 7: - __extension__ __u->__sca7 = __src7; - break; - case 8: - __extension__ __u->__sca8 = __src8; - break; - } - return __dest + __srclen - 1; -} -# endif -compat_symbol (libc, __old_stpcpy_small, __stpcpy_small, GLIBC_2_1_1); - -#endif diff --git a/string/string.h b/string/string.h deleted file mode 100644 index 8eed67d77d..0000000000 --- a/string/string.h +++ /dev/null @@ -1,544 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* - * ISO C99 Standard: 7.21 String handling <string.h> - */ - -#ifndef _STRING_H -#define _STRING_H 1 - -#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION -#include <bits/libc-header-start.h> - -__BEGIN_DECLS - -/* Get size_t and NULL from <stddef.h>. */ -#define __need_size_t -#define __need_NULL -#include <stddef.h> - -/* Tell the caller that we provide correct C++ prototypes. */ -#if defined __cplusplus && __GNUC_PREREQ (4, 4) -# define __CORRECT_ISO_CPP_STRING_H_PROTO -#endif - - -/* Copy N bytes of SRC to DEST. */ -extern void *memcpy (void *__restrict __dest, const void *__restrict __src, - size_t __n) __THROW __nonnull ((1, 2)); -/* Copy N bytes of SRC to DEST, guaranteeing - correct behavior for overlapping strings. */ -extern void *memmove (void *__dest, const void *__src, size_t __n) - __THROW __nonnull ((1, 2)); - -/* Copy no more than N bytes of SRC to DEST, stopping when C is found. - Return the position in DEST one byte past where C was copied, - or NULL if C was not found in the first N bytes of SRC. */ -#if defined __USE_MISC || defined __USE_XOPEN -extern void *memccpy (void *__restrict __dest, const void *__restrict __src, - int __c, size_t __n) - __THROW __nonnull ((1, 2)); -#endif /* Misc || X/Open. */ - - -/* Set N bytes of S to C. */ -extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1)); - -/* Compare N bytes of S1 and S2. */ -extern int memcmp (const void *__s1, const void *__s2, size_t __n) - __THROW __attribute_pure__ __nonnull ((1, 2)); - -/* Search N bytes of S for C. */ -#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" -{ -extern void *memchr (void *__s, int __c, size_t __n) - __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1)); -extern const void *memchr (const void *__s, int __c, size_t __n) - __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1)); - -# ifdef __OPTIMIZE__ -__extern_always_inline void * -memchr (void *__s, int __c, size_t __n) __THROW -{ - return __builtin_memchr (__s, __c, __n); -} - -__extern_always_inline const void * -memchr (const void *__s, int __c, size_t __n) __THROW -{ - return __builtin_memchr (__s, __c, __n); -} -# endif -} -#else -extern void *memchr (const void *__s, int __c, size_t __n) - __THROW __attribute_pure__ __nonnull ((1)); -#endif - -#ifdef __USE_GNU -/* Search in S for C. This is similar to `memchr' but there is no - length limit. */ -# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" void *rawmemchr (void *__s, int __c) - __THROW __asm ("rawmemchr") __attribute_pure__ __nonnull ((1)); -extern "C++" const void *rawmemchr (const void *__s, int __c) - __THROW __asm ("rawmemchr") __attribute_pure__ __nonnull ((1)); -# else -extern void *rawmemchr (const void *__s, int __c) - __THROW __attribute_pure__ __nonnull ((1)); -# endif - -/* Search N bytes of S for the final occurrence of C. */ -# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" void *memrchr (void *__s, int __c, size_t __n) - __THROW __asm ("memrchr") __attribute_pure__ __nonnull ((1)); -extern "C++" const void *memrchr (const void *__s, int __c, size_t __n) - __THROW __asm ("memrchr") __attribute_pure__ __nonnull ((1)); -# else -extern void *memrchr (const void *__s, int __c, size_t __n) - __THROW __attribute_pure__ __nonnull ((1)); -# endif -#endif - - -/* Copy SRC to DEST. */ -extern char *strcpy (char *__restrict __dest, const char *__restrict __src) - __THROW __nonnull ((1, 2)); -/* Copy no more than N characters of SRC to DEST. */ -extern char *strncpy (char *__restrict __dest, - const char *__restrict __src, size_t __n) - __THROW __nonnull ((1, 2)); - -/* Append SRC onto DEST. */ -extern char *strcat (char *__restrict __dest, const char *__restrict __src) - __THROW __nonnull ((1, 2)); -/* Append no more than N characters from SRC onto DEST. */ -extern char *strncat (char *__restrict __dest, const char *__restrict __src, - size_t __n) __THROW __nonnull ((1, 2)); - -/* Compare S1 and S2. */ -extern int strcmp (const char *__s1, const char *__s2) - __THROW __attribute_pure__ __nonnull ((1, 2)); -/* Compare N characters of S1 and S2. */ -extern int strncmp (const char *__s1, const char *__s2, size_t __n) - __THROW __attribute_pure__ __nonnull ((1, 2)); - -/* Compare the collated forms of S1 and S2. */ -extern int strcoll (const char *__s1, const char *__s2) - __THROW __attribute_pure__ __nonnull ((1, 2)); -/* Put a transformation of SRC into no more than N bytes of DEST. */ -extern size_t strxfrm (char *__restrict __dest, - const char *__restrict __src, size_t __n) - __THROW __nonnull ((2)); - -#ifdef __USE_XOPEN2K8 -# include <xlocale.h> - -/* Compare the collated forms of S1 and S2, using sorting rules from L. */ -extern int strcoll_l (const char *__s1, const char *__s2, __locale_t __l) - __THROW __attribute_pure__ __nonnull ((1, 2, 3)); -/* Put a transformation of SRC into no more than N bytes of DEST, - using sorting rules from L. */ -extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n, - __locale_t __l) __THROW __nonnull ((2, 4)); -#endif - -#if (defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 \ - || __GLIBC_USE (LIB_EXT2)) -/* Duplicate S, returning an identical malloc'd string. */ -extern char *strdup (const char *__s) - __THROW __attribute_malloc__ __nonnull ((1)); -#endif - -/* Return a malloc'd copy of at most N bytes of STRING. The - resultant string is terminated even if no null terminator - appears before STRING[N]. */ -#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2) -extern char *strndup (const char *__string, size_t __n) - __THROW __attribute_malloc__ __nonnull ((1)); -#endif - -#if defined __USE_GNU && defined __GNUC__ -/* Duplicate S, returning an identical alloca'd string. */ -# define strdupa(s) \ - (__extension__ \ - ({ \ - const char *__old = (s); \ - size_t __len = strlen (__old) + 1; \ - char *__new = (char *) __builtin_alloca (__len); \ - (char *) memcpy (__new, __old, __len); \ - })) - -/* Return an alloca'd copy of at most N bytes of string. */ -# define strndupa(s, n) \ - (__extension__ \ - ({ \ - const char *__old = (s); \ - size_t __len = strnlen (__old, (n)); \ - char *__new = (char *) __builtin_alloca (__len + 1); \ - __new[__len] = '\0'; \ - (char *) memcpy (__new, __old, __len); \ - })) -#endif - -/* Find the first occurrence of C in S. */ -#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" -{ -extern char *strchr (char *__s, int __c) - __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1)); -extern const char *strchr (const char *__s, int __c) - __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1)); - -# ifdef __OPTIMIZE__ -__extern_always_inline char * -strchr (char *__s, int __c) __THROW -{ - return __builtin_strchr (__s, __c); -} - -__extern_always_inline const char * -strchr (const char *__s, int __c) __THROW -{ - return __builtin_strchr (__s, __c); -} -# endif -} -#else -extern char *strchr (const char *__s, int __c) - __THROW __attribute_pure__ __nonnull ((1)); -#endif -/* Find the last occurrence of C in S. */ -#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" -{ -extern char *strrchr (char *__s, int __c) - __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1)); -extern const char *strrchr (const char *__s, int __c) - __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1)); - -# ifdef __OPTIMIZE__ -__extern_always_inline char * -strrchr (char *__s, int __c) __THROW -{ - return __builtin_strrchr (__s, __c); -} - -__extern_always_inline const char * -strrchr (const char *__s, int __c) __THROW -{ - return __builtin_strrchr (__s, __c); -} -# endif -} -#else -extern char *strrchr (const char *__s, int __c) - __THROW __attribute_pure__ __nonnull ((1)); -#endif - -#ifdef __USE_GNU -/* This function is similar to `strchr'. But it returns a pointer to - the closing NUL byte in case C is not found in S. */ -# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" char *strchrnul (char *__s, int __c) - __THROW __asm ("strchrnul") __attribute_pure__ __nonnull ((1)); -extern "C++" const char *strchrnul (const char *__s, int __c) - __THROW __asm ("strchrnul") __attribute_pure__ __nonnull ((1)); -# else -extern char *strchrnul (const char *__s, int __c) - __THROW __attribute_pure__ __nonnull ((1)); -# endif -#endif - -/* Return the length of the initial segment of S which - consists entirely of characters not in REJECT. */ -extern size_t strcspn (const char *__s, const char *__reject) - __THROW __attribute_pure__ __nonnull ((1, 2)); -/* Return the length of the initial segment of S which - consists entirely of characters in ACCEPT. */ -extern size_t strspn (const char *__s, const char *__accept) - __THROW __attribute_pure__ __nonnull ((1, 2)); -/* Find the first occurrence in S of any character in ACCEPT. */ -#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" -{ -extern char *strpbrk (char *__s, const char *__accept) - __THROW __asm ("strpbrk") __attribute_pure__ __nonnull ((1, 2)); -extern const char *strpbrk (const char *__s, const char *__accept) - __THROW __asm ("strpbrk") __attribute_pure__ __nonnull ((1, 2)); - -# ifdef __OPTIMIZE__ -__extern_always_inline char * -strpbrk (char *__s, const char *__accept) __THROW -{ - return __builtin_strpbrk (__s, __accept); -} - -__extern_always_inline const char * -strpbrk (const char *__s, const char *__accept) __THROW -{ - return __builtin_strpbrk (__s, __accept); -} -# endif -} -#else -extern char *strpbrk (const char *__s, const char *__accept) - __THROW __attribute_pure__ __nonnull ((1, 2)); -#endif -/* Find the first occurrence of NEEDLE in HAYSTACK. */ -#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" -{ -extern char *strstr (char *__haystack, const char *__needle) - __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2)); -extern const char *strstr (const char *__haystack, const char *__needle) - __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2)); - -# ifdef __OPTIMIZE__ -__extern_always_inline char * -strstr (char *__haystack, const char *__needle) __THROW -{ - return __builtin_strstr (__haystack, __needle); -} - -__extern_always_inline const char * -strstr (const char *__haystack, const char *__needle) __THROW -{ - return __builtin_strstr (__haystack, __needle); -} -# endif -} -#else -extern char *strstr (const char *__haystack, const char *__needle) - __THROW __attribute_pure__ __nonnull ((1, 2)); -#endif - - -/* Divide S into tokens separated by characters in DELIM. */ -extern char *strtok (char *__restrict __s, const char *__restrict __delim) - __THROW __nonnull ((2)); - -/* Divide S into tokens separated by characters in DELIM. Information - passed between calls are stored in SAVE_PTR. */ -extern char *__strtok_r (char *__restrict __s, - const char *__restrict __delim, - char **__restrict __save_ptr) - __THROW __nonnull ((2, 3)); -#ifdef __USE_POSIX -extern char *strtok_r (char *__restrict __s, const char *__restrict __delim, - char **__restrict __save_ptr) - __THROW __nonnull ((2, 3)); -#endif - -#ifdef __USE_GNU -/* Similar to `strstr' but this function ignores the case of both strings. */ -# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" char *strcasestr (char *__haystack, const char *__needle) - __THROW __asm ("strcasestr") __attribute_pure__ __nonnull ((1, 2)); -extern "C++" const char *strcasestr (const char *__haystack, - const char *__needle) - __THROW __asm ("strcasestr") __attribute_pure__ __nonnull ((1, 2)); -# else -extern char *strcasestr (const char *__haystack, const char *__needle) - __THROW __attribute_pure__ __nonnull ((1, 2)); -# endif -#endif - -#ifdef __USE_GNU -/* Find the first occurrence of NEEDLE in HAYSTACK. - NEEDLE is NEEDLELEN bytes long; - HAYSTACK is HAYSTACKLEN bytes long. */ -extern void *memmem (const void *__haystack, size_t __haystacklen, - const void *__needle, size_t __needlelen) - __THROW __attribute_pure__ __nonnull ((1, 3)); - -/* Copy N bytes of SRC to DEST, return pointer to bytes after the - last written byte. */ -extern void *__mempcpy (void *__restrict __dest, - const void *__restrict __src, size_t __n) - __THROW __nonnull ((1, 2)); -extern void *mempcpy (void *__restrict __dest, - const void *__restrict __src, size_t __n) - __THROW __nonnull ((1, 2)); -#endif - - -/* Return the length of S. */ -extern size_t strlen (const char *__s) - __THROW __attribute_pure__ __nonnull ((1)); - -#ifdef __USE_XOPEN2K8 -/* Find the length of STRING, but scan at most MAXLEN characters. - If no '\0' terminator is found in that many characters, return MAXLEN. */ -extern size_t strnlen (const char *__string, size_t __maxlen) - __THROW __attribute_pure__ __nonnull ((1)); -#endif - - -/* Return a string describing the meaning of the `errno' code in ERRNUM. */ -extern char *strerror (int __errnum) __THROW; -#ifdef __USE_XOPEN2K -/* Reentrant version of `strerror'. - There are 2 flavors of `strerror_r', GNU which returns the string - and may or may not use the supplied temporary buffer and POSIX one - which fills the string into the buffer. - To use the POSIX version, -D_XOPEN_SOURCE=600 or -D_POSIX_C_SOURCE=200112L - without -D_GNU_SOURCE is needed, otherwise the GNU version is - preferred. */ -# if defined __USE_XOPEN2K && !defined __USE_GNU -/* Fill BUF with a string describing the meaning of the `errno' code in - ERRNUM. */ -# ifdef __REDIRECT_NTH -extern int __REDIRECT_NTH (strerror_r, - (int __errnum, char *__buf, size_t __buflen), - __xpg_strerror_r) __nonnull ((2)); -# else -extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen) - __THROW __nonnull ((2)); -# define strerror_r __xpg_strerror_r -# endif -# else -/* If a temporary buffer is required, at most BUFLEN bytes of BUF will be - used. */ -extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) - __THROW __nonnull ((2)) __wur; -# endif -#endif - -#ifdef __USE_XOPEN2K8 -/* Translate error number to string according to the locale L. */ -extern char *strerror_l (int __errnum, __locale_t __l) __THROW; -#endif - -#ifdef __USE_MISC -# include <strings.h> - -/* Set N bytes of S to 0. The compiler will not delete a call to this - function, even if S is dead after the call. */ -extern void explicit_bzero (void *__s, size_t __n) __THROW __nonnull ((1)); - -/* Return the next DELIM-delimited token from *STRINGP, - terminating it with a '\0', and update *STRINGP to point past it. */ -extern char *strsep (char **__restrict __stringp, - const char *__restrict __delim) - __THROW __nonnull ((1, 2)); -#endif - -#ifdef __USE_XOPEN2K8 -/* Return a string describing the meaning of the signal number in SIG. */ -extern char *strsignal (int __sig) __THROW; - -/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ -extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src) - __THROW __nonnull ((1, 2)); -extern char *stpcpy (char *__restrict __dest, const char *__restrict __src) - __THROW __nonnull ((1, 2)); - -/* Copy no more than N characters of SRC to DEST, returning the address of - the last character written into DEST. */ -extern char *__stpncpy (char *__restrict __dest, - const char *__restrict __src, size_t __n) - __THROW __nonnull ((1, 2)); -extern char *stpncpy (char *__restrict __dest, - const char *__restrict __src, size_t __n) - __THROW __nonnull ((1, 2)); -#endif - -#ifdef __USE_GNU -/* Compare S1 and S2 as strings holding name & indices/version numbers. */ -extern int strverscmp (const char *__s1, const char *__s2) - __THROW __attribute_pure__ __nonnull ((1, 2)); - -/* Sautee STRING briskly. */ -extern char *strfry (char *__string) __THROW __nonnull ((1)); - -/* Frobnicate N bytes of S. */ -extern void *memfrob (void *__s, size_t __n) __THROW __nonnull ((1)); - -# ifndef basename -/* Return the file name within directory of FILENAME. We don't - declare the function if the `basename' macro is available (defined - in <libgen.h>) which makes the XPG version of this function - available. */ -# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO -extern "C++" char *basename (char *__filename) - __THROW __asm ("basename") __nonnull ((1)); -extern "C++" const char *basename (const char *__filename) - __THROW __asm ("basename") __nonnull ((1)); -# else -extern char *basename (const char *__filename) __THROW __nonnull ((1)); -# endif -# endif -#endif - - -#if __GNUC_PREREQ (3,4) -# if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ \ - && !defined __NO_INLINE__ && !defined __cplusplus -/* When using GNU CC we provide some optimized versions of selected - functions from this header. There are two kinds of optimizations: - - - machine-dependent optimizations, most probably using inline - assembler code; these might be quite expensive since the code - size can increase significantly. - These optimizations are not used unless the symbol - __USE_STRING_INLINES - is defined before including this header. - - - machine-independent optimizations which do not increase the - code size significantly and which optimize mainly situations - where one or more arguments are compile-time constants. - These optimizations are used always when the compiler is - taught to optimize. - - One can inhibit all optimizations by defining __NO_STRING_INLINES. */ - -/* Get the machine-dependent optimizations (if any). */ -# include <bits/string.h> - -/* These are generic optimizations which do not add too much inline code. */ -# include <bits/string2.h> -# endif - -# if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function -/* Functions with security checks. */ -# include <bits/string3.h> -# endif -#endif - -#if defined __USE_GNU && defined __OPTIMIZE__ \ - && defined __extern_always_inline && __GNUC_PREREQ (3,2) -# if !defined _FORCE_INLINES && !defined _HAVE_STRING_ARCH_mempcpy - -#define mempcpy(dest, src, n) __mempcpy_inline (dest, src, n) -#define __mempcpy(dest, src, n) __mempcpy_inline (dest, src, n) - -__extern_always_inline void * -__mempcpy_inline (void *__restrict __dest, - const void *__restrict __src, size_t __n) -{ - return (char *) memcpy (__dest, __src, __n) + __n; -} - -# endif -#endif - -__END_DECLS - -#endif /* string.h */ diff --git a/string/strings.h b/string/strings.h deleted file mode 100644 index 43207af09c..0000000000 --- a/string/strings.h +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _STRINGS_H -#define _STRINGS_H 1 - -#include <features.h> -#define __need_size_t -#include <stddef.h> - -/* Tell the caller that we provide correct C++ prototypes. */ -#if defined __cplusplus && __GNUC_PREREQ (4, 4) -# define __CORRECT_ISO_CPP_STRINGS_H_PROTO -#endif - -__BEGIN_DECLS - -#if defined __USE_MISC || !defined __USE_XOPEN2K8 -/* Compare N bytes of S1 and S2 (same as memcmp). */ -extern int bcmp (const void *__s1, const void *__s2, size_t __n) - __THROW __attribute_pure__ __nonnull ((1, 2)); - -/* Copy N bytes of SRC to DEST (like memmove, but args reversed). */ -extern void bcopy (const void *__src, void *__dest, size_t __n) - __THROW __nonnull ((1, 2)); - -/* Set N bytes of S to 0. */ -extern void bzero (void *__s, size_t __n) __THROW __nonnull ((1)); - -/* Find the first occurrence of C in S (same as strchr). */ -# ifdef __CORRECT_ISO_CPP_STRINGS_H_PROTO -extern "C++" -{ -extern char *index (char *__s, int __c) - __THROW __asm ("index") __attribute_pure__ __nonnull ((1)); -extern const char *index (const char *__s, int __c) - __THROW __asm ("index") __attribute_pure__ __nonnull ((1)); - -# if defined __OPTIMIZE__ -__extern_always_inline char * -index (char *__s, int __c) __THROW -{ - return __builtin_index (__s, __c); -} - -__extern_always_inline const char * -index (const char *__s, int __c) __THROW -{ - return __builtin_index (__s, __c); -} -# endif -} -# else -extern char *index (const char *__s, int __c) - __THROW __attribute_pure__ __nonnull ((1)); -# endif - -/* Find the last occurrence of C in S (same as strrchr). */ -# ifdef __CORRECT_ISO_CPP_STRINGS_H_PROTO -extern "C++" -{ -extern char *rindex (char *__s, int __c) - __THROW __asm ("rindex") __attribute_pure__ __nonnull ((1)); -extern const char *rindex (const char *__s, int __c) - __THROW __asm ("rindex") __attribute_pure__ __nonnull ((1)); - -# if defined __OPTIMIZE__ -__extern_always_inline char * -rindex (char *__s, int __c) __THROW -{ - return __builtin_rindex (__s, __c); -} - -__extern_always_inline const char * -rindex (const char *__s, int __c) __THROW -{ - return __builtin_rindex (__s, __c); -} -# endif -} -# else -extern char *rindex (const char *__s, int __c) - __THROW __attribute_pure__ __nonnull ((1)); -# endif -#endif - -#if defined __USE_MISC || !defined __USE_XOPEN2K8 || defined __USE_XOPEN2K8XSI -/* Return the position of the first bit set in I, or 0 if none are set. - The least-significant bit is position 1, the most-significant 32. */ -extern int ffs (int __i) __THROW __attribute_const__; -#endif - -/* The following two functions are non-standard but necessary for non-32 bit - platforms. */ -# ifdef __USE_GNU -extern int ffsl (long int __l) __THROW __attribute_const__; -__extension__ extern int ffsll (long long int __ll) - __THROW __attribute_const__; -# endif - -/* Compare S1 and S2, ignoring case. */ -extern int strcasecmp (const char *__s1, const char *__s2) - __THROW __attribute_pure__ __nonnull ((1, 2)); - -/* Compare no more than N chars of S1 and S2, ignoring case. */ -extern int strncasecmp (const char *__s1, const char *__s2, size_t __n) - __THROW __attribute_pure__ __nonnull ((1, 2)); - -#ifdef __USE_XOPEN2K8 -# include <xlocale.h> - -/* Compare S1 and S2, ignoring case, using collation rules from LOC. */ -extern int strcasecmp_l (const char *__s1, const char *__s2, __locale_t __loc) - __THROW __attribute_pure__ __nonnull ((1, 2, 3)); - -/* Compare no more than N chars of S1 and S2, ignoring case, using - collation rules from LOC. */ -extern int strncasecmp_l (const char *__s1, const char *__s2, - size_t __n, __locale_t __loc) - __THROW __attribute_pure__ __nonnull ((1, 2, 4)); -#endif - -__END_DECLS - -#if __GNUC_PREREQ (3,4) && __USE_FORTIFY_LEVEL > 0 \ - && defined __fortify_function -/* Functions with security checks. */ -# if defined __USE_MISC || !defined __USE_XOPEN2K8 -# include <bits/strings_fortified.h> -# endif -#endif - -#endif /* strings.h */ diff --git a/string/strlen.c b/string/strlen.c deleted file mode 100644 index b368ccf58f..0000000000 --- a/string/strlen.c +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se); - commentary by Jim Blandy (jimb@ai.mit.edu). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdlib.h> - -#undef strlen - -#ifndef STRLEN -# define STRLEN strlen -#endif - -/* Return the length of the null-terminated string STR. Scan for - the null terminator quickly by testing four bytes at a time. */ -size_t -STRLEN (const char *str) -{ - const char *char_ptr; - const unsigned long int *longword_ptr; - unsigned long int longword, himagic, lomagic; - - /* Handle the first few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = str; ((unsigned long int) char_ptr - & (sizeof (longword) - 1)) != 0; - ++char_ptr) - if (*char_ptr == '\0') - return char_ptr - str; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - himagic = 0x80808080L; - lomagic = 0x01010101L; - if (sizeof (longword) > 4) - { - /* 64-bit version of the magic. */ - /* Do the shift in two steps to avoid a warning if long has 32 bits. */ - himagic = ((himagic << 16) << 16) | himagic; - lomagic = ((lomagic << 16) << 16) | lomagic; - } - if (sizeof (longword) > 8) - abort (); - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - for (;;) - { - longword = *longword_ptr++; - - if (((longword - lomagic) & ~longword & himagic) != 0) - { - /* Which of the bytes was the zero? If none of them were, it was - a misfire; continue the search. */ - - const char *cp = (const char *) (longword_ptr - 1); - - if (cp[0] == 0) - return cp - str; - if (cp[1] == 0) - return cp - str + 1; - if (cp[2] == 0) - return cp - str + 2; - if (cp[3] == 0) - return cp - str + 3; - if (sizeof (longword) > 4) - { - if (cp[4] == 0) - return cp - str + 4; - if (cp[5] == 0) - return cp - str + 5; - if (cp[6] == 0) - return cp - str + 6; - if (cp[7] == 0) - return cp - str + 7; - } - } - } -} -libc_hidden_builtin_def (strlen) diff --git a/string/strncase.c b/string/strncase.c deleted file mode 100644 index 6cb996cf91..0000000000 --- a/string/strncase.c +++ /dev/null @@ -1,69 +0,0 @@ -/* Compare at most N characters of two strings without taking care for - the case. - Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <string.h> -#include <ctype.h> - -#ifndef weak_alias -# define __strncasecmp strncasecmp -# define TOLOWER(Ch) tolower (Ch) -#else -# include <locale/localeinfo.h> -# ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define __strncasecmp __strncasecmp_l -# endif -# define TOLOWER(Ch) __tolower_l ((Ch), loc) -#endif - -#ifdef USE_IN_EXTENDED_LOCALE_MODEL -# define LOCALE_PARAM , __locale_t loc -#else -# define LOCALE_PARAM -#endif - -/* Compare no more than N characters of S1 and S2, - ignoring case, returning less than, equal to or - greater than zero if S1 is lexicographically less - than, equal to or greater than S2. */ -int -__strncasecmp (const char *s1, const char *s2, size_t n LOCALE_PARAM) -{ -#if defined _LIBC && !defined USE_IN_EXTENDED_LOCALE_MODEL - __locale_t loc = _NL_CURRENT_LOCALE; -#endif - const unsigned char *p1 = (const unsigned char *) s1; - const unsigned char *p2 = (const unsigned char *) s2; - int result; - - if (p1 == p2 || n == 0) - return 0; - - while ((result = TOLOWER (*p1) - TOLOWER (*p2++)) == 0) - if (*p1++ == '\0' || --n == 0) - break; - - return result; -} -#ifndef __strncasecmp -weak_alias (__strncasecmp, strncasecmp) -#endif diff --git a/string/strncase_l.c b/string/strncase_l.c deleted file mode 100644 index 395fc9fd08..0000000000 --- a/string/strncase_l.c +++ /dev/null @@ -1,24 +0,0 @@ -/* Compare at most N characters of two strings without taking care for - the case using given locale. - Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define USE_IN_EXTENDED_LOCALE_MODEL 1 -#include "strncase.c" - -libc_hidden_def (__strncasecmp_l) -weak_alias (__strncasecmp_l, strncasecmp_l) diff --git a/string/strncat.c b/string/strncat.c deleted file mode 100644 index 71a13eec0b..0000000000 --- a/string/strncat.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#ifndef STRNCAT -# undef strncat -# define STRNCAT strncat -#endif - -char * -STRNCAT (char *s1, const char *s2, size_t n) -{ - char *s = s1; - - /* Find the end of S1. */ - s1 += strlen (s1); - - size_t ss = __strnlen (s2, n); - - s1[ss] = '\0'; - memcpy (s1, s2, ss); - - return s; -} diff --git a/string/strncmp.c b/string/strncmp.c deleted file mode 100644 index c41e120091..0000000000 --- a/string/strncmp.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <memcopy.h> - -#undef strncmp - -#ifndef STRNCMP -#define STRNCMP strncmp -#endif - -/* Compare no more than N characters of S1 and S2, - returning less than, equal to or greater than zero - if S1 is lexicographically less than, equal to or - greater than S2. */ -int -STRNCMP (const char *s1, const char *s2, size_t n) -{ - unsigned char c1 = '\0'; - unsigned char c2 = '\0'; - - if (n >= 4) - { - size_t n4 = n >> 2; - do - { - c1 = (unsigned char) *s1++; - c2 = (unsigned char) *s2++; - if (c1 == '\0' || c1 != c2) - return c1 - c2; - c1 = (unsigned char) *s1++; - c2 = (unsigned char) *s2++; - if (c1 == '\0' || c1 != c2) - return c1 - c2; - c1 = (unsigned char) *s1++; - c2 = (unsigned char) *s2++; - if (c1 == '\0' || c1 != c2) - return c1 - c2; - c1 = (unsigned char) *s1++; - c2 = (unsigned char) *s2++; - if (c1 == '\0' || c1 != c2) - return c1 - c2; - } while (--n4 > 0); - n &= 3; - } - - while (n > 0) - { - c1 = (unsigned char) *s1++; - c2 = (unsigned char) *s2++; - if (c1 == '\0' || c1 != c2) - return c1 - c2; - n--; - } - - return c1 - c2; -} - -libc_hidden_builtin_def (STRNCMP) diff --git a/string/strncpy.c b/string/strncpy.c deleted file mode 100644 index 1b45c52e73..0000000000 --- a/string/strncpy.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef strncpy - -#ifndef STRNCPY - #define STRNCPY strncpy -#endif - -char * -STRNCPY (char *s1, const char *s2, size_t n) -{ - size_t size = __strnlen (s2, n); - if (size != n) - memset (s1 + size, '\0', n - size); - return memcpy (s1, s2, size); -} -libc_hidden_builtin_def (strncpy) diff --git a/string/strndup.c b/string/strndup.c deleted file mode 100644 index fa0e7dcda1..0000000000 --- a/string/strndup.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 1996-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <sys/types.h> - -#if defined _LIBC || defined STDC_HEADERS -# include <stdlib.h> -# include <string.h> -#else -char *malloc (); -#endif - -#undef __strndup -#undef strndup - -#ifndef weak_alias -# define __strndup strndup -#endif - -char * -__strndup (const char *s, size_t n) -{ - size_t len = __strnlen (s, n); - char *new = (char *) malloc (len + 1); - - if (new == NULL) - return NULL; - - new[len] = '\0'; - return (char *) memcpy (new, s, len); -} -#ifdef libc_hidden_def -libc_hidden_def (__strndup) -#endif -#ifdef weak_alias -weak_alias (__strndup, strndup) -#endif diff --git a/string/strnlen.c b/string/strnlen.c deleted file mode 100644 index ff9fb6197a..0000000000 --- a/string/strnlen.c +++ /dev/null @@ -1,166 +0,0 @@ -/* Find the length of STRING, but scan at most MAXLEN characters. - Copyright (C) 1991-2017 Free Software Foundation, Inc. - Contributed by Jakub Jelinek <jakub@redhat.com>. - - Based on strlen written by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se); - commentary by Jim Blandy (jimb@ai.mit.edu). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdlib.h> - -/* Find the length of S, but scan at most MAXLEN characters. If no - '\0' terminator is found in that many characters, return MAXLEN. */ - -#ifdef STRNLEN -# define __strnlen STRNLEN -#endif - -size_t -__strnlen (const char *str, size_t maxlen) -{ - const char *char_ptr, *end_ptr = str + maxlen; - const unsigned long int *longword_ptr; - unsigned long int longword, himagic, lomagic; - - if (maxlen == 0) - return 0; - - if (__glibc_unlikely (end_ptr < str)) - end_ptr = (const char *) ~0UL; - - /* Handle the first few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = str; ((unsigned long int) char_ptr - & (sizeof (longword) - 1)) != 0; - ++char_ptr) - if (*char_ptr == '\0') - { - if (char_ptr > end_ptr) - char_ptr = end_ptr; - return char_ptr - str; - } - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - himagic = 0x80808080L; - lomagic = 0x01010101L; - if (sizeof (longword) > 4) - { - /* 64-bit version of the magic. */ - /* Do the shift in two steps to avoid a warning if long has 32 bits. */ - himagic = ((himagic << 16) << 16) | himagic; - lomagic = ((lomagic << 16) << 16) | lomagic; - } - if (sizeof (longword) > 8) - abort (); - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - while (longword_ptr < (unsigned long int *) end_ptr) - { - /* We tentatively exit the loop if adding MAGIC_BITS to - LONGWORD fails to change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-30 is set, there will be a carry - into bit 31, so all of the hole bits will be changed. - - The one misfire occurs when bits 24-30 are clear and bit - 31 is set; in this case, the hole at bit 31 is not - changed. If we had access to the processor carry flag, - we could close this loophole by putting the fourth hole - at bit 32! - - So it ignores everything except 128's, when they're aligned - properly. */ - - longword = *longword_ptr++; - - if ((longword - lomagic) & himagic) - { - /* Which of the bytes was the zero? If none of them were, it was - a misfire; continue the search. */ - - const char *cp = (const char *) (longword_ptr - 1); - - char_ptr = cp; - if (cp[0] == 0) - break; - char_ptr = cp + 1; - if (cp[1] == 0) - break; - char_ptr = cp + 2; - if (cp[2] == 0) - break; - char_ptr = cp + 3; - if (cp[3] == 0) - break; - if (sizeof (longword) > 4) - { - char_ptr = cp + 4; - if (cp[4] == 0) - break; - char_ptr = cp + 5; - if (cp[5] == 0) - break; - char_ptr = cp + 6; - if (cp[6] == 0) - break; - char_ptr = cp + 7; - if (cp[7] == 0) - break; - } - } - char_ptr = end_ptr; - } - - if (char_ptr > end_ptr) - char_ptr = end_ptr; - return char_ptr - str; -} -#ifndef STRNLEN -libc_hidden_def (__strnlen) -weak_alias (__strnlen, strnlen) -#endif -libc_hidden_def (strnlen) diff --git a/string/strpbrk.c b/string/strpbrk.c deleted file mode 100644 index 02d0bd2f63..0000000000 --- a/string/strpbrk.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef strpbrk - -#ifndef STRPBRK -#define STRPBRK strpbrk -#endif - -/* Find the first occurrence in S of any character in ACCEPT. */ -char * -STRPBRK (const char *s, const char *accept) -{ - s += strcspn (s, accept); - return *s ? (char *)s : NULL; -} -libc_hidden_builtin_def (strpbrk) diff --git a/string/strrchr.c b/string/strrchr.c deleted file mode 100644 index 92638a8fbd..0000000000 --- a/string/strrchr.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef strrchr - -#ifndef STRRCHR -# define STRRCHR strrchr -#endif - -/* Find the last occurrence of C in S. */ -char * -STRRCHR (const char *s, int c) -{ - const char *found, *p; - - c = (unsigned char) c; - - /* Since strchr is fast, we use it rather than the obvious loop. */ - - if (c == '\0') - return strchr (s, '\0'); - - found = NULL; - while ((p = strchr (s, c)) != NULL) - { - found = p; - s = p + 1; - } - - return (char *) found; -} - -#ifdef weak_alias -#undef rindex -weak_alias (strrchr, rindex) -#endif -libc_hidden_builtin_def (strrchr) diff --git a/string/strsep.c b/string/strsep.c deleted file mode 100644 index 7091234a6c..0000000000 --- a/string/strsep.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - -#undef __strsep -#undef strsep - -char * -__strsep (char **stringp, const char *delim) -{ - char *begin, *end; - - begin = *stringp; - if (begin == NULL) - return NULL; - - /* Find the end of the token. */ - end = begin + strcspn (begin, delim); - - if (*end) - { - /* Terminate the token and set *STRINGP past NUL character. */ - *end++ = '\0'; - *stringp = end; - } - else - /* No more delimiters; this is the last token. */ - *stringp = NULL; - - return begin; -} -weak_alias (__strsep, strsep) -strong_alias (__strsep, __strsep_g) -libc_hidden_def (__strsep_g) diff --git a/string/strsignal.c b/string/strsignal.c deleted file mode 100644 index 6cb4399934..0000000000 --- a/string/strsignal.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <libintl.h> -#include <libc-lock.h> - -static __libc_key_t key; - -/* If nonzero the key allocation failed and we should better use a - static buffer than fail. */ -#define BUFFERSIZ 100 -static char local_buf[BUFFERSIZ]; -static char *static_buf; - -/* Destructor for the thread-specific data. */ -static void init (void); -static void free_key_mem (void *mem); -static char *getbuffer (void); - - -/* Return a string describing the meaning of the signal number SIGNUM. */ -char * -strsignal (int signum) -{ - __libc_once_define (static, once); - const char *desc; - - /* If we have not yet initialized the buffer do it now. */ - __libc_once (once, init); - - if ( -#ifdef SIGRTMIN - (signum >= SIGRTMIN && signum <= SIGRTMAX) || -#endif - signum < 0 || signum >= NSIG - || (desc = _sys_siglist[signum]) == NULL) - { - char *buffer = getbuffer (); - int len; -#ifdef SIGRTMIN - if (signum >= SIGRTMIN && signum <= SIGRTMAX) - len = __snprintf (buffer, BUFFERSIZ - 1, _("Real-time signal %d"), - signum - SIGRTMIN); - else -#endif - len = __snprintf (buffer, BUFFERSIZ - 1, _("Unknown signal %d"), - signum); - if (len >= BUFFERSIZ) - buffer = NULL; - else - buffer[len] = '\0'; - - return buffer; - } - - return (char *) _(desc); -} - - -/* Initialize buffer. */ -static void -init (void) -{ - if (__libc_key_create (&key, free_key_mem)) - /* Creating the key failed. This means something really went - wrong. In any case use a static buffer which is better than - nothing. */ - static_buf = local_buf; -} - - -/* Free the thread specific data, this is done if a thread terminates. */ -static void -free_key_mem (void *mem) -{ - free (mem); - __libc_setspecific (key, NULL); -} - - -/* Return the buffer to be used. */ -static char * -getbuffer (void) -{ - char *result; - - if (static_buf != NULL) - result = static_buf; - else - { - /* We don't use the static buffer and so we have a key. Use it - to get the thread-specific buffer. */ - result = __libc_getspecific (key); - if (result == NULL) - { - /* No buffer allocated so far. */ - result = malloc (BUFFERSIZ); - if (result == NULL) - /* No more memory available. We use the static buffer. */ - result = local_buf; - else - __libc_setspecific (key, result); - } - } - - return result; -} diff --git a/string/strspn.c b/string/strspn.c deleted file mode 100644 index c63197cdf0..0000000000 --- a/string/strspn.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <stdint.h> -#include <libc-pointer-arith.h> - -#undef strspn -#ifndef STRSPN -# define STRSPN strspn -#endif - -/* Return the length of the maximum initial segment - of S which contains only characters in ACCEPT. */ -size_t -STRSPN (const char *str, const char *accept) -{ - if (accept[0] == '\0') - return 0; - if (__glibc_unlikely (accept[1] == '\0')) - { - const char *a = str; - for (; *str == *accept; str++); - return str - a; - } - - /* Use multiple small memsets to enable inlining on most targets. */ - unsigned char table[256]; - unsigned char *p = memset (table, 0, 64); - memset (p + 64, 0, 64); - memset (p + 128, 0, 64); - memset (p + 192, 0, 64); - - unsigned char *s = (unsigned char*) accept; - /* Different from strcspn it does not add the NULL on the table - so can avoid check if str[i] is NULL, since table['\0'] will - be 0 and thus stopping the loop check. */ - do - p[*s++] = 1; - while (*s); - - s = (unsigned char*) str; - if (!p[s[0]]) return 0; - if (!p[s[1]]) return 1; - if (!p[s[2]]) return 2; - if (!p[s[3]]) return 3; - - s = (unsigned char *) PTR_ALIGN_DOWN (s, 4); - - unsigned int c0, c1, c2, c3; - do { - s += 4; - c0 = p[s[0]]; - c1 = p[s[1]]; - c2 = p[s[2]]; - c3 = p[s[3]]; - } while ((c0 & c1 & c2 & c3) != 0); - - size_t count = s - (unsigned char *) str; - return (c0 & c1) == 0 ? count + c0 : count + c2 + 2; -} -libc_hidden_builtin_def (strspn) diff --git a/string/strstr.c b/string/strstr.c deleted file mode 100644 index 88f1d5de36..0000000000 --- a/string/strstr.c +++ /dev/null @@ -1,92 +0,0 @@ -/* Return the offset of one string within another. - Copyright (C) 1994-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This particular implementation was written by Eric Blake, 2008. */ - -#ifndef _LIBC -# include <config.h> -#endif - -/* Specification of strstr. */ -#include <string.h> - -#include <stdbool.h> - -#ifndef _LIBC -# define __builtin_expect(expr, val) (expr) -#endif - -#define RETURN_TYPE char * -#define AVAILABLE(h, h_l, j, n_l) \ - (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \ - && ((h_l) = (j) + (n_l))) -#define CHECK_EOL (1) -#define RET0_IF_0(a) if (!a) goto ret0 -#include "str-two-way.h" - -#undef strstr - -#ifndef STRSTR -#define STRSTR strstr -#endif - -/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK - if NEEDLE is empty, otherwise NULL if NEEDLE is not found in - HAYSTACK. */ -char * -STRSTR (const char *haystack_start, const char *needle_start) -{ - const char *haystack = haystack_start; - const char *needle = needle_start; - size_t needle_len; /* Length of NEEDLE. */ - size_t haystack_len; /* Known minimum length of HAYSTACK. */ - bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */ - - /* Determine length of NEEDLE, and in the process, make sure - HAYSTACK is at least as long (no point processing all of a long - NEEDLE if HAYSTACK is too short). */ - while (*haystack && *needle) - ok &= *haystack++ == *needle++; - if (*needle) - return NULL; - if (ok) - return (char *) haystack_start; - - /* Reduce the size of haystack using strchr, since it has a smaller - linear coefficient than the Two-Way algorithm. */ - needle_len = needle - needle_start; - haystack = strchr (haystack_start + 1, *needle_start); - if (!haystack || __builtin_expect (needle_len == 1, 0)) - return (char *) haystack; - needle -= needle_len; - haystack_len = (haystack > haystack_start + needle_len ? 1 - : needle_len + haystack_start - haystack); - - /* Perform the search. Abstract memory is considered to be an array - of 'unsigned char' values, not an array of 'char' values. See - ISO C 99 section 6.2.6.1. */ - if (needle_len < LONG_NEEDLE_THRESHOLD) - return two_way_short_needle ((const unsigned char *) haystack, - haystack_len, - (const unsigned char *) needle, needle_len); - return two_way_long_needle ((const unsigned char *) haystack, haystack_len, - (const unsigned char *) needle, needle_len); -} -libc_hidden_builtin_def (strstr) - -#undef LONG_NEEDLE_THRESHOLD diff --git a/string/strtok.c b/string/strtok.c deleted file mode 100644 index 6b9de89747..0000000000 --- a/string/strtok.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> - - -/* Parse S into tokens separated by characters in DELIM. - If S is NULL, the last string strtok() was called with is - used. For example: - char s[] = "-abc-=-def"; - x = strtok(s, "-"); // x = "abc" - x = strtok(NULL, "-="); // x = "def" - x = strtok(NULL, "="); // x = NULL - // s = "abc\0=-def\0" -*/ -char * -strtok (char *s, const char *delim) -{ - static char *olds; - return __strtok_r (s, delim, &olds); -} diff --git a/string/strtok_r.c b/string/strtok_r.c deleted file mode 100644 index ace3520a25..0000000000 --- a/string/strtok_r.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Reentrant string tokenizer. Generic version. - Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <string.h> - -#ifndef _LIBC -/* Get specification. */ -# include "strtok_r.h" -# define __strtok_r strtok_r -#endif - -/* Parse S into tokens separated by characters in DELIM. - If S is NULL, the saved pointer in SAVE_PTR is used as - the next starting point. For example: - char s[] = "-abc-=-def"; - char *sp; - x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" - x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL - x = strtok_r(NULL, "=", &sp); // x = NULL - // s = "abc\0-def\0" -*/ -char * -__strtok_r (char *s, const char *delim, char **save_ptr) -{ - char *end; - - if (s == NULL) - s = *save_ptr; - - if (*s == '\0') - { - *save_ptr = s; - return NULL; - } - - /* Scan leading delimiters. */ - s += strspn (s, delim); - if (*s == '\0') - { - *save_ptr = s; - return NULL; - } - - /* Find the end of the token. */ - end = s + strcspn (s, delim); - if (*end == '\0') - { - *save_ptr = end; - return s; - } - - /* Terminate the token and make *SAVE_PTR point past it. */ - *end = '\0'; - *save_ptr = end + 1; - return s; -} -#ifdef weak_alias -libc_hidden_def (__strtok_r) -weak_alias (__strtok_r, strtok_r) -#endif diff --git a/string/strverscmp.c b/string/strverscmp.c deleted file mode 100644 index 383f6445c8..0000000000 --- a/string/strverscmp.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Compare strings while treating digits characters numerically. - Copyright (C) 1997-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdint.h> -#include <string.h> -#include <ctype.h> - -/* states: S_N: normal, S_I: comparing integral part, S_F: comparing - fractionnal parts, S_Z: idem but with leading Zeroes only */ -#define S_N 0x0 -#define S_I 0x3 -#define S_F 0x6 -#define S_Z 0x9 - -/* result_type: CMP: return diff; LEN: compare using len_diff/diff */ -#define CMP 2 -#define LEN 3 - - -/* Compare S1 and S2 as strings holding indices/version numbers, - returning less than, equal to or greater than zero if S1 is less than, - equal to or greater than S2 (for more info, see the texinfo doc). -*/ - -int -__strverscmp (const char *s1, const char *s2) -{ - const unsigned char *p1 = (const unsigned char *) s1; - const unsigned char *p2 = (const unsigned char *) s2; - - /* Symbol(s) 0 [1-9] others - Transition (10) 0 (01) d (00) x */ - static const uint8_t next_state[] = - { - /* state x d 0 */ - /* S_N */ S_N, S_I, S_Z, - /* S_I */ S_N, S_I, S_I, - /* S_F */ S_N, S_F, S_F, - /* S_Z */ S_N, S_F, S_Z - }; - - static const int8_t result_type[] = - { - /* state x/x x/d x/0 d/x d/d d/0 0/x 0/d 0/0 */ - - /* S_N */ CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP, - /* S_I */ CMP, -1, -1, +1, LEN, LEN, +1, LEN, LEN, - /* S_F */ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, - /* S_Z */ CMP, +1, +1, -1, CMP, CMP, -1, CMP, CMP - }; - - if (p1 == p2) - return 0; - - unsigned char c1 = *p1++; - unsigned char c2 = *p2++; - /* Hint: '0' is a digit too. */ - int state = S_N + ((c1 == '0') + (isdigit (c1) != 0)); - - int diff; - while ((diff = c1 - c2) == 0) - { - if (c1 == '\0') - return diff; - - state = next_state[state]; - c1 = *p1++; - c2 = *p2++; - state += (c1 == '0') + (isdigit (c1) != 0); - } - - state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))]; - - switch (state) - { - case CMP: - return diff; - - case LEN: - while (isdigit (*p1++)) - if (!isdigit (*p2++)) - return 1; - - return isdigit (*p2) ? -1 : diff; - - default: - return state; - } -} -libc_hidden_def (__strverscmp) -weak_alias (__strverscmp, strverscmp) diff --git a/string/strxfrm.c b/string/strxfrm.c deleted file mode 100644 index 5210466555..0000000000 --- a/string/strxfrm.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@cygnus.com>, 1995. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <string.h> -#include <locale/localeinfo.h> - -#ifndef STRING_TYPE -# define STRING_TYPE char -# define STRXFRM strxfrm -# define STRXFRM_L __strxfrm_l -#endif - -size_t -STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n) -{ - return STRXFRM_L (dest, src, n, _NL_CURRENT_LOCALE); -} diff --git a/string/strxfrm_l.c b/string/strxfrm_l.c deleted file mode 100644 index dd98a4caaf..0000000000 --- a/string/strxfrm_l.c +++ /dev/null @@ -1,747 +0,0 @@ -/* Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@gnu.org>, 1995. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <langinfo.h> -#include <locale.h> -#include <stddef.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <sys/param.h> - -#ifndef STRING_TYPE -# define STRING_TYPE char -# define USTRING_TYPE unsigned char -# define STRXFRM __strxfrm_l -# define STRLEN strlen -# define STPNCPY __stpncpy -# define WEIGHT_H "../locale/weight.h" -# define SUFFIX MB -# define L(arg) arg -#endif - -#define CONCAT(a,b) CONCAT1(a,b) -#define CONCAT1(a,b) a##b - -/* Maximum string size that is calculated with cached indices. Right now this - is an arbitrary value open to optimizations. SMALL_STR_SIZE * 4 has to be - lower than __MAX_ALLOCA_CUTOFF. Keep localedata/xfrm-test.c in sync. */ -#define SMALL_STR_SIZE 4095 - -#include "../locale/localeinfo.h" -#include WEIGHT_H - -/* Group locale data for shorter parameter lists. */ -typedef struct -{ - uint_fast32_t nrules; - unsigned char *rulesets; - USTRING_TYPE *weights; - int32_t *table; - USTRING_TYPE *extra; - int32_t *indirect; -} locale_data_t; - -#ifndef WIDE_CHAR_VERSION - -/* We need UTF-8 encoding of numbers. */ -static int -utf8_encode (char *buf, int val) -{ - int retval; - - if (val < 0x80) - { - *buf++ = (char) val; - retval = 1; - } - else - { - int step; - - for (step = 2; step < 6; ++step) - if ((val & (~(uint32_t)0 << (5 * step + 1))) == 0) - break; - retval = step; - - *buf = (unsigned char) (~0xff >> step); - --step; - do - { - buf[step] = 0x80 | (val & 0x3f); - val >>= 6; - } - while (--step > 0); - *buf |= val; - } - - return retval; -} -#endif - -/* Find next weight and rule index. Inlined since called for every char. */ -static __always_inline size_t -find_idx (const USTRING_TYPE **us, int32_t *weight_idx, - unsigned char *rule_idx, const locale_data_t *l_data, const int pass) -{ - int32_t tmp = findidx (l_data->table, l_data->indirect, l_data->extra, us, - -1); - *rule_idx = tmp >> 24; - int32_t idx = tmp & 0xffffff; - size_t len = l_data->weights[idx++]; - - /* Skip over indices of previous levels. */ - for (int i = 0; i < pass; i++) - { - idx += len; - len = l_data->weights[idx++]; - } - - *weight_idx = idx; - return len; -} - -static int -find_position (const USTRING_TYPE *us, const locale_data_t *l_data, - const int pass) -{ - int32_t weight_idx; - unsigned char rule_idx; - const USTRING_TYPE *usrc = us; - - find_idx (&usrc, &weight_idx, &rule_idx, l_data, pass); - return l_data->rulesets[rule_idx * l_data->nrules + pass] & sort_position; -} - -/* Do the transformation. */ -static size_t -do_xfrm (const USTRING_TYPE *usrc, STRING_TYPE *dest, size_t n, - const locale_data_t *l_data) -{ - int32_t weight_idx; - unsigned char rule_idx; - uint_fast32_t pass; - size_t needed = 0; - size_t last_needed; - - /* Now the passes over the weights. */ - for (pass = 0; pass < l_data->nrules; ++pass) - { - size_t backw_len = 0; - last_needed = needed; - const USTRING_TYPE *cur = usrc; - const USTRING_TYPE *backw_start = NULL; - - /* We assume that if a rule has defined `position' in one section - this is true for all of them. */ - int position = find_position (cur, l_data, pass); - - if (position == 0) - { - while (*cur != L('\0')) - { - const USTRING_TYPE *pos = cur; - size_t len = find_idx (&cur, &weight_idx, &rule_idx, l_data, - pass); - int rule = l_data->rulesets[rule_idx * l_data->nrules + pass]; - - if ((rule & sort_forward) != 0) - { - /* Handle the pushed backward sequence. */ - if (backw_start != NULL) - { - for (size_t i = backw_len; i > 0; ) - { - int32_t weight_idx; - unsigned char rule_idx; - size_t len = find_idx (&backw_start, &weight_idx, - &rule_idx, l_data, pass); - if (needed + i < n) - for (size_t j = len; j > 0; j--) - dest[needed + i - j] = - l_data->weights[weight_idx++]; - - i -= len; - } - - needed += backw_len; - backw_start = NULL; - backw_len = 0; - } - - /* Now handle the forward element. */ - if (needed + len < n) - while (len-- > 0) - dest[needed++] = l_data->weights[weight_idx++]; - else - /* No more characters fit into the buffer. */ - needed += len; - } - else - { - /* Remember start of the backward sequence & track length. */ - if (backw_start == NULL) - backw_start = pos; - backw_len += len; - } - } - - - /* Handle the pushed backward sequence. */ - if (backw_start != NULL) - { - for (size_t i = backw_len; i > 0; ) - { - size_t len = find_idx (&backw_start, &weight_idx, &rule_idx, - l_data, pass); - if (needed + i < n) - for (size_t j = len; j > 0; j--) - dest[needed + i - j] = - l_data->weights[weight_idx++]; - - i -= len; - } - - needed += backw_len; - } - } - else - { - int val = 1; -#ifndef WIDE_CHAR_VERSION - char buf[7]; - size_t buflen; -#endif - size_t i; - - while (*cur != L('\0')) - { - const USTRING_TYPE *pos = cur; - size_t len = find_idx (&cur, &weight_idx, &rule_idx, l_data, - pass); - int rule = l_data->rulesets[rule_idx * l_data->nrules + pass]; - - if ((rule & sort_forward) != 0) - { - /* Handle the pushed backward sequence. */ - if (backw_start != NULL) - { - for (size_t p = backw_len; p > 0; p--) - { - size_t len; - int32_t weight_idx; - unsigned char rule_idx; - const USTRING_TYPE *backw_cur = backw_start; - - /* To prevent a warning init the used vars. */ - len = find_idx (&backw_cur, &weight_idx, - &rule_idx, l_data, pass); - - for (i = 1; i < p; i++) - len = find_idx (&backw_cur, &weight_idx, - &rule_idx, l_data, pass); - - if (len != 0) - { -#ifdef WIDE_CHAR_VERSION - if (needed + 1 + len < n) - { - dest[needed] = val; - for (i = 0; i < len; ++i) - dest[needed + 1 + i] = - l_data->weights[weight_idx + i]; - } - needed += 1 + len; -#else - buflen = utf8_encode (buf, val); - if (needed + buflen + len < n) - { - for (i = 0; i < buflen; ++i) - dest[needed + i] = buf[i]; - for (i = 0; i < len; ++i) - dest[needed + buflen + i] = - l_data->weights[weight_idx + i]; - } - needed += buflen + len; -#endif - val = 1; - } - else - ++val; - } - - backw_start = NULL; - backw_len = 0; - } - - /* Now handle the forward element. */ - if (len != 0) - { -#ifdef WIDE_CHAR_VERSION - if (needed + 1 + len < n) - { - dest[needed] = val; - for (i = 0; i < len; ++i) - dest[needed + 1 + i] = - l_data->weights[weight_idx + i]; - } - needed += 1 + len; -#else - buflen = utf8_encode (buf, val); - if (needed + buflen + len < n) - { - for (i = 0; i < buflen; ++i) - dest[needed + i] = buf[i]; - for (i = 0; i < len; ++i) - dest[needed + buflen + i] = - l_data->weights[weight_idx + i]; - } - needed += buflen + len; -#endif - val = 1; - } - else - ++val; - } - else - { - /* Remember start of the backward sequence & track length. */ - if (backw_start == NULL) - backw_start = pos; - backw_len++; - } - } - - /* Handle the pushed backward sequence. */ - if (backw_start != NULL) - { - for (size_t p = backw_len; p > 0; p--) - { - size_t len; - int32_t weight_idx; - unsigned char rule_idx; - const USTRING_TYPE *backw_cur = backw_start; - - /* To prevent a warning init the used vars. */ - len = find_idx (&backw_cur, &weight_idx, - &rule_idx, l_data, pass); - - for (i = 1; i < p; i++) - len = find_idx (&backw_cur, &weight_idx, - &rule_idx, l_data, pass); - - if (len != 0) - { -#ifdef WIDE_CHAR_VERSION - if (needed + 1 + len < n) - { - dest[needed] = val; - for (i = 0; i < len; ++i) - dest[needed + 1 + i] = - l_data->weights[weight_idx + i]; - } - needed += 1 + len; -#else - buflen = utf8_encode (buf, val); - if (needed + buflen + len < n) - { - for (i = 0; i < buflen; ++i) - dest[needed + i] = buf[i]; - for (i = 0; i < len; ++i) - dest[needed + buflen + i] = - l_data->weights[weight_idx + i]; - } - needed += buflen + len; -#endif - val = 1; - } - else - ++val; - } - } - } - - /* Finally store the byte to separate the passes or terminate - the string. */ - if (needed < n) - dest[needed] = pass + 1 < l_data->nrules ? L('\1') : L('\0'); - ++needed; - } - - /* This is a little optimization: many collation specifications have - a `position' rule at the end and if no non-ignored character - is found the last \1 byte is immediately followed by a \0 byte - signalling this. We can avoid the \1 byte(s). */ - if (needed > 2 && needed == last_needed + 1) - { - /* Remove the \1 byte. */ - if (--needed <= n) - dest[needed - 1] = L('\0'); - } - - /* Return the number of bytes/words we need, but don't count the NUL - byte/word at the end. */ - return needed - 1; -} - -/* Do the transformation using weight-index and rule cache. */ -static size_t -do_xfrm_cached (STRING_TYPE *dest, size_t n, const locale_data_t *l_data, - size_t idxmax, int32_t *idxarr, const unsigned char *rulearr) -{ - uint_fast32_t nrules = l_data->nrules; - unsigned char *rulesets = l_data->rulesets; - USTRING_TYPE *weights = l_data->weights; - uint_fast32_t pass; - size_t needed = 0; - size_t last_needed; - size_t idxcnt; - - /* Now the passes over the weights. */ - for (pass = 0; pass < nrules; ++pass) - { - size_t backw_stop = ~0ul; - int rule = rulesets[rulearr[0] * nrules + pass]; - /* We assume that if a rule has defined `position' in one section - this is true for all of them. */ - int position = rule & sort_position; - - last_needed = needed; - if (position == 0) - { - for (idxcnt = 0; idxcnt < idxmax; ++idxcnt) - { - if ((rule & sort_forward) != 0) - { - size_t len; - - if (backw_stop != ~0ul) - { - /* Handle the pushed elements now. */ - size_t backw; - - for (backw = idxcnt; backw > backw_stop; ) - { - --backw; - len = weights[idxarr[backw]++]; - - if (needed + len < n) - while (len-- > 0) - dest[needed++] = weights[idxarr[backw]++]; - else - { - /* No more characters fit into the buffer. */ - needed += len; - idxarr[backw] += len; - } - } - - backw_stop = ~0ul; - } - - /* Now handle the forward element. */ - len = weights[idxarr[idxcnt]++]; - if (needed + len < n) - while (len-- > 0) - dest[needed++] = weights[idxarr[idxcnt]++]; - else - { - /* No more characters fit into the buffer. */ - needed += len; - idxarr[idxcnt] += len; - } - } - else - { - /* Remember where the backwards series started. */ - if (backw_stop == ~0ul) - backw_stop = idxcnt; - } - - rule = rulesets[rulearr[idxcnt + 1] * nrules + pass]; - } - - - if (backw_stop != ~0ul) - { - /* Handle the pushed elements now. */ - size_t backw; - - backw = idxcnt; - while (backw > backw_stop) - { - size_t len = weights[idxarr[--backw]++]; - - if (needed + len < n) - while (len-- > 0) - dest[needed++] = weights[idxarr[backw]++]; - else - { - /* No more characters fit into the buffer. */ - needed += len; - idxarr[backw] += len; - } - } - } - } - else - { - int val = 1; -#ifndef WIDE_CHAR_VERSION - char buf[7]; - size_t buflen; -#endif - size_t i; - - for (idxcnt = 0; idxcnt < idxmax; ++idxcnt) - { - if ((rule & sort_forward) != 0) - { - size_t len; - - if (backw_stop != ~0ul) - { - /* Handle the pushed elements now. */ - size_t backw; - - for (backw = idxcnt; backw > backw_stop; ) - { - --backw; - len = weights[idxarr[backw]++]; - if (len != 0) - { -#ifdef WIDE_CHAR_VERSION - if (needed + 1 + len < n) - { - dest[needed] = val; - for (i = 0; i < len; ++i) - dest[needed + 1 + i] = - weights[idxarr[backw] + i]; - } - needed += 1 + len; -#else - buflen = utf8_encode (buf, val); - if (needed + buflen + len < n) - { - for (i = 0; i < buflen; ++i) - dest[needed + i] = buf[i]; - for (i = 0; i < len; ++i) - dest[needed + buflen + i] = - weights[idxarr[backw] + i]; - } - needed += buflen + len; -#endif - idxarr[backw] += len; - val = 1; - } - else - ++val; - } - - backw_stop = ~0ul; - } - - /* Now handle the forward element. */ - len = weights[idxarr[idxcnt]++]; - if (len != 0) - { -#ifdef WIDE_CHAR_VERSION - if (needed + 1+ len < n) - { - dest[needed] = val; - for (i = 0; i < len; ++i) - dest[needed + 1 + i] = - weights[idxarr[idxcnt] + i]; - } - needed += 1 + len; -#else - buflen = utf8_encode (buf, val); - if (needed + buflen + len < n) - { - for (i = 0; i < buflen; ++i) - dest[needed + i] = buf[i]; - for (i = 0; i < len; ++i) - dest[needed + buflen + i] = - weights[idxarr[idxcnt] + i]; - } - needed += buflen + len; -#endif - idxarr[idxcnt] += len; - val = 1; - } - else - /* Note that we don't have to increment `idxarr[idxcnt]' - since the length is zero. */ - ++val; - } - else - { - /* Remember where the backwards series started. */ - if (backw_stop == ~0ul) - backw_stop = idxcnt; - } - - rule = rulesets[rulearr[idxcnt + 1] * nrules + pass]; - } - - if (backw_stop != ~0ul) - { - /* Handle the pushed elements now. */ - size_t backw; - - backw = idxmax - 1; - while (backw > backw_stop) - { - size_t len = weights[idxarr[--backw]++]; - if (len != 0) - { -#ifdef WIDE_CHAR_VERSION - if (needed + 1 + len < n) - { - dest[needed] = val; - for (i = 0; i < len; ++i) - dest[needed + 1 + i] = - weights[idxarr[backw] + i]; - } - needed += 1 + len; -#else - buflen = utf8_encode (buf, val); - if (needed + buflen + len < n) - { - for (i = 0; i < buflen; ++i) - dest[needed + i] = buf[i]; - for (i = 0; i < len; ++i) - dest[needed + buflen + i] = - weights[idxarr[backw] + i]; - } - needed += buflen + len; -#endif - idxarr[backw] += len; - val = 1; - } - else - ++val; - } - } - } - - /* Finally store the byte to separate the passes or terminate - the string. */ - if (needed < n) - dest[needed] = pass + 1 < nrules ? L('\1') : L('\0'); - ++needed; - } - - /* This is a little optimization: many collation specifications have - a `position' rule at the end and if no non-ignored character - is found the last \1 byte is immediately followed by a \0 byte - signalling this. We can avoid the \1 byte(s). */ - if (needed > 2 && needed == last_needed + 1) - { - /* Remove the \1 byte. */ - if (--needed <= n) - dest[needed - 1] = L('\0'); - } - - /* Return the number of bytes/words we need, but don't count the NUL - byte/word at the end. */ - return needed - 1; -} - -size_t -STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) -{ - locale_data_t l_data; - struct __locale_data *current = l->__locales[LC_COLLATE]; - l_data.nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; - - /* Handle byte comparison case. */ - if (l_data.nrules == 0) - { - size_t srclen = STRLEN (src); - - if (n != 0) - STPNCPY (dest, src, MIN (srclen + 1, n)); - - return srclen; - } - - /* Handle an empty string, code hereafter relies on strlen (src) > 0. */ - if (*src == L('\0')) - { - if (n != 0) - *dest = L('\0'); - return 0; - } - - /* Get the locale data. */ - l_data.rulesets = (unsigned char *) - current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULESETS)].string; - l_data.table = (int32_t *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_TABLE,SUFFIX))].string; - l_data.weights = (USTRING_TYPE *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_WEIGHT,SUFFIX))].string; - l_data.extra = (USTRING_TYPE *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string; - l_data.indirect = (int32_t *) - current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string; - - assert (((uintptr_t) l_data.table) % __alignof__ (l_data.table[0]) == 0); - assert (((uintptr_t) l_data.weights) % __alignof__ (l_data.weights[0]) == 0); - assert (((uintptr_t) l_data.extra) % __alignof__ (l_data.extra[0]) == 0); - assert (((uintptr_t) l_data.indirect) % __alignof__ (l_data.indirect[0]) == 0); - - /* We need the elements of the string as unsigned values since they - are used as indeces. */ - const USTRING_TYPE *usrc = (const USTRING_TYPE *) src; - - /* Allocate cache for small strings on the stack and fill it with weight and - rule indices. If the cache size is not sufficient, continue with the - uncached xfrm version. */ - size_t idxmax = 0; - const USTRING_TYPE *cur = usrc; - int32_t *idxarr = alloca (SMALL_STR_SIZE * sizeof (int32_t)); - unsigned char *rulearr = alloca (SMALL_STR_SIZE + 1); - - do - { - int32_t tmp = findidx (l_data.table, l_data.indirect, l_data.extra, &cur, - -1); - rulearr[idxmax] = tmp >> 24; - idxarr[idxmax] = tmp & 0xffffff; - - ++idxmax; - } - while (*cur != L('\0') && idxmax < SMALL_STR_SIZE); - - /* This element is only read, the value never used but to determine - another value which then is ignored. */ - rulearr[idxmax] = '\0'; - - /* Do the transformation. */ - if (*cur == L('\0')) - return do_xfrm_cached (dest, n, &l_data, idxmax, idxarr, rulearr); - else - return do_xfrm (usrc, dest, n, &l_data); -} -libc_hidden_def (STRXFRM) - -#ifndef WIDE_CHAR_VERSION -weak_alias (__strxfrm_l, strxfrm_l) -#endif diff --git a/string/swab.c b/string/swab.c deleted file mode 100644 index bcdf6595b6..0000000000 --- a/string/swab.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1992-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <unistd.h> - -void -swab (const void *bfrom, void *bto, ssize_t n) -{ - const char *from = (const char *) bfrom; - char *to = (char *) bto; - - n &= ~((ssize_t) 1); - while (n > 1) - { - const char b0 = from[--n], b1 = from[--n]; - to[n] = b0; - to[n + 1] = b1; - } -} diff --git a/string/test-bcopy.c b/string/test-bcopy.c deleted file mode 100644 index 11acf07b79..0000000000 --- a/string/test-bcopy.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Test and measure bcopy functions. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_BCOPY -#include "test-memmove.c" diff --git a/string/test-bzero.c b/string/test-bzero.c deleted file mode 100644 index a24c448804..0000000000 --- a/string/test-bzero.c +++ /dev/null @@ -1,19 +0,0 @@ -/* Test and measure bzero functions. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ -#define TEST_BZERO -#include "test-memset.c" diff --git a/string/test-endian-types.c b/string/test-endian-types.c deleted file mode 100644 index 86a89324f7..0000000000 --- a/string/test-endian-types.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Test endian.h endian-conversion macros always return the correct type. - Copyright (C) 2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <endian.h> -#include <stdint.h> - -int i; -uint16_t u16; -uint32_t u32; -uint64_t u64; - -int -do_test (void) -{ - /* This is a compilation test. */ - extern __typeof (htobe16 (i)) u16; - extern __typeof (htole16 (i)) u16; - extern __typeof (be16toh (i)) u16; - extern __typeof (le16toh (i)) u16; - extern __typeof (htobe32 (i)) u32; - extern __typeof (htole32 (i)) u32; - extern __typeof (be32toh (i)) u32; - extern __typeof (le32toh (i)) u32; - extern __typeof (htobe64 (i)) u64; - extern __typeof (htole64 (i)) u64; - extern __typeof (be64toh (i)) u64; - extern __typeof (le64toh (i)) u64; - (void) u16; - (void) u32; - (void) u64; - return 0; -} - -#include <support/test-driver.c> diff --git a/string/test-explicit_bzero.c b/string/test-explicit_bzero.c deleted file mode 100644 index 7e41163eb1..0000000000 --- a/string/test-explicit_bzero.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Test and measure explicit_bzero. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ -#define TEST_EXPLICIT_BZERO -#define TEST_BZERO -#include "test-memset.c" diff --git a/string/test-ffs.c b/string/test-ffs.c deleted file mode 100644 index 11b6ea838b..0000000000 --- a/string/test-ffs.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 1994-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), - On-Line Applications Research Corporation. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -int -do_test (void) -{ - int failures = 0; - int i; - - auto void try (const char *name, long long int param, int value, - int expected); - - void try (const char *name, long long int param, int value, int expected) - { - if (value != expected) - { - printf ("%s(%#llx) expected %d got %d\n", - name, param, expected, value); - ++failures; - } - else - printf ("%s(%#llx) as expected %d\n", name, param, value); - } - -#define TEST(fct, type) \ - try (#fct, 0, fct ((type) 0), 0); \ - for (i=0 ; i < 8 * sizeof (type); i++) \ - try (#fct, 1ll << i, fct (((type) 1) << i), i + 1); \ - for (i=0 ; i < 8 * sizeof (type) ; i++) \ - try (#fct, (~((type) 0) >> i) << i, fct ((~((type) 0) >> i) << i), i + 1);\ - try (#fct, 0x80008000, fct ((type) 0x80008000), 16) - - TEST (ffs, int); - TEST (ffsl, long int); - TEST (ffsll, long long int); - - if (failures) - printf ("Test FAILED! %d failure%s.\n", failures, &"s"[failures == 1]); - else - puts ("Test succeeded."); - - return failures; -} - -#include <support/test-driver.c> diff --git a/string/test-memccpy.c b/string/test-memccpy.c deleted file mode 100644 index 7bd67a61e7..0000000000 --- a/string/test-memccpy.c +++ /dev/null @@ -1,269 +0,0 @@ -/* Test and measure memccpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#define TEST_NAME "memccpy" -#include "test-string.h" - -void *simple_memccpy (void *, const void *, int, size_t); -void *stupid_memccpy (void *, const void *, int, size_t); - -IMPL (stupid_memccpy, 0) -IMPL (simple_memccpy, 0) -IMPL (memccpy, 1) - -void * -simple_memccpy (void *dst, const void *src, int c, size_t n) -{ - const char *s = src; - char *d = dst; - - while (n-- > 0) - if ((*d++ = *s++) == (char) c) - return d; - - return NULL; -} - -void * -stupid_memccpy (void *dst, const void *src, int c, size_t n) -{ - void *p = memchr (src, c, n); - - if (p != NULL) - return mempcpy (dst, src, p - src + 1); - - memcpy (dst, src, n); - return NULL; -} - -typedef void *(*proto_t) (void *, const void *, int c, size_t); - -static void -do_one_test (impl_t *impl, void *dst, const void *src, int c, size_t len, - size_t n) -{ - void *expect = len > n ? NULL : (char *) dst + len; - if (CALL (impl, dst, src, c, n) != expect) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - CALL (impl, dst, src, c, n), expect); - ret = 1; - return; - } - - if (memcmp (dst, src, len > n ? n : len) != 0) - { - error (0, 0, "Wrong result in function %s", impl->name); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, int c, size_t len, size_t n, - int max_char) -{ - size_t i; - char *s1, *s2; - - align1 &= 7; - if (align1 + len >= page_size) - return; - - align2 &= 7; - if (align2 + len >= page_size) - return; - - s1 = (char *) (buf1 + align1); - s2 = (char *) (buf2 + align2); - - for (i = 0; i < len - 1; ++i) - { - s1[i] = 32 + 23 * i % (max_char - 32); - if (s1[i] == (char) c) - --s1[i]; - } - s1[len - 1] = c; - for (i = len; i + align1 < page_size && i < len + 64; ++i) - s1[i] = 32 + 32 * i % (max_char - 32); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s2, s1, c, len, n); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, len, size, mode; - unsigned char *p1 = buf1 + page_size - 512; - unsigned char *p2 = buf2 + page_size - 512; - unsigned char *res, c; - - for (n = 0; n < ITERATIONS; n++) - { - mode = random (); - c = random (); - if (mode & 1) - { - size = random () & 255; - align1 = 512 - size - (random () & 15); - if (mode & 2) - align2 = align1 - (random () & 24); - else - align2 = align1 - (random () & 31); - if (mode & 4) - { - j = align1; - align1 = align2; - align2 = j; - } - if (mode & 8) - len = size - (random () & 31); - else - len = 512; - if (len >= 512) - len = random () & 511; - } - else - { - align1 = random () & 31; - if (mode & 2) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - len = random () & 511; - j = align1; - if (align2 > j) - j = align2; - if (mode & 4) - { - size = random () & 511; - if (size + j > 512) - size = 512 - j - (random() & 31); - } - else - size = 512 - j; - if ((mode & 8) && len + j >= 512) - len = 512 - j - (random () & 7); - } - j = len + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; i++) - { - if (i == len + align1) - p1[i] = c; - else - { - p1[i] = random () & 255; - if (i >= align1 && i < len + align1 && p1[i] == c) - p1[i] = (random () & 127) + 3 + c; - } - } - - FOR_EACH_IMPL (impl, 1) - { - unsigned char *expect; - memset (p2 - 64, '\1', 512 + 64); - res = CALL (impl, p2 + align2, p1 + align1, (char) c, size); - if (len >= size) - expect = NULL; - else - expect = p2 + align2 + len + 1; - - if (res != expect) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd, %d) %p != %p", - n, impl->name, align1, align2, len, size, c, res, expect); - ret = 1; - } - for (j = 0; j < align2 + 64; ++j) - { - if (p2[j - 64] != '\1') - { - error (0, 0, "Iteration %zd - garbage before, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - j = align2 + len + 1; - if (size + align2 < j) - j = size + align2; - for (; j < 512; ++j) - { - if (p2[j] != '\1') - { - error (0, 0, "Iteration %zd - garbage after, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - j = len + 1; - if (size < j) - j = size; - if (memcmp (p1 + align1, p2 + align2, j)) - { - error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - } - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%28s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - do_test (i, i, 12, 16, 16, 127); - do_test (i, i, 23, 16, 16, 255); - do_test (i, 2 * i, 28, 16, 16, 127); - do_test (2 * i, i, 31, 16, 16, 255); - do_test (8 - i, 2 * i, 1, 1 << i, 2 << i, 127); - do_test (2 * i, 8 - i, 17, 2 << i, 1 << i, 127); - do_test (8 - i, 2 * i, 0, 1 << i, 2 << i, 255); - do_test (2 * i, 8 - i, i, 2 << i, 1 << i, 255); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 0, i, 4 << i, 8 << i, 127); - do_test (0, 0, i, 16 << i, 8 << i, 127); - do_test (8 - i, 2 * i, i, 4 << i, 8 << i, 127); - do_test (8 - i, 2 * i, i, 16 << i, 8 << i, 127); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-memchr.c b/string/test-memchr.c deleted file mode 100644 index 73a93f0fc9..0000000000 --- a/string/test-memchr.c +++ /dev/null @@ -1,227 +0,0 @@ -/* Test memchr functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "memchr" -#else -# define TEST_NAME "wmemchr" -#endif /* WIDE */ - -#include "test-string.h" -#include <stdint.h> - -#ifndef WIDE -# define MEMCHR memchr -# define CHAR char -# define UCHAR unsigned char -# define SIMPLE_MEMCHR simple_memchr -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -#else -# include <wchar.h> -# define MEMCHR wmemchr -# define CHAR wchar_t -# define UCHAR wchar_t -# define SIMPLE_MEMCHR simple_wmemchr -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -#endif /* WIDE */ - -typedef CHAR *(*proto_t) (const CHAR *, int, size_t); -CHAR *SIMPLE_MEMCHR (const CHAR *, int, size_t); - -IMPL (SIMPLE_MEMCHR, 0) -IMPL (MEMCHR, 1) - -CHAR * -SIMPLE_MEMCHR (const CHAR *s, int c, size_t n) -{ - while (n--) - if (*s++ == (CHAR) c) - return (CHAR *) s - 1; - return NULL; -} - -static void -do_one_test (impl_t *impl, const CHAR *s, int c, size_t n, CHAR *exp_res) -{ - CHAR *res = CALL (impl, s, c, n); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - res, exp_res); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t pos, size_t len, size_t n, int seek_char) -{ - size_t i; - CHAR *result; - - if ((align + len) * sizeof (CHAR) >= page_size) - return; - - CHAR *buf = (CHAR *) (buf1); - - for (i = 0; i < len; ++i) - { - buf[align + i] = 1 + 23 * i % SMALL_CHAR; - if (buf[align + i] == seek_char) - buf[align + i] = seek_char + 1; - } - buf[align + len] = 0; - - if (pos < len) - { - buf[align + pos] = seek_char; - buf[align + len] = -seek_char; - result = (CHAR *) (buf + align + pos); - } - else - { - result = NULL; - buf[align + len] = seek_char; - } - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (CHAR *) (buf + align), seek_char, n, result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, len; - int seek_char; - CHAR *result; - UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - pos = random () & 511; - if (pos + align >= 512) - pos = 511 - align - (random () & 7); - len = random () & 511; - if (pos >= len) - len = pos + (random () & 7); - if (len + align >= 512) - len = 512 - align - (random () & 7); - seek_char = random () & BIG_CHAR; - j = len + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == pos + align) - p[i] = seek_char; - else - { - p[i] = random () & BIG_CHAR; - if (i < pos + align && p[i] == seek_char) - p[i] = seek_char + 13; - } - } - - if (pos < len) - { - size_t r = random (); - if ((r & 31) == 0) - len = ~(uintptr_t) (p + align) - ((r >> 5) & 31); - result = (CHAR *) (p + pos + align); - } - else - result = NULL; - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (CHAR *) (p + align), seek_char, len) != result) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd, %zd) %p != %p, p %p", - n, impl->name, align, seek_char, len, pos, - CALL (impl, (CHAR *) (p + align), seek_char, len), - result, p); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i, j; - - test_init (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - /* Test n == 0. */ - do_test (i, i, 0, 0, 23); - do_test (i, i, 0, 0, 0); - - do_test (0, 16 << i, 2048, 2048, 23); - do_test (i, 64, 256, 256, 23); - do_test (0, 16 << i, 2048, 2048, 0); - do_test (i, 64, 256, 256, 0); - - /* Check for large input sizes and for these cases we need to - make sure the byte is within the size range (that's why - 7 << i must be smaller than 2048). */ - do_test (0, 7 << i, 2048, SIZE_MAX, 23); - do_test (0, 2048 - i, 2048, SIZE_MAX, 23); - do_test (i, 64, 256, SIZE_MAX, 23); - do_test (0, 7 << i, 2048, SIZE_MAX, 0); - do_test (0, 2048 - i, 2048, SIZE_MAX, 0); - do_test (i, 64, 256, SIZE_MAX, 0); - } - - for (i = 1; i < 64; ++i) - { - for (j = 1; j < 64; j++) - { - do_test (0, 64 - j, 64, SIZE_MAX, 23); - do_test (i, 64 - j, 64, SIZE_MAX, 23); - } - } - - for (i = 1; i < 32; ++i) - { - do_test (0, i, i + 1, i + 1, 23); - do_test (0, i, i + 1, i + 1, 0); - } - - /* BZ#21182 - wrong overflow calculation for i686 implementation - with address near end of the page. */ - for (i = 2; i < 16; ++i) - /* page_size is in fact getpagesize() * 2. */ - do_test (page_size / 2 - i, i, i, 1, 0x9B); - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-memcmp.c b/string/test-memcmp.c deleted file mode 100644 index a7969edaea..0000000000 --- a/string/test-memcmp.c +++ /dev/null @@ -1,525 +0,0 @@ -/* Test and measure memcmp functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - Added wmemcmp support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifdef WIDE -# define TEST_NAME "wmemcmp" -#else -# define TEST_NAME "memcmp" -#endif -#include "test-string.h" -#ifdef WIDE -# include <inttypes.h> -# include <wchar.h> - -# define MEMCMP wmemcmp -# define MEMCPY wmemcpy -# define SIMPLE_MEMCMP simple_wmemcmp -# define CHAR wchar_t -# define UCHAR wchar_t -# define CHARBYTES 4 -# define CHAR__MIN WCHAR_MIN -# define CHAR__MAX WCHAR_MAX -int -simple_wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n) -{ - int ret = 0; - /* Warning! - wmemcmp has to use SIGNED comparison for elements. - memcmp has to use UNSIGNED comparison for elemnts. - */ - while (n-- && (ret = *s1 < *s2 ? -1 : *s1 == *s2 ? 0 : 1) == 0) {s1++; s2++;} - return ret; -} -#else -# include <limits.h> - -# define MEMCMP memcmp -# define MEMCPY memcpy -# define SIMPLE_MEMCMP simple_memcmp -# define CHAR char -# define MAX_CHAR 255 -# define UCHAR unsigned char -# define CHARBYTES 1 -# define CHAR__MIN CHAR_MIN -# define CHAR__MAX CHAR_MAX - -int -simple_memcmp (const char *s1, const char *s2, size_t n) -{ - int ret = 0; - - while (n-- && (ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0); - return ret; -} -#endif - -typedef int (*proto_t) (const CHAR *, const CHAR *, size_t); - -IMPL (SIMPLE_MEMCMP, 0) -IMPL (MEMCMP, 1) - -static int -check_result (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t len, - int exp_result) -{ - int result = CALL (impl, s1, s2, len); - if ((exp_result == 0 && result != 0) - || (exp_result < 0 && result >= 0) - || (exp_result > 0 && result <= 0)) - { - error (0, 0, "Wrong result in function %s %d %d", impl->name, - result, exp_result); - ret = 1; - return -1; - } - - return 0; -} - -static void -do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t len, - int exp_result) -{ - if (check_result (impl, s1, s2, len, exp_result) < 0) - return; -} - -static void -do_test (size_t align1, size_t align2, size_t len, int exp_result) -{ - size_t i; - CHAR *s1, *s2; - - if (len == 0) - return; - - align1 &= 63; - if (align1 + (len + 1) * CHARBYTES >= page_size) - return; - - align2 &= 63; - if (align2 + (len + 1) * CHARBYTES >= page_size) - return; - - s1 = (CHAR *) (buf1 + align1); - s2 = (CHAR *) (buf2 + align2); - - for (i = 0; i < len; i++) - s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % CHAR__MAX; - - s1[len] = align1; - s2[len] = align2; - s2[len - 1] -= exp_result; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, len, exp_result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, pos, len; - int result; - long r; - UCHAR *p1 = (UCHAR *) (buf1 + page_size - 512 * CHARBYTES); - UCHAR *p2 = (UCHAR *) (buf2 + page_size - 512 * CHARBYTES); - - for (n = 0; n < ITERATIONS; n++) - { - align1 = random () & 31; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - pos = random () & 511; - j = align1; - if (align2 > j) - j = align2; - if (pos + j >= 512) - pos = 511 - j - (random () & 7); - len = random () & 511; - if (len + j >= 512) - len = 511 - j - (random () & 7); - j = len + align1 + 64; - if (j > 512) j = 512; - for (i = 0; i < j; ++i) - p1[i] = random () & 255; - for (i = 0; i < j; ++i) - p2[i] = random () & 255; - - result = 0; - if (pos >= len) - MEMCPY ((CHAR *) p2 + align2, (const CHAR *) p1 + align1, len); - else - { - MEMCPY ((CHAR *) p2 + align2, (const CHAR *) p1 + align1, pos); - if (p2[align2 + pos] == p1[align1 + pos]) - { - p2[align2 + pos] = random () & 255; - if (p2[align2 + pos] == p1[align1 + pos]) - p2[align2 + pos] = p1[align1 + pos] + 3 + (random () & 127); - } - - if (p1[align1 + pos] < p2[align2 + pos]) - result = -1; - else - result = 1; - } - - FOR_EACH_IMPL (impl, 1) - { - r = CALL (impl, (CHAR *) p1 + align1, (const CHAR *) p2 + align2, - len); - if ((r == 0 && result) - || (r < 0 && result >= 0) - || (r > 0 && result <= 0)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd) %ld != %d, p1 %p p2 %p", - n, impl->name, align1 * CHARBYTES & 63, align2 * CHARBYTES & 63, len, pos, r, result, p1, p2); - ret = 1; - } - } - } -} - -static void -check1 (void) -{ - CHAR s1[116], s2[116]; - int n, exp_result; - - s1[0] = -108; - s2[0] = -108; - s1[1] = 99; - s2[1] = 99; - s1[2] = -113; - s2[2] = -113; - s1[3] = 1; - s2[3] = 1; - s1[4] = 116; - s2[4] = 116; - s1[5] = 99; - s2[5] = 99; - s1[6] = -113; - s2[6] = -113; - s1[7] = 1; - s2[7] = 1; - s1[8] = 84; - s2[8] = 84; - s1[9] = 99; - s2[9] = 99; - s1[10] = -113; - s2[10] = -113; - s1[11] = 1; - s2[11] = 1; - s1[12] = 52; - s2[12] = 52; - s1[13] = 99; - s2[13] = 99; - s1[14] = -113; - s2[14] = -113; - s1[15] = 1; - s2[15] = 1; - s1[16] = -76; - s2[16] = -76; - s1[17] = -14; - s2[17] = -14; - s1[18] = -109; - s2[18] = -109; - s1[19] = 1; - s2[19] = 1; - s1[20] = -108; - s2[20] = -108; - s1[21] = -14; - s2[21] = -14; - s1[22] = -109; - s2[22] = -109; - s1[23] = 1; - s2[23] = 1; - s1[24] = 84; - s2[24] = 84; - s1[25] = -15; - s2[25] = -15; - s1[26] = -109; - s2[26] = -109; - s1[27] = 1; - s2[27] = 1; - s1[28] = 52; - s2[28] = 52; - s1[29] = -15; - s2[29] = -15; - s1[30] = -109; - s2[30] = -109; - s1[31] = 1; - s2[31] = 1; - s1[32] = 20; - s2[32] = 20; - s1[33] = -15; - s2[33] = -15; - s1[34] = -109; - s2[34] = -109; - s1[35] = 1; - s2[35] = 1; - s1[36] = 20; - s2[36] = 20; - s1[37] = -14; - s2[37] = -14; - s1[38] = -109; - s2[38] = -109; - s1[39] = 1; - s2[39] = 1; - s1[40] = 52; - s2[40] = 52; - s1[41] = -14; - s2[41] = -14; - s1[42] = -109; - s2[42] = -109; - s1[43] = 1; - s2[43] = 1; - s1[44] = 84; - s2[44] = 84; - s1[45] = -14; - s2[45] = -14; - s1[46] = -109; - s2[46] = -109; - s1[47] = 1; - s2[47] = 1; - s1[48] = 116; - s2[48] = 116; - s1[49] = -14; - s2[49] = -14; - s1[50] = -109; - s2[50] = -109; - s1[51] = 1; - s2[51] = 1; - s1[52] = 116; - s2[52] = 116; - s1[53] = -15; - s2[53] = -15; - s1[54] = -109; - s2[54] = -109; - s1[55] = 1; - s2[55] = 1; - s1[56] = -44; - s2[56] = -44; - s1[57] = -14; - s2[57] = -14; - s1[58] = -109; - s2[58] = -109; - s1[59] = 1; - s2[59] = 1; - s1[60] = -108; - s2[60] = -108; - s1[61] = -15; - s2[61] = -15; - s1[62] = -109; - s2[62] = -109; - s1[63] = 1; - s2[63] = 1; - s1[64] = -76; - s2[64] = -76; - s1[65] = -15; - s2[65] = -15; - s1[66] = -109; - s2[66] = -109; - s1[67] = 1; - s2[67] = 1; - s1[68] = -44; - s2[68] = -44; - s1[69] = -15; - s2[69] = -15; - s1[70] = -109; - s2[70] = -109; - s1[71] = 1; - s2[71] = 1; - s1[72] = -12; - s2[72] = -12; - s1[73] = -15; - s2[73] = -15; - s1[74] = -109; - s2[74] = -109; - s1[75] = 1; - s2[75] = 1; - s1[76] = -12; - s2[76] = -12; - s1[77] = -14; - s2[77] = -14; - s1[78] = -109; - s2[78] = -109; - s1[79] = 1; - s2[79] = 1; - s1[80] = 20; - s2[80] = -68; - s1[81] = -12; - s2[81] = 64; - s1[82] = -109; - s2[82] = -106; - s1[83] = 1; - s2[83] = 1; - s1[84] = -12; - s2[84] = -12; - s1[85] = -13; - s2[85] = -13; - s1[86] = -109; - s2[86] = -109; - s1[87] = 1; - s2[87] = 1; - s1[88] = -44; - s2[88] = -44; - s1[89] = -13; - s2[89] = -13; - s1[90] = -109; - s2[90] = -109; - s1[91] = 1; - s2[91] = 1; - s1[92] = -76; - s2[92] = -76; - s1[93] = -13; - s2[93] = -13; - s1[94] = -109; - s2[94] = -109; - s1[95] = 1; - s2[95] = 1; - s1[96] = -108; - s2[96] = -108; - s1[97] = -13; - s2[97] = -13; - s1[98] = -109; - s2[98] = -109; - s1[99] = 1; - s2[99] = 1; - s1[100] = 116; - s2[100] = 116; - s1[101] = CHAR__MIN; - s2[101] = CHAR__MAX; - s1[102] = -109; - s2[102] = -109; - s1[103] = 1; - s2[103] = 1; - s1[104] = 84; - s2[104] = 84; - s1[105] = -13; - s2[105] = -13; - s1[106] = -109; - s2[106] = -109; - s1[107] = 1; - s2[107] = 1; - s1[108] = 52; - s2[108] = 52; - s1[109] = -13; - s2[109] = -13; - s1[110] = -109; - s2[110] = -109; - s1[111] = 1; - s2[111] = 1; - s1[112] = CHAR__MAX; - s2[112] = CHAR__MIN; - s1[113] = -13; - s2[113] = -13; - s1[114] = -109; - s2[114] = -109; - s1[115] = 1; - s2[115] = 1; - - n = 116; - for (size_t i = 0; i < n; i++) - { - exp_result = SIMPLE_MEMCMP (s1 + i, s2 + i, n - i); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1 + i, s2 + i, n - i, exp_result); - } -} - -/* This test checks that memcmp doesn't overrun buffers. */ -static void -check2 (void) -{ - size_t max_length = page_size / sizeof (CHAR); - - /* Initialize buf2 to the same values as buf1. The bug requires the - last compared byte to be different. */ - memcpy (buf2, buf1, page_size); - ((char *) buf2)[page_size - 1] ^= 0x11; - - for (size_t length = 1; length < max_length; length++) - { - CHAR *s1 = (CHAR *) buf1 + max_length - length; - CHAR *s2 = (CHAR *) buf2 + max_length - length; - - const int exp_result = SIMPLE_MEMCMP (s1, s2, length); - - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1, s2, length, exp_result); - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - check1 (); - check2 (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 16; ++i) - { - do_test (i * CHARBYTES, i * CHARBYTES, i, 0); - do_test (i * CHARBYTES, i * CHARBYTES, i, 1); - do_test (i * CHARBYTES, i * CHARBYTES, i, -1); - } - - for (i = 0; i < 16; ++i) - { - do_test (0, 0, i, 0); - do_test (0, 0, i, 1); - do_test (0, 0, i, -1); - } - - for (i = 1; i < 10; ++i) - { - do_test (0, 0, 2 << i, 0); - do_test (0, 0, 2 << i, 1); - do_test (0, 0, 2 << i, -1); - do_test (0, 0, 16 << i, 0); - do_test ((8 - i) * CHARBYTES, (2 * i) * CHARBYTES, 16 << i, 0); - do_test (0, 0, 16 << i, 1); - do_test (0, 0, 16 << i, -1); - } - - for (i = 1; i < 8; ++i) - { - do_test (i * CHARBYTES, 2 * (i * CHARBYTES), 8 << i, 0); - do_test (i * CHARBYTES, 2 * (i * CHARBYTES), 8 << i, 1); - do_test (i * CHARBYTES, 2 * (i * CHARBYTES), 8 << i, -1); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-memcpy.c b/string/test-memcpy.c deleted file mode 100644 index 49f0a76047..0000000000 --- a/string/test-memcpy.c +++ /dev/null @@ -1,259 +0,0 @@ -/* Test and measure memcpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef MEMCPY_RESULT -# define MEMCPY_RESULT(dst, len) dst -# define MIN_PAGE_SIZE 131072 -# define TEST_MAIN -# define TEST_NAME "memcpy" -# include "test-string.h" - -char *simple_memcpy (char *, const char *, size_t); -char *builtin_memcpy (char *, const char *, size_t); - -IMPL (simple_memcpy, 0) -IMPL (builtin_memcpy, 0) -IMPL (memcpy, 1) - -char * -simple_memcpy (char *dst, const char *src, size_t n) -{ - char *ret = dst; - while (n--) - *dst++ = *src++; - return ret; -} - -char * -builtin_memcpy (char *dst, const char *src, size_t n) -{ - return __builtin_memcpy (dst, src, n); -} -#endif - -typedef char *(*proto_t) (char *, const char *, size_t); - -static void -do_one_test (impl_t *impl, char *dst, const char *src, - size_t len) -{ - size_t i; - - /* Must clear the destination buffer set by the previous run. */ - for (i = 0; i < len; i++) - dst[i] = 0; - - if (CALL (impl, dst, src, len) != MEMCPY_RESULT (dst, len)) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - CALL (impl, dst, src, len), MEMCPY_RESULT (dst, len)); - ret = 1; - return; - } - - if (memcmp (dst, src, len) != 0) - { - error (0, 0, "Wrong result in function %s dst %p \"%.*s\" src %p \"%.*s\" len %zu", - impl->name, dst, (int) len, dst, src, (int) len, src, len); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, size_t len) -{ - size_t i, j; - char *s1, *s2; - - align1 &= 63; - if (align1 + len >= page_size) - return; - - align2 &= 63; - if (align2 + len >= page_size) - return; - - s1 = (char *) (buf1 + align1); - s2 = (char *) (buf2 + align2); - - for (i = 0, j = 1; i < len; i++, j += 23) - s1[i] = j; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s2, s1, len); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, len, size1, size2, size; - int c; - unsigned char *p1, *p2; - unsigned char *res; - - for (n = 0; n < ITERATIONS; n++) - { - if (n == 0) - { - len = getpagesize (); - size = len + 512; - size1 = size; - size2 = size; - align1 = 512; - align2 = 512; - } - else - { - if ((random () & 255) == 0) - size = 65536; - else - size = 768; - if (size > page_size) - size = page_size; - size1 = size; - size2 = size; - i = random (); - if (i & 3) - size -= 256; - if (i & 1) - size1 -= 256; - if (i & 2) - size2 -= 256; - if (i & 4) - { - len = random () % size; - align1 = size1 - len - (random () & 31); - align2 = size2 - len - (random () & 31); - if (align1 > size1) - align1 = 0; - if (align2 > size2) - align2 = 0; - } - else - { - align1 = random () & 63; - align2 = random () & 63; - len = random () % size; - if (align1 + len > size1) - align1 = size1 - len; - if (align2 + len > size2) - align2 = size2 - len; - } - } - p1 = buf1 + page_size - size1; - p2 = buf2 + page_size - size2; - c = random () & 255; - j = align1 + len + 256; - if (j > size1) - j = size1; - for (i = 0; i < j; ++i) - p1[i] = random () & 255; - - FOR_EACH_IMPL (impl, 1) - { - j = align2 + len + 256; - if (j > size2) - j = size2; - memset (p2, c, j); - res = (unsigned char *) CALL (impl, - (char *) (p2 + align2), - (char *) (p1 + align1), len); - if (res != MEMCPY_RESULT (p2 + align2, len)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p", - n, impl->name, align1, align2, len, res, - MEMCPY_RESULT (p2 + align2, len)); - ret = 1; - } - for (i = 0; i < align2; ++i) - { - if (p2[i] != c) - { - error (0, 0, "Iteration %zd - garbage before, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - for (i = align2 + len; i < j; ++i) - { - if (p2[i] != c) - { - error (0, 0, "Iteration %zd - garbage after, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - if (memcmp (p1 + align1, p2 + align2, len)) - { - error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - } - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < 18; ++i) - { - do_test (0, 0, 1 << i); - do_test (i, 0, 1 << i); - do_test (0, i, 1 << i); - do_test (i, i, 1 << i); - } - - for (i = 0; i < 32; ++i) - { - do_test (0, 0, i); - do_test (i, 0, i); - do_test (0, i, i); - do_test (i, i, i); - } - - for (i = 3; i < 32; ++i) - { - if ((i & (i - 1)) == 0) - continue; - do_test (0, 0, 16 * i); - do_test (i, 0, 16 * i); - do_test (0, i, 16 * i); - do_test (i, i, 16 * i); - } - - do_test (0, 0, getpagesize ()); - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-memmem.c b/string/test-memmem.c deleted file mode 100644 index 82fd93ccde..0000000000 --- a/string/test-memmem.c +++ /dev/null @@ -1,184 +0,0 @@ -/* Test and measure memmem functions. - Copyright (C) 2008-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@redhat.com>, 2008. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#define TEST_NAME "memmem" -#define BUF1PAGES 20 -#define ITERATIONS 500 -#include "test-string.h" - -typedef char *(*proto_t) (const void *, size_t, const void *, size_t); -void *simple_memmem (const void *, size_t, const void *, size_t); - -IMPL (simple_memmem, 0) -IMPL (memmem, 1) - -void * -simple_memmem (const void *haystack, size_t haystack_len, const void *needle, - size_t needle_len) -{ - const char *begin; - const char *const last_possible - = (const char *) haystack + haystack_len - needle_len; - - if (needle_len == 0) - /* The first occurrence of the empty string is deemed to occur at - the beginning of the string. */ - return (void *) haystack; - - /* Sanity check, otherwise the loop might search through the whole - memory. */ - if (__glibc_unlikely (haystack_len < needle_len)) - return NULL; - - for (begin = (const char *) haystack; begin <= last_possible; ++begin) - if (begin[0] == ((const char *) needle)[0] && - !memcmp ((const void *) &begin[1], - (const void *) ((const char *) needle + 1), - needle_len - 1)) - return (void *) begin; - - return NULL; -} - -static int -check_result (impl_t *impl, const void *haystack, size_t haystack_len, - const void *needle, size_t needle_len, const void *expected) -{ - void *res; - - res = CALL (impl, haystack, haystack_len, needle, needle_len); - if (res != expected) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - res, expected); - ret = 1; - return -1; - } - - return 0; -} - -static void -do_one_test (impl_t *impl, const void *haystack, size_t haystack_len, - const void *needle, size_t needle_len, const void *expected) -{ - if (check_result (impl, haystack, haystack_len, needle, needle_len, - expected) < 0) - return; -} - -static void -do_test (const char *str, size_t len, size_t idx) -{ - char tmpbuf[len]; - - memcpy (tmpbuf, buf1 + idx, len); - memcpy (buf1 + idx, str, len); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx); - - memcpy (buf1 + idx, tmpbuf, len); -} - -static void -do_random_tests (void) -{ - for (size_t n = 0; n < ITERATIONS; ++n) - { - char tmpbuf[32]; - - size_t shift = random () % 11; - size_t rel = random () % ((2 << (shift + 1)) * 64); - size_t idx = MIN ((2 << shift) * 64 + rel, BUF1PAGES * page_size - 2); - size_t len = random () % (sizeof (tmpbuf) - 1) + 1; - len = MIN (len, BUF1PAGES * page_size - idx - 1); - memcpy (tmpbuf, buf1 + idx, len); - for (size_t i = random () % len / 2 + 1; i > 0; --i) - { - size_t off = random () % len; - char ch = '0' + random () % 10; - - buf1[idx + off] = ch; - } - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len, - buf1 + idx); - - memcpy (buf1 + idx, tmpbuf, len); - } -} - -static void -check1 (void) -{ - - const char search_buf_data[5] = { 0x56, 0x34, 0x12, 0x78, 0x78 }; - const char pattern[2] = { 0x78, 0x56 }; - void *search_buf = (void *) buf1 + page_size - sizeof search_buf_data; - void *exp_result; - - memcpy (search_buf, search_buf_data, sizeof search_buf_data); - exp_result = simple_memmem (search_buf, sizeof search_buf_data, - pattern, sizeof pattern); - FOR_EACH_IMPL (impl, 0) - check_result (impl, search_buf, sizeof search_buf_data, - pattern, sizeof pattern, exp_result); -} - -static const char *const strs[] = - { - "00000", "00112233", "0123456789", "0000111100001111", - "00000111110000022222", "012345678901234567890", - "abc0", "aaaa0", "abcabc0" - }; - - -int -test_main (void) -{ - size_t i; - - test_init (); - - check1 (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < BUF1PAGES * page_size; ++i) - buf1[i] = 60 + random () % 32; - - for (i = 0; i < sizeof (strs) / sizeof (strs[0]); ++i) - for (size_t j = 0; j < 120; j += 7) - { - size_t len = strlen (strs[i]); - - do_test (strs[i], len, j); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-memmove.c b/string/test-memmove.c deleted file mode 100644 index 51f79f6eb4..0000000000 --- a/string/test-memmove.c +++ /dev/null @@ -1,290 +0,0 @@ -/* Test and measure memmove functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifdef TEST_BCOPY -# define TEST_NAME "bcopy" -#else -# define TEST_NAME "memmove" -#endif -#include "test-string.h" - -char *simple_memmove (char *, const char *, size_t); - -#ifdef TEST_BCOPY -typedef void (*proto_t) (const char *, char *, size_t); -void simple_bcopy (const char *, char *, size_t); - -IMPL (simple_bcopy, 0) -IMPL (bcopy, 1) - -void -simple_bcopy (const char *src, char *dst, size_t n) -{ - simple_memmove (dst, src, n); -} -#else -typedef char *(*proto_t) (char *, const char *, size_t); - -IMPL (simple_memmove, 0) -IMPL (memmove, 1) -#endif - -char * -inhibit_loop_to_libcall -simple_memmove (char *dst, const char *src, size_t n) -{ - char *ret = dst; - if (src < dst) - { - dst += n; - src += n; - while (n--) - *--dst = *--src; - } - else - while (n--) - *dst++ = *src++; - return ret; -} - -static void -do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src, - size_t len) -{ - /* This also clears the destination buffer set by the previous run. */ - memcpy (src, orig_src, len); -#ifdef TEST_BCOPY - CALL (impl, src, dst, len); -#else - char *res; - - res = CALL (impl, dst, src, len); - if (res != dst) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - res, dst); - ret = 1; - return; - } -#endif - - if (memcmp (dst, orig_src, len) != 0) - { - error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"", - impl->name, dst, src); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, size_t len) -{ - size_t i, j; - char *s1, *s2; - - align1 &= 63; - if (align1 + len >= page_size) - return; - - align2 &= 63; - if (align2 + len >= page_size) - return; - - s1 = (char *) (buf1 + align1); - s2 = (char *) (buf2 + align2); - - for (i = 0, j = 1; i < len; i++, j += 23) - s1[i] = j; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s2, (char *) (buf2 + align1), s1, len); -} - -static void -do_random_tests (void) -{ - size_t i, n, align1, align2, len, size; - size_t srcstart, srcend, dststart, dstend; - int c; - unsigned char *p1, *p2; -#ifndef TEST_BCOPY - unsigned char *res; -#endif - - for (n = 0; n < ITERATIONS; n++) - { - if ((random () & 255) == 0) - size = 65536; - else - size = 512; - if (size > page_size) - size = page_size; - if ((random () & 3) == 0) - { - len = random () & (size - 1); - align1 = size - len - (random () & 31); - align2 = size - len - (random () & 31); - if (align1 > size) - align1 = 0; - if (align2 > size) - align2 = 0; - } - else - { - align1 = random () & (size / 2 - 1); - align2 = random () & (size / 2 - 1); - len = random () & (size - 1); - if (align1 + len > size) - align1 = size - len; - if (align2 + len > size) - align2 = size - len; - } - - p1 = buf1 + page_size - size; - p2 = buf2 + page_size - size; - c = random () & 255; - srcend = align1 + len + 256; - if (srcend > size) - srcend = size; - if (align1 > 256) - srcstart = align1 - 256; - else - srcstart = 0; - for (i = srcstart; i < srcend; ++i) - p1[i] = random () & 255; - dstend = align2 + len + 256; - if (dstend > size) - dstend = size; - if (align2 > 256) - dststart = align2 - 256; - else - dststart = 0; - - FOR_EACH_IMPL (impl, 1) - { - memset (p2 + dststart, c, dstend - dststart); - memcpy (p2 + srcstart, p1 + srcstart, srcend - srcstart); -#ifdef TEST_BCOPY - CALL (impl, (char *) (p2 + align1), (char *) (p2 + align2), len); -#else - res = (unsigned char *) CALL (impl, - (char *) (p2 + align2), - (char *) (p2 + align1), len); - if (res != p2 + align2) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p", - n, impl->name, align1, align2, len, res, p2 + align2); - ret = 1; - } -#endif - if (memcmp (p1 + align1, p2 + align2, len)) - { - error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - } - for (i = dststart; i < dstend; ++i) - { - if (i >= align2 && i < align2 + len) - { - i = align2 + len - 1; - continue; - } - if (i >= srcstart && i < srcend) - { - i = srcend - 1; - continue; - } - if (p2[i] != c) - { - error (0, 0, "Iteration %zd - garbage in memset area, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - - if (srcstart < align2 - && memcmp (p2 + srcstart, p1 + srcstart, - (srcend > align2 ? align2 : srcend) - srcstart)) - { - error (0, 0, "Iteration %zd - garbage before dst, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - - i = srcstart > align2 + len ? srcstart : align2 + len; - if (srcend > align2 + len - && memcmp (p2 + i, p1 + i, srcend - i)) - { - error (0, 0, "Iteration %zd - garbage after dst, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < 14; ++i) - { - do_test (0, 32, 1 << i); - do_test (32, 0, 1 << i); - do_test (0, i, 1 << i); - do_test (i, 0, 1 << i); - } - - for (i = 0; i < 32; ++i) - { - do_test (0, 32, i); - do_test (32, 0, i); - do_test (0, i, i); - do_test (i, 0, i); - } - - for (i = 3; i < 32; ++i) - { - if ((i & (i - 1)) == 0) - continue; - do_test (0, 32, 16 * i); - do_test (32, 0, 16 * i); - do_test (0, i, 16 * i); - do_test (i, 0, 16 * i); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-mempcpy.c b/string/test-mempcpy.c deleted file mode 100644 index 364a811c62..0000000000 --- a/string/test-mempcpy.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Test and measure mempcpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define MEMCPY_RESULT(dst, len) (dst) + (len) -#define TEST_MAIN -#define TEST_NAME "mempcpy" -#include "test-string.h" - -char *simple_mempcpy (char *, const char *, size_t); - -IMPL (simple_mempcpy, 0) -IMPL (mempcpy, 1) - -char * -simple_mempcpy (char *dst, const char *src, size_t n) -{ - while (n--) - *dst++ = *src++; - return dst; -} - -#include "test-memcpy.c" diff --git a/string/test-memrchr.c b/string/test-memrchr.c deleted file mode 100644 index 15483f5cb5..0000000000 --- a/string/test-memrchr.c +++ /dev/null @@ -1,186 +0,0 @@ -/* Test and measure memrchr functions. - Copyright (C) 2013-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#define TEST_NAME "memrchr" -#include "test-string.h" - -typedef char *(*proto_t) (const char *, int, size_t); -char *simple_memrchr (const char *, int, size_t); - -IMPL (simple_memrchr, 0) -IMPL (memrchr, 1) - -char * -simple_memrchr (const char *s, int c, size_t n) -{ - s = s + n; - while (n--) - if (*--s == (char) c) - return (char *) s; - return NULL; -} - -static void -do_one_test (impl_t *impl, const char *s, int c, size_t n, char *exp_res) -{ - char *res = CALL (impl, s, c, n); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - res, exp_res); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t pos, size_t len, int seek_char) -{ - size_t i; - char *result; - - align &= 7; - if (align + len >= page_size) - return; - - for (i = 0; i < len; ++i) - { - buf1[align + i] = 1 + 23 * i % 127; - if (buf1[align + i] == seek_char) - buf1[align + i] = seek_char + 1; - } - buf1[align + len] = 0; - - if (pos < len) - { - buf1[align + pos] = seek_char; - buf1[align + len] = -seek_char; - result = (char *) (buf1 + align + pos); - } - else - { - result = NULL; - buf1[align + len] = seek_char; - } - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (char *) (buf1 + align), seek_char, len, result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, len; - int seek_char; - char *result; - unsigned char *p = buf1 + page_size - 512; - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - pos = random () & 511; - if (pos + align >= 512) - pos = 511 - align - (random () & 7); - len = random () & 511; - if (pos >= len) - len = pos + (random () & 7); - if (len + align >= 512) - len = 512 - align - (random () & 7); - seek_char = random () & 255; - j = len + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == pos + align) - p[i] = seek_char; - else - { - p[i] = random () & 255; - if (p[i] == seek_char) - p[i] = seek_char + 13; - } - } - - if (pos < len) - result = (char *) (p + pos + align); - else - result = NULL; - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (char *) (p + align), seek_char, len) != result) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd, %zd) %p != %p, p %p", - n, impl->name, align, seek_char, len, pos, - CALL (impl, (char *) (p + align), seek_char, len), - result, p); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - /* Test len == 0. */ - do_test (i, i, 0, 0); - do_test (i, i, 0, 23); - - do_test (0, 16 << i, 2048, 23); - do_test (i, 64, 256, 23); - do_test (0, 16 << i, 2048, 0); - do_test (i, 64, 256, 0); - - do_test (0, i, 256, 23); - do_test (0, i, 256, 0); - do_test (i, i, 256, 23); - do_test (i, i, 256, 0); - - } - for (i = 1; i < 32; ++i) - { - do_test (0, i, i + 1, 23); - do_test (0, i, i + 1, 0); - do_test (i, i, i + 1, 23); - do_test (i, i, i + 1, 0); - - do_test (0, 1, i + 1, 23); - do_test (0, 2, i + 1, 0); - do_test (i, 1, i + 1, 23); - do_test (i, 2, i + 1, 0); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-memset.c b/string/test-memset.c deleted file mode 100644 index ca1bfe1e3b..0000000000 --- a/string/test-memset.c +++ /dev/null @@ -1,267 +0,0 @@ -/* Test memset functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifdef TEST_BZERO -# ifdef TEST_EXPLICIT_BZERO -# define TEST_NAME "explicit_bzero" -# else -# define TEST_NAME "bzero" -# endif -#else -# ifndef WIDE -# define TEST_NAME "memset" -# else -# define TEST_NAME "wmemset" -# endif /* WIDE */ -#endif /* !TEST_BZERO */ -#define MIN_PAGE_SIZE 131072 -#include "test-string.h" - -#ifndef WIDE -# define MEMSET memset -# define CHAR char -# define UCHAR unsigned char -# define SIMPLE_MEMSET simple_memset -# define MEMCMP memcmp -# define BIG_CHAR CHAR_MAX -#else -# include <wchar.h> -# define MEMSET wmemset -# define CHAR wchar_t -# define UCHAR wchar_t -# define SIMPLE_MEMSET simple_wmemset -# define MEMCMP wmemcmp -# define BIG_CHAR WCHAR_MAX -#endif /* WIDE */ - -CHAR *SIMPLE_MEMSET (CHAR *, int, size_t); - -#ifdef TEST_BZERO -typedef void (*proto_t) (char *, size_t); -void simple_bzero (char *, size_t); -void builtin_bzero (char *, size_t); - -IMPL (simple_bzero, 0) -IMPL (builtin_bzero, 0) -#ifdef TEST_EXPLICIT_BZERO -IMPL (explicit_bzero, 1) -#else -IMPL (bzero, 1) -#endif - -void -simple_bzero (char *s, size_t n) -{ - SIMPLE_MEMSET (s, 0, n); -} - -void -builtin_bzero (char *s, size_t n) -{ - __builtin_bzero (s, n); -} -#else -typedef CHAR *(*proto_t) (CHAR *, int, size_t); - -IMPL (SIMPLE_MEMSET, 0) -# ifndef WIDE -char *builtin_memset (char *, int, size_t); -IMPL (builtin_memset, 0) -# endif /* !WIDE */ -IMPL (MEMSET, 1) - -# ifndef WIDE -char * -builtin_memset (char *s, int c, size_t n) -{ - return __builtin_memset (s, c, n); -} -# endif /* !WIDE */ -#endif /* !TEST_BZERO */ - -CHAR * -inhibit_loop_to_libcall -SIMPLE_MEMSET (CHAR *s, int c, size_t n) -{ - CHAR *r = s, *end = s + n; - while (r < end) - *r++ = c; - return s; -} - -static void -do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n) -{ - CHAR tstbuf[n]; -#ifdef TEST_BZERO - simple_bzero (tstbuf, n); - CALL (impl, s, n); - if (memcmp (s, tstbuf, n) != 0) -#else - CHAR *res = CALL (impl, s, c, n); - if (res != s - || SIMPLE_MEMSET (tstbuf, c, n) != tstbuf - || MEMCMP (s, tstbuf, n) != 0) -#endif /* !TEST_BZERO */ - { - error (0, 0, "Wrong result in function %s", impl->name); - ret = 1; - return; - } -} - -static void -do_test (size_t align, int c, size_t len) -{ - align &= 7; - if ((align + len) * sizeof (CHAR) > page_size) - return; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (CHAR *) (buf1) + align, c, len); -} - -#ifndef TEST_BZERO -static void -do_random_tests (void) -{ - size_t i, j, k, n, align, len, size; - int c, o; - UCHAR *p, *res; - UCHAR *p2 = (UCHAR *) buf2; - - for (i = 0; i < 65536 / sizeof (CHAR); ++i) - p2[i] = random () & BIG_CHAR; - - for (n = 0; n < ITERATIONS; n++) - { - if ((random () & 31) == 0) - size = 65536 / sizeof (CHAR); - else - size = 512; - p = (UCHAR *) (buf1 + page_size) - size; - len = random () & (size - 1); - align = size - len - (random () & 31); - if (align > size) - align = size - len; - if ((random () & 7) == 0) - align &= ~63; - if ((random () & 7) == 0) - c = 0; - else - c = random () & BIG_CHAR; - o = random () & BIG_CHAR; - if (o == c) - o = (c + 1) & BIG_CHAR; - j = len + align + 128; - if (j > size) - j = size; - if (align >= 128) - k = align - 128; - else - k = 0; - for (i = k; i < align; ++i) - p[i] = o; - for (i = align + len; i < j; ++i) - p[i] = o; - - FOR_EACH_IMPL (impl, 1) - { - for (i = 0; i < len; ++i) - { - p[i + align] = p2[i]; - if (p[i + align] == c) - p[i + align] = o; - } - res = (UCHAR *) CALL (impl, (CHAR *) p + align, c, len); - if (res != p + align) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd) %p != %p", - n, impl->name, align, c, len, res, p + align); - ret = 1; - } - for (i = k; i < align; ++i) - if (p[i] != o) - { - error (0, 0, "Iteration %zd - garbage before %s (%zd, %d, %zd)", - n, impl->name, align, c, len); - ret = 1; - break; - } - for (; i < align + len; ++i) - if (p[i] != c) - { - error (0, 0, "Iteration %zd - not cleared correctly %s (%zd, %d, %zd)", - n, impl->name, align, c, len); - ret = 1; - break; - } - for (; i < j; ++i) - if (p[i] != o) - { - error (0, 0, "Iteration %zd - garbage after %s (%zd, %d, %zd)", - n, impl->name, align, c, len); - ret = 1; - break; - } - } - } -} -#endif /* !TEST_BZERO */ - -int -test_main (void) -{ - size_t i; - int c = 0; - - test_init (); - - printf ("%24s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - -#ifndef TEST_BZERO - for (c = -65; c <= 130; c += 65) -#endif - { - for (i = 0; i < 18; ++i) - do_test (0, c, 1 << i); - for (i = 1; i < 32; ++i) - { - do_test (i, c, i); - if (i & (i - 1)) - do_test (0, c, i); - } - do_test (1, c, 14); - do_test (3, c, 1024); - do_test (4, c, 64); - do_test (2, c, 25); - } - -#ifndef TEST_BZERO - do_random_tests (); -#endif - - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-rawmemchr.c b/string/test-rawmemchr.c deleted file mode 100644 index 2a53e71026..0000000000 --- a/string/test-rawmemchr.c +++ /dev/null @@ -1,165 +0,0 @@ -/* Test and measure memchr functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> - -#define TEST_MAIN -#define TEST_NAME "rawmemchr" -#include "test-string.h" - -typedef char *(*proto_t) (const char *, int); -char *simple_rawmemchr (const char *, int); - -IMPL (simple_rawmemchr, 0) -IMPL (rawmemchr, 1) - -char * -simple_rawmemchr (const char *s, int c) -{ - while (1) - if (*s++ == (char) c) - return (char *) s - 1; - return NULL; -} - -static void -do_one_test (impl_t *impl, const char *s, int c, char *exp_res) -{ - char *res = CALL (impl, s, c); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - res, exp_res); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t pos, size_t len, int seek_char) -{ - size_t i; - char *result; - - align &= 7; - if (align + len >= page_size) - return; - - for (i = 0; i < len; ++i) - { - buf1[align + i] = 1 + 23 * i % 127; - if (buf1[align + i] == seek_char) - buf1[align + i] = seek_char + 1; - } - buf1[align + len] = 0; - - assert (pos < len); - - buf1[align + pos] = seek_char; - buf1[align + len] = -seek_char; - result = (char *) (buf1 + align + pos); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (char *) (buf1 + align), seek_char, result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, len; - int seek_char; - char *result; - unsigned char *p = buf1 + page_size - 512; - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - pos = random () & 511; - if (pos + align >= 512) - pos = 511 - align - (random () & 7); - len = random () & 511; - if (len + align >= 512) - len = 512 - align - (random () & 7); - if (pos >= len) - continue; - seek_char = random () & 255; - j = len + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == pos + align) - p[i] = seek_char; - else - { - p[i] = random () & 255; - if (i < pos + align && p[i] == seek_char) - p[i] = seek_char + 13; - } - } - - assert (pos < len); - size_t r = random (); - if ((r & 31) == 0) - len = ~(uintptr_t) (p + align) - ((r >> 5) & 31); - result = (char *) (p + pos + align); - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (char *) (p + align), seek_char) != result) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd, %zd) %p != %p, p %p", - n, impl->name, align, seek_char, len, pos, - CALL (impl, (char *) (p + align), seek_char), - result, p); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 7; ++i) - { - do_test (0, 16 << i, 2048, 23); - do_test (i, 64, 256, 23); - do_test (0, 16 << i, 2048, 0); - do_test (i, 64, 256, 0); - } - for (i = 1; i < 32; ++i) - { - do_test (0, i, i + 1, 23); - do_test (0, i, i + 1, 0); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-stpcpy.c b/string/test-stpcpy.c deleted file mode 100644 index 5e31abf962..0000000000 --- a/string/test-stpcpy.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Test stpcpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define STRCPY_RESULT(dst, len) ((dst) + (len)) -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "stpcpy" -#else -# define TEST_NAME "wcpcpy" -#endif /* !WIDE */ -#include "test-string.h" -#ifndef WIDE -# define CHAR char -# define SIMPLE_STPCPY simple_stpcpy -# define STPCPY stpcpy -#else -# include <wchar.h> -# define CHAR wchar_t -# define SIMPLE_STPCPY simple_wcpcpy -# define STPCPY wcpcpy -#endif /* !WIDE */ - -CHAR *SIMPLE_STPCPY (CHAR *, const CHAR *); - -IMPL (SIMPLE_STPCPY, 0) -IMPL (STPCPY, 1) - -CHAR * -SIMPLE_STPCPY (CHAR *dst, const CHAR *src) -{ - while ((*dst++ = *src++) != '\0'); - return dst - 1; -} - -#undef CHAR -#include "test-strcpy.c" diff --git a/string/test-stpncpy.c b/string/test-stpncpy.c deleted file mode 100644 index 5b26ae5e4f..0000000000 --- a/string/test-stpncpy.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Test and measure stpncpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define STRNCPY_RESULT(dst, len, n) ((dst) + ((len) > (n) ? (n) : (len))) -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "stpncpy" -#else -# define TEST_NAME "wcpncpy" -#endif /* WIDE */ -#include "test-string.h" -#ifndef WIDE -# define CHAR char -# define SIMPLE_STPNCPY simple_stpncpy -# define STUPID_STPNCPY stupid_stpncpy -# define STPNCPY stpncpy -# define STRNLEN strnlen -#else -# include <wchar.h> -# define CHAR wchar_t -# define SIMPLE_STPNCPY simple_wcpncpy -# define STUPID_STPNCPY stupid_wcpncpy -# define STPNCPY wcpncpy -# define STRNLEN wcsnlen -#endif /* WIDE */ - -CHAR *SIMPLE_STPNCPY (CHAR *, const CHAR *, size_t); -CHAR *STUPID_STPNCPY (CHAR *, const CHAR *, size_t); - -IMPL (STUPID_STPNCPY, 0) -IMPL (SIMPLE_STPNCPY, 0) -IMPL (STPNCPY, 1) - -CHAR * -SIMPLE_STPNCPY (CHAR *dst, const CHAR *src, size_t n) -{ - while (n--) - if ((*dst++ = *src++) == '\0') - { - size_t i; - - for (i = 0; i < n; ++i) - dst[i] = '\0'; - return dst - 1; - } - return dst; -} - -CHAR * -STUPID_STPNCPY (CHAR *dst, const CHAR *src, size_t n) -{ - size_t nc = STRNLEN (src, n); - size_t i; - - for (i = 0; i < nc; ++i) - dst[i] = src[i]; - for (; i < n; ++i) - dst[i] = '\0'; - return dst + nc; -} - -#undef CHAR -#include "test-strncpy.c" diff --git a/string/test-strcasecmp.c b/string/test-strcasecmp.c deleted file mode 100644 index 9c333f0072..0000000000 --- a/string/test-strcasecmp.c +++ /dev/null @@ -1,270 +0,0 @@ -/* Test and measure strcasecmp functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <locale.h> -#include <ctype.h> -#define TEST_MAIN -#define TEST_NAME "strcasecmp" -#include "test-string.h" - -typedef int (*proto_t) (const char *, const char *); -static int simple_strcasecmp (const char *, const char *); -static int stupid_strcasecmp (const char *, const char *); - -IMPL (stupid_strcasecmp, 0) -IMPL (simple_strcasecmp, 0) -IMPL (strcasecmp, 1) - -static int -simple_strcasecmp (const char *s1, const char *s2) -{ - int ret; - - while ((ret = ((unsigned char) tolower (*s1) - - (unsigned char) tolower (*s2))) == 0 - && *s1++) - ++s2; - return ret; -} - -static int -stupid_strcasecmp (const char *s1, const char *s2) -{ - size_t ns1 = strlen (s1) + 1, ns2 = strlen (s2) + 1; - size_t n = ns1 < ns2 ? ns1 : ns2; - int ret = 0; - - while (n--) - { - if ((ret = ((unsigned char) tolower (*s1) - - (unsigned char) tolower (*s2))) != 0) - break; - ++s1; - ++s2; - } - return ret; -} - -static void -do_one_test (impl_t *impl, const char *s1, const char *s2, int exp_result) -{ - int result = CALL (impl, s1, s2); - if ((exp_result == 0 && result != 0) - || (exp_result < 0 && result >= 0) - || (exp_result > 0 && result <= 0)) - { - error (0, 0, "Wrong result in function %s %d %d", impl->name, - result, exp_result); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, size_t len, int max_char, - int exp_result) -{ - size_t i; - char *s1, *s2; - - if (len == 0) - return; - - align1 &= 7; - if (align1 + len + 1 >= page_size) - return; - - align2 &= 7; - if (align2 + len + 1 >= page_size) - return; - - s1 = (char *) (buf1 + align1); - s2 = (char *) (buf2 + align2); - - for (i = 0; i < len; i++) - { - s1[i] = toupper (1 + 23 * i % max_char); - s2[i] = tolower (s1[i]); - } - - s1[len] = s2[len] = 0; - s1[len + 1] = 23; - s2[len + 1] = 24 + exp_result; - if ((s2[len - 1] == 'z' && exp_result == -1) - || (s2[len - 1] == 'a' && exp_result == 1)) - s1[len - 1] += exp_result; - else - s2[len - 1] -= exp_result; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, exp_result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, pos, len1, len2; - int result; - long r; - unsigned char *p1 = buf1 + page_size - 512; - unsigned char *p2 = buf2 + page_size - 512; - - for (n = 0; n < ITERATIONS; n++) - { - align1 = random () & 31; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - pos = random () & 511; - j = align1 > align2 ? align1 : align2; - if (pos + j >= 511) - pos = 510 - j - (random () & 7); - len1 = random () & 511; - if (pos >= len1 && (random () & 1)) - len1 = pos + (random () & 7); - if (len1 + j >= 512) - len1 = 511 - j - (random () & 7); - if (pos >= len1) - len2 = len1; - else - len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); - j = (pos > len2 ? pos : len2) + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; ++i) - { - p1[i] = tolower (random () & 255); - if (i < len1 + align1 && !p1[i]) - { - p1[i] = tolower (random () & 255); - if (!p1[i]) - p1[i] = tolower (1 + (random () & 127)); - } - } - for (i = 0; i < j; ++i) - { - p2[i] = toupper (random () & 255); - if (i < len2 + align2 && !p2[i]) - { - p2[i] = toupper (random () & 255); - if (!p2[i]) - toupper (p2[i] = 1 + (random () & 127)); - } - } - - result = 0; - memcpy (p2 + align2, p1 + align1, pos); - if (pos < len1) - { - if (tolower (p2[align2 + pos]) == p1[align1 + pos]) - { - p2[align2 + pos] = toupper (random () & 255); - if (tolower (p2[align2 + pos]) == p1[align1 + pos]) - p2[align2 + pos] = toupper (p1[align1 + pos] - + 3 + (random () & 127)); - } - - if (p1[align1 + pos] < tolower (p2[align2 + pos])) - result = -1; - else - result = 1; - } - p1[len1 + align1] = 0; - p2[len2 + align2] = 0; - - FOR_EACH_IMPL (impl, 1) - { - r = CALL (impl, (char *) (p1 + align1), (char *) (p2 + align2)); - /* Test whether on 64-bit architectures where ABI requires - callee to promote has the promotion been done. */ - asm ("" : "=g" (r) : "0" (r)); - if ((r == 0 && result) - || (r < 0 && result >= 0) - || (r > 0 && result <= 0)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd, %zd) %ld != %d, p1 %p p2 %p", - n, impl->name, align1, align2, len1, len2, pos, r, result, p1, p2); - ret = 1; - } - } - } -} - -static void -test_locale (const char *locale) -{ - size_t i; - - if (setlocale (LC_CTYPE, locale) == NULL) - { - error (0, 0, "cannot set locale \"%s\"", locale); - ret = 1; - } - - printf ("%-23s", locale); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 16; ++i) - { - do_test (i, i, i, 127, 0); - do_test (i, i, i, 127, 1); - do_test (i, i, i, 127, -1); - } - - for (i = 1; i < 10; ++i) - { - do_test (0, 0, 2 << i, 127, 0); - do_test (0, 0, 2 << i, 254, 0); - do_test (0, 0, 2 << i, 127, 1); - do_test (0, 0, 2 << i, 254, 1); - do_test (0, 0, 2 << i, 127, -1); - do_test (0, 0, 2 << i, 254, -1); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 2 * i, 8 << i, 127, 0); - do_test (2 * i, i, 8 << i, 254, 0); - do_test (i, 2 * i, 8 << i, 127, 1); - do_test (2 * i, i, 8 << i, 254, 1); - do_test (i, 2 * i, 8 << i, 127, -1); - do_test (2 * i, i, 8 << i, 254, -1); - } - - do_random_tests (); -} - -int -test_main (void) -{ - test_init (); - - test_locale ("C"); - test_locale ("en_US.ISO-8859-1"); - test_locale ("en_US.UTF-8"); - test_locale ("tr_TR.ISO-8859-9"); - test_locale ("tr_TR.UTF-8"); - - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strcasestr.c b/string/test-strcasestr.c deleted file mode 100644 index abb3916732..0000000000 --- a/string/test-strcasestr.c +++ /dev/null @@ -1,194 +0,0 @@ -/* Test and measure strcasestr functions. - Copyright (C) 2010-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@redhat.com>, 2010. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#define TEST_NAME "strcasestr" -#include "test-string.h" - - -#define STRCASESTR simple_strcasestr -#define NO_ALIAS -#define __strncasecmp strncasecmp -#include "strcasestr.c" - - -static char * -stupid_strcasestr (const char *s1, const char *s2) -{ - ssize_t s1len = strlen (s1); - ssize_t s2len = strlen (s2); - - if (s2len > s1len) - return NULL; - - for (ssize_t i = 0; i <= s1len - s2len; ++i) - { - size_t j; - for (j = 0; j < s2len; ++j) - if (tolower (s1[i + j]) != tolower (s2[j])) - break; - if (j == s2len) - return (char *) s1 + i; - } - - return NULL; -} - - -typedef char *(*proto_t) (const char *, const char *); - -IMPL (stupid_strcasestr, 0) -IMPL (simple_strcasestr, 0) -IMPL (strcasestr, 1) - - -static int -check_result (impl_t *impl, const char *s1, const char *s2, - char *exp_result) -{ - char *result = CALL (impl, s1, s2); - if (result != exp_result) - { - error (0, 0, "Wrong result in function %s %s %s", impl->name, - result, exp_result); - ret = 1; - return -1; - } - return 0; -} - -static void -do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) -{ - if (check_result (impl, s1, s2, exp_result) < 0) - return; -} - - -static void -do_test (size_t align1, size_t align2, size_t len1, size_t len2, - int fail) -{ - char *s1 = (char *) (buf1 + align1); - char *s2 = (char *) (buf2 + align2); - - static const char d[] = "1234567890abcxyz"; -#define dl (sizeof (d) - 1) - char *ss2 = s2; - for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) - { - size_t t = l > dl ? dl : l; - ss2 = mempcpy (ss2, d, t); - } - s2[len2] = '\0'; - - if (fail) - { - char *ss1 = s1; - for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) - { - size_t t = l > dl ? dl : l; - memcpy (ss1, d, t); - ++ss1[len2 > 7 ? 7 : len2 - 1]; - ss1 += t; - } - } - else - { - memset (s1, '0', len1); - for (size_t i = 0; i < len2; ++i) - s1[len1 - len2 + i] = toupper (s2[i]); - } - s1[len1] = '\0'; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); -} - -static void -check1 (void) -{ - const char s1[] = "AOKB"; - const char s2[] = "OK"; - char *exp_result; - - exp_result = stupid_strcasestr (s1, s2); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1, s2, exp_result); -} - -static int -test_main (void) -{ - test_init (); - - check1 (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (size_t klen = 2; klen < 32; ++klen) - for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) - { - do_test (0, 0, hlen, klen, 0); - do_test (0, 0, hlen, klen, 1); - do_test (0, 3, hlen, klen, 0); - do_test (0, 3, hlen, klen, 1); - do_test (0, 9, hlen, klen, 0); - do_test (0, 9, hlen, klen, 1); - do_test (0, 15, hlen, klen, 0); - do_test (0, 15, hlen, klen, 1); - - do_test (3, 0, hlen, klen, 0); - do_test (3, 0, hlen, klen, 1); - do_test (3, 3, hlen, klen, 0); - do_test (3, 3, hlen, klen, 1); - do_test (3, 9, hlen, klen, 0); - do_test (3, 9, hlen, klen, 1); - do_test (3, 15, hlen, klen, 0); - do_test (3, 15, hlen, klen, 1); - - do_test (9, 0, hlen, klen, 0); - do_test (9, 0, hlen, klen, 1); - do_test (9, 3, hlen, klen, 0); - do_test (9, 3, hlen, klen, 1); - do_test (9, 9, hlen, klen, 0); - do_test (9, 9, hlen, klen, 1); - do_test (9, 15, hlen, klen, 0); - do_test (9, 15, hlen, klen, 1); - - do_test (15, 0, hlen, klen, 0); - do_test (15, 0, hlen, klen, 1); - do_test (15, 3, hlen, klen, 0); - do_test (15, 3, hlen, klen, 1); - do_test (15, 9, hlen, klen, 0); - do_test (15, 9, hlen, klen, 1); - do_test (15, 15, hlen, klen, 0); - do_test (15, 15, hlen, klen, 1); - } - - do_test (0, 0, page_size - 1, 16, 0); - do_test (0, 0, page_size - 1, 16, 1); - - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strcat.c b/string/test-strcat.c deleted file mode 100644 index 01d180eb50..0000000000 --- a/string/test-strcat.c +++ /dev/null @@ -1,272 +0,0 @@ -/* Test strcat functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "strcat" -#else -# define TEST_NAME "wcscat" -#endif /* WIDE */ -#include "test-string.h" - -#ifndef WIDE -# define STRCAT strcat -# define CHAR char -# define UCHAR unsigned char -# define sfmt "s" -# define SIMPLE_STRCAT simple_strcat -# define STRLEN strlen -# define STRCMP strcmp -# define MEMSET memset -# define MEMCPY memcpy -# define MEMCMP memcmp -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -#else -# include <wchar.h> -# define STRCAT wcscat -# define CHAR wchar_t -# define UCHAR wchar_t -# define sfmt "ls" -# define SIMPLE_STRCAT simple_wcscat -# define STRLEN wcslen -# define STRCMP wcscmp -# define MEMSET wmemset -# define MEMCPY wmemcpy -# define MEMCMP wmemcmp -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -#endif /* WIDE */ - -typedef CHAR *(*proto_t) (CHAR *, const CHAR *); -CHAR *SIMPLE_STRCAT (CHAR *, const CHAR *); - -IMPL (SIMPLE_STRCAT, 0) -IMPL (STRCAT, 1) - -CHAR * -SIMPLE_STRCAT (CHAR *dst, const CHAR *src) -{ - CHAR *ret = dst; - while (*dst++ != '\0'); - --dst; - while ((*dst++ = *src++) != '\0'); - return ret; -} - -static void -do_one_test (impl_t *impl, CHAR *dst, const CHAR *src) -{ - size_t k = STRLEN (dst); - if (CALL (impl, dst, src) != dst) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - CALL (impl, dst, src), dst); - ret = 1; - return; - } - - if (STRCMP (dst + k, src) != 0) - { - error (0, 0, "Wrong result in function %s dst \"%" sfmt "\" src \"%" sfmt "\"", - impl->name, dst, src); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, size_t len1, size_t len2, int max_char) -{ - size_t i; - CHAR *s1, *s2; - - align1 &= 7; - if ((align1 + len1) * sizeof (CHAR) >= page_size) - return; - - align2 &= 7; - if ((align2 + len1 + len2) * sizeof (CHAR) >= page_size) - return; - - s1 = (CHAR *) (buf1) + align1; - s2 = (CHAR *) (buf2) + align2; - - for (i = 0; i < len1; ++i) - s1[i] = 32 + 23 * i % (max_char - 32); - s1[len1] = '\0'; - - for (i = 0; i < len2; i++) - s2[i] = 32 + 23 * i % (max_char - 32); - - FOR_EACH_IMPL (impl, 0) - { - s2[len2] = '\0'; - do_one_test (impl, s2, s1); - } -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, len1, len2; - UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; - UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; - UCHAR *p3 = (UCHAR *) buf1; - UCHAR *res; - - for (n = 0; n < ITERATIONS; n++) - { - align1 = random () & 31; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - len1 = random () & 511; - if (len1 + align2 > 512) - len2 = random () & 7; - else - len2 = (512 - len1 - align2) * (random () & (1024 * 1024 - 1)) - / (1024 * 1024); - j = align1; - if (align2 + len2 > j) - j = align2 + len2; - if (len1 + j >= 511) - len1 = 510 - j - (random () & 7); - if (len1 >= 512) - len1 = 0; - if (align1 + len1 < 512 - 8) - { - j = 510 - align1 - len1 - (random () & 31); - if (j > 0 && j < 512) - align1 += j; - } - j = len1 + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; i++) - { - if (i == len1 + align1) - p1[i] = 0; - else - { - p1[i] = random () & BIG_CHAR; - if (i >= align1 && i < len1 + align1 && !p1[i]) - p1[i] = (random () & SMALL_CHAR) + 3; - } - } - for (i = 0; i < len2; i++) - { - p3[i] = random () & BIG_CHAR; - if (!p3[i]) - p3[i] = (random () & SMALL_CHAR) + 3; - } - p3[len2] = 0; - - FOR_EACH_IMPL (impl, 1) - { - MEMSET (p2 - 64, '\1', align2 + 64); - MEMSET (p2 + align2 + len2 + 1, '\1', 512 - align2 - len2 - 1); - MEMCPY (p2 + align2, p3, len2 + 1); - res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), - (CHAR *) (p1 + align1)); - if (res != p2 + align2) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd %zd) %p != %p", - n, impl->name, align1, align2, len1, len2, res, - p2 + align2); - ret = 1; - } - for (j = 0; j < align2 + 64; ++j) - { - if (p2[j - 64] != '\1') - { - error (0, 0, "Iteration %zd - garbage before, %s (%zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2); - ret = 1; - break; - } - } - if (MEMCMP (p2 + align2, p3, len2)) - { - error (0, 0, "Iteration %zd - garbage in string before, %s (%zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2); - ret = 1; - } - for (j = align2 + len1 + len2 + 1; j < 512; ++j) - { - if (p2[j] != '\1') - { - error (0, 0, "Iteration %zd - garbage after, %s (%zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2); - ret = 1; - break; - } - } - if (MEMCMP (p1 + align1, p2 + align2 + len2, len1 + 1)) - { - error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2); - ret = 1; - } - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%28s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < 16; ++i) - { - do_test (0, 0, i, i, SMALL_CHAR); - do_test (0, 0, i, i, BIG_CHAR); - do_test (0, i, i, i, SMALL_CHAR); - do_test (i, 0, i, i, BIG_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 0, 8 << i, 8 << i, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, 8 << i, SMALL_CHAR); - do_test (0, 0, 8 << i, 2 << i, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, 2 << i, SMALL_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 2 * i, 8 << i, 1, SMALL_CHAR); - do_test (2 * i, i, 8 << i, 1, BIG_CHAR); - do_test (i, i, 8 << i, 10, SMALL_CHAR); - do_test (i, i, 8 << i, 10, BIG_CHAR); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strchr.c b/string/test-strchr.c deleted file mode 100644 index de9a274f7b..0000000000 --- a/string/test-strchr.c +++ /dev/null @@ -1,296 +0,0 @@ -/* Test STRCHR functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - Added wcschr support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011 - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# ifdef USE_FOR_STRCHRNUL -# define TEST_NAME "strchrnul" -# else -# define TEST_NAME "strchr" -# endif /* !USE_FOR_STRCHRNUL */ -#else -# ifdef USE_FOR_STRCHRNUL -# define TEST_NAME "wcschrnul" -# else -# define TEST_NAME "wcschr" -# endif /* !USE_FOR_STRCHRNUL */ -#endif /* WIDE */ -#include "test-string.h" - -#ifndef WIDE -# ifdef USE_FOR_STRCHRNUL -# define STRCHR strchrnul -# define stupid_STRCHR stupid_STRCHRNUL -# define simple_STRCHR simple_STRCHRNUL -# else -# define STRCHR strchr -# endif /* !USE_FOR_STRCHRNUL */ -# define STRLEN strlen -# define CHAR char -# define BIG_CHAR CHAR_MAX -# define MIDDLE_CHAR 127 -# define SMALL_CHAR 23 -# define UCHAR unsigned char -# define L(s) s -#else -# include <wchar.h> -# ifdef USE_FOR_STRCHRNUL -# define STRCHR wcschrnul -# define stupid_STRCHR stupid_WCSCHRNUL -# define simple_STRCHR simple_WCSCHRNUL -# else -# define STRCHR wcschr -# endif /* !USE_FOR_STRCHRNUL */ -# define STRLEN wcslen -# define CHAR wchar_t -# define BIG_CHAR WCHAR_MAX -# define MIDDLE_CHAR 1121 -# define SMALL_CHAR 851 -# define UCHAR wchar_t -# define L(s) L ## s -#endif /* WIDE */ - -#ifdef USE_FOR_STRCHRNUL -# define NULLRET(endptr) endptr -#else -# define NULLRET(endptr) NULL -#endif /* !USE_FOR_STRCHRNUL */ - - -typedef CHAR *(*proto_t) (const CHAR *, int); - -CHAR * -simple_STRCHR (const CHAR *s, int c) -{ - for (; *s != (CHAR) c; ++s) - if (*s == '\0') - return NULLRET ((CHAR *) s); - return (CHAR *) s; -} - -CHAR * -stupid_STRCHR (const CHAR *s, int c) -{ - size_t n = STRLEN (s) + 1; - - while (n--) - if (*s++ == (CHAR) c) - return (CHAR *) s - 1; - return NULLRET ((CHAR *) s - 1); -} - -IMPL (stupid_STRCHR, 0) -IMPL (simple_STRCHR, 0) -IMPL (STRCHR, 1) - -static int -check_result (impl_t *impl, const CHAR *s, int c, const CHAR *exp_res) -{ - CHAR *res = CALL (impl, s, c); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %#x %p %p", impl->name, - c, res, exp_res); - ret = 1; - return -1; - } - return 0; -} - -static void -do_one_test (impl_t *impl, const CHAR *s, int c, const CHAR *exp_res) -{ - if (check_result (impl, s, c, exp_res) < 0) - return; -} - -static void -do_test (size_t align, size_t pos, size_t len, int seek_char, int max_char) -/* For wcschr: align here means align not in bytes, - but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) - len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ -{ - size_t i; - CHAR *result; - CHAR *buf = (CHAR *) buf1; - align &= 15; - if ((align + len) * sizeof (CHAR) >= page_size) - return; - - for (i = 0; i < len; ++i) - { - buf[align + i] = 32 + 23 * i % max_char; - if (buf[align + i] == seek_char) - buf[align + i] = seek_char + 1; - else if (buf[align + i] == 0) - buf[align + i] = 1; - } - buf[align + len] = 0; - - if (pos < len) - { - buf[align + pos] = seek_char; - result = buf + align + pos; - } - else if (seek_char == 0) - result = buf + align + len; - else - result = NULLRET (buf + align + len); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, buf + align, seek_char, result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, len; - int seek_char; - CHAR *result; - UCHAR *p = (UCHAR *) (buf1 + page_size - 512 * sizeof (CHAR)); - - for (n = 0; n < ITERATIONS; n++) - { - /* For wcschr: align here means align not in bytes, but in wchar_ts, - in bytes it will equal to align * (sizeof (wchar_t)). */ - align = random () & 15; - pos = random () & 511; - seek_char = random () & 255; - if (pos + align >= 511) - pos = 510 - align - (random () & 7); - /* len for wcschr here isn't in bytes but it's number of wchar_t - symbols. */ - len = random () & 511; - if ((pos == len && seek_char) - || (pos > len && (random () & 1))) - len = pos + 1 + (random () & 7); - if (len + align >= 512) - len = 511 - align - (random () & 7); - if (pos == len && seek_char) - len = pos + 1; - j = (pos > len ? pos : len) + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == pos + align) - p[i] = seek_char; - else if (i == len + align) - p[i] = 0; - else - { - p[i] = random () & 255; - if (i < pos + align && p[i] == seek_char) - p[i] = seek_char + 13; - if (i < len + align && !p[i]) - { - p[i] = seek_char - 13; - if (!p[i]) - p[i] = 140; - } - } - } - - if (pos <= len) - result = (CHAR *) (p + pos + align); - else if (seek_char == 0) - result = (CHAR *) (p + len + align); - else - result = NULLRET ((CHAR *) (p + len + align)); - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (CHAR *) (p + align), seek_char) != result) - { - error (0, 0, "Iteration %zd - wrong result in function \ - %s (align in bytes: %zd, seek_char: %d, len: %zd, pos: %zd) %p != %p, p %p", - n, impl->name, align * sizeof (CHAR), seek_char, len, pos, - CALL (impl, (CHAR *) (p + align), seek_char), result, p); - ret = 1; - } - } -} - -static void -check1 (void) -{ - CHAR s[] __attribute__((aligned(16))) = L ("\xff"); - CHAR c = L ('\xfe'); - CHAR *exp_result = stupid_STRCHR (s, c); - - FOR_EACH_IMPL (impl, 0) - check_result (impl, s, c, exp_result); -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - check1 (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - do_test (0, 16 << i, 2048, SMALL_CHAR, MIDDLE_CHAR); - do_test (i, 16 << i, 2048, SMALL_CHAR, MIDDLE_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 64, 256, SMALL_CHAR, MIDDLE_CHAR); - do_test (i, 64, 256, SMALL_CHAR, BIG_CHAR); - } - - for (i = 0; i < 32; ++i) - { - do_test (0, i, i + 1, SMALL_CHAR, MIDDLE_CHAR); - do_test (0, i, i + 1, SMALL_CHAR, BIG_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 16 << i, 2048, 0, MIDDLE_CHAR); - do_test (i, 16 << i, 2048, 0, MIDDLE_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 64, 256, 0, MIDDLE_CHAR); - do_test (i, 64, 256, 0, BIG_CHAR); - } - - for (i = 0; i < 32; ++i) - { - do_test (0, i, i + 1, 0, MIDDLE_CHAR); - do_test (0, i, i + 1, 0, BIG_CHAR); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strchrnul.c b/string/test-strchrnul.c deleted file mode 100644 index b8f79b1897..0000000000 --- a/string/test-strchrnul.c +++ /dev/null @@ -1,21 +0,0 @@ -/* Test and measure strchrnul function. - - Copyright (C) 2011-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define USE_FOR_STRCHRNUL 1 -#include "test-strchr.c" diff --git a/string/test-strcmp.c b/string/test-strcmp.c deleted file mode 100644 index f7af219149..0000000000 --- a/string/test-strcmp.c +++ /dev/null @@ -1,409 +0,0 @@ -/* Test and measure strcmp and wcscmp functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - Added wcscmp support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifdef WIDE -# define TEST_NAME "wcscmp" -#else -# define TEST_NAME "strcmp" -#endif -#include "test-string.h" - -#ifdef WIDE -# include <wchar.h> - -# define L(str) L##str -# define STRCMP wcscmp -# define STRCPY wcscpy -# define STRLEN wcslen -# define MEMCPY wmemcpy -# define SIMPLE_STRCMP simple_wcscmp -# define STUPID_STRCMP stupid_wcscmp -# define CHAR wchar_t -# define UCHAR wchar_t -# define CHARBYTES 4 -# define CHARBYTESLOG 2 -# define CHARALIGN __alignof__ (CHAR) -# define MIDCHAR 0x7fffffff -# define LARGECHAR 0xfffffffe -# define CHAR__MAX WCHAR_MAX -# define CHAR__MIN WCHAR_MIN - -/* Wcscmp uses signed semantics for comparison, not unsigned */ -/* Avoid using substraction since possible overflow */ - -int -simple_wcscmp (const wchar_t *s1, const wchar_t *s2) -{ - wchar_t c1, c2; - do - { - c1 = *s1++; - c2 = *s2++; - if (c2 == L'\0') - return c1 - c2; - } - while (c1 == c2); - - return c1 < c2 ? -1 : 1; -} - -int -stupid_wcscmp (const wchar_t *s1, const wchar_t *s2) -{ - size_t ns1 = wcslen (s1) + 1; - size_t ns2 = wcslen (s2) + 1; - size_t n = ns1 < ns2 ? ns1 : ns2; - int ret = 0; - - wchar_t c1, c2; - - while (n--) { - c1 = *s1++; - c2 = *s2++; - if ((ret = c1 < c2 ? -1 : c1 == c2 ? 0 : 1) != 0) - break; - } - return ret; -} - -#else -# include <limits.h> - -# define L(str) str -# define STRCMP strcmp -# define STRCPY strcpy -# define STRLEN strlen -# define MEMCPY memcpy -# define SIMPLE_STRCMP simple_strcmp -# define STUPID_STRCMP stupid_strcmp -# define CHAR char -# define UCHAR unsigned char -# define CHARBYTES 1 -# define CHARBYTESLOG 0 -# define CHARALIGN 1 -# define MIDCHAR 0x7f -# define LARGECHAR 0xfe -# define CHAR__MAX CHAR_MAX -# define CHAR__MIN CHAR_MIN - -/* Strcmp uses unsigned semantics for comparison. */ -int -simple_strcmp (const char *s1, const char *s2) -{ - int ret; - - while ((ret = *(unsigned char *) s1 - *(unsigned char*) s2++) == 0 && *s1++); - return ret; -} - -int -stupid_strcmp (const char *s1, const char *s2) -{ - size_t ns1 = strlen (s1) + 1; - size_t ns2 = strlen (s2) + 1; - size_t n = ns1 < ns2 ? ns1 : ns2; - int ret = 0; - - while (n--) - if ((ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) != 0) - break; - return ret; -} -#endif - -typedef int (*proto_t) (const CHAR *, const CHAR *); - -IMPL (STUPID_STRCMP, 1) -IMPL (SIMPLE_STRCMP, 1) -IMPL (STRCMP, 1) - -static int -check_result (impl_t *impl, - const CHAR *s1, const CHAR *s2, - int exp_result) -{ - int result = CALL (impl, s1, s2); - if ((exp_result == 0 && result != 0) - || (exp_result < 0 && result >= 0) - || (exp_result > 0 && result <= 0)) - { - error (0, 0, "Wrong result in function %s %d %d", impl->name, - result, exp_result); - ret = 1; - return -1; - } - - return 0; -} - -static void -do_one_test (impl_t *impl, - const CHAR *s1, const CHAR *s2, - int exp_result) -{ - if (check_result (impl, s1, s2, exp_result) < 0) - return; -} - -static void -do_test (size_t align1, size_t align2, size_t len, int max_char, - int exp_result) -{ - size_t i; - - CHAR *s1, *s2; - - if (len == 0) - return; - - align1 &= 63; - if (align1 + (len + 1) * CHARBYTES >= page_size) - return; - - align2 &= 63; - if (align2 + (len + 1) * CHARBYTES >= page_size) - return; - - /* Put them close to the end of page. */ - i = align1 + CHARBYTES * (len + 2); - s1 = (CHAR *) (buf1 + ((page_size - i) / 16 * 16) + align1); - i = align2 + CHARBYTES * (len + 2); - s2 = (CHAR *) (buf2 + ((page_size - i) / 16 * 16) + align2); - - for (i = 0; i < len; i++) - s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % max_char; - - s1[len] = s2[len] = 0; - s1[len + 1] = 23; - s2[len + 1] = 24 + exp_result; - s2[len - 1] -= exp_result; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, exp_result); -} - -static void -do_random_tests (void) -{ - UCHAR *p1 = (UCHAR *) (buf1 + page_size - 512 * CHARBYTES); - UCHAR *p2 = (UCHAR *) (buf2 + page_size - 512 * CHARBYTES); - - for (size_t n = 0; n < ITERATIONS; n++) - { - /* for wcscmp case align1 and align2 mean here alignment - in wchar_t symbols, it equal 4*k alignment in bytes, we - don't check other alignments like for example - p1 = (wchar_t *)(buf1 + 1) - because it's wrong using of wchar_t type. */ - size_t align1 = random () & 31; - size_t align2; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - size_t pos = random () & 511; - size_t j = align1 > align2 ? align1 : align2; - if (pos + j >= 511) - pos = 510 - j - (random () & 7); - size_t len1 = random () & 511; - if (pos >= len1 && (random () & 1)) - len1 = pos + (random () & 7); - if (len1 + j >= 512) - len1 = 511 - j - (random () & 7); - size_t len2; - if (pos >= len1) - len2 = len1; - else - len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); - j = (pos > len2 ? pos : len2) + align1 + 64; - if (j > 512) - j = 512; - for (size_t i = 0; i < j; ++i) - { - p1[i] = random () & 255; - if (i < len1 + align1 && !p1[i]) - { - p1[i] = random () & 255; - if (!p1[i]) - p1[i] = 1 + (random () & 127); - } - } - for (size_t i = 0; i < j; ++i) - { - p2[i] = random () & 255; - if (i < len2 + align2 && !p2[i]) - { - p2[i] = random () & 255; - if (!p2[i]) - p2[i] = 1 + (random () & 127); - } - } - - int result = 0; - MEMCPY (p2 + align2, p1 + align1, pos); - if (pos < len1) - { - if (p2[align2 + pos] == p1[align1 + pos]) - { - p2[align2 + pos] = random () & 255; - if (p2[align2 + pos] == p1[align1 + pos]) - p2[align2 + pos] = p1[align1 + pos] + 3 + (random () & 127); - } - - if (p1[align1 + pos] < p2[align2 + pos]) - result = -1; - else - result = 1; - } - p1[len1 + align1] = 0; - p2[len2 + align2] = 0; - - FOR_EACH_IMPL (impl, 1) - { - int r = CALL (impl, (CHAR *) (p1 + align1), (CHAR *) (p2 + align2)); - /* Test whether on 64-bit architectures where ABI requires - callee to promote has the promotion been done. */ - asm ("" : "=g" (r) : "0" (r)); - if ((r == 0 && result) - || (r < 0 && result >= 0) - || (r > 0 && result <= 0)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (align in bytes: %zd, align in bytes: %zd, len1: %zd, len2: %zd, pos: %zd) %d != %d, p1 %p p2 %p", - n, impl->name, (size_t) (p1 + align1) & 63, (size_t) (p1 + align2) & 63, len1, len2, pos, r, result, p1, p2); - ret = 1; - } - } - } -} - -static void -check (void) -{ - CHAR *s1 = (CHAR *) (buf1 + 0xb2c); - CHAR *s2 = (CHAR *) (buf1 + 0xfd8); - - STRCPY(s1, L("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrs")); - STRCPY(s2, L("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkLMNOPQRSTUV")); - - /* Check correct working for negatives values */ - - s1[0] = 1; - s2[0] = 1; - s1[1] = 1; - s2[1] = 1; - s1[2] = -1; - s2[2] = 3; - s1[3] = 0; - s2[3] = -1; - - /* Check possible overflow bug, actual more for wcscmp */ - - s1[7] = CHAR__MIN; - s2[7] = CHAR__MAX; - - size_t l1 = STRLEN (s1); - size_t l2 = STRLEN (s2); - - for (size_t i1 = 0; i1 < l1; i1++) - for (size_t i2 = 0; i2 < l2; i2++) - { - int exp_result = SIMPLE_STRCMP (s1 + i1, s2 + i2); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1 + i1, s2 + i2, exp_result); - } - - /* Test cases where there are multiple zero bytes after the first. */ - - for (size_t i = 0; i < 16 + 1; i++) - { - s1[i] = 0x00; - s2[i] = 0x00; - } - - for (size_t i = 0; i < 16; i++) - { - int exp_result; - - for (int val = 0x01; val < 0x100; val++) - { - for (size_t j = 0; j < i; j++) - { - s1[j] = val; - s2[j] = val; - } - - s2[i] = val; - - exp_result = SIMPLE_STRCMP (s1, s2); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1, s2, exp_result); - } - } -} - - -int -test_main (void) -{ - size_t i; - - test_init (); - check(); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 32; ++i) - { - do_test (CHARBYTES * i, CHARBYTES * i, i, MIDCHAR, 0); - do_test (CHARBYTES * i, CHARBYTES * i, i, MIDCHAR, 1); - do_test (CHARBYTES * i, CHARBYTES * i, i, MIDCHAR, -1); - } - - for (i = 1; i < 10 + CHARBYTESLOG; ++i) - { - do_test (0, 0, 2 << i, MIDCHAR, 0); - do_test (0, 0, 2 << i, LARGECHAR, 0); - do_test (0, 0, 2 << i, MIDCHAR, 1); - do_test (0, 0, 2 << i, LARGECHAR, 1); - do_test (0, 0, 2 << i, MIDCHAR, -1); - do_test (0, 0, 2 << i, LARGECHAR, -1); - do_test (0, CHARBYTES * i, 2 << i, MIDCHAR, 1); - do_test (CHARBYTES * i, CHARBYTES * (i + 1), 2 << i, LARGECHAR, 1); - } - - for (i = 1; i < 8; ++i) - { - do_test (CHARBYTES * i, 2 * CHARBYTES * i, 8 << i, MIDCHAR, 0); - do_test (2 * CHARBYTES * i, CHARBYTES * i, 8 << i, LARGECHAR, 0); - do_test (CHARBYTES * i, 2 * CHARBYTES * i, 8 << i, MIDCHAR, 1); - do_test (2 * CHARBYTES * i, CHARBYTES * i, 8 << i, LARGECHAR, 1); - do_test (CHARBYTES * i, 2 * CHARBYTES * i, 8 << i, MIDCHAR, -1); - do_test (2 * CHARBYTES * i, CHARBYTES * i, 8 << i, LARGECHAR, -1); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strcpy.c b/string/test-strcpy.c deleted file mode 100644 index d4de65a590..0000000000 --- a/string/test-strcpy.c +++ /dev/null @@ -1,245 +0,0 @@ -/* Test and measure strcpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - Added wcscpy support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011 - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef WIDE -# include <wchar.h> -# define CHAR wchar_t -# define UCHAR wchar_t -# define sfmt "ls" -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -# define STRCMP wcscmp -# define MEMCMP wmemcmp -# define MEMSET wmemset -#else -# define CHAR char -# define UCHAR unsigned char -# define sfmt "s" -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -# define STRCMP strcmp -# define MEMCMP memcmp -# define MEMSET memset -#endif - -#ifndef STRCPY_RESULT -# define STRCPY_RESULT(dst, len) dst -# define TEST_MAIN -# ifndef WIDE -# define TEST_NAME "strcpy" -# else -# define TEST_NAME "wcscpy" -# endif -# include "test-string.h" -# ifndef WIDE -# define SIMPLE_STRCPY simple_strcpy -# define STRCPY strcpy -# else -# define SIMPLE_STRCPY simple_wcscpy -# define STRCPY wcscpy -# endif - -CHAR *SIMPLE_STRCPY (CHAR *, const CHAR *); - -IMPL (SIMPLE_STRCPY, 0) -IMPL (STRCPY, 1) - -CHAR * -SIMPLE_STRCPY (CHAR *dst, const CHAR *src) -{ - CHAR *ret = dst; - while ((*dst++ = *src++) != '\0'); - return ret; -} -#endif - -typedef CHAR *(*proto_t) (CHAR *, const CHAR *); - -static void -do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, - size_t len __attribute__((unused))) -{ - if (CALL (impl, dst, src) != STRCPY_RESULT (dst, len)) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - CALL (impl, dst, src), STRCPY_RESULT (dst, len)); - ret = 1; - return; - } - - if (STRCMP (dst, src) != 0) - { - error (0, 0, - "Wrong result in function %s dst \"%" sfmt "\" src \"%" sfmt "\"", - impl->name, dst, src); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, size_t len, int max_char) -{ - size_t i; - CHAR *s1, *s2; -/* For wcscpy: align1 and align2 here mean alignment not in bytes, - but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) - len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ - align1 &= 7; - if ((align1 + len) * sizeof(CHAR) >= page_size) - return; - - align2 &= 7; - if ((align2 + len) * sizeof(CHAR) >= page_size) - return; - - s1 = (CHAR *) (buf1) + align1; - s2 = (CHAR *) (buf2) + align2; - - for (i = 0; i < len; i++) - s1[i] = 32 + 23 * i % (max_char - 32); - s1[len] = 0; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s2, s1, len); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, len; - UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; - UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; - UCHAR *res; - - for (n = 0; n < ITERATIONS; n++) - { - /* For wcsrchr: align1 and align2 here mean align not in bytes, - but in wchar_ts, in bytes it will equal to align * (sizeof - (wchar_t)). For strrchr we need to check all alignments from - 0 to 63 since some assembly implementations have separate - prolog for alignments more 48. */ - - align1 = random () & (63 / sizeof(CHAR)); - if (random () & 1) - align2 = random () & (63 / sizeof(CHAR)); - else - align2 = align1 + (random () & 24); - len = random () & 511; - j = align1; - if (align2 > j) - j = align2; - if (len + j >= 511) - len = 510 - j - (random () & 7); - j = len + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; i++) - { - if (i == len + align1) - p1[i] = 0; - else - { - p1[i] = random () & BIG_CHAR; - if (i >= align1 && i < len + align1 && !p1[i]) - p1[i] = (random () & SMALL_CHAR) + 3; - } - } - - FOR_EACH_IMPL (impl, 1) - { - MEMSET (p2 - 64, '\1', 512 + 64); - res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), (CHAR *) (p1 + align1)); - if (res != STRCPY_RESULT (p2 + align2, len)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p", - n, impl->name, align1, align2, len, res, - STRCPY_RESULT (p2 + align2, len)); - ret = 1; - } - for (j = 0; j < align2 + 64; ++j) - { - if (p2[j - 64] != '\1') - { - error (0, 0, "Iteration %zd - garbage before, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - for (j = align2 + len + 1; j < 512; ++j) - { - if (p2[j] != '\1') - { - error (0, 0, "Iteration %zd - garbage after, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - if (MEMCMP (p1 + align1, p2 + align2, len + 1)) - { - error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - } - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < 16; ++i) - { - do_test (0, 0, i, SMALL_CHAR); - do_test (0, 0, i, BIG_CHAR); - do_test (0, i, i, SMALL_CHAR); - do_test (i, 0, i, BIG_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 0, 8 << i, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, SMALL_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 2 * i, 8 << i, SMALL_CHAR); - do_test (2 * i, i, 8 << i, BIG_CHAR); - do_test (i, i, 8 << i, SMALL_CHAR); - do_test (i, i, 8 << i, BIG_CHAR); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strcspn.c b/string/test-strcspn.c deleted file mode 100644 index d83c1347d1..0000000000 --- a/string/test-strcspn.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Test strcspn functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define STRPBRK_RESULT(s, pos) (pos) -#define RES_TYPE size_t -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "strcspn" -#else -# define TEST_NAME "wcscspn" -#endif /* WIDE */ -#include "test-string.h" - -#ifndef WIDE -# define STRCSPN strcspn -# define CHAR char -# define SIMPLE_STRCSPN simple_strcspn -# define STUPID_STRCSPN stupid_strcspn -# define STRLEN strlen -#else -# include <wchar.h> -# define STRCSPN wcscspn -# define CHAR wchar_t -# define SIMPLE_STRCSPN simple_wcscspn -# define STUPID_STRCSPN stupid_wcscspn -# define STRLEN wcslen -#endif /* WIDE */ - -typedef size_t (*proto_t) (const CHAR *, const CHAR *); -size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *); -size_t STUPID_STRCSPN (const CHAR *, const CHAR *); - -IMPL (STUPID_STRCSPN, 0) -IMPL (SIMPLE_STRCSPN, 0) -IMPL (STRCSPN, 1) - -size_t -SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej) -{ - const CHAR *r, *str = s; - CHAR c; - - while ((c = *s++) != '\0') - for (r = rej; *r != '\0'; ++r) - if (*r == c) - return s - str - 1; - return s - str - 1; -} - -size_t -STUPID_STRCSPN (const CHAR *s, const CHAR *rej) -{ - size_t ns = STRLEN (s), nrej = STRLEN (rej); - size_t i, j; - - for (i = 0; i < ns; ++i) - for (j = 0; j < nrej; ++j) - if (s[i] == rej[j]) - return i; - return i; -} - -#undef CHAR -#undef STRLEN -#include "test-strpbrk.c" diff --git a/string/test-string.h b/string/test-string.h deleted file mode 100644 index 6e13bf4aa3..0000000000 --- a/string/test-string.h +++ /dev/null @@ -1,219 +0,0 @@ -/* Test and measure string and memory functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sys/cdefs.h> - -typedef struct -{ - const char *name; - void (*fn) (void); - long test; -} impl_t; -extern impl_t __start_impls[], __stop_impls[]; - -#define IMPL(name, test) \ - impl_t tst_ ## name \ - __attribute__ ((section ("impls"), aligned (sizeof (void *)))) \ - = { __STRING (name), (void (*) (void))name, test }; - -#ifdef TEST_MAIN - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#undef __USE_STRING_INLINES - -/* We are compiled under _ISOMAC, so libc-symbols.h does not do this - for us. */ -#include "config.h" -#ifdef HAVE_CC_INHIBIT_LOOP_TO_LIBCALL -# define inhibit_loop_to_libcall \ - __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns"))) -#else -# define inhibit_loop_to_libcall -#endif - -#include <getopt.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/mman.h> -#include <sys/param.h> -#include <unistd.h> -#include <fcntl.h> -#include <error.h> -#include <errno.h> -#include <time.h> -#include <ifunc-impl-list.h> -#define GL(x) _##x -#define GLRO(x) _##x - - -# define TEST_FUNCTION test_main -# define TIMEOUT (4 * 60) -# define OPT_ITERATIONS 10000 -# define OPT_RANDOM 10001 -# define OPT_SEED 10002 - -unsigned char *buf1, *buf2; -int ret, do_srandom; -unsigned int seed; -size_t page_size; - -# ifndef ITERATIONS -size_t iterations = 100000; -# define ITERATIONS_OPTIONS \ - { "iterations", required_argument, NULL, OPT_ITERATIONS }, -# define ITERATIONS_PROCESS \ - case OPT_ITERATIONS: \ - iterations = strtoul (optarg, NULL, 0); \ - break; -# define ITERATIONS iterations -# else -# define ITERATIONS_OPTIONS -# define ITERATIONS_PROCESS -# endif - -# define CMDLINE_OPTIONS ITERATIONS_OPTIONS \ - { "random", no_argument, NULL, OPT_RANDOM }, \ - { "seed", required_argument, NULL, OPT_SEED }, - -static void __attribute__ ((used)) -cmdline_process_function (int c) -{ - switch (c) - { - ITERATIONS_PROCESS - case OPT_RANDOM: - { - int fdr = open ("/dev/urandom", O_RDONLY); - if (fdr < 0 || read (fdr, &seed, sizeof (seed)) != sizeof (seed)) - seed = time (NULL); - if (fdr >= 0) - close (fdr); - do_srandom = 1; - break; - } - - case OPT_SEED: - seed = strtoul (optarg, NULL, 0); - do_srandom = 1; - break; - } -} -# define CMDLINE_PROCESS cmdline_process_function - -#define CALL(impl, ...) \ - (* (proto_t) (impl)->fn) (__VA_ARGS__) - -#ifdef TEST_NAME -/* Increase size of FUNC_LIST if assert is triggered at run-time. */ -static struct libc_ifunc_impl func_list[32]; -static int func_count; -static int impl_count = -1; -static impl_t *impl_array; - -# define FOR_EACH_IMPL(impl, notall) \ - impl_t *impl; \ - int count; \ - if (impl_count == -1) \ - { \ - impl_count = 0; \ - if (func_count != 0) \ - { \ - int f; \ - impl_t *skip = NULL, *a; \ - for (impl = __start_impls; impl < __stop_impls; ++impl) \ - if (strcmp (impl->name, TEST_NAME) == 0) \ - skip = impl; \ - else \ - impl_count++; \ - a = impl_array = malloc ((impl_count + func_count) * \ - sizeof (impl_t)); \ - for (impl = __start_impls; impl < __stop_impls; ++impl) \ - if (impl != skip) \ - *a++ = *impl; \ - for (f = 0; f < func_count; f++) \ - if (func_list[f].usable) \ - { \ - a->name = func_list[f].name; \ - a->fn = func_list[f].fn; \ - a->test = 1; \ - a++; \ - } \ - impl_count = a - impl_array; \ - } \ - else \ - { \ - impl_count = __stop_impls - __start_impls; \ - impl_array = __start_impls; \ - } \ - } \ - impl = impl_array; \ - for (count = 0; count < impl_count; ++count, ++impl) \ - if (!notall || impl->test) -#else -# define FOR_EACH_IMPL(impl, notall) \ - for (impl_t *impl = __start_impls; impl < __stop_impls; ++impl) \ - if (!notall || impl->test) -#endif - -#ifndef BUF1PAGES -# define BUF1PAGES 1 -#endif - -static void -test_init (void) -{ -#ifdef TEST_NAME - func_count = __libc_ifunc_impl_list (TEST_NAME, func_list, - (sizeof func_list - / sizeof func_list[0])); -#endif - - page_size = 2 * getpagesize (); -#ifdef MIN_PAGE_SIZE - if (page_size < MIN_PAGE_SIZE) - page_size = MIN_PAGE_SIZE; -#endif - buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); - if (buf1 == MAP_FAILED) - error (EXIT_FAILURE, errno, "mmap failed"); - if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE)) - error (EXIT_FAILURE, errno, "mprotect failed"); - buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -1, 0); - if (buf2 == MAP_FAILED) - error (EXIT_FAILURE, errno, "mmap failed"); - if (mprotect (buf2 + page_size, page_size, PROT_NONE)) - error (EXIT_FAILURE, errno, "mprotect failed"); - if (do_srandom) - { - printf ("Setting seed to 0x%x\n", seed); - srandom (seed); - } - - memset (buf1, 0xa5, BUF1PAGES * page_size); - memset (buf2, 0x5a, page_size); -} - -#endif diff --git a/string/test-strlen.c b/string/test-strlen.c deleted file mode 100644 index 99be380e6e..0000000000 --- a/string/test-strlen.c +++ /dev/null @@ -1,167 +0,0 @@ -/* Test and measure STRLEN functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - Added wcslen support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011 - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "strlen" -#else -# define TEST_NAME "wcslen" -#endif -#include "test-string.h" - -#ifndef WIDE -# define STRLEN strlen -# define CHAR char -# define MAX_CHAR CHAR_MAX -#else -# include <wchar.h> -# define STRLEN wcslen -# define CHAR wchar_t -# define MAX_CHAR WCHAR_MAX -#endif - -typedef size_t (*proto_t) (const CHAR *); - -size_t -simple_STRLEN (const CHAR *s) -{ - const CHAR *p; - - for (p = s; *p; ++p); - return p - s; -} - -#ifndef WIDE -size_t -builtin_strlen (const CHAR *p) -{ - return __builtin_strlen (p); -} -IMPL (builtin_strlen, 0) -#endif - -IMPL (simple_STRLEN, 0) -IMPL (STRLEN, 1) - - -static void -do_one_test (impl_t *impl, const CHAR *s, size_t exp_len) -{ - size_t len = CALL (impl, s); - if (len != exp_len) - { - error (0, 0, "Wrong result in function %s %zd %zd", impl->name, - len, exp_len); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t len) -{ - size_t i; - - align &= 63; - if (align + sizeof(CHAR) * len >= page_size) - return; - - CHAR *buf = (CHAR *) (buf1); - - for (i = 0; i < len; ++i) - buf[align + i] = 1 + 11111 * i % MAX_CHAR; - buf[align + len] = 0; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (CHAR *) (buf + align), len); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, len; - CHAR *p = (CHAR *) (buf1 + page_size - 512 * sizeof(CHAR)); - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - len = random () & 511; - if (len + align > 510) - len = 511 - align - (random () & 7); - j = len + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == len + align) - p[i] = 0; - else - { - p[i] = random () & 255; - if (i >= align && i < len + align && !p[i]) - p[i] = (random () & 127) + 1; - } - } - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (CHAR *) (p + align)) != len) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd) %zd != %zd, p %p", - n, impl->name, align, CALL (impl, (CHAR *) (p + align)), - len, p); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - /* Checking with only 4 * N alignments for wcslen, other alignments are wrong for wchar_t type arrays*/ - - for (i = 1; i < 8; ++i) - { - do_test (sizeof(CHAR) * i, i); - do_test (0, i); - } - - for (i = 2; i <= 12; ++i) - { - do_test (0, 1 << i); - do_test (sizeof(CHAR) * 7, 1 << i); - do_test (sizeof(CHAR) * i, 1 << i); - do_test (sizeof(CHAR) * i, (size_t)((1 << i) / 1.5)); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strncasecmp.c b/string/test-strncasecmp.c deleted file mode 100644 index bf501cf798..0000000000 --- a/string/test-strncasecmp.c +++ /dev/null @@ -1,353 +0,0 @@ -/* Test and measure strncasecmp functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <locale.h> -#include <ctype.h> -#define TEST_MAIN -#define TEST_NAME "strncasecmp" -#include "test-string.h" - -typedef int (*proto_t) (const char *, const char *, size_t); -static int simple_strncasecmp (const char *, const char *, size_t); -static int stupid_strncasecmp (const char *, const char *, size_t); - -IMPL (stupid_strncasecmp, 0) -IMPL (simple_strncasecmp, 0) -IMPL (strncasecmp, 1) - -static int -simple_strncasecmp (const char *s1, const char *s2, size_t n) -{ - int ret; - - if (n == 0) - return 0; - - while ((ret = ((unsigned char) tolower (*s1) - - (unsigned char) tolower (*s2))) == 0 - && *s1++) - { - if (--n == 0) - return 0; - ++s2; - } - return ret; -} - -static int -stupid_strncasecmp (const char *s1, const char *s2, size_t max) -{ - size_t ns1 = strlen (s1) + 1; - size_t ns2 = strlen (s2) + 1; - size_t n = ns1 < ns2 ? ns1 : ns2; - if (n > max) - n = max; - int ret = 0; - - while (n--) - { - if ((ret = ((unsigned char) tolower (*s1) - - (unsigned char) tolower (*s2))) != 0) - break; - ++s1; - ++s2; - } - return ret; -} - -static int -check_result (impl_t *impl, const char *s1, const char *s2, size_t n, - int exp_result) -{ - int result = CALL (impl, s1, s2, n); - if ((exp_result == 0 && result != 0) - || (exp_result < 0 && result >= 0) - || (exp_result > 0 && result <= 0)) - { - error (0, 0, "Wrong result in function %s %d %d", impl->name, - result, exp_result); - ret = 1; - return -1; - } - - return 0; -} - -static void -do_one_test (impl_t *impl, const char *s1, const char *s2, size_t n, - int exp_result) -{ - if (check_result (impl, s1, s2, n, exp_result) < 0) - return; -} - -static void -do_test (size_t align1, size_t align2, size_t n, size_t len, int max_char, - int exp_result) -{ - size_t i; - char *s1, *s2; - - if (len == 0) - return; - - align1 &= 7; - if (align1 + len + 1 >= page_size) - return; - - align2 &= 7; - if (align2 + len + 1 >= page_size) - return; - - s1 = (char *) (buf1 + align1); - s2 = (char *) (buf2 + align2); - - for (i = 0; i < len; i++) - { - s1[i] = toupper (1 + 23 * i % max_char); - s2[i] = tolower (s1[i]); - } - - s1[len] = s2[len] = 0; - s1[len + 1] = 23; - s2[len + 1] = 24 + exp_result; - if ((s2[len - 1] == 'z' && exp_result == -1) - || (s2[len - 1] == 'a' && exp_result == 1)) - s1[len - 1] += exp_result; - else - s2[len - 1] -= exp_result; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, n, exp_result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, pos, len1, len2; - int result; - long r; - unsigned char *p1 = buf1 + page_size - 512; - unsigned char *p2 = buf2 + page_size - 512; - - for (n = 0; n < ITERATIONS; n++) - { - align1 = random () & 31; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - pos = random () & 511; - j = align1 > align2 ? align1 : align2; - if (pos + j >= 511) - pos = 510 - j - (random () & 7); - len1 = random () & 511; - if (pos >= len1 && (random () & 1)) - len1 = pos + (random () & 7); - if (len1 + j >= 512) - len1 = 511 - j - (random () & 7); - if (pos >= len1) - len2 = len1; - else - len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); - j = (pos > len2 ? pos : len2) + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; ++i) - { - p1[i] = tolower (random () & 255); - if (i < len1 + align1 && !p1[i]) - { - p1[i] = tolower (random () & 255); - if (!p1[i]) - p1[i] = tolower (1 + (random () & 127)); - } - } - for (i = 0; i < j; ++i) - { - p2[i] = toupper (random () & 255); - if (i < len2 + align2 && !p2[i]) - { - p2[i] = toupper (random () & 255); - if (!p2[i]) - toupper (p2[i] = 1 + (random () & 127)); - } - } - - result = 0; - memcpy (p2 + align2, p1 + align1, pos); - if (pos < len1) - { - if (tolower (p2[align2 + pos]) == p1[align1 + pos]) - { - p2[align2 + pos] = toupper (random () & 255); - if (tolower (p2[align2 + pos]) == p1[align1 + pos]) - p2[align2 + pos] = toupper (p1[align1 + pos] - + 3 + (random () & 127)); - } - - if (p1[align1 + pos] < tolower (p2[align2 + pos])) - result = -1; - else - result = 1; - } - p1[len1 + align1] = 0; - p2[len2 + align2] = 0; - - FOR_EACH_IMPL (impl, 1) - { - r = CALL (impl, (char *) (p1 + align1), (char *) (p2 + align2), - pos + 1 + (random () & 255)); - /* Test whether on 64-bit architectures where ABI requires - callee to promote has the promotion been done. */ - asm ("" : "=g" (r) : "0" (r)); - if ((r == 0 && result) - || (r < 0 && result >= 0) - || (r > 0 && result <= 0)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd, %zd) %ld != %d, p1 %p p2 %p", - n, impl->name, align1, align2, len1, len2, pos, r, result, p1, p2); - ret = 1; - } - } - } -} - -/* Regression test for BZ #12205 */ -static void -bz12205 (void) -{ - static char cp [4096+16] __attribute__ ((aligned(4096))); - static char gotrel[4096] __attribute__ ((aligned(4096))); - char *s1 = cp + 0xffa; - char *s2 = gotrel + 0xcbe; - int exp_result; - size_t n = 6; - - strcpy (s1, "gottpoff"); - strcpy (s2, "GOTPLT"); - - exp_result = simple_strncasecmp (s1, s2, n); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1, s2, n, exp_result); -} - -/* Regression test for BZ #14195 */ -static void -bz14195 (void) -{ - const char *empty_string = ""; - FOR_EACH_IMPL (impl, 0) - check_result (impl, empty_string, "", 5, 0); -} - -static void -test_locale (const char *locale) -{ - size_t i; - - if (setlocale (LC_CTYPE, locale) == NULL) - { - error (0, 0, "cannot set locale \"%s\"", locale); - ret = 1; - } - - bz12205 (); - bz14195 (); - - printf ("%23s", locale); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 16; ++i) - { - do_test (i, i, i - 1, i, 127, 0); - - do_test (i, i, i, i, 127, 0); - do_test (i, i, i, i, 127, 1); - do_test (i, i, i, i, 127, -1); - - do_test (i, i, i + 1, i, 127, 0); - do_test (i, i, i + 1, i, 127, 1); - do_test (i, i, i + 1, i, 127, -1); - } - - for (i = 1; i < 10; ++i) - { - do_test (0, 0, (2 << i) - 1, 2 << i, 127, 0); - do_test (0, 0, 2 << i, 2 << i, 254, 0); - do_test (0, 0, (2 << i) + 1, 2 << i, 127, 0); - - do_test (0, 0, (2 << i) + 1, 2 << i, 254, 0); - - do_test (0, 0, 2 << i, 2 << i, 127, 1); - do_test (0, 0, (2 << i) + 10, 2 << i, 127, 1); - - do_test (0, 0, 2 << i, 2 << i, 254, 1); - do_test (0, 0, (2 << i) + 10, 2 << i, 254, 1); - - do_test (0, 0, 2 << i, 2 << i, 127, -1); - do_test (0, 0, (2 << i) + 10, 2 << i, 127, -1); - - do_test (0, 0, 2 << i, 2 << i, 254, -1); - do_test (0, 0, (2 << i) + 10, 2 << i, 254, -1); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 2 * i, (8 << i) - 1, 8 << i, 127, 0); - do_test (i, 2 * i, 8 << i, 8 << i, 127, 0); - do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, 0); - - do_test (2 * i, i, (8 << i) - 1, 8 << i, 254, 0); - do_test (2 * i, i, 8 << i, 8 << i, 254, 0); - do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, 0); - - do_test (i, 2 * i, 8 << i, 8 << i, 127, 1); - do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, 1); - - do_test (2 * i, i, 8 << i, 8 << i, 254, 1); - do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, 1); - - do_test (i, 2 * i, 8 << i, 8 << i, 127, -1); - do_test (i, 2 * i, (8 << i) + 100, 8 << i, 127, -1); - - do_test (2 * i, i, 8 << i, 8 << i, 254, -1); - do_test (2 * i, i, (8 << i) + 100, 8 << i, 254, -1); - } - - do_random_tests (); -} - -int -test_main (void) -{ - test_init (); - - test_locale ("C"); - test_locale ("en_US.ISO-8859-1"); - test_locale ("en_US.UTF-8"); - test_locale ("tr_TR.ISO-8859-9"); - test_locale ("tr_TR.UTF-8"); - - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strncat.c b/string/test-strncat.c deleted file mode 100644 index 66d58e534d..0000000000 --- a/string/test-strncat.c +++ /dev/null @@ -1,322 +0,0 @@ -/* Test strncat functions. - Copyright (C) 2011-2017 Free Software Foundation, Inc. - Contributed by Intel Corporation. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "strncat" -#else -# define TEST_NAME "wcsncat" -#endif /* WIDE */ -#include "test-string.h" - -#ifndef WIDE -# define STRNCAT strncat -# define CHAR char -# define UCHAR unsigned char -# define SIMPLE_STRNCAT simple_strncat -# define STUPID_STRNCAT stupid_strncat -# define STRLEN strlen -# define MEMSET memset -# define MEMCPY memcpy -# define MEMCMP memcmp -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -#else -# include <wchar.h> -# define STRNCAT wcsncat -# define CHAR wchar_t -# define UCHAR wchar_t -# define SIMPLE_STRNCAT simple_wcsncat -# define STUPID_STRNCAT stupid_wcsncat -# define STRLEN wcslen -# define MEMSET wmemset -# define MEMCPY wmemcpy -# define MEMCMP wmemcmp -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -#endif /* WIDE */ - -typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t); -CHAR *STUPID_STRNCAT (CHAR *, const CHAR *, size_t); -CHAR *SIMPLE_STRNCAT (CHAR *, const CHAR *, size_t); - -IMPL (STUPID_STRNCAT, 0) -IMPL (STRNCAT, 2) - -CHAR * -STUPID_STRNCAT (CHAR *dst, const CHAR *src, size_t n) -{ - CHAR *ret = dst; - while (*dst++ != '\0'); - --dst; - while (n--) - if ((*dst++ = *src++) == '\0') - return ret; - *dst = '\0'; - return ret; -} - -static void -do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t n) -{ - size_t k = STRLEN (dst); - if (CALL (impl, dst, src, n) != dst) - { - error (0, 0, "Wrong result in function %s %p != %p", impl->name, - CALL (impl, dst, src, n), dst); - ret = 1; - return; - } - - size_t len = STRLEN (src); - if (MEMCMP (dst + k, src, len + 1 > n ? n : len + 1) != 0) - { - error (0, 0, "Incorrect concatenation in function %s", - impl->name); - ret = 1; - return; - } - if (n < len && dst[k + n] != '\0') - { - error (0, 0, "There is no zero in the end of output string in %s", - impl->name); - ret = 1; - return; - } -} - -static void -do_test (size_t align1, size_t align2, size_t len1, size_t len2, - size_t n, int max_char) -{ - size_t i; - CHAR *s1, *s2; - - align1 &= 7; - if ((align1 + len1) * sizeof (CHAR) >= page_size) - return; - if ((align1 + n) * sizeof (CHAR) > page_size) - return; - align2 &= 7; - if ((align2 + len1 + len2) * sizeof (CHAR) >= page_size) - return; - if ((align2 + len1 + n) * sizeof (CHAR) > page_size) - return; - s1 = (CHAR *) (buf1) + align1; - s2 = (CHAR *) (buf2) + align2; - - for (i = 0; i < len1; ++i) - s1[i] = 32 + 23 * i % (max_char - 32); - s1[len1] = '\0'; - - for (i = 0; i < len2; i++) - s2[i] = 32 + 23 * i % (max_char - 32); - - FOR_EACH_IMPL (impl, 0) - { - s2[len2] = '\0'; - do_one_test (impl, s2, s1, n); - } -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, len1, len2, N; - UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; - UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; - UCHAR *p3 = (UCHAR *) buf1; - UCHAR *res; - fprintf (stdout, "Number of iterations in random test = %zd\n", - ITERATIONS); - for (n = 0; n < ITERATIONS; n++) - { - N = random () & 255; - align1 = random () & 31; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - len1 = random () & 511; - if (len1 + align2 > 512) - len2 = random () & 7; - else - len2 = (512 - len1 - align2) * (random () & (1024 * 1024 - 1)) - / (1024 * 1024); - j = align1; - if (align2 + len2 > j) - j = align2 + len2; - if (len1 + j >= 511) - len1 = 510 - j - (random () & 7); - if (len1 >= 512) - len1 = 0; - if (align1 + len1 < 512 - 8) - { - j = 510 - align1 - len1 - (random () & 31); - if (j > 0 && j < 512) - align1 += j; - } - j = len1 + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; i++) - { - if (i == len1 + align1) - p1[i] = 0; - else - { - p1[i] = random () & BIG_CHAR; - if (i >= align1 && i < len1 + align1 && !p1[i]) - p1[i] = (random () & SMALL_CHAR) + 3; - } - } - for (i = 0; i < len2; i++) - { - p3[i] = random () & BIG_CHAR; - if (!p3[i]) - p3[i] = (random () & SMALL_CHAR) + 3; - } - p3[len2] = 0; - - FOR_EACH_IMPL (impl, 1) - { - MEMSET (p2 - 64, '\1', align2 + 64); - MEMSET (p2 + align2 + len2 + 1, '\1', 512 - align2 - len2 - 1); - MEMCPY (p2 + align2, p3, len2 + 1); - res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), - (CHAR *) (p1 + align1), N); - if (res != p2 + align2) - { - error (0, 0, "Iteration %zd - wrong result in function %s " - "(%zd, %zd, %zd, %zd, %zd) %p != %p", - n, impl->name, align1, align2, len1, len2, N, - res, p2 + align2); - ret = 1; - } - for (j = 0; j < align2 + 64; ++j) - { - if (p2[j - 64] != '\1') - { - error (0, 0, "Iteration %zd - garbage before dst, %s " - "%zd, %zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2, N); - ret = 1; - break; - } - } - if (MEMCMP (p2 + align2, p3, len2)) - { - error (0, 0, "Iteration %zd - garbage in string before, %s " - "(%zd, %zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2, N); - ret = 1; - } - - if ((len1 + 1) > N) - j = align2 + N + 1 + len2; - else - j = align2 + len1 + 1 + len2; - for (; j < 512; ++j) - { - if (p2[j] != '\1') - { - error (0, 0, "Iteration %zd - garbage after, %s " - "(%zd, %zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2, N); - ret = 1; - break; - } - } - if (len1 + 1 > N) - { - if (p2[align2 + N + len2] != '\0') - { - error (0, 0, "Iteration %zd - there is no zero at the " - "end of output string, %s (%zd, %zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2, N); - ret = 1; - } - } - if (MEMCMP (p1 + align1, p2 + align2 + len2, - (len1 + 1) > N ? N : len1 + 1)) - { - error (0, 0, "Iteration %zd - different strings, %s " - "(%zd, %zd, %zd, %zd, %zd)", - n, impl->name, align1, align2, len1, len2, N); - ret = 1; - } - } - } -} - -int -test_main (void) -{ - size_t i, n; - - test_init (); - - printf ("%28s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (n = 2; n <= 2048; n*=4) - { - do_test (0, 2, 2, 2, n, SMALL_CHAR); - do_test (0, 0, 4, 4, n, SMALL_CHAR); - do_test (4, 0, 4, 4, n, BIG_CHAR); - do_test (0, 0, 8, 8, n, SMALL_CHAR); - do_test (0, 8, 8, 8, n, SMALL_CHAR); - - do_test (0, 2, 2, 2, SIZE_MAX, SMALL_CHAR); - do_test (0, 0, 4, 4, SIZE_MAX, SMALL_CHAR); - do_test (4, 0, 4, 4, SIZE_MAX, BIG_CHAR); - do_test (0, 0, 8, 8, SIZE_MAX, SMALL_CHAR); - do_test (0, 8, 8, 8, SIZE_MAX, SMALL_CHAR); - - for (i = 1; i < 8; ++i) - { - do_test (0, 0, 8 << i, 8 << i, n, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, 8 << i, n, SMALL_CHAR); - do_test (0, 0, 8 << i, 2 << i, n, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, 2 << i, n, SMALL_CHAR); - - do_test (0, 0, 8 << i, 8 << i, SIZE_MAX, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, 8 << i, SIZE_MAX, SMALL_CHAR); - do_test (0, 0, 8 << i, 2 << i, SIZE_MAX, SMALL_CHAR); - do_test (8 - i, 2 * i, 8 << i, 2 << i, SIZE_MAX, SMALL_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 2 * i, 8 << i, 1, n, SMALL_CHAR); - do_test (2 * i, i, 8 << i, 1, n, BIG_CHAR); - do_test (i, i, 8 << i, 10, n, SMALL_CHAR); - - do_test (i, 2 * i, 8 << i, 1, SIZE_MAX, SMALL_CHAR); - do_test (2 * i, i, 8 << i, 1, SIZE_MAX, BIG_CHAR); - do_test (i, i, 8 << i, 10, SIZE_MAX, SMALL_CHAR); - } - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strncmp.c b/string/test-strncmp.c deleted file mode 100644 index fe3c4e3320..0000000000 --- a/string/test-strncmp.c +++ /dev/null @@ -1,479 +0,0 @@ -/* Test strncmp and wcsncmp functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifdef WIDE -# define TEST_NAME "wcsncmp" -#else -# define TEST_NAME "strncmp" -#endif -#include "test-string.h" - -#ifdef WIDE -# include <wchar.h> - -# define L(str) L##str -# define STRNCMP wcsncmp -# define STRCPY wcscpy -# define STRDUP wcsdup -# define MEMCPY wmemcpy -# define SIMPLE_STRNCMP simple_wcsncmp -# define STUPID_STRNCMP stupid_wcsncmp -# define CHAR wchar_t -# define UCHAR wchar_t -# define CHARBYTES 4 -# define CHAR__MAX WCHAR_MAX -# define CHAR__MIN WCHAR_MIN - -/* Wcsncmp uses signed semantics for comparison, not unsigned. - Avoid using substraction since possible overflow */ -int -simple_wcsncmp (const CHAR *s1, const CHAR *s2, size_t n) -{ - wchar_t c1, c2; - - while (n--) - { - c1 = *s1++; - c2 = *s2++; - if (c1 == L('\0') || c1 != c2) - return c1 > c2 ? 1 : (c1 < c2 ? -1 : 0); - } - return 0; -} - -int -stupid_wcsncmp (const CHAR *s1, const CHAR *s2, size_t n) -{ - wchar_t c1, c2; - size_t ns1 = wcsnlen (s1, n) + 1, ns2 = wcsnlen (s2, n) + 1; - - n = ns1 < n ? ns1 : n; - n = ns2 < n ? ns2 : n; - - while (n--) - { - c1 = *s1++; - c2 = *s2++; - if (c1 != c2) - return c1 > c2 ? 1 : -1; - } - return 0; -} - -#else -# define L(str) str -# define STRNCMP strncmp -# define STRCPY strcpy -# define STRDUP strdup -# define MEMCPY memcpy -# define SIMPLE_STRNCMP simple_strncmp -# define STUPID_STRNCMP stupid_strncmp -# define CHAR char -# define UCHAR unsigned char -# define CHARBYTES 1 -# define CHAR__MAX CHAR_MAX -# define CHAR__MIN CHAR_MIN - -/* Strncmp uses unsigned semantics for comparison. */ -int -simple_strncmp (const char *s1, const char *s2, size_t n) -{ - int ret = 0; - - while (n-- && (ret = *(unsigned char *) s1 - * (unsigned char *) s2++) == 0 - && *s1++); - return ret; -} - -int -stupid_strncmp (const char *s1, const char *s2, size_t n) -{ - size_t ns1 = strnlen (s1, n) + 1, ns2 = strnlen (s2, n) + 1; - int ret = 0; - - n = ns1 < n ? ns1 : n; - n = ns2 < n ? ns2 : n; - while (n-- && (ret = *(unsigned char *) s1++ - * (unsigned char *) s2++) == 0); - return ret; -} - -#endif - -typedef int (*proto_t) (const CHAR *, const CHAR *, size_t); - -IMPL (STUPID_STRNCMP, 0) -IMPL (SIMPLE_STRNCMP, 0) -IMPL (STRNCMP, 1) - - -static int -check_result (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t n, - int exp_result) -{ - int result = CALL (impl, s1, s2, n); - if ((exp_result == 0 && result != 0) - || (exp_result < 0 && result >= 0) - || (exp_result > 0 && result <= 0)) - { - error (0, 0, "Wrong result in function %s %d %d", impl->name, - result, exp_result); - ret = 1; - return -1; - } - - return 0; -} - -static void -do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, size_t n, - int exp_result) -{ - if (check_result (impl, s1, s2, n, exp_result) < 0) - return; -} - -static void -do_test_limit (size_t align1, size_t align2, size_t len, size_t n, int max_char, - int exp_result) -{ - size_t i, align_n; - CHAR *s1, *s2; - - align1 &= ~(CHARBYTES - 1); - align2 &= ~(CHARBYTES - 1); - - if (n == 0) - { - s1 = (CHAR *) (buf1 + page_size); - s2 = (CHAR *) (buf2 + page_size); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, n, 0); - - return; - } - - align1 &= 15; - align2 &= 15; - align_n = (page_size - n * CHARBYTES) & 15; - - s1 = (CHAR *) (buf1 + page_size - n * CHARBYTES); - s2 = (CHAR *) (buf2 + page_size - n * CHARBYTES); - - if (align1 < align_n) - s1 = (CHAR *) ((char *) s1 - (align_n - align1)); - - if (align2 < align_n) - s2 = (CHAR *) ((char *) s2 - (align_n - align2)); - - for (i = 0; i < n; i++) - s1[i] = s2[i] = 1 + 23 * i % max_char; - - if (len < n) - { - s1[len] = 0; - s2[len] = 0; - if (exp_result < 0) - s2[len] = 32; - else if (exp_result > 0) - s1[len] = 64; - } - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, n, exp_result); -} - -static void -do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char, - int exp_result) -{ - size_t i; - CHAR *s1, *s2; - - align1 &= ~(CHARBYTES - 1); - align2 &= ~(CHARBYTES - 1); - - if (n == 0) - return; - - align1 &= 63; - if (align1 + (n + 1) * CHARBYTES >= page_size) - return; - - align2 &= 63; - if (align2 + (n + 1) * CHARBYTES >= page_size) - return; - - s1 = (CHAR *) (buf1 + align1); - s2 = (CHAR *) (buf2 + align2); - - for (i = 0; i < n; i++) - s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % max_char; - - s1[n] = 24 + exp_result; - s2[n] = 23; - s1[len] = 0; - s2[len] = 0; - if (exp_result < 0) - s2[len] = 32; - else if (exp_result > 0) - s1[len] = 64; - if (len >= n) - s2[n - 1] -= exp_result; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, n, exp_result); -} - -static void -do_page_test (size_t offset1, size_t offset2, CHAR *s2) -{ - CHAR *s1; - int exp_result; - - if (offset1 * CHARBYTES >= page_size || offset2 * CHARBYTES >= page_size) - return; - - s1 = (CHAR *) buf1; - s1 += offset1; - s2 += offset2; - - exp_result= *s1; - - FOR_EACH_IMPL (impl, 0) - { - check_result (impl, s1, s2, page_size, -exp_result); - check_result (impl, s2, s1, page_size, exp_result); - } -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, pos, len1, len2, size; - int result; - long r; - UCHAR *p1 = (UCHAR *) (buf1 + page_size - 512 * CHARBYTES); - UCHAR *p2 = (UCHAR *) (buf2 + page_size - 512 * CHARBYTES); - - for (n = 0; n < ITERATIONS; n++) - { - align1 = random () & 31; - if (random () & 1) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - pos = random () & 511; - size = random () & 511; - j = align1 > align2 ? align1 : align2; - if (pos + j >= 511) - pos = 510 - j - (random () & 7); - len1 = random () & 511; - if (pos >= len1 && (random () & 1)) - len1 = pos + (random () & 7); - if (len1 + j >= 512) - len1 = 511 - j - (random () & 7); - if (pos >= len1) - len2 = len1; - else - len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); - j = (pos > len2 ? pos : len2) + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; ++i) - { - p1[i] = random () & 255; - if (i < len1 + align1 && !p1[i]) - { - p1[i] = random () & 255; - if (!p1[i]) - p1[i] = 1 + (random () & 127); - } - } - for (i = 0; i < j; ++i) - { - p2[i] = random () & 255; - if (i < len2 + align2 && !p2[i]) - { - p2[i] = random () & 255; - if (!p2[i]) - p2[i] = 1 + (random () & 127); - } - } - - result = 0; - MEMCPY (p2 + align2, p1 + align1, pos); - if (pos < len1) - { - if (p2[align2 + pos] == p1[align1 + pos]) - { - p2[align2 + pos] = random () & 255; - if (p2[align2 + pos] == p1[align1 + pos]) - p2[align2 + pos] = p1[align1 + pos] + 3 + (random () & 127); - } - - if (pos < size) - { - if (p1[align1 + pos] < p2[align2 + pos]) - result = -1; - else - result = 1; - } - } - p1[len1 + align1] = 0; - p2[len2 + align2] = 0; - - FOR_EACH_IMPL (impl, 1) - { - r = CALL (impl, (CHAR *) (p1 + align1), (CHAR *) (p2 + align2), size); - /* Test whether on 64-bit architectures where ABI requires - callee to promote has the promotion been done. */ - asm ("" : "=g" (r) : "0" (r)); - if ((r == 0 && result) - || (r < 0 && result >= 0) - || (r > 0 && result <= 0)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd, %zd, %zd, %zd) %ld != %d, p1 %p p2 %p", - n, impl->name, align1, align2, len1, len2, pos, size, r, result, p1, p2); - ret = 1; - } - } - } -} - -static void -check1 (void) -{ - CHAR *s1 = (CHAR *) (buf1 + 0xb2c); - CHAR *s2 = (CHAR *) (buf1 + 0xfd8); - size_t i, offset; - int exp_result; - - STRCPY(s1, L("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrs")); - STRCPY(s2, L("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkLMNOPQRSTUV")); - - /* Check possible overflow bug for wcsncmp */ - s1[4] = CHAR__MAX; - s2[4] = CHAR__MIN; - - for (offset = 0; offset < 6; offset++) - { - for (i = 0; i < 80; i++) - { - exp_result = SIMPLE_STRNCMP (s1 + offset, s2 + offset, i); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1 + offset, s2 + offset, i, exp_result); - } - } -} - -static void -check2 (void) -{ - size_t i; - CHAR *s1, *s2; - - s1 = (CHAR *) buf1; - for (i = 0; i < (page_size / CHARBYTES) - 1; i++) - s1[i] = 23; - s1[i] = 0; - - s2 = STRDUP (s1); - - for (i = 0; i < 64; ++i) - do_page_test ((3988 / CHARBYTES) + i, (2636 / CHARBYTES), s2); - - free (s2); -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - check1 (); - check2 (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i =0; i < 16; ++i) - { - do_test (0, 0, 8, i, 127, 0); - do_test (0, 0, 8, i, 127, -1); - do_test (0, 0, 8, i, 127, 1); - do_test (i, i, 8, i, 127, 0); - do_test (i, i, 8, i, 127, 1); - do_test (i, i, 8, i, 127, -1); - do_test (i, 2 * i, 8, i, 127, 0); - do_test (2 * i, i, 8, i, 127, 1); - do_test (i, 3 * i, 8, i, 127, -1); - do_test (0, 0, 8, i, 255, 0); - do_test (0, 0, 8, i, 255, -1); - do_test (0, 0, 8, i, 255, 1); - do_test (i, i, 8, i, 255, 0); - do_test (i, i, 8, i, 255, 1); - do_test (i, i, 8, i, 255, -1); - do_test (i, 2 * i, 8, i, 255, 0); - do_test (2 * i, i, 8, i, 255, 1); - do_test (i, 3 * i, 8, i, 255, -1); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 0, 8 << i, 16 << i, 127, 0); - do_test (0, 0, 8 << i, 16 << i, 127, 1); - do_test (0, 0, 8 << i, 16 << i, 127, -1); - do_test (0, 0, 8 << i, 16 << i, 255, 0); - do_test (0, 0, 8 << i, 16 << i, 255, 1); - do_test (0, 0, 8 << i, 16 << i, 255, -1); - do_test (8 - i, 2 * i, 8 << i, 16 << i, 127, 0); - do_test (8 - i, 2 * i, 8 << i, 16 << i, 127, 1); - do_test (2 * i, i, 8 << i, 16 << i, 255, 0); - do_test (2 * i, i, 8 << i, 16 << i, 255, 1); - } - - do_test_limit (0, 0, 0, 0, 127, 0); - do_test_limit (4, 0, 21, 20, 127, 0); - do_test_limit (0, 4, 21, 20, 127, 0); - do_test_limit (8, 0, 25, 24, 127, 0); - do_test_limit (0, 8, 25, 24, 127, 0); - - for (i = 0; i < 8; ++i) - { - do_test_limit (0, 0, 17 - i, 16 - i, 127, 0); - do_test_limit (0, 0, 17 - i, 16 - i, 255, 0); - do_test_limit (0, 0, 15 - i, 16 - i, 127, 0); - do_test_limit (0, 0, 15 - i, 16 - i, 127, 1); - do_test_limit (0, 0, 15 - i, 16 - i, 127, -1); - do_test_limit (0, 0, 15 - i, 16 - i, 255, 0); - do_test_limit (0, 0, 15 - i, 16 - i, 255, 1); - do_test_limit (0, 0, 15 - i, 16 - i, 255, -1); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strncpy.c b/string/test-strncpy.c deleted file mode 100644 index 43f9c236f1..0000000000 --- a/string/test-strncpy.c +++ /dev/null @@ -1,323 +0,0 @@ -/* Test strncpy functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifdef WIDE -# include <wchar.h> -# define CHAR wchar_t -# define UCHAR wchar_t -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -# define MEMCMP wmemcmp -# define MEMSET wmemset -# define STRNLEN wcsnlen -#else -# define CHAR char -# define UCHAR unsigned char -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -# define MEMCMP memcmp -# define MEMSET memset -# define STRNLEN strnlen -#endif /* !WIDE */ - - -#ifndef STRNCPY_RESULT -# define STRNCPY_RESULT(dst, len, n) dst -# define TEST_MAIN -# ifndef WIDE -# define TEST_NAME "strncpy" -# else -# define TEST_NAME "wcsncpy" -# endif /* WIDE */ -# include "test-string.h" -# ifndef WIDE -# define SIMPLE_STRNCPY simple_strncpy -# define STUPID_STRNCPY stupid_strncpy -# define STRNCPY strncpy -# else -# define SIMPLE_STRNCPY simple_wcsncpy -# define STUPID_STRNCPY stupid_wcsncpy -# define STRNCPY wcsncpy -# endif /* WIDE */ - -CHAR *SIMPLE_STRNCPY (CHAR *, const CHAR *, size_t); -CHAR *STUPID_STRNCPY (CHAR *, const CHAR *, size_t); - -IMPL (STUPID_STRNCPY, 0) -IMPL (SIMPLE_STRNCPY, 0) -IMPL (STRNCPY, 1) - -CHAR * -SIMPLE_STRNCPY (CHAR *dst, const CHAR *src, size_t n) -{ - CHAR *ret = dst; - while (n--) - if ((*dst++ = *src++) == '\0') - { - while (n--) - *dst++ = '\0'; - return ret; - } - return ret; -} - -CHAR * -STUPID_STRNCPY (CHAR *dst, const CHAR *src, size_t n) -{ - size_t nc = STRNLEN (src, n); - size_t i; - - for (i = 0; i < nc; ++i) - dst[i] = src[i]; - for (; i < n; ++i) - dst[i] = '\0'; - return dst; -} -#endif /* !STRNCPY_RESULT */ - -typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t); - -static void -do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t len, size_t n) -{ - if (CALL (impl, dst, src, n) != STRNCPY_RESULT (dst, len, n)) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - CALL (impl, dst, src, n), dst); - ret = 1; - return; - } - - if (memcmp (dst, src, (len > n ? n : len) * sizeof (CHAR)) != 0) - { - error (0, 0, "Wrong result in function %s", impl->name); - ret = 1; - return; - } - - if (n > len) - { - size_t i; - - for (i = len; i < n; ++i) - if (dst [i] != '\0') - { - error (0, 0, "Wrong result in function %s", impl->name); - ret = 1; - return; - } - } -} - -static void -do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char) -{ - size_t i; - CHAR *s1, *s2; - -/* For wcsncpy: align1 and align2 here mean alignment not in bytes, - but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)). */ - align1 &= 7; - if ((align1 + len) * sizeof (CHAR) >= page_size) - return; - - align2 &= 7; - if ((align2 + len) * sizeof (CHAR) >= page_size) - return; - - s1 = (CHAR *) (buf1) + align1; - s2 = (CHAR *) (buf2) + align2; - - for (i = 0; i < len; ++i) - s1[i] = 32 + 23 * i % (max_char - 32); - s1[len] = 0; - for (i = len + 1; (i + align1) * sizeof (CHAR) < page_size && i < len + 64; - ++i) - s1[i] = 32 + 32 * i % (max_char - 32); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s2, s1, len, n); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align1, align2, len, size, mode; - UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512; - UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512; - UCHAR *res; - - for (n = 0; n < ITERATIONS; n++) - { - /* For wcsncpy: align1 and align2 here mean align not in bytes, - but in wchar_ts, in bytes it will equal to align * (sizeof - (wchar_t)). */ - - mode = random (); - if (mode & 1) - { - size = random () & 255; - align1 = 512 - size - (random () & 15); - if (mode & 2) - align2 = align1 - (random () & 24); - else - align2 = align1 - (random () & 31); - if (mode & 4) - { - j = align1; - align1 = align2; - align2 = j; - } - if (mode & 8) - len = size - (random () & 31); - else - len = 512; - if (len >= 512) - len = random () & 511; - } - else - { - align1 = random () & 31; - if (mode & 2) - align2 = random () & 31; - else - align2 = align1 + (random () & 24); - len = random () & 511; - j = align1; - if (align2 > j) - j = align2; - if (mode & 4) - { - size = random () & 511; - if (size + j > 512) - size = 512 - j - (random () & 31); - } - else - size = 512 - j; - if ((mode & 8) && len + j >= 512) - len = 512 - j - (random () & 7); - } - j = len + align1 + 64; - if (j > 512) - j = 512; - for (i = 0; i < j; i++) - { - if (i == len + align1) - p1[i] = 0; - else - { - p1[i] = random () & BIG_CHAR; - if (i >= align1 && i < len + align1 && !p1[i]) - p1[i] = (random () & SMALL_CHAR) + 3; - } - } - - FOR_EACH_IMPL (impl, 1) - { - MEMSET (p2 - 64, '\1', 512 + 64); - res = (UCHAR *) CALL (impl, (CHAR *) (p2 + align2), - (CHAR *) (p1 + align1), size); - if (res != STRNCPY_RESULT (p2 + align2, len, size)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %zd, %zd) %p != %p", - n, impl->name, align1, align2, len, res, - STRNCPY_RESULT (p2 + align2, len, size)); - ret = 1; - } - for (j = 0; j < align2 + 64; ++j) - { - if (p2[j - 64] != '\1') - { - error (0, 0, "Iteration %zd - garbage before, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - j = align2 + len + 1; - if (size + align2 > j) - j = size + align2; - for (; j < 512; ++j) - { - if (p2[j] != '\1') - { - error (0, 0, "Iteration %zd - garbage after, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - } - for (j = align2 + len + 1; j < align2 + size; ++j) - if (p2[j]) - { - error (0, 0, "Iteration %zd - garbage after size, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - break; - } - j = len + 1; - if (size < j) - j = size; - if (MEMCMP (p1 + align1, p2 + align2, j)) - { - error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", - n, impl->name, align1, align2, len); - ret = 1; - } - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%28s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - do_test (i, i, 16, 16, SMALL_CHAR); - do_test (i, i, 16, 16, BIG_CHAR); - do_test (i, 2 * i, 16, 16, SMALL_CHAR); - do_test (2 * i, i, 16, 16, BIG_CHAR); - do_test (8 - i, 2 * i, 1 << i, 2 << i, SMALL_CHAR); - do_test (2 * i, 8 - i, 2 << i, 1 << i, SMALL_CHAR); - do_test (8 - i, 2 * i, 1 << i, 2 << i, BIG_CHAR); - do_test (2 * i, 8 - i, 2 << i, 1 << i, BIG_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 0, 4 << i, 8 << i, SMALL_CHAR); - do_test (0, 0, 16 << i, 8 << i, SMALL_CHAR); - do_test (8 - i, 2 * i, 4 << i, 8 << i, SMALL_CHAR); - do_test (8 - i, 2 * i, 16 << i, 8 << i, SMALL_CHAR); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strnlen.c b/string/test-strnlen.c deleted file mode 100644 index e56cdb6708..0000000000 --- a/string/test-strnlen.c +++ /dev/null @@ -1,248 +0,0 @@ -/* Test strlen functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "strnlen" -#else -# define TEST_NAME "wcsnlen" -#endif /* !WIDE */ -#include "test-string.h" - -#ifndef WIDE -# define STRNLEN strnlen -# define CHAR char -# define BIG_CHAR CHAR_MAX -# define MIDDLE_CHAR 127 -# define SIMPLE_STRNLEN simple_strnlen -#else -# include <wchar.h> -# define STRNLEN wcsnlen -# define CHAR wchar_t -# define BIG_CHAR WCHAR_MAX -# define MIDDLE_CHAR 1121 -# define SIMPLE_STRNLEN simple_wcsnlen -#endif /* !WIDE */ - -typedef size_t (*proto_t) (const CHAR *, size_t); -size_t SIMPLE_STRNLEN (const CHAR *, size_t); - -IMPL (SIMPLE_STRNLEN, 0) -IMPL (STRNLEN, 1) - -size_t -SIMPLE_STRNLEN (const CHAR *s, size_t maxlen) -{ - size_t i; - - for (i = 0; i < maxlen && s[i]; ++i); - return i; -} - -static void -do_one_test (impl_t *impl, const CHAR *s, size_t maxlen, size_t exp_len) -{ - size_t len = CALL (impl, s, maxlen); - if (len != exp_len) - { - error (0, 0, "Wrong result in function %s %zd %zd", impl->name, - len, exp_len); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t len, size_t maxlen, int max_char) -{ - size_t i; - - align &= 63; - if ((align + len) * sizeof (CHAR) >= page_size) - return; - - CHAR *buf = (CHAR *) (buf1); - - for (i = 0; i < len; ++i) - buf[align + i] = 1 + 11111 * i % max_char; - buf[align + len] = 0; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (CHAR *) (buf + align), maxlen, MIN (len, maxlen)); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, len; - CHAR *p = (CHAR *) (buf1 + page_size - 512 * sizeof (CHAR)); - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - len = random () & 511; - if (len + align > 510) - len = 511 - align - (random () & 7); - j = len + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == len + align) - p[i] = 0; - else - { - p[i] = random () & 255; - if (i >= align && i < len + align && !p[i]) - p[i] = (random () & 127) + 1; - } - } - - FOR_EACH_IMPL (impl, 1) - { - if (len > 0 - && CALL (impl, (CHAR *) (p + align), len - 1) != len - 1) - { - error (0, 0, "Iteration %zd (limited) - wrong result in function %s (%zd) %zd != %zd, p %p", - n, impl->name, align, - CALL (impl, (CHAR *) (p + align), len - 1), len - 1, p); - ret = 1; - } - if (CALL (impl, (CHAR *) (p + align), len) != len) - { - error (0, 0, "Iteration %zd (exact) - wrong result in function %s (%zd) %zd != %zd, p %p", - n, impl->name, align, - CALL (impl, (CHAR *) (p + align), len), len, p); - ret = 1; - } - if (CALL (impl, (CHAR *) (p + align), len + 1) != len) - { - error (0, 0, "Iteration %zd (long) - wrong result in function %s (%zd) %zd != %zd, p %p", - n, impl->name, align, - CALL (impl, (CHAR *) (p + align), len + 1), len, p); - ret = 1; - } - } - } -} - -/* Tests meant to unveil fail on implementation that does not access bytes - around the page boundary accordingly. */ -static void -do_page_tests (void) -{ - size_t i, exp_len, start_offset, offset; - /* Calculate the null character offset. */ - size_t last_offset = (page_size / sizeof (CHAR)) - 1; - - CHAR *s = (CHAR *) buf2; - memset (s, 65, (last_offset - 1)); - s[last_offset] = 0; - - /* Place short strings ending at page boundary. */ - offset = last_offset; - for (i = 0; i < 128; i++) - { - /* Decrease offset to stress several sizes and alignments. */ - offset--; - exp_len = last_offset - offset; - FOR_EACH_IMPL (impl, 0) - { - /* Varies maxlen value to cover the cases where it is: - - larger than length; - - slightly greater than length; - - equal to length; - - slightly less than length. */ - do_one_test (impl, (CHAR *) (s + offset), page_size, exp_len); - do_one_test (impl, (CHAR *) (s + offset), exp_len + 1, exp_len); - do_one_test (impl, (CHAR *) (s + offset), exp_len, exp_len); - if (exp_len > 0) - do_one_test (impl, (CHAR *) (s + offset), exp_len - 1, exp_len - 1); - } - } - - /* Place long strings ending at page boundary. */ - start_offset = (last_offset + 1) / 2; - for (i = 0; i < 64; ++i) - { - /* Increase offset to stress several alignments. */ - offset = start_offset + i; - if (offset >= (last_offset + 1)) - break; - exp_len = last_offset - offset; - FOR_EACH_IMPL (impl, 0) - { - /* Checks only for maxlen much larger than length because smaller - values are already covered in do_random_tests function. */ - do_one_test (impl, (CHAR *) (s + offset), page_size, exp_len); - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - do_test (0, i, i - 1, MIDDLE_CHAR); - do_test (0, i, i, MIDDLE_CHAR); - do_test (0, i, i + 1, MIDDLE_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, i, i - 1, MIDDLE_CHAR); - do_test (i, i, i, MIDDLE_CHAR); - do_test (i, i, i + 1, MIDDLE_CHAR); - } - - for (i = 2; i <= 10; ++i) - { - do_test (0, 1 << i, 5000, MIDDLE_CHAR); - do_test (1, 1 << i, 5000, MIDDLE_CHAR); - } - - for (i = 1; i < 8; ++i) - do_test (0, i, 5000, BIG_CHAR); - - for (i = 1; i < 8; ++i) - do_test (i, i, 5000, BIG_CHAR); - - for (i = 2; i <= 10; ++i) - { - do_test (0, 1 << i, 5000, BIG_CHAR); - do_test (1, 1 << i, 5000, BIG_CHAR); - } - - do_random_tests (); - do_page_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strpbrk.c b/string/test-strpbrk.c deleted file mode 100644 index 4d680ab354..0000000000 --- a/string/test-strpbrk.c +++ /dev/null @@ -1,267 +0,0 @@ -/* Test and measure strpbrk functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef WIDE -# define CHAR char -# define UCHAR unsigned char -# define STRLEN strlen -# define STRCHR strchr -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -#else -# include <wchar.h> -# define CHAR wchar_t -# define UCHAR wchar_t -# define STRLEN wcslen -# define STRCHR wcschr -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -#endif /* WIDE */ - -#ifndef STRPBRK_RESULT -# define STRPBRK_RESULT(s, pos) ((s)[(pos)] ? (s) + (pos) : NULL) -# define RES_TYPE CHAR * -# define TEST_MAIN -# ifndef WIDE -# define TEST_NAME "strpbrk" -# else -# define TEST_NAME "wcspbrk" -# endif /* WIDE */ -# include "test-string.h" - -# ifndef WIDE -# define STRPBRK strpbrk -# define SIMPLE_STRPBRK simple_strpbrk -# define STUPID_STRPBRK stupid_strpbrk -# else -# include <wchar.h> -# define STRPBRK wcspbrk -# define SIMPLE_STRPBRK simple_wcspbrk -# define STUPID_STRPBRK stupid_wcspbrk -# endif /* WIDE */ - -typedef CHAR *(*proto_t) (const CHAR *, const CHAR *); -CHAR *SIMPLE_STRPBRK (const CHAR *, const CHAR *); -CHAR *STUPID_STRPBRK (const CHAR *, const CHAR *); - -IMPL (STUPID_STRPBRK, 0) -IMPL (SIMPLE_STRPBRK, 0) -IMPL (STRPBRK, 1) - -CHAR * -SIMPLE_STRPBRK (const CHAR *s, const CHAR *rej) -{ - const CHAR *r; - CHAR c; - - while ((c = *s++) != '\0') - for (r = rej; *r != '\0'; ++r) - if (*r == c) - return (CHAR *) s - 1; - return NULL; -} - -CHAR * -STUPID_STRPBRK (const CHAR *s, const CHAR *rej) -{ - size_t ns = STRLEN (s), nrej = STRLEN (rej); - size_t i, j; - - for (i = 0; i < ns; ++i) - for (j = 0; j < nrej; ++j) - if (s[i] == rej[j]) - return (CHAR *) s + i; - return NULL; -} -#endif /* !STRPBRK_RESULT */ - -static void -do_one_test (impl_t *impl, const CHAR *s, const CHAR *rej, RES_TYPE exp_res) -{ - RES_TYPE res = CALL (impl, s, rej); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - (void *) res, (void *) exp_res); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t pos, size_t len) -{ - size_t i; - int c; - RES_TYPE result; - CHAR *rej, *s; - - align &= 7; - if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240) - return; - - rej = (CHAR *) (buf2) + (random () & 255); - s = (CHAR *) (buf1) + align; - - for (i = 0; i < len; ++i) - { - rej[i] = random () & BIG_CHAR; - if (!rej[i]) - rej[i] = random () & BIG_CHAR; - if (!rej[i]) - rej[i] = 1 + (random () & SMALL_CHAR); - } - rej[len] = '\0'; - for (c = 1; c <= BIG_CHAR; ++c) - if (STRCHR (rej, c) == NULL) - break; - - for (i = 0; i < pos; ++i) - { - s[i] = random () & BIG_CHAR; - if (STRCHR (rej, s[i])) - { - s[i] = random () & BIG_CHAR; - if (STRCHR (rej, s[i])) - s[i] = c; - } - } - s[pos] = rej[random () % (len + 1)]; - if (s[pos]) - { - for (i = pos + 1; i < pos + 10; ++i) - s[i] = random () & BIG_CHAR; - s[i] = '\0'; - } - result = STRPBRK_RESULT (s, pos); - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s, rej, result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, len, rlen; - RES_TYPE result; - int c; - UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; - UCHAR *rej; - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - pos = random () & 511; - if (pos + align >= 511) - pos = 510 - align - (random () & 7); - len = random () & 511; - if (pos >= len && (random () & 1)) - len = pos + 1 + (random () & 7); - if (len + align >= 512) - len = 511 - align - (random () & 7); - if (random () & 1) - rlen = random () & 63; - else - rlen = random () & 15; - rej = (UCHAR *) (buf2 + page_size) - rlen - 1 - (random () & 7); - for (i = 0; i < rlen; ++i) - { - rej[i] = random () & BIG_CHAR; - if (!rej[i]) - rej[i] = random () & BIG_CHAR; - if (!rej[i]) - rej[i] = 1 + (random () & SMALL_CHAR); - } - rej[i] = '\0'; - for (c = 1; c <= BIG_CHAR; ++c) - if (STRCHR ((CHAR *) rej, c) == NULL) - break; - j = (pos > len ? pos : len) + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == len + align) - p[i] = '\0'; - else if (i == pos + align) - p[i] = rej[random () % (rlen + 1)]; - else if (i < align || i > pos + align) - p[i] = random () & BIG_CHAR; - else - { - p[i] = random () & BIG_CHAR; - if (STRCHR ((CHAR *) rej, p[i])) - { - p[i] = random () & BIG_CHAR; - if (STRCHR ((CHAR *) rej, p[i])) - p[i] = c; - } - } - } - - result = STRPBRK_RESULT ((CHAR *) (p + align), pos < len ? pos : len); - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (CHAR *) (p + align), (CHAR *) rej) != result) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %p, %zd, %zd, %zd) %p != %p", - n, impl->name, align, rej, rlen, pos, len, - (void *) CALL (impl, (CHAR *) (p + align), (CHAR *) rej), - (void *) result); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%32s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < 32; ++i) - { - do_test (0, 512, i); - do_test (i, 512, i); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 16 << i, 4); - do_test (i, 16 << i, 4); - } - - for (i = 1; i < 8; ++i) - do_test (i, 64, 10); - - for (i = 0; i < 64; ++i) - do_test (0, i, 6); - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strrchr.c b/string/test-strrchr.c deleted file mode 100644 index 10c070aef1..0000000000 --- a/string/test-strrchr.c +++ /dev/null @@ -1,247 +0,0 @@ -/* Test and measure STRCHR functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - Added wcsrrchr support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, - 2011. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifdef WIDE -# define TEST_NAME "wcsrchr" -#else -# define TEST_NAME "strrchr" -#endif -#include "test-string.h" - -#ifdef WIDE -# include <wchar.h> -# define SIMPLE_STRRCHR simple_wcsrchr -# define STRRCHR wcsrchr -# define CHAR wchar_t -# define UCHAR wchar_t -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -#else -# define SIMPLE_STRRCHR simple_strrchr -# define STRRCHR strrchr -# define CHAR char -# define UCHAR unsigned char -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -#endif - -typedef CHAR *(*proto_t) (const CHAR *, int); -CHAR *SIMPLE_STRRCHR (const CHAR *, int); - -IMPL (SIMPLE_STRRCHR, 0) -IMPL (STRRCHR, 1) - -CHAR * -SIMPLE_STRRCHR (const CHAR *s, int c) -{ - const CHAR *ret = NULL; - - for (; *s != '\0'; ++s) - if (*s == (CHAR) c) - ret = s; - - return (CHAR *) (c == '\0' ? s : ret); -} - -static void -do_one_test (impl_t *impl, const CHAR *s, int c, CHAR *exp_res) -{ - CHAR *res = CALL (impl, s, c); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - res, exp_res); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t pos, size_t len, int seek_char, int max_char) -/* For wcsrchr: align here means align not in bytes, - but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) - len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ -{ - size_t i; - CHAR *result; - CHAR *buf = (CHAR *) buf1; - - align &= 7; - if ( (align + len) * sizeof(CHAR) >= page_size) - return; - - for (i = 0; i < len; ++i) - { - buf[align + i] = (random () * random ()) & max_char; - if (!buf[align + i]) - buf[align + i] = (random () * random ()) & max_char; - if (!buf[align + i]) - buf[align + i] = 1; - if ((i > pos || pos >= len) && buf[align + i] == seek_char) - buf[align + i] = seek_char + 10 + (random () & 15); - } - buf[align + len] = 0; - - if (pos < len) - { - buf[align + pos] = seek_char; - result = (CHAR *) (buf + align + pos); - } - else if (seek_char == 0) - result = (CHAR *) (buf + align + len); - else - result = NULL; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, (CHAR *) (buf + align), seek_char, result); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, len; - int seek_char; - CHAR *result; - UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & (63 / sizeof(CHAR)); - /* For wcsrchr: align here means align not in bytes, but in wchar_ts, - in bytes it will equal to align * (sizeof (wchar_t)). - For strrchr we need to check all alignments from 0 to 63 since - some assembly implementations have separate prolog for alignments - more 48. */ - pos = random () & 511; - if (pos + align >= 511) - pos = 510 - align - (random () & 7); - len = random () & 511; - /* len for wcschr here isn't in bytes but it's number of wchar_t - symbols. */ - if (pos >= len) - len = pos + (random () & 7); - if (len + align >= 512) - len = 511 - align - (random () & 7); - seek_char = random () & 255; - if (seek_char && pos == len) - { - if (pos) - --pos; - else - ++len; - } - j = len + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == pos + align) - p[i] = seek_char; - else if (i == len + align) - p[i] = 0; - else - { - p[i] = random () & 255; - if (((i > pos + align && i < len + align) || pos > len) - && p[i] == seek_char) - p[i] = seek_char + 13; - if (i < len + align && !p[i]) - { - p[i] = seek_char - 13; - if (!p[i]) - p[i] = 140; - } - } - } - - if (pos <= len) - result = (CHAR *) (p + pos + align); - else if (seek_char == 0) - result = (CHAR *) (p + len + align); - else - result = NULL; - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (CHAR *) (p + align), seek_char) != result) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd, %zd) %p != %p, p %p", - n, impl->name, align, seek_char, len, pos, - CALL (impl, (CHAR *) (p + align), seek_char), result, p); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%20s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 1; i < 8; ++i) - { - do_test (0, 16 << i, 2048, 23, SMALL_CHAR); - do_test (i, 16 << i, 2048, 23, SMALL_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 64, 256, 23, SMALL_CHAR); - do_test (i, 64, 256, 23, BIG_CHAR); - } - - for (i = 0; i < 32; ++i) - { - do_test (0, i, i + 1, 23, SMALL_CHAR); - do_test (0, i, i + 1, 23, BIG_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 16 << i, 2048, 0, SMALL_CHAR); - do_test (i, 16 << i, 2048, 0, SMALL_CHAR); - } - - for (i = 1; i < 8; ++i) - { - do_test (i, 64, 256, 0, SMALL_CHAR); - do_test (i, 64, 256, 0, BIG_CHAR); - } - - for (i = 0; i < 32; ++i) - { - do_test (0, i, i + 1, 0, SMALL_CHAR); - do_test (0, i, i + 1, 0, BIG_CHAR); - } - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strspn.c b/string/test-strspn.c deleted file mode 100644 index d26331fb6d..0000000000 --- a/string/test-strspn.c +++ /dev/null @@ -1,245 +0,0 @@ -/* Test and measure strspn functions. - Copyright (C) 1999-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Jakub Jelinek <jakub@redhat.com>, 1999. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#ifndef WIDE -# define TEST_NAME "strspn" -#else -# define TEST_NAME "wcsspn" -#endif /* WIDE */ -#include "test-string.h" - -#ifndef WIDE -# define STRSPN strspn -# define CHAR char -# define UCHAR unsigned char -# define SIMPLE_STRSPN simple_strspn -# define STUPID_STRSPN stupid_strspn -# define STRLEN strlen -# define STRCHR strchr -# define BIG_CHAR CHAR_MAX -# define SMALL_CHAR 127 -#else -# include <wchar.h> -# define STRSPN wcsspn -# define CHAR wchar_t -# define UCHAR wchar_t -# define SIMPLE_STRSPN simple_wcsspn -# define STUPID_STRSPN stupid_wcsspn -# define STRLEN wcslen -# define STRCHR wcschr -# define BIG_CHAR WCHAR_MAX -# define SMALL_CHAR 1273 -#endif /* WIDE */ - -typedef size_t (*proto_t) (const CHAR *, const CHAR *); -size_t SIMPLE_STRSPN (const CHAR *, const CHAR *); -size_t STUPID_STRSPN (const CHAR *, const CHAR *); - -IMPL (STUPID_STRSPN, 0) -IMPL (SIMPLE_STRSPN, 0) -IMPL (STRSPN, 1) - -size_t -SIMPLE_STRSPN (const CHAR *s, const CHAR *acc) -{ - const CHAR *r, *str = s; - CHAR c; - - while ((c = *s++) != '\0') - { - for (r = acc; *r != '\0'; ++r) - if (*r == c) - break; - if (*r == '\0') - return s - str - 1; - } - return s - str - 1; -} - -size_t -STUPID_STRSPN (const CHAR *s, const CHAR *acc) -{ - size_t ns = STRLEN (s), nacc = STRLEN (acc); - size_t i, j; - - for (i = 0; i < ns; ++i) - { - for (j = 0; j < nacc; ++j) - if (s[i] == acc[j]) - break; - if (j == nacc) - return i; - } - return i; -} - -static void -do_one_test (impl_t *impl, const CHAR *s, const CHAR *acc, size_t exp_res) -{ - size_t res = CALL (impl, s, acc); - if (res != exp_res) - { - error (0, 0, "Wrong result in function %s %p %p", impl->name, - (void *) res, (void *) exp_res); - ret = 1; - return; - } -} - -static void -do_test (size_t align, size_t pos, size_t len) -{ - size_t i; - CHAR *acc, *s; - - align &= 7; - if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240 || ! len) - return; - - acc = (CHAR *) (buf2) + (random () & 255); - s = (CHAR *) (buf1) + align; - - for (i = 0; i < len; ++i) - { - acc[i] = random () & BIG_CHAR; - if (!acc[i]) - acc[i] = random () & BIG_CHAR; - if (!acc[i]) - acc[i] = 1 + (random () & SMALL_CHAR); - } - acc[len] = '\0'; - - for (i = 0; i < pos; ++i) - s[i] = acc[random () % len]; - s[pos] = random () & BIG_CHAR; - if (STRCHR (acc, s[pos])) - s[pos] = '\0'; - else - { - for (i = pos + 1; i < pos + 10; ++i) - s[i] = random () & BIG_CHAR; - s[i] = '\0'; - } - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s, acc, pos); -} - -static void -do_random_tests (void) -{ - size_t i, j, n, align, pos, alen, len; - UCHAR *p = (UCHAR *) (buf1 + page_size) - 512; - UCHAR *acc; - - for (n = 0; n < ITERATIONS; n++) - { - align = random () & 15; - if (random () & 1) - alen = random () & 63; - else - alen = random () & 15; - if (!alen) - pos = 0; - else - pos = random () & 511; - if (pos + align >= 511) - pos = 510 - align - (random () & 7); - len = random () & 511; - if (len + align >= 512) - len = 511 - align - (random () & 7); - acc = (UCHAR *) (buf2 + page_size) - alen - 1 - (random () & 7); - for (i = 0; i < alen; ++i) - { - acc[i] = random () & BIG_CHAR; - if (!acc[i]) - acc[i] = random () & BIG_CHAR; - if (!acc[i]) - acc[i] = 1 + (random () & SMALL_CHAR); - } - acc[i] = '\0'; - j = (pos > len ? pos : len) + align + 64; - if (j > 512) - j = 512; - - for (i = 0; i < j; i++) - { - if (i == len + align) - p[i] = '\0'; - else if (i == pos + align) - { - p[i] = random () & BIG_CHAR; - if (STRCHR ((CHAR *) acc, p[i])) - p[i] = '\0'; - } - else if (i < align || i > pos + align) - p[i] = random () & BIG_CHAR; - else - p[i] = acc [random () % alen]; - } - - FOR_EACH_IMPL (impl, 1) - if (CALL (impl, (CHAR *) (p + align), - (CHAR *) acc) != (pos < len ? pos : len)) - { - error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %p, %zd, %zd, %zd) %zd != %zd", - n, impl->name, align, acc, alen, pos, len, - CALL (impl, (CHAR *) (p + align), (CHAR *) acc), - (pos < len ? pos : len)); - ret = 1; - } - } -} - -int -test_main (void) -{ - size_t i; - - test_init (); - - printf ("%32s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (i = 0; i < 32; ++i) - { - do_test (0, 512, i); - do_test (i, 512, i); - } - - for (i = 1; i < 8; ++i) - { - do_test (0, 16 << i, 4); - do_test (i, 16 << i, 4); - } - - for (i = 1; i < 8; ++i) - do_test (i, 64, 10); - - for (i = 0; i < 64; ++i) - do_test (0, i, 6); - - do_random_tests (); - return ret; -} - -#include <support/test-driver.c> diff --git a/string/test-strstr.c b/string/test-strstr.c deleted file mode 100644 index 33f221149a..0000000000 --- a/string/test-strstr.c +++ /dev/null @@ -1,212 +0,0 @@ -/* Test and measure strstr functions. - Copyright (C) 2010-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Written by Ulrich Drepper <drepper@redhat.com>, 2010. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#define TEST_NAME "strstr" -#include "test-string.h" - - -#define STRSTR simple_strstr -#define libc_hidden_builtin_def(arg) /* nothing */ -#include "strstr.c" - - -static char * -stupid_strstr (const char *s1, const char *s2) -{ - ssize_t s1len = strlen (s1); - ssize_t s2len = strlen (s2); - - if (s2len > s1len) - return NULL; - - for (ssize_t i = 0; i <= s1len - s2len; ++i) - { - size_t j; - for (j = 0; j < s2len; ++j) - if (s1[i + j] != s2[j]) - break; - if (j == s2len) - return (char *) s1 + i; - } - - return NULL; -} - - -typedef char *(*proto_t) (const char *, const char *); - -IMPL (stupid_strstr, 0) -IMPL (simple_strstr, 0) -IMPL (strstr, 1) - - -static int -check_result (impl_t *impl, const char *s1, const char *s2, - char *exp_result) -{ - char *result = CALL (impl, s1, s2); - if (result != exp_result) - { - error (0, 0, "Wrong result in function %s %s %s", impl->name, - result, exp_result); - ret = 1; - return -1; - } - - return 0; -} - -static void -do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) -{ - if (check_result (impl, s1, s2, exp_result) < 0) - return; -} - - -static void -do_test (size_t align1, size_t align2, size_t len1, size_t len2, - int fail) -{ - char *s1 = (char *) (buf1 + align1); - char *s2 = (char *) (buf2 + align2); - - static const char d[] = "1234567890abcdef"; -#define dl (sizeof (d) - 1) - char *ss2 = s2; - for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) - { - size_t t = l > dl ? dl : l; - ss2 = mempcpy (ss2, d, t); - } - s2[len2] = '\0'; - - if (fail) - { - char *ss1 = s1; - for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) - { - size_t t = l > dl ? dl : l; - memcpy (ss1, d, t); - ++ss1[len2 > 7 ? 7 : len2 - 1]; - ss1 += t; - } - } - else - { - memset (s1, '0', len1); - memcpy (s1 + len1 - len2, s2, len2); - } - s1[len1] = '\0'; - - FOR_EACH_IMPL (impl, 0) - do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); - -} - -static void -check1 (void) -{ - const char s1[] = - "F_BD_CE_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_88_20_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_A7_20_EF_BF_BD"; - const char s2[] = "_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD"; - char *exp_result; - - exp_result = stupid_strstr (s1, s2); - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1, s2, exp_result); -} - -static void -check2 (void) -{ - const char s1[] = ", enable_static, \0, enable_shared, "; - char *exp_result; - char *s2 = (void *) buf1 + page_size - 18; - - strcpy (s2, s1); - exp_result = stupid_strstr (s1, s1 + 18); - FOR_EACH_IMPL (impl, 0) - { - check_result (impl, s1, s1 + 18, exp_result); - check_result (impl, s2, s1 + 18, exp_result); - } -} - -static int -test_main (void) -{ - test_init (); - - check1 (); - check2 (); - - printf ("%23s", ""); - FOR_EACH_IMPL (impl, 0) - printf ("\t%s", impl->name); - putchar ('\n'); - - for (size_t klen = 2; klen < 32; ++klen) - for (size_t hlen = 2 * klen; hlen < 16 * klen; hlen += klen) - { - do_test (0, 0, hlen, klen, 0); - do_test (0, 0, hlen, klen, 1); - do_test (0, 3, hlen, klen, 0); - do_test (0, 3, hlen, klen, 1); - do_test (0, 9, hlen, klen, 0); - do_test (0, 9, hlen, klen, 1); - do_test (0, 15, hlen, klen, 0); - do_test (0, 15, hlen, klen, 1); - - do_test (3, 0, hlen, klen, 0); - do_test (3, 0, hlen, klen, 1); - do_test (3, 3, hlen, klen, 0); - do_test (3, 3, hlen, klen, 1); - do_test (3, 9, hlen, klen, 0); - do_test (3, 9, hlen, klen, 1); - do_test (3, 15, hlen, klen, 0); - do_test (3, 15, hlen, klen, 1); - - do_test (9, 0, hlen, klen, 0); - do_test (9, 0, hlen, klen, 1); - do_test (9, 3, hlen, klen, 0); - do_test (9, 3, hlen, klen, 1); - do_test (9, 9, hlen, klen, 0); - do_test (9, 9, hlen, klen, 1); - do_test (9, 15, hlen, klen, 0); - do_test (9, 15, hlen, klen, 1); - - do_test (15, 0, hlen, klen, 0); - do_test (15, 0, hlen, klen, 1); - do_test (15, 3, hlen, klen, 0); - do_test (15, 3, hlen, klen, 1); - do_test (15, 9, hlen, klen, 0); - do_test (15, 9, hlen, klen, 1); - do_test (15, 15, hlen, klen, 0); - do_test (15, 15, hlen, klen, 1); - } - - do_test (0, 0, page_size - 1, 16, 0); - do_test (0, 0, page_size - 1, 16, 1); - - return ret; -} - -#include <support/test-driver.c> diff --git a/string/testcopy.c b/string/testcopy.c deleted file mode 100644 index 8c9dd4c500..0000000000 --- a/string/testcopy.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (C) 1990-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <malloc.h> - -int -main (void) -{ - char *mem, *memp; - char *rand_mem; - char *lo_around, *hi_around; - int size, max_size; - int src_off, dst_off; - int i; - int space_around = 10; - - max_size = 256; - - mem = malloc (max_size + 2 * max_size + 2 * space_around); - rand_mem = malloc (max_size); - lo_around = malloc (space_around); - hi_around = malloc (space_around); - memp = mem + space_around; - - /* Fill RAND_MEM with random bytes, each non-zero. */ - for (i = 0; i < max_size; i++) - { - int x; - do - x = random (); - while (x == 0); - rand_mem[i] = x; - } - - for (size = 0; size < max_size; size++) - { - printf("phase %d\n", size); - for (src_off = 0; src_off <= 16; src_off++) - { - for (dst_off = 0; dst_off <= 16; dst_off++) - { - /* Put zero around the intended destination, to check - that it's not clobbered. */ - for (i = 1; i < space_around; i++) - { - memp[dst_off - i] = 0; - memp[dst_off + size - 1 + i] = 0; - } - - /* Fill the source area with known contents. */ - for (i = 0; i < size; i++) - memp[src_off + i] = rand_mem[i]; - - /* Remember the contents around the destination area. - (It might not be what we wrote some lines above, since - the src area and the dst area overlap.) */ - for (i = 1; i < space_around; i++) - { - lo_around[i] = memp[dst_off - i]; - hi_around[i] = memp[dst_off + size - 1 + i]; - } - - memmove (memp + dst_off, memp + src_off, size); - - /* Check that the destination area has the same - contents we wrote to the source area. */ - for (i = 0; i < size; i++) - { - if (memp[dst_off + i] != rand_mem[i]) - abort (); - } - - /* Check that the area around the destination is not - clobbered. */ - for (i = 1; i < space_around; i++) - { - if (memp[dst_off - i] != lo_around[i]) - abort (); - if (memp[dst_off + size - 1 + i] != hi_around[i]) - abort (); - } - } - } - } - - puts ("Test succeeded."); - - return 0; -} diff --git a/string/tester.c b/string/tester.c deleted file mode 100644 index 4b928b4f5e..0000000000 --- a/string/tester.c +++ /dev/null @@ -1,1685 +0,0 @@ -/* Tester for string functions. - Copyright (C) 1995-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -/* Make sure we don't test the optimized inline functions if we want to - test the real implementation. */ -#if !defined DO_STRING_INLINES -#undef __USE_STRING_INLINES -#endif - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <fcntl.h> -#include <libc-diag.h> - - -#define STREQ(a, b) (strcmp((a), (b)) == 0) - -const char *it = "<UNSET>"; /* Routine name for message routines. */ -size_t errors = 0; - -/* Complain if condition is not true. */ -static void -check (int thing, int number) -{ - if (!thing) - { - printf ("%s flunked test %d\n", it, number); - ++errors; - } -} - -/* Complain if first two args don't strcmp as equal. */ -static void -equal (const char *a, const char *b, int number) -{ - check (a != NULL && b != NULL && STREQ (a, b), number); -} - -char one[50]; -char two[50]; -char *cp; - -static void -test_strcmp (void) -{ - it = "strcmp"; - check (strcmp ("", "") == 0, 1); /* Trivial case. */ - check (strcmp ("a", "a") == 0, 2); /* Identity. */ - check (strcmp ("abc", "abc") == 0, 3); /* Multicharacter. */ - check (strcmp ("abc", "abcd") < 0, 4); /* Length mismatches. */ - check (strcmp ("abcd", "abc") > 0, 5); - check (strcmp ("abcd", "abce") < 0, 6); /* Honest miscompares. */ - check (strcmp ("abce", "abcd") > 0, 7); - check (strcmp ("a\203", "a") > 0, 8); /* Tricky if char signed. */ - check (strcmp ("a\203", "a\003") > 0, 9); - - { - char buf1[0x40], buf2[0x40]; - int i, j; - for (i=0; i < 0x10; i++) - for (j = 0; j < 0x10; j++) - { - int k; - for (k = 0; k < 0x3f; k++) - { - buf1[k] = '0' ^ (k & 4); - buf2[k] = '4' ^ (k & 4); - } - buf1[i] = buf1[0x3f] = 0; - buf2[j] = buf2[0x3f] = 0; - for (k = 0; k < 0xf; k++) - { - int cnum = 0x10+0x10*k+0x100*j+0x1000*i; - check (strcmp (buf1+i,buf2+j) == 0, cnum); - buf1[i+k] = 'A' + i + k; - buf1[i+k+1] = 0; - check (strcmp (buf1+i,buf2+j) > 0, cnum+1); - check (strcmp (buf2+j,buf1+i) < 0, cnum+2); - buf2[j+k] = 'B' + i + k; - buf2[j+k+1] = 0; - check (strcmp (buf1+i,buf2+j) < 0, cnum+3); - check (strcmp (buf2+j,buf1+i) > 0, cnum+4); - buf2[j+k] = 'A' + i + k; - buf1[i] = 'A' + i + 0x80; - check (strcmp (buf1+i,buf2+j) > 0, cnum+5); - check (strcmp (buf2+j,buf1+i) < 0, cnum+6); - buf1[i] = 'A' + i; - } - } - } -} - -#define SIMPLE_COPY(fn, n, str, ntest) \ - do { \ - int __n; \ - char *cp; \ - for (__n = 0; __n < (int) sizeof (one); ++__n) \ - one[__n] = 'Z'; \ - fn (one, str); \ - for (cp = one, __n = 0; __n < n; ++__n, ++cp) \ - check (*cp == '0' + (n % 10), ntest); \ - check (*cp == '\0', ntest); \ - } while (0) - -static void -test_strcpy (void) -{ - int i; - it = "strcpy"; - check (strcpy (one, "abcd") == one, 1); /* Returned value. */ - equal (one, "abcd", 2); /* Basic test. */ - - (void) strcpy (one, "x"); - equal (one, "x", 3); /* Writeover. */ - equal (one+2, "cd", 4); /* Wrote too much? */ - - (void) strcpy (two, "hi there"); - (void) strcpy (one, two); - equal (one, "hi there", 5); /* Basic test encore. */ - equal (two, "hi there", 6); /* Stomped on source? */ - - (void) strcpy (one, ""); - equal (one, "", 7); /* Boundary condition. */ - - for (i = 0; i < 16; i++) - { - (void) strcpy (one + i, "hi there"); /* Unaligned destination. */ - equal (one + i, "hi there", 8 + (i * 2)); - (void) strcpy (two, one + i); /* Unaligned source. */ - equal (two, "hi there", 9 + (i * 2)); - } - - SIMPLE_COPY(strcpy, 0, "", 41); - SIMPLE_COPY(strcpy, 1, "1", 42); - SIMPLE_COPY(strcpy, 2, "22", 43); - SIMPLE_COPY(strcpy, 3, "333", 44); - SIMPLE_COPY(strcpy, 4, "4444", 45); - SIMPLE_COPY(strcpy, 5, "55555", 46); - SIMPLE_COPY(strcpy, 6, "666666", 47); - SIMPLE_COPY(strcpy, 7, "7777777", 48); - SIMPLE_COPY(strcpy, 8, "88888888", 49); - SIMPLE_COPY(strcpy, 9, "999999999", 50); - SIMPLE_COPY(strcpy, 10, "0000000000", 51); - SIMPLE_COPY(strcpy, 11, "11111111111", 52); - SIMPLE_COPY(strcpy, 12, "222222222222", 53); - SIMPLE_COPY(strcpy, 13, "3333333333333", 54); - SIMPLE_COPY(strcpy, 14, "44444444444444", 55); - SIMPLE_COPY(strcpy, 15, "555555555555555", 56); - SIMPLE_COPY(strcpy, 16, "6666666666666666", 57); - - /* Simple test using implicitly coerced `void *' arguments. */ - const void *src = "frobozz"; - void *dst = one; - check (strcpy (dst, src) == dst, 1); - equal (dst, "frobozz", 2); -} - -static void -test_stpcpy (void) -{ - it = "stpcpy"; - check ((stpcpy (one, "a") - one) == 1, 1); - equal (one, "a", 2); - - check ((stpcpy (one, "ab") - one) == 2, 3); - equal (one, "ab", 4); - - check ((stpcpy (one, "abc") - one) == 3, 5); - equal (one, "abc", 6); - - check ((stpcpy (one, "abcd") - one) == 4, 7); - equal (one, "abcd", 8); - - check ((stpcpy (one, "abcde") - one) == 5, 9); - equal (one, "abcde", 10); - - check ((stpcpy (one, "abcdef") - one) == 6, 11); - equal (one, "abcdef", 12); - - check ((stpcpy (one, "abcdefg") - one) == 7, 13); - equal (one, "abcdefg", 14); - - check ((stpcpy (one, "abcdefgh") - one) == 8, 15); - equal (one, "abcdefgh", 16); - - check ((stpcpy (one, "abcdefghi") - one) == 9, 17); - equal (one, "abcdefghi", 18); - - check ((stpcpy (one, "x") - one) == 1, 19); - equal (one, "x", 20); /* Writeover. */ - equal (one+2, "cdefghi", 21); /* Wrote too much? */ - - check ((stpcpy (one, "xx") - one) == 2, 22); - equal (one, "xx", 23); /* Writeover. */ - equal (one+3, "defghi", 24); /* Wrote too much? */ - - check ((stpcpy (one, "xxx") - one) == 3, 25); - equal (one, "xxx", 26); /* Writeover. */ - equal (one+4, "efghi", 27); /* Wrote too much? */ - - check ((stpcpy (one, "xxxx") - one) == 4, 28); - equal (one, "xxxx", 29); /* Writeover. */ - equal (one+5, "fghi", 30); /* Wrote too much? */ - - check ((stpcpy (one, "xxxxx") - one) == 5, 31); - equal (one, "xxxxx", 32); /* Writeover. */ - equal (one+6, "ghi", 33); /* Wrote too much? */ - - check ((stpcpy (one, "xxxxxx") - one) == 6, 34); - equal (one, "xxxxxx", 35); /* Writeover. */ - equal (one+7, "hi", 36); /* Wrote too much? */ - - check ((stpcpy (one, "xxxxxxx") - one) == 7, 37); - equal (one, "xxxxxxx", 38); /* Writeover. */ - equal (one+8, "i", 39); /* Wrote too much? */ - - check ((stpcpy (stpcpy (stpcpy (one, "a"), "b"), "c") - one) == 3, 40); - equal (one, "abc", 41); - equal (one + 4, "xxx", 42); - - SIMPLE_COPY(stpcpy, 0, "", 43); - SIMPLE_COPY(stpcpy, 1, "1", 44); - SIMPLE_COPY(stpcpy, 2, "22", 45); - SIMPLE_COPY(stpcpy, 3, "333", 46); - SIMPLE_COPY(stpcpy, 4, "4444", 47); - SIMPLE_COPY(stpcpy, 5, "55555", 48); - SIMPLE_COPY(stpcpy, 6, "666666", 49); - SIMPLE_COPY(stpcpy, 7, "7777777", 50); - SIMPLE_COPY(stpcpy, 8, "88888888", 51); - SIMPLE_COPY(stpcpy, 9, "999999999", 52); - SIMPLE_COPY(stpcpy, 10, "0000000000", 53); - SIMPLE_COPY(stpcpy, 11, "11111111111", 54); - SIMPLE_COPY(stpcpy, 12, "222222222222", 55); - SIMPLE_COPY(stpcpy, 13, "3333333333333", 56); - SIMPLE_COPY(stpcpy, 14, "44444444444444", 57); - SIMPLE_COPY(stpcpy, 15, "555555555555555", 58); - SIMPLE_COPY(stpcpy, 16, "6666666666666666", 59); -} - -static void -test_stpncpy (void) -{ - it = "stpncpy"; - memset (one, 'x', sizeof (one)); - check (stpncpy (one, "abc", 2) == one + 2, 1); - check (stpncpy (one, "abc", 3) == one + 3, 2); - check (stpncpy (one, "abc", 4) == one + 3, 3); - check (one[3] == '\0' && one[4] == 'x', 4); - check (stpncpy (one, "abcd", 5) == one + 4, 5); - check (one[4] == '\0' && one[5] == 'x', 6); - check (stpncpy (one, "abcd", 6) == one + 4, 7); - check (one[4] == '\0' && one[5] == '\0' && one[6] == 'x', 8); -} - -static void -test_strcat (void) -{ - it = "strcat"; - (void) strcpy (one, "ijk"); - check (strcat (one, "lmn") == one, 1); /* Returned value. */ - equal (one, "ijklmn", 2); /* Basic test. */ - - (void) strcpy (one, "x"); - (void) strcat (one, "yz"); - equal (one, "xyz", 3); /* Writeover. */ - equal (one+4, "mn", 4); /* Wrote too much? */ - - (void) strcpy (one, "gh"); - (void) strcpy (two, "ef"); - (void) strcat (one, two); - equal (one, "ghef", 5); /* Basic test encore. */ - equal (two, "ef", 6); /* Stomped on source? */ - - (void) strcpy (one, ""); - (void) strcat (one, ""); - equal (one, "", 7); /* Boundary conditions. */ - (void) strcpy (one, "ab"); - (void) strcat (one, ""); - equal (one, "ab", 8); - (void) strcpy (one, ""); - (void) strcat (one, "cd"); - equal (one, "cd", 9); - - int ntest = 10; - char buf1[80] __attribute__ ((aligned (16))); - char buf2[32] __attribute__ ((aligned (16))); - for (size_t n1 = 0; n1 < 16; ++n1) - for (size_t n2 = 0; n2 < 16; ++n2) - for (size_t n3 = 0; n3 < 32; ++n3) - { - size_t olderrors = errors; - - memset (buf1, 'b', sizeof (buf1)); - - memset (buf1 + n2, 'a', n3); - buf1[n2 + n3] = '\0'; - strcpy (buf2 + n1, "123"); - - check (strcat (buf1 + n2, buf2 + n1) == buf1 + n2, ntest); - if (errors == olderrors) - for (size_t i = 0; i < sizeof (buf1); ++i) - { - if (i < n2) - check (buf1[i] == 'b', ntest); - else if (i < n2 + n3) - check (buf1[i] == 'a', ntest); - else if (i < n2 + n3 + 3) - check (buf1[i] == "123"[i - (n2 + n3)], ntest); - else if (i == n2 + n3 + 3) - check (buf1[i] == '\0', ntest); - else - check (buf1[i] == 'b', ntest); - - if (errors != olderrors) - { - printf ("n1=%zu, n2=%zu, n3=%zu, buf1=%02hhx", - n1, n2, n3, buf1[0]); - for (size_t j = 1; j < sizeof (buf1); ++j) - printf (",%02hhx", buf1[j]); - putchar_unlocked ('\n'); - break; - } - } - } -} - -static void -test_strncat (void) -{ - /* First test it as strcat, with big counts, then test the count - mechanism. */ - it = "strncat"; - (void) strcpy (one, "ijk"); - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - check (strncat (one, "lmn", 99) == one, 1); /* Returned value. */ - DIAG_POP_NEEDS_COMMENT; - equal (one, "ijklmn", 2); /* Basic test. */ - - (void) strcpy (one, "x"); - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - (void) strncat (one, "yz", 99); - DIAG_POP_NEEDS_COMMENT; - equal (one, "xyz", 3); /* Writeover. */ - equal (one+4, "mn", 4); /* Wrote too much? */ - - (void) strcpy (one, "gh"); - (void) strcpy (two, "ef"); - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - (void) strncat (one, two, 99); - DIAG_POP_NEEDS_COMMENT; - equal (one, "ghef", 5); /* Basic test encore. */ - equal (two, "ef", 6); /* Stomped on source? */ - - (void) strcpy (one, ""); - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - (void) strncat (one, "", 99); - DIAG_POP_NEEDS_COMMENT; - equal (one, "", 7); /* Boundary conditions. */ - (void) strcpy (one, "ab"); - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - (void) strncat (one, "", 99); - DIAG_POP_NEEDS_COMMENT; - equal (one, "ab", 8); - (void) strcpy (one, ""); - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - (void) strncat (one, "cd", 99); - DIAG_POP_NEEDS_COMMENT; - equal (one, "cd", 9); - - (void) strcpy (one, "ab"); - (void) strncat (one, "cdef", 2); - equal (one, "abcd", 10); /* Count-limited. */ - - (void) strncat (one, "gh", 0); - equal (one, "abcd", 11); /* Zero count. */ - - (void) strncat (one, "gh", 2); - equal (one, "abcdgh", 12); /* Count and length equal. */ - - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being larger than - the size of the buffer; this is deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - (void) strncat (one, "ij", (size_t)-1); /* set sign bit in count */ - DIAG_POP_NEEDS_COMMENT; - equal (one, "abcdghij", 13); - - int ntest = 14; - char buf1[80] __attribute__ ((aligned (16))); - char buf2[32] __attribute__ ((aligned (16))); - for (size_t n1 = 0; n1 < 16; ++n1) - for (size_t n2 = 0; n2 < 16; ++n2) - for (size_t n3 = 0; n3 < 32; ++n3) - for (size_t n4 = 0; n4 < 16; ++n4) - { - size_t olderrors = errors; - - memset (buf1, 'b', sizeof (buf1)); - - memset (buf1 + n2, 'a', n3); - buf1[n2 + n3] = '\0'; - strcpy (buf2 + n1, "123"); - - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (7, 0) - /* GCC 7 warns about the size passed to strncat being - larger than the size of the buffer; this is - deliberately tested here.. */ - DIAG_IGNORE_NEEDS_COMMENT (7, "-Wstringop-overflow="); -#endif - check (strncat (buf1 + n2, buf2 + n1, ~((size_t) 0) - n4) - == buf1 + n2, ntest); - DIAG_POP_NEEDS_COMMENT; - if (errors == olderrors) - for (size_t i = 0; i < sizeof (buf1); ++i) - { - if (i < n2) - check (buf1[i] == 'b', ntest); - else if (i < n2 + n3) - check (buf1[i] == 'a', ntest); - else if (i < n2 + n3 + 3) - check (buf1[i] == "123"[i - (n2 + n3)], ntest); - else if (i == n2 + n3 + 3) - check (buf1[i] == '\0', ntest); - else - check (buf1[i] == 'b', ntest); - - if (errors != olderrors) - { - printf ("n1=%zu, n2=%zu, n3=%zu, n4=%zu, buf1=%02hhx", - n1, n2, n3, n4, buf1[0]); - for (size_t j = 1; j < sizeof (buf1); ++j) - printf (",%02hhx", buf1[j]); - putchar_unlocked ('\n'); - break; - } - } - } -} - -static void -test_strncmp (void) -{ - /* First test as strcmp with big counts, then test count code. */ - it = "strncmp"; - check (strncmp ("", "", 99) == 0, 1); /* Trivial case. */ - check (strncmp ("a", "a", 99) == 0, 2); /* Identity. */ - check (strncmp ("abc", "abc", 99) == 0, 3); /* Multicharacter. */ - check (strncmp ("abc", "abcd", 99) < 0, 4); /* Length unequal. */ - check (strncmp ("abcd", "abc", 99) > 0, 5); - check (strncmp ("abcd", "abce", 99) < 0, 6); /* Honestly unequal. */ - check (strncmp ("abce", "abcd", 99) > 0, 7); - check (strncmp ("a\203", "a", 2) > 0, 8); /* Tricky if '\203' < 0 */ - check (strncmp ("a\203", "a\003", 2) > 0, 9); - check (strncmp ("abce", "abcd", 3) == 0, 10); /* Count limited. */ - check (strncmp ("abce", "abc", 3) == 0, 11); /* Count == length. */ - check (strncmp ("abcd", "abce", 4) < 0, 12); /* Nudging limit. */ - check (strncmp ("abc", "def", 0) == 0, 13); /* Zero count. */ - check (strncmp ("abc", "", (size_t)-1) > 0, 14); /* set sign bit in count */ - check (strncmp ("abc", "abc", (size_t)-2) == 0, 15); -} - -static void -test_strncpy (void) -{ - /* Testing is a bit different because of odd semantics. */ - it = "strncpy"; - check (strncpy (one, "abc", 4) == one, 1); /* Returned value. */ - equal (one, "abc", 2); /* Did the copy go right? */ - - (void) strcpy (one, "abcdefgh"); - (void) strncpy (one, "xyz", 2); - equal (one, "xycdefgh", 3); /* Copy cut by count. */ - - (void) strcpy (one, "abcdefgh"); - (void) strncpy (one, "xyz", 3); /* Copy cut just before NUL. */ - equal (one, "xyzdefgh", 4); - - (void) strcpy (one, "abcdefgh"); - (void) strncpy (one, "xyz", 4); /* Copy just includes NUL. */ - equal (one, "xyz", 5); - equal (one+4, "efgh", 6); /* Wrote too much? */ - - (void) strcpy (one, "abcdefgh"); - (void) strncpy (one, "xyz", 5); /* Copy includes padding. */ - equal (one, "xyz", 7); - equal (one+4, "", 8); - equal (one+5, "fgh", 9); - - (void) strcpy (one, "abc"); - (void) strncpy (one, "xyz", 0); /* Zero-length copy. */ - equal (one, "abc", 10); - - (void) strncpy (one, "", 2); /* Zero-length source. */ - equal (one, "", 11); - equal (one+1, "", 12); - equal (one+2, "c", 13); - - (void) strcpy (one, "hi there"); - (void) strncpy (two, one, 9); - equal (two, "hi there", 14); /* Just paranoia. */ - equal (one, "hi there", 15); /* Stomped on source? */ -} - -static void -test_strlen (void) -{ - it = "strlen"; - check (strlen ("") == 0, 1); /* Empty. */ - check (strlen ("a") == 1, 2); /* Single char. */ - check (strlen ("abcd") == 4, 3); /* Multiple chars. */ - { - char buf[4096]; - int i; - char *p; - for (i=0; i < 0x100; i++) - { - p = (char *) ((unsigned long int)(buf + 0xff) & ~0xff) + i; - strcpy (p, "OK"); - strcpy (p+3, "BAD/WRONG"); - check (strlen (p) == 2, 4+i); - } - } -} - -static void -test_strnlen (void) -{ - it = "strnlen"; - check (strnlen ("", 10) == 0, 1); /* Empty. */ - check (strnlen ("a", 10) == 1, 2); /* Single char. */ - check (strnlen ("abcd", 10) == 4, 3); /* Multiple chars. */ - check (strnlen ("foo", (size_t) -1) == 3, 4); /* limits of n. */ - check (strnlen ("abcd", 0) == 0, 5); /* Restricted. */ - check (strnlen ("abcd", 1) == 1, 6); /* Restricted. */ - check (strnlen ("abcd", 2) == 2, 7); /* Restricted. */ - check (strnlen ("abcd", 3) == 3, 8); /* Restricted. */ - check (strnlen ("abcd", 4) == 4, 9); /* Restricted. */ - - char buf[4096]; - for (int i = 0; i < 0x100; ++i) - { - char *p = (char *) ((unsigned long int)(buf + 0xff) & ~0xff) + i; - strcpy (p, "OK"); - strcpy (p + 3, "BAD/WRONG"); - check (strnlen (p, 100) == 2, 10 + i); - } -} - -static void -test_strchr (void) -{ - it = "strchr"; - check (strchr ("abcd", 'z') == NULL, 1); /* Not found. */ - (void) strcpy (one, "abcd"); - check (strchr (one, 'c') == one+2, 2); /* Basic test. */ - check (strchr (one, 'd') == one+3, 3); /* End of string. */ - check (strchr (one, 'a') == one, 4); /* Beginning. */ - check (strchr (one, '\0') == one+4, 5); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - check (strchr (one, 'b') == one+1, 6); /* Finding first. */ - (void) strcpy (one, ""); - check (strchr (one, 'b') == NULL, 7); /* Empty string. */ - check (strchr (one, '\0') == one, 8); /* NUL in empty string. */ - { - char buf[4096]; - int i; - char *p; - for (i=0; i < 0x100; i++) - { - p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; - strcpy (p, "OK"); - strcpy (p+3, "BAD/WRONG"); - check (strchr (p, '/') == NULL, 9+i); - } - } -} - -static void -test_strchrnul (void) -{ - const char *os; - it = "strchrnul"; - cp = strchrnul ((os = "abcd"), 'z'); - check (*cp == '\0', 1); /* Not found. */ - check (cp == os + 4, 2); - (void) strcpy (one, "abcd"); - check (strchrnul (one, 'c') == one+2, 3); /* Basic test. */ - check (strchrnul (one, 'd') == one+3, 4); /* End of string. */ - check (strchrnul (one, 'a') == one, 5); /* Beginning. */ - check (strchrnul (one, '\0') == one+4, 6); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - check (strchrnul (one, 'b') == one+1, 7); /* Finding first. */ - (void) strcpy (one, ""); - check (strchrnul (one, 'b') == one, 8); /* Empty string. */ - check (strchrnul (one, '\0') == one, 9); /* NUL in empty string. */ - { - char buf[4096]; - int i; - char *p; - for (i=0; i < 0x100; i++) - { - p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; - strcpy (p, "OK"); - strcpy (p+3, "BAD/WRONG"); - cp = strchrnul (p, '/'); - check (*cp == '\0', 9+2*i); - check (cp == p+2, 10+2*i); - } - } -} - -static void -test_rawmemchr (void) -{ - it = "rawmemchr"; - (void) strcpy (one, "abcd"); - check (rawmemchr (one, 'c') == one+2, 1); /* Basic test. */ - check (rawmemchr (one, 'd') == one+3, 2); /* End of string. */ - check (rawmemchr (one, 'a') == one, 3); /* Beginning. */ - check (rawmemchr (one, '\0') == one+4, 4); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - check (rawmemchr (one, 'b') == one+1, 5); /* Finding first. */ - (void) strcpy (one, ""); - check (rawmemchr (one, '\0') == one, 6); /* NUL in empty string. */ - { - char buf[4096]; - int i; - char *p; - for (i=0; i < 0x100; i++) - { - p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; - strcpy (p, "OK"); - strcpy (p+3, "BAD/WRONG"); - check (rawmemchr (p, 'R') == p+8, 6+i); - } - } -} - -static void -test_index (void) -{ - it = "index"; - check (index ("abcd", 'z') == NULL, 1); /* Not found. */ - (void) strcpy (one, "abcd"); - check (index (one, 'c') == one+2, 2); /* Basic test. */ - check (index (one, 'd') == one+3, 3); /* End of string. */ - check (index (one, 'a') == one, 4); /* Beginning. */ - check (index (one, '\0') == one+4, 5); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - check (index (one, 'b') == one+1, 6); /* Finding first. */ - (void) strcpy (one, ""); - check (index (one, 'b') == NULL, 7); /* Empty string. */ - check (index (one, '\0') == one, 8); /* NUL in empty string. */ -} - -static void -test_strrchr (void) -{ - it = "strrchr"; - check (strrchr ("abcd", 'z') == NULL, 1); /* Not found. */ - (void) strcpy (one, "abcd"); - check (strrchr (one, 'c') == one+2, 2); /* Basic test. */ - check (strrchr (one, 'd') == one+3, 3); /* End of string. */ - check (strrchr (one, 'a') == one, 4); /* Beginning. */ - check (strrchr (one, '\0') == one+4, 5); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - check (strrchr (one, 'b') == one+3, 6); /* Finding last. */ - (void) strcpy (one, ""); - check (strrchr (one, 'b') == NULL, 7); /* Empty string. */ - check (strrchr (one, '\0') == one, 8); /* NUL in empty string. */ - { - char buf[4096]; - int i; - char *p; - for (i=0; i < 0x100; i++) - { - p = (char *) ((unsigned long int) (buf + 0xff) & ~0xff) + i; - strcpy (p, "OK"); - strcpy (p+3, "BAD/WRONG"); - check (strrchr (p, '/') == NULL, 9+i); - } - } -} - -static void -test_memrchr (void) -{ - size_t l; - it = "memrchr"; - check (memrchr ("abcd", 'z', 5) == NULL, 1); /* Not found. */ - (void) strcpy (one, "abcd"); - l = strlen (one) + 1; - check (memrchr (one, 'c', l) == one+2, 2); /* Basic test. */ - check (memrchr (one, 'd', l) == one+3, 3); /* End of string. */ - check (memrchr (one, 'a', l) == one, 4); /* Beginning. */ - check (memrchr (one, '\0', l) == one+4, 5); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - l = strlen (one) + 1; - check (memrchr (one, 'b', l) == one+3, 6); /* Finding last. */ - (void) strcpy (one, ""); - l = strlen (one) + 1; - check (memrchr (one, 'b', l) == NULL, 7); /* Empty string. */ - check (memrchr (one, '\0', l) == one, 8); /* NUL in empty string. */ - - /* now test all possible alignment and length combinations to catch - bugs due to unrolled loops (assuming unrolling is limited to no - more than 128 byte chunks: */ - { - char buf[128 + sizeof(long)]; - long align, len, i, pos, n = 9; - - for (align = 0; align < (long) sizeof(long); ++align) { - for (len = 0; len < (long) (sizeof(buf) - align); ++len) { - for (i = 0; i < len; ++i) - buf[align + i] = 'x'; /* don't depend on memset... */ - - for (pos = len - 1; pos >= 0; --pos) { -#if 0 - printf("align %d, len %d, pos %d\n", align, len, pos); -#endif - check(memrchr(buf + align, 'x', len) == buf + align + pos, n++); - check(memrchr(buf + align + pos + 1, 'x', len - (pos + 1)) == NULL, - n++); - buf[align + pos] = '-'; - } - } - } - } -} - -static void -test_rindex (void) -{ - it = "rindex"; - check (rindex ("abcd", 'z') == NULL, 1); /* Not found. */ - (void) strcpy (one, "abcd"); - check (rindex (one, 'c') == one+2, 2); /* Basic test. */ - check (rindex (one, 'd') == one+3, 3); /* End of string. */ - check (rindex (one, 'a') == one, 4); /* Beginning. */ - check (rindex (one, '\0') == one+4, 5); /* Finding NUL. */ - (void) strcpy (one, "ababa"); - check (rindex (one, 'b') == one+3, 6); /* Finding last. */ - (void) strcpy (one, ""); - check (rindex (one, 'b') == NULL, 7); /* Empty string. */ - check (rindex (one, '\0') == one, 8); /* NUL in empty string. */ -} - -static void -test_strpbrk (void) -{ - it = "strpbrk"; - check(strpbrk("abcd", "z") == NULL, 1); /* Not found. */ - (void) strcpy(one, "abcd"); - check(strpbrk(one, "c") == one+2, 2); /* Basic test. */ - check(strpbrk(one, "d") == one+3, 3); /* End of string. */ - check(strpbrk(one, "a") == one, 4); /* Beginning. */ - check(strpbrk(one, "") == NULL, 5); /* Empty search list. */ - check(strpbrk(one, "cb") == one+1, 6); /* Multiple search. */ - (void) strcpy(one, "abcabdea"); - check(strpbrk(one, "b") == one+1, 7); /* Finding first. */ - check(strpbrk(one, "cb") == one+1, 8); /* With multiple search. */ - check(strpbrk(one, "db") == one+1, 9); /* Another variant. */ - (void) strcpy(one, ""); - check(strpbrk(one, "bc") == NULL, 10); /* Empty string. */ - (void) strcpy(one, ""); - check(strpbrk(one, "bcd") == NULL, 11); /* Empty string. */ - (void) strcpy(one, ""); - check(strpbrk(one, "bcde") == NULL, 12); /* Empty string. */ - check(strpbrk(one, "") == NULL, 13); /* Both strings empty. */ - (void) strcpy(one, "abcabdea"); - check(strpbrk(one, "befg") == one+1, 14); /* Finding first. */ - check(strpbrk(one, "cbr") == one+1, 15); /* With multiple search. */ - check(strpbrk(one, "db") == one+1, 16); /* Another variant. */ - check(strpbrk(one, "efgh") == one+6, 17); /* And yet another. */ -} - -static void -test_strstr (void) -{ - it = "strstr"; - check(strstr("abcd", "z") == NULL, 1); /* Not found. */ - check(strstr("abcd", "abx") == NULL, 2); /* Dead end. */ - (void) strcpy(one, "abcd"); - check(strstr(one, "c") == one+2, 3); /* Basic test. */ - check(strstr(one, "bc") == one+1, 4); /* Multichar. */ - check(strstr(one, "d") == one+3, 5); /* End of string. */ - check(strstr(one, "cd") == one+2, 6); /* Tail of string. */ - check(strstr(one, "abc") == one, 7); /* Beginning. */ - check(strstr(one, "abcd") == one, 8); /* Exact match. */ - check(strstr(one, "abcde") == NULL, 9); /* Too long. */ - check(strstr(one, "de") == NULL, 10); /* Past end. */ - check(strstr(one, "") == one, 11); /* Finding empty. */ - (void) strcpy(one, "ababa"); - check(strstr(one, "ba") == one+1, 12); /* Finding first. */ - (void) strcpy(one, ""); - check(strstr(one, "b") == NULL, 13); /* Empty string. */ - check(strstr(one, "") == one, 14); /* Empty in empty string. */ - (void) strcpy(one, "bcbca"); - check(strstr(one, "bca") == one+2, 15); /* False start. */ - (void) strcpy(one, "bbbcabbca"); - check(strstr(one, "bbca") == one+1, 16); /* With overlap. */ -} - -static void -test_strspn (void) -{ - it = "strspn"; - check(strspn("abcba", "abc") == 5, 1); /* Whole string. */ - check(strspn("abcba", "ab") == 2, 2); /* Partial. */ - check(strspn("abc", "qx") == 0, 3); /* None. */ - check(strspn("", "ab") == 0, 4); /* Null string. */ - check(strspn("abc", "") == 0, 5); /* Null search list. */ -} - -static void -test_strcspn (void) -{ - it = "strcspn"; - check(strcspn("abcba", "qx") == 5, 1); /* Whole string. */ - check(strcspn("abcba", "cx") == 2, 2); /* Partial. */ - check(strcspn("abc", "abc") == 0, 3); /* None. */ - check(strcspn("", "ab") == 0, 4); /* Null string. */ - check(strcspn("abc", "") == 3, 5); /* Null search list. */ -} - -static void -test_strtok (void) -{ - it = "strtok"; - (void) strcpy(one, "first, second, third"); - equal(strtok(one, ", "), "first", 1); /* Basic test. */ - equal(one, "first", 2); - equal(strtok((char *)NULL, ", "), "second", 3); - equal(strtok((char *)NULL, ", "), "third", 4); - check(strtok((char *)NULL, ", ") == NULL, 5); - (void) strcpy(one, ", first, "); - equal(strtok(one, ", "), "first", 6); /* Extra delims, 1 tok. */ - check(strtok((char *)NULL, ", ") == NULL, 7); - (void) strcpy(one, "1a, 1b; 2a, 2b"); - equal(strtok(one, ", "), "1a", 8); /* Changing delim lists. */ - equal(strtok((char *)NULL, "; "), "1b", 9); - equal(strtok((char *)NULL, ", "), "2a", 10); - (void) strcpy(two, "x-y"); - equal(strtok(two, "-"), "x", 11); /* New string before done. */ - equal(strtok((char *)NULL, "-"), "y", 12); - check(strtok((char *)NULL, "-") == NULL, 13); - (void) strcpy(one, "a,b, c,, ,d"); - equal(strtok(one, ", "), "a", 14); /* Different separators. */ - equal(strtok((char *)NULL, ", "), "b", 15); - equal(strtok((char *)NULL, " ,"), "c", 16); /* Permute list too. */ - equal(strtok((char *)NULL, " ,"), "d", 17); - check(strtok((char *)NULL, ", ") == NULL, 18); - check(strtok((char *)NULL, ", ") == NULL, 19); /* Persistence. */ - (void) strcpy(one, ", "); - check(strtok(one, ", ") == NULL, 20); /* No tokens. */ - (void) strcpy(one, ""); - check(strtok(one, ", ") == NULL, 21); /* Empty string. */ - (void) strcpy(one, "abc"); - equal(strtok(one, ", "), "abc", 22); /* No delimiters. */ - check(strtok((char *)NULL, ", ") == NULL, 23); - (void) strcpy(one, "abc"); - equal(strtok(one, ""), "abc", 24); /* Empty delimiter list. */ - check(strtok((char *)NULL, "") == NULL, 25); - (void) strcpy(one, "abcdefgh"); - (void) strcpy(one, "a,b,c"); - equal(strtok(one, ","), "a", 26); /* Basics again... */ - equal(strtok((char *)NULL, ","), "b", 27); - equal(strtok((char *)NULL, ","), "c", 28); - check(strtok((char *)NULL, ",") == NULL, 29); - equal(one+6, "gh", 30); /* Stomped past end? */ - equal(one, "a", 31); /* Stomped old tokens? */ - equal(one+2, "b", 32); - equal(one+4, "c", 33); -} - -static void -test_strtok_r (void) -{ - it = "strtok_r"; - (void) strcpy(one, "first, second, third"); - cp = NULL; /* Always initialize cp to make sure it doesn't point to some old data. */ - equal(strtok_r(one, ", ", &cp), "first", 1); /* Basic test. */ - equal(one, "first", 2); - equal(strtok_r((char *)NULL, ", ", &cp), "second", 3); - equal(strtok_r((char *)NULL, ", ", &cp), "third", 4); - check(strtok_r((char *)NULL, ", ", &cp) == NULL, 5); - (void) strcpy(one, ", first, "); - cp = NULL; - equal(strtok_r(one, ", ", &cp), "first", 6); /* Extra delims, 1 tok. */ - check(strtok_r((char *)NULL, ", ", &cp) == NULL, 7); - (void) strcpy(one, "1a, 1b; 2a, 2b"); - cp = NULL; - equal(strtok_r(one, ", ", &cp), "1a", 8); /* Changing delim lists. */ - equal(strtok_r((char *)NULL, "; ", &cp), "1b", 9); - equal(strtok_r((char *)NULL, ", ", &cp), "2a", 10); - (void) strcpy(two, "x-y"); - cp = NULL; - equal(strtok_r(two, "-", &cp), "x", 11); /* New string before done. */ - equal(strtok_r((char *)NULL, "-", &cp), "y", 12); - check(strtok_r((char *)NULL, "-", &cp) == NULL, 13); - (void) strcpy(one, "a,b, c,, ,d"); - cp = NULL; - equal(strtok_r(one, ", ", &cp), "a", 14); /* Different separators. */ - equal(strtok_r((char *)NULL, ", ", &cp), "b", 15); - equal(strtok_r((char *)NULL, " ,", &cp), "c", 16); /* Permute list too. */ - equal(strtok_r((char *)NULL, " ,", &cp), "d", 17); - check(strtok_r((char *)NULL, ", ", &cp) == NULL, 18); - check(strtok_r((char *)NULL, ", ", &cp) == NULL, 19); /* Persistence. */ - (void) strcpy(one, ", "); - cp = NULL; - check(strtok_r(one, ", ", &cp) == NULL, 20); /* No tokens. */ - (void) strcpy(one, ""); - cp = NULL; - check(strtok_r(one, ", ", &cp) == NULL, 21); /* Empty string. */ - check(strtok_r((char *)NULL, ", ", &cp) == NULL, 22); /* Persistence. */ - (void) strcpy(one, "abc"); - cp = NULL; - equal(strtok_r(one, ", ", &cp), "abc", 23); /* No delimiters. */ - check(strtok_r((char *)NULL, ", ", &cp) == NULL, 24); - (void) strcpy(one, "abc"); - cp = NULL; - equal(strtok_r(one, "", &cp), "abc", 25); /* Empty delimiter list. */ - check(strtok_r((char *)NULL, "", &cp) == NULL, 26); - (void) strcpy(one, "abcdefgh"); - (void) strcpy(one, "a,b,c"); - cp = NULL; - equal(strtok_r(one, ",", &cp), "a", 27); /* Basics again... */ - equal(strtok_r((char *)NULL, ",", &cp), "b", 28); - equal(strtok_r((char *)NULL, ",", &cp), "c", 29); - check(strtok_r((char *)NULL, ",", &cp) == NULL, 30); - equal(one+6, "gh", 31); /* Stomped past end? */ - equal(one, "a", 32); /* Stomped old tokens? */ - equal(one+2, "b", 33); - equal(one+4, "c", 34); - strcpy (one, ":::"); - cp = NULL; - check (strtok_r (one, ":", &cp) == NULL, 35); /* Must store pointer in cp. */ - check (strtok_r (NULL, ":", &cp) == NULL, 36); -} - -static void -test_strsep (void) -{ - char *ptr; - it = "strsep"; - cp = strcpy(one, "first, second, third"); - equal(strsep(&cp, ", "), "first", 1); /* Basic test. */ - equal(one, "first", 2); - equal(strsep(&cp, ", "), "", 3); - equal(strsep(&cp, ", "), "second", 4); - equal(strsep(&cp, ", "), "", 5); - equal(strsep(&cp, ", "), "third", 6); - check(strsep(&cp, ", ") == NULL, 7); - cp = strcpy(one, ", first, "); - equal(strsep(&cp, ", "), "", 8); - equal(strsep(&cp, ", "), "", 9); - equal(strsep(&cp, ", "), "first", 10); /* Extra delims, 1 tok. */ - equal(strsep(&cp, ", "), "", 11); - equal(strsep(&cp, ", "), "", 12); - check(strsep(&cp, ", ") == NULL, 13); - cp = strcpy(one, "1a, 1b; 2a, 2b"); - equal(strsep(&cp, ", "), "1a", 14); /* Changing delim lists. */ - equal(strsep(&cp, ", "), "", 15); - equal(strsep(&cp, "; "), "1b", 16); - equal(strsep(&cp, ", "), "", 17); - equal(strsep(&cp, ", "), "2a", 18); - cp = strcpy(two, "x-y"); - equal(strsep(&cp, "-"), "x", 19); /* New string before done. */ - equal(strsep(&cp, "-"), "y", 20); - check(strsep(&cp, "-") == NULL, 21); - cp = strcpy(one, "a,b, c,, ,d "); - equal(strsep(&cp, ", "), "a", 22); /* Different separators. */ - equal(strsep(&cp, ", "), "b", 23); - equal(strsep(&cp, " ,"), "", 24); - equal(strsep(&cp, " ,"), "c", 25); /* Permute list too. */ - equal(strsep(&cp, " ,"), "", 26); - equal(strsep(&cp, " ,"), "", 27); - equal(strsep(&cp, " ,"), "", 28); - equal(strsep(&cp, " ,"), "d", 29); - equal(strsep(&cp, " ,"), "", 30); - check(strsep(&cp, ", ") == NULL, 31); - check(strsep(&cp, ", ") == NULL, 32); /* Persistence. */ - cp = strcpy(one, ", "); - equal(strsep(&cp, ", "), "", 33); - equal(strsep(&cp, ", "), "", 34); - equal(strsep(&cp, ", "), "", 35); - check(strsep(&cp, ", ") == NULL, 36); /* No tokens. */ - cp = strcpy(one, ""); - equal(strsep(&cp, ", "), "", 37); - check(strsep(&cp, ", ") == NULL, 38); /* Empty string. */ - cp = strcpy(one, "abc"); - equal(strsep(&cp, ", "), "abc", 39); /* No delimiters. */ - check(strsep(&cp, ", ") == NULL, 40); - cp = strcpy(one, "abc"); - equal(strsep(&cp, ""), "abc", 41); /* Empty delimiter list. */ - check(strsep(&cp, "") == NULL, 42); - (void) strcpy(one, "abcdefgh"); - cp = strcpy(one, "a,b,c"); - equal(strsep(&cp, ","), "a", 43); /* Basics again... */ - equal(strsep(&cp, ","), "b", 44); - equal(strsep(&cp, ","), "c", 45); - check(strsep(&cp, ",") == NULL, 46); - equal(one+6, "gh", 47); /* Stomped past end? */ - equal(one, "a", 48); /* Stomped old tokens? */ - equal(one+2, "b", 49); - equal(one+4, "c", 50); - - { - char text[] = "This,is,a,test"; - char *list = strdupa (text); - equal (strsep (&list, ","), "This", 51); - equal (strsep (&list, ","), "is", 52); - equal (strsep (&list, ","), "a", 53); - equal (strsep (&list, ","), "test", 54); - check (strsep (&list, ",") == NULL, 55); - } - - cp = strcpy(one, "a,b, c,, ,d,"); - equal(strsep(&cp, ","), "a", 56); /* Different separators. */ - equal(strsep(&cp, ","), "b", 57); - equal(strsep(&cp, ","), " c", 58); /* Permute list too. */ - equal(strsep(&cp, ","), "", 59); - equal(strsep(&cp, ","), " ", 60); - equal(strsep(&cp, ","), "d", 61); - equal(strsep(&cp, ","), "", 62); - check(strsep(&cp, ",") == NULL, 63); - check(strsep(&cp, ",") == NULL, 64); /* Persistence. */ - - cp = strcpy(one, "a,b, c,, ,d,"); - equal(strsep(&cp, "xy,"), "a", 65); /* Different separators. */ - equal(strsep(&cp, "x,y"), "b", 66); - equal(strsep(&cp, ",xy"), " c", 67); /* Permute list too. */ - equal(strsep(&cp, "xy,"), "", 68); - equal(strsep(&cp, "x,y"), " ", 69); - equal(strsep(&cp, ",xy"), "d", 70); - equal(strsep(&cp, "xy,"), "", 71); - check(strsep(&cp, "x,y") == NULL, 72); - check(strsep(&cp, ",xy") == NULL, 73); /* Persistence. */ - - cp = strcpy(one, "ABC"); - one[4] = ':'; - equal(strsep(&cp, "C"), "AB", 74); /* Access beyond NUL. */ - ptr = strsep(&cp, ":"); - equal(ptr, "", 75); - check(ptr == one + 3, 76); - check(cp == NULL, 77); - - cp = strcpy(one, "ABC"); - one[4] = ':'; - equal(strsep(&cp, "CD"), "AB", 78); /* Access beyond NUL. */ - ptr = strsep(&cp, ":."); - equal(ptr, "", 79); - check(ptr == one + 3, 80); - - cp = strcpy(one, "ABC"); /* No token in string. */ - equal(strsep(&cp, ","), "ABC", 81); - check(cp == NULL, 82); - - *one = '\0'; /* Empty string. */ - cp = one; - ptr = strsep(&cp, ","); - equal(ptr, "", 83); - check(ptr == one, 84); - check(cp == NULL, 85); - - *one = '\0'; /* Empty string and no token. */ - cp = one; - ptr = strsep(&cp, ""); - equal(ptr, "", 86); - check(ptr == one , 87); - check(cp == NULL, 88); -} - -static void -test_memcmp (void) -{ - int cnt = 1; - char one[21]; - char two[21]; - - it = "memcmp"; - check(memcmp("a", "a", 1) == 0, cnt++); /* Identity. */ - check(memcmp("abc", "abc", 3) == 0, cnt++); /* Multicharacter. */ - check(memcmp("abcd", "abcf", 4) < 0, cnt++); /* Honestly unequal. */ - check(memcmp("abcf", "abcd", 4) > 0, cnt++); - check(memcmp("alph", "cold", 4) < 0, cnt++); - check(memcmp("a\203", "a\003", 2) > 0, cnt++); - check(memcmp("a\003", "a\203", 2) < 0, cnt++); - check(memcmp("a\003bc", "a\203bc", 2) < 0, cnt++); - check(memcmp("abc\203", "abc\003", 4) > 0, cnt++); - check(memcmp("abc\003", "abc\203", 4) < 0, cnt++); - check(memcmp("abcf", "abcd", 3) == 0, cnt++); /* Count limited. */ - check(memcmp("abc", "def", 0) == 0, cnt++); /* Zero count. */ - /* Comparisons with shifting 4-byte boundaries. */ - for (int i = 0; i < 4; ++i) - { - char *a = one + i; - char *b = two + i; - strncpy(a, "--------11112222", 16); - strncpy(b, "--------33334444", 16); - check(memcmp(b, a, 16) > 0, cnt++); - check(memcmp(a, b, 16) < 0, cnt++); - } -} - -static void -test_memchr (void) -{ - it = "memchr"; - check(memchr("abcd", 'z', 4) == NULL, 1); /* Not found. */ - (void) strcpy(one, "abcd"); - check(memchr(one, 'c', 4) == one+2, 2); /* Basic test. */ - check(memchr(one, ~0xff|'c', 4) == one+2, 2); /* ignore highorder bits. */ - check(memchr(one, 'd', 4) == one+3, 3); /* End of string. */ - check(memchr(one, 'a', 4) == one, 4); /* Beginning. */ - check(memchr(one, '\0', 5) == one+4, 5); /* Finding NUL. */ - (void) strcpy(one, "ababa"); - check(memchr(one, 'b', 5) == one+1, 6); /* Finding first. */ - check(memchr(one, 'b', 0) == NULL, 7); /* Zero count. */ - check(memchr(one, 'a', 1) == one, 8); /* Singleton case. */ - (void) strcpy(one, "a\203b"); - check(memchr(one, 0203, 3) == one+1, 9); /* Unsignedness. */ - - /* now test all possible alignment and length combinations to catch - bugs due to unrolled loops (assuming unrolling is limited to no - more than 128 byte chunks: */ - { - char buf[128 + sizeof(long)]; - long align, len, i, pos; - - for (align = 0; align < (long) sizeof(long); ++align) { - for (len = 0; len < (long) (sizeof(buf) - align); ++len) { - for (i = 0; i < len; ++i) { - buf[align + i] = 'x'; /* don't depend on memset... */ - } - for (pos = 0; pos < len; ++pos) { -#if 0 - printf("align %d, len %d, pos %d\n", align, len, pos); -#endif - check(memchr(buf + align, 'x', len) == buf + align + pos, 10); - check(memchr(buf + align, 'x', pos) == NULL, 11); - buf[align + pos] = '-'; - } - } - } - } -} - -static void -test_memcpy (void) -{ - int i; - it = "memcpy"; - check(memcpy(one, "abc", 4) == one, 1); /* Returned value. */ - equal(one, "abc", 2); /* Did the copy go right? */ - - (void) strcpy(one, "abcdefgh"); - (void) memcpy(one+1, "xyz", 2); - equal(one, "axydefgh", 3); /* Basic test. */ - - (void) strcpy(one, "abc"); - (void) memcpy(one, "xyz", 0); - equal(one, "abc", 4); /* Zero-length copy. */ - - (void) strcpy(one, "hi there"); - (void) strcpy(two, "foo"); - (void) memcpy(two, one, 9); - equal(two, "hi there", 5); /* Just paranoia. */ - equal(one, "hi there", 6); /* Stomped on source? */ - - for (i = 0; i < 16; i++) - { - const char *x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; - strcpy (one, x); - check (memcpy (one + i, "hi there", 9) == one + i, - 7 + (i * 6)); /* Unaligned destination. */ - check (memcmp (one, x, i) == 0, 8 + (i * 6)); /* Wrote under? */ - equal (one + i, "hi there", 9 + (i * 6)); - check (one[i + 9] == 'x', 10 + (i * 6)); /* Wrote over? */ - check (memcpy (two, one + i, 9) == two, - 11 + (i * 6)); /* Unaligned source. */ - equal (two, "hi there", 12 + (i * 6)); - } -} - -static void -test_mempcpy (void) -{ - int i; - it = "mempcpy"; - check(mempcpy(one, "abc", 4) == one + 4, 1); /* Returned value. */ - equal(one, "abc", 2); /* Did the copy go right? */ - - (void) strcpy(one, "abcdefgh"); - (void) mempcpy(one+1, "xyz", 2); - equal(one, "axydefgh", 3); /* Basic test. */ - - (void) strcpy(one, "abc"); - (void) mempcpy(one, "xyz", 0); - equal(one, "abc", 4); /* Zero-length copy. */ - - (void) strcpy(one, "hi there"); - (void) strcpy(two, "foo"); - (void) mempcpy(two, one, 9); - equal(two, "hi there", 5); /* Just paranoia. */ - equal(one, "hi there", 6); /* Stomped on source? */ - - for (i = 0; i < 16; i++) - { - const char *x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; - strcpy (one, x); - check (mempcpy (one + i, "hi there", 9) == one + i + 9, - 7 + (i * 6)); /* Unaligned destination. */ - check (memcmp (one, x, i) == 0, 8 + (i * 6)); /* Wrote under? */ - equal (one + i, "hi there", 9 + (i * 6)); - check (one[i + 9] == 'x', 10 + (i * 6)); /* Wrote over? */ - check (mempcpy (two, one + i, 9) == two + 9, - 11 + (i * 6)); /* Unaligned source. */ - equal (two, "hi there", 12 + (i * 6)); - } -} - -static void -test_memmove (void) -{ - it = "memmove"; - check(memmove(one, "abc", 4) == one, 1); /* Returned value. */ - equal(one, "abc", 2); /* Did the copy go right? */ - - (void) strcpy(one, "abcdefgh"); - (void) memmove(one+1, "xyz", 2); - equal(one, "axydefgh", 3); /* Basic test. */ - - (void) strcpy(one, "abc"); - (void) memmove(one, "xyz", 0); - equal(one, "abc", 4); /* Zero-length copy. */ - - (void) strcpy(one, "hi there"); - (void) strcpy(two, "foo"); - (void) memmove(two, one, 9); - equal(two, "hi there", 5); /* Just paranoia. */ - equal(one, "hi there", 6); /* Stomped on source? */ - - (void) strcpy(one, "abcdefgh"); - (void) memmove(one+1, one, 9); - equal(one, "aabcdefgh", 7); /* Overlap, right-to-left. */ - - (void) strcpy(one, "abcdefgh"); - (void) memmove(one+1, one+2, 7); - equal(one, "acdefgh", 8); /* Overlap, left-to-right. */ - - (void) strcpy(one, "abcdefgh"); - (void) memmove(one, one, 9); - equal(one, "abcdefgh", 9); /* 100% overlap. */ -} - -static void -test_memccpy (void) -{ - /* First test like memcpy, then the search part The SVID, the only - place where memccpy is mentioned, says overlap might fail, so we - don't try it. Besides, it's hard to see the rationale for a - non-left-to-right memccpy. */ - it = "memccpy"; - check(memccpy(one, "abc", 'q', 4) == NULL, 1); /* Returned value. */ - equal(one, "abc", 2); /* Did the copy go right? */ - - (void) strcpy(one, "abcdefgh"); - (void) memccpy(one+1, "xyz", 'q', 2); - equal(one, "axydefgh", 3); /* Basic test. */ - - (void) strcpy(one, "abc"); - (void) memccpy(one, "xyz", 'q', 0); - equal(one, "abc", 4); /* Zero-length copy. */ - - (void) strcpy(one, "hi there"); - (void) strcpy(two, "foo"); - (void) memccpy(two, one, 'q', 9); - equal(two, "hi there", 5); /* Just paranoia. */ - equal(one, "hi there", 6); /* Stomped on source? */ - - (void) strcpy(one, "abcdefgh"); - (void) strcpy(two, "horsefeathers"); - check(memccpy(two, one, 'f', 9) == two+6, 7); /* Returned value. */ - equal(one, "abcdefgh", 8); /* Source intact? */ - equal(two, "abcdefeathers", 9); /* Copy correct? */ - - (void) strcpy(one, "abcd"); - (void) strcpy(two, "bumblebee"); - check(memccpy(two, one, 'a', 4) == two+1, 10); /* First char. */ - equal(two, "aumblebee", 11); - check(memccpy(two, one, 'd', 4) == two+4, 12); /* Last char. */ - equal(two, "abcdlebee", 13); - (void) strcpy(one, "xyz"); - check(memccpy(two, one, 'x', 1) == two+1, 14); /* Singleton. */ - equal(two, "xbcdlebee", 15); -} - -static void -test_memset (void) -{ - int i; - - it = "memset"; - (void) strcpy(one, "abcdefgh"); - check(memset(one+1, 'x', 3) == one+1, 1); /* Return value. */ - equal(one, "axxxefgh", 2); /* Basic test. */ - - DIAG_PUSH_NEEDS_COMMENT; -#if __GNUC_PREREQ (5, 0) - /* GCC 5.0 warns about a zero-length memset because the arguments to memset - may be in the wrong order. But we really want to test this. */ - DIAG_IGNORE_NEEDS_COMMENT (5.0, "-Wmemset-transposed-args") -#endif - (void) memset(one+2, 'y', 0); - equal(one, "axxxefgh", 3); /* Zero-length set. */ - DIAG_POP_NEEDS_COMMENT; - - (void) memset(one+5, 0, 1); - equal(one, "axxxe", 4); /* Zero fill. */ - equal(one+6, "gh", 5); /* And the leftover. */ - - (void) memset(one+2, 010045, 1); - equal(one, "ax\045xe", 6); /* Unsigned char convert. */ - - /* Non-8bit fill character. */ - memset (one, 0x101, sizeof (one)); - for (i = 0; i < (int) sizeof (one); ++i) - check (one[i] == '\01', 7); - - /* Test for more complex versions of memset, for all alignments and - lengths up to 256. This test takes a little while, perhaps it should - be made weaker? */ - { - char data[512]; - int j; - int k; - int c; - - for (i = 0; i < 512; i++) - data[i] = 'x'; - for (c = 0; c <= 'y'; c += 'y') /* check for memset(,0,) and - memset(,'y',) */ - for (j = 0; j < 256; j++) - for (i = 0; i < 256; i++) - { - memset (data + i, c, j); - for (k = 0; k < i; k++) - if (data[k] != 'x') - goto fail; - for (k = i; k < i+j; k++) - { - if (data[k] != c) - goto fail; - data[k] = 'x'; - } - for (k = i+j; k < 512; k++) - if (data[k] != 'x') - goto fail; - continue; - - fail: - check (0, 8 + i + j * 256 + (c != 0) * 256 * 256); - } - } -} - -static void -test_bcopy (void) -{ - /* Much like memcpy. Berklix manual is silent about overlap, so - don't test it. */ - it = "bcopy"; - (void) bcopy("abc", one, 4); - equal(one, "abc", 1); /* Simple copy. */ - - (void) strcpy(one, "abcdefgh"); - (void) bcopy("xyz", one+1, 2); - equal(one, "axydefgh", 2); /* Basic test. */ - - (void) strcpy(one, "abc"); - (void) bcopy("xyz", one, 0); - equal(one, "abc", 3); /* Zero-length copy. */ - - (void) strcpy(one, "hi there"); - (void) strcpy(two, "foo"); - (void) bcopy(one, two, 9); - equal(two, "hi there", 4); /* Just paranoia. */ - equal(one, "hi there", 5); /* Stomped on source? */ -} - -static void -test_bzero (void) -{ - it = "bzero"; - (void) strcpy(one, "abcdef"); - bzero(one+2, 2); - equal(one, "ab", 1); /* Basic test. */ - equal(one+3, "", 2); - equal(one+4, "ef", 3); - - (void) strcpy(one, "abcdef"); - bzero(one+2, 0); - equal(one, "abcdef", 4); /* Zero-length copy. */ -} - -static void -test_strndup (void) -{ - char *p, *q; - it = "strndup"; - p = strndup("abcdef", 12); - check(p != NULL, 1); - if (p != NULL) - { - equal(p, "abcdef", 2); - q = strndup(p + 1, 2); - check(q != NULL, 3); - if (q != NULL) - equal(q, "bc", 4); - free (q); - } - free (p); - p = strndup("abc def", 3); - check(p != NULL, 5); - if (p != NULL) - equal(p, "abc", 6); - free (p); -} - -static void -test_bcmp (void) -{ - it = "bcmp"; - check(bcmp("a", "a", 1) == 0, 1); /* Identity. */ - check(bcmp("abc", "abc", 3) == 0, 2); /* Multicharacter. */ - check(bcmp("abcd", "abce", 4) != 0, 3); /* Honestly unequal. */ - check(bcmp("abce", "abcd", 4) != 0, 4); - check(bcmp("alph", "beta", 4) != 0, 5); - check(bcmp("abce", "abcd", 3) == 0, 6); /* Count limited. */ - check(bcmp("abc", "def", 0) == 0, 8); /* Zero count. */ -} - -static void -test_strerror (void) -{ - it = "strerror"; - check(strerror(EDOM) != 0, 1); - check(strerror(ERANGE) != 0, 2); - check(strerror(ENOENT) != 0, 3); -} - -static void -test_strcasecmp (void) -{ - it = "strcasecmp"; - /* Note that the locale is "C". */ - check(strcasecmp("a", "a") == 0, 1); - check(strcasecmp("a", "A") == 0, 2); - check(strcasecmp("A", "a") == 0, 3); - check(strcasecmp("a", "b") < 0, 4); - check(strcasecmp("c", "b") > 0, 5); - check(strcasecmp("abc", "AbC") == 0, 6); - check(strcasecmp("0123456789", "0123456789") == 0, 7); - check(strcasecmp("", "0123456789") < 0, 8); - check(strcasecmp("AbC", "") > 0, 9); - check(strcasecmp("AbC", "A") > 0, 10); - check(strcasecmp("AbC", "Ab") > 0, 11); - check(strcasecmp("AbC", "ab") > 0, 12); -} - -static void -test_strncasecmp (void) -{ - it = "strncasecmp"; - /* Note that the locale is "C". */ - check(strncasecmp("a", "a", 5) == 0, 1); - check(strncasecmp("a", "A", 5) == 0, 2); - check(strncasecmp("A", "a", 5) == 0, 3); - check(strncasecmp("a", "b", 5) < 0, 4); - check(strncasecmp("c", "b", 5) > 0, 5); - check(strncasecmp("abc", "AbC", 5) == 0, 6); - check(strncasecmp("0123456789", "0123456789", 10) == 0, 7); - check(strncasecmp("", "0123456789", 10) < 0, 8); - check(strncasecmp("AbC", "", 5) > 0, 9); - check(strncasecmp("AbC", "A", 5) > 0, 10); - check(strncasecmp("AbC", "Ab", 5) > 0, 11); - check(strncasecmp("AbC", "ab", 5) > 0, 12); - check(strncasecmp("0123456789", "AbC", 0) == 0, 13); - check(strncasecmp("AbC", "abc", 1) == 0, 14); - check(strncasecmp("AbC", "abc", 2) == 0, 15); - check(strncasecmp("AbC", "abc", 3) == 0, 16); - check(strncasecmp("AbC", "abcd", 3) == 0, 17); - check(strncasecmp("AbC", "abcd", 4) < 0, 18); - check(strncasecmp("ADC", "abcd", 1) == 0, 19); - check(strncasecmp("ADC", "abcd", 2) > 0, 20); -} - -int -main (void) -{ - int status; - - /* Test strcmp first because we use it to test other things. */ - test_strcmp (); - - /* Test strcpy next because we need it to set up other tests. */ - test_strcpy (); - - /* A closely related function is stpcpy. */ - test_stpcpy (); - - /* stpncpy. */ - test_stpncpy (); - - /* strcat. */ - test_strcat (); - - /* strncat. */ - test_strncat (); - - /* strncmp. */ - test_strncmp (); - - /* strncpy. */ - test_strncpy (); - - /* strlen. */ - test_strlen (); - - /* strnlen. */ - test_strnlen (); - - /* strchr. */ - test_strchr (); - - /* strchrnul. */ - test_strchrnul (); - - /* rawmemchr. */ - test_rawmemchr (); - - /* index - just like strchr. */ - test_index (); - - /* strrchr. */ - test_strrchr (); - - /* memrchr. */ - test_memrchr (); - - /* rindex - just like strrchr. */ - test_rindex (); - - /* strpbrk - somewhat like strchr. */ - test_strpbrk (); - - /* strstr - somewhat like strchr. */ - test_strstr (); - - /* strspn. */ - test_strspn (); - - /* strcspn. */ - test_strcspn (); - - /* strtok - the hard one. */ - test_strtok (); - - /* strtok_r. */ - test_strtok_r (); - - /* strsep. */ - test_strsep (); - - /* memcmp. */ - test_memcmp (); - - /* memchr. */ - test_memchr (); - - /* memcpy - need not work for overlap. */ - test_memcpy (); - - /* memmove - must work on overlap. */ - test_memmove (); - - /* mempcpy */ - test_mempcpy (); - - /* memccpy. */ - test_memccpy (); - - /* memset. */ - test_memset (); - - /* bcopy. */ - test_bcopy (); - - /* bzero. */ - test_bzero (); - - /* bcmp - somewhat like memcmp. */ - test_bcmp (); - - /* strndup. */ - test_strndup (); - - /* strerror - VERY system-dependent. */ - test_strerror (); - - /* strcasecmp. Without locale dependencies. */ - test_strcasecmp (); - - /* strncasecmp. Without locale dependencies. */ - test_strncasecmp (); - - if (errors == 0) - { - status = EXIT_SUCCESS; - puts("No errors."); - } - else - { - status = EXIT_FAILURE; - printf("%Zd errors.\n", errors); - } - - return status; -} diff --git a/string/tst-bswap.c b/string/tst-bswap.c deleted file mode 100644 index def6e2f28a..0000000000 --- a/string/tst-bswap.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (C) 2000-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <byteswap.h> -#include <stdio.h> - -extern unsigned long long int wash (unsigned long long int a); - -int -do_test (void) -{ - int result = 0; - - /* Test the functions with constant arguments. */ - if (bswap_16 (0x1234) != 0x3412) - { - puts ("bswap_16 (constant) flunked"); - result = 1; - } - if (bswap_32 (0x12345678) != 0x78563412) - { - puts ("bswap_32 (constant) flunked"); - result = 1; - } - if (bswap_64 (0x1234567890abcdefULL) != 0xefcdab9078563412ULL) - { - puts ("bswap_64 (constant) flunked"); - result = 1; - } - - /* Test the functions with non-constant arguments. */ - if (bswap_16 (wash (0x1234)) != 0x3412) - { - puts ("bswap_16 (non-constant) flunked"); - result = 1; - } - if (bswap_32 (wash (0x12345678)) != 0x78563412) - { - puts ("bswap_32 (non-constant) flunked"); - result = 1; - } - if (bswap_64 (wash (0x1234567890abcdefULL)) != 0xefcdab9078563412ULL) - { - puts ("bswap_64 (non-constant) flunked"); - result = 1; - } - - return result; -} - - -unsigned long long int -wash (unsigned long long int a) -{ - /* Do nothing. This function simply exists to avoid that the compiler - regards the argument to the bswap_*() functions as constant. */ - return a + 0; -} - -#include <support/test-driver.c> diff --git a/string/tst-cmp.c b/string/tst-cmp.c deleted file mode 100644 index d7720194e9..0000000000 --- a/string/tst-cmp.c +++ /dev/null @@ -1,212 +0,0 @@ -/* Alignment/padding coverage test for string comparison. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This performs test comparisons with various (mis)alignments and - characters in the padding. It is partly a regression test for bug - 20327. */ - -#include <limits.h> -#include <malloc.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> - -static int -signum (int val) -{ - if (val < 0) - return -1; - if (val > 0) - return 1; - else - return 0; -} - -static size_t -max_size_t (size_t left, size_t right) -{ - if (left > right) - return left; - else - return right; -} - -/* Wrappers for strncmp and strncasecmp which determine the maximum - string length in some, either based on the input string length, or - using fixed constants. */ - -static int -strncmp_no_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncasecmp_no_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncasecmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncmp_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncasecmp_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncasecmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncmp_64 (const char *left, const char *right) -{ - return strncmp (left, right, 64); -} - -static int -strncasecmp_64 (const char *left, const char *right) -{ - return strncasecmp (left, right, 64); -} - -static int -strncmp_max (const char *left, const char *right) -{ - return strncmp (left, right, SIZE_MAX); -} - -static int -strncasecmp_max (const char *left, const char *right) -{ - return strncasecmp (left, right, SIZE_MAX); -} - -int -do_test (void) -{ - enum { - max_align = 64, - max_string_length = 33 - }; - size_t blob_size = max_align + max_string_length + 1; - char *left = memalign (max_align, blob_size); - char *right = memalign (max_align, blob_size); - if (left == NULL || right == NULL) - { - printf ("error: out of memory\n"); - return 1; - } - - const struct - { - const char *name; - int (*implementation) (const char *, const char *); - } functions[] = - { - { "strcmp", strcmp }, - { "strcasecmp", strcasecmp }, - { "strncmp (without NUL)", strncmp_no_terminator}, - { "strncasecmp (without NUL)", strncasecmp_no_terminator}, - { "strncmp (with NUL)", strncmp_terminator}, - { "strncasecmp (with NUL)", strncasecmp_terminator}, - { "strncmp (length 64)", strncmp_64}, - { "strncasecmp (length 64)", strncasecmp_64}, - { "strncmp (length SIZE_MAX)", strncmp_max}, - { "strncasecmp (length SIZE_MAX)", strncasecmp_max}, - { NULL, NULL } - }; - const char *const strings[] = - { - "", - "0", - "01", - "01234567", - "0123456789abcde", - "0123456789abcdef", - "0123456789abcdefg", - "1", - "10", - "123456789abcdef", - "123456789abcdefg", - "23456789abcdef", - "23456789abcdefg", - "abcdefghijklmnopqrstuvwxyzABCDEF", - NULL - }; - const unsigned char pads[] = - { 0, 1, 32, 64, 128, '0', '1', 'e', 'f', 'g', 127, 192, 255 }; - - bool errors = false; - for (int left_idx = 0; strings[left_idx] != NULL; ++left_idx) - for (int left_align = 0; left_align < max_align; ++left_align) - for (unsigned pad_left = 0; pad_left < sizeof (pads); ++pad_left) - { - memset (left, pads[pad_left], blob_size); - strcpy (left + left_align, strings[left_idx]); - - for (int right_idx = 0; strings[right_idx] != NULL; ++right_idx) - for (unsigned pad_right = 0; pad_right < sizeof (pads); - ++pad_right) - for (int right_align = 0; right_align < max_align; - ++right_align) - { - memset (right, pads[pad_right], blob_size); - strcpy (right + right_align, strings[right_idx]); - - for (int func = 0; functions[func].name != NULL; ++func) - { - int expected = left_idx - right_idx; - int actual = functions[func].implementation - (left + left_align, right + right_align); - if (signum (actual) != signum (expected)) - { - printf ("error: mismatch for %s: %d\n" - " left: \"%s\"\n" - " right: \"%s\"\n" - " pad_left = %u, pad_right = %u,\n" - " left_align = %d, right_align = %d\n", - functions[func].name, actual, - strings[left_idx], strings[right_idx], - pad_left, pad_right, - left_align, right_align); - errors = true; - } - } - } - } - free (right); - free (left); - return errors; -} - -/* The nested loops need a long time to complete on slower - machines. */ -#define TIMEOUT 300 - -#include <support/test-driver.c> diff --git a/string/tst-endian.c b/string/tst-endian.c deleted file mode 100644 index b156ede199..0000000000 --- a/string/tst-endian.c +++ /dev/null @@ -1,134 +0,0 @@ -#include <byteswap.h> -#include <endian.h> -#include <inttypes.h> -#include <stdio.h> -#include <stdint.h> -#include <libc-diag.h> - -#if __GNUC_PREREQ (6, 0) -/* GCC 6.0 warns on big endian systems about: - htobeXX (beXXtoh (i)) != i - warning: self-comparison always evaluates to false [-Wtautological-compare] - because htobeXX(x) and beXXtoh(x) is defined to (x) - in string/endian.h on big endian systems. - The same applies to htoleXX/leXXtoh on little endian systems. */ -# define DIAG_IGNORE_NEEDS_COMMENT_TAUTOLOGICAL_COMPARE() \ - DIAG_IGNORE_NEEDS_COMMENT (6, "-Wtautological-compare") -#else -# define DIAG_IGNORE_NEEDS_COMMENT_TAUTOLOGICAL_COMPARE() -#endif - -int -do_test (void) -{ - int result = 0; - - for (uint64_t i = 0; i < (~UINT64_C (0)) >> 2; i = (i << 1) + 3) - { - if (i < UINT64_C (65536)) - { - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT_TAUTOLOGICAL_COMPARE (); - if (htobe16 (be16toh (i)) != i) - { - printf ("htobe16 (be16toh (%" PRIx64 ")) == %" PRIx16 "\n", - i, (uint16_t) htobe16 (be16toh (i))); - result = 1; - } - if (htole16 (le16toh (i)) != i) - { - printf ("htole16 (le16toh (%" PRIx64 ")) == %" PRIx16 "\n", - i, (uint16_t) htole16 (le16toh (i))); - result = 1; - } - DIAG_POP_NEEDS_COMMENT; - - uint16_t n[2]; - n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_16 (i); - n[__BYTE_ORDER == __BIG_ENDIAN] = i; - if (htole16 (i) != n[0]) - { - printf ("htole16 (%" PRIx64 ") == %" PRIx16 " != %" PRIx16 "\n", - i, (uint16_t) htole16 (i), n[0]); - result = 1; - } - if (htobe16 (i) != n[1]) - { - printf ("htobe16 (%" PRIx64 ") == %" PRIx16 " != %" PRIx16 "\n", - i, (uint16_t) htobe16 (i), n[1]); - result = 1; - } - } - - if (i < UINT64_C (4294967296)) - { - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT_TAUTOLOGICAL_COMPARE (); - if (htobe32 (be32toh (i)) != i) - { - printf ("htobe32 (be32toh (%" PRIx64 ")) == %" PRIx32 "\n", - i, (uint32_t) htobe32 (be32toh (i))); - result = 1; - } - if (htole32 (le32toh (i)) != i) - { - printf ("htole32 (le32toh (%" PRIx64 ")) == %" PRIx32 "\n", - i, (uint32_t) htole32 (le32toh (i))); - result = 1; - } - DIAG_POP_NEEDS_COMMENT; - - uint32_t n[2]; - n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_32 (i); - n[__BYTE_ORDER == __BIG_ENDIAN] = i; - if (htole32 (i) != n[0]) - { - printf ("htole32 (%" PRIx64 ") == %" PRIx32 " != %" PRIx32 "\n", - i, (uint32_t) htole32 (i), n[0]); - result = 1; - } - if (htobe32 (i) != n[1]) - { - printf ("htobe32 (%" PRIx64 ") == %" PRIx32 " != %" PRIx32 "\n", - i, (uint32_t) htobe32 (i), n[1]); - result = 1; - } - } - - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT_TAUTOLOGICAL_COMPARE (); - if (htobe64 (be64toh (i)) != i) - { - printf ("htobe64 (be64toh (%" PRIx64 ")) == %" PRIx64 "\n", - i, htobe64 (be64toh (i))); - result = 1; - } - if (htole64 (le64toh (i)) != i) - { - printf ("htole64 (le64toh (%" PRIx64 ")) == %" PRIx64 "\n", - i, htole64 (le64toh (i))); - result = 1; - } - DIAG_POP_NEEDS_COMMENT; - - uint64_t n[2]; - n[__BYTE_ORDER == __LITTLE_ENDIAN] = bswap_64 (i); - n[__BYTE_ORDER == __BIG_ENDIAN] = i; - if (htole64 (i) != n[0]) - { - printf ("htole64 (%" PRIx64 ") == %" PRIx64 " != %" PRIx64 "\n", - i, htole64 (i), n[0]); - result = 1; - } - if (htobe64 (i) != n[1]) - { - printf ("htobe64 (%" PRIx64 ") == %" PRIx64 " != %" PRIx64 "\n", - i, htobe64 (i), n[1]); - result = 1; - } - } - - return result; -} - -#include <support/test-driver.c> diff --git a/string/tst-inlcall.c b/string/tst-inlcall.c deleted file mode 100644 index f39f2c33a0..0000000000 --- a/string/tst-inlcall.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Tester for calling inline string functions. - Copyright (C) 1998-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -/* Make sure we test the optimized inline functions. */ -#define __USE_STRING_INLINES 1 - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <fcntl.h> - - -int -do_test (void) -{ - int status; - int errors = 0; - char buf1[1000]; - char *cp; - char ch; - - cp = strcpy (buf1, "hello world"); - if (strcmp ("hello world", cp++) != 0) - { - puts ("strcmp test 1 failed"); - ++errors; - } - - cp = buf1; - if (strcmp (cp++, "hello world") != 0) - { - puts ("strcmp test 2 failed"); - ++errors; - } - - ch = 'h'; - if (strchr ("hello world", ch++) == NULL) - { - puts ("strchr test 1 failed"); - ++errors; - } - - const char * const hw = "hello world"; - if (strpbrk (hw, "o") - hw != 4) - { - puts ("strpbrk test 1 failed"); - ++errors; - } - - if (errors == 0) - { - status = EXIT_SUCCESS; - puts ("No errors."); - } - else - { - status = EXIT_FAILURE; - printf ("%d errors.\n", errors); - } - return status; -} - -#include <support/test-driver.c> diff --git a/string/tst-strcoll-overflow.c b/string/tst-strcoll-overflow.c deleted file mode 100644 index 826af4f8a8..0000000000 --- a/string/tst-strcoll-overflow.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 2013-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <locale.h> -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> - -#include <support/check.h> -#include <support/test-driver.h> - -/* Verify that strcoll does not crash for large strings for which it - cannot cache weight lookup results. The size is large enough to - cause integer overflows on 32-bit as well as buffer overflows on - 64-bit. */ -#define SIZE 0x40000000ul - -int -do_test (void) -{ - TEST_VERIFY_EXIT (setlocale (LC_COLLATE, "en_GB.UTF-8") != NULL); - - char *p = malloc (SIZE); - if (p == NULL) - { - puts ("info: could not allocate memory, cannot run test"); - return EXIT_UNSUPPORTED; - } - - memset (p, 'x', SIZE - 1); - p[SIZE - 1] = 0; - printf ("info: strcoll result: %d\n", strcoll (p, p)); - return 0; -} - -/* This test can rung for a long time, but it should complete within - this time on reasonably current hardware. */ -#define TIMEOUT 300 -#include <support/test-driver.c> diff --git a/string/tst-strfry.c b/string/tst-strfry.c deleted file mode 100644 index e4e9018c5b..0000000000 --- a/string/tst-strfry.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int -do_test (void) -{ - char str[] = "this is a test"; - - strfry (str); - - return 0; -} - -#include <support/test-driver.c> diff --git a/string/tst-strlen.c b/string/tst-strlen.c deleted file mode 100644 index 15fbc8bd7b..0000000000 --- a/string/tst-strlen.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Make sure we don't test the optimized inline functions if we want to - test the real implementation. */ -#undef __USE_STRING_INLINES - -#include <stdio.h> -#include <string.h> - -int -do_test (void) -{ - static const size_t lens[] = { 0, 1, 0, 2, 0, 1, 0, 3, - 0, 1, 0, 2, 0, 1, 0, 4 }; - char basebuf[24 + 32]; - size_t base; - - for (base = 0; base < 32; ++base) - { - char *buf = basebuf + base; - size_t words; - - for (words = 0; words < 4; ++words) - { - size_t last; - memset (buf, 'a', words * 4); - - for (last = 0; last < 16; ++last) - { - buf[words * 4 + 0] = (last & 1) != 0 ? 'b' : '\0'; - buf[words * 4 + 1] = (last & 2) != 0 ? 'c' : '\0'; - buf[words * 4 + 2] = (last & 4) != 0 ? 'd' : '\0'; - buf[words * 4 + 3] = (last & 8) != 0 ? 'e' : '\0'; - buf[words * 4 + 4] = '\0'; - - if (strlen (buf) != words * 4 + lens[last]) - { - printf ("\ -strlen failed for base=%Zu, words=%Zu, and last=%Zu (is %zd, expected %zd)\n", - base, words, last, - strlen (buf), words * 4 + lens[last]); - return 1; - } - - if (strnlen (buf, -1) != words * 4 + lens[last]) - { - printf ("\ -strnlen failed for base=%Zu, words=%Zu, and last=%Zu (is %zd, expected %zd)\n", - base, words, last, - strnlen (buf, -1), words * 4 + lens[last]); - return 1; - } - } - } - } - return 0; -} - -#include <support/test-driver.c> diff --git a/string/tst-strtok.c b/string/tst-strtok.c deleted file mode 100644 index 628e106a46..0000000000 --- a/string/tst-strtok.c +++ /dev/null @@ -1,25 +0,0 @@ -/* Testcase for strtok reported by Andrew Church <achurch@achurch.org>. */ -#include <stdio.h> -#include <string.h> - -int -do_test (void) -{ - char buf[1] = { 0 }; - int result = 0; - - if (strtok (buf, " ") != NULL) - { - puts ("first strtok call did not return NULL"); - result = 1; - } - else if (strtok (NULL, " ") != NULL) - { - puts ("second strtok call did not return NULL"); - result = 1; - } - - return result; -} - -#include <support/test-driver.c> diff --git a/string/tst-strtok_r.c b/string/tst-strtok_r.c deleted file mode 100644 index fc3ed60b63..0000000000 --- a/string/tst-strtok_r.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Test strtok_r regression for BZ #14229. - Copyright (C) 2012-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#define TEST_MAIN -#define BUF1PAGES 1 -#include "test-string.h" - -int -test_main (void) -{ - char line[] = "udf 75868 1 - Live 0xffffffffa0bfb000\n"; - char **saveptrp; - char *tok; - - test_init (); - - /* Check strtok_r won't write beyond the size of (*saveptrp). */ - saveptrp = (char **) (buf1 + page_size - sizeof (*saveptrp)); - tok = strtok_r (line, " \t", saveptrp); - return strcmp (tok, "udf") != 0; -} - -#include <support/test-driver.c> diff --git a/string/tst-strxfrm.c b/string/tst-strxfrm.c deleted file mode 100644 index ffe191c60d..0000000000 --- a/string/tst-strxfrm.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Based on a test case by Paul Eggert. */ -#include <locale.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -char const string[] = ""; - - -static int -test (const char *locale) -{ - size_t bufsize; - size_t r; - size_t l; - char *buf; - locale_t loc; - int result = 0; - - if (setlocale (LC_COLLATE, locale) == NULL) - { - printf ("cannot set locale \"%s\"\n", locale); - return 1; - } - bufsize = strxfrm (NULL, string, 0) + 1; - buf = malloc (bufsize); - if (buf == NULL) - { - printf ("cannot allocate %zd bytes\n", bufsize); - return 1; - } - r = strxfrm (buf, string, bufsize); - l = strlen (buf); - if (r != l) - { - printf ("locale \"%s\": strxfrm returned %zu, strlen returned %zu\n", - locale, r, l); - result = 1; - } - - loc = newlocale (1 << LC_ALL, locale, NULL); - - r = strxfrm_l (buf, string, bufsize, loc); - l = strlen (buf); - if (r != l) - { - printf ("locale \"%s\": strxfrm_l returned %zu, strlen returned %zu\n", - locale, r, l); - result = 1; - } - - freelocale (loc); - - free (buf); - - return result; -} - - -int -do_test (void) -{ - int result = 0; - - result |= test ("C"); - result |= test ("en_US.ISO-8859-1"); - result |= test ("de_DE.UTF-8"); - - return result; -} - -#include <support/test-driver.c> diff --git a/string/tst-strxfrm2.c b/string/tst-strxfrm2.c deleted file mode 100644 index 12117e80d6..0000000000 --- a/string/tst-strxfrm2.c +++ /dev/null @@ -1,84 +0,0 @@ -#include <locale.h> -#include <stdio.h> -#include <string.h> - -int -do_test (void) -{ - static const char test_locale[] = "de_DE.UTF-8"; - - int res = 0; - - char buf[20]; - size_t l1 = strxfrm (NULL, "ab", 0); - size_t l2 = strxfrm (buf, "ab", 1); - size_t l3 = strxfrm (buf, "ab", sizeof (buf)); - if (l3 < sizeof (buf) && strlen (buf) != l3) - { - puts ("C locale l3 test failed"); - res = 1; - } - - size_t l4 = strxfrm (buf, "ab", l1 + 1); - if (l4 < l1 + 1 && strlen (buf) != l4) - { - puts ("C locale l4 test failed"); - res = 1; - } - - buf[l1] = 'Z'; - size_t l5 = strxfrm (buf, "ab", l1); - if (buf[l1] != 'Z') - { - puts ("C locale l5 test failed"); - res = 1; - } - - if (l1 != l2 || l1 != l3 || l1 != l4 || l1 != l5) - { - puts ("C locale retval test failed"); - res = 1; - } - - if (setlocale (LC_ALL, test_locale) == NULL) - { - printf ("cannot set locale \"%s\"\n", test_locale); - res = 1; - } - else - { - l1 = strxfrm (NULL, "ab", 0); - l2 = strxfrm (buf, "ab", 1); - l3 = strxfrm (buf, "ab", sizeof (buf)); - if (l3 < sizeof (buf) && strlen (buf) != l3) - { - puts ("UTF-8 locale l3 test failed"); - res = 1; - } - - l4 = strxfrm (buf, "ab", l1 + 1); - if (l4 < l1 + 1 && strlen (buf) != l4) - { - puts ("UTF-8 locale l4 test failed"); - res = 1; - } - - buf[l1] = 'Z'; - l5 = strxfrm (buf, "ab", l1); - if (buf[l1] != 'Z') - { - puts ("UTF-8 locale l5 test failed"); - res = 1; - } - - if (l1 != l2 || l1 != l3 || l1 != l4 || l1 != l5) - { - puts ("UTF-8 locale retval test failed"); - res = 1; - } - } - - return res; -} - -#include <support/test-driver.c> diff --git a/string/tst-svc.c b/string/tst-svc.c deleted file mode 100644 index d5cf2c19c9..0000000000 --- a/string/tst-svc.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Test for strverscmp() */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#define MAX_STRINGS 256 -#define MAX_LINE_SIZE 32 - -static int -compare (const void *p1, const void *p2) -{ - return strverscmp (*((char **) p1), *((char **) p2)); -} - -int -do_test (void) -{ - char line[MAX_LINE_SIZE + 1]; - char *str[MAX_STRINGS]; - int count = 0; - int i, n; - - while (count < MAX_STRINGS && fgets (line, MAX_LINE_SIZE, stdin) != NULL) - { - n = strlen (line) - 1; - - if (line[n] == '\n') - line[n] = '\0'; - - str[count] = strdup (line); - - if (str[count] == NULL) - exit (EXIT_FAILURE); - - ++count; - } - - qsort (str, count, sizeof (char *), compare); - - for (i = 0; i < count; ++i) - puts (str[i]); - - return EXIT_SUCCESS; -} - -#include <support/test-driver.c> diff --git a/string/tst-svc.expect b/string/tst-svc.expect deleted file mode 100644 index 6240112772..0000000000 --- a/string/tst-svc.expect +++ /dev/null @@ -1,33 +0,0 @@ -000 -001 -00 -00a -01 -01a -0 -0a -2.6.20 -2.6.21 -2.8 -2.8-0.4 -20 -21 -22 -212 -CP037 -CP345 -CP1257 -foo -foo-0.4 -foo-0.4a -foo-0.4b -foo-0.5 -foo-0.10.5 -foo-3.01 -foo-3.0 -foo-3.0.0 -foo-3.0.1 -foo-3.2 -foo-3.10 -foo00 -foo0 diff --git a/string/tst-svc.input b/string/tst-svc.input deleted file mode 100644 index 247b1c48f9..0000000000 --- a/string/tst-svc.input +++ /dev/null @@ -1,33 +0,0 @@ -0a -00 -0 -01 -001 -01a -00a -000 -2.6.21 -20 -212 -21 -22 -foo0 -foo00 -foo-0.4 -foo-3.0 -foo -foo-3.0.0 -foo-3.0.1 -foo-0.5 -2.6.20 -foo-0.4b -foo-3.10 -foo-3.2 -foo-3.01 -foo-0.4a -foo-0.10.5 -CP037 -CP1257 -CP345 -2.8-0.4 -2.8 diff --git a/string/tst-svc2.c b/string/tst-svc2.c deleted file mode 100644 index c0aa03dc18..0000000000 --- a/string/tst-svc2.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - - -static struct -{ - const char *str1; - const char *str2; -} tests[] = - { - { "B0075022800016.gbp.corp.com", "B007502280067.gbp.corp.com" }, - { "B0075022800016.gbp.corp.com", "B007502357019.GBP.CORP.COM" }, - { "B007502280067.gbp.corp.com", "B007502357019.GBP.CORP.COM" } - }; -#define ntests (sizeof (tests) / sizeof (tests[0])) - - -int -compare (const char *str1, const char *str2, int exp) -{ - int c = strverscmp (str1, str2); - if (c != 0) - c /= abs (c); - return c != exp; -} - - -int -do_test (void) -{ - int res = 0; - for (int i = 0; i < ntests; ++i) - { - if (compare (tests[i].str1, tests[i].str2, -1)) - { - printf ("FAIL: \"%s\" > \"%s\"\n", tests[i].str1, tests[i].str2); - res = 1; - } - if (compare (tests[i].str2, tests[i].str1, +1)) - { - printf ("FAIL: \"%s\" > \"%s\"\n", tests[i].str2, tests[i].str1); - res = 1; - } - char *copy1 = strdupa (tests[i].str1); - if (compare (tests[i].str1, copy1, 0)) - { - printf ("FAIL: \"%s\" != \"%s\"\n", tests[i].str1, copy1); - res = 1; - } - char *copy2 = strdupa (tests[i].str2); - if (compare (tests[i].str2, copy2, 0)) - { - printf ("FAIL: \"%s\" != \"%s\"\n", tests[i].str2, copy2); - res = 1; - } - } - return res; -} - -#include <support/test-driver.c> diff --git a/string/tst-xbzero-opt.c b/string/tst-xbzero-opt.c deleted file mode 100644 index 7c25632724..0000000000 --- a/string/tst-xbzero-opt.c +++ /dev/null @@ -1,298 +0,0 @@ -/* Test that explicit_bzero block clears are not optimized out. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This test is conceptually based on a test designed by Matthew - Dempsky for the OpenBSD regression suite: - <openbsd>/src/regress/lib/libc/explicit_bzero/explicit_bzero.c. - The basic idea is, we have a function that contains a - block-clearing operation (not necessarily explicit_bzero), after - which the block is dead, in the compiler-jargon sense. Execute - that function while running on a user-allocated alternative - stack. Then we have another pointer to the memory region affected - by the block clear -- namely, the original allocation for the - alternative stack -- and can find out whether it actually happened. - - The OpenBSD test uses sigaltstack and SIGUSR1 to get onto an - alternative stack. This causes a number of awkward problems; some - operating systems (e.g. Solaris and OSX) wipe the signal stack upon - returning to the normal stack, there's no way to be sure that other - processes running on the same system will not interfere, and the - signal stack is very small so it's not safe to call printf there. - This implementation instead uses the <ucontext.h> coroutine - interface. The coroutine stack is still too small to safely use - printf, but we know the OS won't erase it, so we can do all the - checks and printing from the normal stack. */ - -#define _GNU_SOURCE 1 - -#include <errno.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ucontext.h> -#include <unistd.h> - -/* A byte pattern that is unlikely to occur by chance: the first 16 - prime numbers (OEIS A000040). */ -static const unsigned char test_pattern[16] = -{ - 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 -}; - -/* Immediately after each subtest returns, we call swapcontext to get - back onto the main stack. That call might itself overwrite the - test pattern, so we fill a modest-sized buffer with copies of it - and check whether any of them survived. */ - -#define PATTERN_SIZE (sizeof test_pattern) -#define PATTERN_REPS 32 -#define TEST_BUFFER_SIZE (PATTERN_SIZE * PATTERN_REPS) - -/* There are three subtests, two of which are sanity checks. - Each test follows this sequence: - - main coroutine - ---- -------- - advance cur_subtest - swap - call setup function - prepare test buffer - swap - verify that buffer - was filled in - swap - possibly clear buffer - return - swap - check buffer again, - according to test - expectation - - In the "no_clear" case, we don't do anything to the test buffer - between preparing it and letting it go out of scope, and we expect - to find it. This confirms that the test buffer does get filled in - and we can find it from the stack buffer. In the "ordinary_clear" - case, we clear it using memset. Depending on the target, the - compiler may not be able to apply dead store elimination to the - memset call, so the test does not fail if the memset is not - eliminated. Finally, the "explicit_clear" case uses explicit_bzero - and expects _not_ to find the test buffer, which is the real - test. */ - -static ucontext_t uc_main, uc_co; - -/* Always check the test buffer immediately after filling it; this - makes externally visible side effects depend on the buffer existing - and having been filled in. */ -static inline __attribute__ ((always_inline)) void -prepare_test_buffer (unsigned char *buf) -{ - for (unsigned int i = 0; i < PATTERN_REPS; i++) - memcpy (buf + i*PATTERN_SIZE, test_pattern, PATTERN_SIZE); - - if (swapcontext (&uc_co, &uc_main)) - abort (); -} - -static void -setup_no_clear (void) -{ - unsigned char buf[TEST_BUFFER_SIZE]; - prepare_test_buffer (buf); -} - -static void -setup_ordinary_clear (void) -{ - unsigned char buf[TEST_BUFFER_SIZE]; - prepare_test_buffer (buf); - memset (buf, 0, TEST_BUFFER_SIZE); -} - -static void -setup_explicit_clear (void) -{ - unsigned char buf[TEST_BUFFER_SIZE]; - prepare_test_buffer (buf); - explicit_bzero (buf, TEST_BUFFER_SIZE); -} - -enum test_expectation - { - EXPECT_NONE, EXPECT_SOME, EXPECT_ALL, NO_EXPECTATIONS - }; -struct subtest -{ - void (*setup_subtest) (void); - const char *label; - enum test_expectation expected; -}; -static const struct subtest *cur_subtest; - -static const struct subtest subtests[] = -{ - { setup_no_clear, "no clear", EXPECT_SOME }, - /* The memset may happen or not, depending on compiler - optimizations. */ - { setup_ordinary_clear, "ordinary clear", NO_EXPECTATIONS }, - { setup_explicit_clear, "explicit clear", EXPECT_NONE }, - { 0, 0, -1 } -}; - -static void -test_coroutine (void) -{ - while (cur_subtest->setup_subtest) - { - cur_subtest->setup_subtest (); - if (swapcontext (&uc_co, &uc_main)) - abort (); - } -} - -/* All the code above this point runs on the coroutine stack. - All the code below this point runs on the main stack. */ - -static int test_status; -static unsigned char *co_stack_buffer; -static size_t co_stack_size; - -static unsigned int -count_test_patterns (unsigned char *buf, size_t bufsiz) -{ - unsigned char *first = memmem (buf, bufsiz, test_pattern, PATTERN_SIZE); - if (!first) - return 0; - unsigned int cnt = 0; - for (unsigned int i = 0; i < PATTERN_REPS; i++) - { - unsigned char *p = first + i*PATTERN_SIZE; - if (p + PATTERN_SIZE - buf > bufsiz) - break; - if (memcmp (p, test_pattern, PATTERN_SIZE) == 0) - cnt++; - } - return cnt; -} - -static void -check_test_buffer (enum test_expectation expected, - const char *label, const char *stage) -{ - unsigned int cnt = count_test_patterns (co_stack_buffer, co_stack_size); - switch (expected) - { - case EXPECT_NONE: - if (cnt == 0) - printf ("PASS: %s/%s: expected 0 got %d\n", label, stage, cnt); - else - { - printf ("FAIL: %s/%s: expected 0 got %d\n", label, stage, cnt); - test_status = 1; - } - break; - - case EXPECT_SOME: - if (cnt > 0) - printf ("PASS: %s/%s: expected some got %d\n", label, stage, cnt); - else - { - printf ("FAIL: %s/%s: expected some got 0\n", label, stage); - test_status = 1; - } - break; - - case EXPECT_ALL: - if (cnt == PATTERN_REPS) - printf ("PASS: %s/%s: expected %d got %d\n", label, stage, - PATTERN_REPS, cnt); - else - { - printf ("FAIL: %s/%s: expected %d got %d\n", label, stage, - PATTERN_REPS, cnt); - test_status = 1; - } - break; - - case NO_EXPECTATIONS: - printf ("INFO: %s/%s: found %d patterns%s\n", label, stage, cnt, - cnt == 0 ? " (memset not eliminated)" : ""); - break; - - default: - printf ("ERROR: %s/%s: invalid value for 'expected' = %d\n", - label, stage, (int)expected); - test_status = 1; - } -} - -static void -test_loop (void) -{ - cur_subtest = subtests; - while (cur_subtest->setup_subtest) - { - if (swapcontext (&uc_main, &uc_co)) - abort (); - check_test_buffer (EXPECT_ALL, cur_subtest->label, "prepare"); - if (swapcontext (&uc_main, &uc_co)) - abort (); - check_test_buffer (cur_subtest->expected, cur_subtest->label, "test"); - cur_subtest++; - } - /* Terminate the coroutine. */ - if (swapcontext (&uc_main, &uc_co)) - abort (); -} - -int -do_test (void) -{ - size_t page_alignment = sysconf (_SC_PAGESIZE); - if (page_alignment < sizeof (void *)) - page_alignment = sizeof (void *); - - co_stack_size = SIGSTKSZ + TEST_BUFFER_SIZE; - if (co_stack_size < page_alignment * 4) - co_stack_size = page_alignment * 4; - - void *p; - int err = posix_memalign (&p, page_alignment, co_stack_size); - if (err || !p) - { - printf ("ERROR: allocating alt stack: %s\n", strerror (err)); - return 2; - } - co_stack_buffer = p; - - if (getcontext (&uc_co)) - { - printf ("ERROR: allocating coroutine context: %s\n", strerror (err)); - return 2; - } - uc_co.uc_stack.ss_sp = co_stack_buffer; - uc_co.uc_stack.ss_size = co_stack_size; - uc_co.uc_link = &uc_main; - makecontext (&uc_co, test_coroutine, 0); - - test_loop (); - return test_status; -} - -#include <support/test-driver.c> diff --git a/string/wordcopy.c b/string/wordcopy.c deleted file mode 100644 index 65961cd03a..0000000000 --- a/string/wordcopy.c +++ /dev/null @@ -1,416 +0,0 @@ -/* _memcopy.c -- subroutines for memory copy functions. - Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* BE VERY CAREFUL IF YOU CHANGE THIS CODE...! */ - -#include <stddef.h> -#include <memcopy.h> - -/* _wordcopy_fwd_aligned -- Copy block beginning at SRCP to - block beginning at DSTP with LEN `op_t' words (not LEN bytes!). - Both SRCP and DSTP should be aligned for memory operations on `op_t's. */ - -#ifndef WORDCOPY_FWD_ALIGNED -# define WORDCOPY_FWD_ALIGNED _wordcopy_fwd_aligned -#endif - -void -WORDCOPY_FWD_ALIGNED (long int dstp, long int srcp, size_t len) -{ - op_t a0, a1; - - switch (len % 8) - { - case 2: - a0 = ((op_t *) srcp)[0]; - srcp -= 6 * OPSIZ; - dstp -= 7 * OPSIZ; - len += 6; - goto do1; - case 3: - a1 = ((op_t *) srcp)[0]; - srcp -= 5 * OPSIZ; - dstp -= 6 * OPSIZ; - len += 5; - goto do2; - case 4: - a0 = ((op_t *) srcp)[0]; - srcp -= 4 * OPSIZ; - dstp -= 5 * OPSIZ; - len += 4; - goto do3; - case 5: - a1 = ((op_t *) srcp)[0]; - srcp -= 3 * OPSIZ; - dstp -= 4 * OPSIZ; - len += 3; - goto do4; - case 6: - a0 = ((op_t *) srcp)[0]; - srcp -= 2 * OPSIZ; - dstp -= 3 * OPSIZ; - len += 2; - goto do5; - case 7: - a1 = ((op_t *) srcp)[0]; - srcp -= 1 * OPSIZ; - dstp -= 2 * OPSIZ; - len += 1; - goto do6; - - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - a0 = ((op_t *) srcp)[0]; - srcp -= 0 * OPSIZ; - dstp -= 1 * OPSIZ; - goto do7; - case 1: - a1 = ((op_t *) srcp)[0]; - srcp -=-1 * OPSIZ; - dstp -= 0 * OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do8; /* No-op. */ - } - - do - { - do8: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a1; - do7: - a1 = ((op_t *) srcp)[1]; - ((op_t *) dstp)[1] = a0; - do6: - a0 = ((op_t *) srcp)[2]; - ((op_t *) dstp)[2] = a1; - do5: - a1 = ((op_t *) srcp)[3]; - ((op_t *) dstp)[3] = a0; - do4: - a0 = ((op_t *) srcp)[4]; - ((op_t *) dstp)[4] = a1; - do3: - a1 = ((op_t *) srcp)[5]; - ((op_t *) dstp)[5] = a0; - do2: - a0 = ((op_t *) srcp)[6]; - ((op_t *) dstp)[6] = a1; - do1: - a1 = ((op_t *) srcp)[7]; - ((op_t *) dstp)[7] = a0; - - srcp += 8 * OPSIZ; - dstp += 8 * OPSIZ; - len -= 8; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[0] = a1; -} - -/* _wordcopy_fwd_dest_aligned -- Copy block beginning at SRCP to - block beginning at DSTP with LEN `op_t' words (not LEN bytes!). - DSTP should be aligned for memory operations on `op_t's, but SRCP must - *not* be aligned. */ - -#ifndef WORDCOPY_FWD_DEST_ALIGNED -# define WORDCOPY_FWD_DEST_ALIGNED _wordcopy_fwd_dest_aligned -#endif - -void -WORDCOPY_FWD_DEST_ALIGNED (long int dstp, long int srcp, size_t len) -{ - op_t a0, a1, a2, a3; - int sh_1, sh_2; - - /* Calculate how to shift a word read at the memory operation - aligned srcp to make it aligned for copy. */ - - sh_1 = 8 * (srcp % OPSIZ); - sh_2 = 8 * OPSIZ - sh_1; - - /* Make SRCP aligned by rounding it down to the beginning of the `op_t' - it points in the middle of. */ - srcp &= -OPSIZ; - - switch (len % 4) - { - case 2: - a1 = ((op_t *) srcp)[0]; - a2 = ((op_t *) srcp)[1]; - srcp -= 1 * OPSIZ; - dstp -= 3 * OPSIZ; - len += 2; - goto do1; - case 3: - a0 = ((op_t *) srcp)[0]; - a1 = ((op_t *) srcp)[1]; - srcp -= 0 * OPSIZ; - dstp -= 2 * OPSIZ; - len += 1; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - a3 = ((op_t *) srcp)[0]; - a0 = ((op_t *) srcp)[1]; - srcp -=-1 * OPSIZ; - dstp -= 1 * OPSIZ; - len += 0; - goto do3; - case 1: - a2 = ((op_t *) srcp)[0]; - a3 = ((op_t *) srcp)[1]; - srcp -=-2 * OPSIZ; - dstp -= 0 * OPSIZ; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do4; /* No-op. */ - } - - do - { - do4: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = MERGE (a2, sh_1, a3, sh_2); - do3: - a1 = ((op_t *) srcp)[1]; - ((op_t *) dstp)[1] = MERGE (a3, sh_1, a0, sh_2); - do2: - a2 = ((op_t *) srcp)[2]; - ((op_t *) dstp)[2] = MERGE (a0, sh_1, a1, sh_2); - do1: - a3 = ((op_t *) srcp)[3]; - ((op_t *) dstp)[3] = MERGE (a1, sh_1, a2, sh_2); - - srcp += 4 * OPSIZ; - dstp += 4 * OPSIZ; - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[0] = MERGE (a2, sh_1, a3, sh_2); -} - -/* _wordcopy_bwd_aligned -- Copy block finishing right before - SRCP to block finishing right before DSTP with LEN `op_t' words - (not LEN bytes!). Both SRCP and DSTP should be aligned for memory - operations on `op_t's. */ - -#ifndef WORDCOPY_BWD_ALIGNED -# define WORDCOPY_BWD_ALIGNED _wordcopy_bwd_aligned -#endif - -void -WORDCOPY_BWD_ALIGNED (long int dstp, long int srcp, size_t len) -{ - op_t a0, a1; - - switch (len % 8) - { - case 2: - srcp -= 2 * OPSIZ; - dstp -= 1 * OPSIZ; - a0 = ((op_t *) srcp)[1]; - len += 6; - goto do1; - case 3: - srcp -= 3 * OPSIZ; - dstp -= 2 * OPSIZ; - a1 = ((op_t *) srcp)[2]; - len += 5; - goto do2; - case 4: - srcp -= 4 * OPSIZ; - dstp -= 3 * OPSIZ; - a0 = ((op_t *) srcp)[3]; - len += 4; - goto do3; - case 5: - srcp -= 5 * OPSIZ; - dstp -= 4 * OPSIZ; - a1 = ((op_t *) srcp)[4]; - len += 3; - goto do4; - case 6: - srcp -= 6 * OPSIZ; - dstp -= 5 * OPSIZ; - a0 = ((op_t *) srcp)[5]; - len += 2; - goto do5; - case 7: - srcp -= 7 * OPSIZ; - dstp -= 6 * OPSIZ; - a1 = ((op_t *) srcp)[6]; - len += 1; - goto do6; - - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - srcp -= 8 * OPSIZ; - dstp -= 7 * OPSIZ; - a0 = ((op_t *) srcp)[7]; - goto do7; - case 1: - srcp -= 9 * OPSIZ; - dstp -= 8 * OPSIZ; - a1 = ((op_t *) srcp)[8]; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do8; /* No-op. */ - } - - do - { - do8: - a0 = ((op_t *) srcp)[7]; - ((op_t *) dstp)[7] = a1; - do7: - a1 = ((op_t *) srcp)[6]; - ((op_t *) dstp)[6] = a0; - do6: - a0 = ((op_t *) srcp)[5]; - ((op_t *) dstp)[5] = a1; - do5: - a1 = ((op_t *) srcp)[4]; - ((op_t *) dstp)[4] = a0; - do4: - a0 = ((op_t *) srcp)[3]; - ((op_t *) dstp)[3] = a1; - do3: - a1 = ((op_t *) srcp)[2]; - ((op_t *) dstp)[2] = a0; - do2: - a0 = ((op_t *) srcp)[1]; - ((op_t *) dstp)[1] = a1; - do1: - a1 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = a0; - - srcp -= 8 * OPSIZ; - dstp -= 8 * OPSIZ; - len -= 8; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[7] = a1; -} - -/* _wordcopy_bwd_dest_aligned -- Copy block finishing right - before SRCP to block finishing right before DSTP with LEN `op_t' - words (not LEN bytes!). DSTP should be aligned for memory - operations on `op_t', but SRCP must *not* be aligned. */ - -#ifndef WORDCOPY_BWD_DEST_ALIGNED -# define WORDCOPY_BWD_DEST_ALIGNED _wordcopy_bwd_dest_aligned -#endif - -void -WORDCOPY_BWD_DEST_ALIGNED (long int dstp, long int srcp, size_t len) -{ - op_t a0, a1, a2, a3; - int sh_1, sh_2; - - /* Calculate how to shift a word read at the memory operation - aligned srcp to make it aligned for copy. */ - - sh_1 = 8 * (srcp % OPSIZ); - sh_2 = 8 * OPSIZ - sh_1; - - /* Make srcp aligned by rounding it down to the beginning of the op_t - it points in the middle of. */ - srcp &= -OPSIZ; - srcp += OPSIZ; - - switch (len % 4) - { - case 2: - srcp -= 3 * OPSIZ; - dstp -= 1 * OPSIZ; - a2 = ((op_t *) srcp)[2]; - a1 = ((op_t *) srcp)[1]; - len += 2; - goto do1; - case 3: - srcp -= 4 * OPSIZ; - dstp -= 2 * OPSIZ; - a3 = ((op_t *) srcp)[3]; - a2 = ((op_t *) srcp)[2]; - len += 1; - goto do2; - case 0: - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - return; - srcp -= 5 * OPSIZ; - dstp -= 3 * OPSIZ; - a0 = ((op_t *) srcp)[4]; - a3 = ((op_t *) srcp)[3]; - goto do3; - case 1: - srcp -= 6 * OPSIZ; - dstp -= 4 * OPSIZ; - a1 = ((op_t *) srcp)[5]; - a0 = ((op_t *) srcp)[4]; - len -= 1; - if (OP_T_THRES <= 3 * OPSIZ && len == 0) - goto do0; - goto do4; /* No-op. */ - } - - do - { - do4: - a3 = ((op_t *) srcp)[3]; - ((op_t *) dstp)[3] = MERGE (a0, sh_1, a1, sh_2); - do3: - a2 = ((op_t *) srcp)[2]; - ((op_t *) dstp)[2] = MERGE (a3, sh_1, a0, sh_2); - do2: - a1 = ((op_t *) srcp)[1]; - ((op_t *) dstp)[1] = MERGE (a2, sh_1, a3, sh_2); - do1: - a0 = ((op_t *) srcp)[0]; - ((op_t *) dstp)[0] = MERGE (a1, sh_1, a2, sh_2); - - srcp -= 4 * OPSIZ; - dstp -= 4 * OPSIZ; - len -= 4; - } - while (len != 0); - - /* This is the right position for do0. Please don't move - it into the loop. */ - do0: - ((op_t *) dstp)[3] = MERGE (a0, sh_1, a1, sh_2); -} diff --git a/string/xpg-strerror.c b/string/xpg-strerror.c deleted file mode 100644 index 4a5e59d5ab..0000000000 --- a/string/xpg-strerror.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 1991-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <assert.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <sys/param.h> - - -/* Fill buf with a string describing the errno code in ERRNUM. */ -int -__xpg_strerror_r (int errnum, char *buf, size_t buflen) -{ - const char *estr = __strerror_r (errnum, buf, buflen); - - /* We know that __strerror_r returns buf (with a dynamically computed - string) if errnum is invalid, otherwise it returns a string whose - storage has indefinite extent. */ - if (estr == buf) - { - assert (errnum < 0 || errnum >= _sys_nerr_internal - || _sys_errlist_internal[errnum] == NULL); - return EINVAL; - } - else - { - assert (errnum >= 0 && errnum < _sys_nerr_internal - && _sys_errlist_internal[errnum] != NULL); - - size_t estrlen = strlen (estr); - - /* Terminate the string in any case. */ - if (buflen > 0) - *((char *) __mempcpy (buf, estr, MIN (buflen - 1, estrlen))) = '\0'; - - return buflen <= estrlen ? ERANGE : 0; - } -} |