Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libc/port/locale/gb2312.c
+++ new/usr/src/lib/libc/port/locale/gb2312.c
1 1 /*
2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
2 3 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
3 4 * Copyright (c) 2004 Tim J. Robbins. All rights reserved.
4 5 * Copyright (c) 2003 David Xu <davidxu@freebsd.org>
5 6 * All rights reserved.
6 7 *
7 8 * Redistribution and use in source and binary forms, with or without
8 9 * modification, are permitted provided that the following conditions
9 10 * are met:
10 11 * 1. Redistributions of source code must retain the above copyright
11 12 * notice, this list of conditions and the following disclaimer.
12 13 * 2. Redistributions in binary form must reproduce the above copyright
13 14 * notice, this list of conditions and the following disclaimer in the
14 15 * documentation and/or other materials provided with the distribution.
15 16 *
16 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 27 * SUCH DAMAGE.
↓ open down ↓ |
15 lines elided |
↑ open up ↑ |
27 28 */
28 29
29 30 #include "lint.h"
30 31 #include <sys/types.h>
31 32 #include <errno.h>
32 33 #include "runetype.h"
33 34 #include <stdlib.h>
34 35 #include <string.h>
35 36 #include <wchar.h>
36 37 #include "mblocal.h"
38 +#include "lctype.h"
37 39
38 40 static size_t _GB2312_mbrtowc(wchar_t *_RESTRICT_KYWD,
39 41 const char *_RESTRICT_KYWD,
40 42 size_t, mbstate_t *_RESTRICT_KYWD);
41 43 static int _GB2312_mbsinit(const mbstate_t *);
42 44 static size_t _GB2312_wcrtomb(char *_RESTRICT_KYWD, wchar_t,
43 45 mbstate_t *_RESTRICT_KYWD);
46 +static size_t _GB2312_mbsnrtowcs(wchar_t *_RESTRICT_KYWD,
47 + const char **_RESTRICT_KYWD, size_t, size_t,
48 + mbstate_t *_RESTRICT_KYWD);
49 +static size_t _GB2312_wcsnrtombs(char *_RESTRICT_KYWD,
50 + const wchar_t **_RESTRICT_KYWD, size_t, size_t,
51 + mbstate_t *_RESTRICT_KYWD);
44 52
53 +
45 54 typedef struct {
46 55 int count;
47 56 uchar_t bytes[2];
48 57 } _GB2312State;
49 58
50 -int
51 -_GB2312_init(_RuneLocale *rl)
59 +void
60 +_GB2312_init(struct lc_ctype *lct)
52 61 {
53 62
54 - _CurrentRuneLocale = rl;
55 - __mbrtowc = _GB2312_mbrtowc;
56 - __wcrtomb = _GB2312_wcrtomb;
57 - __mbsinit = _GB2312_mbsinit;
58 - __ctype[520] = 2;
59 - charset_is_ascii = 0;
60 - return (0);
63 + lct->lc_mbrtowc = _GB2312_mbrtowc;
64 + lct->lc_wcrtomb = _GB2312_wcrtomb;
65 + lct->lc_mbsinit = _GB2312_mbsinit;
66 + lct->lc_mbsnrtowcs = _GB2312_mbsnrtowcs;
67 + lct->lc_wcsnrtombs = _GB2312_wcsnrtombs;
68 + lct->lc_max_mblen = 2;
69 + lct->lc_is_ascii = 0;
61 70 }
62 71
63 72 static int
64 73 _GB2312_mbsinit(const mbstate_t *ps)
65 74 {
66 75
67 76 return (ps == NULL || ((const _GB2312State *)ps)->count == 0);
68 77 }
69 78
70 79 static int
71 80 _GB2312_check(const char *str, size_t n)
72 81 {
73 82 const uchar_t *s = (const uchar_t *)str;
74 83
75 84 if (n == 0)
76 85 /* Incomplete multibyte sequence */
77 86 return (-2);
78 87 if (s[0] >= 0xa1 && s[0] <= 0xfe) {
79 88 if (n < 2)
80 89 /* Incomplete multibyte sequence */
81 90 return (-2);
82 91 if (s[1] < 0xa1 || s[1] > 0xfe)
83 92 /* Invalid multibyte sequence */
84 93 return (-1);
85 94 return (2);
86 95 } else if (s[0] & 0x80) {
87 96 /* Invalid multibyte sequence */
88 97 return (-1);
89 98 }
90 99 return (1);
91 100 }
92 101
93 102 static size_t
94 103 _GB2312_mbrtowc(wchar_t *_RESTRICT_KYWD pwc, const char *_RESTRICT_KYWD s,
95 104 size_t n, mbstate_t *_RESTRICT_KYWD ps)
96 105 {
97 106 _GB2312State *gs;
98 107 wchar_t wc;
99 108 int i, len, ocount;
100 109 size_t ncopy;
101 110
102 111 gs = (_GB2312State *)ps;
103 112
104 113 if (gs->count < 0 || gs->count > sizeof (gs->bytes)) {
105 114 errno = EINVAL;
106 115 return ((size_t)-1);
107 116 }
108 117
109 118 if (s == NULL) {
110 119 s = "";
111 120 n = 1;
112 121 pwc = NULL;
113 122 }
114 123
115 124 ncopy = MIN(MIN(n, MB_CUR_MAX), sizeof (gs->bytes) - gs->count);
116 125 (void) memcpy(gs->bytes + gs->count, s, ncopy);
117 126 ocount = gs->count;
118 127 gs->count += ncopy;
119 128 s = (char *)gs->bytes;
120 129 n = gs->count;
121 130
122 131 if ((len = _GB2312_check(s, n)) < 0)
123 132 return ((size_t)len);
124 133 wc = 0;
125 134 i = len;
126 135 while (i-- > 0)
127 136 wc = (wc << 8) | (unsigned char)*s++;
128 137 if (pwc != NULL)
129 138 *pwc = wc;
130 139 gs->count = 0;
131 140 return (wc == L'\0' ? 0 : len - ocount);
132 141 }
133 142
134 143 static size_t
135 144 _GB2312_wcrtomb(char *_RESTRICT_KYWD s, wchar_t wc,
136 145 mbstate_t *_RESTRICT_KYWD ps)
137 146 {
138 147 _GB2312State *gs;
139 148
140 149 gs = (_GB2312State *)ps;
141 150
142 151 if (gs->count != 0) {
143 152 errno = EINVAL;
144 153 return ((size_t)-1);
145 154 }
146 155
↓ open down ↓ |
76 lines elided |
↑ open up ↑ |
147 156 if (s == NULL)
148 157 /* Reset to initial shift state (no-op) */
149 158 return (1);
150 159 if (wc & 0x8000) {
151 160 *s++ = (wc >> 8) & 0xff;
152 161 *s = wc & 0xff;
153 162 return (2);
154 163 }
155 164 *s = wc & 0xff;
156 165 return (1);
166 +}
167 +
168 +static size_t
169 +_GB2312_mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst,
170 + const char **_RESTRICT_KYWD src, size_t nms, size_t len,
171 + mbstate_t *_RESTRICT_KYWD ps)
172 +{
173 + return (__mbsnrtowcs_std(dst, src, nms, len, ps, _GB2312_mbrtowc));
174 +}
175 +
176 +static size_t
177 +_GB2312_wcsnrtombs(char *_RESTRICT_KYWD dst,
178 + const wchar_t **_RESTRICT_KYWD src, size_t nwc, size_t len,
179 + mbstate_t *_RESTRICT_KYWD ps)
180 +{
181 + return (__wcsnrtombs_std(dst, src, nwc, len, ps, _GB2312_wcrtomb));
157 182 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX