package js.tinyvm;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.ArrayList;
import js.tools.ListReader;
public class GenerateConstants
{
static String iTinyVMHome = System.getProperty("tinyvm.home");
static final String CLASSES = "SpecialClassConstants";
static final String SIGNATURES = "SpecialSignatureConstants";
public static void fatal (String aMsg)
{
System.err.println(aMsg);
System.exit(1);
}
public static String insert_ (String s, String sep)
{
StringBuffer sb = new StringBuffer();
StringTokenizer tokens = new StringTokenizer(s, sep, true);
while (tokens.hasMoreTokens())
{
String token = tokens.nextToken();
if (token.length() == 1 && sep.indexOf(token) != -1)
sb.append("_");
sb.append(token);
}
return sb.toString();
}
public static String hclassName (String aClassName)
{
return aClassName.replace('/', '_').replace('[', 'A').replace(';', ' ').toUpperCase();
}
public static String hsignatureName (String aSig)
{
aSig = insert_(aSig.replace('_', '-'), "-[;/()<>");
return aSig.replace('-', '0').replace('[', '1').replace(';', '2')
.replace('/', '3').replace('(', '4').replace(')', '5').replace('<',
'6').replace('>', '7');
}
public static void generateClassConstants (ArrayList<String> aVec, File aHeaderFile,
File aJavaFile) throws Exception
{
PrintWriter pHeaderOut = new PrintWriter(new FileWriter(aHeaderFile));
PrintWriter pJavaOut = new PrintWriter(new FileWriter(aJavaFile));
pHeaderOut.println("/**");
pHeaderOut.println(" * Machine-generated file. Do not modify.");
pHeaderOut.println(" */");
pHeaderOut.println();
pHeaderOut.println("#ifndef _SPECIALCLASSES_H");
pHeaderOut.println("#define _SPECIALCLASSES_H");
pJavaOut.println("package js.tinyvm;");
pJavaOut.println("/**");
pJavaOut.println(" * Machine-generated file. Do not modify.");
pJavaOut.println(" */");
pJavaOut.println("");
pJavaOut.println("public interface " + CLASSES + " {");
pJavaOut.println(" static final String[] CLASSES = {");
try
{
int pSize = aVec.size();
for (int i = 0; i < pSize; i++)
{
String pClassName = aVec.get(i);
pJavaOut.print(" \"" + pClassName + "\"");
if (i < pSize - 1)
pJavaOut.println(",");
else
pJavaOut.println();
pHeaderOut.println("#define " + hclassName(pClassName) + " " + i);
}
}
finally
{
pJavaOut.println(" };");
pJavaOut.println("}");
pJavaOut.close();
pHeaderOut.println("#endif // _SPECIALCLASSES_H");
pHeaderOut.close();
}
}
public static void generateSignatureConstants (ArrayList<String> aVec,
File aHeaderFile, File aJavaFile) throws Exception
{
PrintWriter pHeaderOut = new PrintWriter(new FileWriter(aHeaderFile));
PrintWriter pJavaOut = new PrintWriter(new FileWriter(aJavaFile));
pHeaderOut.println("/**");
pHeaderOut.println(" * Machine-generated file. Do not modify.");
pHeaderOut.println(" */");
pHeaderOut.println();
pHeaderOut.println("#ifndef _SPECIALSIGNATURES_H");
pHeaderOut.println("#define _SPECIALSIGNATURES_H");
pJavaOut.println("package js.tinyvm;");
pJavaOut.println("/**");
pJavaOut.println(" * Machine-generated file. Do not modify.");
pJavaOut.println(" */");
pJavaOut.println("");
pJavaOut.println("public interface " + SIGNATURES + " {");
pJavaOut.println(" static final String[] SIGNATURES = {");
try
{
int pSize = aVec.size();
for (int i = 0; i < pSize; i++)
{
String pSignature = aVec.get(i);
pJavaOut.print(" \"" + pSignature + "\"");
if (i < pSize - 1)
pJavaOut.println(",");
else
pJavaOut.println();
pHeaderOut.println("#define " + hsignatureName(pSignature) + " "
+ i);
}
}
finally
{
pJavaOut.println(" };");
pJavaOut.println("}");
pJavaOut.close();
pHeaderOut.println("#endif // _SPECIALSIGNATURES_H");
pHeaderOut.close();
}
}
public static void main (String[] aArg) throws Exception
{
if (iTinyVMHome == null)
fatal("Error: Property tinyvm.home undefined");
File pHome = new File(iTinyVMHome);
if (!pHome.exists())
fatal("Error: " + iTinyVMHome + " does not exist.");
if (!pHome.isDirectory())
fatal("Error: " + iTinyVMHome + " is not a directory.");
File pCommon = new File(pHome, "nxtvm/javavm");
File pClasses = new File(pCommon, "classes.db");
File pSignatures = new File(pCommon, "signatures.db");
File pVmSrc = new File(pHome, "nxtvm/javavm");
File pClassIndexH = new File(pVmSrc, "specialclasses.h");
File pSignaturesH = new File(pVmSrc, "specialsignatures.h");
File pTools = new File(pHome, "jtools");
File pToolsJs = new File(pTools, "js");
File pToolsJsTinyVM = new File(pToolsJs, "tinyvm");
File pJavaClass = new File(pToolsJsTinyVM, CLASSES + ".java");
File pJavaSig = new File(pToolsJsTinyVM, SIGNATURES + ".java");
ArrayList<String> pClassVec = ListReader.loadStrings(pClasses);
ArrayList<String> pSignatureVec = ListReader.loadStrings(pSignatures);
// Add a fake entry for the main class
// (Not done since 1.0.0alpha5)
// pClassVec.insertElementAt ("entry/class", 0);
System.out.println("Generating file "+pJavaClass);
System.out.println("and file "+pClassIndexH);
generateClassConstants(pClassVec, pClassIndexH, pJavaClass);
System.out.println("Generating files "+pJavaSig);
System.out.println("and file "+pSignaturesH);
generateSignatureConstants(pSignatureVec, pSignaturesH, pJavaSig);
}
}