blob: 4ba939a6f3f91d5d9cf46945cb56c779f6601d82 [file] [log] [blame]
/*
* Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package build.tools.charsetmapping;
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.LinkedHashMap;
import java.util.Locale;
public class Main {
public static void main(String args[]) throws Throwable {
int SRC_DIR = 0;
int DST_DIR = 1;
int TYPE = 2;
int CHARSETS = 3;
int OS = 4;
int TEMPLATE = 5;
int EXT_SRC = 6;
int COPYRIGHT_SRC = 7;
if (args.length < 3 ) {
System.out.println("Usage: java -jar charsetmapping.jar src dst spiType charsets os [template]");
System.exit(1);
}
boolean isStandard = "stdcs".equals(args[TYPE]);
boolean isExtended = "extcs".equals(args[TYPE]);
if (isStandard || isExtended) {
LinkedHashMap<String, Charset> charsets = getCharsets(
new File(args[SRC_DIR], args[CHARSETS]));
String[] osStdcs = getOSStdCSList(new File(args[SRC_DIR], args[OS]));
boolean hasBig5_HKSCS = false;
boolean hasMS950_HKSCS = false;
boolean hasMS950_HKSCS_XP = false;
boolean hasEUC_TW = false;
for (String name : osStdcs) {
Charset cs = charsets.get(name);
if (cs != null) {
cs.pkgName = "sun.nio.cs";
}
if (name.equals("Big5_HKSCS")) {
hasBig5_HKSCS = true;
} else if (name.equals("MS950_HKSCS")) {
hasMS950_HKSCS = true;
} else if (name.equals("MS950_HKSCS_XP")) {
hasMS950_HKSCS_XP = true;
} else if (name.equals("EUC_TW")) {
hasEUC_TW = true;
}
}
for (Charset cs : charsets.values()) {
if (isStandard && cs.pkgName.equals("sun.nio.cs.ext") ||
isExtended && cs.pkgName.equals("sun.nio.cs")) {
continue;
}
verbose(cs);
switch (cs.type) {
case "template":
SRC.genClass(cs, args[EXT_SRC], args[DST_DIR]);
break;
case "sbcs":
SBCS.genClass(cs, args[SRC_DIR], args[DST_DIR],
"SingleByte-X.java.template");
break;
case "source":
break; // source file, do nothing
default: // dbcs
DBCS.genClass("dbcs".equals(cs.type) ?
"" : "_" + cs.type.toUpperCase(Locale.ENGLISH),
cs, args[SRC_DIR], args[DST_DIR],
"DoubleByte-X.java.template");
}
}
// provider StandardCharsets.java / ExtendedCharsets.java
SPI.genClass(args[TYPE], charsets,
args[SRC_DIR], args[DST_DIR],
args[TEMPLATE],
args[OS].endsWith("windows") ? "windows" : "unix");
// HKSCSMapping(2008).java goes std if one of Big5_HKSCS MS950_HKSCS
// is in std
if (isStandard && (hasBig5_HKSCS || hasMS950_HKSCS) ||
isExtended && !(hasBig5_HKSCS || hasMS950_HKSCS)) {
HKSCS.genClass2008(args[SRC_DIR], args[DST_DIR],
isStandard ? "sun.nio.cs" : "sun.nio.cs.ext",
new File(args[COPYRIGHT_SRC], "HKSCS.java"));
}
// HKSCS_XPMapping.java goes together with MS950XP_HKSCS
if (isStandard && hasMS950_HKSCS_XP || isExtended && !hasMS950_HKSCS_XP) {
HKSCS.genClassXP(args[SRC_DIR], args[DST_DIR],
isStandard ? "sun.nio.cs" : "sun.nio.cs.ext",
new File(args[COPYRIGHT_SRC], "HKSCS.java"));
}
if (isStandard && hasEUC_TW) {
EUC_TW.genClass("sun.nio.cs", args);
}
if (!isStandard && !hasEUC_TW) {
EUC_TW.genClass("sun.nio.cs.ext", args);
}
} else if ("sjis0213".equals(args[TYPE])) {
JIS0213.genClass(args);
} else if ("hkscs".equals(args[TYPE])) {
HKSCS.genClass2001(args);
}
}
private static LinkedHashMap<String, Charset> getCharsets(File cslist)
throws Throwable
{
LinkedHashMap<String, Charset> charsets = new LinkedHashMap<>();
try (Scanner s = new Scanner(cslist)) {
Charset cs = null;
ArrayList<String> names = new ArrayList<>();
while (s.hasNextLine()) {
String line = s.nextLine();
if (line.startsWith("#") || line.length() == 0) {
continue;
}
String[] tokens = line.split("\\s+");
if (tokens.length < 2) {
continue;
}
if ("charset".equals(tokens[0])) {
if (cs != null) {
cs.aliases = names.toArray(new String[names.size()]);
charsets.put(cs.clzName, cs);
cs = null;
names.clear();
}
if (tokens.length < 3) {
throw new RuntimeException("Error: incorrect charset line [" + line + "]");
}
if ((cs = charsets.get(tokens[2])) != null) {
throw new RuntimeException("Error: deplicate charset line [" + line + "]");
}
cs = new Charset();
cs.csName = tokens[1];
cs.clzName = tokens[2];
} else {
String key = tokens[1]; // leading empty str
switch (key) {
case "alias":
if (tokens.length < 3) {
throw new RuntimeException("Error: incorrect alias line [" + line + "]");
} else if (names != null) {
names.add(tokens[2]); // ALIAS_NAME
}
break;
case "package":
cs.pkgName = tokens[2];
break;
case "type":
cs.type = tokens[2];
break;
case "os":
cs.os = tokens[2];
break;
case "hisname":
cs.hisName = tokens[2];
break;
case "ascii":
cs.isASCII = Boolean.parseBoolean(tokens[2]);
break;
case "minmax":
cs.b1Min = toInteger(tokens[2]);
cs.b1Max = toInteger(tokens[3]);
cs.b2Min = toInteger(tokens[4]);
cs.b2Max = toInteger(tokens[5]);
break;
case "internal":
cs.isInternal = Boolean.parseBoolean(tokens[2]);
break;
default: // ignore
}
}
}
if (cs != null) {
cs.aliases = names.toArray(new String[names.size()]);
charsets.put(cs.clzName, cs);
}
}
return charsets;
}
private static String[] getOSStdCSList(File stdcsos) throws Throwable
{
ArrayList<String> names = new ArrayList<>();
if (stdcsos.exists()) {
try (Scanner s = new Scanner(stdcsos)) {
while (s.hasNextLine()) {
String line = s.nextLine();
int i = line.indexOf('#');
if (i != -1) {
line = line.substring(0, i);
}
line = line.trim();
if (line.length() != 0) {
names.add(line);
}
}
}
}
return names.toArray(new String[names.size()]);
}
static void verbose(Charset cs) {
System.out.printf("%s, %s, %s, %s, %s %b%n",
cs.clzName, cs.csName, cs.hisName, cs.pkgName, cs.type, cs.isASCII);
}
static int toInteger(String s) {
return (s.startsWith("0x") || s.startsWith("0X"))
? Integer.valueOf(s.substring(2), 16)
: Integer.valueOf(s);
}
}