From: Yu Watanabe Date: Sat, 30 Jan 2021 16:12:27 +0000 (+0900) Subject: tree-wide: replace strverscmp() and str_verscmp() with strverscmp_improved() X-Git-Tag: v248-rc1~178^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F18416%2Fhead;p=thirdparty%2Fsystemd.git tree-wide: replace strverscmp() and str_verscmp() with strverscmp_improved() --- diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index b567822b7ef..bb20a12294d 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -2164,7 +2164,7 @@ CGroupMask get_cpu_accounting_mask(void) { struct utsname u; assert_se(uname(&u) >= 0); - if (str_verscmp(u.release, "4.15") < 0) + if (strverscmp_improved(u.release, "4.15") < 0) needed_mask = CGROUP_MASK_CPU; else needed_mask = 0; diff --git a/src/basic/util.c b/src/basic/util.c index de04a01a759..955b18bd2aa 100644 --- a/src/basic/util.c +++ b/src/basic/util.c @@ -227,68 +227,6 @@ int version(void) { return 0; } -/* This is a direct translation of str_verscmp from boot.c */ -static bool is_digit(int c) { - return c >= '0' && c <= '9'; -} - -static int c_order(int c) { - if (c == 0 || is_digit(c)) - return 0; - - if ((c >= 'a') && (c <= 'z')) - return c; - - return c + 0x10000; -} - -int str_verscmp(const char *s1, const char *s2) { - const char *os1, *os2; - - assert(s1); - assert(s2); - - os1 = s1; - os2 = s2; - - while (*s1 || *s2) { - int first; - - while ((*s1 && !is_digit(*s1)) || (*s2 && !is_digit(*s2))) { - int order; - - order = c_order(*s1) - c_order(*s2); - if (order != 0) - return order; - s1++; - s2++; - } - - while (*s1 == '0') - s1++; - while (*s2 == '0') - s2++; - - first = 0; - while (is_digit(*s1) && is_digit(*s2)) { - if (first == 0) - first = *s1 - *s2; - s1++; - s2++; - } - - if (is_digit(*s1)) - return 1; - if (is_digit(*s2)) - return -1; - - if (first != 0) - return first; - } - - return strcmp(os1, os2); -} - /* Turn off core dumps but only if we're running outside of a container. */ void disable_coredumps(void) { int r; diff --git a/src/basic/util.h b/src/basic/util.h index 942d773ff11..b6c51c036eb 100644 --- a/src/basic/util.h +++ b/src/basic/util.h @@ -63,6 +63,4 @@ int container_get_leader(const char *machine, pid_t *pid); int version(void); -int str_verscmp(const char *s1, const char *s2); - void disable_coredumps(void); diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c index 8d2be21dc53..7b759bcd025 100644 --- a/src/boot/bootctl.c +++ b/src/boot/bootctl.c @@ -471,7 +471,7 @@ static int compare_version(const char *a, const char *b) { b += strcspn(b, " "); b += strspn(b, " "); - return strverscmp(a, b); + return strverscmp_improved(a, b); } static int version_check(int fd_from, const char *from, int fd_to, const char *to) { diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 5f2e8f4b7ca..e0df0dcc489 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -914,63 +914,6 @@ static VOID config_entry_free(ConfigEntry *entry) { FreePool(entry); } -static BOOLEAN is_digit(CHAR16 c) { - return (c >= '0') && (c <= '9'); -} - -static UINTN c_order(CHAR16 c) { - if (c == '\0') - return 0; - if (is_digit(c)) - return 0; - else if ((c >= 'a') && (c <= 'z')) - return c; - else - return c + 0x10000; -} - -static INTN str_verscmp(CHAR16 *s1, CHAR16 *s2) { - CHAR16 *os1 = s1; - CHAR16 *os2 = s2; - - while (*s1 || *s2) { - INTN first; - - while ((*s1 && !is_digit(*s1)) || (*s2 && !is_digit(*s2))) { - INTN order; - - order = c_order(*s1) - c_order(*s2); - if (order != 0) - return order; - s1++; - s2++; - } - - while (*s1 == '0') - s1++; - while (*s2 == '0') - s2++; - - first = 0; - while (is_digit(*s1) && is_digit(*s2)) { - if (first == 0) - first = *s1 - *s2; - s1++; - s2++; - } - - if (is_digit(*s1)) - return 1; - if (is_digit(*s2)) - return -1; - - if (first != 0) - return first; - } - - return StrCmp(os1, os2); -} - static CHAR8 *line_get_key_value( CHAR8 *content, CHAR8 *sep, @@ -1535,7 +1478,7 @@ static INTN config_entry_compare(ConfigEntry *a, ConfigEntry *b) { if (a->tries_left == 0 && b->tries_left != 0) return -1; - r = str_verscmp(a->id, b->id); + r = strverscmp_improved(a->id, b->id); if (r != 0) return r; diff --git a/src/shared/bootspec.c b/src/shared/bootspec.c index e50408ab53b..98b380476b4 100644 --- a/src/shared/bootspec.c +++ b/src/shared/bootspec.c @@ -244,7 +244,7 @@ static int boot_loader_read_conf(const char *path, BootConfig *config) { } static int boot_entry_compare(const BootEntry *a, const BootEntry *b) { - return str_verscmp(a->id, b->id); + return strverscmp_improved(a->id, b->id); } static int boot_entries_find( diff --git a/src/shared/condition.c b/src/shared/condition.c index 41d3a16391f..616e77994d8 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -247,7 +247,7 @@ static int condition_test_kernel_version(Condition *c, char **env) { return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Unexpected end of expression: %s", p); } - r = test_order(str_verscmp(u.release, s), order); + r = test_order(strverscmp_improved(u.release, s), order); } else /* No prefix? Then treat as glob string */ r = fnmatch(s, u.release, 0) == 0; diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c index a17f4e2c02b..1ce9939afb0 100644 --- a/src/sysext/sysext.c +++ b/src/sysext/sysext.c @@ -395,9 +395,9 @@ static int merge_hierarchy( return 1; } -static int strverscmpp(char *const* a, char *const* b) { - /* usable in qsort() for sorting a string array with strverscmp() */ - return strverscmp(*a, *b); +static int strverscmp_improvedp(char *const* a, char *const* b) { + /* usable in qsort() for sorting a string array with strverscmp_improved() */ + return strverscmp_improved(*a, *b); } static int validate_version( @@ -623,8 +623,8 @@ static int merge_subprocess(Hashmap *images, const char *workspace) { return 0; } - /* Order by version sort (i.e. libc strverscmp()) */ - typesafe_qsort(extensions, n_extensions, strverscmpp); + /* Order by version sort with strverscmp_improved() */ + typesafe_qsort(extensions, n_extensions, strverscmp_improvedp); buf = strv_join(extensions, "', '"); if (!buf)