xref: /freebsd/lib/libc/locale/mskanji.c (revision 16f76e6f060e6498b8307a117d33184bea1f4ab5)
116f76e6fSJulian Elischer /*
216f76e6fSJulian Elischer  *    ja_JP.SJIS locale table for BSD4.4/rune
316f76e6fSJulian Elischer  *    version 1.0
416f76e6fSJulian Elischer  *    (C) Sin'ichiro MIYATANI / Phase One, Inc
516f76e6fSJulian Elischer  *    May 12, 1995
616f76e6fSJulian Elischer  *
716f76e6fSJulian Elischer  * Redistribution and use in source and binary forms, with or without
816f76e6fSJulian Elischer  * modification, are permitted provided that the following conditions
916f76e6fSJulian Elischer  * are met:
1016f76e6fSJulian Elischer  * 1. Redistributions of source code must retain the above copyright
1116f76e6fSJulian Elischer  *    notice, this list of conditions and the following disclaimer.
1216f76e6fSJulian Elischer  * 2. Redistributions in binary form must reproduce the above copyright
1316f76e6fSJulian Elischer  *    notice, this list of conditions and the following disclaimer in the
1416f76e6fSJulian Elischer  *    documentation and/or other materials provided with the distribution.
1516f76e6fSJulian Elischer  * 3. All advertising materials mentioning features or use of this software
1616f76e6fSJulian Elischer  *    must display the following acknowledgement:
1716f76e6fSJulian Elischer  *      This product includes software developed by Phase One, Inc.
1816f76e6fSJulian Elischer  * 4. The name of Phase One, Inc. may be used to endorse or promote products
1916f76e6fSJulian Elischer  *    derived from this software without specific prior written permission.
2016f76e6fSJulian Elischer  *
2116f76e6fSJulian Elischer  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2216f76e6fSJulian Elischer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2316f76e6fSJulian Elischer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2416f76e6fSJulian Elischer  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2516f76e6fSJulian Elischer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2616f76e6fSJulian Elischer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2716f76e6fSJulian Elischer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2816f76e6fSJulian Elischer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2916f76e6fSJulian Elischer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3016f76e6fSJulian Elischer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3116f76e6fSJulian Elischer  * SUCH DAMAGE.
3216f76e6fSJulian Elischer  */
3316f76e6fSJulian Elischer 
3416f76e6fSJulian Elischer #if defined(LIBC_SCCS) && !defined(lint)
3516f76e6fSJulian Elischer static char sccsid[] = "@(#)mskanji.c	1.0 (Phase One) 5/5/95";
3616f76e6fSJulian Elischer #endif /* LIBC_SCCS and not lint */
3716f76e6fSJulian Elischer 
3816f76e6fSJulian Elischer #include <sys/types.h>
3916f76e6fSJulian Elischer 
4016f76e6fSJulian Elischer #include <errno.h>
4116f76e6fSJulian Elischer #include <rune.h>
4216f76e6fSJulian Elischer #include <stddef.h>
4316f76e6fSJulian Elischer #include <stdio.h>
4416f76e6fSJulian Elischer #include <stdlib.h>
4516f76e6fSJulian Elischer 
4616f76e6fSJulian Elischer rune_t	_MSKanji_sgetrune __P((const char *, size_t, char const **));
4716f76e6fSJulian Elischer int	_MSKanji_sputrune __P((rune_t, char *, size_t, char **));
4816f76e6fSJulian Elischer 
4916f76e6fSJulian Elischer int
5016f76e6fSJulian Elischer _MSKanji_init(rl)
5116f76e6fSJulian Elischer 	_RuneLocale *rl;
5216f76e6fSJulian Elischer {
5316f76e6fSJulian Elischer 	rl->sgetrune = _MSKanji_sgetrune;
5416f76e6fSJulian Elischer 	rl->sputrune = _MSKanji_sputrune;
5516f76e6fSJulian Elischer 
5616f76e6fSJulian Elischer 	_CurrentRuneLocale = rl;
5716f76e6fSJulian Elischer 	__mb_cur_max = 2;
5816f76e6fSJulian Elischer 	return (0);
5916f76e6fSJulian Elischer }
6016f76e6fSJulian Elischer 
6116f76e6fSJulian Elischer rune_t
6216f76e6fSJulian Elischer _MSKanji_sgetrune(string, n, result)
6316f76e6fSJulian Elischer 	const char *string;
6416f76e6fSJulian Elischer 	size_t n;
6516f76e6fSJulian Elischer 	char const **result;
6616f76e6fSJulian Elischer {
6716f76e6fSJulian Elischer 	rune_t rune = 0;
6816f76e6fSJulian Elischer 
6916f76e6fSJulian Elischer 	if (n < 1 ) {
7016f76e6fSJulian Elischer 		rune = _INVALID_RUNE;
7116f76e6fSJulian Elischer 	} else {
7216f76e6fSJulian Elischer 		rune = *( string++ ) & 0xff;
7316f76e6fSJulian Elischer 		if ( ( rune > 0x80 && rune < 0xa0 )
7416f76e6fSJulian Elischer 		|| ( rune >= 0xe0 && rune < 0xfa ) ) {
7516f76e6fSJulian Elischer 			if ( n < 2 ) {
7616f76e6fSJulian Elischer 				rune = (rune_t)_INVALID_RUNE;
7716f76e6fSJulian Elischer 				--string;
7816f76e6fSJulian Elischer 			} else {
7916f76e6fSJulian Elischer 				rune = ( rune << 8 ) | ( *( string++ ) & 0xff );
8016f76e6fSJulian Elischer 			}
8116f76e6fSJulian Elischer 		}
8216f76e6fSJulian Elischer 	}
8316f76e6fSJulian Elischer 	if (result) *result = string;
8416f76e6fSJulian Elischer 	return rune;
8516f76e6fSJulian Elischer }
8616f76e6fSJulian Elischer 
8716f76e6fSJulian Elischer int
8816f76e6fSJulian Elischer _MSKanji_sputrune(c, string, n, result)
8916f76e6fSJulian Elischer 	rune_t c;
9016f76e6fSJulian Elischer 	char *string, **result;
9116f76e6fSJulian Elischer 	size_t n;
9216f76e6fSJulian Elischer {
9316f76e6fSJulian Elischer 	int	len, i;
9416f76e6fSJulian Elischer 
9516f76e6fSJulian Elischer 	len = ( c > 0x100 ) ? 2 : 1;
9616f76e6fSJulian Elischer 	if ( n < len ) {
9716f76e6fSJulian Elischer 		if ( result ) *result = (char *) 0;
9816f76e6fSJulian Elischer 	} else {
9916f76e6fSJulian Elischer 		if ( result ) *result = string + len;
10016f76e6fSJulian Elischer 		for ( i = len; i-- > 0; ) {
10116f76e6fSJulian Elischer 			*( string++ ) = c >> ( i << 3 );
10216f76e6fSJulian Elischer 		}
10316f76e6fSJulian Elischer 	}
10416f76e6fSJulian Elischer 	return len;
10516f76e6fSJulian Elischer }
106