-#include <fstream>
-#include <iostream>
-
-#include <algorithm>
-#include <cctype>
-#include <cstring>
+#include <cpPlugins_Config.h>
#include <map>
#include <vector>
#include <sstream>
typedef std::map< std::string, TLines > TVariables;
// -------------------------------------------------------------------------
-TLines Tokenize( const std::string& str, const std::string& delims );
-std::string Replace(
- const std::string& str, const std::string& sub, const std::string& nsub
- );
bool ReadFile( TParsedLines& lines, const std::string& fname );
-void ExpandGroups( TLines& res, const TLines& lines, const TVariables& vars );
-void ExpandVariables( TLines& res, const TLines& lines, const TVariables& vars );
-void ParseIncludes( TLines& res, const TLines& lines, const std::string& ext = "" );
+void ExpandGroups( TLines& res, const TLines& lines );
+void ExpandDefinitions(
+ TLines& res, const TLines& lines, const TVariables& vars
+ );
void PrintLines(
const std::string& prefix, const std::string& suffix,
const TLines& lines, std::ostream& out
} // fi
- // Expand variable definitions
+ // Expand definitions
TVariables vars;
for( auto dIt = lines[ 'd' ].begin( ); dIt != lines[ 'd' ].end( ); ++dIt )
{
- auto tokens = Tokenize( *dIt, "=;" );
+ TLines tokens;
+ cpPlugins::TokenizeString( tokens, *dIt, "=;" );
auto tIt = tokens.begin( );
auto vName = *tIt;
tIt++;
vars[ vName ].push_back( *tIt );
TLines res;
- ExpandVariables( res, vars[ vName ], vars );
+ ExpandDefinitions( res, vars[ vName ], vars );
vars[ vName ] = res;
} // rof
- // First include section
- TLines first_includes, normal_includes, template_includes, template_sources;
- ParseIncludes( first_includes, lines[ 'f' ] );
- ParseIncludes( normal_includes, lines[ 'i' ] );
- ParseIncludes( template_includes, lines[ 't' ] );
- ParseIncludes( template_sources, lines[ 't' ], "xx" );
-
// Expand groups
- TLines pre_classes;
- ExpandGroups( pre_classes, lines[ 'c' ], vars );
-
- // Expand variables
- TLines real_classes;
- ExpandVariables( real_classes, pre_classes, vars );
-
- // Prepare header file
+ TLines f_includes_groups, includes_groups, templates_groups, classes_groups;
+ ExpandGroups( f_includes_groups, lines[ 'f' ] );
+ ExpandGroups( includes_groups, lines[ 'i' ] );
+ ExpandGroups( templates_groups, lines[ 't' ] );
+ ExpandGroups( classes_groups, lines[ 'c' ] );
+
+ // Expand definitions
+ TLines f_includes_list, includes_list, templates_list, classes_list;
+ ExpandDefinitions( f_includes_list, f_includes_groups, vars );
+ ExpandDefinitions( includes_list, includes_groups, vars );
+ ExpandDefinitions( templates_list, templates_groups, vars );
+ ExpandDefinitions( classes_list, classes_groups, vars );
+
+ // Write header file
std::ofstream header_file( header_file_fname.c_str( ) );
if( !header_file )
{
<< "#include <" << library_name << "_Export.h>" << std::endl << std::endl;
PrintLines( "", "", lines[ 'b' ], header_file );
header_file << std::endl;
- PrintLines( "", "", first_includes, header_file );
+ PrintLines( "#include <", ">", f_includes_list, header_file );
header_file
<< "#ifdef " << library_name << "_EXPORTS" << std::endl
<< "# define " << library_name << "_PREFIX template class "
<< "# define " << library_name
<< "_PREFIX extern template class" << std::endl
<< "#endif // "
- << library_name << "_EXPORTS" << std::endl;
- PrintLines( "", "", normal_includes, header_file );
- PrintLines( "", "", template_includes, header_file );
+ << library_name << "_EXPORTS" << std::endl << std::endl;
+ PrintLines( "#include <", ">", includes_list, header_file );
+ PrintLines( "#include <", ">", templates_list, header_file );
header_file
<< std::endl << "#ifdef " << library_name << "_EXPORTS" << std::endl;
- PrintLines( "", "", template_sources, header_file );
- header_file << "#endif // " << library_name << "_EXPORTS" << std::endl;
- header_file << std::endl;
+ PrintLines( "#include <", "xx>", templates_list, header_file );
+ header_file
+ << "#endif // " << library_name << "_EXPORTS" << std::endl << std::endl;
PrintLines(
- library_name + std::string( "_PREFIX " ), ";", real_classes, header_file
+ library_name + std::string( "_PREFIX " ), ";", classes_list, header_file
);
header_file
<< std::endl << "#endif // __" << library_name << "__H__" << std::endl;
source_file
<< "#include \"" << header_file_fname << "\"" << std::endl;
source_file.close( );
- return( 0 );
-}
-// -------------------------------------------------------------------------
-TLines Tokenize( const std::string& str, const std::string& delims )
-{
- TLines tokens;
- if( str.size( ) > 0 )
- {
- char* buffer = new char[ str.size( ) + 1 ];
- std::strcpy( buffer, str.c_str( ) );
- buffer[ str.size( ) ] = '\0';
- char* it = std::strtok( buffer, delims.c_str( ) );
- while( it != NULL )
- {
- tokens.push_back( std::string( it ) );
- it = std::strtok( NULL, delims.c_str( ) );
-
- } // elihw
- delete buffer;
-
- } // fi
- return( tokens );
-}
-
-// -------------------------------------------------------------------------
-std::string Replace(
- const std::string& str, const std::string& sub, const std::string& nsub
- )
-{
- std::string res = str;
- size_t index;
- while( ( index = res.find( sub ) ) != std::string::npos )
- res.replace( index, sub.size( ), nsub );
- return( res );
+ return( 0 );
}
// -------------------------------------------------------------------------
bool ReadFile( TParsedLines& lines, const std::string& fname )
{
- // Load file into a string stream
- std::ifstream file_stream( fname.c_str( ) );
- if( !file_stream )
- return( false );
std::string buffer;
- file_stream.seekg( 0, std::ios::end );
- buffer.reserve( file_stream.tellg( ) );
- file_stream.seekg( 0, std::ios::beg );
- buffer.assign(
- ( std::istreambuf_iterator< char >( file_stream ) ),
- std::istreambuf_iterator< char >( )
- );
- file_stream.close( );
- std::istringstream input_stream( buffer );
-
- // Read line by line
- std::string line;
- while( std::getline( input_stream, line ) )
+ if( cpPlugins::ReadFileIntoString( buffer, fname ) )
{
- auto cmd_pos = line.end( );
- auto arg_pos = line.end( );
- auto lIt = line.begin( );
- while( lIt != line.end( ) )
+ std::istringstream input_stream( buffer );
+
+ // Read line by line
+ std::string line;
+ while( std::getline( input_stream, line ) )
{
- if( !std::isblank( *lIt ) )
+ auto cmd_pos = line.end( );
+ auto arg_pos = line.end( );
+ auto lIt = line.begin( );
+ while( lIt != line.end( ) )
{
- if( cmd_pos == line.end( ) )
+ if( !cpPlugins::IsBlank( *lIt ) )
{
- cmd_pos = lIt;
- ++lIt;
+ if( cmd_pos == line.end( ) )
+ {
+ cmd_pos = lIt;
+ ++lIt;
+ }
+ else if( arg_pos == line.end( ) )
+ {
+ arg_pos = lIt;
+ lIt = line.end( );
+
+ } // fi
}
- else if( arg_pos == line.end( ) )
- {
- arg_pos = lIt;
- lIt = line.end( );
+ else
+ ++lIt;
+
+ } // elihw
+ char cmd = *cmd_pos;
+ std::string arg;
+ arg.resize( line.end( ) - arg_pos );
+ std::copy( arg_pos, line.end( ), arg.begin( ) );
+ lines[ cmd ].push_back( arg );
- } // fi
- }
- else
- ++lIt;
-
} // elihw
- char cmd = *cmd_pos;
- std::string arg;
- arg.resize( line.end( ) - arg_pos );
- std::copy( arg_pos, line.end( ), arg.begin( ) );
- lines[ cmd ].push_back( arg );
-
- } // elihw
- return( true );
+ return( true );
+ }
+ else
+ return( false );
}
// -------------------------------------------------------------------------
-void ExpandGroups( TLines& res, const TLines& lines, const TVariables& vars )
+void ExpandGroups( TLines& res, const TLines& lines )
{
for( auto lIt = lines.begin( ); lIt != lines.end( ); ++lIt )
{
auto b_pos = lIt->find( "@{" );
if( b_pos != std::string::npos )
{
- auto e_pos = lIt->find( "}" );
- auto expansion = lIt->substr( b_pos + 2, e_pos - b_pos - 2 );
- auto tokens = Tokenize( expansion, ";" );
- for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt )
+ unsigned int braces_count = 1;
+ auto e_pos = b_pos;
+ e_pos += 2;
+ while( braces_count != 0 && e_pos < lIt->size( ) )
{
- auto vIt = vars.find( *tIt );
- if( vIt != vars.end( ) )
- {
- auto wIt = vIt->second.begin( );
- std::string values = *wIt;
- for( wIt++; wIt != vIt->second.end( ); ++wIt )
- values += ";" + *wIt;
- *tIt = Replace( *lIt, vIt->first, values );
- }
- else
- *tIt = lIt->substr( 0, b_pos ) + *tIt + lIt->substr( e_pos + 1 );
+ auto v = ( *lIt )[ e_pos ];
+ braces_count += ( v == '{' )? 1: ( ( v == '}' )? -1: 0 );
+ e_pos++;
+
+ } // elihw
+ if( braces_count == 0 )
+ {
+ auto replace = lIt->substr( b_pos, e_pos - b_pos );
+ auto expansion = replace.substr( 2, replace.size( ) - 3 );
+ TLines tokens;
+ cpPlugins::TokenizeString( tokens, expansion, ";" );
+ for( auto tIt = tokens.begin( ); tIt != tokens.end( ); ++tIt )
+ *tIt = cpPlugins::ReplaceString( *lIt, replace, *tIt );
+ ExpandGroups( res, tokens );
- } // rof
- ExpandGroups( res, tokens, vars );
+ } // fi
}
else
res.push_back( *lIt );
}
// -------------------------------------------------------------------------
-void ExpandVariables( TLines& res, const TLines& lines, const TVariables& vars )
+void ExpandDefinitions(
+ TLines& res, const TLines& lines, const TVariables& vars
+ )
{
+ std::string seps = " ,;:{}[]()\"$&<>*.";
+
for( auto lIt = lines.begin( ); lIt != lines.end( ); ++lIt )
{
auto b_pos = lIt->find( "#" );
if( b_pos != std::string::npos )
{
- auto tokens = Tokenize( lIt->substr( b_pos ), " ,;:{}[]()\"$&<>" );
+ TLines tokens;
+ cpPlugins::TokenizeString( tokens, lIt->substr( b_pos ), seps );
std::string cmd = tokens[ 0 ];
auto vIt = vars.find( cmd );
if( vIt != vars.end( ) )
if( vIt->second.size( ) > 0 )
{
TLines new_res;
- for( auto wIt = vIt->second.begin( ); wIt != vIt->second.end( ); ++wIt )
- new_res.push_back( Replace( *lIt, cmd, *wIt ) );
- ExpandVariables( res, new_res, vars );
+ for(
+ auto wIt = vIt->second.begin( ); wIt != vIt->second.end( ); ++wIt
+ )
+ new_res.push_back( cpPlugins::ReplaceString( *lIt, cmd, *wIt ) );
+ ExpandDefinitions( res, new_res, vars );
} // fi
} // fi
}
else
- res.push_back( *lIt );
+ res.push_back(
+ cpPlugins::ReplaceString(
+ cpPlugins::ReplaceString( *lIt, "{", "" ), "}", ""
+ )
+ );
} // rof
}
-// -------------------------------------------------------------------------
-void ParseIncludes( TLines& res, const TLines& lines, const std::string& ext )
-{
- for( auto lIt = lines.begin( ); lIt != lines.end( ); ++lIt )
- res.push_back(
- std::string( "#include <" ) + *lIt + ext + std::string( ">" )
- );
-}
-
// -------------------------------------------------------------------------
void PrintLines(
const std::string& prefix, const std::string& suffix,