]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/strutils: add ul_stralnumcmp()
authorKarel Zak <kzak@redhat.com>
Tue, 23 Feb 2021 08:19:48 +0000 (09:19 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 23 Feb 2021 08:19:48 +0000 (09:19 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
include/strutils.h
lib/strutils.c

index 09cc35e25345bc8840aa3760e4e0e17abc29135d..cb267e227d79b7f83ad87f1b17f40c3bb1734868 100644 (file)
@@ -363,5 +363,6 @@ extern char *strfappend(const char *s, const char *format, ...)
 extern const char *split(const char **state, size_t *l, const char *separator, int quoted);
 
 extern int skip_fline(FILE *fp);
+extern int ul_stralnumcmp(const char *p1, const char *p2);
 
 #endif
index eec4cd5fa4d630b5704c60aac8002b6b2e1d5b32..bf60aed5124fe03b651bfb905e9170832574a462 100644 (file)
@@ -1045,6 +1045,36 @@ int skip_fline(FILE *fp)
        } while (1);
 }
 
+
+/* compare two strings, but ignoring non-alnum and case of the characters, for example
+ * "Hello (123)!" is the same as "hello123".
+ */
+int ul_stralnumcmp(const char *p1, const char *p2)
+{
+       const unsigned char *s1 = (const unsigned char *) p1;
+       const unsigned char *s2 = (const unsigned char *) p2;
+       unsigned char c1, c2;
+
+       do {
+               do {
+                       c1 = (unsigned char) *s1++;
+               } while (c1 != '\0' && !isalnum((unsigned int) c1));
+
+               do {
+                       c2 = (unsigned char) *s2++;
+               } while (c2 != '\0' && !isalnum((unsigned int) c2));
+
+               if (c1 != '\0')
+                       c1 = tolower(c1);
+               if (c2 != '\0')
+                       c2 = tolower(c2);
+               if (c1 == '\0')
+                       return c1 - c2;
+       } while (c1 == c2);
+
+       return c1 - c2;
+}
+
 #ifdef TEST_PROGRAM_STRUTILS
 struct testS {
        char *name;
@@ -1142,13 +1172,19 @@ int main(int argc, char *argv[])
        if (argc == 4 && strcmp(argv[1], "--strdup-member") == 0)
                return test_strdup_to_member(argc - 1, argv + 1);
 
-       else if (argc == 3 && strcmp(argv[1], "--normalize") == 0)
+       if  (argc == 4 && strcmp(argv[1], "--stralnumcmp") == 0) {
+               printf("%s\n", ul_stralnumcmp(argv[2], argv[3]) == 0 ?
+                               "match" : "dismatch");
+               return EXIT_SUCCESS;
+
+       } else if (argc == 3 && strcmp(argv[1], "--normalize") == 0)
                return test_strutils_normalize(argc - 1, argv + 1);
 
        else {
                fprintf(stderr, "usage: %1$s --size <number>[suffix]\n"
                                "       %1$s --cmp-paths <path> <path>\n"
                                "       %1$s --strdup-member <str> <str>\n"
+                               "       %1$s --stralnumcmp <str> <str>\n"
                                "       %1$s --normalize <str>\n",
                                argv[0]);
                exit(EXIT_FAILURE);