@@ -22,6 +22,7 @@
|
||||
|
||||
#include <libintl.h>
|
||||
#include <stdbool.h>
|
||||
#include <locale.h>
|
||||
|
||||
#include "macro.h"
|
||||
|
||||
@@ -75,3 +76,10 @@ LocaleVariable locale_variable_from_string(const char *s) _pure_;
|
||||
|
||||
int get_keymaps(char ***l);
|
||||
bool keymap_is_valid(const char *name);
|
||||
|
||||
static inline void freelocalep(locale_t *p) {
|
||||
if (*p == (locale_t) 0)
|
||||
return;
|
||||
|
||||
freelocale(*p);
|
||||
}
|
||||
|
||||
+17
-20
@@ -28,6 +28,7 @@
|
||||
#include "alloc-util.h"
|
||||
#include "errno-list.h"
|
||||
#include "extract-word.h"
|
||||
#include "locale-util.h"
|
||||
#include "macro.h"
|
||||
#include "parse-util.h"
|
||||
#include "process-util.h"
|
||||
@@ -83,7 +84,7 @@ int parse_mode(const char *s, mode_t *ret) {
|
||||
l = strtol(s, &x, 8);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if (l < 0 || l > 07777)
|
||||
return -ERANGE;
|
||||
@@ -391,7 +392,7 @@ int safe_atou(const char *s, unsigned *ret_u) {
|
||||
l = strtoul(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if (s[0] == '-')
|
||||
return -ERANGE;
|
||||
@@ -413,7 +414,7 @@ int safe_atoi(const char *s, int *ret_i) {
|
||||
l = strtol(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if ((long) (int) l != l)
|
||||
return -ERANGE;
|
||||
@@ -435,7 +436,7 @@ int safe_atollu(const char *s, long long unsigned *ret_llu) {
|
||||
l = strtoull(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if (*s == '-')
|
||||
return -ERANGE;
|
||||
@@ -455,7 +456,7 @@ int safe_atolli(const char *s, long long int *ret_lli) {
|
||||
l = strtoll(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
|
||||
*ret_lli = l;
|
||||
@@ -475,7 +476,7 @@ int safe_atou8(const char *s, uint8_t *ret) {
|
||||
l = strtoul(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if (s[0] == '-')
|
||||
return -ERANGE;
|
||||
@@ -499,7 +500,7 @@ int safe_atou16(const char *s, uint16_t *ret) {
|
||||
l = strtoul(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if (s[0] == '-')
|
||||
return -ERANGE;
|
||||
@@ -521,7 +522,7 @@ int safe_atoi16(const char *s, int16_t *ret) {
|
||||
l = strtol(s, &x, 0);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
if (!x || x == s || *x)
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
if ((long) (int16_t) l != l)
|
||||
return -ERANGE;
|
||||
@@ -531,9 +532,9 @@ int safe_atoi16(const char *s, int16_t *ret) {
|
||||
}
|
||||
|
||||
int safe_atod(const char *s, double *ret_d) {
|
||||
_cleanup_(freelocalep) locale_t loc = (locale_t) 0;
|
||||
char *x = NULL;
|
||||
double d = 0;
|
||||
locale_t loc;
|
||||
|
||||
assert(s);
|
||||
assert(ret_d);
|
||||
@@ -544,16 +545,11 @@ int safe_atod(const char *s, double *ret_d) {
|
||||
|
||||
errno = 0;
|
||||
d = strtod_l(s, &x, loc);
|
||||
if (errno > 0) {
|
||||
freelocale(loc);
|
||||
if (errno > 0)
|
||||
return -errno;
|
||||
}
|
||||
if (!x || x == s || *x) {
|
||||
freelocale(loc);
|
||||
if (!x || x == s || *x != 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
freelocale(loc);
|
||||
*ret_d = (double) d;
|
||||
return 0;
|
||||
}
|
||||
@@ -596,19 +592,20 @@ int parse_fractional_part_u(const char **p, size_t digits, unsigned *res) {
|
||||
|
||||
int parse_percent_unbounded(const char *p) {
|
||||
const char *pc, *n;
|
||||
unsigned v;
|
||||
int r;
|
||||
int r, v;
|
||||
|
||||
pc = endswith(p, "%");
|
||||
if (!pc)
|
||||
return -EINVAL;
|
||||
|
||||
n = strndupa(p, pc - p);
|
||||
r = safe_atou(n, &v);
|
||||
r = safe_atoi(n, &v);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (v < 0)
|
||||
return -ERANGE;
|
||||
|
||||
return (int) v;
|
||||
return v;
|
||||
}
|
||||
|
||||
int parse_percent(const char *p) {
|
||||
|
||||
Reference in New Issue
Block a user