chiark / gitweb /
util: replace RUN_WITH_LOCALE with extended locale functions
authorCristian Rodríguez <crrodriguez@opensuse.org>
Thu, 15 Jan 2015 05:27:34 +0000 (02:27 -0300)
committerDavid Herrmann <dh.herrmann@gmail.com>
Sun, 18 Jan 2015 21:08:44 +0000 (22:08 +0100)
There were two callers, one can use strtod_l() and the other strptime_l().

(David: fix up commit-msg and coding-style)

src/import/curl-util.c
src/shared/util.c
src/shared/util.h

index 0c6c867..313b04b 100644 (file)
@@ -416,29 +416,31 @@ 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) {
+        const char *e;
+        locale_t loc;
         struct tm tm;
         time_t v;
 
         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);
+        freelocale(loc);
+        if (!e || *e != 0)
+                return -EINVAL;
 
+        v = timegm(&tm);
         if (v == (time_t) -1)
                 return -EINVAL;
 
index 884e782..8f6d5e6 100644 (file)
@@ -507,18 +507,24 @@ 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 (loc == (locale_t) 0)
+                return -errno;
 
-        if (!x || x == s || *x || errno)
+        errno = 0;
+        d = strtod_l(s, &x, loc);
+
+        if (!x || x == s || *x || errno) {
+                freelocale(loc);
                 return errno ? -errno : -EINVAL;
+        }
 
+        freelocale(loc);
         *ret_d = (double) d;
         return 0;
 }
index fdb9fb6..8445371 100644 (file)
@@ -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);