source: mainline/uspace/lib/posix/locale.c@ 8426a44d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8426a44d was 55b1efd, checked in by Petr Koupy <petr.koupy@…>, 14 years ago

Minor corrections and unifications of the recently added documentation.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 * Copyright (c) 2011 Jiri Zarevucky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
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.
16 *
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.
27 */
28
29/** @addtogroup libposix
30 * @{
31 */
32/** @file Locale-specific definitions.
33 */
34
35#define LIBPOSIX_INTERNAL
36
37#include "internal/common.h"
38#include "locale.h"
39
40#include "errno.h"
41#include "limits.h"
42#include "string.h"
43
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.
48 */
49
50struct __posix_locale {
51 int _dummy;
52};
53
54const 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 *) ""
79};
80
81/**
82 * Set program locale.
83 *
84 * @param category What category to set.
85 * @param locale Locale name.
86 * @return Original locale name on success, NULL on failure.
87 */
88char *posix_setlocale(int category, const char *locale)
89{
90 // TODO
91 if (locale == NULL || *locale == '\0' ||
92 posix_strcmp(locale, "C") == 0) {
93 return (char *) "C";
94 }
95 return NULL;
96}
97
98/**
99 * Return locale-specific information.
100 *
101 * @return Information about the current locale.
102 */
103struct posix_lconv *posix_localeconv(void)
104{
105 // TODO
106 return (struct posix_lconv *) &C_LOCALE;
107}
108
109/**
110 * Duplicate locale object.
111 *
112 * @param locobj Object to duplicate.
113 * @return Duplicated object.
114 */
115posix_locale_t posix_duplocale(posix_locale_t locobj)
116{
117 if (locobj == NULL) {
118 errno = EINVAL;
119 return NULL;
120 }
121 posix_locale_t copy = malloc(sizeof(struct __posix_locale));
122 if (copy == NULL) {
123 errno = ENOMEM;
124 return NULL;
125 }
126 memcpy(copy, locobj, sizeof(struct __posix_locale));
127 return copy;
128}
129
130/**
131 * Free locale object.
132 *
133 * @param locobj Object to free.
134 */
135void posix_freelocale(posix_locale_t locobj)
136{
137 if (locobj) {
138 free(locobj);
139 }
140}
141
142/**
143 * Create or modify a locale object.
144 *
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.
149 */
150posix_locale_t posix_newlocale(int category_mask, const char *locale,
151 posix_locale_t base)
152{
153 if (locale == NULL ||
154 (category_mask & LC_ALL_MASK) != category_mask) {
155 errno = EINVAL;
156 return NULL;
157 }
158 // TODO
159 posix_locale_t new = malloc(sizeof(struct __posix_locale));
160 if (new == NULL) {
161 errno = ENOMEM;
162 return NULL;
163 }
164 if (base != NULL) {
165 posix_freelocale(base);
166 }
167 return new;
168}
169
170/**
171 * Set locale for the current thread.
172 *
173 * @param newloc Locale to use.
174 * @return The previously set locale or LC_GLOBAL_LOCALE
175 */
176posix_locale_t posix_uselocale(posix_locale_t newloc)
177{
178 // TODO
179 return LC_GLOBAL_LOCALE;
180}
181
182/** @}
183 */
Note: See TracBrowser for help on using the repository browser.