Re: [systemd-devel] [PATCH 3/3] remove RUN_WITH_LOCALE et all, use extended locale functions instead
Hi On Thu, Jan 15, 2015 at 6:27 AM, Cristian RodrÃguez crrodrig...@opensuse.org wrote: There were two callers, one can use strtod_l() and the other strptime_l() --- src/import/curl-util.c | 38 +++--- src/shared/util.c | 18 +- src/shared/util.h | 26 -- 3 files changed, 36 insertions(+), 46 deletions(-) I fixed up the whitespace (8chars instead of 4) and other coding-style issues and pushed the patch. Thanks David diff --git a/src/import/curl-util.c b/src/import/curl-util.c index 0c6c867..bbb68f7 100644 --- a/src/import/curl-util.c +++ b/src/import/curl-util.c @@ -418,27 +418,35 @@ int curl_header_strdup(const void *contents, size_t sz, const char *field, char int curl_parse_http_time(const char *t, usec_t *ret) { struct tm tm; time_t v; +const char *e; +locale_t loc; assert(t); assert(ret); -RUN_WITH_LOCALE(LC_TIME, C) { -const char *e; - -/* RFC822 */ -e = strptime(t, %a, %d %b %Y %H:%M:%S %Z, tm); -if (!e || *e != 0) -/* RFC 850 */ -e = strptime(t, %A, %d-%b-%y %H:%M:%S %Z, tm); -if (!e || *e != 0) -/* ANSI C */ -e = strptime(t, %a %b %d %H:%M:%S %Y, tm); -if (!e || *e != 0) -return -EINVAL; - -v = timegm(tm); +loc = newlocale (LC_TIME_MASK, C, (locale_t)0); + +if (loc == (locale_t) 0) +return -errno; + +/* RFC822 */ +e = strptime_l(t, %a, %d %b %Y %H:%M:%S %Z, tm, loc); + +if (!e || *e != 0) +/* RFC 850 */ +e = strptime_l(t, %A, %d-%b-%y %H:%M:%S %Z, tm, loc); +if (!e || *e != 0) +/* ANSI C */ +e = strptime_l(t, %a %b %d %H:%M:%S %Y, tm, loc); +if (!e || *e != 0) { +freelocale(loc); +return -EINVAL; } +freelocale(loc); + +v = timegm(tm); + if (v == (time_t) -1) return -EINVAL; diff --git a/src/shared/util.c b/src/shared/util.c index 884e782..599f3ca 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -507,19 +507,27 @@ int safe_atolli(const char *s, long long int *ret_lli) { int safe_atod(const char *s, double *ret_d) { char *x = NULL; double d = 0; +locale_t loc; assert(s); assert(ret_d); -RUN_WITH_LOCALE(LC_NUMERIC_MASK, C) { -errno = 0; -d = strtod(s, x); -} +loc = newlocale (LC_NUMERIC_MASK, C, (locale_t)0); -if (!x || x == s || *x || errno) +if(loc == (locale_t)0) +return -errno; + +errno = 0; +d = strtod_l(s, x, loc); + +if (!x || x == s || *x || errno) { +freelocale(loc); return errno ? -errno : -EINVAL; +} *ret_d = (double) d; +freelocale(loc); + return 0; } diff --git a/src/shared/util.h b/src/shared/util.h index fdb9fb6..8445371 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -942,32 +942,6 @@ int unlink_noerrno(const char *path); _r_;\ }) -struct _locale_struct_ { -locale_t saved_locale; -locale_t new_locale; -bool quit; -}; - -static inline void _reset_locale_(struct _locale_struct_ *s) { -PROTECT_ERRNO; -if (s-saved_locale != (locale_t) 0) -uselocale(s-saved_locale); -if (s-new_locale != (locale_t) 0) -freelocale(s-new_locale); -} - -#define RUN_WITH_LOCALE(mask, loc) \ -for (_cleanup_(_reset_locale_) struct _locale_struct_ _saved_locale_ = { (locale_t) 0, (locale_t) 0, false }; \ - ({ \ - if (!_saved_locale_.quit) {\ - PROTECT_ERRNO; \ - _saved_locale_.new_locale = newlocale((mask), (loc), (locale_t) 0); \ - if (_saved_locale_.new_locale != (locale_t) 0) \ - _saved_locale_.saved_locale = uselocale(_saved_locale_.new_locale); \ - } \ - !_saved_locale_.quit; }) ; \ - _saved_locale_.quit = true) - bool id128_is_valid(const char *s) _pure_; int split_pair(const char *s, const char *sep, char **l, char **r); -- 2.2.1 ___ systemd-devel mailing list
[systemd-devel] [PATCH 3/3] remove RUN_WITH_LOCALE et all, use extended locale functions instead
There were two callers, one can use strtod_l() and the other strptime_l() --- src/import/curl-util.c | 38 +++--- src/shared/util.c | 18 +- src/shared/util.h | 26 -- 3 files changed, 36 insertions(+), 46 deletions(-) diff --git a/src/import/curl-util.c b/src/import/curl-util.c index 0c6c867..bbb68f7 100644 --- a/src/import/curl-util.c +++ b/src/import/curl-util.c @@ -418,27 +418,35 @@ int curl_header_strdup(const void *contents, size_t sz, const char *field, char int curl_parse_http_time(const char *t, usec_t *ret) { struct tm tm; time_t v; +const char *e; +locale_t loc; assert(t); assert(ret); -RUN_WITH_LOCALE(LC_TIME, C) { -const char *e; - -/* RFC822 */ -e = strptime(t, %a, %d %b %Y %H:%M:%S %Z, tm); -if (!e || *e != 0) -/* RFC 850 */ -e = strptime(t, %A, %d-%b-%y %H:%M:%S %Z, tm); -if (!e || *e != 0) -/* ANSI C */ -e = strptime(t, %a %b %d %H:%M:%S %Y, tm); -if (!e || *e != 0) -return -EINVAL; - -v = timegm(tm); +loc = newlocale (LC_TIME_MASK, C, (locale_t)0); + +if (loc == (locale_t) 0) +return -errno; + +/* RFC822 */ +e = strptime_l(t, %a, %d %b %Y %H:%M:%S %Z, tm, loc); + +if (!e || *e != 0) +/* RFC 850 */ +e = strptime_l(t, %A, %d-%b-%y %H:%M:%S %Z, tm, loc); +if (!e || *e != 0) +/* ANSI C */ +e = strptime_l(t, %a %b %d %H:%M:%S %Y, tm, loc); +if (!e || *e != 0) { +freelocale(loc); +return -EINVAL; } +freelocale(loc); + +v = timegm(tm); + if (v == (time_t) -1) return -EINVAL; diff --git a/src/shared/util.c b/src/shared/util.c index 884e782..599f3ca 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -507,19 +507,27 @@ int safe_atolli(const char *s, long long int *ret_lli) { int safe_atod(const char *s, double *ret_d) { char *x = NULL; double d = 0; +locale_t loc; assert(s); assert(ret_d); -RUN_WITH_LOCALE(LC_NUMERIC_MASK, C) { -errno = 0; -d = strtod(s, x); -} +loc = newlocale (LC_NUMERIC_MASK, C, (locale_t)0); -if (!x || x == s || *x || errno) +if(loc == (locale_t)0) +return -errno; + +errno = 0; +d = strtod_l(s, x, loc); + +if (!x || x == s || *x || errno) { +freelocale(loc); return errno ? -errno : -EINVAL; +} *ret_d = (double) d; +freelocale(loc); + return 0; } diff --git a/src/shared/util.h b/src/shared/util.h index fdb9fb6..8445371 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -942,32 +942,6 @@ int unlink_noerrno(const char *path); _r_;\ }) -struct _locale_struct_ { -locale_t saved_locale; -locale_t new_locale; -bool quit; -}; - -static inline void _reset_locale_(struct _locale_struct_ *s) { -PROTECT_ERRNO; -if (s-saved_locale != (locale_t) 0) -uselocale(s-saved_locale); -if (s-new_locale != (locale_t) 0) -freelocale(s-new_locale); -} - -#define RUN_WITH_LOCALE(mask, loc) \ -for (_cleanup_(_reset_locale_) struct _locale_struct_ _saved_locale_ = { (locale_t) 0, (locale_t) 0, false }; \ - ({ \ - if (!_saved_locale_.quit) {\ - PROTECT_ERRNO; \ - _saved_locale_.new_locale = newlocale((mask), (loc), (locale_t) 0); \ - if (_saved_locale_.new_locale != (locale_t) 0) \ - _saved_locale_.saved_locale = uselocale(_saved_locale_.new_locale); \ - } \ - !_saved_locale_.quit; }) ; \ - _saved_locale_.quit = true) - bool id128_is_valid(const char *s) _pure_; int split_pair(const char *s, const char *sep, char **l, char **r); -- 2.2.1 ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel