1 /*
2 strncmp-1.c from the execute part of the gcc torture tests.
3 */
4 
5 #include <testfwk.h>
6 
7 /* { dg-xfail-if "kernel strncmp does not perform unsigned comparisons" { vxworks_kernel } } */
8 /* Copyright (C) 2002  Free Software Foundation.
9 
10    Test strncmp with various combinations of pointer alignments and lengths to
11    make sure any optimizations in the library are correct.
12 
13    Written by Michael Meissner, March 9, 2002.  */
14 
15 #include <string.h>
16 #include <stddef.h>
17 
18 #ifndef MAX_OFFSET
19 #define MAX_OFFSET (sizeof (long long))
20 #endif
21 
22 #ifndef MAX_TEST
23 #define MAX_TEST (2 * sizeof (long long)) /* Was (8 * sizeof (long long)) in GCC, reduced to speed up regression testing */
24 #endif
25 
26 #ifndef MAX_EXTRA
27 #define MAX_EXTRA (sizeof (long long))
28 #endif
29 
30 #define MAX_LENGTH (MAX_OFFSET + MAX_TEST + MAX_EXTRA)
31 
32 #if !(defined(__SDCC_mcs51) && defined(__SDCC_MODEL_SMALL)) && !defined(__SDCC_pdk14) // Lack of memory
33 static union {
34   unsigned char buf[MAX_LENGTH];
35   long long align_int;
36 #if 0 // TODO: enable when SDCC supports long double!
37   long double align_fp;
38 #endif
39 } u1, u2;
40 #endif
41 
42 void
test(const unsigned char * s1,const unsigned char * s2,size_t len,int expected)43 test (const unsigned char *s1, const unsigned char *s2, size_t len, int expected)
44 {
45   int value = strncmp ((char *) s1, (char *) s2, len);
46 
47   if (expected < 0 && value >= 0)
48     ASSERT (0);
49   else if (expected == 0 && value != 0)
50     ASSERT (0);
51   else if (expected > 0 && value <= 0)
52     ASSERT (0);
53 }
54 
55 void
testTortureExecute(void)56 testTortureExecute (void)
57 {
58 #if !(defined(__SDCC_mcs51) && defined(__SDCC_MODEL_SMALL)) && !defined(__SDCC_pdk14) // Lack of memory
59   size_t off1, off2, len, i;
60   unsigned char *buf1, *buf2;
61   unsigned char *mod1, *mod2;
62   unsigned char *p1, *p2;
63 
64   for (off1 = 0; off1 < MAX_OFFSET; off1++)
65     for (off2 = 0; off2 < MAX_OFFSET; off2++)
66       for (len = 0; len < MAX_TEST; len++)
67 	{
68 	  p1 = u1.buf;
69 	  for (i = 0; i < off1; i++)
70 	    *p1++ = '\0';
71 
72 	  buf1 = p1;
73 	  for (i = 0; i < len; i++)
74 	    *p1++ = 'a';
75 
76 	  mod1 = p1;
77 	  for (i = 0; i < MAX_EXTRA; i++)
78 	    *p1++ = 'x';
79 
80 	  p2 = u2.buf;
81 	  for (i = 0; i < off2; i++)
82 	    *p2++ = '\0';
83 
84 	  buf2 = p2;
85 	  for (i = 0; i < len; i++)
86 	    *p2++ = 'a';
87 
88 	  mod2 = p2;
89 	  for (i = 0; i < MAX_EXTRA; i++)
90 	    *p2++ = 'x';
91 
92 	  mod1[0] = '\0';
93 	  mod2[0] = '\0';
94 	  test (buf1, buf2, MAX_LENGTH, 0);
95 	  test (buf1, buf2, len, 0);
96 
97 	  mod1[0] = 'a';
98 	  mod1[1] = '\0';
99 	  mod2[0] = '\0';
100 	  test (buf1, buf2, MAX_LENGTH, +1);
101 	  test (buf1, buf2, len, 0);
102 
103 	  mod1[0] = '\0';
104 	  mod2[0] = 'a';
105 	  mod2[1] = '\0';
106 	  test (buf1, buf2, MAX_LENGTH, -1);
107 	  test (buf1, buf2, len, 0);
108 
109 	  mod1[0] = 'b';
110 	  mod1[1] = '\0';
111 	  mod2[0] = 'c';
112 	  mod2[1] = '\0';
113 	  test (buf1, buf2, MAX_LENGTH, -1);
114 	  test (buf1, buf2, len, 0);
115 
116 	  mod1[0] = 'c';
117 	  mod1[1] = '\0';
118 	  mod2[0] = 'b';
119 	  mod2[1] = '\0';
120 	  test (buf1, buf2, MAX_LENGTH, +1);
121 	  test (buf1, buf2, len, 0);
122 
123 	  mod1[0] = 'b';
124 	  mod1[1] = '\0';
125 	  mod2[0] = (unsigned char)'\251';
126 	  mod2[1] = '\0';
127 	  test (buf1, buf2, MAX_LENGTH, -1);
128 	  test (buf1, buf2, len, 0);
129 
130 	  mod1[0] = (unsigned char)'\251';
131 	  mod1[1] = '\0';
132 	  mod2[0] = 'b';
133 	  mod2[1] = '\0';
134 	  test (buf1, buf2, MAX_LENGTH, +1);
135 	  test (buf1, buf2, len, 0);
136 
137 	  mod1[0] = (unsigned char)'\251';
138 	  mod1[1] = '\0';
139 	  mod2[0] = (unsigned char)'\252';
140 	  mod2[1] = '\0';
141 	  test (buf1, buf2, MAX_LENGTH, -1);
142 	  test (buf1, buf2, len, 0);
143 
144 	  mod1[0] = (unsigned char)'\252';
145 	  mod1[1] = '\0';
146 	  mod2[0] = (unsigned char)'\251';
147 	  mod2[1] = '\0';
148 	  test (buf1, buf2, MAX_LENGTH, +1);
149 	  test (buf1, buf2, len, 0);
150 	}
151 #endif
152   return;
153 }
154