update from main archive 961030
[kopensolaris-gnu/glibc.git] / string / stratcliff.c
1 #define _GNU_SOURCE 1
2 #include <errno.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <unistd.h>
6 #include <sys/mman.h>
7 #include <sys/param.h>
8
9 #ifndef MAX
10 #define MAX(a, b) ((a) > (b) ? (a) : (b))
11 #endif
12
13 int
14 main (int argc, char *argv[])
15 {
16   size_t size = sysconf (_SC_PAGESIZE);
17   char *adr, *dest;
18   int result = 0;
19
20   adr = (char *) mmap (NULL, 3 * size, PROT_READ|PROT_WRITE,
21                        MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
22   dest = (char *) mmap (NULL, 3*size, PROT_READ|PROT_WRITE,
23                         MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
24   if (adr == (char *)-1L || dest == (char *)-1L)
25     {
26       if (errno == ENOSYS)
27         puts ("No test, mmap not available.");
28       else
29         {
30           printf ("mmaping failed: %m");
31           result = 1;
32         }
33     }
34   else
35     {
36       int inner, middle, outer;
37
38       mprotect(adr, size, PROT_NONE);
39       mprotect(adr+2*size, size, PROT_NONE);
40       adr += size;
41
42       mprotect(dest, size, PROT_NONE);
43       mprotect(dest+2*size, size, PROT_NONE);
44       dest += size;
45
46       memset (adr, 'T', size);
47
48       /* strlen test */
49       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
50         {
51           for (inner = MAX (outer, size - 64); inner < size; ++inner)
52             {
53               adr[inner] = '\0';
54
55               if (strlen (&adr[outer]) != inner - outer)
56                 {
57                   printf ("strlen flunked for outer = %d, inner = %d\n",
58                           outer, inner);
59                   result = 1;
60                 }
61
62               adr[inner] = 'T';
63             }
64         }
65
66       /* strchr test */
67       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
68         {
69           for (middle = MAX (outer, size - 64); middle < size; ++middle)
70             {
71               for (inner = middle; inner < size; ++inner)
72                 {
73                   char *cp;
74                   adr[middle] = 'V';
75                   adr[inner] = '\0';
76
77                   cp = strchr (&adr[outer], 'V');
78
79                   if ((inner == middle && cp != NULL)
80                       || (inner != middle
81                           && (cp - &adr[outer]) != middle - outer))
82                     {
83                       printf ("strchr flunked for outer = %d, middle = %d, "
84                               "inner = %d\n", outer, middle, inner);
85                       result = 1;
86                     }
87
88                   adr[inner] = 'T';
89                   adr[middle] = 'T';
90                 }
91             }
92         }
93
94       /* strrchr test */
95       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
96         {
97           for (middle = MAX (outer, size - 64); middle < size; ++middle)
98             {
99               for (inner = middle; inner < size; ++inner)
100                 {
101                   char *cp;
102                   adr[middle] = 'V';
103                   adr[inner] = '\0';
104
105                   cp = strrchr (&adr[outer], 'V');
106
107                   if ((inner == middle && cp != NULL)
108                       || (inner != middle
109                           && (cp - &adr[outer]) != middle - outer))
110                     {
111                       printf ("strrchr flunked for outer = %d, middle = %d, "
112                               "inner = %d\n", outer, middle, inner);
113                       result = 1;
114                     }
115
116                   adr[inner] = 'T';
117                   adr[middle] = 'T';
118                 }
119             }
120         }
121
122       /* strcpy test */
123       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
124         {
125           for (inner = MAX (outer, size - 64); inner < size; ++inner)
126             {
127               adr[inner] = '\0';
128
129               if (strcpy (dest, &adr[outer]) != dest
130                   || strlen (dest) != inner - outer)
131                 {
132                   printf ("strcpy flunked for outer = %d, inner = %d\n",
133                           outer, inner);
134                   result = 1;
135                 }
136
137               adr[inner] = 'T';
138             }
139         }
140
141       /* stpcpy test */
142       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
143         {
144           for (inner = MAX (outer, size - 64); inner < size; ++inner)
145             {
146               adr[inner] = '\0';
147
148               if ((stpcpy (dest, &adr[outer]) - dest) != inner - outer)
149                 {
150                   printf ("stpcpy flunked for outer = %d, inner = %d\n",
151                           outer, inner);
152                   result = 1;
153                 }
154
155               adr[inner] = 'T';
156             }
157         }
158     }
159
160   return result;
161 }