mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +00:00
* string/Makefile (strop-tests): Add memmem.
* string/test-memmem.c: New file. * string/test-string.h (BUF1PAGES): Define to 1 if undefined. (test_init): Size buf1 according to BUF1PAGES. * stdio-common/scanf16.c: New file. * stdio-common/scanf17.c: New file. * scripts/data/localplt-sparc64-linux-gnu.data: New file.
This commit is contained in:
parent
b5ba2c790c
commit
f63abf584c
13
ChangeLog
13
ChangeLog
@ -1,3 +1,10 @@
|
|||||||
|
2008-05-24 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* string/Makefile (strop-tests): Add memmem.
|
||||||
|
* string/test-memmem.c: New file.
|
||||||
|
* string/test-string.h (BUF1PAGES): Define to 1 if undefined.
|
||||||
|
(test_init): Size buf1 according to BUF1PAGES.
|
||||||
|
|
||||||
2008-05-24 Jakub Jelinek <jakub@redhat.com>
|
2008-05-24 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* libio/stdio.h (vscanf): Fix -std=c99 redirect.
|
* libio/stdio.h (vscanf): Fix -std=c99 redirect.
|
||||||
@ -5,8 +12,8 @@
|
|||||||
(CFLAGS-scanf17.c): New.
|
(CFLAGS-scanf17.c): New.
|
||||||
* stdio-common/scanf14.c (main): Add fscanf and scanf tests.
|
* stdio-common/scanf14.c (main): Add fscanf and scanf tests.
|
||||||
* stdio-common/scanf15.c (main): Likewise.
|
* stdio-common/scanf15.c (main): Likewise.
|
||||||
* stdio-common/scanf16.c: New test.
|
* stdio-common/scanf16.c: New file.
|
||||||
* stdio-common/scanf17.c: New test.
|
* stdio-common/scanf17.c: New file.
|
||||||
|
|
||||||
2008-05-24 Ulrich Drepper <drepper@redhat.com>
|
2008-05-24 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
@ -52,7 +59,7 @@
|
|||||||
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
|
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
|
||||||
(__SYSCALL_CLOBBERS): Likewise.
|
(__SYSCALL_CLOBBERS): Likewise.
|
||||||
* scripts/data/localplt-sparc-linux-gnu.data: New file.
|
* scripts/data/localplt-sparc-linux-gnu.data: New file.
|
||||||
* scripts/data/localplt-sparc64-linux-gnu.data: Likewise.
|
* scripts/data/localplt-sparc64-linux-gnu.data: New file.
|
||||||
|
|
||||||
2008-05-21 Jakub Jelinek <jakub@redhat.com>
|
2008-05-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ o-objects.ob := memcpy.o memset.o memchr.o
|
|||||||
|
|
||||||
strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
|
strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
|
||||||
stpcpy stpncpy strcat strchr strcmp strcpy strcspn \
|
stpcpy stpncpy strcat strchr strcmp strcpy strcspn \
|
||||||
strlen strncmp strncpy strpbrk strrchr strspn
|
strlen strncmp strncpy strpbrk strrchr strspn memmem
|
||||||
tests := tester inl-tester noinl-tester testcopy test-ffs \
|
tests := tester inl-tester noinl-tester testcopy test-ffs \
|
||||||
tst-strlen stratcliff tst-svc tst-inlcall \
|
tst-strlen stratcliff tst-svc tst-inlcall \
|
||||||
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
|
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
|
||||||
|
185
string/test-memmem.c
Normal file
185
string/test-memmem.c
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/* Test and measure memmem functions.
|
||||||
|
Copyright (C) 2008 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, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#define TEST_MAIN
|
||||||
|
#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 (__builtin_expect (haystack_len < needle_len, 0))
|
||||||
|
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 void
|
||||||
|
do_one_test (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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
{
|
||||||
|
hp_timing_t start __attribute ((unused));
|
||||||
|
hp_timing_t stop __attribute ((unused));
|
||||||
|
hp_timing_t best_time = ~ (hp_timing_t) 0;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < 32; ++i)
|
||||||
|
{
|
||||||
|
HP_TIMING_NOW (start);
|
||||||
|
CALL (impl, haystack, haystack_len, needle, needle_len);
|
||||||
|
HP_TIMING_NOW (stop);
|
||||||
|
HP_TIMING_BEST (best_time, start, stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("\t%zd", (size_t) best_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
printf ("String %s, offset %zd:", str, idx);
|
||||||
|
|
||||||
|
FOR_EACH_IMPL (impl, 0)
|
||||||
|
do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx);
|
||||||
|
|
||||||
|
memcpy (buf1 + idx, tmpbuf, len);
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
putchar ('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx);
|
||||||
|
|
||||||
|
FOR_EACH_IMPL (impl, 0)
|
||||||
|
do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len,
|
||||||
|
buf1 + idx);
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
putchar ('\n');
|
||||||
|
|
||||||
|
memcpy (buf1 + idx, tmpbuf, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char *const strs[] =
|
||||||
|
{
|
||||||
|
"00000", "00112233", "0123456789", "0000111100001111",
|
||||||
|
"00000111110000022222", "012345678901234567890",
|
||||||
|
"abc0", "aaaa0", "abcabc0"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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 < 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 "../test-skeleton.c"
|
@ -1,5 +1,5 @@
|
|||||||
/* Test and measure string and memory functions.
|
/* Test and measure string and memory functions.
|
||||||
Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2002, 2004, 2008 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
|
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
|
||||||
|
|
||||||
@ -118,6 +118,10 @@ size_t iterations = 100000;
|
|||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
|
#ifndef BUF1PAGES
|
||||||
|
# define BUF1PAGES 1
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_init (void)
|
test_init (void)
|
||||||
{
|
{
|
||||||
@ -126,11 +130,11 @@ test_init (void)
|
|||||||
if (page_size < MIN_PAGE_SIZE)
|
if (page_size < MIN_PAGE_SIZE)
|
||||||
page_size = MIN_PAGE_SIZE;
|
page_size = MIN_PAGE_SIZE;
|
||||||
#endif
|
#endif
|
||||||
buf1 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANON, -1, 0);
|
MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
if (buf1 == MAP_FAILED)
|
if (buf1 == MAP_FAILED)
|
||||||
error (EXIT_FAILURE, errno, "mmap failed");
|
error (EXIT_FAILURE, errno, "mmap failed");
|
||||||
if (mprotect (buf1 + page_size, page_size, PROT_NONE))
|
if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE))
|
||||||
error (EXIT_FAILURE, errno, "mprotect failed");
|
error (EXIT_FAILURE, errno, "mprotect failed");
|
||||||
buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANON, -1, 0);
|
MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
@ -145,7 +149,7 @@ test_init (void)
|
|||||||
srandom (seed);
|
srandom (seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset (buf1, 0xa5, page_size);
|
memset (buf1, 0xa5, BUF1PAGES * page_size);
|
||||||
memset (buf2, 0x5a, page_size);
|
memset (buf2, 0x5a, page_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user