20
20
* memccpy
21
21
*/
22
22
23
+ #define C (expr ) if (!(expr)) { return __LINE__; }
24
+
23
25
#define SINK (char*)0xE40000
24
26
25
27
// prevents Clang from replacing function calls with builtins
@@ -40,6 +42,9 @@ void *T_memccpy(void *__restrict dest, const void *__restrict src, int c, size_t
40
42
void * T_mempcpy (void * __restrict dest , const void * __restrict src , size_t n )
41
43
__attribute__((nonnull (1 , 2 )));
42
44
45
+ void * T_memrchr (const void * s , int c , size_t n )
46
+ __attribute__((nonnull (1 )));
47
+
43
48
char * T_stpcpy (char * __restrict dest , const char * __restrict src )
44
49
__attribute__((nonnull (1 , 2 )));
45
50
@@ -49,6 +54,9 @@ size_t T_strlen(const char *s)
49
54
int T_strcmp (const char * s1 , const char * s2 )
50
55
__attribute__((nonnull (1 , 2 )));
51
56
57
+ int T_strncmp (const char * s1 , const char * s2 , size_t n )
58
+ __attribute__((nonnull (1 , 2 )));
59
+
52
60
void T_bzero (void * s , size_t n );
53
61
54
62
#else
@@ -58,9 +66,11 @@ void T_bzero(void* s, size_t n);
58
66
#define T_memcmp memcmp
59
67
#define T_memccpy memccpy
60
68
#define T_mempcpy mempcpy
69
+ #define T_memrchr memrchr
61
70
#define T_stpcpy stpcpy
62
71
#define T_strlen strlen
63
72
#define T_strcmp strcmp
73
+ #define T_strncmp strncmp
64
74
#define T_bzero bzero
65
75
66
76
#endif
@@ -471,6 +481,73 @@ int bzero_test(void) {
471
481
return 0 ;
472
482
}
473
483
484
+ int strncmp_test (void ) {
485
+ const char * str0 = "Hello World!" ;
486
+ const char * str1 = "Hello!" ;
487
+ const char * str2 = "Hello" ;
488
+ const char * str3 = "Hello there" ;
489
+ const char * str4 = "Hello, everybody!" ;
490
+ const char * str5 = "Hello, somebody!" ;
491
+
492
+ C (T_strcmp (SINK , SINK ) == 0 );
493
+ C (T_strcmp ("C" , "C" ) == 0 );
494
+ C (T_strcmp ("A" , "C" ) < 0 );
495
+ C (T_strcmp ("C" , "A" ) > 0 );
496
+ C (T_strcmp ("CD" , "CD" ) == 0 );
497
+ C (T_strcmp ("AB" , "CD" ) < 0 );
498
+ C (T_strcmp ("CD" , "AB" ) > 0 );
499
+ C (T_strcmp ("FE" , "FG" ) < 0 );
500
+ C (T_strcmp ("FG" , "FE" ) > 0 );
501
+ C (T_strcmp (str0 , str1 ) < 0 );
502
+ C (T_strcmp (str0 , str2 ) > 0 );
503
+ C (T_strcmp (str0 , str3 ) < 0 );
504
+ C (T_strcmp (str4 + 12 , str5 + 11 ) == 0 );
505
+
506
+ C (T_strncmp (SINK , SINK , 0 ) == 0 );
507
+ C (T_strncmp (SINK , SINK , 1 ) == 0 );
508
+ C (T_strncmp (SINK , SINK , 2 ) == 0 );
509
+ C (T_strncmp ("C" , "C" , 1 ) == 0 );
510
+ C (T_strncmp ("A" , "C" , 1 ) < 0 );
511
+ C (T_strncmp ("C" , "A" , 1 ) > 0 );
512
+ C (T_strncmp ("CD" , "CD" , 2 ) == 0 );
513
+ C (T_strncmp ("AB" , "CD" , 2 ) < 0 );
514
+ C (T_strncmp ("CD" , "AB" , 2 ) > 0 );
515
+ C (T_strncmp ("FE" , "FG" , 2 ) < 0 );
516
+ C (T_strncmp ("FG" , "FE" , 2 ) > 0 );
517
+ C (T_strncmp (str0 , str1 , 5 ) == 0 );
518
+ C (T_strncmp (str0 , str2 , 10 ) > 0 );
519
+ C (T_strncmp (str0 , str3 , 10 ) < 0 );
520
+ C (T_strncmp (str4 + 12 , str5 + 11 , 5 ) == 0 );
521
+
522
+ return 0 ;
523
+ }
524
+
525
+ int memrchr_test (void ) {
526
+ C (T_memrchr (SINK , 0x00 , 0 ) == NULL );
527
+ C (T_memrchr (SINK , 0x00 , 1 ) == SINK );
528
+ C (T_memrchr (SINK , 0xFF , 1 ) == NULL );
529
+ C (T_memrchr (SINK , 0x00 , 2 ) == SINK + 2 - 1 );
530
+ C (T_memrchr (SINK , 0x00 , 500 ) == SINK + 500 - 1 );
531
+ const char test0 [] = "GABCDEFABCDEF" ;
532
+ char const * const test = & test0 [1 ];
533
+
534
+ const size_t test_size = sizeof (test0 ) - 1 ;
535
+ const size_t test_strlen = sizeof (test0 ) - 2 ;
536
+
537
+ C (T_memrchr (test , '\0' , test_size ) == & test [12 ]);
538
+ C (T_memrchr (test , 'A' , test_strlen ) == & test [6 ]);
539
+ C (T_memrchr (& test [7 ], 'A' , 5 ) == NULL );
540
+ C (T_memrchr (& test [6 ], 'A' , 6 ) == & test [6 ]);
541
+ C (T_memrchr (& test [5 ], 'A' , 7 ) == & test [6 ]);
542
+ C (T_memrchr (& test [7 ], 'B' , 5 ) == & test [7 ]);
543
+ C (T_memrchr (& test [8 ], 'C' , 1 ) == & test [8 ]);
544
+ C (T_memrchr (& test [8 ], 'C' , 8 ) == & test [8 ]);
545
+ C (T_memrchr (test , 'G' , test_strlen ) == NULL );
546
+ C (T_memrchr (test , 'G' , test_size ) == NULL );
547
+ C (T_memrchr (test0 , 'G' , sizeof (test0 )) == test0 );
548
+ return 0 ;
549
+ }
550
+
474
551
int run_tests (void ) {
475
552
int ret = 0 ;
476
553
/* boot_asprintf */
@@ -500,6 +577,14 @@ int run_tests(void) {
500
577
ret = bzero_test ();
501
578
if (ret != 0 ) { return ret ; }
502
579
580
+ /* strncmp */
581
+ ret = strncmp_test ();
582
+ if (ret != 0 ) { return ret ; }
583
+
584
+ /* strncmp */
585
+ ret = memrchr_test ();
586
+ if (ret != 0 ) { return ret ; }
587
+
503
588
return 0 ;
504
589
}
505
590
0 commit comments