#include // ------------------------------------------------------------------------- int main( int argc, char* argv[] ) { // Get inputs if( argc < 4 ) { std::cerr << "Usage: " << argv[ 0 ] << " definitons_file library_name output_prefix" << std::endl; return( 1 ); } // fi std::string definitions_filename = argv[ 1 ]; std::string library_name = argv[ 2 ]; std::string output_prefix = argv[ 3 ]; unsigned int number_of_sources = cpPlugins_NUMBER_OF_FILES; // Read inputs std::string definitions_buffer; if( !( cpPlugins_bash::Read( definitions_buffer, definitions_filename ) ) ) { std::cerr << argv[ 0 ] << ": Error reading definitions file \"" << definitions_filename << "\"" << std::endl; return( 1 ); } // fi // Put it in a line-by-line structure TStrings definitions_lines; cpPlugins_bash::Tokenize( definitions_lines, definitions_buffer, "\n" ); // Parse input file TCommands commands; cpPlugins_bash::Parse( commands, definitions_lines ); // Load pre-compiled definitions cpPlugins_bash::LoadDefinitions( commands ); // Expand definitions TCommands definitions; cpPlugins_bash::ExpandDefinitions( definitions, commands ); definitions[ "_export_" ].clear( ); definitions[ "_export_" ].push_back( library_name + std::string( "_EXPORT" ) ); // Expand data TStrings tfiles, cfiles, instances, minstances; cpPlugins_bash::Expand( tfiles, definitions, commands, "tinclude" ); cpPlugins_bash::Expand( cfiles, definitions, commands, "cinclude" ); cpPlugins_bash::Expand( instances, definitions, commands, "instances" ); cpPlugins_bash::Expand( minstances, definitions, commands, "minstances" ); // Build all instances TStrings all_instances; for( auto iIt = instances.begin( ); iIt != instances.end( ); ++iIt ) { std::stringstream str; str << "template class " << library_name << "_EXPORT " << *iIt; all_instances.push_back( str.str( ) ); } // rof for( auto iIt = minstances.begin( ); iIt != minstances.end( ); ++iIt ) { std::stringstream str; str << "template " << *iIt; all_instances.push_back( str.str( ) ); } // rof // Write source code unsigned int instances_per_file = ( unsigned int )( std::floor( double( all_instances.size( ) ) / double( number_of_sources ) ) ); if( instances_per_file == 0 ) instances_per_file = 1; std::vector< std::vector< std::string > > all_lines( 1 ); for( unsigned int c_id = 0; c_id < all_instances.size( ); ++c_id ) { all_lines[ all_lines.size( ) - 1 ].push_back( all_instances[ c_id ] ); if( c_id % instances_per_file == instances_per_file - 1 ) all_lines.push_back( std::vector< std::string >( ) ); } // rof // Paranoiac code while( all_lines.size( ) > number_of_sources ) { all_lines[ all_lines.size( ) - 2 ].insert( all_lines[ all_lines.size( ) - 2 ].end( ), all_lines[ all_lines.size( ) - 1 ].begin( ), all_lines[ all_lines.size( ) - 1 ].end( ) ); all_lines.pop_back( ); } // elihw while( all_lines.size( ) < number_of_sources ) all_lines.push_back( std::vector< std::string >( ) ); // Real write for( unsigned int f_id = 0; f_id < all_lines.size( ); ++f_id ) { std::stringstream source; source << "#include <" << library_name << "_Export.h>" << std::endl; auto hIt = commands.find( "header" ); if( hIt != commands.end( ) ) { source << std::endl; for( auto vIt = hIt->second.begin( ); vIt != hIt->second.end( ); ++vIt ) source << *vIt << std::endl; source << std::endl; } // fi if( tfiles.size( ) > 0 ) { for( auto tIt = tfiles.begin( ); tIt != tfiles.end( ); ++tIt ) { TStrings toks; cpPlugins_bash::Tokenize( toks, *tIt, ":|" ); if( toks.size( ) == 3 ) { source << "#include <" << toks[ 0 ] << "." << toks[ 1 ] << ">" << std::endl; source << "#include <" << toks[ 0 ] << "." << toks[ 2 ] << ">" << std::endl; } // fi } // rof source << std::endl; } // fi if( cfiles.size( ) > 0 ) { for( auto cIt = cfiles.begin( ); cIt != cfiles.end( ); ++cIt ) source << "#include <" << *cIt << ">" << std::endl; source << std::endl; } // fi for( auto c_it = all_lines[ f_id ].begin( ); c_it != all_lines[ f_id ].end( ); ++c_it ) source << *c_it << ";" << std::endl; source << std::endl << "// eof" << std::endl; std::stringstream source_file; source_file << output_prefix << "_" << f_id << ".cxx"; if( !( cpPlugins_bash::Write( source.str( ), source_file.str( ) ) ) ) { std::cerr << "Error writing source code." << std::endl; return( 1 ); } // fi } // rof return( 0 ); } // eof - $RCSfile$