tools/nolibc/string: add strcmp() and strncmp()
authorWilly Tarreau <w@1wt.eu>
Mon, 21 Mar 2022 17:33:10 +0000 (18:33 +0100)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 21 Apr 2022 00:05:45 +0000 (17:05 -0700)
We need these functions all the time, including when checking environment
variables and parsing command-line arguments. These implementations were
optimized to show optimal code size on a wide range of compilers (22 bytes
return included for strcmp(), 33 for strncmp()).

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/include/nolibc/string.h

index 4554b6fcb400922c054e7ccdbc31ecbaf81b3fa6..0d5e870c7c0b94f4d0a35a0e5ebee9106f490a11 100644 (file)
@@ -102,6 +102,17 @@ char *strchr(const char *s, int c)
        return NULL;
 }
 
+static __attribute__((unused))
+int strcmp(const char *a, const char *b)
+{
+       unsigned int c;
+       int diff;
+
+       while (!(diff = (unsigned char)*a++ - (c = (unsigned char)*b++)) && c)
+               ;
+       return diff;
+}
+
 static __attribute__((unused))
 char *strcpy(char *dst, const char *src)
 {
@@ -184,6 +195,18 @@ char *strncat(char *dst, const char *src, size_t size)
        return orig;
 }
 
+static __attribute__((unused))
+int strncmp(const char *a, const char *b, size_t size)
+{
+       unsigned int c;
+       int diff = 0;
+
+       while (size-- &&
+              !(diff = (unsigned char)*a++ - (c = (unsigned char)*b++)) && c)
+               ;
+
+       return diff;
+}
 
 static __attribute__((unused))
 char *strncpy(char *dst, const char *src, size_t size)