2 * Copyright (c) 2011 Jiri Zarevucky
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup libposix
32 /** @file Locale-specific definitions.
35 #define LIBPOSIX_INTERNAL
37 #include "internal/common.h"
44 /* Just a very basic dummy implementation.
45 * This should allow code using locales to work properly, but doesn't provide
46 * any localization functionality.
47 * Should be extended/rewritten when or if HelenOS supports locales natively.
50 struct __posix_locale
{
54 const struct posix_lconv C_LOCALE
= {
55 .currency_symbol
= (char *) "",
56 .decimal_point
= (char *) ".",
57 .frac_digits
= CHAR_MAX
,
58 .grouping
= (char *) "",
59 .int_curr_symbol
= (char *) "",
60 .int_frac_digits
= CHAR_MAX
,
61 .int_n_cs_precedes
= CHAR_MAX
,
62 .int_n_sep_by_space
= CHAR_MAX
,
63 .int_n_sign_posn
= CHAR_MAX
,
64 .int_p_cs_precedes
= CHAR_MAX
,
65 .int_p_sep_by_space
= CHAR_MAX
,
66 .int_p_sign_posn
= CHAR_MAX
,
67 .mon_decimal_point
= (char *) "",
68 .mon_grouping
= (char *) "",
69 .mon_thousands_sep
= (char *) "",
70 .negative_sign
= (char *) "",
71 .n_cs_precedes
= CHAR_MAX
,
72 .n_sep_by_space
= CHAR_MAX
,
73 .n_sign_posn
= CHAR_MAX
,
74 .positive_sign
= (char *) "",
75 .p_cs_precedes
= CHAR_MAX
,
76 .p_sep_by_space
= CHAR_MAX
,
77 .p_sign_posn
= CHAR_MAX
,
78 .thousands_sep
= (char *) ""
84 * @param category What category to set.
85 * @param locale Locale name.
86 * @return Original locale name on success, NULL on failure.
88 char *posix_setlocale(int category
, const char *locale
)
91 if (locale
== NULL
|| *locale
== '\0' ||
92 posix_strcmp(locale
, "C") == 0) {
99 * Return locale-specific information.
101 * @return Information about the current locale.
103 struct posix_lconv
*posix_localeconv(void)
106 return (struct posix_lconv
*) &C_LOCALE
;
110 * Duplicate locale object.
112 * @param locobj Object to duplicate.
113 * @return Duplicated object.
115 posix_locale_t
posix_duplocale(posix_locale_t locobj
)
117 if (locobj
== NULL
) {
121 posix_locale_t copy
= malloc(sizeof(struct __posix_locale
));
126 memcpy(copy
, locobj
, sizeof(struct __posix_locale
));
131 * Free locale object.
133 * @param locobj Object to free.
135 void posix_freelocale(posix_locale_t locobj
)
143 * Create or modify a locale object.
145 * @param category_mask Mask of categories to be set or modified.
146 * @param locale Locale to be used.
147 * @param base Object to modify. 0 if new object is to be created.
148 * @return The new/modified locale object.
150 posix_locale_t
posix_newlocale(int category_mask
, const char *locale
,
153 if (locale
== NULL
||
154 (category_mask
& LC_ALL_MASK
) != category_mask
) {
159 posix_locale_t
new = malloc(sizeof(struct __posix_locale
));
165 posix_freelocale(base
);
171 * Set locale for the current thread.
173 * @param newloc Locale to use.
174 * @return The previously set locale or LC_GLOBAL_LOCALE
176 posix_locale_t
posix_uselocale(posix_locale_t newloc
)
179 return LC_GLOBAL_LOCALE
;