OpenWalnut  1.4.0
WGEShaderCodeInjector.cpp
00001 //---------------------------------------------------------------------------
00002 //
00003 // Project: OpenWalnut ( http://www.openwalnut.org )
00004 //
00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
00006 // For more information see http://www.openwalnut.org/copying
00007 //
00008 // This file is part of OpenWalnut.
00009 //
00010 // OpenWalnut is free software: you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as published by
00012 // the Free Software Foundation, either version 3 of the License, or
00013 // (at your option) any later version.
00014 //
00015 // OpenWalnut is distributed in the hope that it will be useful,
00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018 // GNU Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public License
00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
00022 //
00023 //---------------------------------------------------------------------------
00024 
00025 #include <algorithm>
00026 #include <ostream>
00027 #include <sstream>
00028 #include <string>
00029 
00030 #include <boost/regex.hpp>
00031 
00032 #include "../../common/WLogger.h"
00033 #include "WGEShaderCodeInjector.h"
00034 
00035 WGEShaderCodeInjector::WGEShaderCodeInjector( std::string keyword ):
00036     m_keyword( std::string( "%" ) + keyword + std::string( "%" ) )
00037 {
00038     // initialize members
00039 }
00040 
00041 WGEShaderCodeInjector::~WGEShaderCodeInjector()
00042 {
00043     // cleanup
00044 }
00045 
00046 std::string WGEShaderCodeInjector::process( const std::string& /*file*/, const std::string& code ) const
00047 {
00048     if( !getActive() )
00049     {
00050         return code;
00051     }
00052 
00053     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00054     // replace keyword
00055     //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00056 
00057     // go through each line again
00058     std::string line;
00059     std::stringstream completeCode( code );
00060     std::ostringstream newCode;
00061     while( std::getline( completeCode, line ) )
00062     {
00063         size_t found = line.find( m_keyword );
00064         if( found != std::string::npos )
00065         {
00066             line.replace( found, m_keyword.length(), m_code );
00067         }
00068         newCode << line << std::endl;
00069     }
00070 
00071     return newCode.str();
00072 }
00073 
00074 void WGEShaderCodeInjector::setCode( std::string code )
00075 {
00076     m_code = code;
00077     updated();
00078 }