A bit more cleanup.
[external/ragel.git] / ragel / main.cpp
index ea1605a..120fae7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2007 Adrian Thurston <thurston@cs.queensu.ca>
+ *  Copyright 2001-2007 Adrian Thurston <thurston@complang.org>
  */
 
 /*  This file is part of Ragel.
@@ -55,6 +55,7 @@
 #include "version.h"
 #include "common.h"
 #include "xmlparse.h"
+#include "inputdata.h"
 
 using std::istream;
 using std::ostream;
@@ -124,8 +125,8 @@ void usage()
 "   -x                   Run the frontend only: emit XML intermediate format\n"
 "   -V                   Generate a dot file for Graphviz\n"
 "   -p                   Display printable characters on labels\n"
-"   -S <spec>            FSM specification to output (for rlgen-dot)\n"
-"   -M <machine>         Machine definition/instantiation to output (for rlgen-dot)\n"
+"   -S <spec>            FSM specification to output (for graphviz output)\n"
+"   -M <machine>         Machine definition/instantiation to output (for graphviz output)\n"
 "host language:\n"
 "   -C                   The host language is C, C++, Obj-C or Obj-C++ (default)\n"
 "   -D                   The host language is D\n"
@@ -441,9 +442,8 @@ void processArgs( int argc, const char **argv, const char *&inputFileName )
        }
 }
 
-void process( const char *inputFileName, const char *intermed )
+void process( const char *inputFileName )
 {
-       const char *xmlFileName = intermed;
        bool wantComplete = true;
        bool outputActive = true;
 
@@ -456,10 +456,14 @@ void process( const char *inputFileName, const char *intermed )
        /* Used for just a few things. */
        std::ostringstream hostData;
 
-       if ( machineSpec == 0 && machineName == 0 )
-               hostData << "<host line=\"1\" col=\"1\">";
+       /* Make the first input item. */
+       InputItem *firstInputItem = new InputItem;
+       firstInputItem->type = InputItem::HostData;
+       firstInputItem->loc.line = 1;
+       firstInputItem->loc.col = 1;
+       inputItems.append( firstInputItem );
 
-       Scanner scanner( inputFileName, *inFile, hostData, 0, 0, 0, false );
+       Scanner scanner( inputFileName, *inFile, 0, 0, 0, false );
        scanner.do_scan();
 
        /* Finished, final check for errors.. */
@@ -473,17 +477,6 @@ void process( const char *inputFileName, const char *intermed )
        if ( gblErrorCount > 0 )
                exit(1);
 
-       if ( machineSpec == 0 && machineName == 0 )
-               hostData << "</host>\n";
-
-       /* Open the XML file for writing. */
-       ostream *xmlOutFile = new ofstream( xmlFileName );
-
-       /* Open the XML file for reading. */
-       ifstream *xmlInFile = new ifstream( xmlFileName );
-       if ( ! xmlInFile->is_open() )
-               error() << "could not open " << xmlFileName << " for reading" << endl;
-
        /* Bail on above error. */
        if ( gblErrorCount > 0 )
                exit(1);
@@ -494,25 +487,32 @@ void process( const char *inputFileName, const char *intermed )
                outputActive = false;
        }
 
-       XmlScanner xmlScanner( xmlFileName, *xmlInFile );
-       XmlParser xmlParser( xmlFileName, outputActive, wantComplete );
-       xmlParser.init();
+       InputData inputData( inputFileName, outputActive, wantComplete );
+
+       /* Compiles machines. */
+       inputData.prepareMachineGen();
+
+       if ( gblErrorCount > 0 )
+               exit(1);
+
+       inputData.openOutput();
 
-       /* Write the machines, then the surrounding code. */
-       writeMachines( *xmlOutFile, hostData.str(), inputFileName, xmlParser );
+       /* Generates the reduced machine, which we use to write output. */
+       inputData.generateReduced();
+
+       if ( gblErrorCount > 0 )
+               exit(1);
+
+       inputData.openOutput2();
+       inputData.writeOutput();
 
        /* Close the input and the intermediate file. */
-       delete xmlOutFile;
        delete inFile;
 
        /* Bail on above error. */
        if ( gblErrorCount > 0 )
                exit(1);
 
-       xml_parse( *xmlInFile, xmlFileName, 
-               outputActive, wantComplete,
-               xmlScanner, xmlParser );
-
        /* If writing to a file, delete the ostream, causing it to flush.
         * Standard out is flushed automatically. */
        if ( outputFileName != 0 ) {
@@ -590,17 +590,13 @@ const char *openIntermed( const char *inputFileName, const char *outputFileName
 }
 
 
-void cleanExit( const char *intermed, int status )
-{
-       unlink( intermed );
-       exit( status );
-}
 
 /* Main, process args and call yyparse to start scanning input. */
 int main( int argc, const char **argv )
 {
        const char *inputFileName = 0;
        processArgs( argc, argv, inputFileName );
+       
 
        /* If -M or -S are given and we're not generating a dot file then invoke
         * the frontend. These options are not useful with code generators. */
@@ -626,11 +622,10 @@ int main( int argc, const char **argv )
                                "\" is the same as the input file" << endp;
        }
 
-       const char *intermed = openIntermed( inputFileName, outputFileName );
-       process( inputFileName, intermed );
+       process( inputFileName );
 
        /* Clean up the intermediate. */
-       cleanExit( intermed, 0 );
+       exit( 0 );
 
        return 0;
 }