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);
}