summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp')
-rw-r--r--src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp169
1 files changed, 93 insertions, 76 deletions
diff --git a/src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp b/src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp
index 6f471be36..caa281364 100644
--- a/src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp
+++ b/src/3rdparty/assimp/contrib/openddlparser/code/OpenDDLParser.cpp
@@ -27,6 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <iostream>
#include <sstream>
#include <algorithm>
+#include <memory>
#include <math.h>
#ifdef _WIN32
@@ -36,7 +37,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
BEGIN_ODDLPARSER_NS
-static const char *Version = "0.3.0";
+static const char *Version = "0.4.0";
namespace Grammar {
static const char *OpenBracketToken = "{";
@@ -49,7 +50,7 @@ namespace Grammar {
static const char *BoolFalse = "false";
static const char *CommaSeparator = ",";
- static const char* PrimitiveTypeToken[ Value::ddl_types_max ] = {
+ static const char *PrimitiveTypeToken[ Value::ddl_types_max ] = {
"bool",
"int8",
"int16",
@@ -74,8 +75,8 @@ const char *getTypeToken( Value::ValueType type ) {
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
std::stringstream stream;
stream << "Invalid token \"" << *in << "\"" << " expected \"" << exp << "\"" << std::endl;
- std::string full(in);
- std::string part(full.substr(0,50));
+ std::string full( in );
+ std::string part( full.substr( 0, 50 ) );
stream << part;
callback( ddl_error_msg, stream.str() );
}
@@ -85,6 +86,7 @@ static bool isIntegerType( Value::ValueType integerType ) {
integerType != Value::ddl_int32 && integerType != Value::ddl_int64 ) {
return false;
}
+
return true;
}
@@ -105,7 +107,7 @@ static DDLNode *createDDLNode( Text *id, OpenDDLParser *parser ) {
const std::string type( id->m_buffer );
DDLNode *parent( parser->top() );
DDLNode *node = DDLNode::create( type, "", parent );
-
+
return node;
}
@@ -193,10 +195,11 @@ size_t OpenDDLParser::getBufferSize() const {
void OpenDDLParser::clear() {
m_buffer.resize( 0 );
if( ddl_nullptr != m_context ) {
- m_context->m_root = ddl_nullptr;
+ delete m_context;
+ m_context=ddl_nullptr;
}
- DDLNode::releaseNodes();
+// DDLNode::releaseNodes();
}
bool OpenDDLParser::parse() {
@@ -212,11 +215,11 @@ bool OpenDDLParser::parse() {
// do the main parsing
char *current( &m_buffer[ 0 ] );
- char *end( &m_buffer[ m_buffer.size() - 1 ] + 1 );
+ char *end( &m_buffer[m_buffer.size() - 1 ] + 1 );
size_t pos( current - &m_buffer[ 0 ] );
while( pos < m_buffer.size() ) {
current = parseNextNode( current, end );
- if(current==ddl_nullptr) {
+ if ( current == ddl_nullptr ) {
return false;
}
pos = current - &m_buffer[ 0 ];
@@ -245,7 +248,7 @@ static void dumpId( Identifier *id ) {
if( ddl_nullptr != id ) {
if ( ddl_nullptr != id->m_text.m_buffer ) {
std::cout << id->m_text.m_buffer << std::endl;
- }
+ }
}
}
#endif
@@ -271,21 +274,26 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
} else {
std::cerr << "nullptr returned by creating DDLNode." << std::endl;
}
+ delete id;
- Name *name(ddl_nullptr);
- in = OpenDDLParser::parseName(in, end, &name);
+ Name *name_(ddl_nullptr);
+ in = OpenDDLParser::parseName(in, end, &name_);
+ std::unique_ptr<Name> name(name_);
if( ddl_nullptr != name && ddl_nullptr != node ) {
const std::string nodeName( name->m_id->m_buffer );
node->setName( nodeName );
}
- Property *first(ddl_nullptr);
+
+ std::unique_ptr<Property> first;
in = lookForNextToken(in, end);
if (*in == Grammar::OpenPropertyToken[0]) {
in++;
- Property *prop(ddl_nullptr), *prev(ddl_nullptr);
+ std::unique_ptr<Property> prop, prev;
while (*in != Grammar::ClosePropertyToken[0] && in != end) {
- in = OpenDDLParser::parseProperty(in, end, &prop);
+ Property *prop_(ddl_nullptr);
+ in = OpenDDLParser::parseProperty(in, end, &prop_);
+ prop.reset(prop_);
in = lookForNextToken(in, end);
if (*in != Grammar::CommaSeparator[0] && *in != Grammar::ClosePropertyToken[0]) {
@@ -295,20 +303,20 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
if (ddl_nullptr != prop && *in != Grammar::CommaSeparator[0]) {
if (ddl_nullptr == first) {
- first = prop;
+ first = std::move(prop);
}
if (ddl_nullptr != prev) {
- prev->m_next = prop;
+ prev->m_next = prop.release();
}
- prev = prop;
+ prev = std::move(prop);
}
}
- in++;
+ ++in;
}
// set the properties
- if (ddl_nullptr != first && ddl_nullptr != node) {
- node->setProperties(first);
+ if (first && ddl_nullptr != node) {
+ node->setProperties(first.release());
}
}
@@ -322,19 +330,18 @@ char *OpenDDLParser::parseStructure( char *in, char *end ) {
bool error( false );
in = lookForNextToken( in, end );
- if( *in == '{' ) {
+ if( *in == *Grammar::OpenBracketToken) {
// loop over all children ( data and nodes )
do {
in = parseStructureBody( in, end, error );
if(in == ddl_nullptr){
return ddl_nullptr;
}
- } while ( *in != '}' );
- in++;
+ } while ( *in != *Grammar::CloseBracketToken);
+ ++in;
} else {
- in++;
+ ++in;
logInvalidTokenError( in, std::string( Grammar::OpenBracketToken ), m_logCallback );
- error = true;
return ddl_nullptr;
}
in = lookForNextToken( in, end );
@@ -373,7 +380,7 @@ static void setNodeDataArrayList( DDLNode *currentNode, DataArrayList *dtArrayLi
char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
if( !isNumeric( *in ) && !isCharacter( *in ) ) {
- in++;
+ ++in;
}
in = lookForNextToken( in, end );
@@ -431,7 +438,6 @@ DDLNode *OpenDDLParser::popNode() {
DDLNode *topNode( top() );
m_stack.pop_back();
-
return topNode;
}
@@ -467,7 +473,14 @@ void OpenDDLParser::normalizeBuffer( std::vector<char> &buffer) {
for( size_t readIdx = 0; readIdx<len; ++readIdx ) {
char *c( &buffer[readIdx] );
// check for a comment
- if( !isComment<char>( c, end ) && !isNewLine( *c ) ) {
+ if (isCommentOpenTag(c, end)) {
+ ++readIdx;
+ while (!isCommentCloseTag(&buffer[readIdx], end)) {
+ ++readIdx;
+ }
+ ++readIdx;
+ ++readIdx;
+ } else if( !isComment<char>( c, end ) && !isNewLine( *c ) ) {
newBuffer.push_back( buffer[ readIdx ] );
} else {
if( isComment<char>( c, end ) ) {
@@ -529,14 +542,17 @@ char *OpenDDLParser::parseIdentifier( char *in, char *end, Text **id ) {
// get size of id
size_t idLen( 0 );
char *start( in );
- while( !isSeparator( *in ) && !isNewLine( *in ) && ( in != end ) && *in != Grammar::OpenPropertyToken[ 0 ] && *in != Grammar::ClosePropertyToken[ 0 ] && *in != '$' ) {
+ while( !isSeparator( *in ) &&
+ !isNewLine( *in ) && ( in != end ) &&
+ *in != Grammar::OpenPropertyToken[ 0 ] &&
+ *in != Grammar::ClosePropertyToken[ 0 ] &&
+ *in != '$' ) {
++in;
++idLen;
}
const size_t len( idLen );
- Text *newId = new Text( start, len );
- *id = newId;
+ *id = new Text( start, len );
return in;
}
@@ -552,7 +568,7 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
for( unsigned int i = 0; i < Value::ddl_types_max; i++ ) {
prim_len = strlen( Grammar::PrimitiveTypeToken[ i ] );
if( 0 == strncmp( in, Grammar::PrimitiveTypeToken[ i ], prim_len ) ) {
- type = ( Value::ValueType ) i;
+ type = static_cast<Value::ValueType>( i );
break;
}
}
@@ -567,14 +583,14 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
bool ok( true );
if( *in == Grammar::OpenArrayToken[ 0 ] ) {
ok = false;
- in++;
+ ++in;
char *start( in );
while ( in != end ) {
- in++;
+ ++in;
if( *in == Grammar::CloseArrayToken[ 0 ] ) {
len = ::atoi( start );
ok = true;
- in++;
+ ++in;
break;
}
}
@@ -623,10 +639,10 @@ char *OpenDDLParser::parseBooleanLiteral( char *in, char *end, Value **boolean )
char *start( in );
size_t len( 0 );
while( !isSeparator( *in ) && in != end ) {
- in++;
- len++;
+ ++in;
+ ++len;
}
- len++;
+ ++len;
int res = ::strncmp( Grammar::BoolTrue, start, strlen( Grammar::BoolTrue ) );
if( 0 != res ) {
res = ::strncmp( Grammar::BoolFalse, start, strlen( Grammar::BoolFalse ) );
@@ -657,7 +673,7 @@ char *OpenDDLParser::parseIntegerLiteral( char *in, char *end, Value **integer,
in = lookForNextToken( in, end );
char *start( in );
while( !isSeparator( *in ) && in != end ) {
- in++;
+ ++in;
}
if( isNumeric( *start ) ) {
@@ -671,29 +687,29 @@ char *OpenDDLParser::parseIntegerLiteral( char *in, char *end, Value **integer,
*integer = ValueAllocator::allocPrimData( integerType );
switch( integerType ) {
case Value::ddl_int8:
- ( *integer )->setInt8( (int8) value );
- break;
+ ( *integer )->setInt8( (int8) value );
+ break;
case Value::ddl_int16:
- ( *integer )->setInt16( ( int16 ) value );
- break;
+ ( *integer )->setInt16( ( int16 ) value );
+ break;
case Value::ddl_int32:
- ( *integer )->setInt32( ( int32 ) value );
- break;
+ ( *integer )->setInt32( ( int32 ) value );
+ break;
case Value::ddl_int64:
- ( *integer )->setInt64( ( int64 ) value );
- break;
+ ( *integer )->setInt64( ( int64 ) value );
+ break;
case Value::ddl_unsigned_int8:
- ( *integer )->setUnsignedInt8( (uint8) uvalue );
- break;
+ ( *integer )->setUnsignedInt8( (uint8) uvalue );
+ break;
case Value::ddl_unsigned_int16:
- ( *integer )->setUnsignedInt16( ( uint16 ) uvalue );
- break;
+ ( *integer )->setUnsignedInt16( ( uint16 ) uvalue );
+ break;
case Value::ddl_unsigned_int32:
- ( *integer )->setUnsignedInt32( ( uint32 ) uvalue );
- break;
+ ( *integer )->setUnsignedInt32( ( uint32 ) uvalue );
+ break;
case Value::ddl_unsigned_int64:
- ( *integer )->setUnsignedInt64( ( uint64 ) uvalue );
- break;
+ ( *integer )->setUnsignedInt64( ( uint64 ) uvalue );
+ break;
default:
break;
}
@@ -711,7 +727,7 @@ char *OpenDDLParser::parseFloatingLiteral( char *in, char *end, Value **floating
in = lookForNextToken( in, end );
char *start( in );
while( !isSeparator( *in ) && in != end ) {
- in++;
+ ++in;
}
// parse the float value
@@ -732,8 +748,7 @@ char *OpenDDLParser::parseFloatingLiteral( char *in, char *end, Value **floating
}
if( ok ) {
- if(floatType == Value::ddl_double)
- {
+ if ( floatType == Value::ddl_double ) {
const double value( atof( start ) );
*floating = ValueAllocator::allocPrimData( Value::ddl_double );
( *floating )->setDouble( value );
@@ -757,17 +772,17 @@ char *OpenDDLParser::parseStringLiteral( char *in, char *end, Value **stringData
size_t len( 0 );
char *start( in );
if( *start == '\"' ) {
- start++;
- in++;
+ ++start;
+ ++in;
while( *in != '\"' && in != end ) {
- in++;
- len++;
+ ++in;
+ ++len;
}
*stringData = ValueAllocator::allocPrimData( Value::ddl_string, len );
::strncpy( ( char* ) ( *stringData )->m_data, start, len );
( *stringData )->m_data[len] = '\0';
- in++;
+ ++in;
}
return in;
@@ -791,12 +806,12 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
return in;
}
- in++;
+ ++in;
if( *in != 'x' && *in != 'X' ) {
return in;
}
- in++;
+ ++in;
bool ok( true );
char *start( in );
int pos( 0 );
@@ -805,8 +820,8 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
ok = false;
break;
}
- pos++;
- in++;
+ ++pos;
+ ++in;
}
if( !ok ) {
@@ -816,9 +831,9 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
int value( 0 );
while( pos > 0 ) {
int v = hex2Decimal( *start );
- pos--;
+ --pos;
value = ( value << 4 ) | v;
- start++;
+ ++start;
}
*data = ValueAllocator::allocPrimData( Value::ddl_unsigned_int64 );
@@ -841,7 +856,7 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
if( ddl_nullptr != id ) {
in = lookForNextToken( in, end );
if( *in == '=' ) {
- in++;
+ ++in;
in = getNextToken( in, end );
Value *primData( ddl_nullptr );
if( isInteger( in, end ) ) {
@@ -862,6 +877,8 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
( *prop )->m_ref = ref;
}
}
+ } else {
+ delete id;
}
}
@@ -878,7 +895,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
in = lookForNextToken( in, end );
if( *in == '{' ) {
- in++;
+ ++in;
Value *current( ddl_nullptr ), *prev( ddl_nullptr );
while( '}' != *in ) {
current = ddl_nullptr;
@@ -934,7 +951,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
prev->setNext( current );
prev = current;
}
- numValues++;
+ ++numValues;
}
in = getNextSeparator( in, end );
@@ -942,7 +959,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
break;
}
}
- in++;
+ ++in;
}
return in;
@@ -972,7 +989,7 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType ty
in = lookForNextToken( in, end );
if( *in == Grammar::OpenBracketToken[ 0 ] ) {
- in++;
+ ++in;
Value *currentValue( ddl_nullptr );
Reference *refs( ddl_nullptr );
DataArrayList *prev( ddl_nullptr ), *currentDataList( ddl_nullptr );
@@ -995,7 +1012,7 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType ty
}
} while( Grammar::CommaSeparator[ 0 ] == *in && in != end );
in = lookForNextToken( in, end );
- in++;
+ ++in;
}
return in;