VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstNoCrt-1.cpp@ 14515

Last change on this file since 14515 was 14026, checked in by vboxsync, 16 years ago

tstNoCrt-1: Added simple strcpy test.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 18.4 KB
Line 
1/* $Id: tstNoCrt-1.cpp 14026 2008-11-10 17:11:07Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Testcase for the No-CRT assembly bits.
4 */
5
6/*
7 * Copyright (C) 2008 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 *
26 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31/*******************************************************************************
32* Header Files *
33*******************************************************************************/
34#include <iprt/nocrt/string.h>
35#include <iprt/stream.h>
36#include <iprt/initterm.h>
37#include <iprt/string.h>
38#ifdef RT_WITHOUT_NOCRT_WRAPPERS
39# error "Build error."
40#endif
41
42
43/*******************************************************************************
44* Structures and Typedefs *
45*******************************************************************************/
46#define TSTBUF_SIZE 8192
47typedef struct TSTBUF
48{
49 uint8_t abHeadFence[2048];
50 uint8_t abBuf[TSTBUF_SIZE];
51 uint8_t abTailFence[2048];
52} TSTBUF, *PTSTBUF;
53
54
55/*******************************************************************************
56* Global Variables *
57*******************************************************************************/
58static unsigned g_cErrors = 0;
59
60
61static void my_memset(void *pv, int ch, size_t cb)
62{
63 uint8_t *pb = (uint8_t *)pv;
64 while (cb--)
65 *pb++ = ch;
66}
67
68static void my_memcheck(const void *pv, int ch, size_t cb, const char *pszDesc)
69{
70 uint8_t *pb = (uint8_t *)pv;
71 while (cb--)
72 {
73 if (*pb != (uint8_t)ch)
74 {
75 g_cErrors++;
76 size_t off;
77 for (off = 1; off < cb && pb[off] != (uint8_t)ch; off++)
78 /* nandemonai */;
79 off--;
80 pb += off;
81 cb -= off;
82 if (off)
83 RTPrintf("tstNoCrt-1: %s: %p:%p - %02x instead of %02x\n",
84 pszDesc, (uintptr_t)pb - (uintptr_t)pv,
85 (uint8_t *)pb - (uint8_t *)pv + off, *pb, (uint8_t)ch);
86 else
87 RTPrintf("tstNoCrt-1: %s: %p - %02x instead of %02x\n",
88 pszDesc, (uint8_t *)pb - (uint8_t *)pv, *pb, (uint8_t)ch);
89 }
90
91 /* next*/
92 pb++;
93 }
94}
95
96
97static void TstBufInit(PTSTBUF pBuf, int ch)
98{
99 my_memset(pBuf->abHeadFence, 0x55, sizeof(pBuf->abHeadFence));
100 my_memset(pBuf->abBuf, ch, sizeof(pBuf->abBuf));
101 my_memset(pBuf->abTailFence, 0x77, sizeof(pBuf->abHeadFence));
102}
103
104
105static void TstBufCheck(PTSTBUF pBuf, const char *pszDesc)
106{
107 my_memcheck(pBuf->abHeadFence, 0x55, sizeof(pBuf->abHeadFence), pszDesc);
108 my_memcheck(pBuf->abTailFence, 0x77, sizeof(pBuf->abTailFence), pszDesc);
109}
110
111
112#if 0 /* enable this to test the testcase. */
113# undef RT_NOCRT
114# define RT_NOCRT(a) a
115# ifdef _MSC_VER
116# define mempcpy nocrt_mempcpy
117# endif
118#endif
119
120int main()
121{
122 /*
123 * Prologue.
124 */
125 RTR3Init();
126 RTPrintf("tstNoCrt-1: TESTING...\n");
127
128 /*
129 * Sanity.
130 */
131 TSTBUF Buf1;
132 TstBufInit(&Buf1, 1);
133 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, "sanity buf1");
134 TstBufCheck(&Buf1, "sanity buf1");
135
136 TSTBUF Buf2;
137 TstBufInit(&Buf2, 2);
138 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "sanity buf2");
139 TstBufCheck(&Buf2, "sanity buf2");
140 if (g_cErrors)
141 {
142 RTPrintf("tstNoCrt-1: FAILED - fatal sanity error\n");
143 return 1;
144 }
145
146#define CHECK_CCH(expect) \
147 do \
148 { \
149 if (cch != (expect)) \
150 { \
151 RTPrintf("tstNoCrt-1(%d): cb=%zu expected=%zu\n", __LINE__, cch, (expect)); \
152 g_cErrors++; \
153 } \
154 } while (0)
155 size_t cch;
156
157#define CHECK_PV(expect) \
158 do \
159 { \
160 if (pv != (expect)) \
161 { \
162 RTPrintf("tstNoCrt-1(%d): pv=%p expected=%p\n", __LINE__, pv, (expect)); \
163 g_cErrors++; \
164 } \
165 } while (0)
166 void *pv;
167
168#define CHECK_DIFF(op) \
169 do \
170 { \
171 if (!(iDiff op 0)) \
172 { \
173 RTPrintf("tstNoCrt-1(%d): iDiff=%d expected: %s 0\n", __LINE__, iDiff, #op); \
174 g_cErrors++; \
175 } \
176 } while (0)
177 int iDiff;
178
179 static char s_szTest1[] = "0123456789abcdef";
180 static char s_szTest2[] = "0123456789abcdef";
181 static char s_szTest3[] = "fedcba9876543210";
182
183 /*
184 * memcpy.
185 */
186 RTPrintf("tstNoCrt-1: memcpy\n");
187 TstBufInit(&Buf1, 1);
188 TstBufInit(&Buf2, 2);
189 pv = RT_NOCRT(memcpy)(Buf1.abBuf, Buf2.abBuf, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
190 my_memcheck(Buf1.abBuf, 2, TSTBUF_SIZE, "memcpy1-dst");
191 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "memcpy1-src");
192 TstBufCheck(&Buf1, "memcpy1");
193 TstBufCheck(&Buf2, "memcpy1");
194
195 TstBufInit(&Buf1, 3);
196 TstBufInit(&Buf2, 4);
197 pv = RT_NOCRT(memcpy)(Buf2.abBuf, Buf1.abBuf, TSTBUF_SIZE); CHECK_PV(Buf2.abBuf);
198 my_memcheck(Buf1.abBuf, 3, TSTBUF_SIZE, "memcpy2-dst");
199 my_memcheck(Buf2.abBuf, 3, TSTBUF_SIZE, "memcpy2-src");
200 TstBufCheck(&Buf1, "memcpy2");
201 TstBufCheck(&Buf2, "memcpy2");
202
203 TstBufInit(&Buf1, 5);
204 TstBufInit(&Buf2, 6);
205 pv = RT_NOCRT(memcpy)(Buf2.abBuf, Buf1.abBuf, 0); CHECK_PV(Buf2.abBuf);
206 my_memcheck(Buf1.abBuf, 5, TSTBUF_SIZE, "memcpy3-dst");
207 my_memcheck(Buf2.abBuf, 6, TSTBUF_SIZE, "memcpy3-src");
208 TstBufCheck(&Buf1, "memcpy3-dst");
209 TstBufCheck(&Buf2, "memcpy3-src");
210
211 for (unsigned off1 = 0; off1 <= 128; off1++)
212 {
213 for (unsigned off2 = 0; off2 <= 256; off2++)
214 {
215 char sz[32];
216 RTStrPrintf(sz, sizeof(sz), "memcpy4-%d-%d", off1, off2);
217 TstBufInit(&Buf1, 1);
218 TstBufInit(&Buf2, 2);
219 size_t cb = off2;
220 pv = RT_NOCRT(memcpy)(&Buf2.abBuf[off2], &Buf1.abBuf[off1], cb); CHECK_PV(&Buf2.abBuf[off2]);
221 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, sz);
222 my_memcheck(Buf2.abBuf, 2, off2, sz);
223 my_memcheck(&Buf2.abBuf[off2], 1, cb, sz);
224 my_memcheck(&Buf2.abBuf[off2 + cb], 2, TSTBUF_SIZE - cb - off2, sz);
225 TstBufCheck(&Buf1, sz);
226 TstBufCheck(&Buf2, sz);
227 }
228 }
229
230 /*
231 * mempcpy.
232 */
233 RTPrintf("tstNoCrt-1: mempcpy\n");
234 TstBufInit(&Buf1, 1);
235 TstBufInit(&Buf2, 2);
236 pv = RT_NOCRT(mempcpy)(Buf1.abBuf, Buf2.abBuf, TSTBUF_SIZE); CHECK_PV(&Buf1.abBuf[TSTBUF_SIZE]);
237 my_memcheck(Buf1.abBuf, 2, TSTBUF_SIZE, "mempcpy1-dst");
238 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "mempcpy1-src");
239 TstBufCheck(&Buf1, "mempcpy1");
240 TstBufCheck(&Buf2, "mempcpy1");
241
242 TstBufInit(&Buf1, 3);
243 TstBufInit(&Buf2, 4);
244 pv = RT_NOCRT(mempcpy)(Buf2.abBuf, Buf1.abBuf, TSTBUF_SIZE); CHECK_PV(&Buf2.abBuf[TSTBUF_SIZE]);
245 my_memcheck(Buf1.abBuf, 3, TSTBUF_SIZE, "mempcpy2-dst");
246 my_memcheck(Buf2.abBuf, 3, TSTBUF_SIZE, "mempcpy2-src");
247 TstBufCheck(&Buf1, "mempcpy2");
248 TstBufCheck(&Buf2, "mempcpy2");
249
250 TstBufInit(&Buf1, 5);
251 TstBufInit(&Buf2, 6);
252 pv = RT_NOCRT(mempcpy)(Buf2.abBuf, Buf1.abBuf, 0); CHECK_PV(Buf2.abBuf);
253 my_memcheck(Buf1.abBuf, 5, TSTBUF_SIZE, "mempcpy3-dst");
254 my_memcheck(Buf2.abBuf, 6, TSTBUF_SIZE, "mempcpy3-src");
255 TstBufCheck(&Buf1, "mempcpy3-dst");
256 TstBufCheck(&Buf2, "mempcpy3-src");
257
258 for (unsigned off1 = 0; off1 <= 128; off1++)
259 {
260 for (unsigned off2 = 0; off2 <= 256; off2++)
261 {
262 char sz[32];
263 RTStrPrintf(sz, sizeof(sz), "mempcpy4-%d-%d", off1, off2);
264 TstBufInit(&Buf1, 1);
265 TstBufInit(&Buf2, 2);
266 size_t cb = off2;
267 pv = RT_NOCRT(mempcpy)(&Buf2.abBuf[off2], &Buf1.abBuf[off1], cb); CHECK_PV(&Buf2.abBuf[off2 + cb]);
268 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, sz);
269 my_memcheck(Buf2.abBuf, 2, off2, sz);
270 my_memcheck(&Buf2.abBuf[off2], 1, cb, sz);
271 my_memcheck(&Buf2.abBuf[off2 + cb], 2, TSTBUF_SIZE - cb - off2, sz);
272 TstBufCheck(&Buf1, sz);
273 TstBufCheck(&Buf2, sz);
274 }
275 }
276
277 /*
278 * memmove.
279 */
280 RTPrintf("tstNoCrt-1: memmove\n");
281 TstBufInit(&Buf1, 1);
282 TstBufInit(&Buf2, 2);
283 pv = RT_NOCRT(memmove)(Buf1.abBuf, Buf2.abBuf, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
284 my_memcheck(Buf1.abBuf, 2, TSTBUF_SIZE, "memmove1-dst");
285 my_memcheck(Buf2.abBuf, 2, TSTBUF_SIZE, "memmove1-src");
286 TstBufCheck(&Buf1, "memmove1");
287 TstBufCheck(&Buf2, "memmove1");
288
289 TstBufInit(&Buf1, 3);
290 TstBufInit(&Buf2, 4);
291 pv = RT_NOCRT(memmove)(Buf2.abBuf, Buf1.abBuf, TSTBUF_SIZE); CHECK_PV(Buf2.abBuf);
292 my_memcheck(Buf1.abBuf, 3, TSTBUF_SIZE, "memmove2-dst");
293 my_memcheck(Buf2.abBuf, 3, TSTBUF_SIZE, "memmove2-src");
294 TstBufCheck(&Buf1, "memmove2");
295 TstBufCheck(&Buf2, "memmove2");
296
297 TstBufInit(&Buf1, 5);
298 TstBufInit(&Buf2, 6);
299 pv = RT_NOCRT(memmove)(Buf2.abBuf, Buf1.abBuf, 0); CHECK_PV(Buf2.abBuf);
300 my_memcheck(Buf1.abBuf, 5, TSTBUF_SIZE, "memmove3-dst");
301 my_memcheck(Buf2.abBuf, 6, TSTBUF_SIZE, "memmove3-src");
302 TstBufCheck(&Buf1, "memmove3-dst");
303 TstBufCheck(&Buf2, "memmove3-src");
304
305 for (unsigned off1 = 1; off1 <= 128; off1++)
306 {
307 for (unsigned off2 = 0; off2 <= 256; off2++)
308 {
309 /* forward */
310 char sz[32];
311 RTStrPrintf(sz, sizeof(sz), "memmove4-%d-%d", off1, off2);
312 TstBufInit(&Buf1, off1 + 1);
313 my_memset(Buf1.abBuf, off1, off1);
314 pv = RT_NOCRT(memmove)(Buf1.abBuf, &Buf1.abBuf[off2], TSTBUF_SIZE - off2); CHECK_PV(Buf1.abBuf);
315 if (off2 < off1)
316 {
317 unsigned cbLead = off1 - off2;
318 my_memcheck(Buf1.abBuf, off1, cbLead, sz);
319 my_memcheck(&Buf1.abBuf[cbLead], off1 + 1, TSTBUF_SIZE - cbLead, sz);
320 }
321 else
322 my_memcheck(Buf1.abBuf, off1 + 1, TSTBUF_SIZE, sz);
323 TstBufCheck(&Buf1, sz);
324
325 /* backward */
326 RTStrPrintf(sz, sizeof(sz), "memmove5-%d-%d", off1, off2);
327 TstBufInit(&Buf1, off1 + 1);
328 my_memset(&Buf1.abBuf[TSTBUF_SIZE - off1], off1, off1);
329 pv = RT_NOCRT(memmove)(&Buf1.abBuf[off2], Buf1.abBuf, TSTBUF_SIZE - off2); CHECK_PV(&Buf1.abBuf[off2]);
330 if (off2 < off1)
331 {
332 unsigned cbLead = off1 - off2;
333 my_memcheck(&Buf1.abBuf[TSTBUF_SIZE - cbLead], off1, cbLead, sz);
334 my_memcheck(Buf1.abBuf, off1 + 1, TSTBUF_SIZE - cbLead, sz);
335 }
336 else
337 my_memcheck(Buf1.abBuf, off1 + 1, TSTBUF_SIZE, sz);
338 TstBufCheck(&Buf1, sz);
339 /* small unaligned */
340 RTStrPrintf(sz, sizeof(sz), "memmove6-%d-%d", off1, off2);
341 TstBufInit(&Buf1, 1);
342 TstBufInit(&Buf2, 2);
343 size_t cb = off2;
344 pv = RT_NOCRT(memmove)(&Buf2.abBuf[off2], &Buf1.abBuf[off1], cb); CHECK_PV(&Buf2.abBuf[off2]);
345 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, sz);
346 my_memcheck(Buf2.abBuf, 2, off2, sz);
347 my_memcheck(&Buf2.abBuf[off2], 1, cb, sz);
348 my_memcheck(&Buf2.abBuf[off2 + cb], 2, TSTBUF_SIZE - cb - off2, sz);
349 TstBufCheck(&Buf1, sz);
350 TstBufCheck(&Buf2, sz);
351 }
352 }
353
354 /*
355 * memset
356 */
357 RTPrintf("tstNoCrt-1: memset\n");
358 TstBufInit(&Buf1, 1);
359 pv = RT_NOCRT(memset)(Buf1.abBuf, 0, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
360 my_memcheck(Buf1.abBuf, 0, TSTBUF_SIZE, "memset-1");
361 TstBufCheck(&Buf1, "memset-1");
362
363 TstBufInit(&Buf1, 1);
364 pv = RT_NOCRT(memset)(Buf1.abBuf, 0xff, TSTBUF_SIZE); CHECK_PV(Buf1.abBuf);
365 my_memcheck(Buf1.abBuf, 0xff, TSTBUF_SIZE, "memset-2");
366 TstBufCheck(&Buf1, "memset-2");
367
368 TstBufInit(&Buf1, 1);
369 pv = RT_NOCRT(memset)(Buf1.abBuf, 0xff, 0); CHECK_PV(Buf1.abBuf);
370 my_memcheck(Buf1.abBuf, 1, TSTBUF_SIZE, "memset-3");
371 TstBufCheck(&Buf1, "memset-3");
372
373 for (unsigned off = 0; off < 256; off++)
374 {
375 /* move start byte by byte. */
376 char sz[32];
377 RTStrPrintf(sz, sizeof(sz), "memset4-%d", off);
378 TstBufInit(&Buf1, 0);
379 pv = RT_NOCRT(memset)(&Buf1.abBuf[off], off, TSTBUF_SIZE - off); CHECK_PV(&Buf1.abBuf[off]);
380 my_memcheck(Buf1.abBuf, 0, off, sz);
381 my_memcheck(&Buf1.abBuf[off], off, TSTBUF_SIZE - off, sz);
382 TstBufCheck(&Buf1, sz);
383
384 /* move end byte by byte. */
385 RTStrPrintf(sz, sizeof(sz), "memset5-%d", off);
386 TstBufInit(&Buf1, 0);
387 pv = RT_NOCRT(memset)(Buf1.abBuf, off, TSTBUF_SIZE - off); CHECK_PV(Buf1.abBuf);
388 my_memcheck(Buf1.abBuf, off, TSTBUF_SIZE - off, sz);
389 my_memcheck(&Buf1.abBuf[TSTBUF_SIZE - off], 0, off, sz);
390 TstBufCheck(&Buf1, sz);
391
392 /* move both start and size byte by byte. */
393 RTStrPrintf(sz, sizeof(sz), "memset6-%d", off);
394 TstBufInit(&Buf1, 0);
395 pv = RT_NOCRT(memset)(&Buf1.abBuf[off], off, off); CHECK_PV(&Buf1.abBuf[off]);
396 my_memcheck(Buf1.abBuf, 0, off, sz);
397 my_memcheck(&Buf1.abBuf[off], off, off, sz);
398 my_memcheck(&Buf1.abBuf[off * 2], 0, TSTBUF_SIZE - off * 2, sz);
399 TstBufCheck(&Buf1, sz);
400 }
401
402 /*
403 * strcpy (quick smoke testing).
404 */
405 RTPrintf("tstNoCrt-1: strcpy\n");
406 TstBufInit(&Buf1, 1);
407 const char *pszSrc = s_szTest1;
408 char *pszDst = (char *)&Buf1.abBuf[0];
409 pv = RT_NOCRT(strcpy)(pszDst, pszSrc);
410 CHECK_PV(pszDst);
411 TstBufCheck(&Buf1, "strcpy 1");
412 iDiff = RT_NOCRT(strcmp)(pszDst, pszSrc); CHECK_DIFF( == );
413
414 pszSrc = s_szTest1;
415 for (unsigned i = 0; i < sizeof(s_szTest1) / 2; i++)
416 {
417 pszSrc++;
418 TstBufInit(&Buf1, 2);
419 pszDst = (char *)&Buf1.abBuf[sizeof(Buf1.abBuf) - strlen(pszSrc) - 1];
420 pv = RT_NOCRT(strcpy)(pszDst, pszSrc);
421 CHECK_PV(pszDst);
422 TstBufCheck(&Buf1, "strcpy 3");
423 iDiff = RT_NOCRT(strcmp)(pszDst, pszSrc); CHECK_DIFF( == );
424 }
425
426
427 /*
428 * memchr & strchr.
429 */
430 RTPrintf("tstNoCrt-1: memchr\n");
431 pv = RT_NOCRT(memchr)(&s_szTest1[0x00], 'f', sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0xf]);
432 pv = RT_NOCRT(memchr)(&s_szTest1[0x0f], 'f', sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0xf]);
433 pv = RT_NOCRT(memchr)(&s_szTest1[0x03], 0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
434 pv = RT_NOCRT(memchr)(&s_szTest1[0x10], 0, sizeof(s_szTest1)); CHECK_PV(&s_szTest1[0x10]);
435 for (unsigned i = 0; i < sizeof(s_szTest1); i++)
436 for (unsigned j = 0; j <= i; j++)
437 {
438 pv = RT_NOCRT(memchr)(&s_szTest1[j], s_szTest1[i], sizeof(s_szTest1));
439 CHECK_PV(&s_szTest1[i]);
440 }
441
442 RTPrintf("tstNoCrt-1: strchr\n");
443 pv = RT_NOCRT(strchr)(&s_szTest1[0x00], 'f'); CHECK_PV(&s_szTest1[0xf]);
444 pv = RT_NOCRT(strchr)(&s_szTest1[0x0f], 'f'); CHECK_PV(&s_szTest1[0xf]);
445 pv = RT_NOCRT(strchr)(&s_szTest1[0x03], 0); CHECK_PV(&s_szTest1[0x10]);
446 pv = RT_NOCRT(strchr)(&s_szTest1[0x10], 0); CHECK_PV(&s_szTest1[0x10]);
447 for (unsigned i = 0; i < sizeof(s_szTest1); i++)
448 for (unsigned j = 0; j <= i; j++)
449 {
450 pv = RT_NOCRT(strchr)(&s_szTest1[j], s_szTest1[i]);
451 CHECK_PV(&s_szTest1[i]);
452 }
453
454 /*
455 * Some simple memcmp/strcmp checks.
456 */
457 RTPrintf("tstNoCrt-1: memcmp\n");
458 iDiff = RT_NOCRT(memcmp)(s_szTest1, s_szTest1, sizeof(s_szTest1)); CHECK_DIFF( == );
459 iDiff = RT_NOCRT(memcmp)(s_szTest1, s_szTest2, sizeof(s_szTest1)); CHECK_DIFF( == );
460 iDiff = RT_NOCRT(memcmp)(s_szTest2, s_szTest1, sizeof(s_szTest1)); CHECK_DIFF( == );
461 iDiff = RT_NOCRT(memcmp)(s_szTest3, s_szTest3, sizeof(s_szTest1)); CHECK_DIFF( == );
462 iDiff = RT_NOCRT(memcmp)(s_szTest1, s_szTest3, sizeof(s_szTest1)); CHECK_DIFF( < );
463 iDiff = RT_NOCRT(memcmp)(s_szTest3, s_szTest1, sizeof(s_szTest1)); CHECK_DIFF( > );
464
465 RTPrintf("tstNoCrt-1: strcmp\n");
466 iDiff = RT_NOCRT(strcmp)(s_szTest1, s_szTest1); CHECK_DIFF( == );
467 iDiff = RT_NOCRT(strcmp)(s_szTest1, s_szTest2); CHECK_DIFF( == );
468 iDiff = RT_NOCRT(strcmp)(s_szTest2, s_szTest1); CHECK_DIFF( == );
469 iDiff = RT_NOCRT(strcmp)(s_szTest3, s_szTest3); CHECK_DIFF( == );
470 iDiff = RT_NOCRT(strcmp)(s_szTest1, s_szTest3); CHECK_DIFF( < );
471 iDiff = RT_NOCRT(strcmp)(s_szTest3, s_szTest1); CHECK_DIFF( > );
472
473 /*
474 * Some simple strlen checks.
475 */
476 RTPrintf("tstNoCrt-1: strlen\n");
477 cch = RT_NOCRT(strlen)(""); CHECK_CCH(0);
478 cch = RT_NOCRT(strlen)("1"); CHECK_CCH(1);
479 cch = RT_NOCRT(strlen)("12"); CHECK_CCH(2);
480 cch = RT_NOCRT(strlen)("123"); CHECK_CCH(3);
481 cch = RT_NOCRT(strlen)("1234"); CHECK_CCH(4);
482 cch = RT_NOCRT(strlen)("12345"); CHECK_CCH(5);
483 cch = RT_NOCRT(strlen)(s_szTest1); CHECK_CCH(sizeof(s_szTest1) - 1);
484 cch = RT_NOCRT(strlen)(&s_szTest1[1]); CHECK_CCH(sizeof(s_szTest1) - 1 - 1);
485 cch = RT_NOCRT(strlen)(&s_szTest1[2]); CHECK_CCH(sizeof(s_szTest1) - 1 - 2);
486 cch = RT_NOCRT(strlen)(&s_szTest1[3]); CHECK_CCH(sizeof(s_szTest1) - 1 - 3);
487 cch = RT_NOCRT(strlen)(&s_szTest1[4]); CHECK_CCH(sizeof(s_szTest1) - 1 - 4);
488 cch = RT_NOCRT(strlen)(&s_szTest1[5]); CHECK_CCH(sizeof(s_szTest1) - 1 - 5);
489 cch = RT_NOCRT(strlen)(&s_szTest1[6]); CHECK_CCH(sizeof(s_szTest1) - 1 - 6);
490 cch = RT_NOCRT(strlen)(&s_szTest1[7]); CHECK_CCH(sizeof(s_szTest1) - 1 - 7);
491 cch = RT_NOCRT(strlen)(s_szTest2); CHECK_CCH(sizeof(s_szTest2) - 1);
492 cch = RT_NOCRT(strlen)(s_szTest3); CHECK_CCH(sizeof(s_szTest3) - 1);
493
494 /*
495 * Summary.
496 */
497 if (!g_cErrors)
498 RTPrintf("tstNoCrt-1: SUCCESS\n");
499 else
500 RTPrintf("tstNoCrt-1: FAILURE - %d errors\n", g_cErrors);
501 return !!g_cErrors;
502}
503
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette