summaryrefslogtreecommitdiff
path: root/src/fundamental/string-util-fundamental.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-05-19 09:05:48 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-05-19 11:07:28 +0200
commit8d9156660d6958c8d63b1d44692968f1b5d33920 (patch)
tree51135ba8e9b942e4089a39238738d66be63c870e /src/fundamental/string-util-fundamental.c
parent4e8295f42dc7b7e001f620db64abfcd407b4e36c (diff)
downloadsystemd-8d9156660d6958c8d63b1d44692968f1b5d33920.tar.gz
version comparisons: stop using locale-dependent isdigit()
The docs are not entirely clear what glyphs qualify as digits. The function is supposed to be locale-dependent, but I couldn't get it to return true on any non-ascii digits I tried. But it's better to be safe than sorry, let's use our trivial replacement instead.
Diffstat (limited to 'src/fundamental/string-util-fundamental.c')
-rw-r--r--src/fundamental/string-util-fundamental.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/fundamental/string-util-fundamental.c b/src/fundamental/string-util-fundamental.c
index 57b4d535f3..feccb822ff 100644
--- a/src/fundamental/string-util-fundamental.c
+++ b/src/fundamental/string-util-fundamental.c
@@ -77,19 +77,18 @@ sd_char* endswith_no_case(const sd_char *s, const sd_char *postfix) {
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) {
@@ -187,7 +186,7 @@ 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++;
@@ -196,9 +195,9 @@ sd_int strverscmp_improved(const sd_char *a, const sd_char *b) {
/* 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