xref: /illumos-gate/usr/src/lib/iconv_modules/ja/common/UTF-8-ms932_TO_UTF-8.c (revision 16d8656330ae5622ec32e5007f62145ebafdc50f)
1*16d86563SAlexander Pyhalov /*
2*16d86563SAlexander Pyhalov  * CDDL HEADER START
3*16d86563SAlexander Pyhalov  *
4*16d86563SAlexander Pyhalov  * The contents of this file are subject to the terms of the
5*16d86563SAlexander Pyhalov  * Common Development and Distribution License (the "License").
6*16d86563SAlexander Pyhalov  * You may not use this file except in compliance with the License.
7*16d86563SAlexander Pyhalov  *
8*16d86563SAlexander Pyhalov  * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE
9*16d86563SAlexander Pyhalov  * or http://www.opensolaris.org/os/licensing.
10*16d86563SAlexander Pyhalov  * See the License for the specific language governing permissions
11*16d86563SAlexander Pyhalov  * and limitations under the License.
12*16d86563SAlexander Pyhalov  *
13*16d86563SAlexander Pyhalov  * When distributing Covered Code, include this CDDL HEADER in each
14*16d86563SAlexander Pyhalov  * file and include the License file at src/OPENSOLARIS.LICENSE.
15*16d86563SAlexander Pyhalov  * If applicable, add the following below this CDDL HEADER, with the
16*16d86563SAlexander Pyhalov  * fields enclosed by brackets "[]" replaced with your own identifying
17*16d86563SAlexander Pyhalov  * information: Portions Copyright [yyyy] [name of copyright owner]
18*16d86563SAlexander Pyhalov  *
19*16d86563SAlexander Pyhalov  * CDDL HEADER END
20*16d86563SAlexander Pyhalov  */
21*16d86563SAlexander Pyhalov /*
22*16d86563SAlexander Pyhalov  * COPYRIGHT AND PERMISSION NOTICE
23*16d86563SAlexander Pyhalov  *
24*16d86563SAlexander Pyhalov  * Copyright (c) 1991-2005 Unicode, Inc. All rights reserved. Distributed
25*16d86563SAlexander Pyhalov  * under the Terms of Use in http://www.unicode.org/copyright.html.
26*16d86563SAlexander Pyhalov  *
27*16d86563SAlexander Pyhalov  * This file has been modified by Sun Microsystems, Inc.
28*16d86563SAlexander Pyhalov  */
29*16d86563SAlexander Pyhalov /*
30*16d86563SAlexander Pyhalov  * Copyright 1999-2004 Sun Microsystems, Inc.  All rights reserved.
31*16d86563SAlexander Pyhalov  * Use is subject to license terms.
32*16d86563SAlexander Pyhalov  */
33*16d86563SAlexander Pyhalov 
34*16d86563SAlexander Pyhalov 
35*16d86563SAlexander Pyhalov #if	defined(DEBUG)
36*16d86563SAlexander Pyhalov #include <stdio.h>
37*16d86563SAlexander Pyhalov #endif	/* DEBUG */
38*16d86563SAlexander Pyhalov #include <stdlib.h>
39*16d86563SAlexander Pyhalov #include <errno.h>
40*16d86563SAlexander Pyhalov 
41*16d86563SAlexander Pyhalov #define	JFP_ICONV_STATELESS
42*16d86563SAlexander Pyhalov #include "japanese.h"
43*16d86563SAlexander Pyhalov #include "jfp_iconv_unicode.h"
44*16d86563SAlexander Pyhalov 
45*16d86563SAlexander Pyhalov void *
_icv_open(void)46*16d86563SAlexander Pyhalov _icv_open(void)
47*16d86563SAlexander Pyhalov {
48*16d86563SAlexander Pyhalov 	return (_icv_open_stateless());
49*16d86563SAlexander Pyhalov }
50*16d86563SAlexander Pyhalov 
51*16d86563SAlexander Pyhalov void
_icv_close(void * cd)52*16d86563SAlexander Pyhalov _icv_close(void *cd)
53*16d86563SAlexander Pyhalov {
54*16d86563SAlexander Pyhalov 	_icv_close_stateless(cd);
55*16d86563SAlexander Pyhalov 	return;
56*16d86563SAlexander Pyhalov }
57*16d86563SAlexander Pyhalov 
58*16d86563SAlexander Pyhalov size_t
_icv_iconv(void * cd,char ** inbuf,size_t * inbytesleft,char ** outbuf,size_t * outbytesleft)59*16d86563SAlexander Pyhalov _icv_iconv(void *cd, char **inbuf, size_t *inbytesleft,
60*16d86563SAlexander Pyhalov 				char **outbuf, size_t *outbytesleft)
61*16d86563SAlexander Pyhalov {
62*16d86563SAlexander Pyhalov 	size_t		rv = (size_t)0;
63*16d86563SAlexander Pyhalov 	unsigned int	ucs4;
64*16d86563SAlexander Pyhalov 
65*16d86563SAlexander Pyhalov 	unsigned char	*ip;
66*16d86563SAlexander Pyhalov         size_t		ileft;
67*16d86563SAlexander Pyhalov 	char		*op;
68*16d86563SAlexander Pyhalov         size_t		oleft;
69*16d86563SAlexander Pyhalov 
70*16d86563SAlexander Pyhalov 	/*
71*16d86563SAlexander Pyhalov 	 * If inbuf and/or *inbuf are NULL, reset conversion descriptor
72*16d86563SAlexander Pyhalov 	 * and put escape sequence if needed.
73*16d86563SAlexander Pyhalov 	 */
74*16d86563SAlexander Pyhalov 	if ((inbuf == NULL) || (*inbuf == NULL)) {
75*16d86563SAlexander Pyhalov 		/* nothing to do here for this module */
76*16d86563SAlexander Pyhalov 		return ((size_t)0);
77*16d86563SAlexander Pyhalov 	}
78*16d86563SAlexander Pyhalov 
79*16d86563SAlexander Pyhalov 	ip = (unsigned char *)*inbuf;
80*16d86563SAlexander Pyhalov 	ileft = *inbytesleft;
81*16d86563SAlexander Pyhalov 	op = *outbuf;
82*16d86563SAlexander Pyhalov 	oleft = *outbytesleft;
83*16d86563SAlexander Pyhalov 
84*16d86563SAlexander Pyhalov 	while (ileft != 0) {
85*16d86563SAlexander Pyhalov 		if (utf8_ucs(&ucs4, &ip, &ileft) == (size_t)-1) {
86*16d86563SAlexander Pyhalov 			/* errno has been set in utf8_ucs() */
87*16d86563SAlexander Pyhalov 			rv = (size_t)-1;
88*16d86563SAlexander Pyhalov 			goto ret;
89*16d86563SAlexander Pyhalov 		}
90*16d86563SAlexander Pyhalov 
91*16d86563SAlexander Pyhalov 		if (ucs4 == 0xff5e)		/* FULLWIDTH TILDE */
92*16d86563SAlexander Pyhalov 			ucs4 = 0x301c;		/* WAVE DASH */
93*16d86563SAlexander Pyhalov 		else if (ucs4 == 0x2225)	/* PARALLEL TO */
94*16d86563SAlexander Pyhalov 			ucs4 = 0x2016;		/* DOUBLE VERTICAL BAR/LINE */
95*16d86563SAlexander Pyhalov 		else if (ucs4 == 0xff0d)	/* FULLWIDTH MINUS SIGN */
96*16d86563SAlexander Pyhalov 			ucs4 = 0x2212;		/* MINUS SIGN */
97*16d86563SAlexander Pyhalov 		else if (ucs4 == 0xffe0)	/* FULLWIDTH CENT SIGN */
98*16d86563SAlexander Pyhalov 			ucs4 = 0x00a2;		/* CENT SIGN */
99*16d86563SAlexander Pyhalov 		else if (ucs4 == 0xffe1)	/* FULLWIDTH POUND SIGN */
100*16d86563SAlexander Pyhalov 			ucs4 = 0x00a3;		/* POUND SIGN */
101*16d86563SAlexander Pyhalov 		else if (ucs4 == 0xffe2)	/* FULLWIDTH NOT SIGN */
102*16d86563SAlexander Pyhalov 			ucs4 = 0x00ac;		/* NOT SIGN */
103*16d86563SAlexander Pyhalov 
104*16d86563SAlexander Pyhalov 		PUTUCS2((unsigned short)ucs4, "E2BIG");
105*16d86563SAlexander Pyhalov 
106*16d86563SAlexander Pyhalov 		/*
107*16d86563SAlexander Pyhalov 		 * One character successfully converted so update
108*16d86563SAlexander Pyhalov 		 * values outside of this function's stack.
109*16d86563SAlexander Pyhalov 		 */
110*16d86563SAlexander Pyhalov 		*inbuf = (char *)ip;
111*16d86563SAlexander Pyhalov 		*inbytesleft = ileft;
112*16d86563SAlexander Pyhalov 		*outbuf = op;
113*16d86563SAlexander Pyhalov 		*outbytesleft = oleft;
114*16d86563SAlexander Pyhalov 	}
115*16d86563SAlexander Pyhalov 
116*16d86563SAlexander Pyhalov ret:
117*16d86563SAlexander Pyhalov 
118*16d86563SAlexander Pyhalov #if	defined(DEBUG)
119*16d86563SAlexander Pyhalov 	if (rv == (size_t)-1) {
120*16d86563SAlexander Pyhalov 		fprintf(stderr, "DEBUG: errno=%d: %s\n", errno, debugmsg);
121*16d86563SAlexander Pyhalov 	}
122*16d86563SAlexander Pyhalov #endif	/* DEBUG */
123*16d86563SAlexander Pyhalov 
124*16d86563SAlexander Pyhalov 	/*
125*16d86563SAlexander Pyhalov 	 * Return value for successful return is not defined by XPG
126*16d86563SAlexander Pyhalov 	 * so return same as *inbytesleft as existing codes do.
127*16d86563SAlexander Pyhalov 	 */
128*16d86563SAlexander Pyhalov 	return ((rv == (size_t)-1) ? rv : *inbytesleft);
129*16d86563SAlexander Pyhalov }
130