зеркало из https://github.com/mozilla/pjs.git
[HTML5] Remove unneeded parser/html/java/translator directory (bug 518224). r=hsivonen
--HG-- extra : rebase_source : 2d3d248bb554f66206568e55690fe1b0cd198515
This commit is contained in:
Родитель
f139d1dfb1
Коммит
a8fe97b4ab
|
@ -29,4 +29,4 @@ _OPT\.OBJ/
|
||||||
^js/src/autom4te.cache$
|
^js/src/autom4te.cache$
|
||||||
|
|
||||||
# Java HTML5 parser classes
|
# Java HTML5 parser classes
|
||||||
^parser/html/java/.*\.class$
|
^parser/html/java/(html|java)parser/
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
# ***** BEGIN LICENSE BLOCK *****
|
|
||||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
#
|
|
||||||
# The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
# the License. You may obtain a copy of the License at
|
|
||||||
# http://www.mozilla.org/MPL/
|
|
||||||
#
|
|
||||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
# for the specific language governing rights and limitations under the
|
|
||||||
# License.
|
|
||||||
#
|
|
||||||
# The Original Code is Makefile.
|
|
||||||
#
|
|
||||||
# The Initial Developer of the Original Code is
|
|
||||||
# Mozilla Corporation.
|
|
||||||
#
|
|
||||||
# Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
# the Initial Developer. All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Contributor(s):
|
|
||||||
# Ben Newman <b{enjam,newma}n@mozilla.com>
|
|
||||||
#
|
|
||||||
# Alternatively, the contents of this file may be used under the terms of
|
|
||||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
# of those above. If you wish to allow use of your version of this file only
|
|
||||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
# use your version of this file under the terms of the MPL, indicate your
|
|
||||||
# decision by deleting the provisions above and replace them with the notice
|
|
||||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
# the provisions above, a recipient may use your version of this file under
|
|
||||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
#
|
|
||||||
# ***** END LICENSE BLOCK *****
|
|
||||||
|
|
||||||
SVN_BASE=https://whattf.svn.cvsdude.com/htmlparser/trunk
|
|
||||||
|
|
||||||
libs:: \
|
|
||||||
; mkdir -p bin && \
|
|
||||||
find src -name "*.java" | \
|
|
||||||
xargs javac -cp ../javaparser.jar -g -d bin && \
|
|
||||||
jar cfm translator.jar manifest.txt -C bin .
|
|
||||||
|
|
||||||
sync:: \
|
|
||||||
; ../sync-src.sh $(SVN_BASE)/translator-src && \
|
|
||||||
../sync-files.sh $(SVN_BASE) LICENSE.txt README.txt
|
|
||||||
|
|
||||||
named_characters:: libs \
|
|
||||||
; java -cp translator.jar \
|
|
||||||
nu.validator.htmlparser.generator.GenerateNamedCharactersCpp \
|
|
||||||
named-character-references.html \
|
|
||||||
../..
|
|
||||||
|
|
||||||
clean:: \
|
|
||||||
; rm -rf bin translator.jar
|
|
|
@ -1,2 +0,0 @@
|
||||||
Main-Class: nu.validator.htmlparser.cpptranslate.Main
|
|
||||||
Class-Path: javaparser.jar
|
|
|
@ -1,121 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import japa.parser.ast.expr.AnnotationExpr;
|
|
||||||
import japa.parser.ast.expr.MarkerAnnotationExpr;
|
|
||||||
import japa.parser.ast.type.ReferenceType;
|
|
||||||
import japa.parser.ast.visitor.VoidVisitorAdapter;
|
|
||||||
|
|
||||||
public class AnnotationHelperVisitor<T> extends VoidVisitorAdapter<T> {
|
|
||||||
|
|
||||||
protected List<AnnotationExpr> currentAnnotations;
|
|
||||||
|
|
||||||
protected boolean nsUri() {
|
|
||||||
return hasAnnotation("NsUri");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean prefix() {
|
|
||||||
return hasAnnotation("Prefix");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean local() {
|
|
||||||
return hasAnnotation("Local");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean literal() {
|
|
||||||
return hasAnnotation("Literal");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean inline() {
|
|
||||||
return hasAnnotation("Inline");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean noLength() {
|
|
||||||
return hasAnnotation("NoLength");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean virtual() {
|
|
||||||
return hasAnnotation("Virtual");
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasAnnotation(String anno) {
|
|
||||||
if (currentAnnotations == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (AnnotationExpr ann : currentAnnotations) {
|
|
||||||
if (ann instanceof MarkerAnnotationExpr) {
|
|
||||||
MarkerAnnotationExpr marker = (MarkerAnnotationExpr) ann;
|
|
||||||
if (marker.getName().getName().equals(anno)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Type convertType(japa.parser.ast.type.Type type, int modifiers) {
|
|
||||||
if (type instanceof ReferenceType) {
|
|
||||||
ReferenceType referenceType = (ReferenceType) type;
|
|
||||||
return new Type(convertTypeName(referenceType.getType().toString()), referenceType.getArrayCount(), noLength(), modifiers);
|
|
||||||
} else {
|
|
||||||
return new Type(convertTypeName(type.toString()), 0, false, modifiers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String convertTypeName(String name) {
|
|
||||||
if ("String".equals(name)) {
|
|
||||||
if (local()) {
|
|
||||||
return "@Local";
|
|
||||||
}
|
|
||||||
if (nsUri()) {
|
|
||||||
return "@NsUri";
|
|
||||||
}
|
|
||||||
if (prefix()) {
|
|
||||||
return "@Prefix";
|
|
||||||
}
|
|
||||||
if (literal()) {
|
|
||||||
return "@Literal";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,310 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008-2009
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class CppTypes {
|
|
||||||
|
|
||||||
private static Set<String> reservedWords = new HashSet<String>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
reservedWords.add("small");
|
|
||||||
reservedWords.add("for");
|
|
||||||
reservedWords.add("false");
|
|
||||||
reservedWords.add("true");
|
|
||||||
reservedWords.add("default");
|
|
||||||
reservedWords.add("class");
|
|
||||||
reservedWords.add("switch");
|
|
||||||
reservedWords.add("union");
|
|
||||||
reservedWords.add("template");
|
|
||||||
reservedWords.add("int");
|
|
||||||
reservedWords.add("char");
|
|
||||||
reservedWords.add("operator");
|
|
||||||
reservedWords.add("or");
|
|
||||||
reservedWords.add("and");
|
|
||||||
reservedWords.add("not");
|
|
||||||
reservedWords.add("xor");
|
|
||||||
reservedWords.add("unicode");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String[] TREE_BUILDER_INCLUDES = { "prtypes",
|
|
||||||
"nsIAtom", "nsITimer", "nsString", "nsINameSpaceManager", "nsIContent",
|
|
||||||
"nsIDocument", "nsTraceRefcnt", "jArray", "nsHtml5DocumentMode",
|
|
||||||
"nsHtml5ArrayCopy", "nsHtml5NamedCharacters", "nsHtml5Parser",
|
|
||||||
"nsHtml5Atoms", "nsHtml5ByteReadable", "nsHtml5TreeOperation",
|
|
||||||
"nsHtml5PendingNotification", "nsHtml5StateSnapshot", "nsHtml5StackNode",
|
|
||||||
"nsHtml5TreeOpExecutor", "nsHtml5StreamParser" };
|
|
||||||
|
|
||||||
private static final String[] INCLUDES = { "prtypes", "nsIAtom",
|
|
||||||
"nsString", "nsINameSpaceManager", "nsIContent", "nsIDocument",
|
|
||||||
"nsTraceRefcnt", "jArray", "nsHtml5DocumentMode",
|
|
||||||
"nsHtml5ArrayCopy", "nsHtml5NamedCharacters",
|
|
||||||
"nsHtml5Atoms", "nsHtml5ByteReadable", "nsIUnicodeDecoder", };
|
|
||||||
|
|
||||||
private static final String[] OTHER_DECLATIONS = {};
|
|
||||||
|
|
||||||
private static final String[] TREE_BUILDER_OTHER_DECLATIONS = { };
|
|
||||||
|
|
||||||
private static final String[] NAMED_CHARACTERS_INCLUDES = { "prtypes",
|
|
||||||
"jArray", "nscore" };
|
|
||||||
|
|
||||||
private static final String[] FORWARD_DECLARATIONS = { "nsHtml5StreamParser", };
|
|
||||||
|
|
||||||
private static final String[] CLASSES_THAT_NEED_SUPPLEMENT = {
|
|
||||||
"MetaScanner",
|
|
||||||
"StackNode",
|
|
||||||
"TreeBuilder",
|
|
||||||
"UTF16Buffer",
|
|
||||||
};
|
|
||||||
|
|
||||||
private final Map<String, String> atomMap = new HashMap<String, String>();
|
|
||||||
|
|
||||||
private final Writer atomWriter;
|
|
||||||
|
|
||||||
public CppTypes(File atomList) {
|
|
||||||
if (atomList == null) {
|
|
||||||
atomWriter = null;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
atomWriter = new OutputStreamWriter(new FileOutputStream(
|
|
||||||
atomList), "utf-8");
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void finished() {
|
|
||||||
try {
|
|
||||||
if (atomWriter != null) {
|
|
||||||
atomWriter.flush();
|
|
||||||
atomWriter.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String classPrefix() {
|
|
||||||
return "nsHtml5";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String booleanType() {
|
|
||||||
return "PRBool";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String charType() {
|
|
||||||
return "PRUnichar";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String intType() {
|
|
||||||
return "PRInt32";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String stringType() {
|
|
||||||
return "nsString*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String localType() {
|
|
||||||
return "nsIAtom*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String prefixType() {
|
|
||||||
return "nsIAtom*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String nsUriType() {
|
|
||||||
return "PRInt32";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String falseLiteral() {
|
|
||||||
return "PR_FALSE";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String trueLiteral() {
|
|
||||||
return "PR_TRUE";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String nullLiteral() {
|
|
||||||
return "nsnull";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String encodingDeclarationHandlerType() {
|
|
||||||
return "nsHtml5StreamParser*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String nodeType() {
|
|
||||||
return "nsIContent*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String xhtmlNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_XHTML";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String svgNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_SVG";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String xmlnsNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_XMLNS";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String xmlNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_XML";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String noNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_None";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String xlinkNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_XLink";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String mathmlNamespaceLiteral() {
|
|
||||||
return "kNameSpaceID_MathML";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String arrayTemplate() {
|
|
||||||
return "jArray";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String localForLiteral(String literal) {
|
|
||||||
String atom = atomMap.get(literal);
|
|
||||||
if (atom == null) {
|
|
||||||
atom = createAtomName(literal);
|
|
||||||
atomMap.put(literal, atom);
|
|
||||||
if (atomWriter != null) {
|
|
||||||
try {
|
|
||||||
atomWriter.write("HTML5_ATOM(" + atom + ", \"" + literal
|
|
||||||
+ "\")\n");
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "nsHtml5Atoms::" + atom;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String createAtomName(String literal) {
|
|
||||||
String candidate = literal.replaceAll("[^a-zA-Z0-9_]", "_");
|
|
||||||
if ("".equals(candidate)) {
|
|
||||||
candidate = "emptystring";
|
|
||||||
}
|
|
||||||
while (atomMap.values().contains(candidate)
|
|
||||||
|| reservedWords.contains(candidate)) {
|
|
||||||
candidate = candidate + '_';
|
|
||||||
}
|
|
||||||
return candidate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String stringForLiteral(String literal) {
|
|
||||||
return '"' + literal + '"';
|
|
||||||
}
|
|
||||||
|
|
||||||
public String staticArrayMacro() {
|
|
||||||
return "J_ARRAY_STATIC";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] boilerplateIncludes(String javaClass) {
|
|
||||||
if ("TreeBuilder".equals(javaClass)) {
|
|
||||||
return TREE_BUILDER_INCLUDES;
|
|
||||||
} else {
|
|
||||||
return INCLUDES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] boilerplateDeclarations(String javaClass) {
|
|
||||||
if ("TreeBuilder".equals(javaClass)) {
|
|
||||||
return TREE_BUILDER_OTHER_DECLATIONS;
|
|
||||||
} else {
|
|
||||||
return OTHER_DECLATIONS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] namedCharactersIncludes() {
|
|
||||||
return NAMED_CHARACTERS_INCLUDES;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] boilerplateForwardDeclarations() {
|
|
||||||
return FORWARD_DECLARATIONS;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String documentModeHandlerType() {
|
|
||||||
return "nsHtml5TreeBuilder*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String documentModeType() {
|
|
||||||
return "nsHtml5DocumentMode";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String arrayCopy() {
|
|
||||||
return "nsHtml5ArrayCopy::arraycopy";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String maxInteger() {
|
|
||||||
return "PR_INT32_MAX";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String constructorBoilerplate(String className) {
|
|
||||||
return "MOZ_COUNT_CTOR(" + className + ");";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String destructorBoilderplate(String className) {
|
|
||||||
return "MOZ_COUNT_DTOR(" + className + ");";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String literalType() {
|
|
||||||
return "const char*";
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasSupplement(String javaClass) {
|
|
||||||
return Arrays.binarySearch(CLASSES_THAT_NEED_SUPPLEMENT, javaClass) > -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,70 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class GkAtomParser {
|
|
||||||
|
|
||||||
private static final Pattern ATOM = Pattern.compile("^GK_ATOM\\(([^,]+),\\s*\"([^\"]*)\"\\).*$");
|
|
||||||
|
|
||||||
private final BufferedReader reader;
|
|
||||||
|
|
||||||
public GkAtomParser(Reader reader) {
|
|
||||||
this.reader = new BufferedReader(reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> parse() throws IOException {
|
|
||||||
Map<String, String> map = new HashMap<String, String>();
|
|
||||||
String line;
|
|
||||||
while((line = reader.readLine()) != null) {
|
|
||||||
Matcher m = ATOM.matcher(line);
|
|
||||||
if (m.matches()) {
|
|
||||||
map.put(m.group(2), m.group(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,352 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import japa.parser.ast.body.FieldDeclaration;
|
|
||||||
import japa.parser.ast.body.MethodDeclaration;
|
|
||||||
import japa.parser.ast.body.ModifierSet;
|
|
||||||
import japa.parser.ast.body.VariableDeclarator;
|
|
||||||
import japa.parser.ast.expr.IntegerLiteralExpr;
|
|
||||||
import japa.parser.ast.expr.MethodCallExpr;
|
|
||||||
import japa.parser.ast.stmt.BlockStmt;
|
|
||||||
import japa.parser.ast.type.PrimitiveType;
|
|
||||||
import japa.parser.ast.type.ReferenceType;
|
|
||||||
import japa.parser.ast.type.Type;
|
|
||||||
|
|
||||||
public class HVisitor extends CppVisitor {
|
|
||||||
|
|
||||||
private enum Visibility {
|
|
||||||
NONE, PRIVATE, PUBLIC, PROTECTED,
|
|
||||||
}
|
|
||||||
|
|
||||||
private Visibility previousVisibility = Visibility.NONE;
|
|
||||||
|
|
||||||
private List<String> defines = new LinkedList<String>();
|
|
||||||
|
|
||||||
private SourcePrinter arrayInitPrinter = new SourcePrinter();
|
|
||||||
private SourcePrinter mainPrinterHolder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#printMethodNamespace()
|
|
||||||
*/
|
|
||||||
@Override protected void printMethodNamespace() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public HVisitor(CppTypes cppTypes, SymbolTable symbolTable) {
|
|
||||||
super(cppTypes, symbolTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#startClassDeclaration()
|
|
||||||
*/
|
|
||||||
@Override protected void startClassDeclaration() {
|
|
||||||
printer.print("#ifndef ");
|
|
||||||
printer.print(className);
|
|
||||||
printer.printLn("_h__");
|
|
||||||
printer.print("#define ");
|
|
||||||
printer.print(className);
|
|
||||||
printer.printLn("_h__");
|
|
||||||
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
String[] incs = cppTypes.boilerplateIncludes(javaClassName);
|
|
||||||
for (int i = 0; i < incs.length; i++) {
|
|
||||||
String inc = incs[i];
|
|
||||||
if (className.equals(inc)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
printer.print("#include \"");
|
|
||||||
printer.print(inc);
|
|
||||||
printer.printLn(".h\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
String[] forwDecls = cppTypes.boilerplateForwardDeclarations();
|
|
||||||
for (int i = 0; i < forwDecls.length; i++) {
|
|
||||||
String decl = forwDecls[i];
|
|
||||||
printer.print("class ");
|
|
||||||
printer.print(decl);
|
|
||||||
printer.printLn(";");
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
for (int i = 0; i < Main.H_LIST.length; i++) {
|
|
||||||
String klazz = Main.H_LIST[i];
|
|
||||||
if (!(klazz.equals(javaClassName) || klazz.equals("StackNode"))) {
|
|
||||||
printer.print("class ");
|
|
||||||
printer.print(cppTypes.classPrefix());
|
|
||||||
printer.print(klazz);
|
|
||||||
printer.printLn(";");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
String[] otherDecls = cppTypes.boilerplateDeclarations(javaClassName);
|
|
||||||
for (int i = 0; i < otherDecls.length; i++) {
|
|
||||||
String decl = otherDecls[i];
|
|
||||||
printer.printLn(decl);
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
printer.print("class ");
|
|
||||||
printer.printLn(className);
|
|
||||||
printer.printLn("{");
|
|
||||||
printer.indent();
|
|
||||||
printer.indent();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#endClassDeclaration()
|
|
||||||
*/
|
|
||||||
@Override protected void endClassDeclaration() {
|
|
||||||
printModifiers(ModifierSet.PUBLIC | ModifierSet.STATIC);
|
|
||||||
printer.printLn("void initializeStatics();");
|
|
||||||
printModifiers(ModifierSet.PUBLIC | ModifierSet.STATIC);
|
|
||||||
printer.printLn("void releaseStatics();");
|
|
||||||
|
|
||||||
printer.unindent();
|
|
||||||
printer.unindent();
|
|
||||||
|
|
||||||
if (cppTypes.hasSupplement(javaClassName)) {
|
|
||||||
printer.printLn();
|
|
||||||
printer.print("#include \"");
|
|
||||||
printer.print(className);
|
|
||||||
printer.printLn("HSupplement.h\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.printLn("};");
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
// This stuff should probably go into the .cpp anyway. sigh.
|
|
||||||
printer.print("#ifdef ");
|
|
||||||
printer.print(className);
|
|
||||||
printer.printLn("_cpp__");
|
|
||||||
printer.print(arrayInitPrinter.getSource());
|
|
||||||
printer.printLn("#endif");
|
|
||||||
printer.printLn();
|
|
||||||
|
|
||||||
for (String define : defines) {
|
|
||||||
printer.printLn(define);
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.printLn();
|
|
||||||
printer.printLn();
|
|
||||||
printer.printLn("#endif");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#printModifiers(int)
|
|
||||||
*/
|
|
||||||
@Override protected void printModifiers(int modifiers) {
|
|
||||||
if (ModifierSet.isPrivate(modifiers)) {
|
|
||||||
if (previousVisibility != Visibility.PRIVATE) {
|
|
||||||
printer.unindent();
|
|
||||||
printer.printLn("private:");
|
|
||||||
printer.indent();
|
|
||||||
previousVisibility = Visibility.PRIVATE;
|
|
||||||
}
|
|
||||||
} else if (ModifierSet.isProtected(modifiers)) {
|
|
||||||
if (previousVisibility != Visibility.PROTECTED) {
|
|
||||||
printer.unindent();
|
|
||||||
printer.printLn("protected:");
|
|
||||||
printer.indent();
|
|
||||||
previousVisibility = Visibility.PROTECTED;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (previousVisibility != Visibility.PUBLIC) {
|
|
||||||
printer.unindent();
|
|
||||||
printer.printLn("public:");
|
|
||||||
printer.indent();
|
|
||||||
previousVisibility = Visibility.PUBLIC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (inline()) {
|
|
||||||
printer.print("inline ");
|
|
||||||
}
|
|
||||||
if (virtual()) {
|
|
||||||
printer.print("virtual ");
|
|
||||||
}
|
|
||||||
if (ModifierSet.isStatic(modifiers)) {
|
|
||||||
printer.print("static ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#fieldDeclaration(japa.parser.ast.body.FieldDeclaration, java.lang.LocalSymbolTable)
|
|
||||||
*/
|
|
||||||
@Override protected void fieldDeclaration(FieldDeclaration n, LocalSymbolTable arg) {
|
|
||||||
int modifiers = n.getModifiers();
|
|
||||||
List<VariableDeclarator> variables = n.getVariables();
|
|
||||||
VariableDeclarator declarator = variables.get(0);
|
|
||||||
if (ModifierSet.isStatic(modifiers) && ModifierSet.isFinal(modifiers)
|
|
||||||
&& n.getType() instanceof PrimitiveType) {
|
|
||||||
PrimitiveType type = (PrimitiveType) n.getType();
|
|
||||||
if (type.getType() != PrimitiveType.Primitive.Int) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Only int constant #defines supported.");
|
|
||||||
}
|
|
||||||
if (variables.size() != 1) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"More than one variable declared by one declarator.");
|
|
||||||
}
|
|
||||||
String name = javaClassName + "." + declarator.getId().getName();
|
|
||||||
String value = declarator.getInit().toString();
|
|
||||||
if ("Integer.MAX_VALUE".equals(value)) {
|
|
||||||
value = cppTypes.maxInteger();
|
|
||||||
}
|
|
||||||
String longName = definePrefix + declarator.getId().getName();
|
|
||||||
if (symbolTable.cppDefinesByJavaNames.containsKey(name)) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Duplicate #define constant local name: " + name);
|
|
||||||
}
|
|
||||||
symbolTable.cppDefinesByJavaNames.put(name, longName);
|
|
||||||
defines.add("#define " + longName + " " + value);
|
|
||||||
} else {
|
|
||||||
if (n.getType() instanceof ReferenceType) {
|
|
||||||
ReferenceType rt = (ReferenceType) n.getType();
|
|
||||||
currentArrayCount = rt.getArrayCount();
|
|
||||||
if (currentArrayCount > 0
|
|
||||||
&& (rt.getType() instanceof PrimitiveType) && declarator.getInit() != null) {
|
|
||||||
if (!ModifierSet.isStatic(modifiers)) {
|
|
||||||
throw new IllegalStateException(
|
|
||||||
"Non-static array case not supported here." + declarator);
|
|
||||||
}
|
|
||||||
if (noLength()) {
|
|
||||||
inPrimitiveNoLengthFieldDeclarator = true;
|
|
||||||
|
|
||||||
mainPrinterHolder = printer;
|
|
||||||
printer = arrayInitPrinter;
|
|
||||||
n.getType().accept(this, arg);
|
|
||||||
printer.print(" ");
|
|
||||||
printer.print(className);
|
|
||||||
printer.print("::");
|
|
||||||
declarator.getId().accept(this, arg);
|
|
||||||
|
|
||||||
printer.print(" = ");
|
|
||||||
|
|
||||||
declarator.getInit().accept(this, arg);
|
|
||||||
|
|
||||||
printer.printLn(";");
|
|
||||||
printer = mainPrinterHolder;
|
|
||||||
} else if (!isNonToCharArrayMethodCall(declarator.getInit())) {
|
|
||||||
mainPrinterHolder = printer;
|
|
||||||
printer = arrayInitPrinter;
|
|
||||||
|
|
||||||
printer.print(cppTypes.arrayTemplate());
|
|
||||||
printer.print("<");
|
|
||||||
suppressPointer = true;
|
|
||||||
rt.getType().accept(this, arg);
|
|
||||||
suppressPointer = false;
|
|
||||||
printer.print(",");
|
|
||||||
printer.print(cppTypes.intType());
|
|
||||||
printer.print("> ");
|
|
||||||
printer.print(className);
|
|
||||||
printer.print("::");
|
|
||||||
declarator.getId().accept(this, arg);
|
|
||||||
printer.printLn(" = 0;");
|
|
||||||
|
|
||||||
printer = mainPrinterHolder;
|
|
||||||
}
|
|
||||||
} else if (ModifierSet.isStatic(modifiers)) {
|
|
||||||
mainPrinterHolder = printer;
|
|
||||||
printer = arrayInitPrinter;
|
|
||||||
|
|
||||||
n.getType().accept(this, arg);
|
|
||||||
printer.print(" ");
|
|
||||||
printer.print(className);
|
|
||||||
printer.print("::");
|
|
||||||
if ("AttributeName".equals(n.getType().toString())) {
|
|
||||||
printer.print("ATTR_");
|
|
||||||
} else if ("ElementName".equals(n.getType().toString())) {
|
|
||||||
printer.print("ELT_");
|
|
||||||
}
|
|
||||||
declarator.getId().accept(this, arg);
|
|
||||||
printer.print(" = ");
|
|
||||||
printer.print(cppTypes.nullLiteral());
|
|
||||||
printer.printLn(";");
|
|
||||||
|
|
||||||
printer = mainPrinterHolder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printModifiers(modifiers);
|
|
||||||
n.getType().accept(this, arg);
|
|
||||||
printer.print(" ");
|
|
||||||
if (ModifierSet.isStatic(modifiers)) {
|
|
||||||
if ("AttributeName".equals(n.getType().toString())) {
|
|
||||||
printer.print("ATTR_");
|
|
||||||
} else if ("ElementName".equals(n.getType().toString())) {
|
|
||||||
printer.print("ELT_");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declarator.getId().accept(this, arg);
|
|
||||||
printer.printLn(";");
|
|
||||||
currentArrayCount = 0;
|
|
||||||
inPrimitiveNoLengthFieldDeclarator = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#printConstructorBody(japa.parser.ast.stmt.BlockStmt, java.lang.LocalSymbolTable)
|
|
||||||
*/
|
|
||||||
@Override protected void printConstructorBody(BlockStmt block, LocalSymbolTable arg) {
|
|
||||||
printer.printLn(";");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#visit(japa.parser.ast.body.MethodDeclaration, java.lang.LocalSymbolTable)
|
|
||||||
*/
|
|
||||||
@Override public void visit(MethodDeclaration n, LocalSymbolTable arg) {
|
|
||||||
arg = new LocalSymbolTable(javaClassName, symbolTable);
|
|
||||||
printMethodDeclaration(n, arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.CppVisitor#inHeader()
|
|
||||||
*/
|
|
||||||
@Override protected boolean inHeader() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import japa.parser.ast.stmt.BreakStmt;
|
|
||||||
import japa.parser.ast.stmt.ContinueStmt;
|
|
||||||
import japa.parser.ast.visitor.VoidVisitorAdapter;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class LabelVisitor extends VoidVisitorAdapter<Object> {
|
|
||||||
|
|
||||||
private final Set<String> labels = new HashSet<String>();
|
|
||||||
|
|
||||||
public LabelVisitor() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.stmt.BreakStmt, java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void visit(BreakStmt n, Object arg) {
|
|
||||||
String label = n.getId();
|
|
||||||
if (label != null) {
|
|
||||||
labels.add(label + "_end");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.stmt.ContinueStmt, java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void visit(ContinueStmt n, Object arg) {
|
|
||||||
String label = n.getId();
|
|
||||||
if (label != null) {
|
|
||||||
labels.add(label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the labels.
|
|
||||||
*
|
|
||||||
* @return the labels
|
|
||||||
*/
|
|
||||||
public Set<String> getLabels() {
|
|
||||||
return labels;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.Reader;
|
|
||||||
|
|
||||||
public class LicenseExtractor {
|
|
||||||
|
|
||||||
private final Reader reader;
|
|
||||||
|
|
||||||
public LicenseExtractor(File file) throws IOException {
|
|
||||||
this.reader = new InputStreamReader(new FileInputStream(file), "utf-8");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String extract() throws IOException {
|
|
||||||
boolean prevWasAsterisk = false;
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
int c;
|
|
||||||
while ((c = reader.read()) != -1) {
|
|
||||||
sb.append((char)c);
|
|
||||||
switch (c) {
|
|
||||||
case '*':
|
|
||||||
prevWasAsterisk = true;
|
|
||||||
continue;
|
|
||||||
case '/':
|
|
||||||
if (prevWasAsterisk) {
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
prevWasAsterisk = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class LocalSymbolTable {
|
|
||||||
|
|
||||||
private final Map<String, Type> locals = new HashMap<String, Type>();
|
|
||||||
|
|
||||||
private final String javaClassName;
|
|
||||||
|
|
||||||
private final SymbolTable delegate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param javaClassName
|
|
||||||
* @param delegate
|
|
||||||
*/
|
|
||||||
public LocalSymbolTable(String javaClassName, SymbolTable delegate) {
|
|
||||||
this.javaClassName = javaClassName;
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putLocalType(String name, Type type) {
|
|
||||||
locals.put(name, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param klazz
|
|
||||||
* @param variable
|
|
||||||
* @return
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.SymbolTable#getFieldType(java.lang.String, java.lang.String)
|
|
||||||
*/
|
|
||||||
public Type getVariableType(String klazz, String variable) {
|
|
||||||
if (klazz == null) {
|
|
||||||
Type type = locals.get(variable);
|
|
||||||
if (type != null) {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return delegate.getFieldType(((klazz == null || "this".equals(klazz)) ? javaClassName : klazz), variable);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param klazz may be <code>null</code> or "this"
|
|
||||||
* @param method
|
|
||||||
* @return
|
|
||||||
* @see nu.validator.htmlparser.cpptranslate.SymbolTable#getMethodReturnType(java.lang.String, java.lang.String)
|
|
||||||
*/
|
|
||||||
public Type getMethodReturnType(String klazz, String method) {
|
|
||||||
return delegate.getMethodReturnType(((klazz == null || "this".equals(klazz)) ? javaClassName : klazz), method);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,137 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import japa.parser.JavaParser;
|
|
||||||
import japa.parser.ParseException;
|
|
||||||
import japa.parser.ast.CompilationUnit;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
|
|
||||||
static final String[] H_LIST = {
|
|
||||||
"Tokenizer",
|
|
||||||
"TreeBuilder",
|
|
||||||
"MetaScanner",
|
|
||||||
"AttributeName",
|
|
||||||
"ElementName",
|
|
||||||
"HtmlAttributes",
|
|
||||||
"StackNode",
|
|
||||||
"UTF16Buffer",
|
|
||||||
"StateSnapshot",
|
|
||||||
"Portability",
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final String[] CPP_LIST = {
|
|
||||||
"Tokenizer",
|
|
||||||
"TreeBuilder",
|
|
||||||
"MetaScanner",
|
|
||||||
"AttributeName",
|
|
||||||
"ElementName",
|
|
||||||
"HtmlAttributes",
|
|
||||||
"StackNode",
|
|
||||||
"UTF16Buffer",
|
|
||||||
"StateSnapshot",
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param args
|
|
||||||
* @throws ParseException
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public static void main(String[] args) throws ParseException, IOException {
|
|
||||||
CppTypes cppTypes = new CppTypes(new File(args[2]));
|
|
||||||
SymbolTable symbolTable = new SymbolTable();
|
|
||||||
|
|
||||||
File javaDirectory = new File(args[0]);
|
|
||||||
File targetDirectory = new File(args[1]);
|
|
||||||
File cppDirectory = targetDirectory;
|
|
||||||
File javaCopyDirectory = new File(targetDirectory, "javasrc");
|
|
||||||
|
|
||||||
for (int i = 0; i < H_LIST.length; i++) {
|
|
||||||
parseFile(cppTypes, javaDirectory, cppDirectory, H_LIST[i], ".h", new HVisitor(cppTypes, symbolTable));
|
|
||||||
// copyFile(new File(javaDirectory, H_LIST[i] + ".java"), new File(javaCopyDirectory, H_LIST[i] + ".java"));
|
|
||||||
}
|
|
||||||
for (int i = 0; i < CPP_LIST.length; i++) {
|
|
||||||
parseFile(cppTypes, javaDirectory, cppDirectory, CPP_LIST[i], ".cpp", new CppVisitor(cppTypes, symbolTable));
|
|
||||||
}
|
|
||||||
cppTypes.finished();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void copyFile(File input, File output) throws IOException {
|
|
||||||
if (input.getCanonicalFile().equals(output.getCanonicalFile())) {
|
|
||||||
return; // files are the same!
|
|
||||||
}
|
|
||||||
// This is horribly inefficient, but perf is not really much of a concern here.
|
|
||||||
FileInputStream in = new FileInputStream(input);
|
|
||||||
FileOutputStream out = new FileOutputStream(output);
|
|
||||||
int b;
|
|
||||||
while ((b = in.read()) != -1) {
|
|
||||||
out.write(b);
|
|
||||||
}
|
|
||||||
out.flush();
|
|
||||||
out.close();
|
|
||||||
in.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void parseFile(CppTypes cppTypes, File javaDirectory, File cppDirectory, String className, String fne, CppVisitor visitor) throws ParseException,
|
|
||||||
FileNotFoundException, UnsupportedEncodingException, IOException {
|
|
||||||
File file = new File(javaDirectory, className + ".java");
|
|
||||||
String license = new LicenseExtractor(file).extract();
|
|
||||||
CompilationUnit cu = JavaParser.parse(new NoCppInputStream(new FileInputStream(file)), "utf-8");
|
|
||||||
LabelVisitor labelVisitor = new LabelVisitor();
|
|
||||||
cu.accept(labelVisitor, null);
|
|
||||||
visitor.setLabels(labelVisitor.getLabels());
|
|
||||||
cu.accept(visitor, null);
|
|
||||||
FileOutputStream out = new FileOutputStream(new File(cppDirectory, cppTypes.classPrefix() + className + fne));
|
|
||||||
OutputStreamWriter w = new OutputStreamWriter(out, "utf-8");
|
|
||||||
w.write(license);
|
|
||||||
w.write("\n\n/*\n * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.\n * Please edit " + className + ".java instead and regenerate.\n */\n\n");
|
|
||||||
w.write(visitor.getSource());
|
|
||||||
w.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
public class NoCppInputStream extends InputStream {
|
|
||||||
|
|
||||||
private final static char[] START = "[NOCPP[".toCharArray();
|
|
||||||
|
|
||||||
private final static char[] END = "]NOCPP]".toCharArray();
|
|
||||||
|
|
||||||
private int state;
|
|
||||||
|
|
||||||
private final InputStream delegate;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param delegate
|
|
||||||
*/
|
|
||||||
public NoCppInputStream(InputStream delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
this.state = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public int read() throws IOException {
|
|
||||||
int c;
|
|
||||||
if (state == START.length) {
|
|
||||||
int endState = 0;
|
|
||||||
while (endState != END.length) {
|
|
||||||
c = delegate.read();
|
|
||||||
if (END[endState] == c) {
|
|
||||||
endState++;
|
|
||||||
} else {
|
|
||||||
endState = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
state = 0;
|
|
||||||
}
|
|
||||||
c = delegate.read();
|
|
||||||
if (START[state] == c) {
|
|
||||||
state++;
|
|
||||||
} else {
|
|
||||||
state = 0;
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class StringLiteralParser {
|
|
||||||
|
|
||||||
private static final Pattern STRING_DECL = Pattern.compile("^.*\\(([^ ]+) = new nsString\\(\\)\\)->Assign\\(NS_LITERAL_STRING\\(\"([^\"]*)\"\\)\\);.*$");
|
|
||||||
|
|
||||||
private final BufferedReader reader;
|
|
||||||
|
|
||||||
public StringLiteralParser(Reader reader) {
|
|
||||||
this.reader = new BufferedReader(reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> parse() throws IOException {
|
|
||||||
Map<String, String> map = new HashMap<String, String>();
|
|
||||||
String line;
|
|
||||||
while((line = reader.readLine()) != null) {
|
|
||||||
Matcher m = STRING_DECL.matcher(line);
|
|
||||||
if (m.matches()) {
|
|
||||||
map.put(m.group(2), m.group(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
public class StringPair {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param first
|
|
||||||
* @param second
|
|
||||||
*/
|
|
||||||
public StringPair(String first, String second) {
|
|
||||||
this.first = first;
|
|
||||||
this.second = second;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String first;
|
|
||||||
|
|
||||||
private final String second;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see java.lang.Object#equals(java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override public boolean equals(Object o) {
|
|
||||||
if (o instanceof StringPair) {
|
|
||||||
StringPair other = (StringPair) o;
|
|
||||||
return first.equals(other.first) && second.equals(other.second);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see java.lang.Object#hashCode()
|
|
||||||
*/
|
|
||||||
@Override public int hashCode() {
|
|
||||||
return first.hashCode() ^ second.hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class SymbolTable {
|
|
||||||
|
|
||||||
public final Map<String, String> cppDefinesByJavaNames = new HashMap<String, String>();
|
|
||||||
|
|
||||||
private final Map<StringPair, Type> fields = new HashMap<StringPair, Type>();
|
|
||||||
|
|
||||||
private final Map<StringPair, Type> methodReturns = new HashMap<StringPair, Type>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a sad hack to work around the fact the there's no real symbol
|
|
||||||
* table yet.
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public boolean isNotAnAttributeOrElementName(String name) {
|
|
||||||
return !("ATTRIBUTE_HASHES".equals(name)
|
|
||||||
|| "ATTRIBUTE_NAMES".equals(name)
|
|
||||||
|| "ELEMENT_HASHES".equals(name)
|
|
||||||
|| "ELEMENT_NAMES".equals(name) || "ALL_NO_NS".equals(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putFieldType(String klazz, String field, Type type) {
|
|
||||||
fields.put(new StringPair(klazz, field), type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putMethodReturnType(String klazz, String method, Type type) {
|
|
||||||
methodReturns.put(new StringPair(klazz, method), type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Type getFieldType(String klazz, String field) {
|
|
||||||
return fields.get(new StringPair(klazz, field));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Type getMethodReturnType(String klazz, String method) {
|
|
||||||
return methodReturns.get(new StringPair(klazz, method));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
import japa.parser.ast.body.ClassOrInterfaceDeclaration;
|
|
||||||
import japa.parser.ast.body.FieldDeclaration;
|
|
||||||
import japa.parser.ast.body.MethodDeclaration;
|
|
||||||
|
|
||||||
public class SymbolTableVisitor extends AnnotationHelperVisitor<SymbolTable> {
|
|
||||||
|
|
||||||
private String javaClassName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.body.FieldDeclaration, java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override public void visit(FieldDeclaration n, SymbolTable arg) {
|
|
||||||
currentAnnotations = n.getAnnotations();
|
|
||||||
arg.putFieldType(javaClassName, n.getVariables().get(0).getId().getName(), convertType(n.getType(), n.getModifiers()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.body.MethodDeclaration, java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override public void visit(MethodDeclaration n, SymbolTable arg) {
|
|
||||||
currentAnnotations = n.getAnnotations();
|
|
||||||
arg.putMethodReturnType(javaClassName, n.getName(), convertType(n.getType(), n.getModifiers()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see japa.parser.ast.visitor.VoidVisitorAdapter#visit(japa.parser.ast.body.ClassOrInterfaceDeclaration, java.lang.Object)
|
|
||||||
*/
|
|
||||||
@Override public void visit(ClassOrInterfaceDeclaration n, SymbolTable arg) {
|
|
||||||
javaClassName = n.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,99 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.cpptranslate;
|
|
||||||
|
|
||||||
public class Type {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param type
|
|
||||||
* @param arrayCount
|
|
||||||
* @param noLength
|
|
||||||
* @param modifiers
|
|
||||||
*/
|
|
||||||
public Type(String type, int arrayCount, boolean noLength, int modifiers) {
|
|
||||||
this.type = type;
|
|
||||||
this.arrayCount = arrayCount;
|
|
||||||
this.noLength = noLength;
|
|
||||||
this.modifiers = modifiers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String type;
|
|
||||||
|
|
||||||
private final int arrayCount;
|
|
||||||
|
|
||||||
private final boolean noLength;
|
|
||||||
|
|
||||||
private final int modifiers;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the type.
|
|
||||||
*
|
|
||||||
* @return the type
|
|
||||||
*/
|
|
||||||
public String getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the arrayCount.
|
|
||||||
*
|
|
||||||
* @return the arrayCount
|
|
||||||
*/
|
|
||||||
public int getArrayCount() {
|
|
||||||
return arrayCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the noLength.
|
|
||||||
*
|
|
||||||
* @return the noLength
|
|
||||||
*/
|
|
||||||
public boolean isNoLength() {
|
|
||||||
return noLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the modifiers.
|
|
||||||
*
|
|
||||||
* @return the modifiers
|
|
||||||
*/
|
|
||||||
public int getModifiers() {
|
|
||||||
return modifiers;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,109 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2008 Mozilla Foundation
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
|
||||||
* to deal in the Software without restriction, including without limitation
|
|
||||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
* and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
* Software is furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
* DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.generator;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class GenerateNamedCharacters {
|
|
||||||
|
|
||||||
private static final int LEAD_OFFSET = 0xD800 - (0x10000 >> 10);
|
|
||||||
|
|
||||||
private static final Pattern LINE_PATTERN = Pattern.compile("^\\s*<tr> <td> <code title=\"\">([^<]*)</code> </td> <td> U\\+(\\S*) </td> </tr>.*$");
|
|
||||||
|
|
||||||
private static String toUString(int c) {
|
|
||||||
String hexString = Integer.toHexString(c);
|
|
||||||
switch (hexString.length()) {
|
|
||||||
case 1:
|
|
||||||
return "\\u000" + hexString;
|
|
||||||
case 2:
|
|
||||||
return "\\u00" + hexString;
|
|
||||||
case 3:
|
|
||||||
return "\\u0" + hexString;
|
|
||||||
case 4:
|
|
||||||
return "\\u" + hexString;
|
|
||||||
default:
|
|
||||||
throw new RuntimeException("Unreachable.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param args
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public static void main(String[] args) throws IOException {
|
|
||||||
TreeMap<String, String> entities = new TreeMap<String, String>();
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, "utf-8"));
|
|
||||||
String line;
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
Matcher m = LINE_PATTERN.matcher(line);
|
|
||||||
if (m.matches()) {
|
|
||||||
entities.put(m.group(1), m.group(2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println("static final char[][] NAMES = {");
|
|
||||||
for (Map.Entry<String, String> entity : entities.entrySet()) {
|
|
||||||
String name = entity.getKey();
|
|
||||||
System.out.print("\"");
|
|
||||||
System.out.print(name);
|
|
||||||
System.out.println("\".toCharArray(),");
|
|
||||||
}
|
|
||||||
System.out.println("};");
|
|
||||||
|
|
||||||
System.out.println("static final @NoLength char[][] VALUES = {");
|
|
||||||
for (Map.Entry<String, String> entity : entities.entrySet()) {
|
|
||||||
String value = entity.getValue();
|
|
||||||
int intVal = Integer.parseInt(value, 16);
|
|
||||||
System.out.print("{");
|
|
||||||
if (intVal == '\'') {
|
|
||||||
System.out.print("\'\\\'\'");
|
|
||||||
} else if (intVal == '\n') {
|
|
||||||
System.out.print("\'\\n\'");
|
|
||||||
} else if (intVal == '\\') {
|
|
||||||
System.out.print("\'\\\\\'");
|
|
||||||
} else if (intVal <= 0xFFFF) {
|
|
||||||
System.out.print("\'");
|
|
||||||
System.out.print(toUString(intVal));
|
|
||||||
System.out.print("\'");
|
|
||||||
} else {
|
|
||||||
int hi = (LEAD_OFFSET + (intVal >> 10));
|
|
||||||
int lo = (0xDC00 + (intVal & 0x3FF));
|
|
||||||
System.out.print("\'");
|
|
||||||
System.out.print(toUString(hi));
|
|
||||||
System.out.print("\', \'");
|
|
||||||
System.out.print(toUString(lo));
|
|
||||||
System.out.print("\'");
|
|
||||||
}
|
|
||||||
System.out.println("},");
|
|
||||||
}
|
|
||||||
System.out.println("};");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,360 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
* http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is HTML Parser C++ Translator code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Mozilla Foundation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Henri Sivonen <hsivonen@iki.fi>
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
||||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
package nu.validator.htmlparser.generator;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import nu.validator.htmlparser.cpptranslate.CppTypes;
|
|
||||||
|
|
||||||
public class GenerateNamedCharactersCpp {
|
|
||||||
|
|
||||||
private static final int LEAD_OFFSET = 0xD800 - (0x10000 >> 10);
|
|
||||||
|
|
||||||
private static final Pattern LINE_PATTERN = Pattern.compile("<td> <code title=\"\">([^<]*)</code> </td> <td> U\\+(\\S*) </td>");
|
|
||||||
|
|
||||||
private static String toHexString(int c) {
|
|
||||||
String hexString = Integer.toHexString(c);
|
|
||||||
switch (hexString.length()) {
|
|
||||||
case 1:
|
|
||||||
return "0x000" + hexString;
|
|
||||||
case 2:
|
|
||||||
return "0x00" + hexString;
|
|
||||||
case 3:
|
|
||||||
return "0x0" + hexString;
|
|
||||||
case 4:
|
|
||||||
return "0x" + hexString;
|
|
||||||
default:
|
|
||||||
throw new RuntimeException("Unreachable.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param args
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public static void main(String[] args) throws IOException {
|
|
||||||
TreeMap<String, String> entities = new TreeMap<String, String>();
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(
|
|
||||||
new FileInputStream(args[0]), "utf-8"));
|
|
||||||
String line;
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
Matcher m = LINE_PATTERN.matcher(line);
|
|
||||||
while (m.find()) {
|
|
||||||
entities.put(m.group(1), m.group(2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CppTypes cppTypes = new CppTypes(null);
|
|
||||||
File targetDirectory = new File(args[1]);
|
|
||||||
|
|
||||||
generateH(targetDirectory, cppTypes, entities);
|
|
||||||
generateInclude(targetDirectory, cppTypes, entities);
|
|
||||||
generateCpp(targetDirectory, cppTypes, entities);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void generateH(File targetDirectory, CppTypes cppTypes,
|
|
||||||
Map<String, String> entities) throws IOException {
|
|
||||||
File hFile = new File(targetDirectory, cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters.h");
|
|
||||||
Writer out = new OutputStreamWriter(new FileOutputStream(hFile),
|
|
||||||
"utf-8");
|
|
||||||
out.write("#ifndef " + cppTypes.classPrefix() + "NamedCharacters_h__\n");
|
|
||||||
out.write("#define " + cppTypes.classPrefix() + "NamedCharacters_h__\n");
|
|
||||||
out.write('\n');
|
|
||||||
|
|
||||||
String[] includes = cppTypes.namedCharactersIncludes();
|
|
||||||
for (int i = 0; i < includes.length; i++) {
|
|
||||||
String include = includes[i];
|
|
||||||
out.write("#include \"" + include + ".h\"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
out.write('\n');
|
|
||||||
|
|
||||||
out.write("class " + cppTypes.classPrefix() + "NamedCharacters\n");
|
|
||||||
out.write("{\n");
|
|
||||||
out.write(" public:\n");
|
|
||||||
out.write(" static " + cppTypes.arrayTemplate() + "<"
|
|
||||||
+ cppTypes.arrayTemplate() + "<" + cppTypes.charType() + ","
|
|
||||||
+ cppTypes.intType() + ">," + cppTypes.intType() + "> NAMES;\n");
|
|
||||||
out.write(" static " + cppTypes.arrayTemplate() + "<"
|
|
||||||
+ cppTypes.charType() + "," + cppTypes.intType()
|
|
||||||
+ ">* VALUES;\n");
|
|
||||||
out.write(" static " + cppTypes.charType() + "** WINDOWS_1252;\n");
|
|
||||||
out.write(" static void initializeStatics();\n");
|
|
||||||
out.write(" static void releaseStatics();\n");
|
|
||||||
out.write("};\n");
|
|
||||||
|
|
||||||
out.write("\n#endif // " + cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters_h__\n");
|
|
||||||
out.flush();
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void generateInclude(File targetDirectory, CppTypes cppTypes,
|
|
||||||
Map<String, String> entities)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
File includeFile = new File(targetDirectory, cppTypes.classPrefix()
|
|
||||||
+ "NamedCharactersInclude.h");
|
|
||||||
Writer out = new OutputStreamWriter(new FileOutputStream(includeFile),
|
|
||||||
"utf-8");
|
|
||||||
|
|
||||||
out.write("/* Data generated from the table of named character references found at\n");
|
|
||||||
out.write(" *\n");
|
|
||||||
out.write(" * http://www.w3.org/TR/html5/named-character-references.html\n");
|
|
||||||
out.write(" *\n");
|
|
||||||
out.write(" * Files that #include this file must #define NAMED_CHARACTER_REFERENCE as a\n");
|
|
||||||
out.write(" * macro of five parameters:\n");
|
|
||||||
out.write(" *\n");
|
|
||||||
out.write(" * 1. a unique integer N identifying the Nth [0,1,..] macro expansion in this file,\n");
|
|
||||||
out.write(" * 2. a comma-separated sequence of characters comprising the character name,\n");
|
|
||||||
out.write(" * 3. the length of this sequence of characters,\n");
|
|
||||||
out.write(" * 4. a comma-separated sequence of PRUnichar literals (high to low) corresponding\n");
|
|
||||||
out.write(" * to the code-point of the named character, and\n");
|
|
||||||
out.write(" * 5. the length of this sequence of literals (either 1 or 2).\n");
|
|
||||||
out.write(" *\n");
|
|
||||||
out.write(" * The macro expansion doesn't have to refer to all or any of these parameters,\n");
|
|
||||||
out.write(" * but common sense dictates that it should involve at least one of them.\n");
|
|
||||||
out.write(" */\n");
|
|
||||||
out.write("\n");
|
|
||||||
out.write("// This #define allows the NAMED_CHARACTER_REFERENCE macro to accept comma-\n");
|
|
||||||
out.write("// separated sequences as single macro arguments. Using commas directly would\n");
|
|
||||||
out.write("// split the sequence into multiple macro arguments.\n");
|
|
||||||
out.write("#define _ ,\n");
|
|
||||||
out.write("\n");
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
for (Map.Entry<String, String> entity : entities.entrySet()) {
|
|
||||||
out.write("NAMED_CHARACTER_REFERENCE(" + i++ + ", ");
|
|
||||||
writeNameInitializer(out, entity, " _ ");
|
|
||||||
out.write(", " + entity.getKey().length() + ", ");
|
|
||||||
writeValueInitializer(out, entity, " _ ");
|
|
||||||
int numBytes = (Integer.parseInt(entity.getValue(), 16) <= 0xFFFF) ? 1 : 2;
|
|
||||||
out.write(", " + numBytes + ")\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
out.write("\n");
|
|
||||||
out.write("#undef _\n");
|
|
||||||
|
|
||||||
out.flush();
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void writeNameInitializer(Writer out,
|
|
||||||
Map.Entry<String, String> entity,
|
|
||||||
String separator)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
String name = entity.getKey();
|
|
||||||
for (int i = 0; i < name.length(); i++) {
|
|
||||||
out.write("'" + name.charAt(i) + "'");
|
|
||||||
if (i < name.length() - 1)
|
|
||||||
out.write(separator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void writeValueInitializer(Writer out,
|
|
||||||
Map.Entry<String, String> entity,
|
|
||||||
String separator)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
int value = Integer.parseInt(entity.getValue(), 16);
|
|
||||||
if (value <= 0xFFFF) {
|
|
||||||
out.write(toHexString(value));
|
|
||||||
} else {
|
|
||||||
int hi = (LEAD_OFFSET + (value >> 10));
|
|
||||||
int lo = (0xDC00 + (value & 0x3FF));
|
|
||||||
out.write(toHexString(hi));
|
|
||||||
out.write(separator);
|
|
||||||
out.write(toHexString(lo));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void defineMacroAndInclude(Writer out, String expansion,
|
|
||||||
String includeFile)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
out.write("\n#define NAMED_CHARACTER_REFERENCE(N, CHARS, LEN, VALUE, SIZE) \\\n" +
|
|
||||||
expansion + "\n");
|
|
||||||
out.write("#include \"" + includeFile + "\"\n");
|
|
||||||
out.write("#undef NAMED_CHARACTER_REFERENCE\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void writeStaticMemberDeclaration(Writer out,
|
|
||||||
CppTypes cppTypes, String type, String name)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
out.write(type + " " + cppTypes.classPrefix() + "NamedCharacters::"
|
|
||||||
+ name + ";\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void generateCpp(File targetDirectory, CppTypes cppTypes,
|
|
||||||
Map<String, String> entities) throws IOException {
|
|
||||||
File hFile = new File(targetDirectory, cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters.cpp");
|
|
||||||
Writer out = new OutputStreamWriter(new FileOutputStream(hFile),
|
|
||||||
"utf-8");
|
|
||||||
|
|
||||||
out.write("#define " + cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters_cpp__\n");
|
|
||||||
|
|
||||||
String[] includes = cppTypes.namedCharactersIncludes();
|
|
||||||
for (int i = 0; i < includes.length; i++) {
|
|
||||||
String include = includes[i];
|
|
||||||
out.write("#include \"" + include + ".h\"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
out.write('\n');
|
|
||||||
out.write("#include \"" + cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters.h\"\n");
|
|
||||||
out.write("\n");
|
|
||||||
|
|
||||||
String staticMemberType = cppTypes.arrayTemplate() + "<"
|
|
||||||
+ cppTypes.arrayTemplate() + "<" + cppTypes.charType() + ","
|
|
||||||
+ cppTypes.intType() + ">," + cppTypes.intType() + ">";
|
|
||||||
writeStaticMemberDeclaration(out, cppTypes, staticMemberType, "NAMES");
|
|
||||||
|
|
||||||
staticMemberType = cppTypes.arrayTemplate() + "<"
|
|
||||||
+ cppTypes.charType() + "," + cppTypes.intType() + ">*";
|
|
||||||
writeStaticMemberDeclaration(out, cppTypes, staticMemberType, "VALUES");
|
|
||||||
|
|
||||||
staticMemberType = cppTypes.charType() + "**";
|
|
||||||
writeStaticMemberDeclaration(out, cppTypes, staticMemberType, "WINDOWS_1252");
|
|
||||||
|
|
||||||
out.write("static " + cppTypes.charType() + " const WINDOWS_1252_DATA[] = {\n");
|
|
||||||
out.write(" 0x20AC,\n");
|
|
||||||
out.write(" 0xFFFD,\n");
|
|
||||||
out.write(" 0x201A,\n");
|
|
||||||
out.write(" 0x0192,\n");
|
|
||||||
out.write(" 0x201E,\n");
|
|
||||||
out.write(" 0x2026,\n");
|
|
||||||
out.write(" 0x2020,\n");
|
|
||||||
out.write(" 0x2021,\n");
|
|
||||||
out.write(" 0x02C6,\n");
|
|
||||||
out.write(" 0x2030,\n");
|
|
||||||
out.write(" 0x0160,\n");
|
|
||||||
out.write(" 0x2039,\n");
|
|
||||||
out.write(" 0x0152,\n");
|
|
||||||
out.write(" 0xFFFD,\n");
|
|
||||||
out.write(" 0x017D,\n");
|
|
||||||
out.write(" 0xFFFD,\n");
|
|
||||||
out.write(" 0xFFFD,\n");
|
|
||||||
out.write(" 0x2018,\n");
|
|
||||||
out.write(" 0x2019,\n");
|
|
||||||
out.write(" 0x201C,\n");
|
|
||||||
out.write(" 0x201D,\n");
|
|
||||||
out.write(" 0x2022,\n");
|
|
||||||
out.write(" 0x2013,\n");
|
|
||||||
out.write(" 0x2014,\n");
|
|
||||||
out.write(" 0x02DC,\n");
|
|
||||||
out.write(" 0x2122,\n");
|
|
||||||
out.write(" 0x0161,\n");
|
|
||||||
out.write(" 0x203A,\n");
|
|
||||||
out.write(" 0x0153,\n");
|
|
||||||
out.write(" 0xFFFD,\n");
|
|
||||||
out.write(" 0x017E,\n");
|
|
||||||
out.write(" 0x0178\n");
|
|
||||||
out.write("};\n");
|
|
||||||
|
|
||||||
String includeFile = cppTypes.classPrefix() + "NamedCharactersInclude.h";
|
|
||||||
defineMacroAndInclude(out,
|
|
||||||
"static PRUnichar const NAME_##N[] = { CHARS };",
|
|
||||||
includeFile);
|
|
||||||
defineMacroAndInclude(out,
|
|
||||||
"static PRUnichar const VALUE_##N[] = { VALUE };",
|
|
||||||
includeFile);
|
|
||||||
|
|
||||||
out.write("\n// XXX bug 501082: for some reason, msvc takes forever to optimize this function\n");
|
|
||||||
out.write("#ifdef _MSC_VER\n");
|
|
||||||
out.write("#pragma optimize(\"\", off)\n");
|
|
||||||
out.write("#endif\n\n");
|
|
||||||
|
|
||||||
out.write("void\n");
|
|
||||||
out.write(cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters::initializeStatics()\n");
|
|
||||||
out.write("{\n");
|
|
||||||
out.write(" NAMES = " + cppTypes.arrayTemplate() + "<"
|
|
||||||
+ cppTypes.arrayTemplate() + "<" + cppTypes.charType() + ","
|
|
||||||
+ cppTypes.intType() + ">," + cppTypes.intType() + ">("
|
|
||||||
+ entities.size() + ");\n");
|
|
||||||
defineMacroAndInclude(out,
|
|
||||||
" NAMES[N] = jArray<PRUnichar,PRInt32>((PRUnichar*)NAME_##N, LEN);",
|
|
||||||
includeFile);
|
|
||||||
|
|
||||||
out.write("\n VALUES = new " + cppTypes.arrayTemplate() + "<"
|
|
||||||
+ cppTypes.charType() + "," + cppTypes.intType() + ">["
|
|
||||||
+ entities.size() + "];\n");
|
|
||||||
defineMacroAndInclude(out,
|
|
||||||
" VALUES[N] = jArray<PRUnichar,PRInt32>((PRUnichar*)VALUE_##N, SIZE);",
|
|
||||||
includeFile);
|
|
||||||
|
|
||||||
out.write("\n");
|
|
||||||
out.write(" WINDOWS_1252 = new " + cppTypes.charType() + "*[32];\n");
|
|
||||||
out.write(" for (" + cppTypes.intType() + " i = 0; i < 32; ++i) {\n");
|
|
||||||
out.write(" WINDOWS_1252[i] = (" + cppTypes.charType() + "*)&(WINDOWS_1252_DATA[i]);\n");
|
|
||||||
out.write(" }\n");
|
|
||||||
out.write("}\n");
|
|
||||||
out.write("\n");
|
|
||||||
|
|
||||||
out.write("#ifdef _MSC_VER\n");
|
|
||||||
out.write("#pragma optimize(\"\", on)\n");
|
|
||||||
out.write("#endif\n\n");
|
|
||||||
|
|
||||||
out.write("void\n");
|
|
||||||
out.write(cppTypes.classPrefix()
|
|
||||||
+ "NamedCharacters::releaseStatics()\n");
|
|
||||||
out.write("{\n");
|
|
||||||
out.write(" NAMES.release();\n");
|
|
||||||
out.write(" delete[] VALUES;\n");
|
|
||||||
out.write(" delete[] WINDOWS_1252;\n");
|
|
||||||
out.write("}\n");
|
|
||||||
out.flush();
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче