|
@@ -30,7 +30,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
#include <sstream>
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
-#include <windows.h>
|
|
|
+# ifndef WIN32_LEAN_AND_MEAN
|
|
|
+# define WIN32_LEAN_AND_MEAN
|
|
|
+# endif
|
|
|
+# include <windows.h>
|
|
|
#endif // _WIN32
|
|
|
|
|
|
BEGIN_ODDLPARSER_NS
|
|
@@ -71,7 +74,7 @@ const char *getTypeToken(Value::ValueType type) {
|
|
|
return Grammar::PrimitiveTypeToken[(size_t)type];
|
|
|
}
|
|
|
|
|
|
-static void logInvalidTokenError(char *in, const std::string &exp, OpenDDLParser::logCallback callback) {
|
|
|
+static void logInvalidTokenError(const char *in, const std::string &exp, OpenDDLParser::logCallback callback) {
|
|
|
if (callback) {
|
|
|
std::string full(in);
|
|
|
std::string part(full.substr(0, 50));
|
|
@@ -338,20 +341,25 @@ char *OpenDDLParser::parseStructure(char *in, char *end) {
|
|
|
|
|
|
bool error(false);
|
|
|
in = lookForNextToken(in, end);
|
|
|
- if (*in == *Grammar::OpenBracketToken) {
|
|
|
- // loop over all children ( data and nodes )
|
|
|
- do {
|
|
|
- in = parseStructureBody(in, end, error);
|
|
|
- if (in == nullptr) {
|
|
|
- return nullptr;
|
|
|
+ if (in != end) {
|
|
|
+ if (*in == *Grammar::OpenBracketToken) {
|
|
|
+ // loop over all children ( data and nodes )
|
|
|
+ do {
|
|
|
+ in = parseStructureBody(in, end, error);
|
|
|
+ if (in == nullptr) {
|
|
|
+ return nullptr;
|
|
|
+ }
|
|
|
+ } while (in != end &&
|
|
|
+ *in != *Grammar::CloseBracketToken);
|
|
|
+ if (in != end) {
|
|
|
+ ++in;
|
|
|
}
|
|
|
- } while (*in != *Grammar::CloseBracketToken);
|
|
|
- ++in;
|
|
|
- } else {
|
|
|
- ++in;
|
|
|
- logInvalidTokenError(in, std::string(Grammar::OpenBracketToken), m_logCallback);
|
|
|
- error = true;
|
|
|
- return nullptr;
|
|
|
+ } else {
|
|
|
+ ++in;
|
|
|
+ logInvalidTokenError(in, std::string(Grammar::OpenBracketToken), m_logCallback);
|
|
|
+ error = true;
|
|
|
+ return nullptr;
|
|
|
+ }
|
|
|
}
|
|
|
in = lookForNextToken(in, end);
|
|
|
|
|
@@ -418,8 +426,8 @@ char *OpenDDLParser::parseStructureBody(char *in, char *end, bool &error) {
|
|
|
}
|
|
|
|
|
|
in = lookForNextToken(in, end);
|
|
|
- if (*in != '}') {
|
|
|
- logInvalidTokenError(in, std::string(Grammar::CloseBracketToken), m_logCallback);
|
|
|
+ if (in == end || *in != '}') {
|
|
|
+ logInvalidTokenError(in == end ? "" : in, std::string(Grammar::CloseBracketToken), m_logCallback);
|
|
|
return nullptr;
|
|
|
} else {
|
|
|
//in++;
|
|
@@ -455,7 +463,7 @@ DDLNode *OpenDDLParser::top() {
|
|
|
return nullptr;
|
|
|
}
|
|
|
|
|
|
- DDLNode *top(m_stack.back());
|
|
|
+ DDLNode *top = m_stack.back();
|
|
|
return top;
|
|
|
}
|
|
|
|
|
@@ -647,12 +655,15 @@ char *OpenDDLParser::parseBooleanLiteral(char *in, char *end, Value **boolean) {
|
|
|
|
|
|
in = lookForNextToken(in, end);
|
|
|
char *start(in);
|
|
|
+
|
|
|
+ size_t len(0);
|
|
|
while (!isSeparator(*in) && in != end) {
|
|
|
++in;
|
|
|
+ ++len;
|
|
|
}
|
|
|
- int res = ::strncmp(Grammar::BoolTrue, start, strlen(Grammar::BoolTrue));
|
|
|
+ int res = ::strncmp(Grammar::BoolTrue, start, len);
|
|
|
if (0 != res) {
|
|
|
- res = ::strncmp(Grammar::BoolFalse, start, strlen(Grammar::BoolFalse));
|
|
|
+ res = ::strncmp(Grammar::BoolFalse, start, len);
|
|
|
if (0 != res) {
|
|
|
*boolean = nullptr;
|
|
|
return in;
|
|
@@ -733,7 +744,7 @@ char *OpenDDLParser::parseFloatingLiteral(char *in, char *end, Value **floating,
|
|
|
|
|
|
in = lookForNextToken(in, end);
|
|
|
char *start(in);
|
|
|
- while (!isSeparator(*in) && in != end) {
|
|
|
+ while (in != end && !isSeparator(*in)) {
|
|
|
++in;
|
|
|
}
|
|
|
|
|
@@ -838,6 +849,13 @@ char *OpenDDLParser::parseHexaLiteral(char *in, char *end, Value **data) {
|
|
|
int value(0);
|
|
|
while (pos > 0) {
|
|
|
int v = hex2Decimal(*start);
|
|
|
+ if (v < 0) {
|
|
|
+ while (isEndofLine(*in)) {
|
|
|
+ ++in;
|
|
|
+ }
|
|
|
+ return in;
|
|
|
+ }
|
|
|
+
|
|
|
--pos;
|
|
|
value = (value << 4) | v;
|
|
|
++start;
|
|
@@ -901,10 +919,10 @@ char *OpenDDLParser::parseDataList(char *in, char *end, Value::ValueType type, V
|
|
|
}
|
|
|
|
|
|
in = lookForNextToken(in, end);
|
|
|
- if (*in == '{') {
|
|
|
+ if (in != end && *in == '{') {
|
|
|
++in;
|
|
|
Value *current(nullptr), *prev(nullptr);
|
|
|
- while ('}' != *in) {
|
|
|
+ while (in != end && '}' != *in) {
|
|
|
current = nullptr;
|
|
|
in = lookForNextToken(in, end);
|
|
|
if (Value::ValueType::ddl_ref == type) {
|
|
@@ -962,11 +980,12 @@ char *OpenDDLParser::parseDataList(char *in, char *end, Value::ValueType type, V
|
|
|
}
|
|
|
|
|
|
in = getNextSeparator(in, end);
|
|
|
- if (',' != *in && Grammar::CloseBracketToken[0] != *in && !isSpace(*in)) {
|
|
|
+ if (in == end || (',' != *in && Grammar::CloseBracketToken[0] != *in && !isSpace(*in))) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- ++in;
|
|
|
+ if (in != end)
|
|
|
+ ++in;
|
|
|
}
|
|
|
|
|
|
return in;
|