Deleted Added
full compact
gb2312.c (122283) gb2312.c (128004)
1/*-
1/*-
2 * Copyright (c) 2004 Tim J. Robbins. All rights reserved.
2 * Copyright (c) 2003 David Xu <davidxu@freebsd.org>
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 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.

--- 9 unchanged lines hidden (view full) ---

19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
3 * Copyright (c) 2003 David Xu <davidxu@freebsd.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.

--- 9 unchanged lines hidden (view full) ---

20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/lib/libc/locale/gb2312.c 122283 2003-11-08 02:58:37Z tjr $");
28#include <sys/param.h>
29__FBSDID("$FreeBSD: head/lib/libc/locale/gb2312.c 128004 2004-04-07 10:48:19Z tjr $");
29
30
30#include <sys/types.h>
31#include <runetype.h>
32#include <stdlib.h>
31#include <runetype.h>
32#include <stdlib.h>
33#include <string.h>
33#include <wchar.h>
34
35extern size_t (*__mbrtowc)(wchar_t * __restrict, const char * __restrict,
36 size_t, mbstate_t * __restrict);
34#include <wchar.h>
35
36extern size_t (*__mbrtowc)(wchar_t * __restrict, const char * __restrict,
37 size_t, mbstate_t * __restrict);
38extern int (*__mbsinit)(const mbstate_t *);
37extern size_t (*__wcrtomb)(char * __restrict, wchar_t, mbstate_t * __restrict);
38
39int _GB2312_init(_RuneLocale *);
40size_t _GB2312_mbrtowc(wchar_t * __restrict, const char * __restrict, size_t,
41 mbstate_t * __restrict);
39extern size_t (*__wcrtomb)(char * __restrict, wchar_t, mbstate_t * __restrict);
40
41int _GB2312_init(_RuneLocale *);
42size_t _GB2312_mbrtowc(wchar_t * __restrict, const char * __restrict, size_t,
43 mbstate_t * __restrict);
44int _GB2312_mbsinit(const mbstate_t *);
42size_t _GB2312_wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict);
43
45size_t _GB2312_wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict);
46
47typedef struct {
48 int count;
49 u_char bytes[2];
50} _GB2312State;
51
44int
45_GB2312_init(_RuneLocale *rl)
46{
47
48 _CurrentRuneLocale = rl;
49 __mbrtowc = _GB2312_mbrtowc;
50 __wcrtomb = _GB2312_wcrtomb;
52int
53_GB2312_init(_RuneLocale *rl)
54{
55
56 _CurrentRuneLocale = rl;
57 __mbrtowc = _GB2312_mbrtowc;
58 __wcrtomb = _GB2312_wcrtomb;
59 __mbsinit = _GB2312_mbsinit;
51 __mb_cur_max = 2;
52 return (0);
53}
54
60 __mb_cur_max = 2;
61 return (0);
62}
63
64int
65_GB2312_mbsinit(const mbstate_t *ps)
66{
67
68 return (ps == NULL || ((_GB2312State *)ps)->count == 0);
69}
70
55static __inline int
56_GB2312_check(const char *str, size_t n)
57{
58 const u_char *s = (const u_char *)str;
59
60 if (n == 0)
61 /* Incomplete multibyte sequence */
62 return (-2);

--- 9 unchanged lines hidden (view full) ---

72 /* Invalid multibyte sequence */
73 return (-1);
74 }
75 return (1);
76}
77
78size_t
79_GB2312_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n,
71static __inline int
72_GB2312_check(const char *str, size_t n)
73{
74 const u_char *s = (const u_char *)str;
75
76 if (n == 0)
77 /* Incomplete multibyte sequence */
78 return (-2);

--- 9 unchanged lines hidden (view full) ---

88 /* Invalid multibyte sequence */
89 return (-1);
90 }
91 return (1);
92}
93
94size_t
95_GB2312_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n,
80 mbstate_t * __restrict ps __unused)
96 mbstate_t * __restrict ps)
81{
97{
98 _GB2312State *gs;
82 wchar_t wc;
99 wchar_t wc;
83 int i, len;
100 int i, len, ocount;
101 size_t ncopy;
84
102
85 if (s == NULL)
86 /* Reset to initial shift state (no-op) */
87 return (0);
103 gs = (_GB2312State *)gs;
104
105 if (s == NULL) {
106 s = "";
107 n = 1;
108 pwc = NULL;
109 }
110
111 ncopy = MIN(MIN(n, MB_CUR_MAX), sizeof(gs->bytes) - gs->count);
112 memcpy(gs->bytes + gs->count, s, ncopy);
113 ocount = gs->count;
114 gs->count += ncopy;
115 s = (char *)gs->bytes;
116 n = gs->count;
117
88 if ((len = _GB2312_check(s, n)) < 0)
89 return ((size_t)len);
90 wc = 0;
91 i = len;
92 while (i-- > 0)
93 wc = (wc << 8) | (unsigned char)*s++;
94 if (pwc != NULL)
95 *pwc = wc;
118 if ((len = _GB2312_check(s, n)) < 0)
119 return ((size_t)len);
120 wc = 0;
121 i = len;
122 while (i-- > 0)
123 wc = (wc << 8) | (unsigned char)*s++;
124 if (pwc != NULL)
125 *pwc = wc;
96 return (wc == L'\0' ? 0 : len);
126 gs->count = 0;
127 return (wc == L'\0' ? 0 : len - ocount);
97}
98
99size_t
100_GB2312_wcrtomb(char * __restrict s, wchar_t wc,
101 mbstate_t * __restrict ps __unused)
102{
103
104 if (s == NULL)
105 /* Reset to initial shift state (no-op) */
106 return (1);
107 if (wc & 0x8000) {
108 *s++ = (wc >> 8) & 0xff;
109 *s = wc & 0xff;
110 return (2);
111 }
112 *s = wc & 0xff;
113 return (1);
114}
128}
129
130size_t
131_GB2312_wcrtomb(char * __restrict s, wchar_t wc,
132 mbstate_t * __restrict ps __unused)
133{
134
135 if (s == NULL)
136 /* Reset to initial shift state (no-op) */
137 return (1);
138 if (wc & 0x8000) {
139 *s++ = (wc >> 8) & 0xff;
140 *s = wc & 0xff;
141 return (2);
142 }
143 *s = wc & 0xff;
144 return (1);
145}