(__strdup): Call __strdup not strdup in case of non-constant string.
[kopensolaris-gnu/glibc.git] / string / testcopy.c
index 3a39b32..030b229 100644 (file)
-/* Copyright (C) 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1990, 1991, 1992, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
    Contributed by Torbjorn Granlund (tege@sics.se).
 
-This file is part of the GNU C Library.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
 
-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
-Library General Public License for more details.
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
-
-#include <ansidecl.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 #include <malloc.h>
 
 int
-DEFUN(main, (argc, argv),
-      int argc AND char **argv)
+main (void)
 {
-  if (argc > 1)
+  char *mem, *memp;
+  char *rand_mem;
+  char *lo_around, *hi_around;
+  int size, max_size;
+  int src_off, dst_off;
+  int i;
+  int space_around = 10;
+
+  max_size = 256;
+
+  mem = malloc (max_size + 2 * max_size + 2 * space_around);
+  rand_mem = malloc (max_size);
+  lo_around = malloc (space_around);
+  hi_around = malloc (space_around);
+  memp = mem + space_around;
+
+  /* Fill RAND_MEM with random bytes, each non-zero.  */
+  for (i = 0; i < max_size; i++)
     {
-      long int s[1025], d[1025];
-      int i;
-      int a, b = 0;
-
-      a = atoi(argv[1]);
-      if (argc > 2)
-       b = atoi(argv[2]);
-
-      for (i = 10000; --i; )
-       memmove (((char *) d) + b, ((char *) s) + a, 1024 * 4);
+      int x;
+      do
+       x = random ();
+      while (x == 0);
+      rand_mem[i] = x;
     }
-  else
-    {
-#define SIZE (3*0x200)
 
-      unsigned char *p = valloc(SIZE + 40);
-      int src_align, dst_align;
-      int i;
-      int len;
-
-      for (len = 0; len < 256; len++)
+  for (size = 0; size < max_size; size++)
+    {
+      printf("phase %d\n", size);
+      for (src_off = 0; src_off <= 16; src_off++)
        {
-         printf("phase %d\n", len);
-         for (src_align = 0; src_align < 32; src_align++)
+         for (dst_off = 0; dst_off <= 16; dst_off++)
            {
-             unsigned char *src;
+             /* Put zero around the intended destination, to check
+                that it's not clobbered.  */
+             for (i = 1; i < space_around; i++)
+               {
+                 memp[dst_off - i] = 0;
+                 memp[dst_off + size - 1 + i] = 0;
+               }
 
-             src = p + 40 + SIZE/3 + src_align;
+             /* Fill the source area with known contents.  */
+             for (i = 0; i < size; i++)
+               memp[src_off + i] = rand_mem[i];
 
-             for (dst_align = 0; dst_align < 32; dst_align++)
+             /* Remember the contents around the destination area.
+                (It might not be what we wrote some lines above, since
+                the src area and the dst area overlap.)  */
+             for (i = 1; i < space_around; i++)
                {
-                 unsigned char *dst;
-
-                 memset (p, 0, SIZE + 40);
-                 for (i = 0; i < len; i++)
-                   src[i] = i;
-
-                 dst = p + 40 + dst_align;
-                 memmove (dst, src, len);
-
-                 for (i = -32; i < 0; i++)
-                   if (dst[i] != 0)
-                     abort();
-                 for (i = 0; i < len; i++)
-                   if (dst[i] != i)
-                     abort();
-                 for (i = 32; i >= 0; i--)
-                   if (dst[len + i] != 0)
-                     abort();
-
-                 memset (p, 0, SIZE + 40);
-                 for (i = 0; i < len; i++)
-                   src[i] = i;
-
-                 dst = p + 40 + SIZE/3*2 + dst_align;
-                 memmove (dst, src, len);
-
-                 for (i = -32; i < 0; i++)
-                   if (dst[i] != 0)
-                     abort();
-                 for (i = 0; i < len; i++)
-                   if (dst[i] != i)
-                     abort();
-                 for (i = 32; i >= 0; i--)
-                   if (dst[len + i] != 0)
-                     abort();
+                 lo_around[i] = memp[dst_off - i];
+                 hi_around[i] = memp[dst_off + size - 1 + i];
+               }
+
+             memmove (memp + dst_off, memp + src_off, size);
+
+             /* Check that the destination area has the same
+                contents we wrote to the source area.  */
+             for (i = 0; i < size; i++)
+               {
+                 if (memp[dst_off + i] != rand_mem[i])
+                   abort ();
+               }
+
+             /* Check that the area around the destination is not
+                clobbered.  */
+             for (i = 1; i < space_around; i++)
+               {
+                 if (memp[dst_off - i] != lo_around[i])
+                   abort ();
+                 if (memp[dst_off + size - 1 + i] != hi_around[i])
+                   abort ();
                }
            }
        }
     }
 
-  exit (0);
+  puts ("Test succeeded.");
+
+  return 0;
 }