RIDL { (@ static boolean DEBUG = false; static java.util.Hashtable portals; static RIDL ridl; static String version = "0.1"; @) static boolean has_portal(Object obj) (@ return portals.containsKey(obj.toString()); @) static Portal get_portal(Object obj) (@ return (Portal) portals.get(obj.toString()); @) static void complainanddie(String argstr) (@ System.err.println("Usage: java [-outputdir dirname] file.cd file1.ridl file2.ridl ..."); System.err.println("Not: "+argstr); System.exit(1); @) public static Object main(String[] args) (@ java.util.Vector results = new java.util.Vector(); // add 'em all together String argstr = ""; for (int i=0; i < args.length; i++) argstr += args[i]+" "; dbg("entered ridl "+RIDL.version+" with args "+argstr); // parse 'em, and deal with it try { Options.parse(new java.io.ByteArrayInputStream(argstr.getBytes())).doargs(); } catch (ParseException e) { complainanddie(argstr); } // die if anything went wrong if (Options.cdfilename==null) complainanddie(argstr); if (Options.ridlfiles.size()>0) { ridl= RIDL.parse(""); Decls decls = ridl.get_decls(); try { java.util.Enumeration ridlfiles = Options.ridlfiles.elements(); while (ridlfiles.hasMoreElements()) { String ridlfilename = (String) ridlfiles.nextElement(); System.err.println(" reading "+ridlfilename); FileInputStream rin = new FileInputStream(ridlfilename); RIDL me = RIDL.parse(rin); rin.close(); // before the portals of each file, put in a marker decls.addElement(FileMarker.parse("filename: "+ridlfilename)); me.appendTo(decls); } portals = new java.util.Hashtable(); ridl.collectPortals(portals); File cdfile = new File(Options.cdfilename); edu.neu.ccs.demeter.tools.generate.Program prog = edu.neu.ccs.demeter.tools.generate.Program.readClassDictionaryFromFile(cdfile); // should be shared w/ generate. Instead, we have our own copy ensureOutputDirectory(); ridl.makeinheritancelinks(prog); ridl.makeridl(prog,results); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } else { System.err.println("No ridl files specified. nothing to do."); } return results; @) private static void ensureOutputDirectory() throws IOException (@ if (!Options.outputdir.exists()) { // should be log. System.out.println("Output directory " + Options.outputdir + " does not exist, will create."); if (!Options.outputdir.mkdirs()) { System.err.println("Error: could not create output directory."); throw new IOException(); } } if (Options.outputdir.exists()) { if (!Options.outputdir.isDirectory()) { System.err.println("Error: " + Options.outputdir + " exists but is not a directory."); } else if (!Options.outputdir.canWrite()) { System.err.println("Error: " + Options.outputdir + " exists but is not writable."); } else return; throw new IOException(); } @) static void dbg(String msg) (@ if (DEBUG) System.err.println("DEBUG: "+msg); @) void appendTo(Decls decls) to PortalOrFileMarker { before PortalOrFileMarker (@ decls.addElement(host); @) } void collectPortals(java.util.Hashtable ports) to Portal { before Portal (@ ports.put(host.get_classname().toString(),host); @) } } Options { (@ static String cdfilename = null; static Vector ridlfiles = new java.util.Vector(); static File outputdir = new File("gen"); @) void doargs() to * { (@ String filename; @) before Outputdir (@ Options.outputdir = new File(host.get_dir().toString()); @) before FileName (@ filename = host.toString(); @) before RidlFile (@ Options.ridlfiles.addElement(filename); @) before CDFile (@ if (Options.cdfilename != null) System.err.println("Two cd files? Had "+Options.cdfilename+" and now seen "+filename); Options.cdfilename = filename; @) } }