15d9d0b528387242011cdcc6190c9e598cfe3a07yy/*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * CDDL HEADER START
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * The contents of this file are subject to the terms of the
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Common Development and Distribution License (the "License").
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * You may not use this file except in compliance with the License.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * or http://www.opensolaris.org/os/licensing.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * See the License for the specific language governing permissions
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * and limitations under the License.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * When distributing Covered Code, include this CDDL HEADER in each
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * If applicable, add the following below this CDDL HEADER, with the
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * fields enclosed by brackets "[]" replaced with your own identifying
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * information: Portions Copyright [yyyy] [name of copyright owner]
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * CDDL HEADER END
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy/*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Use is subject to license terms.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#pragma ident "%Z%%M% %I% %E% SMI"
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/types.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/param.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/sysmacros.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/systm.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/debug.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/kmem.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/sunddi.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/byteorder.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/errno.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/euc.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/modctl.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/kiconv.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/kiconv_ja.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/kiconv_ja_jis_to_unicode.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#include <sys/kiconv_ja_unicode_to_jis.h>
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy/*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * The following vector shows remaining bytes in a UTF-8 character.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Index will be the first byte of the character. This is defined in
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * u8_textprep.c.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yyextern const int8_t u8_number_of_bytes[];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy/*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * The following is a vector of bit-masks to get used bits in
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * the first byte of a UTF-8 character. Index is remaining bytes at above of
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * the character. This is defined in uconv.c.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yyextern const uchar_t u8_masks_tbl[];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy/*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * The following two vectors are to provide valid minimum and
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * maximum values for the 2'nd byte of a multibyte UTF-8 character for
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * better illegal sequence checking. The index value must be the value of
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * the first byte of the UTF-8 character. These are defined in u8_textprep.c.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yyextern const uint8_t u8_valid_min_2nd_byte[];
15d9d0b528387242011cdcc6190c9e598cfe3a07yyextern const uint8_t u8_valid_max_2nd_byte[];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic kiconv_ja_euc16_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconv_ja_ucs2_to_euc16(kiconv_ja_ucs2_t ucs2)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy const kiconv_ja_euc16_t *p;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((p = kiconv_ja_ucs2_to_euc16_index[ucs2 >> 8]) != NULL)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (p[ucs2 & 0xff]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (KICONV_JA_NODEST);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yyutf8_ucs(uint_t *p, uchar_t **pip, size_t *pileft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t l; /* to be copied to *p on successful return */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic; /* current byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic1; /* 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip = *pip; /* next byte to read */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft = *pileft; /* number of bytes available */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value of this function */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int remaining_bytes;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int u8_size;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic1); /* read 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic1 < 0x80) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* successfully converted */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *p = (uint_t)ic1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto ret;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u8_size = u8_number_of_bytes[ic1];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u8_size == U8_ILLEGAL_CHAR) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (u8_size == U8_OUT_OF_RANGE_CHAR) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(ERANGE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy remaining_bytes = u8_size - 1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (remaining_bytes != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = ic1 & u8_masks_tbl[remaining_bytes];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy for (; remaining_bytes > 0; remaining_bytes--) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic1 != 0U) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((ic < u8_valid_min_2nd_byte[ic1]) ||
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (ic > u8_valid_max_2nd_byte[ic1])) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 = 0U; /* 2nd byte check done */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((ic < 0x80) || (ic > 0xbf)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = (l << 6) | (ic & 0x3f);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* successfully converted */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *p = l;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (rv == 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Update rv, *pip, and *pileft on successfule return.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv = *pileft - ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *pip = ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *pileft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yyutf8_ucs_replace(uint_t *p, uchar_t **pip, size_t *pileft, size_t *repnum)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t l; /* to be copied to *p on successful return */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic; /* current byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic1; /* 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip = *pip; /* next byte to read */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft = *pileft; /* number of bytes available */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value of this function */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int remaining_bytes;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int u8_size;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_TO_MB(ic1); /* read 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic1 < 0x80) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* successfully converted */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = (uint_t)ic1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto ret;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u8_size = u8_number_of_bytes[ic1];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u8_size == U8_ILLEGAL_CHAR || u8_size == U8_OUT_OF_RANGE_CHAR) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = KICONV_JA_DEF_SINGLE;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (*repnum)++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto ret;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy remaining_bytes = u8_size - 1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (remaining_bytes != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = ic1 & u8_masks_tbl[remaining_bytes];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy for (; remaining_bytes > 0; remaining_bytes--) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_TO_MB(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic1 != 0U) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((ic < u8_valid_min_2nd_byte[ic1]) ||
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (ic > u8_valid_max_2nd_byte[ic1])) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = KICONV_JA_DEF_SINGLE;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (*repnum)++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft -= (remaining_bytes - 1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip += (remaining_bytes - 1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 = 0U; /* 2nd byte check done */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((ic < 0x80) || (ic > 0xbf)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = KICONV_JA_DEF_SINGLE;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (*repnum)++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft -= (remaining_bytes - 1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip += (remaining_bytes - 1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = (l << 6) | (ic & 0x3f);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy l = KICONV_JA_DEF_SINGLE;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (*repnum)++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* successfully converted */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *p = l;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv = *pileft - ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *pip = ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *pileft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t /* return #bytes read, or -1 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yyread_unicode(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t *p, /* point variable to store UTF-32 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t **pip, /* point pointer to input buf */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *pileft, /* point #bytes left in input buf */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int *errno, /* point variable to errno */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int flag, /* kiconvstr flag */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *rv) /* point return valuse */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (utf8_ucs_replace(p, pip, pileft, rv));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy else
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (utf8_ucs(p, pip, pileft, errno));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yywrite_unicode(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t u32, /* UTF-32 to write */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **pop, /* point pointer to output buf */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *poleft, /* point #bytes left in output buf */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int *errno) /* point variable to errno */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op = *pop;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft = *poleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 <= 0x7f) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)(u32));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv = 1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (u32 <= 0x7ff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)((((u32)>>6) & 0x1f) | 0xc0));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)(((u32) & 0x3f) | 0x80));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv = 2;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if ((u32 >= 0xd800) && (u32 <= 0xdfff)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (u32 <= 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)((((u32)>>12) & 0x0f) | 0xe0));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)((((u32)>>6) & 0x3f) | 0x80));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)(((u32) & 0x3f) | 0x80));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv = 3;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (u32 <= 0x10ffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)((((u32)>>18) & 0x07) | 0xf0));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)((((u32)>>12) & 0x3f) | 0x80));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)((((u32)>>6) & 0x3f) | 0x80));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT((uchar_t)(((u32) & 0x3f) | 0x80));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv = 4;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (rv != (size_t)-1) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* update *pop and *poleft only on successful return */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *pop = op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *poleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic void *
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_kiconv_ja_open_unicode(uint8_t id)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_state_t kcd;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kcd = (kiconv_state_t)kmem_alloc(sizeof (kiconv_state_data_t),
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KM_SLEEP);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kcd->id = id;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kcd->bom_processed = 0;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return ((void *)kcd);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic void *
15d9d0b528387242011cdcc6190c9e598cfe3a07yyopen_eucjp(void)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_kiconv_ja_open_unicode(KICONV_JA_TBLID_EUCJP));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic void *
15d9d0b528387242011cdcc6190c9e598cfe3a07yyopen_eucjpms(void)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_kiconv_ja_open_unicode(KICONV_JA_TBLID_EUCJP_MS));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic void *
15d9d0b528387242011cdcc6190c9e598cfe3a07yyopen_sjis(void)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_kiconv_ja_open_unicode(KICONV_JA_TBLID_SJIS));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic void *
15d9d0b528387242011cdcc6190c9e598cfe3a07yyopen_cp932(void)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_kiconv_ja_open_unicode(KICONV_JA_TBLID_CP932));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyint
15d9d0b528387242011cdcc6190c9e598cfe3a07yyclose_ja(void *kcd)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (! kcd || kcd == (void *)-1)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (EBADF);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kmem_free(kcd, sizeof (kiconv_state_data_t));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconv_fr_eucjp(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t u32; /* UTF-32 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t index; /* index for table lookup */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic1, ic2, ic3; /* 1st, 2nd, and 3rd bytes of a char */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value of this function */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t id = ((kiconv_state_t)kcd)->id;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)*inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = *outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic1); /* get 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISASC(ic1)) { /* ASCII; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0201roman_to_ucs2[ic1];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISCS1(ic1)) { /* 0208 or UDC; 2 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS1(ic2)) { /* 2nd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JISMS_TO_U2(id, u32, ic1, ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (ic1 - 0x21) * 94 + ic2 - 0x21;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0208_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (ic1 == SS2) { /* JIS X 0201 Kana; 2 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS2(ic2)) { /* 2nd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (ic2 - 0xa1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0201kana_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (ic1 == SS3) { /* JIS X 0212 or UDC; 3 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS3(ic2)) { /* 2nd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS3(ic3)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* 3rd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic3 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JIS0212MS_TO_U2(id, u32,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2, ic3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = ((ic2 - 0x21) * 94 +
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (ic3 - 0x21));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0212_to_ucs2
15d9d0b528387242011cdcc6190c9e598cfe3a07yy [index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 3rd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISC1CTRLEUC(ic1)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* C1 control; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = ic1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 1st byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbuf = (char *)ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbuf = op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconv_to_eucjp(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t ucs4;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t read_len;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t id = ((kiconv_state_t)kcd)->id;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)*inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = *outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CHECK_UTF8_BOM(ip, ileft);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_GETU(&ucs4, 0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ucs4 > 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* non-BMP */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_U2_TO_EUCJPMS(id, euc16, ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy euc16 = kiconv_ja_ucs2_to_euc16((ushort_t)ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy switch (euc16 & 0x8080) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0000: /* CS0 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8080: /* CS1 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)((euc16 >> 8) & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)(euc16 & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0080: /* CS2 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(SS2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8000: /* CS3 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(SS3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)((euc16 >> 8) & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)(euc16 & KICONV_JA_CMASK);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic | KICONV_JA_CMSB);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yynext:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbuf = (char *)ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbuf = op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconvstr_fr_eucjp(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno, uint8_t id)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t u32; /* UTF-32 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t index; /* index for table lookup */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic1, ic2, ic3; /* 1st, 2nd, and 3rd bytes of a char */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value of this function */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy boolean_t do_not_ignore_null;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy do_not_ignore_null = ((flag & KICONV_IGNORE_NULL) == 0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic1); /* get 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISASC(ic1)) { /* ASCII; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic1 == '\0' && do_not_ignore_null) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0201roman_to_ucs2[ic1];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISCS1(ic1)) { /* 0208 or UDC; 2 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS1(ic2)) { /* 2nd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JISMS_TO_U2(id, u32, ic1, ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (ic1 - 0x21) * 94 + ic2 - 0x21;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0208_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (ic1 == SS2) { /* JIS X 0201 Kana; 2bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS2(ic2)) { /* 2nd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (ic2 - 0xa1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0201kana_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (ic1 == SS3) { /* JIS X 0212 or UDC; 3 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS3(ic2)) { /* 2nd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISCS3(ic3)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* 3rd byte check passed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic3 &= KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JIS0212MS_TO_U2(id, u32,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2, ic3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = ((ic2 - 0x21) * 94 +
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (ic3 - 0x21));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = kiconv_ja_jisx0212_to_ucs2
15d9d0b528387242011cdcc6190c9e598cfe3a07yy [index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (u32 == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 3rd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISC1CTRLEUC(ic1)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* C1 control; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy u32 = ic1;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(u32);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 1st byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yynext:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconvstr_to_eucjp(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno, uint8_t id)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t ucs4;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t read_len;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy boolean_t do_not_ignore_null;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CHECK_UTF8_BOM_WITHOUT_STATE(ip, ileft);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy do_not_ignore_null = ((flag & KICONV_IGNORE_NULL) == 0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_GETU(&ucs4, flag);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ucs4 == 0x0 && do_not_ignore_null) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ucs4 > 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* non-BMP */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_U2_TO_EUCJPMS(id, euc16, ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy euc16 = kiconv_ja_ucs2_to_euc16((ushort_t)ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy switch (euc16 & 0x8080) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0000: /* CS0 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8080: /* CS1 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)((euc16 >> 8) & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)(euc16 & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0080: /* CS2 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(SS2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8000: /* CS3 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(SS3);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)((euc16 >> 8) & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)(euc16 & KICONV_JA_CMASK);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic | KICONV_JA_CMSB);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yynext:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconv_fr_eucjp(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (! kcd || kcd == (void *)-1) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *errno = EBADF;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return ((size_t)-1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconv_fr_eucjp(kcd, inbuf, inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbuf, outbytesleft, errno));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconv_to_eucjp(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (! kcd || kcd == (void *)-1) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *errno = EBADF;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return ((size_t)-1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconv_to_eucjp(kcd, inbuf, inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbuf, outbytesleft, errno));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_fr_eucjp(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_fr_eucjp(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_EUCJP));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_to_eucjp(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_to_eucjp(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_EUCJP));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_fr_eucjpms(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_fr_eucjp(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_EUCJP_MS));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_to_eucjpms(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_to_eucjp(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_EUCJP_MS));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconv_fr_sjis(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t uni; /* UTF-32 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t index; /* index for table lookup */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic1, ic2; /* 1st and 2nd bytes of a char */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value of this function */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t id = ((kiconv_state_t)kcd)->id;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)*inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = *outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic1); /* get 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISASC((int)ic1)) { /* ASCII; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0201roman_to_ucs2[ic1];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJKANA(ic1)) { /* 0201 Kana; 1byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0201kana_to_ucs2[(ic1 - 0xa1)];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJKANJI1(ic1)) { /* 0208/UDC; 2bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 = kiconv_ja_sjtojis1[(ic1 - 0x80)];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic2 >= 0x9f) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2 = kiconv_ja_sjtojis2[ic2];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JISMS_TO_U2(id, uni, ic1, ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = ((ic1 - 0x21) * 94)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (ic2 - 0x21);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0208_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* NOTREACHED */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJSUPKANJI1(ic1)) { /* VDC, 2 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 = kiconv_ja_sjtojis1[(ic1 - 0x80)];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic2 >= 0x9f) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = ((ic1 - 0x21) * 94)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (kiconv_ja_sjtojis2[ic2] - 0x21);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0212_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJIBM(ic1) || /* Extended IBM area */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_ISSJNECIBM(ic1)) { /* NEC/IBM area */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * We need a special treatment for each codes.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * By adding some offset number for them, we
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * can process them as the same way of that of
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * extended IBM chars.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t dest, upper, lower;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = (ic1 << 8) + ic2;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((0xed40 <= dest) && (dest <= 0xeffc)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_REMAP_NEC(dest);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * XXX: 0xfa54 and 0xfa5b must be mapped
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * to JIS0208 area. Therefore we
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * have to do special treatment.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((dest == 0xfa54) || (dest == 0xfa5b)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xfa54) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper = 0x22;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy lower = 0x4c;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper = 0x22;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy lower = 0x68;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JISMS_TO_U2(id, uni,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper, lower);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (uint_t)((upper - 0x21)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * 94 + (lower - 0x21));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0208_to_ucs2
15d9d0b528387242011cdcc6190c9e598cfe3a07yy [index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = dest - 0xfa40 -
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (((dest>>8) - 0xfa) * 0x40);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = kiconv_ja_sjtoibmext[dest];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper = (dest >> 8) & KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy lower = dest & KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JIS0212MS_TO_U2(id, uni,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper, lower);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (uint_t)((upper - 0x21)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * 94 + (lower - 0x21));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0212_to_ucs2
15d9d0b528387242011cdcc6190c9e598cfe3a07yy [index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if ((0xeb <= ic1) && (ic1 <= 0xec)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Based on the draft convention of OSF-JVC CDEWG,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * characters in this area will be mapped to
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * "CHIKAN-MOJI." (convertible character)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * We use U+FFFD in this case.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = 0xfffd;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 1st byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbuf = (char *)ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbuf = op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy/*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * _kiconv_ja_lookuptbl()
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Return the index number if its index-ed number
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * is the same as dest value.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic ushort_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_kiconv_ja_lookuptbl(ushort_t dest)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t tmp;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int i;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int sz = (sizeof (kiconv_ja_sjtoibmext) /
15d9d0b528387242011cdcc6190c9e598cfe3a07yy sizeof (kiconv_ja_sjtoibmext[0]));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy for (i = 0; i < sz; i++) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy tmp = (kiconv_ja_sjtoibmext[i] & 0x7f7f);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (tmp == dest)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return ((i + 0xfa40 + ((i / 0xc0) * 0x40)));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0x3f);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconv_to_sjis(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t ucs4;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t dest;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t read_len;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t id = ((kiconv_state_t)kcd)->id;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)*inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = *outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CHECK_UTF8_BOM(ip, ileft);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_GETU(&ucs4, 0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ucs4 > 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* non-BMP */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_U2_TO_EUCJPMS(id, euc16, ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy euc16 = kiconv_ja_ucs2_to_euc16((ushort_t)ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy switch (euc16 & 0x8080) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0000: /* CS0 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISC1CTRL((uchar_t)euc16)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8080: /* CS1 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (ushort_t)((euc16 >> 8) & KICONV_JA_CMASK);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jis208tosj1[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * for even number row (Ku), add 0x80 to
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * look latter half of kiconv_ja_jistosj2[] array
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)((euc16 & KICONV_JA_CMASK)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (((ic % 2) == 0) ? 0x80 : 0x00));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jistosj2[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0080: /* CS2 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8000: /* CS3 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (ushort_t)((euc16 >> 8) & KICONV_JA_CMASK);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == 0xa271) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* NUMERO SIGN */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(0x87);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(0x82);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (ic < 0x75) { /* check if IBM VDC */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = _kiconv_ja_lookuptbl(euc16 & 0x7f7f);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* avoid putting NUL ('\0') */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest > 0xff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (dest >> 8) & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(dest & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(dest & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jis212tosj1[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * for even number row (Ku), add 0x80 to
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * look latter half of kiconv_ja_jistosj2[]
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (ushort_t)((euc16 & KICONV_JA_CMASK)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (((ic % 2) == 0) ? 0x80 : 0x00));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jistosj2[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yynext:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbuf = (char *)ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbuf = op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconvstr_fr_sjis(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno, uint8_t id)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t uni; /* UTF-32 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t index; /* index for table lookup */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic1, ic2; /* 1st and 2nd bytes of a char */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0; /* return value of this function */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy boolean_t do_not_ignore_null;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy do_not_ignore_null = ((flag & KICONV_IGNORE_NULL) == 0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic1); /* get 1st byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISASC((int)ic1)) { /* ASCII; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic1 == '\0' && do_not_ignore_null) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0201roman_to_ucs2[ic1];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJKANA(ic1)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* JIS X 0201 Kana; 1 byte */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0201kana_to_ucs2[(ic1 - 0xa1)];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJKANJI1(ic1)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* JIS X 0208 or UDC; 2 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 = kiconv_ja_sjtojis1[(ic1 - 0x80)];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic2 >= 0x9f) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic2 = kiconv_ja_sjtojis2[ic2];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JISMS_TO_U2(id, uni, ic1, ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = ((ic1 - 0x21) * 94)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (ic2 - 0x21);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0208_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* NOTREACHED */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJSUPKANJI1(ic1)) { /* VDC, 2 bytes */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1 = kiconv_ja_sjtojis1[(ic1 - 0x80)];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ic2 >= 0x9f) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic1++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = ((ic1 - 0x21) * 94)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (kiconv_ja_sjtojis2[ic2] - 0x21);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0212_to_ucs2[index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (KICONV_JA_ISSJIBM(ic1) || /* Extended IBM area */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_ISSJNECIBM(ic1)) { /* NEC/IBM area */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * We need a special treatment for each codes.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * By adding some offset number for them, we
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * can process them as the same way of that of
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * extended IBM chars.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t dest, upper, lower;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = (ic1 << 8) + ic2;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((0xed40 <= dest) && (dest <= 0xeffc)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_REMAP_NEC(dest);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag &
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * XXX: 0xfa54 and 0xfa5b must be mapped
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * to JIS0208 area. Therefore we
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * have to do special treatment.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((dest == 0xfa54) || (dest == 0xfa5b)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xfa54) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper = 0x22;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy lower = 0x4c;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper = 0x22;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy lower = 0x68;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JISMS_TO_U2(id, uni,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper, lower);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (uint_t)((upper - 0x21)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * 94 + (lower - 0x21));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0208_to_ucs2
15d9d0b528387242011cdcc6190c9e598cfe3a07yy [index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = dest - 0xfa40 -
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (((dest>>8) - 0xfa) * 0x40);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = kiconv_ja_sjtoibmext[dest];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag &
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper = (dest >> 8) & KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy lower = dest & KICONV_JA_CMASK;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_JIS0212MS_TO_U2(id, uni,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy upper, lower);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy index = (uint_t)((upper - 0x21)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * 94 + (lower - 0x21));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = kiconv_ja_jisx0212_to_ucs2
15d9d0b528387242011cdcc6190c9e598cfe3a07yy [index];
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (uni == KICONV_JA_REPLACE)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if ((0xeb <= ic1) && (ic1 <= 0xec)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Based on the draft convention of OSF-JVC CDEWG,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * characters in this area will be mapped to
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * "CHIKAN-MOJI." (convertible character)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * We use U+FFFD in this case.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET_REP_FR_MB(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NGET(ic2);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISSJKANJI2(ic2)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uni = 0xfffd;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(uni);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 2nd byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else { /* 1st byte check failed */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (flag & KICONV_REPLACE_INVALID) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_PUTU(KICONV_JA_REPLACE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_RETERROR(EILSEQ)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yynext:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_do_kiconvstr_to_sjis(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno, uint8_t id)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t ic;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t rv = 0;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uint_t ucs4;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ushort_t dest;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy uchar_t *ip;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char *op;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t read_len;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy boolean_t do_not_ignore_null;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if ((inbuf == NULL) || (*inbuf == NULL)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ip = (uchar_t *)inbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ileft = *inbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy op = outbuf;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy oleft = *outbytesleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CHECK_UTF8_BOM_WITHOUT_STATE(ip, ileft);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy do_not_ignore_null = ((flag & KICONV_IGNORE_NULL) == 0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy while (ileft != 0) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_GETU(&ucs4, flag);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ucs4 == 0x0 && do_not_ignore_null) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (0);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (ucs4 > 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* non-BMP */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_CNV_U2_TO_EUCJPMS(id, euc16, ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy euc16 = kiconv_ja_ucs2_to_euc16((ushort_t)ucs4);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == KICONV_JA_NODEST) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy goto next;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy switch (euc16 & 0x8080) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0000: /* CS0 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (KICONV_JA_ISC1CTRL((uchar_t)euc16)) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy rv++;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8080: /* CS1 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (ushort_t)((euc16 >> 8) & KICONV_JA_CMASK);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jis208tosj1[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * for even number row (Ku), add 0x80 to
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * look latter half of kiconv_ja_jistosj2[] array
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)((euc16 & KICONV_JA_CMASK)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (((ic % 2) == 0) ? 0x80 : 0x00));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jistosj2[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x0080: /* CS2 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (uchar_t)euc16;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(ic);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy case 0x8000: /* CS3 */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (ushort_t)((euc16 >> 8) & KICONV_JA_CMASK);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (euc16 == 0xa271) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* NUMERO SIGN */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(0x87);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(0x82);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else if (ic < 0x75) { /* check if IBM VDC */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy dest = _kiconv_ja_lookuptbl(euc16 & 0x7f7f);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest == 0xffff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(KICONV_JA_DEF_SINGLE);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /* avoid putting NUL ('\0') */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (dest > 0xff) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (dest >> 8) & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(dest & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(dest & 0xff);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy } else {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jis212tosj1[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * for even number row (Ku), add 0x80 to
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * look latter half of kiconv_ja_jistosj2[]
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy ic = (ushort_t)((euc16 & KICONV_JA_CMASK)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy + (((ic % 2) == 0) ? 0x80 : 0x00));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_NPUT(kiconv_ja_jistosj2[ic]);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy break;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yynext:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * One character successfully converted so update
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * values outside of this function's stack.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *inbytesleft = ileft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *outbytesleft = oleft;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyret:
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (rv);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconv_fr_sjis(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (! kcd || kcd == (void *)-1) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *errno = EBADF;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return ((size_t)-1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconv_fr_sjis(kcd, inbuf, inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbuf, outbytesleft, errno));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconv_to_sjis(void *kcd, char **inbuf, size_t *inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy char **outbuf, size_t *outbytesleft, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (! kcd || kcd == (void *)-1) {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *errno = EBADF;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return ((size_t)-1);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconv_to_sjis(kcd, inbuf, inbytesleft,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbuf, outbytesleft, errno));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_fr_sjis(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_fr_sjis(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_SJIS));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_to_sjis(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_to_sjis(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_SJIS));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_fr_cp932(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_fr_sjis(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_CP932));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic size_t
15d9d0b528387242011cdcc6190c9e598cfe3a07yykiconvstr_to_cp932(char *inbuf, size_t *inbytesleft, char *outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy size_t *outbytesleft, int flag, int *errno)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (_do_kiconvstr_to_sjis(inbuf, inbytesleft, outbuf,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy outbytesleft, flag, errno, KICONV_JA_TBLID_CP932));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic kiconv_ops_t kiconv_ja_ops_tbl[] = {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "eucjp", "utf-8", open_eucjp,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_to_eucjp, close_ja, kiconvstr_to_eucjp
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "utf-8", "eucjp", open_eucjp,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_fr_eucjp, close_ja, kiconvstr_fr_eucjp
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "eucjpms", "utf-8", open_eucjpms,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_to_eucjp, close_ja, kiconvstr_to_eucjpms
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "utf-8", "eucjpms", open_eucjpms,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_fr_eucjp, close_ja, kiconvstr_fr_eucjpms
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "sjis", "utf-8", open_sjis,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_to_sjis, close_ja, kiconvstr_to_sjis
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "utf-8", "sjis", open_sjis,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_fr_sjis, close_ja, kiconvstr_fr_sjis
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "cp932", "utf-8", open_cp932,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_to_sjis, close_ja, kiconvstr_to_cp932
15d9d0b528387242011cdcc6190c9e598cfe3a07yy },
15d9d0b528387242011cdcc6190c9e598cfe3a07yy {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "utf-8", "cp932", open_cp932,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_fr_sjis, close_ja, kiconvstr_fr_cp932
15d9d0b528387242011cdcc6190c9e598cfe3a07yy }
15d9d0b528387242011cdcc6190c9e598cfe3a07yy};
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic char *kiconv_ja_aliases[] = {"932", "shiftjis", "pck"};
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic char *kiconv_ja_canonicals[] = {"cp932", "sjis", "sjis"};
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#define KICONV_JA_MAX_JA_OPS \
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (sizeof (kiconv_ja_ops_tbl) / sizeof (kiconv_ops_t))
15d9d0b528387242011cdcc6190c9e598cfe3a07yy#define KICONV_JA_MAX_JA_ALIAS \
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (sizeof (kiconv_ja_aliases) / sizeof (char *))
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic kiconv_module_info_t kiconv_ja_info = {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "kiconv_ja", /* module name */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_MAX_JA_OPS, /* number of conversion in kiconv_ja */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_ja_ops_tbl, /* kiconv_ja ops table */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy KICONV_JA_MAX_JA_ALIAS, /* number of alias in kiconv_ja */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_ja_aliases, /* kiconv_ja aliases */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy kiconv_ja_canonicals, /* kiconv_ja canonicals */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy 0
15d9d0b528387242011cdcc6190c9e598cfe3a07yy};
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic struct modlkiconv modlkiconv_ja = {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy &mod_kiconvops,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy "kiconv module for Japanese",
15d9d0b528387242011cdcc6190c9e598cfe3a07yy &kiconv_ja_info
15d9d0b528387242011cdcc6190c9e598cfe3a07yy};
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yystatic struct modlinkage modlinkage = {
15d9d0b528387242011cdcc6190c9e598cfe3a07yy MODREV_1,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy (void *)&modlkiconv_ja,
15d9d0b528387242011cdcc6190c9e598cfe3a07yy NULL
15d9d0b528387242011cdcc6190c9e598cfe3a07yy};
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyint
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_init(void)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int err;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy err = mod_install(&modlinkage);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (err)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy cmn_err(CE_WARN, "kiconv_ja: failed to load kernel module");
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (err);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyint
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_info(struct modinfo *modinfop)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (mod_info(&modlinkage, modinfop));
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yyint
15d9d0b528387242011cdcc6190c9e598cfe3a07yy_fini(void)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy{
15d9d0b528387242011cdcc6190c9e598cfe3a07yy int err;
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy /*
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * If this module is being used, then, we cannot remove the module.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * The following checking will catch pretty much all usual cases.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy *
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * Any remaining will be catached by the kiconv_unregister_module()
15d9d0b528387242011cdcc6190c9e598cfe3a07yy * during mod_remove() at below.
15d9d0b528387242011cdcc6190c9e598cfe3a07yy */
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (kiconv_module_ref_count(KICONV_MODULE_ID_JA))
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (EBUSY);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy err = mod_remove(&modlinkage);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy if (err)
15d9d0b528387242011cdcc6190c9e598cfe3a07yy cmn_err(CE_WARN, "kiconv_ja: failed to remove kernel module");
15d9d0b528387242011cdcc6190c9e598cfe3a07yy
15d9d0b528387242011cdcc6190c9e598cfe3a07yy return (err);
15d9d0b528387242011cdcc6190c9e598cfe3a07yy}