C4AulParseError: Enable creation from host and source pointer

Instead of having a C4AulParseError constructor read the location data
from the parse state, allow explicit construction from a known location.
liquid_container
Nicolas Hake 2016-04-07 19:47:10 +02:00
parent cfdb1142b8
commit 367f58b1cc
2 changed files with 33 additions and 1 deletions

View File

@ -44,8 +44,11 @@ public:
// parse error
class C4AulParseError : public C4AulError
{
C4AulParseError() = default;
public:
C4AulParseError(C4ScriptHost *pScript, const char *pMsg, const char *pIdtf = NULL, bool Warn = false); // constructor
C4AulParseError(C4ScriptHost *pScript, const char *pMsg, const char *pIdtf = NULL, bool Warn = false);
static C4AulParseError FromSPos(const C4ScriptHost *host, const char *SPos, C4AulScriptFunc *Fn, const char *msg, const char *Idtf = nullptr, bool Warn = false);
// constructor
C4AulParseError(class C4AulParse * state, const char *pMsg, const char *pIdtf = NULL, bool Warn = false); // constructor
};

View File

@ -179,6 +179,35 @@ void C4AulParse::Error(const char *pMsg, ...)
throw C4AulParseError(this, Buf.getData());
}
C4AulParseError C4AulParseError::FromSPos(const C4ScriptHost *host, const char *SPos, C4AulScriptFunc *Fn, const char *msg, const char *Idtf, bool Warn)
{
C4AulParseError e;
e.sMessage.Format("%s: %s%s",
Warn ? "WARNING" : "ERROR",
msg,
Idtf ? Idtf : "");
if (Fn && Fn->GetName())
{
e.sMessage.AppendFormat(" (in %s", Fn->GetName());
if (host && SPos)
e.sMessage.AppendFormat(", %s:%d:%d)",
host->ScriptName.getData(),
SGetLine(host->GetScript(), SPos),
SLineGetCharacters(host->GetScript(), SPos));
else
e.sMessage.AppendChar(')');
}
else if (host && SPos)
{
e.sMessage.AppendFormat(" (%s:%d:%d)",
host->ScriptName.getData(),
SGetLine(host->GetScript(), SPos),
SLineGetCharacters(host->GetScript(), SPos));
}
return e;
}
C4AulParseError::C4AulParseError(C4AulParse * state, const char *pMsg, const char *pIdtf, bool Warn)
: C4AulError()
{