Print this page
2964 need POSIX 2008 locale object support
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libc/port/locale/none.c
+++ new/usr/src/lib/libc/port/locale/none.c
1 1 /*
2 2 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
3 3 * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved.
4 4 * Copyright (c) 1993
5 5 * The Regents of the University of California. All rights reserved.
6 6 *
7 7 * This code is derived from software contributed to Berkeley by
8 8 * Paul Borman at Krystal Technologies.
9 9 *
10 + * Copyright (c) 2011 The FreeBSD Foundation
11 + * All rights reserved.
12 + * Portions of this software were developed by David Chisnall
13 + * under sponsorship from the FreeBSD Foundation.
14 + *
10 15 * Redistribution and use in source and binary forms, with or without
11 16 * modification, are permitted provided that the following conditions
12 17 * are met:
13 18 * 1. Redistributions of source code must retain the above copyright
14 19 * notice, this list of conditions and the following disclaimer.
15 20 * 2. Redistributions in binary form must reproduce the above copyright
16 21 * notice, this list of conditions and the following disclaimer in the
17 22 * documentation and/or other materials provided with the distribution.
18 23 * 4. Neither the name of the University nor the names of its contributors
19 24 * may be used to endorse or promote products derived from this software
20 25 * without specific prior written permission.
21 26 *
22 27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 30 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 37 * SUCH DAMAGE.
33 38 */
34 39
35 40 #include "lint.h"
36 41 #include <errno.h>
37 42 #include <limits.h>
38 43 #include <stddef.h>
39 44 #include <stdio.h>
40 45 #include <stdlib.h>
41 46 #include <string.h>
42 47 #include <wchar.h>
43 48 #include <note.h>
44 49 #include "runetype.h"
45 50 #include "mblocal.h"
46 51
47 52 static size_t _none_mbrtowc(wchar_t *_RESTRICT_KYWD,
48 53 const char *_RESTRICT_KYWD, size_t, mbstate_t *_RESTRICT_KYWD);
49 54
50 55 static int _none_mbsinit(const mbstate_t *);
51 56 static size_t _none_mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst,
52 57 const char **_RESTRICT_KYWD src, size_t nms, size_t len,
↓ open down ↓ |
33 lines elided |
↑ open up ↑ |
53 58 mbstate_t *_RESTRICT_KYWD);
54 59 static size_t _none_wcrtomb(char *_RESTRICT_KYWD, wchar_t,
55 60 mbstate_t *_RESTRICT_KYWD);
56 61 static size_t _none_wcsnrtombs(char *_RESTRICT_KYWD,
57 62 const wchar_t **_RESTRICT_KYWD,
58 63 size_t, size_t, mbstate_t *_RESTRICT_KYWD);
59 64
60 65 /* setup defaults */
61 66
62 67 int
63 -_none_init(_RuneLocale *rl)
68 +_none_init(struct xlocale_ctype *l, _RuneLocale *rl)
64 69 {
65 - charset_is_ascii = 1;
70 + charset_is_ascii = 1; /* XXX */
66 71
67 - __mbrtowc = _none_mbrtowc;
68 - __mbsinit = _none_mbsinit;
69 - __mbsnrtowcs = _none_mbsnrtowcs;
70 - __wcrtomb = _none_wcrtomb;
71 - __wcsnrtombs = _none_wcsnrtombs;
72 - _CurrentRuneLocale = rl;
72 + l->__mbrtowc = _none_mbrtowc;
73 + l->__mbsinit = _none_mbsinit;
74 + l->__mbsnrtowcs = _none_mbsnrtowcs;
75 + l->__wcrtomb = _none_wcrtomb;
76 + l->__wcsnrtombs = _none_wcsnrtombs;
77 + l->runes = rl;
78 + /* XXX */
73 79 return (0);
74 80 }
75 81
76 82 static int
77 83 _none_mbsinit(const mbstate_t *unused)
78 84 {
79 85 _NOTE(ARGUNUSED(unused));
80 86
81 87 /*
82 88 * Encoding is not state dependent - we are always in the
83 89 * initial state.
84 90 */
85 91 return (1);
86 92 }
87 93
88 94 static size_t
89 95 _none_mbrtowc(wchar_t *_RESTRICT_KYWD pwc, const char *_RESTRICT_KYWD s,
90 96 size_t n, mbstate_t *_RESTRICT_KYWD unused)
91 97 {
92 98 _NOTE(ARGUNUSED(unused));
93 99
94 100 if (s == NULL)
95 101 /* Reset to initial shift state (no-op) */
96 102 return (0);
97 103 if (n == 0)
98 104 /* Incomplete multibyte sequence */
99 105 return ((size_t)-2);
100 106 if (pwc != NULL)
101 107 *pwc = (unsigned char)*s;
102 108 return (*s == '\0' ? 0 : 1);
103 109 }
104 110
105 111 static size_t
106 112 _none_wcrtomb(char *_RESTRICT_KYWD s, wchar_t wc,
107 113 mbstate_t *_RESTRICT_KYWD unused)
108 114 {
109 115 _NOTE(ARGUNUSED(unused));
110 116
111 117 if (s == NULL)
112 118 /* Reset to initial shift state (no-op) */
113 119 return (1);
114 120 if (wc < 0 || wc > UCHAR_MAX) {
115 121 errno = EILSEQ;
116 122 return ((size_t)-1);
117 123 }
118 124 *s = (unsigned char)wc;
119 125 return (1);
120 126 }
121 127
122 128 static size_t
123 129 _none_mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
124 130 size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD unused)
125 131 {
126 132 const char *s;
127 133 size_t nchr;
128 134
129 135 _NOTE(ARGUNUSED(unused));
130 136
131 137 if (dst == NULL) {
132 138 s = memchr(*src, '\0', nms);
133 139 return (s != NULL ? s - *src : nms);
134 140 }
135 141
136 142 s = *src;
137 143 nchr = 0;
138 144 while (len-- > 0 && nms-- > 0) {
139 145 if ((*dst++ = (unsigned char)*s++) == L'\0') {
140 146 *src = NULL;
141 147 return (nchr);
142 148 }
143 149 nchr++;
144 150 }
145 151 *src = s;
146 152 return (nchr);
147 153 }
148 154
149 155 static size_t
150 156 _none_wcsnrtombs(char *_RESTRICT_KYWD dst, const wchar_t **_RESTRICT_KYWD src,
151 157 size_t nwc, size_t len, mbstate_t *_RESTRICT_KYWD unused)
152 158 {
153 159 const wchar_t *s;
154 160 size_t nchr;
155 161
156 162 _NOTE(ARGUNUSED(unused));
157 163
158 164 if (dst == NULL) {
159 165 for (s = *src; nwc > 0 && *s != L'\0'; s++, nwc--) {
160 166 if (*s < 0 || *s > UCHAR_MAX) {
161 167 errno = EILSEQ;
162 168 return ((size_t)-1);
163 169 }
164 170 }
165 171 return (s - *src);
166 172 }
167 173
168 174 s = *src;
169 175 nchr = 0;
170 176 while (len-- > 0 && nwc-- > 0) {
171 177 if (*s < 0 || *s > UCHAR_MAX) {
172 178 errno = EILSEQ;
173 179 return ((size_t)-1);
174 180 }
175 181 if ((*dst++ = *s++) == '\0') {
176 182 *src = NULL;
177 183 return (nchr);
178 184 }
179 185 nchr++;
180 186 }
181 187 *src = s;
182 188 return (nchr);
183 189 }
184 190
185 191 /* setup defaults */
186 192
187 193 size_t (*__mbrtowc)(wchar_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD,
188 194 size_t, mbstate_t *_RESTRICT_KYWD) = _none_mbrtowc;
189 195
↓ open down ↓ |
107 lines elided |
↑ open up ↑ |
190 196 int (*__mbsinit)(const mbstate_t *) = _none_mbsinit;
191 197
192 198 size_t (*__mbsnrtowcs)(wchar_t *_RESTRICT_KYWD, const char **_RESTRICT_KYWD,
193 199 size_t, size_t, mbstate_t *_RESTRICT_KYWD) = _none_mbsnrtowcs;
194 200
195 201 size_t (*__wcrtomb)(char *_RESTRICT_KYWD, wchar_t, mbstate_t *_RESTRICT_KYWD) =
196 202 _none_wcrtomb;
197 203
198 204 size_t (*__wcsnrtombs)(char *_RESTRICT_KYWD, const wchar_t **_RESTRICT_KYWD,
199 205 size_t, size_t, mbstate_t *_RESTRICT_KYWD) = _none_wcsnrtombs;
206 +
207 +struct xlocale_ctype __xlocale_global_ctype = {
208 + {{0}, "C"},
209 + (_RuneLocale*)&_DefaultRuneLocale,
210 + _none_mbrtowc,
211 + _none_mbsinit,
212 + _none_mbsnrtowcs,
213 + _none_wcrtomb,
214 + _none_wcsnrtombs,
215 + 1, /* __mb_cur_max */
216 + 256 /* __mb_sb_limit */
217 +};
218 +
219 +const struct xlocale_ctype __xlocale_C_ctype = {
220 + {{0}, "C"},
221 + (_RuneLocale*)&_DefaultRuneLocale,
222 + _none_mbrtowc,
223 + _none_mbsinit,
224 + _none_mbsnrtowcs,
225 + _none_wcrtomb,
226 + _none_wcsnrtombs,
227 + 1, /* __mb_cur_max */
228 + 256 /* __mb_sb_limit */
229 +};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX