@@ -52,6 +52,200 @@ bool kernel_test_memcpy(sycl::queue &deviceQueue) {
5252 return success;
5353}
5454
55+ class KernelTestStrcpy ;
56+ bool kernel_test_strcpy (sycl::queue &deviceQueue) {
57+ bool success = true ;
58+ char src[20 ] = " abcdefg012345xyzvvv" ;
59+ char dst[5 ][20 ];
60+ using CStr = char [20 ];
61+ {
62+ sycl::buffer<CStr, 1 > dst_buffer (dst, sycl::range<1 >(5 ));
63+ deviceQueue.submit ([&](sycl::handler &cgh) {
64+ auto dst_acc = dst_buffer.get_access <sycl::access::mode::write>(cgh);
65+ cgh.single_task <class KernelTestStrcpy >([=]() {
66+ char str[20 ] = " abcdefg012345xyzvvv" ;
67+ strcpy (dst_acc[0 ], str);
68+ str[17 ] = ' \0 ' ;
69+ strcpy (dst_acc[1 ], str);
70+ str[12 ] = ' \0 ' ;
71+ strcpy (dst_acc[2 ], str);
72+ str[8 ] = ' \0 ' ;
73+ strcpy (dst_acc[3 ], str);
74+ str[0 ] = ' \0 ' ;
75+ strcpy (dst_acc[4 ], str);
76+ });
77+ });
78+ }
79+
80+ if (strcmp (src, dst[0 ]) != 0 )
81+ success = false ;
82+ src[17 ] = ' \0 ' ;
83+ if (strcmp (src, dst[1 ]) != 0 )
84+ success = false ;
85+ src[12 ] = ' \0 ' ;
86+ if (strcmp (src, dst[2 ]) != 0 )
87+ success = false ;
88+ src[8 ] = ' \0 ' ;
89+ if (strcmp (src, dst[3 ]) != 0 )
90+ success = false ;
91+ src[0 ] = ' \0 ' ;
92+ if (strcmp (src, dst[4 ]) != 0 )
93+ success = false ;
94+ return success;
95+ }
96+
97+ class KernelTestStrncpy ;
98+ bool kernel_test_strncpy (sycl::queue &deviceQueue) {
99+ char src[20 ] = " abcdefg012345xyzvvv" ;
100+ char dst[3 ][20 ];
101+ memset (reinterpret_cast <char *>(dst), ' A' , 60 );
102+ typedef char CStr[20 ];
103+ {
104+ sycl::buffer<CStr, 1 > dst_buffer (dst, sycl::range<1 >(3 ));
105+ deviceQueue.submit ([&](sycl::handler &cgh) {
106+ auto dst_acc = dst_buffer.get_access <sycl::access::mode::write>(cgh);
107+ cgh.single_task <class KernelTestStrncpy >([=]() {
108+ char str[20 ] = " abcdefg012345xyzvvv" ;
109+ strncpy (dst_acc[0 ], str, 19 );
110+ strncpy (dst_acc[1 ], str, 20 );
111+ str[7 ] = ' \0 ' ;
112+ strncpy (dst_acc[2 ], str, 11 );
113+ });
114+ });
115+ }
116+
117+ size_t idx;
118+ for (idx = 0 ; idx < 19 ; ++idx) {
119+ if (dst[0 ][idx] != src[idx])
120+ return false ;
121+ }
122+
123+ if (dst[0 ][19 ] != ' A' )
124+ return false ;
125+
126+ for (idx = 0 ; idx < 20 ; ++idx) {
127+ if (dst[1 ][idx] != src[idx])
128+ return false ;
129+ }
130+
131+ for (idx = 0 ; idx < 7 ; ++idx) {
132+ if (dst[2 ][idx] != src[idx])
133+ return false ;
134+ }
135+ for (idx = 7 ; idx < 11 ; ++idx) {
136+ if (dst[2 ][idx] != ' \0 ' ) {
137+ return false ;
138+ }
139+ }
140+
141+ if (dst[2 ][11 ] != ' A' )
142+ return false ;
143+
144+ return true ;
145+ }
146+
147+ class KernelTestStrcmp ;
148+ bool kernel_test_strcmp (sycl::queue &deviceQueue) {
149+ int res[5 ];
150+ {
151+ sycl::buffer<int , 1 > res_buffer (res, sycl::range<1 >(5 ));
152+ deviceQueue.submit ([&](sycl::handler &cgh) {
153+ auto res_acc = res_buffer.get_access <sycl::access::mode::write>(cgh);
154+ cgh.single_task <class KernelTestStrcmp >([=]() {
155+ char str1[20 ] = " abcdefg012" ;
156+ char str2[20 ] = " abcd" ;
157+ char str3[20 ] = " 124ddf" ;
158+ char str4[20 ] = " abcdefg015" ;
159+ res_acc[0 ] = strcmp (str1, str1);
160+ res_acc[1 ] = strcmp (str1, str2);
161+ res_acc[2 ] = strcmp (str3, str1);
162+ res_acc[3 ] = strcmp (str4, str1);
163+ res_acc[4 ] = strcmp (str1, str4);
164+ });
165+ });
166+ }
167+
168+ if ((res[0 ] != 0 ) || (res[1 ] <= 0 ) || (res[2 ] >= 0 ) || (res[3 ] <= 0 ) ||
169+ (res[4 ] >= 0 ))
170+ return false ;
171+ return true ;
172+ }
173+
174+ class KernelTestStrncmp ;
175+ bool kernel_test_strncmp (sycl::queue &deviceQueue) {
176+ int res[10 ];
177+ {
178+ sycl::buffer<int , 1 > res_buffer (res, sycl::range<1 >(10 ));
179+ deviceQueue.submit ([&](sycl::handler &cgh) {
180+ auto res_acc = res_buffer.get_access <sycl::access::mode::write>(cgh);
181+ cgh.single_task <class KernelTestStrncmp >([=]() {
182+ char str1[20 ] = " abcdefg012" ;
183+ char str2[20 ] = " abcd" ;
184+ char str3[20 ] = " 124ddf" ;
185+ char str4[20 ] = " abcdefg015" ;
186+ char str5[20 ] = " " ;
187+ char str6[20 ] = " abcdEFG" ;
188+ char str7[20 ] = " abcdefg" ;
189+ str6[3 ] = str7[3 ] = ' \0 ' ;
190+ res_acc[0 ] = strncmp (str1, str1, 12 );
191+ res_acc[1 ] = strncmp (str1, str2, 4 );
192+ res_acc[2 ] = strncmp (str3, str1, 0 );
193+ res_acc[3 ] = strncmp (str4, str1, 9 );
194+ res_acc[4 ] = strncmp (str1, str4, 10 );
195+ res_acc[5 ] = strncmp (str3, str3, 20 );
196+ res_acc[6 ] = strncmp (str2, str3, 6 );
197+ res_acc[7 ] = strncmp (str5, str5, 12 );
198+ res_acc[8 ] = strncmp (str6, str7, 7 );
199+ str2[0 ] = str3[0 ] = ' \0 ' ;
200+ res_acc[9 ] = strncmp (str2, str3, 4 );
201+ });
202+ });
203+ }
204+
205+ if ((res[0 ] != 0 ) || (res[1 ] != 0 ) || (res[2 ] != 0 ) || (res[3 ] != 0 ) ||
206+ (res[4 ] >= 0 ) || (res[5 ] != 0 ) || (res[6 ] <= 0 ) || (res[7 ] != 0 ) ||
207+ (res[8 ] != 0 ) || (res[9 ] != 0 ))
208+ return false ;
209+ return true ;
210+ }
211+
212+ class KernelTestStrlen ;
213+ bool kernel_test_strlen (sycl::queue &deviceQueue) {
214+ bool success = true ;
215+ char src[20 ] = " abcdefg012345xyzvvv" ;
216+ size_t len[5 ] = {0 };
217+ {
218+ sycl::buffer<char , 1 > buffer1 (src, sycl::range<1 >(20 ));
219+ sycl::buffer<size_t , 1 > buffer2 (len, sycl::range<1 >(5 ));
220+ deviceQueue.submit ([&](sycl::handler &cgh) {
221+ auto len_acc = buffer2.get_access <sycl::access::mode::write>(cgh);
222+ auto src_acc = buffer1.get_access <sycl::access::mode::read_write>(cgh);
223+ cgh.single_task <class KernelTestStrlen >([=]() {
224+ len_acc[0 ] =
225+ strlen (src_acc.get_multi_ptr <sycl::access::decorated::no>().get ());
226+ src_acc[17 ] = ' \0 ' ;
227+ len_acc[1 ] =
228+ strlen (src_acc.get_multi_ptr <sycl::access::decorated::no>().get ());
229+ src_acc[12 ] = ' \0 ' ;
230+ len_acc[2 ] =
231+ strlen (src_acc.get_multi_ptr <sycl::access::decorated::no>().get ());
232+ src_acc[7 ] = ' \0 ' ;
233+ len_acc[3 ] =
234+ strlen (src_acc.get_multi_ptr <sycl::access::decorated::no>().get ());
235+ src_acc[0 ] = ' \0 ' ;
236+ len_acc[4 ] =
237+ strlen (src_acc.get_multi_ptr <sycl::access::decorated::no>().get ());
238+ });
239+ });
240+ }
241+
242+ if ((len[0 ] != 19 ) || (len[1 ] != 17 ) || (len[2 ] != 12 ) || (len[3 ] != 7 ) ||
243+ (len[4 ] != 0 ))
244+ success = false ;
245+
246+ return success;
247+ }
248+
55249class KernelTestMemcpyInit ;
56250class KernelTestMemcpyUSM0 ;
57251class KernelTestMemcpyUSM1 ;
@@ -489,6 +683,21 @@ int main() {
489683
490684 success = kernel_test_memcpy_addr_space (deviceQueue);
491685 assert (((void )" memcpy test with address space failed!" , success));
686+
687+ success = kernel_test_strlen (deviceQueue);
688+ assert (((void )" strlen test failed!" , success));
689+
690+ success = kernel_test_strcpy (deviceQueue);
691+ assert (((void )" strcpy test failed!" , success));
692+
693+ success = kernel_test_strncpy (deviceQueue);
694+ assert (((void )" strncpy test failed!" , success));
695+
696+ success = kernel_test_strcmp (deviceQueue);
697+ assert (((void )" strcmp test failed!" , success));
698+
699+ success = kernel_test_strncmp (deviceQueue);
700+ assert (((void )" strncmp test failed!" , success));
492701 std::cout << " passed!" << std::endl;
493702 return 0 ;
494703}
0 commit comments