1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00
1999-10-04  Ulrich Drepper  <drepper@cygnus.com>

	* include/string.h: Add __memrchr declaration.

	* string/string.h: Moce __memrchr declaration to include/string.h.

1999-10-03  Ulrich Drepper  <drepper@cygnus.com>

	* string/Makefile (routines): Add memrchr.

	* sysdeps/generic/memrchr.c: Don't undef memchr, undef memrchr.
	Correct order of tests for matching bytes.

	* string/tester.c: Add tests for memrchr.

	* sysdeps/i386/i486/bits/string.h (__memrchr): Correct implementation.
	Start from the last character and take decrement not increment
	into account for correction in return line.  Add memrchr alias.
	* sysdeps/i386/bits/string.h: Likewise.
This commit is contained in:
Ulrich Drepper
1999-10-04 07:30:05 +00:00
parent ba60c6d921
commit fbda91b119
7 changed files with 105 additions and 27 deletions

View File

@ -563,6 +563,52 @@ test_strrchr (void)
}
}
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;
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, 9);
check(memrchr(buf + align + pos + 1, 'x', len - (pos + 1)) == NULL,
10);
buf[align + pos] = '-';
}
}
}
}
}
void
test_rindex (void)
{
@ -1183,6 +1229,9 @@ main (void)
/* strrchr. */
test_strrchr ();
/* memrchr. */
test_memrchr ();
/* rindex - just like strrchr. */
test_rindex ();