return (sd_char*) s + sl - pl;
}
-#ifdef SD_BOOT
-static sd_bool isdigit(sd_char a) {
+static sd_bool is_digit(sd_char a) {
+ /* Locale-independent version of isdigit(). */
return a >= '0' && a <= '9';
}
-#endif
static sd_bool is_alpha(sd_char a) {
- /* Locale independent version of isalpha(). */
+ /* Locale-independent version of isalpha(). */
return (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z');
}
static sd_bool is_valid_version_char(sd_char a) {
- return isdigit(a) || is_alpha(a) || IN_SET(a, '~', '-', '^', '.');
+ return is_digit(a) || is_alpha(a) || IN_SET(a, '~', '-', '^', '.');
}
sd_int strverscmp_improved(const sd_char *a, const sd_char *b) {
b++;
}
- if (isdigit(*a) || isdigit(*b)) {
+ if (is_digit(*a) || is_digit(*b)) {
/* Skip leading '0', to make 00123 equivalent to 123. */
while (*a == '0')
a++;
/* Find the leading numeric segments. One may be an empty string. So,
* numeric segments are always newer than alpha segments. */
- for (aa = a; isdigit(*aa); aa++)
+ for (aa = a; is_digit(*aa); aa++)
;
- for (bb = b; isdigit(*bb); bb++)
+ for (bb = b; is_digit(*bb); bb++)
;
/* To compare numeric segments without parsing their values, first compare the
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include <ctype.h>
+
#include "alloc-util.h"
#include "locale-util.h"
#include "macro.h"
/* invalid characters */
assert_se(strverscmp_improved("123_aa2-67.89", "123aa+2-67.89") == 0);
+
+ /* non-ASCII digits */
+ (void) setlocale(LC_NUMERIC, "ar_YE.utf8");
+ assert_se(strverscmp_improved("1٠١٢٣٤٥٦٧٨٩", "1") == 0);
+
+ (void) setlocale(LC_NUMERIC, "th_TH.utf8");
+ assert_se(strverscmp_improved("1๐๑๒๓๔๕๖๗๘๙", "1") == 0);
}
#define RPMVERCMP(a, b, c) \