qse/ase/java/AseAwk.java
2008-06-10 03:29:00 +00:00

746 lines
14 KiB
Java

/*
* $Id: AseAwk.java,v 1.16 2007/10/24 03:46:51 bacon Exp $
*/
import java.awt.*;
import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.Reader;
import java.io.Writer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Iterator;
import java.net.URL;
import ase.awk.StdAwk;
import ase.awk.Console;
import ase.awk.Context;
import ase.awk.Argument;
import ase.awk.Return;
public class AseAwk extends StdAwk
{
private static void run_in_awt ()
{
final Frame frame = new Frame ();
frame.setLayout (new BorderLayout());
frame.setTitle (AseAwk.class.getName());
frame.setSize (640, 480);
frame.addWindowListener (new WindowListener ()
{
public void windowActivated (WindowEvent e) {}
public void windowClosed (WindowEvent e) {}
public void windowClosing (WindowEvent e) { frame.dispose (); }
public void windowDeactivated (WindowEvent e) {}
public void windowDeiconified (WindowEvent e) {}
public void windowIconified (WindowEvent e) {}
public void windowOpened (WindowEvent e) {}
});
frame.add (new AseAwkPanel(), BorderLayout.CENTER);
frame.setVisible (true);
}
private static void print_usage ()
{
System.out.print ("Usage: ");
System.out.print (AseAwk.class.getName());
System.out.println (" [-m main] [-si file]? [-so file]? [-ci file]* [-co file]* [-a arg]* [-w o:n]*");
System.out.println (" -m main Specify the main function name");
System.out.println (" -si file Specify the input source file");
System.out.println (" The source code is read from stdin when it is not specified");
System.out.println (" -so file Specify the output source file");
System.out.println (" The deparsed code is not output when is it not specified");
System.out.println (" -ci file Specify the input console file");
System.out.println (" -co file Specify the output console file");
System.out.println (" -a str Specify an argument");
System.out.println (" -w o:n Specify an old and new word pair");
System.out.println (" o - an original word");
System.out.println (" n - the new word to replace the original word");
}
private static void print_error (String msg)
{
System.out.print ("Error: ");
System.out.println (msg);
}
private static String get_dll_name ()
{
URL url = AseAwk.class.getResource (
AseAwk.class.getName() + ".class");
if (url == null)
{
// probably it is compiled with gcj
// TODO: ....
String osname = System.getProperty ("os.name").toLowerCase();
String aseBase = "..";
String path;
if (osname.startsWith ("windows"))
{
path = aseBase + "\\lib\\aseawk_jni.dll";
}
else if (osname.startsWith ("mac"))
{
path = aseBase + "/lib/.libs/libaseawk_jni.dylib";
}
else
{
path = aseBase + "/lib/.libs/libaseawk_jni.so";
}
return path;
}
else
{
java.io.File file = new java.io.File (url.getFile());
String osname = System.getProperty ("os.name").toLowerCase();
String aseBase = file.getParentFile().getParentFile().getParent();
String path;
if (osname.startsWith ("windows"))
{
path = aseBase + "\\lib\\aseawk_jni.dll";
return path.substring(6);
}
else if (osname.startsWith ("mac"))
{
path = aseBase + "/lib/.libs/libaseawk_jni.dylib";
return path.substring(5);
}
else
{
path = aseBase + "/lib/.libs/libaseawk_jni.so";
return path.substring(5);
}
}
}
private static void run_in_console (String[] args)
{
AseAwk awk = null;
String dll = get_dll_name();
try
{
System.load (dll);
}
catch (java.lang.UnsatisfiedLinkError e)
{
print_error ("cannot load the library - " + dll);
return;
}
try
{
awk = new AseAwk ();
awk.setMaxDepth (AseAwk.DEPTH_BLOCK_PARSE, 30);
awk.setDebug (true);
//awk.setDebug (false);
}
catch (ase.awk.Exception e)
{
print_error ("ase.awk.Exception - " + e.getMessage());
}
int mode = 0;
String mainfn = null;
String srcin = null;
String srcout = null;
int nsrcins = 0;
int nsrcouts = 0;
//ArrayList<String> params = new ArrayList<String> ();
ArrayList params = new ArrayList ();
//for (String arg: args)
for (int i = 0; i < args.length; i++)
{
String arg = args[i];
if (mode == 0)
{
if (arg.equals("-si")) mode = 1;
else if (arg.equals("-so")) mode = 2;
else if (arg.equals("-ci")) mode = 3;
else if (arg.equals("-co")) mode = 4;
else if (arg.equals("-a")) mode = 5;
else if (arg.equals("-m")) mode = 6;
else if (arg.equals("-w")) mode = 7;
else
{
print_usage ();
return;
}
}
else
{
if (arg.length() >= 1 && arg.charAt(0) == '-')
{
print_usage ();
return;
}
if (mode == 1) // source input
{
if (nsrcins != 0)
{
print_usage ();
return;
}
srcin = arg;
nsrcins++;
mode = 0;
}
else if (mode == 2) // source output
{
if (nsrcouts != 0)
{
print_usage ();
return;
}
srcout = arg;
nsrcouts++;
mode = 0;
}
else if (mode == 3) // console input
{
awk.addConsoleInput (arg);
mode = 0;
}
else if (mode == 4) // console output
{
awk.addConsoleOutput (arg);
mode = 0;
}
else if (mode == 5) // argument mode
{
params.add (arg);
mode = 0;
}
else if (mode == 6)
{
if (mainfn != null)
{
print_usage ();
return;
}
mainfn = arg;
mode = 0;
}
else if (mode == 7)
{
int idx = arg.indexOf(':');
if (idx == -1)
{
print_usage ();
return;
}
String ow = arg.substring (0, idx);
String nw = arg.substring (idx+1);
try { awk.setWord (ow, nw); }
catch (Exception e) {/* don't care */}
mode = 0;
}
}
}
if (mode != 0)
{
print_usage ();
return;
}
try
{
awk.parse (srcin, srcout);
//awk.run (mainfn, params.toArray(new String[0]));
awk.run (mainfn, (String[])params.toArray(new String[0]));
}
catch (ase.awk.Exception e)
{
if (e.getLine() == 0)
{
print_error ("ase.awk.Exception - " + e.getMessage());
}
else
{
print_error (
"ase.awk.Exception at line " +
e.getLine() + " - " + e.getMessage());
}
}
finally
{
if (awk != null)
{
awk.close ();
awk = null;
}
}
}
public static void main (String[] args)
{
if (args.length == 0)
{
run_in_awt ();
}
else
{
run_in_console (args);
}
}
private Reader srcReader;
private Writer srcWriter;
private String srcInName;
private String srcOutName;
private LinkedList conInNames;
private LinkedList conOutNames;
private Iterator conInIter;
private Iterator conOutIter;
public AseAwk () throws ase.awk.Exception
{
super ();
srcReader = null;
srcWriter = null;
srcInName = null;
srcOutName = null;
conInNames = new LinkedList ();
conOutNames = new LinkedList ();
addFunction ("sleep", 1, 1);
}
public void sleep (Context ctx, String name, Return ret, Argument[] args) throws ase.awk.Exception
{
try { Thread.sleep (args[0].getIntValue() * 1000); }
catch (InterruptedException e) {}
ret.setIntValue (0);
}
public void parse () throws ase.awk.Exception
{
srcInName = null;
srcOutName = null;
super.parse ();
}
public void parse (String inName) throws ase.awk.Exception
{
srcInName = inName;
srcOutName = null;
super.parse ();
}
public void parse (String inName, String outName) throws ase.awk.Exception
{
srcInName = inName;
srcOutName = outName;
super.parse ();
}
public void run (String main, String[] args) throws ase.awk.Exception
{
conInIter = conInNames.iterator();
conOutIter = conOutNames.iterator();
super.run (main, args);
}
public void addConsoleInput (String name)
{
conInNames.addLast (name);
}
public void addConsoleOutput (String name)
{
conOutNames.addLast (name);
}
protected int openSource (int mode)
{
if (mode == SOURCE_READ)
{
Reader isr;
if (srcInName == null || srcInName.length() == 0)
{
isr = stdin;
}
else
{
FileInputStream fis;
try { fis = new FileInputStream (srcInName); }
catch (IOException e) { return -1; }
isr = new BufferedReader(new InputStreamReader (fis));
}
if (isr == null) return -1;
srcReader = isr;
return 1;
}
else if (mode == SOURCE_WRITE)
{
Writer osw;
if (srcOutName == null)
{
return 0;
}
else if (srcOutName.length() == 0)
{
osw = stdout;
}
else
{
FileOutputStream fos;
try { fos = new FileOutputStream (srcOutName); }
catch (IOException e) { return -1; }
osw = new BufferedWriter(new OutputStreamWriter (fos));
}
srcWriter = osw;
return 1;
}
return -1;
}
protected int closeSource (int mode)
{
if (mode == SOURCE_READ)
{
if (srcReader != null)
{
if (srcReader == stdin)
{
srcReader = null;
}
else
{
try
{
srcReader.close ();
srcReader = null;
}
catch (IOException e) { return -1; }
}
}
return 0;
}
else if (mode == SOURCE_WRITE)
{
if (srcWriter != null)
{
if (srcWriter == stdout)
{
try
{
srcWriter.flush ();
srcWriter = null;
}
catch (IOException e) { return -1; }
}
else
{
try
{
srcWriter.close ();
srcWriter = null;
}
catch (IOException e) { return -1; }
}
}
return 0;
}
return -1;
}
protected int readSource (char[] buf, int len)
{
try
{
int n = srcReader.read (buf, 0, len);
if (n == -1) n = 0;
return n;
}
catch (IOException e)
{
return -1;
}
}
protected int writeSource (char[] buf, int len)
{
if (srcWriter == null) return len;
try { srcWriter.write (buf, 0, len); }
catch (IOException e) { return -1; }
return len;
}
protected int openConsole (Console con)
{
int mode = con.getMode ();
if (mode == Console.MODE_READ)
{
Reader rd;
if (!conInIter.hasNext()) rd = stdin;
else
{
FileInputStream fis;
String fn = (String)conInIter.next();
try
{
fis = new FileInputStream (fn);
rd = new BufferedReader(
new InputStreamReader (fis));
}
catch (IOException e) { return -1; }
try { con.setFileName (fn); }
catch (ase.awk.Exception e)
{
try { rd.close(); }
catch (IOException e2) {}
return -1;
}
}
con.setHandle (rd);
return 1;
}
else if (mode == Console.MODE_WRITE)
{
Writer wr;
if (!conOutIter.hasNext()) wr = stdout;
else
{
FileOutputStream fos;
String fn = (String)conOutIter.next();
try
{
fos = new FileOutputStream (fn);
wr = new BufferedWriter(
new OutputStreamWriter (fos));
}
catch (IOException e) { return -1; }
try { con.setFileName (fn); }
catch (ase.awk.Exception e)
{
try { wr.close(); }
catch (IOException e2) {}
return -1;
}
}
con.setHandle (wr);
return 1;
}
return -1;
}
protected int closeConsole (Console con)
{
int mode = con.getMode ();
if (mode == Console.MODE_READ)
{
Reader rd = (Reader)con.getHandle();
if (rd != null && rd != stdin)
{
try { rd.close (); }
catch (IOException e) { return -1; }
}
return 0;
}
else if (mode == Console.MODE_WRITE)
{
Writer wr = (Writer)con.getHandle();
if (wr != null)
{
try
{
wr.flush ();
if (wr != stdout) wr.close ();
}
catch (IOException e) { return -1; }
}
return 0;
}
return -1;
}
protected int readConsole (Console con, char[] buf, int len)
{
int mode = con.getMode ();
if (mode == Console.MODE_READ)
{
Reader rd = (Reader)con.getHandle();
try
{
int n = rd.read (buf, 0, len);
if (n == -1) n = 0;
return n;
}
catch (IOException e) { return -1; }
}
return -1;
}
protected int writeConsole (Console con, char[] buf, int len)
{
int mode = con.getMode ();
if (mode == Console.MODE_WRITE)
{
Writer wr = (Writer)con.getHandle();
try
{
wr.write (buf, 0, len);
wr.flush ();
}
catch (IOException e) { return -1; }
return len;
}
return -1;
}
protected int flushConsole (Console con)
{
int mode = con.getMode ();
if (mode == Console.MODE_WRITE)
{
Writer wr = (Writer)con.getHandle();
try { wr.flush (); }
catch (IOException e) { return -1; }
return 0;
}
return -1;
}
protected int nextConsole (Console con)
{
int mode = con.getMode ();
if (mode == Console.MODE_READ)
{
if (!conInIter.hasNext()) return 0;
String fn = (String)conInIter.next();
Reader rd;
FileInputStream fis;
try
{
fis = new FileInputStream (fn);
rd = new BufferedReader(
new InputStreamReader (fis));
}
catch (IOException e) { return -1; }
try { con.setFileName (fn); }
catch (ase.awk.Exception e)
{
try { rd.close(); }
catch (IOException e2) {}
return -1;
}
Reader tmp = (Reader)con.getHandle();
if (tmp != stdin)
{
try { tmp.close (); }
catch (IOException e)
{
try { rd.close (); }
catch (IOException e2) {}
return -1;
}
}
con.setHandle (rd);
return 1;
}
else if (mode == Console.MODE_WRITE)
{
if (!conOutIter.hasNext()) return 0;
String fn = (String)conOutIter.next();
Writer wr;
FileOutputStream fos;
try
{
fos = new FileOutputStream (fn);
wr = new BufferedWriter(
new OutputStreamWriter (fos));
}
catch (IOException e) { return -1; }
try { con.setFileName (fn); }
catch (ase.awk.Exception e)
{
try { wr.close(); }
catch (IOException e2) {}
return -1;
}
Writer tmp = (Writer)con.getHandle();
if (tmp != stdout)
{
try { tmp.close (); }
catch (IOException e)
{
try { wr.close (); }
catch (IOException e2) {}
return -1;
}
}
con.setHandle (wr);
return 1;
}
return -1;
}
}