Original Post
I'm trying to use boost::regex to extract strings (#include directive to be exact) that is being used in my scripting language. Yet, when I trying running it, I get a runtime assert failure Which kinda sucks... it happens on this line: boost::regex_search(start, end, what, expression,flags), which is being used like thus: Calling function The usage of boost::regex has more or less been copied from here. On a side note, I'm pretty sure std::string newScript = boost::lexical_cast(what[0]); is not valid either. How do I cast from the string iterator to a string? (I suck with the STL!) Many thanks, //edit: If I take out the offending lines, boost::regex expression(re); triggers the same error as well. [Edited by - _Sigma on June 13, 2007 6:44:45 PM]
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!
Program: ...
File: .\xstring
Line: 85
Expression: ("_Pstring == NULL || _Ptr != NULL && ((_Mystring *)_Pstring)->_Myptr() <= _Ptr && _Ptr <= (((_Mystring *)_Pstring)->_Myptr() + ((_Mystring *)_Pstring)->_Mysize)", 0)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
Abort Retry Ignore
---------------------------
void TScript::AddScript(std::string scriptPath)
{
int r = 0; //return value from AS
size_t len = 0; //length of script
std::string script; //holds script
std::string sname; //name used to reference script
const char* re = "#include[\t[:space:]]*\"\\w*\\.[Ss][Cc][Rr][Ii][Pp]" ;
std::string::const_iterator start, end;
boost::regex expression(re);
boost::match_results<std::string::const_iterator> what;
boost::match_flag_type flags = boost::match_default;
//load script from file on disk
try
{
m_script.readFile(scriptPath.c_str());
script = m_script.lookup("Script.script");
sname = m_script.lookup("Script.scriptName");
len = script.length();
}
catch (libconfig::ParseException& e)
{
throw TFatalException("Script: Error on line: " + boost::lexical_cast<std::string>(e.getLine()) +
". Error: " + boost::lexical_cast<std::string>(e.getError()) + " In file: " + scriptPath
+ " \n\n Stack:\nTScript::CompileScript()");
}
catch (libconfig::FileIOException& e)
{
throw TFatalException("Failed to load script file. \n\nReason: Failed to open file " + scriptPath
+ ".\n Stack:\n TScript::CompileScript()");
}
catch(libconfig::SettingNotFoundException &e)
{
throw TFatalException("A required setting in " + scriptPath + "was not found. \n\n Stack: TScript::CompileScript()\n");
}
catch (...)
{
throw TFatalException("Unknown error parsing " + scriptPath + " \n in TScript::CompileScript()" );
}
//init iterators
start = script.begin();
end = script.end();
while(boost::regex_search(start, end, what, expression,flags)) //<- this line here
{
//what[0] will hold the entire include directive, ie: #include "myScript.tscript"
std::string newScript = boost::lexical_cast<std::string>(what[0]);
// update search position:
start = what[0].second;
}
// Add the script sections that will be compiled into executable code.
// If we want to combine more than one file into the same script, then
// we can call AddScriptSection() several times for the same module and
// the script engine will treat them all as if they were one. The script
// section name, will allow us to localize any errors in the script code.
r = m_engine->AddScriptSection(0, sname.c_str(), &script[0], len, 0, true);
if( r < 0 )
{
TLog::GetInstance().LogMessage("TScript::CompileScript","AddScriptSection() failed on" + scriptPath,MSG_ERROR);
throw TFatalException("AddScriptSection() failed on " + scriptPath + "\n\nIn:\nTScript::CompileScript() ");
}
}