129818Sjulian/* 2128004Stjr * Copyright (c) 2002-2004 Tim J. Robbins. All rights reserved. 3128004Stjr * 429818Sjulian * ja_JP.SJIS locale table for BSD4.4/rune 529818Sjulian * version 1.0 629818Sjulian * (C) Sin'ichiro MIYATANI / Phase One, Inc 729818Sjulian * May 12, 1995 829818Sjulian * 9227753Stheraven * Copyright (c) 2011 The FreeBSD Foundation 10227753Stheraven * All rights reserved. 11227753Stheraven * Portions of this software were developed by David Chisnall 12227753Stheraven * under sponsorship from the FreeBSD Foundation. 13227753Stheraven * 1429818Sjulian * Redistribution and use in source and binary forms, with or without 1529818Sjulian * modification, are permitted provided that the following conditions 1629818Sjulian * are met: 1729818Sjulian * 1. Redistributions of source code must retain the above copyright 1829818Sjulian * notice, this list of conditions and the following disclaimer. 1929818Sjulian * 2. Redistributions in binary form must reproduce the above copyright 2029818Sjulian * notice, this list of conditions and the following disclaimer in the 2129818Sjulian * documentation and/or other materials provided with the distribution. 2229818Sjulian * 3. All advertising materials mentioning features or use of this software 2329818Sjulian * must display the following acknowledgement: 2429818Sjulian * This product includes software developed by Phase One, Inc. 2529818Sjulian * 4. The name of Phase One, Inc. may be used to endorse or promote products 2629818Sjulian * derived from this software without specific prior written permission. 2729818Sjulian * 2829818Sjulian * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2929818Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 3029818Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 3129818Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 3229818Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3329818Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3429818Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3529818Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3629818Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3729818Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3829818Sjulian * SUCH DAMAGE. 3929818Sjulian */ 4029818Sjulian 4129818Sjulian#if defined(LIBC_SCCS) && !defined(lint) 4229818Sjulianstatic char sccsid[] = "@(#)mskanji.c 1.0 (Phase One) 5/5/95"; 4329818Sjulian#endif /* LIBC_SCCS and not lint */ 44142654Sphantom#include <sys/cdefs.h> 4592986Sobrien__FBSDID("$FreeBSD$"); 4629818Sjulian 47142654Sphantom#include <sys/types.h> 48128155Stjr#include <errno.h> 49121893Stjr#include <runetype.h> 5029818Sjulian#include <stdlib.h> 51128004Stjr#include <string.h> 52121893Stjr#include <wchar.h> 53129153Stjr#include "mblocal.h" 5429818Sjulian 55172619Sacheextern int __mb_sb_limit; 56172619Sache 57142654Sphantomstatic size_t _MSKanji_mbrtowc(wchar_t * __restrict, const char * __restrict, 58142654Sphantom size_t, mbstate_t * __restrict); 59142654Sphantomstatic int _MSKanji_mbsinit(const mbstate_t *); 60142654Sphantomstatic size_t _MSKanji_wcrtomb(char * __restrict, wchar_t, 61142654Sphantom mbstate_t * __restrict); 62121893Stjr 63128004Stjrtypedef struct { 64129229Stjr wchar_t ch; 65128004Stjr} _MSKanjiState; 66128004Stjr 6729818Sjulianint 68227753Stheraven_MSKanji_init(struct xlocale_ctype *l, _RuneLocale *rl) 6929818Sjulian{ 7029818Sjulian 71227753Stheraven l->__mbrtowc = _MSKanji_mbrtowc; 72227753Stheraven l->__wcrtomb = _MSKanji_wcrtomb; 73227753Stheraven l->__mbsinit = _MSKanji_mbsinit; 74227753Stheraven l->runes = rl; 75227753Stheraven l->__mb_cur_max = 2; 76227753Stheraven l->__mb_sb_limit = 256; 7729818Sjulian return (0); 7829818Sjulian} 7929818Sjulian 80142654Sphantomstatic int 81128004Stjr_MSKanji_mbsinit(const mbstate_t *ps) 82128004Stjr{ 83128004Stjr 84129229Stjr return (ps == NULL || ((const _MSKanjiState *)ps)->ch == 0); 85128004Stjr} 86128004Stjr 87142654Sphantomstatic size_t 88121893Stjr_MSKanji_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n, 89128004Stjr mbstate_t * __restrict ps) 9029818Sjulian{ 91128004Stjr _MSKanjiState *ms; 92121893Stjr wchar_t wc; 9329818Sjulian 94128004Stjr ms = (_MSKanjiState *)ps; 95128004Stjr 96129229Stjr if ((ms->ch & ~0xFF) != 0) { 97129229Stjr /* Bad conversion state. */ 98128155Stjr errno = EINVAL; 99128155Stjr return ((size_t)-1); 100128155Stjr } 101128155Stjr 102128004Stjr if (s == NULL) { 103128004Stjr s = ""; 104128004Stjr n = 1; 105128004Stjr pwc = NULL; 106128004Stjr } 107128004Stjr 108121893Stjr if (n == 0) 109121893Stjr /* Incomplete multibyte sequence */ 110121893Stjr return ((size_t)-2); 111129229Stjr 112129229Stjr if (ms->ch != 0) { 113129229Stjr if (*s == '\0') { 114129229Stjr errno = EILSEQ; 115129229Stjr return ((size_t)-1); 116129229Stjr } 117129229Stjr wc = (ms->ch << 8) | (*s & 0xFF); 118129229Stjr if (pwc != NULL) 119129229Stjr *pwc = wc; 120129229Stjr ms->ch = 0; 121129229Stjr return (1); 122129229Stjr } 123121893Stjr wc = *s++ & 0xff; 124121893Stjr if ((wc > 0x80 && wc < 0xa0) || (wc >= 0xe0 && wc < 0xfd)) { 125129229Stjr if (n < 2) { 126121893Stjr /* Incomplete multibyte sequence */ 127129229Stjr ms->ch = wc; 128121893Stjr return ((size_t)-2); 129129229Stjr } 130129117Stjr if (*s == '\0') { 131129117Stjr errno = EILSEQ; 132129117Stjr return ((size_t)-1); 133129117Stjr } 134121893Stjr wc = (wc << 8) | (*s++ & 0xff); 135129229Stjr if (pwc != NULL) 136129229Stjr *pwc = wc; 137129229Stjr return (2); 138129229Stjr } else { 139129229Stjr if (pwc != NULL) 140129229Stjr *pwc = wc; 141129229Stjr return (wc == L'\0' ? 0 : 1); 14229818Sjulian } 14329818Sjulian} 14429818Sjulian 145142654Sphantomstatic size_t 146128155Stjr_MSKanji_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps) 14729818Sjulian{ 148128155Stjr _MSKanjiState *ms; 149105074Stjr int len, i; 15029818Sjulian 151128155Stjr ms = (_MSKanjiState *)ps; 152128155Stjr 153129229Stjr if (ms->ch != 0) { 154128155Stjr errno = EINVAL; 155128155Stjr return ((size_t)-1); 156128155Stjr } 157128155Stjr 158121893Stjr if (s == NULL) 159121893Stjr /* Reset to initial shift state (no-op) */ 160121893Stjr return (1); 161121893Stjr len = (wc > 0x100) ? 2 : 1; 162121893Stjr for (i = len; i-- > 0; ) 163121893Stjr *s++ = wc >> (i << 3); 164105074Stjr return (len); 16529818Sjulian} 166