(strchr): Add cast to avoid warning.
[kopensolaris-gnu/glibc.git] / string / test-strpbrk.c
index 0683255..f3ed208 100644 (file)
@@ -1,5 +1,5 @@
 /* Test and measure strpbrk functions.
-   Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Jakub Jelinek <jakub@redhat.com>, 1999.
 
@@ -26,7 +26,9 @@
 
 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)
 
@@ -42,6 +44,19 @@ simple_strpbrk (const char *s, const char *rej)
        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
 
 static void
@@ -58,7 +73,9 @@ do_one_test (impl_t *impl, const char *s, const char *rej, RES_TYPE exp_res)
 
   if (HP_TIMING_AVAIL)
     {
-      hp_timing_t start, stop, best_time = ~ (hp_timing_t) 0;
+      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)
@@ -82,11 +99,11 @@ do_test (size_t align, size_t pos, size_t len)
   char *rej, *s;
 
   align &= 7;
-  if (align + pos >= page_size || len > 240)
+  if (align + pos + 10 >= page_size || len > 240)
     return;
 
-  rej = buf2 + (random () & 255);
-  s = buf1 + align;
+  rej = (char *) (buf2 + (random () & 255));
+  s = (char *) (buf1 + align);
 
   for (i = 0; i < len; ++i)
     {
@@ -112,6 +129,12 @@ do_test (size_t align, size_t pos, size_t len)
        }
     }
   s[pos] = rej[random () % (len + 1)];
+  if (s[pos])
+    {
+      for (i = pos + 1; i < pos + 10; ++i)
+       s[i] = random () & 255;
+      s[i] = '\0';
+    }
   result = STRPBRK_RESULT (s, pos);
 
   if (HP_TIMING_AVAIL)
@@ -127,7 +150,7 @@ do_test (size_t align, size_t pos, size_t len)
 static void
 do_random_tests (void)
 {
-  size_t i, j, n, align, pos, len;
+  size_t i, j, n, align, pos, len, rlen;
   RES_TYPE result;
   int c;
   unsigned char *p = buf1 + page_size - 512;
@@ -139,12 +162,17 @@ do_random_tests (void)
       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)
-       len = random () & 63;
+       rlen = random () & 63;
       else
-       len = random () & 15;
-      rej = buf2 + page_size - len - 1 - (random () & 7);
-      for (i = 0; i < len; ++i)
+       rlen = random () & 15;
+      rej = buf2 + page_size - rlen - 1 - (random () & 7);
+      for (i = 0; i < rlen; ++i)
        {
          rej[i] = random () & 255;
          if (!rej[i])
@@ -154,38 +182,41 @@ do_random_tests (void)
        }
       rej[i] = '\0';
       for (c = 1; c <= 255; ++c)
-       if (strchr (rej, c) == NULL)
+       if (strchr ((char *) rej, c) == NULL)
          break;
-      j = pos + align + 64;
+      j = (pos > len ? pos : len) + align + 64;
       if (j > 512)
        j = 512;
 
       for (i = 0; i < j; i++)
        {
-         if (i == pos + align)
-           p[i] = rej[random () % (len + 1)];
+         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 () & 255;
          else
            {
              p[i] = random () & 255;
-             if (strchr (rej, p[i]))
+             if (strchr ((char *) rej, p[i]))
                {
                  p[i] = random () & 255;
-                 if (strchr (rej, p[i]))
+                 if (strchr ((char *) rej, p[i]))
                    p[i] = c;
                }
            }
        }
 
-      result = STRPBRK_RESULT (p + align, pos);
+      result = STRPBRK_RESULT ((char *) (p + align), pos < len ? pos : len);
 
       FOR_EACH_IMPL (impl, 1)
-       if (CALL (impl, p + align, rej) != result)
+       if (CALL (impl, (char *) (p + align), (char *) rej) != result)
          {
-           error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %p, %zd, %zd) %p != %p",
-                  n, impl->name, align, rej, len, pos,
-                  (void *) CALL (impl, p + align, rej), (void *) 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;
          }
     }