X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ragel%2Fmain.cpp;h=120fae7f05aac5fd0587660c810c66aea5e211d4;hb=2c2dd6ec08725643fe03b3d8c27757408e596c2b;hp=ea1605a85d39b41d04c19e244d0b3bb0e3c0f7fc;hpb=87b6295a37809941fa8852dd752f3ecc8254217a;p=external%2Fragel.git diff --git a/ragel/main.cpp b/ragel/main.cpp index ea1605a..120fae7 100644 --- a/ragel/main.cpp +++ b/ragel/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007 Adrian Thurston + * Copyright 2001-2007 Adrian Thurston */ /* 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 FSM specification to output (for rlgen-dot)\n" -" -M Machine definition/instantiation to output (for rlgen-dot)\n" +" -S FSM specification to output (for graphviz output)\n" +" -M 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 << ""; + /* 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 << "\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; }