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