Print this page
2964 need POSIX 2008 locale object support

@@ -33,10 +33,12 @@
 
 static struct lc_time_T _time_locale;
 static int _time_using_locale;
 static char *time_locale_buf;
 
+struct xlocale_time __xlocale_global_time;
+
 #define LCTIME_SIZE (sizeof (struct lc_time_T) / sizeof (char *))
 
 static const struct lc_time_T   _C_time_locale = {
         {
                 "Jan", "Feb", "Mar", "Apr", "May", "Jun",

@@ -82,19 +84,60 @@
          * ampm_fmt - To determine 12-hour clock format time (empty, if N/A)
          */
         "%I:%M:%S %p"
 };
 
+static void
+destruct_time(void *v)
+{
+        struct xlocale_time *l = v;
+
+        if (l->buffer != NULL)
+                free(l->buffer);
+
+        free(l);
+}
+
 struct lc_time_T *
-__get_current_time_locale(void)
+__get_current_time_locale(locale_t loc)
 {
-        return (_time_using_locale ? &_time_locale :
-            (struct lc_time_T *)&_C_time_locale);
+        return (loc->using_time_locale
+            ? &((struct xlocale_time *)loc->components[XLC_TIME])->locale
+            : (struct lc_time_T *)&_C_time_locale);
+}
+
+static int
+time_load_locale(struct xlocale_time *l, int *using_locale, const char *name)
+{
+        struct lc_time_T *time_locale = &l->locale;
+
+        return (__part_load_locale(name, using_locale,
+            &l->buffer, "LC_TIME",
+            LCTIME_SIZE, LCTIME_SIZE,
+            (const char **)time_locale));
 }
 
 int
 __time_load_locale(const char *name)
 {
-        return (__part_load_locale(name, &_time_using_locale,
-            &time_locale_buf, "LC_TIME", LCTIME_SIZE, LCTIME_SIZE,
-            (const char **)&_time_locale));
+        return (time_load_locale(&__xlocale_global_time,
+            &__xlocale_global_locale.using_time_locale, name));
+}
+
+void *
+__time_load(const char* name, locale_t loc)
+{
+        struct xlocale_time *new;
+
+        new = calloc(sizeof(struct xlocale_time), 1);
+        if (new == NULL)
+                return (NULL);
+
+        new->header.header.destructor = destruct_time;
+        if (time_load_locale(new, &loc->using_time_locale, name) ==
+            _LDP_ERROR) {
+                xlocale_release(new);
+                return (NULL);
+        }
+
+        return (new);
 }