Add wcslen test cases

This commit is contained in:
Liubov Dmitrieva 2011-10-23 14:11:50 -04:00 committed by Ulrich Drepper
parent 09f699eaef
commit 619fcccaa3
4 changed files with 58 additions and 40 deletions

View File

@ -1,3 +1,12 @@
2011-10-18 Liubov Dmitrieva <liubov.dmitrieva@gmail.com>
* wcsmbs/Makefile
(strop-tests): Add wcslen.
* wcsmbs/test-wcslen.c: New file.
* string/test-strlen.c: Update.
Add wcslen support.
(WIDE): New macro.
2011-10-23 Ulrich Drepper <drepper@gmail.com> 2011-10-23 Ulrich Drepper <drepper@gmail.com>
* po/it.po: Update from translation team. * po/it.po: Update from translation team.

View File

@ -1,7 +1,8 @@
/* Test and measure strlen functions. /* Test and measure STRLEN 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. 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.
Added wcslen support by Liubov Dmitrieva <liubov.dmitrieva@gmail.com>, 2011
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
@ -21,31 +22,43 @@
#define TEST_MAIN #define TEST_MAIN
#include "test-string.h" #include "test-string.h"
typedef size_t (*proto_t) (const char *); #ifndef WIDE
size_t simple_strlen (const char *); # define STRLEN strlen
size_t builtin_strlen (const char *); # 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
IMPL (simple_strlen, 0) typedef size_t (*proto_t) (const CHAR *);
IMPL (builtin_strlen, 0)
IMPL (strlen, 1)
size_t size_t
simple_strlen (const char *s) simple_STRLEN (const CHAR *s)
{ {
const char *p; const CHAR *p;
for (p = s; *p; ++p); for (p = s; *p; ++p);
return p - s; return p - s;
} }
#ifndef WIDE
size_t size_t
builtin_strlen (const char *p) builtin_strlen (const CHAR *p)
{ {
return __builtin_strlen (p); return __builtin_strlen (p);
} }
IMPL (builtin_strlen, 0)
#endif
IMPL (simple_STRLEN, 0)
IMPL (STRLEN, 1)
static void static void
do_one_test (impl_t *impl, const char *s, size_t exp_len) do_one_test (impl_t *impl, const CHAR *s, size_t exp_len)
{ {
size_t len = CALL (impl, s); size_t len = CALL (impl, s);
if (len != exp_len) if (len != exp_len)
@ -76,23 +89,25 @@ do_one_test (impl_t *impl, const char *s, size_t exp_len)
} }
static void static void
do_test (size_t align, size_t len, int max_char) do_test (size_t align, size_t len)
{ {
size_t i; size_t i;
align &= 7; align &= 63;
if (align + len >= page_size) if (align + sizeof(CHAR) * len >= page_size)
return; return;
CHAR *buf = (CHAR *) (buf1);
for (i = 0; i < len; ++i) for (i = 0; i < len; ++i)
buf1[align + i] = 1 + 7 * i % max_char; buf[align + i] = 1 + 11111 * i % MAX_CHAR;
buf1[align + len] = 0; buf[align + len] = 0;
if (HP_TIMING_AVAIL) if (HP_TIMING_AVAIL)
printf ("Length %4zd, alignment %2zd:", len, align); printf ("Length %4zd, alignment %2zd:", len, align);
FOR_EACH_IMPL (impl, 0) FOR_EACH_IMPL (impl, 0)
do_one_test (impl, (char *) (buf1 + align), len); do_one_test (impl, (CHAR *) (buf + align), len);
if (HP_TIMING_AVAIL) if (HP_TIMING_AVAIL)
putchar ('\n'); putchar ('\n');
@ -102,7 +117,7 @@ static void
do_random_tests (void) do_random_tests (void)
{ {
size_t i, j, n, align, len; size_t i, j, n, align, len;
unsigned char *p = buf1 + page_size - 512; CHAR *p = (CHAR *) (buf1 + page_size - 512 * sizeof(CHAR));
for (n = 0; n < ITERATIONS; n++) for (n = 0; n < ITERATIONS; n++)
{ {
@ -127,10 +142,10 @@ do_random_tests (void)
} }
FOR_EACH_IMPL (impl, 1) FOR_EACH_IMPL (impl, 1)
if (CALL (impl, (char *) (p + align)) != len) if (CALL (impl, (CHAR *) (p + align)) != len)
{ {
error (0, 0, "Iteration %zd - wrong result in function %s (%zd) %zd != %zd, p %p", error (0, 0, "Iteration %zd - wrong result in function %s (%zd) %zd != %zd, p %p",
n, impl->name, align, CALL (impl, (char *) (p + align)), n, impl->name, align, CALL (impl, (CHAR *) (p + align)),
len, p); len, p);
ret = 1; ret = 1;
} }
@ -149,28 +164,20 @@ test_main (void)
printf ("\t%s", impl->name); printf ("\t%s", impl->name);
putchar ('\n'); putchar ('\n');
for (i = 1; i < 8; ++i) /* Checking with only 4 * N alignments for wcslen, other alignments are wrong for wchar_t type arrays*/
do_test (0, i, 127);
for (i = 1; i < 8; ++i) for (i = 1; i < 8; ++i)
do_test (i, i, 127); {
do_test (sizeof(CHAR) * i, i);
do_test (0, i);
}
for (i = 2; i <= 10; ++i) for (i = 2; i <= 12; ++i)
{ {
do_test (0, 1 << i, 127); do_test (0, 1 << i);
do_test (1, 1 << i, 127); 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));
for (i = 1; i < 8; ++i)
do_test (0, i, 255);
for (i = 1; i < 8; ++i)
do_test (i, i, 255);
for (i = 2; i <= 10; ++i)
{
do_test (0, 1 << i, 255);
do_test (1, 1 << i, 255);
} }
do_random_tests (); 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_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf \
isoc99_swscanf isoc99_vswscanf isoc99_swscanf isoc99_vswscanf
strop-tests := wcscmp wmemcmp strop-tests := wcscmp wmemcmp wcslen
tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \
tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \
wcsatcliff $(addprefix test-,$(strop-tests)) wcsatcliff $(addprefix test-,$(strop-tests))

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

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