package tools;
import java.util.Enumeration;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.TreeSet;
import java.util.Iterator;
import anvil.java.util.Hashlist;
import anvil.java.util.BindingEnumeration;
public class SymbolTool
{
private String _dir;
private Hashlist _symbols = new Hashlist();
private TreeSet _set = new TreeSet();
private int _count = 0;
private boolean _changed = false;
public SymbolTool(String dir) throws IOException
{
_dir = dir;
File file = new File(dir + "/symbols.index");
System.out.println("Index: "+file.getPath());
FileInputStream in = new FileInputStream(file);
LineNumberReader reader = new LineNumberReader(new InputStreamReader(in));
String line;
for(;;) {
line = reader.readLine();
if (line == null) {
break;
}
_symbols.put(line, new Integer(_count++));
_set.add(line);
}
in.close();
System.out.println("Read "+_count+" symbols");
}
public int getIndex(String symbol)
{
Integer index = (Integer)_symbols.get(symbol);
if (index != null) {
return index.intValue();
}
return -1;
}
public int update(String symbol)
{
Integer index = (Integer)_symbols.get(symbol);
if (index == null) {
System.out.println("Added '"+symbol+"' at #"+_count);
_changed = true;
_symbols.put(symbol, new Integer(_count++));
_set.add(symbol);
return _count-1;
}
return index.intValue();
}
public void save() throws IOException
{
if (!_changed) {
System.out.println("No changes.");
return;
}
File file = new File(_dir + "/symbols.index");
System.out.println("Writing "+file.getPath());
PrintStream out = new PrintStream(new FileOutputStream(file));
Enumeration keys = _symbols.keys();
int i= 0;
while(keys.hasMoreElements()) {
String name = keys.nextElement().toString();
out.write(name.getBytes());
out.write('\n');
i++;
}
out.close();
file = new File(_dir + "/Symbols.java");
System.out.println("Writing "+file.getPath());
out = new PrintStream(new FileOutputStream(file));
out.println("/*");
out.println("* $Id: SymbolTool.java,v 1.2 2001/10/26 12:14:47 jkl Exp $");
out.println("*");
out.println("* Copyright 2000 Njet Communications Ltd. All Rights Reserved.");
out.println("*");
out.println("* This software is the proprietary information of Njet Communications Ltd.");
out.println("* Use is subject to license terms.");
out.println("*");
out.println("* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT CHANGE.");
out.println("*/");
out.println("package anvil.core;");
out.println();
out.println("public interface Symbols");
out.println("{");
out.println();
out.println(" public static final Object[][] SYMBOLS =");
out.println(" {");
Iterator iter = _set.iterator();
while(iter.hasNext()) {
String name = iter.next().toString();
out.print(" { \"");
out.print(name);
out.print("\", new Integer(");
out.print(getIndex(name));
out.println(") },");
}
out.println();
out.println(" };");
out.println();
BindingEnumeration enum = _symbols.keysAndElements();
while(enum.hasMoreElements()) {
String name = enum.nextKey().toString();
int index = ((Integer)enum.nextElement()).intValue();
out.print(" public static final int _");
out.print(name);
out.print(' ');
out.print('=');
out.print(' ');
out.print(index);
out.println(';');
}
out.print(" public static final int LAST_INDEX = ");
out.print(_count);
out.println(';');
out.println();
out.println("}");
out.close();
}
public static final void main(String[] args)
{
try {
String dir = args.length>0 ? args[0] : "./";
SymbolTool n = new SymbolTool(dir);
LineNumberReader reader =
new LineNumberReader(new InputStreamReader(System.in));
int count = 0;
for(;;) {
String line = reader.readLine();
if (line == null) {
break;
}
n.update(line.trim());
count++;
}
System.out.println("Processed "+count+" methods");
n.save();
System.out.println();
System.exit(0);
} catch (Throwable t) {
t.printStackTrace();
System.exit(1);
}
}
}