Hi
On Thu, Jan 15, 2015 at 6:27 AM, Cristian RodrÃguez
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 ch