/* --- Copyright Jonathan Meyer 1996. All rights reserved. ----------------- > File: jasmin/src/jasmin/Main.java > Purpose: Runs Jasmin, parsing any command line arguments > Author: Jonathan Meyer, 10 July 1996 */ // Modifications Copyright (C) 2004 Ondrej Lhotak package jasmin; import java.io.*; import jas.jasError; /** * Main is the main entry point for Jasmin - it supplies the main() * method, as well as a few other useful odds and ends. */ public class Main { public static void assemble(InputStream in, OutputStream out, boolean number_lines) { ClassFile classFile = new ClassFile(); try { InputStream inp = new BufferedInputStream(in); classFile.readJasmin(inp, "Jasmin", number_lines); inp.close(); // if we got some errors, don't output a file - just return. if (classFile.errorCount() > 0) { System.err.println("Jasmin: Found " + classFile.errorCount() + " errors"); return; } classFile.write(out); out.flush(); } catch (java.io.FileNotFoundException e) { System.err.println("Jasmin: file not found"); System.exit(-1); } catch (jasError e) { classFile.report_error("JAS Error " + e.getMessage()); e.printStackTrace(); } catch (Exception e) { classFile.report_error("Jasmin: exception - <" + e.getClass().getName() + "> " + e.getMessage() + "."); e.printStackTrace(); } if (classFile.errorCount() > 0) { System.err.println("Jasmin: Found " + classFile.errorCount() + " errors"); } } /** * The Jasmin version */ public static final String version = "2.3.0"; /** * Called to assemble a single file. * @param dest_dir is the directory to place the result in. * @param fname is the name of the file containing the Jasmin source code. * @param number_lines is true if you want Jasmin to generate line numbers * automatically, or false if you are generating line numbers yourself. */ public static void assemble(String dest_dir, String fname, boolean number_lines) { File file = new File(fname); File out_file = null; ClassFile classFile = new ClassFile(); try { InputStream inp = new BufferedInputStream(new FileInputStream(fname)); classFile.readJasmin(inp, file.getName(), number_lines); inp.close(); // if we got some errors, don't output a file - just return. if (classFile.errorCount() > 0) { System.err.println(fname + ": Found " + classFile.errorCount() + " errors"); return; } String class_path[] = (ScannerUtils.splitClassField( classFile.getClassName())); String class_name = class_path[1]; // determine where to place this class file if (class_path[0] != null) { String class_dir = ScannerUtils.convertChars( class_path[0], "./", File.separatorChar); if (dest_dir != null) { dest_dir = dest_dir + File.separator + class_dir; } else { dest_dir = class_dir; } } if (dest_dir == null) { out_file = new File(class_name + ".class"); } else { out_file = new File(dest_dir, class_name + ".class"); // check that dest_dir exists File dest = new File(dest_dir); if (!dest.exists()) { dest.mkdirs(); } if (!dest.isDirectory()) { throw new IOException("Cannot create directory"); } } FileOutputStream outp = new FileOutputStream(out_file); classFile.write(outp); outp.close(); // System.out.println("Generated: " + out_file.getPath()); } catch (java.io.FileNotFoundException e) { System.err.println(fname + ": file not found"); System.exit(-1); } catch (jasError e) { classFile.report_error("JAS Error " + e.getMessage()); e.printStackTrace(); } catch (Exception e) { classFile.report_error(fname + ": exception - <" + e.getClass().getName() + "> " + e.getMessage() + "."); e.printStackTrace(); } if (classFile.errorCount() > 0) { System.err.println(fname + ": Found " + classFile.errorCount() + " errors"); } } public static void main(String args[]) { int i; String dest_dir = null; boolean debug = false; String files[] = new String[args.length]; int num_files = 0; if (args.length == 0) { System.err.println("usage: jasmin [-d <directory>] [-version] <file> [<file> ...]"); System.exit(-1); } for (i = 0; i < args.length; i++) { if (args[i].equals("-d")) { dest_dir = args[i + 1]; i++; } else if (args[i].equals("-g")) { debug = true; } else if (args[i].equals("-version")) { System.out.println("Jasmin version: " + version); System.exit(0); } else { files[num_files++] = args[i]; } } for (i = 0; i < num_files; i++) { assemble(dest_dir, files[i], debug); } } }; /* --- Revision History --------------------------------------------------- --- Jonathan Meyer, Mar 1 1997 tidied error reporting, renamed Jasmin->ClassFile --- Jonathan Meyer, Feb 8 1997 added the assemble() method --- Jonathan Meyer, July 24 1996 added -version flag. */