1 /* Copyright (C) 2002  Free Software Foundation.
2 
3    Test memset with various combinations of pointer alignments and lengths to
4    make sure any optimizations in the library are correct.
5 
6    Written by Michael Meissner, March 9, 2002.  */
7 
8 #include <string.h>
9 
10 #ifndef MAX_OFFSET
11 #define MAX_OFFSET (sizeof (long long))
12 #endif
13 
14 #ifndef MAX_COPY
15 #define MAX_COPY (10 * sizeof (long long))
16 #endif
17 
18 #ifndef MAX_EXTRA
19 #define MAX_EXTRA (sizeof (long long))
20 #endif
21 
22 #define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
23 
24 static union {
25   char buf[MAX_LENGTH];
26   long long align_int;
27   long double align_fp;
28 } u;
29 
30 char A = 'A';
31 
main()32 main ()
33 {
34   int off, len, i;
35   char *p, *q;
36 
37   for (off = 0; off < MAX_OFFSET; off++)
38     for (len = 1; len < MAX_COPY; len++)
39       {
40 	for (i = 0; i < MAX_LENGTH; i++)
41 	  u.buf[i] = 'a';
42 
43 	p = memset (u.buf + off, '\0', len);
44 	if (p != u.buf + off)
45 	  abort ();
46 
47 	q = u.buf;
48 	for (i = 0; i < off; i++, q++)
49 	  if (*q != 'a')
50 	    abort ();
51 
52 	for (i = 0; i < len; i++, q++)
53 	  if (*q != '\0')
54 	    abort ();
55 
56 	for (i = 0; i < MAX_EXTRA; i++, q++)
57 	  if (*q != 'a')
58 	    abort ();
59 
60 	p = memset (u.buf + off, A, len);
61 	if (p != u.buf + off)
62 	  abort ();
63 
64 	q = u.buf;
65 	for (i = 0; i < off; i++, q++)
66 	  if (*q != 'a')
67 	    abort ();
68 
69 	for (i = 0; i < len; i++, q++)
70 	  if (*q != 'A')
71 	    abort ();
72 
73 	for (i = 0; i < MAX_EXTRA; i++, q++)
74 	  if (*q != 'a')
75 	    abort ();
76 
77 	p = memset (u.buf + off, 'B', len);
78 	if (p != u.buf + off)
79 	  abort ();
80 
81 	q = u.buf;
82 	for (i = 0; i < off; i++, q++)
83 	  if (*q != 'a')
84 	    abort ();
85 
86 	for (i = 0; i < len; i++, q++)
87 	  if (*q != 'B')
88 	    abort ();
89 
90 	for (i = 0; i < MAX_EXTRA; i++, q++)
91 	  if (*q != 'a')
92 	    abort ();
93       }
94 
95   exit (0);
96 }
97