src/lib/iconv/ja/Shift_JIS-2004_TO_Unicode.c
author Keiich Oono <keiichi.oono@oracle.com>
Tue, 24 Jan 2012 19:04:50 +0900
changeset 638 0ad4cbc016ca
parent 577 ad2d51813555
permissions -rw-r--r--
7128196 runaway string at src/lib/iconv/ja/Shift_JIS-2004_TO_UTF-8.c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     1
/*
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     2
 * CDDL HEADER START
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     3
 *
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").  
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     7
 *
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     8
 * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    11
 * and limitations under the License.
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    12
 *
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    14
 * file and include the License file at src/OPENSOLARIS.LICENSE.
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    18
 *
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    19
 * CDDL HEADER END
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    20
 */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    21
/*
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
    22
 * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    23
 */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    24
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    25
#include <stdlib.h>
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    26
#include <errno.h>
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    27
#include <euc.h>
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    28
#include "japanese.h"
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
    29
#include "jfp_iconv_common.h"
537
2d3547b4425e revert jfp_iconv_unicode.h to avoid errors in other Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 533
diff changeset
    30
#include "jfp_iconv_unicode_enhance.h"
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    31
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    32
#define	JFP_J2U_ICONV_X0213
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    33
#include "jfp_jis_to_ucs2.h"
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    34
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    35
typedef struct {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    36
	unsigned char	odd_row;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    37
	unsigned char	even_row;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    38
} sj1torow_t;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    39
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    40
static const sj1torow_t sj1torow_x0213_p1b1[] = {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    41
               /* 40-9e  9f-fc */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    42
     /* 0x81 */ {     1,     2 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    43
     /* 0x82 */ {     3,     4 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    44
     /* 0x83 */ {     5,     6 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    45
     /* 0x84 */ {     7,     8 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    46
     /* 0x85 */ {     9,    10 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    47
     /* 0x86 */ {    11,    12 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    48
     /* 0x87 */ {    13,    14 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    49
     /* 0x88 */ {    15,    16 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    50
     /* 0x89 */ {    17,    18 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    51
     /* 0x8a */ {    19,    20 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    52
     /* 0x8b */ {    21,    22 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    53
     /* 0x8c */ {    23,    24 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    54
     /* 0x8d */ {    25,    26 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    55
     /* 0x8e */ {    27,    28 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    56
     /* 0x8f */ {    29,    30 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    57
     /* 0x90 */ {    31,    32 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    58
     /* 0x91 */ {    33,    34 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    59
     /* 0x92 */ {    35,    36 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    60
     /* 0x93 */ {    37,    38 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    61
     /* 0x94 */ {    39,    40 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    62
     /* 0x95 */ {    41,    42 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    63
     /* 0x96 */ {    43,    44 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    64
     /* 0x97 */ {    45,    46 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    65
     /* 0x98 */ {    47,    48 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    66
     /* 0x99 */ {    49,    50 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    67
     /* 0x9a */ {    51,    52 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    68
     /* 0x9b */ {    53,    54 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    69
     /* 0x9c */ {    55,    56 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    70
     /* 0x9d */ {    57,    58 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    71
     /* 0x9e */ {    59,    60 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    72
     /* 0x9f */ {    61,    62 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    73
};
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    74
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    75
static const sj1torow_t sj1torow_x0213_p1b2[] = {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    76
               /* 40-9e  9f-fc */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    77
     /* 0xe0 */ {    63,    64 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    78
     /* 0xe1 */ {    65,    66 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    79
     /* 0xe2 */ {    67,    68 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    80
     /* 0xe3 */ {    69,    70 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    81
     /* 0xe4 */ {    71,    72 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    82
     /* 0xe5 */ {    73,    74 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    83
     /* 0xe6 */ {    75,    76 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    84
     /* 0xe7 */ {    77,    78 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    85
     /* 0xe8 */ {    79,    80 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    86
     /* 0xe9 */ {    81,    82 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    87
     /* 0xea */ {    83,    84 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    88
     /* 0xeb */ {    85,    86 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    89
     /* 0xec */ {    87,    88 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    90
     /* 0xed */ {    89,    90 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    91
     /* 0xee */ {    91,    92 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    92
     /* 0xef */ {    93,    94 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    93
};
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    94
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    95
static const sj1torow_t sj1torow_x0213_p2[] = {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    96
               /* 40-9e  9f-fc */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    97
     /* 0xf0 */ {     1,     8 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    98
     /* 0xf1 */ {     3,     4 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
    99
     /* 0xf2 */ {     5,    12 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   100
     /* 0xf3 */ {    13,    14 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   101
     /* 0xf4 */ {    15,    78 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   102
     /* 0xf5 */ {    79,    80 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   103
     /* 0xf6 */ {    81,    82 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   104
     /* 0xf7 */ {    83,    84 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   105
     /* 0xf8 */ {    85,    86 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   106
     /* 0xf9 */ {    87,    88 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   107
     /* 0xfa */ {    89,    90 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   108
     /* 0xfb */ {    91,    92 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   109
     /* 0xfc */ {    93,    94 },
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   110
};
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   111
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   112
static unsigned short sjtoe16_x0213(unsigned char c1, unsigned char c2)
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   113
{
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   114
	const sj1torow_t	*p;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   115
	unsigned short		e16;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   116
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   117
	/* range check (if valid or not) for c1 and c2 has been done
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   118
	   by the caller side */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   119
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   120
	if ((c1 >= 0x81) && (c1 <= 0x9f)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   121
		p = &(sj1torow_x0213_p1b1[c1 - 0x81]);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   122
	} else if ((c1 >= 0xe0) && (c1 <= 0xef)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   123
		p = &(sj1torow_x0213_p1b2[c1 - 0xe0]);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   124
	} else {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   125
		p = &(sj1torow_x0213_p2[c1 - 0xf0]);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   126
	}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   127
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   128
	if (c2 >= 0x9f) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   129
		e16 = (p->even_row + 0xa0) << 8;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   130
		e16 |= (c2 - 0x9f + 0x21);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   131
		e16 |= (c1 <= 0xef) ? 0x0080 : 0x0000;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   132
	} else {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   133
		e16 = (p->odd_row + 0xa0) << 8;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   134
		e16 |= (c2 - 0x40 + 0x21);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   135
		if (c2 >= 0x80) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   136
			e16--;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   137
		}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   138
		e16 |= (c1 <= 0xef) ? 0x0080 : 0x0000;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   139
	}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   140
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   141
	return (e16);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   142
}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   143
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   144
iconv_t
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   145
_icv_open_attr(int flag, void *reserved)
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   146
{
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   147
	__icv_state_t *cd;
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   148
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   149
	if ((cd = __icv_open_attr(flag)) != (__icv_state_t *)-1) {
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   150
		_icv_reset_unicode((void *)cd);
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   151
	}
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   152
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   153
	return((iconv_t)cd);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   154
}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   155
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   156
size_t
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   157
_icv_iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   158
				char **outbuf, size_t *outbytesleft)
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   159
{
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   160
	__icv_state_t	*st;
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   161
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   162
	unsigned int	u32;		/* UTF-32 */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   163
	unsigned short	e16;		/* 16-bit EUC */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   164
	unsigned int	index;		/* index for table lookup */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   165
	unsigned char	ic1, ic2;	/* 1st and 2nd bytes of a char */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   166
	size_t		rv = (size_t)0;	/* return value of this function */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   167
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   168
	unsigned char	*ip;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   169
	size_t		ileft;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   170
	char		*op;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   171
	size_t		oleft;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   172
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   173
	st = (__icv_state_t *)cd;
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   174
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   175
	/*
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   176
	 * If inbuf and/or *inbuf are NULL, reset conversion descriptor
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   177
	 * and put escape sequence if needed.
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   178
	 */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   179
	if ((inbuf == NULL) || (*inbuf == NULL)) {
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   180
		_icv_reset_unicode(st);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   181
		return ((size_t)0);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   182
	}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   183
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   184
	ip = (unsigned char *)*inbuf;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   185
	ileft = *inbytesleft;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   186
	op = *outbuf;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   187
	oleft = *outbytesleft;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   188
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   189
	while (ileft != 0) {
576
5c812dd7e2d8 7049019 iconvstr(3C), conversion is aborted by EINVAL even when ICONV_REPLACE_INVALID is specified
Keiich Oono <keiichi.oono@oracle.com>
parents: 555
diff changeset
   190
		NGETR(ic1, "never fail here"); /* get 1st byte */
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   191
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   192
		if (ISASC((int)ic1)) {	/* ASCII; 1 byte */
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   193
			RESTORE_HEX_ASCII_JUMP(ic1)
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   194
			u32 = _jfp_tbl_jisx0201roman_to_ucs2[ic1];
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   195
			PUTU(u32, "ASCII", 1);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   196
		} else if (ISSJKANA(ic1)) { /* JIS X 0201 Kana; 1 byte */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   197
			u32 = _jfp_tbl_jisx0201kana_to_ucs2[ic1 - 0xa1];
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   198
			PUTU(u32, "KANA", 1);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   199
		} else if (((ic1 >= 0x81) && (ic1 <= 0x9f)) ||
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   200
				((ic1 >= 0xe0) && (ic1 <= 0xef))) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   201
			/* JIS X 0213 plane 1 */
576
5c812dd7e2d8 7049019 iconvstr(3C), conversion is aborted by EINVAL even when ICONV_REPLACE_INVALID is specified
Keiich Oono <keiichi.oono@oracle.com>
parents: 555
diff changeset
   202
			NGETR(ic2, "PLANE1-2");
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   203
			if (ISSJKANJI2(ic2)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   204
				e16 = sjtoe16_x0213(ic1, ic2);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   205
				u32 = (unsigned int)_jfp_tbl_jisx0208_to_ucs2[
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   206
					((e16 >> 8) - 0xa1) * 94
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   207
					+ ((e16 & 0xff) - 0xa1)];
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   208
				if (IFHISUR(u32)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   209
					u32 = _jfp_lookup_x0213_nonbmp(
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   210
						e16, u32);
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   211
					PUTU(u32, "PLANE1->NONBMP", 2);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   212
				} else if (u32 == 0xffff) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   213
					/* need to compose */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   214
					unsigned int	u32_2;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   215
					u32 = _jfp_lookup_x0213_compose(
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   216
						e16, &u32_2);
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   217
					PUTU(u32, "PLANE1->CP1", 2);
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   218
					PUTU(u32_2, "PLANE1->CP2", 2);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   219
				} else {
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   220
					PUTU(u32, "PLANE1->BMP", 2);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   221
				}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   222
			} else { /* 2nd byte check failed */
638
0ad4cbc016ca 7128196 runaway string at src/lib/iconv/ja/Shift_JIS-2004_TO_UTF-8.c
Keiich Oono <keiichi.oono@oracle.com>
parents: 577
diff changeset
   223
				RET_EILSEQ("PLANE1-2", 2)
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   224
				/* NOTREACHED */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   225
			}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   226
		} else if ((ic1 >= 0xf0) && (ic1 <= 0xfc)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   227
			/* JIS X 0213 plane 2 */
576
5c812dd7e2d8 7049019 iconvstr(3C), conversion is aborted by EINVAL even when ICONV_REPLACE_INVALID is specified
Keiich Oono <keiichi.oono@oracle.com>
parents: 555
diff changeset
   228
			NGETR(ic2, "PLANE2-2");
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   229
			if (ISSJKANJI2(ic2)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   230
				e16 = sjtoe16_x0213(ic1, ic2);
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   231
				u32 = (unsigned int)_jfp_tbl_jisx0213p2_to_ucs2[
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   232
					((e16 >> 8) - 0xa1) * 94
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   233
					+ ((e16 & 0xff) - 0x21)];
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   234
				if (IFHISUR(u32)) {
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   235
					u32 = _jfp_lookup_x0213_nonbmp(
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   236
					e16, u32);
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   237
					PUTU(u32, "PLANE2->NONBMP", 2);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   238
				} else {
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   239
					PUTU(u32, "PLANE2->BMP", 2);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   240
				}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   241
			} else {
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   242
				RET_EILSEQ("PLANE2-2", 2)
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   243
				/* NOTREACHED */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   244
			}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   245
		} else { /* 1st byte check failed */
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   246
			RET_EILSEQ("EILSEQ at 1st", 1)
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   247
		}
555
44157ba3637e 7038037 wchar_t support in Solaris iconv Japanese conversion modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 537
diff changeset
   248
next:
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   249
		/*
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   250
		 * One character successfully converted so update
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   251
		 * values outside of this function's stack.
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   252
		 */
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   253
		*inbuf = (char *)ip;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   254
		*inbytesleft = ileft;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   255
		*outbuf = op;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   256
		*outbytesleft = oleft;
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   257
	}
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   258
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   259
ret:
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   260
	DEBUGPRINTERROR
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   261
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   262
	/*
577
ad2d51813555 5064465 UTF-8%PCK.so seems not returning the number of non-identical conversions
Keiich Oono <keiichi.oono@oracle.com>
parents: 576
diff changeset
   263
	 * When successfully converted, return number of non-identical
ad2d51813555 5064465 UTF-8%PCK.so seems not returning the number of non-identical conversions
Keiich Oono <keiichi.oono@oracle.com>
parents: 576
diff changeset
   264
	 * conversion as described in iconv(3C) and iconvstr(3C)
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   265
	 */
577
ad2d51813555 5064465 UTF-8%PCK.so seems not returning the number of non-identical conversions
Keiich Oono <keiichi.oono@oracle.com>
parents: 576
diff changeset
   266
	return ((rv == (size_t)-1) ? rv : st->num_of_ni);
0
542988ea726d initial version of Nevada G11N repository
simford
parents:
diff changeset
   267
}
533
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   268
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   269
/* see jfp_iconv_common.h */
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   270
size_t __replace_hex(
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   271
	unsigned char	hex,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   272
	unsigned char	**pip,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   273
	char		**pop,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   274
	size_t		*poleft,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   275
	__icv_state_t	*cd,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   276
	int		caller)
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   277
{
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   278
	return (__replace_hex_utf32(hex, pip, pop, poleft, cd, caller));
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   279
}
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   280
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   281
/* see jfp_iconv_common.h */
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   282
size_t __replace_invalid(
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   283
	unsigned char	**pip,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   284
	char		**pop,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   285
	size_t		*poleft,
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   286
	__icv_state_t	*cd)
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   287
{
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   288
	return (__replace_invalid_utf32(pip, pop, poleft, cd));
3779c7a68e0e 7038034, Solaris iconv enhancement PSARC/2010/160 for Japanese modules
Keiich Oono <keiichi.oono@oracle.com>
parents: 0
diff changeset
   289
}