Add tests for wcsrchr and wcscpy

This commit is contained in:
Ulrich Drepper 2011-12-17 14:14:58 -05:00
parent caafb2b06b
commit 5b330a2d90
6 changed files with 161 additions and 90 deletions

View File

@ -1,7 +1,12 @@
2011-12-12 Jeff Law <law@redhat.com>
2011-11-17 Liubov Dmitrieva <liubov.dmitrieva@gmail.com>
* manual/resource.texi (Processor Resources):
Fix typo in _SC_NPROCESSORS_ONLN.
* wcsmbs/Makefile (strop-tests): Add wcsrchr wcscpy.
* wcsmbs/test-wcsrchr.c: New file.
* string/test-strrchr.c: Add wcsrchr support.
(WIDE): New macro.
* wcsmbs/test-wcscpy.c: New file.
* string/test-strcpy.c: Add wcscpy support.
(WIDE): New macro.
2011-12-10 Ulrich Drepper <drepper@gmail.com>

View File

@ -1,7 +1,8 @@
/* Test and measure strcpy functions.
Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
Copyright (C) 1999, 2002, 2003, 2005, 2011 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
@ -18,29 +19,55 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifdef WIDE
# include <wchar.h>
# define CHAR wchar_t
# define UCHAR wchar_t
# 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 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
# 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 *);
CHAR *SIMPLE_STRCPY (CHAR *, const CHAR *);
IMPL (simple_strcpy, 0)
IMPL (strcpy, 1)
IMPL (SIMPLE_STRCPY, 0)
IMPL (STRCPY, 1)
char *
simple_strcpy (char *dst, const char *src)
CHAR *
SIMPLE_STRCPY (CHAR *dst, const CHAR *src)
{
char *ret = dst;
CHAR *ret = dst;
while ((*dst++ = *src++) != '\0');
return ret;
}
#endif
typedef char *(*proto_t) (char *, const char *);
typedef CHAR *(*proto_t) (CHAR *, const CHAR *);
static void
do_one_test (impl_t *impl, char *dst, const char *src,
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))
@ -51,7 +78,7 @@ do_one_test (impl_t *impl, char *dst, const char *src,
return;
}
if (strcmp (dst, src) != 0)
if (STRCMP (dst, src) != 0)
{
error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"",
impl->name, dst, src);
@ -82,25 +109,27 @@ static void
do_test (size_t align1, size_t align2, size_t len, int max_char)
{
size_t i;
char *s1, *s2;
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 >= page_size)
if ((align1 + len) * sizeof(CHAR) >= page_size)
return;
align2 &= 7;
if (align2 + len >= page_size)
if ((align2 + len) * sizeof(CHAR) >= page_size)
return;
s1 = (char *) (buf1 + align1);
s2 = (char *) (buf2 + align2);
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;
if (HP_TIMING_AVAIL)
printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);
printf ("Length %4zd, alignments in bytes %2zd/%2zd:", len, align1 * sizeof(CHAR), align2 * sizeof(CHAR));
FOR_EACH_IMPL (impl, 0)
do_one_test (impl, s2, s1, len);
@ -113,15 +142,21 @@ static void
do_random_tests (void)
{
size_t i, j, n, align1, align2, len;
unsigned char *p1 = buf1 + page_size - 512;
unsigned char *p2 = buf2 + page_size - 512;
unsigned char *res;
UCHAR *p1 = (UCHAR *) (buf1 + page_size) - 512;
UCHAR *p2 = (UCHAR *) (buf2 + page_size) - 512;
UCHAR *res;
for (n = 0; n < ITERATIONS; n++)
{
align1 = random () & 31;
/* 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 () & 31;
align2 = random () & (63 / sizeof(CHAR));
else
align2 = align1 + (random () & 24);
len = random () & 511;
@ -139,17 +174,16 @@ do_random_tests (void)
p1[i] = 0;
else
{
p1[i] = random () & 255;
p1[i] = random () & BIG_CHAR;
if (i >= align1 && i < len + align1 && !p1[i])
p1[i] = (random () & 127) + 3;
p1[i] = (random () & SMALL_CHAR) + 3;
}
}
FOR_EACH_IMPL (impl, 1)
{
memset (p2 - 64, '\1', 512 + 64);
res = (unsigned char *) CALL (impl, (char *) (p2 + align2),
(char *) (p1 + align1));
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",
@ -177,7 +211,7 @@ do_random_tests (void)
break;
}
}
if (memcmp (p1 + align1, p2 + align2, len + 1))
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);
@ -201,24 +235,24 @@ test_main (void)
for (i = 0; i < 16; ++i)
{
do_test (0, 0, i, 127);
do_test (0, 0, i, 255);
do_test (0, i, i, 127);
do_test (i, 0, i, 255);
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, 127);
do_test (8 - i, 2 * i, 8 << i, 127);
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, 127);
do_test (2 * i, i, 8 << i, 255);
do_test (i, i, 8 << i, 127);
do_test (i, i, 8 << i, 255);
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 ();

View File

@ -1,7 +1,8 @@
/* Test and measure strrchr functions.
Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
/* Test and measure STRCHR functions.
Copyright (C) 1999, 2002, 2003, 2005, 2011 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
@ -21,28 +22,45 @@
#define TEST_MAIN
#include "test-string.h"
typedef char *(*proto_t) (const char *, int);
char *simple_strrchr (const char *, int);
#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
IMPL (simple_strrchr, 0)
IMPL (strrchr, 1)
typedef CHAR *(*proto_t) (const CHAR *, int);
CHAR *SIMPLE_STRRCHR (const CHAR *, int);
char *
simple_strrchr (const char *s, int c)
IMPL (SIMPLE_STRRCHR, 0)
IMPL (STRRCHR, 1)
CHAR *
SIMPLE_STRRCHR (const CHAR *s, int c)
{
const char *ret = NULL;
const CHAR *ret = NULL;
for (; *s != '\0'; ++s)
if (*s == (char) c)
if (*s == (CHAR) c)
ret = s;
return (char *) (c == '\0' ? s : ret);
return (CHAR *) (c == '\0' ? s : ret);
}
static void
do_one_test (impl_t *impl, const char *s, int c, char *exp_res)
do_one_test (impl_t *impl, const CHAR *s, int c, CHAR *exp_res)
{
char *res = CALL (impl, s, c);
CHAR *res = CALL (impl, s, c);
if (res != exp_res)
{
error (0, 0, "Wrong result in function %s %p %p", impl->name,
@ -72,41 +90,45 @@ do_one_test (impl_t *impl, const char *s, int c, char *exp_res)
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 *result;
CHAR *buf = (CHAR *) buf1;
align &= 7;
if (align + len >= page_size)
if ( (align + len) * sizeof(CHAR) >= page_size)
return;
for (i = 0; i < len; ++i)
{
buf1[align + i] = random () & max_char;
if (!buf1[align + i])
buf1[align + i] = random () & max_char;
if (!buf1[align + i])
buf1[align + i] = 1;
if ((i > pos || pos >= len) && buf1[align + i] == seek_char)
buf1[align + i] = seek_char + 10 + (random () & 15);
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);
}
buf1[align + len] = 0;
buf[align + len] = 0;
if (pos < len)
{
buf1[align + pos] = seek_char;
result = (char *) (buf1 + align + pos);
buf[align + pos] = seek_char;
result = (CHAR *) (buf + align + pos);
}
else if (seek_char == 0)
result = (char *) (buf1 + align + len);
result = (CHAR *) (buf + align + len);
else
result = NULL;
if (HP_TIMING_AVAIL)
printf ("Length %4zd, alignment %2zd:", pos, align);
printf ("Length %4zd, alignment in bytes %2zd:", pos, align * sizeof(CHAR));
FOR_EACH_IMPL (impl, 0)
do_one_test (impl, (char *) (buf1 + align), seek_char, result);
do_one_test (impl, (CHAR *) (buf + align), seek_char, result);
if (HP_TIMING_AVAIL)
putchar ('\n');
@ -117,16 +139,22 @@ do_random_tests (void)
{
size_t i, j, n, align, pos, len;
int seek_char;
char *result;
unsigned char *p = buf1 + page_size - 512;
CHAR *result;
UCHAR *p = (UCHAR *) (buf1 + page_size) - 512;
for (n = 0; n < ITERATIONS; n++)
{
align = random () & 15;
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)
@ -165,18 +193,18 @@ do_random_tests (void)
}
if (pos <= len)
result = (char *) (p + pos + align);
result = (CHAR *) (p + pos + align);
else if (seek_char == 0)
result = (char *) (p + len + align);
result = (CHAR *) (p + len + align);
else
result = NULL;
FOR_EACH_IMPL (impl, 1)
if (CALL (impl, (char *) (p + align), seek_char) != result)
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);
CALL (impl, (CHAR *) (p + align), seek_char), result, p);
ret = 1;
}
}
@ -196,38 +224,38 @@ test_main (void)
for (i = 1; i < 8; ++i)
{
do_test (0, 16 << i, 2048, 23, 127);
do_test (i, 16 << i, 2048, 23, 127);
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, 127);
do_test (i, 64, 256, 23, 255);
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, 127);
do_test (0, i, i + 1, 23, 255);
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, 127);
do_test (i, 16 << i, 2048, 0, 127);
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, 127);
do_test (i, 64, 256, 0, 255);
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, 127);
do_test (0, i, i + 1, 0, 255);
do_test (0, i, i + 1, 0, SMALL_CHAR);
do_test (0, i, i + 1, 0, BIG_CHAR);
}
do_random_tests ();

View File

@ -42,7 +42,7 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf \
isoc99_swscanf isoc99_vswscanf
strop-tests := wcscmp wmemcmp wcslen wcschr
strop-tests := wcscmp wmemcmp wcslen wcschr wcsrchr wcscpy
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
wcsatcliff $(addprefix test-,$(strop-tests))

2
wcsmbs/test-wcscpy.c Normal file
View File

@ -0,0 +1,2 @@
#define WIDE 1
#include "../string/test-strcpy.c"

2
wcsmbs/test-wcsrchr.c Normal file
View File

@ -0,0 +1,2 @@
#define WIDE 1
#include "../string/test-strrchr.c"