import Jakarta.util.*; import java.io.*; import java.util.*; class Main { static boolean debug = false; static boolean printFile = false; static boolean dumpPtable = false; static boolean dumpVtable = false; public static boolean modelMode = false; static String inputFileName = ""; static final String defaultModelFile = "model.m"; static void marquee() { System.out.println( "Usage: guidsl <options> <file>.m" ); System.out.println( " <file>.m is a feature model" ); System.out.println( " options -d debug" ); System.out.println( " -p print input file" ); System.out.println( " -m model mode uses 'model.m'" ); Main.marqueeAdditions(); System.exit( 1 ); } // the following methods are extension points for the Main class static void marqueeAdditions() { // layers extend this method with their option descriptions } static boolean processOptions( char o ) { // layers extend this method with option processing // default returns false, but this should be overridden return false; } static void debugActions() { // layers extend this method with debug reporting } public static void process( Model root ) throws SemanticException { // layers extend this method for AST processing } public static void process2() { // layers extend this method for gspec object procssing } public static void main( String[] args ) { int argc = args.length; int non_switch_args; // Step 1: a general routine to pick off command line options // options are removed from command line and // args array is adjusted accordingly. // right now, there are no command-line options // but this code is here for future expansion non_switch_args = 0; for ( int i=0; i < argc; i++ ) { if ( args[i].charAt( 0 ) == '-' ) { // switches of form -xxxxx (where xxx is a sequence of 1 // or more characters for ( int j=1; j < args[i].length(); j++ ) { char o = args[i].charAt( j ); if ( Main.processOptions( o ) ) continue; if ( o == 'd' ) { debug = true; continue; } if ( o == 'p' ) { printFile = true; continue; } if ( o == 'm' ) { modelMode = true; continue; } System.err.println( "Unrecognizable option " + o ); Main.marquee(); // if (args[i].charAt(j) == 'x' { // ... do this for option 'x' // } } } else { // non-switch arg args[non_switch_args] = args[i]; non_switch_args++; } } // assume "model.m" as the default name of a file. // we use this default if non_switch_args == 0 and // there is no such "model.m" file in the current directory if ( non_switch_args == 0 ) { if (modelMode) inputFileName = defaultModelFile; else Main.marquee(); } else inputFileName = args[0]; // Step 2: open file FileInputStream inputFile = null; try { inputFile = new FileInputStream( inputFileName ); } catch ( Exception e ) { System.err.println( "File " + inputFileName + " not found:" + e.getMessage() ); Main.marquee(); } // Step 3: create a parser and parse input files // inputRoot is root of parse tree of input file Parser myParser = Parser.getInstance( inputFile ); Model inputRoot = null; try { inputRoot = ( Model ) myParser.parseAll() ; } catch ( Exception e ) { System.out.println( "Parsing Exception Thrown in " + inputFileName + ": " + e.getMessage() ); System.exit( 1 ); } // Step 4: Initialize output stream to standard out // Standard initialization stuff that should be // platform independent. PrintWriter pw = null; AstProperties props = new AstProperties(); String lineSeparator = System.getProperties().getProperty( "line.separator" ); if ( lineSeparator.compareTo( "\n" ) != 0 ) pw = new PrintWriter( new FixDosOutputStream( System.out ) ); else pw = new PrintWriter( System.out ); props.setProperty( "output", pw ); // Step 5: transform parse tree here try { Main.process( inputRoot ); } catch( SemanticException e ) { int errorCnt = Util.errorCount(); System.err.println( Util.errorCount() + " error(s) found"); System.err.println( "Processing terminated" ); System.exit(1); } Main.process2(); if ( printFile ) { inputRoot.print(); System.out.println(); } if ( debug ) { Main.debugActions(); } } //end main() }