]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[libc] Add strncasecmp()
authorMichael Brown <mcb30@ipxe.org>
Tue, 18 May 2021 10:45:24 +0000 (11:45 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 18 May 2021 10:45:24 +0000 (11:45 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/string.c
src/include/strings.h
src/tests/string_test.c

index 188fe08646b3ffd3d21cd678ca8b7a81fdce8298..9a1b9b72a891265de896561a4f49c68b82fd0444 100644 (file)
@@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 #include <ctype.h>
 
 /** @file
@@ -205,11 +206,24 @@ int strncmp ( const char *first, const char *second, size_t max ) {
  * @ret diff           Difference
  */
 int strcasecmp ( const char *first, const char *second ) {
+
+       return strncasecmp ( first, second, ~( ( size_t ) 0 ) );
+}
+
+/**
+ * Compare case-insensitive strings
+ *
+ * @v first            First string
+ * @v second           Second string
+ * @v max              Maximum length to compare
+ * @ret diff           Difference
+ */
+int strncasecmp ( const char *first, const char *second, size_t max ) {
        const uint8_t *first_bytes = ( ( const uint8_t * ) first );
        const uint8_t *second_bytes = ( ( const uint8_t * ) second );
        int diff;
 
-       for ( ; ; first_bytes++, second_bytes++ ) {
+       for ( ; max-- ; first_bytes++, second_bytes++ ) {
                diff = ( toupper ( *first_bytes ) -
                         toupper ( *second_bytes ) );
                if ( diff )
@@ -217,6 +231,7 @@ int strcasecmp ( const char *first, const char *second ) {
                if ( ! *first_bytes )
                        return 0;
        }
+       return 0;
 }
 
 /**
index fab26dc28ebf15622801791071f92656675f63bb..d7e9d697194ca4884a4fb81d304e1b324f10592b 100644 (file)
@@ -189,5 +189,7 @@ bzero ( void *dest, size_t len ) {
 }
 
 int __pure strcasecmp ( const char *first, const char *second ) __nonnull;
+int __pure strncasecmp ( const char *first, const char *second,
+                        size_t max ) __nonnull;
 
 #endif /* _STRINGS_H */
index 88a730aecfeb31213f384acd063ad6b9561eff91..3afb8deb26795fd2b5cdca528595f1d61d1e3d42 100644 (file)
@@ -105,6 +105,14 @@ static void string_test_exec ( void ) {
        ok ( strcasecmp ( "Uncle", "Uncle Jack" ) != 0 );
        ok ( strcasecmp ( "not", "equal" ) != 0 );
 
+       /* Test strncasecmp() */
+       ok ( strncasecmp ( "", "", 0 ) == 0 );
+       ok ( strncasecmp ( "", "", 73 ) == 0 );
+       ok ( strncasecmp ( "Uncle Jack", "Uncle jack", 47 ) == 0 );
+       ok ( strncasecmp ( "Uncle Jack", "Uncle jake", 47 ) != 0 );
+       ok ( strncasecmp ( "Uncle Jack", "Uncle jake", 9 ) != 0 );
+       ok ( strncasecmp ( "Uncle Jack", "Uncle jake", 8 ) == 0 );
+
        /* Test memcmp() */
        ok ( memcmp ( "", "", 0 ) == 0 );
        ok ( memcmp ( "Foo", "Foo", 3 ) == 0 );