update from main archive 961020
[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;
18   int result = 0;
19
20   adr = (char *) mmap (NULL, size, PROT_READ|PROT_WRITE,
21                        MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
22   if (adr == NULL)
23     {
24       if (errno == ENOSYS)
25         puts ("No test, mmap not available.");
26       else
27         {
28           printf ("mmaping failed: %m");
29           result = 1;
30         }
31     }
32   else
33     {
34       char dest[size];
35       int inner, middle, outer;
36
37       memset (adr, 'T', size);
38
39       /* strlen test */
40       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
41         {
42           for (inner = MAX (outer, size - 64); inner < size; ++inner)
43             {
44               adr[inner] = '\0';
45
46               if (strlen (&adr[outer]) != inner - outer)
47                 {
48                   printf ("strlen flunked for outer = %d, inner = %d\n",
49                           outer, inner);
50                   result = 1;
51                 }
52
53               adr[inner] = 'T';
54             }
55         }
56
57       /* strchr test */
58       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
59         {
60           for (middle = MAX (outer, size - 64); middle < size; ++middle)
61             {
62               for (inner = middle; inner < size; ++inner)
63                 {
64                   char *cp;
65                   adr[middle] = 'V';
66                   adr[inner] = '\0';
67
68                   cp = strchr (&adr[outer], 'V');
69
70                   if ((inner == middle && cp != NULL)
71                       || (inner != middle
72                           && (cp - &adr[outer]) != middle - outer))
73                     {
74                       printf ("strchr flunked for outer = %d, middle = %d, "
75                               "inner = %d\n", outer, middle, inner);
76                       result = 1;
77                     }
78
79                   adr[inner] = 'T';
80                   adr[middle] = 'T';
81                 }
82             }
83         }
84
85       /* strrchr test */
86       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
87         {
88           for (middle = MAX (outer, size - 64); middle < size; ++middle)
89             {
90               for (inner = middle; inner < size; ++inner)
91                 {
92                   char *cp;
93                   adr[middle] = 'V';
94                   adr[inner] = '\0';
95
96                   cp = strrchr (&adr[outer], 'V');
97
98                   if ((inner == middle && cp != NULL)
99                       || (inner != middle
100                           && (cp - &adr[outer]) != middle - outer))
101                     {
102                       printf ("strrchr flunked for outer = %d, middle = %d, "
103                               "inner = %d\n", outer, middle, inner);
104                       result = 1;
105                     }
106
107                   adr[inner] = 'T';
108                   adr[middle] = 'T';
109                 }
110             }
111         }
112
113       /* strcpy test */
114       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
115         {
116           for (inner = MAX (outer, size - 64); inner < size; ++inner)
117             {
118               adr[inner] = '\0';
119
120               if (strcpy (dest, &adr[outer]) != dest
121                   || strlen (dest) != inner - outer)
122                 {
123                   printf ("strcpy flunked for outer = %d, inner = %d\n",
124                           outer, inner);
125                   result = 1;
126                 }
127
128               adr[inner] = 'T';
129             }
130         }
131
132       /* stpcpy test */
133       for (outer = size - 1; outer >= MAX (0, size - 128); --outer)
134         {
135           for (inner = MAX (outer, size - 64); inner < size; ++inner)
136             {
137               adr[inner] = '\0';
138
139               if ((stpcpy (dest, &adr[outer]) - dest) != inner - outer)
140                 {
141                   printf ("stpcpy flunked for outer = %d, inner = %d\n",
142                           outer, inner);
143                   result = 1;
144                 }
145
146               adr[inner] = 'T';
147             }
148         }
149     }
150
151   return result;
152 }