2020* memccpy
2121*/
2222
23+ #define C (expr ) if (!(expr)) { return __LINE__; }
24+
2325#define SINK (char*)0xE40000
2426
2527// 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
4042void * T_mempcpy (void * __restrict dest , const void * __restrict src , size_t n )
4143 __attribute__((nonnull (1 , 2 )));
4244
45+ void * T_memrchr (const void * s , int c , size_t n )
46+ __attribute__((nonnull (1 )));
47+
4348char * T_stpcpy (char * __restrict dest , const char * __restrict src )
4449 __attribute__((nonnull (1 , 2 )));
4550
@@ -49,6 +54,9 @@ size_t T_strlen(const char *s)
4954int T_strcmp (const char * s1 , const char * s2 )
5055 __attribute__((nonnull (1 , 2 )));
5156
57+ int T_strncmp (const char * s1 , const char * s2 , size_t n )
58+ __attribute__((nonnull (1 , 2 )));
59+
5260void T_bzero (void * s , size_t n );
5361
5462#else
@@ -58,9 +66,11 @@ void T_bzero(void* s, size_t n);
5866#define T_memcmp memcmp
5967#define T_memccpy memccpy
6068#define T_mempcpy mempcpy
69+ #define T_memrchr memrchr
6170#define T_stpcpy stpcpy
6271#define T_strlen strlen
6372#define T_strcmp strcmp
73+ #define T_strncmp strncmp
6474#define T_bzero bzero
6575
6676#endif
@@ -471,6 +481,73 @@ int bzero_test(void) {
471481 return 0 ;
472482}
473483
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+
474551int run_tests (void ) {
475552 int ret = 0 ;
476553 /* boot_asprintf */
@@ -500,6 +577,14 @@ int run_tests(void) {
500577 ret = bzero_test ();
501578 if (ret != 0 ) { return ret ; }
502579
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+
503588 return 0 ;
504589}
505590
0 commit comments