blob: 9eba0747aa8e17d61c4ef64a07be39d71a0881db [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2004-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26#include "utf.h"
27
28#include <windows.h>
29#include <stdlib.h>
30#include <stdio.h>
31
32/*
33 * Initialize all utf processing.
34 */
35struct UtfInst * JNICALL
36utfInitialize(char *options)
37{
38 struct UtfInst *ui;
39 LANGID langID;
40 LCID localeID;
41 TCHAR strCodePage[7]; // ANSI code page id
42
43 ui = (struct UtfInst*)calloc(sizeof(struct UtfInst), 1);
44
45 /*
46 * Get the code page for this locale
47 */
48 langID = LANGIDFROMLCID(GetUserDefaultLCID());
49 localeID = MAKELCID(langID, SORT_DEFAULT);
50 if (GetLocaleInfo(localeID, LOCALE_IDEFAULTANSICODEPAGE,
51 strCodePage, sizeof(strCodePage)/sizeof(TCHAR)) > 0 ) {
52 ui->platformCodePage = atoi(strCodePage);
53 } else {
54 ui->platformCodePage = GetACP();
55 }
56 return ui;
57}
58
59/*
60 * Terminate all utf processing
61 */
62void JNICALL
63utfTerminate(struct UtfInst *ui, char *options)
64{
65 (void)free(ui);
66}
67
68/*
69 * Get wide string (assumes len>0)
70 */
71static WCHAR*
72getWideString(UINT codePage, char* str, int len, int *pwlen)
73{
74 int wlen;
75 WCHAR* wstr;
76
77 /* Convert the string to WIDE string */
78 wlen = MultiByteToWideChar(codePage, 0, str, len, NULL, 0);
79 *pwlen = wlen;
80 if (wlen <= 0) {
81 UTF_ERROR(("Can't get WIDE string length"));
82 return NULL;
83 }
84 wstr = (WCHAR*)malloc(wlen * sizeof(WCHAR));
85 if (wstr == NULL) {
86 UTF_ERROR(("Can't malloc() any space"));
87 return NULL;
88 }
89 if (MultiByteToWideChar(codePage, 0, str, len, wstr, wlen) == 0) {
90 UTF_ERROR(("Can't get WIDE string"));
91 return NULL;
92 }
93 return wstr;
94}
95
96/*
97 * Convert UTF-8 to a platform string
98 */
99int JNICALL
100utf8ToPlatform(struct UtfInst *ui, jbyte *utf8, int len, char* output, int outputMaxLen)
101{
102 int wlen;
103 int plen;
104 WCHAR* wstr;
105
106 /* Negative length is an error */
107 if ( len < 0 ) {
108 return -1;
109 }
110
111 /* Zero length is ok, but we don't need to do much */
112 if ( len == 0 ) {
113 output[0] = 0;
114 return 0;
115 }
116
117 /* Get WIDE string version (assumes len>0) */
118 wstr = getWideString(CP_UTF8, (char*)utf8, len, &wlen);
119 if ( wstr == NULL ) {
120 return -1;
121 }
122
123 /* Convert WIDE string to MultiByte string */
124 plen = WideCharToMultiByte(ui->platformCodePage, 0, wstr, wlen,
125 output, outputMaxLen, NULL, NULL);
126 free(wstr);
127 if (plen <= 0) {
128 UTF_ERROR(("Can't convert WIDE string to multi-byte"));
129 return -1;
130 }
131 output[plen] = '\0';
132 return plen;
133}
134
135/*
136 * Convert Platform Encoding to UTF-8.
137 */
138int JNICALL
139utf8FromPlatform(struct UtfInst *ui, char *str, int len, jbyte *output, int outputMaxLen)
140{
141 int wlen;
142 int plen;
143 WCHAR* wstr;
144
145 /* Negative length is an error */
146 if ( len < 0 ) {
147 return -1;
148 }
149
150 /* Zero length is ok, but we don't need to do much */
151 if ( len == 0 ) {
152 output[0] = 0;
153 return 0;
154 }
155
156 /* Get WIDE string version (assumes len>0) */
157 wstr = getWideString(ui->platformCodePage, str, len, &wlen);
158 if ( wstr == NULL ) {
159 return -1;
160 }
161
162 /* Convert WIDE string to UTF-8 string */
163 plen = WideCharToMultiByte(CP_UTF8, 0, wstr, wlen,
164 (char*)output, outputMaxLen, NULL, NULL);
165 free(wstr);
166 if (plen <= 0) {
167 UTF_ERROR(("Can't convert WIDE string to multi-byte"));
168 return -1;
169 }
170 output[plen] = '\0';
171 return plen;
172}