--- /dev/null
+#include <bash/Config.h>
+
+// -------------------------------------------------------------------------
+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_CONFIG_NUMBER_OF_FILES;
+
+ // Read inputs
+ std::string definitions_buffer;
+ if( !( cpPlugins_bash::Read( definitions_buffer, definitions_filename ) ) )
+ {
+ std::cout
+ << 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$