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
---------------------------
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
---------------------------
Which kinda sucks...<BG>
it happens on this line:
boost::regex_search(start, end, what, expression,flags), which is being used like thus:
Calling function
void TScript::AddScript(std::string scriptPath)
{
int r = 0;
size_t len = 0;
std::string script;
std::string sname;
const char* re = "#include[\t[:space:]]*\"\\w*\\.[tT][Ss][Cc][Rr][Ii][Pp][Tt]" ;
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;
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()" );
}
start = script.begin();
end = script.end();
while(boost::regex_search(start, end, what, expression,flags))
{
std::string newScript = boost::lexical_cast<std::string>(what[0]);
start = what[0].second;
}
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() ");
}
}
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<std::string>(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]