]> git.saurik.com Git - apple/libc.git/blob - locale/mskanji-fbsd.c
Libc-583.tar.gz
[apple/libc.git] / locale / mskanji-fbsd.c
1 /*
2 * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved.
3 *
4 * ja_JP.SJIS locale table for BSD4.4/rune
5 * version 1.0
6 * (C) Sin'ichiro MIYATANI / Phase One, Inc
7 * May 12, 1995
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by Phase One, Inc.
20 * 4. The name of Phase One, Inc. may be used to endorse or promote products
21 * derived from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #if defined(LIBC_SCCS) && !defined(lint)
37 static char sccsid[] = "@(#)mskanji.c 1.0 (Phase One) 5/5/95";
38 #endif /* LIBC_SCCS and not lint */
39 #include <sys/cdefs.h>
40 __FBSDID("$FreeBSD: src/lib/libc/locale/mskanji.c,v 1.16 2004/05/14 15:40:47 tjr Exp $");
41
42 #include "xlocale_private.h"
43
44 #include <sys/param.h>
45 #include <errno.h>
46 #include <runetype.h>
47 #include <stdlib.h>
48 #include <string.h>
49 #include <wchar.h>
50 #include "mblocal.h"
51
52 __private_extern__ int _MSKanji_init(struct __xlocale_st_runelocale *);
53 static size_t _MSKanji_mbrtowc(wchar_t * __restrict, const char * __restrict, size_t,
54 mbstate_t * __restrict, locale_t);
55 static int _MSKanji_mbsinit(const mbstate_t *, locale_t);
56 static size_t _MSKanji_wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
57
58 typedef struct {
59 wchar_t ch;
60 } _MSKanjiState;
61
62 __private_extern__ int
63 _MSKanji_init(struct __xlocale_st_runelocale *xrl)
64 {
65
66 xrl->__mbrtowc = _MSKanji_mbrtowc;
67 xrl->__wcrtomb = _MSKanji_wcrtomb;
68 xrl->__mbsinit = _MSKanji_mbsinit;
69 xrl->__mb_cur_max = 2;
70 return (0);
71 }
72
73 static int
74 _MSKanji_mbsinit(const mbstate_t *ps, locale_t loc)
75 {
76
77 return (ps == NULL || ((const _MSKanjiState *)ps)->ch == 0);
78 }
79
80 static size_t
81 _MSKanji_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n,
82 mbstate_t * __restrict ps, locale_t loc)
83 {
84 _MSKanjiState *ms;
85 wchar_t wc;
86
87 ms = (_MSKanjiState *)ps;
88
89 if ((ms->ch & ~0xFF) != 0) {
90 /* Bad conversion state. */
91 errno = EINVAL;
92 return ((size_t)-1);
93 }
94
95 if (s == NULL) {
96 s = "";
97 n = 1;
98 pwc = NULL;
99 }
100
101 if (n == 0)
102 /* Incomplete multibyte sequence */
103 return ((size_t)-2);
104
105 if (ms->ch != 0) {
106 if (*s == '\0') {
107 errno = EILSEQ;
108 return ((size_t)-1);
109 }
110 wc = (ms->ch << 8) | (*s & 0xFF);
111 if (pwc != NULL)
112 *pwc = wc;
113 ms->ch = 0;
114 return (1);
115 }
116 wc = *s++ & 0xff;
117 if ((wc > 0x80 && wc < 0xa0) || (wc >= 0xe0 && wc < 0xfd)) {
118 if (n < 2) {
119 /* Incomplete multibyte sequence */
120 ms->ch = wc;
121 return ((size_t)-2);
122 }
123 if (*s == '\0') {
124 errno = EILSEQ;
125 return ((size_t)-1);
126 }
127 wc = (wc << 8) | (*s++ & 0xff);
128 if (pwc != NULL)
129 *pwc = wc;
130 return (2);
131 } else {
132 if (pwc != NULL)
133 *pwc = wc;
134 return (wc == L'\0' ? 0 : 1);
135 }
136 }
137
138 static size_t
139 _MSKanji_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps, locale_t loc)
140 {
141 _MSKanjiState *ms;
142 int len, i;
143
144 ms = (_MSKanjiState *)ps;
145
146 if (ms->ch != 0) {
147 errno = EINVAL;
148 return ((size_t)-1);
149 }
150
151 if (s == NULL)
152 /* Reset to initial shift state (no-op) */
153 return (1);
154 len = (wc > 0x100) ? 2 : 1;
155 for (i = len; i-- > 0; )
156 *s++ = wc >> (i << 3);
157 return (len);
158 }