Re: [systemd-devel] [PATCH 3/3] remove RUN_WITH_LOCALE et all, use extended locale functions instead

2015-01-18 Thread David Herrmann
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

2015-01-14 Thread Cristian Rodríguez
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