OpenDDLParser: latest greatest.
parent
6f75ea5702
commit
eadc6116c0
|
@ -325,7 +325,7 @@ void Q3BSPFileImporter::CreateNodes( const Q3BSP::Q3BSPModel *pModel, aiScene* p
|
||||||
matIdx++;
|
matIdx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
pScene->mNumMeshes = MeshArray.size();
|
pScene->mNumMeshes = static_cast<unsigned int>( MeshArray.size() );
|
||||||
if ( pScene->mNumMeshes > 0 )
|
if ( pScene->mNumMeshes > 0 )
|
||||||
{
|
{
|
||||||
pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ];
|
pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ];
|
||||||
|
|
|
@ -117,7 +117,6 @@ const std::string &DDLNode::getType() const {
|
||||||
return m_type;
|
return m_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DDLNode::setName( const std::string &name ) {
|
void DDLNode::setName( const std::string &name ) {
|
||||||
m_name = name;
|
m_name = name;
|
||||||
}
|
}
|
||||||
|
@ -151,6 +150,7 @@ Property *DDLNode::findPropertyByName( const std::string &name ) {
|
||||||
if( ddl_nullptr == m_properties ) {
|
if( ddl_nullptr == m_properties ) {
|
||||||
return ddl_nullptr;
|
return ddl_nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Property *current( m_properties );
|
Property *current( m_properties );
|
||||||
while( ddl_nullptr != current ) {
|
while( ddl_nullptr != current ) {
|
||||||
int res = strncmp( current->m_key->m_text.m_buffer, name.c_str(), name.size() );
|
int res = strncmp( current->m_key->m_text.m_buffer, name.c_str(), name.size() );
|
||||||
|
|
|
@ -22,16 +22,61 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
-----------------------------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------------------------*/
|
||||||
#include <openddlparser/OpenDDLExport.h>
|
#include <openddlparser/OpenDDLExport.h>
|
||||||
#include <openddlparser/DDLNode.h>
|
#include <openddlparser/DDLNode.h>
|
||||||
|
#include <openddlparser/Value.h>
|
||||||
|
#include <openddlparser/OpenDDLParser.h>
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
|
IOStreamBase::IOStreamBase()
|
||||||
|
: m_file( ddl_nullptr ) {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
IOStreamBase::~IOStreamBase() {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IOStreamBase::open( const std::string &name ) {
|
||||||
|
m_file = ::fopen( name.c_str(), "a" );
|
||||||
|
if (m_file == ddl_nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IOStreamBase::close() {
|
||||||
|
if (ddl_nullptr == m_file) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
::fclose( m_file );
|
||||||
|
m_file = ddl_nullptr;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IOStreamBase::write( const std::string &statement ) {
|
||||||
|
if (ddl_nullptr == m_file) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
::fwrite( statement.c_str(), sizeof( char ), statement.size(), m_file );
|
||||||
|
}
|
||||||
|
|
||||||
struct DDLNodeIterator {
|
struct DDLNodeIterator {
|
||||||
const DDLNode::DllNodeList &m_childs;
|
const DDLNode::DllNodeList &m_childs;
|
||||||
size_t m_idx;
|
size_t m_idx;
|
||||||
|
|
||||||
DDLNodeIterator( const DDLNode::DllNodeList &childs )
|
DDLNodeIterator( const DDLNode::DllNodeList &childs )
|
||||||
: m_childs( childs )
|
: m_childs( childs )
|
||||||
, m_idx( 0 ) {
|
, m_idx( 0 ) {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
~DDLNodeIterator() {
|
||||||
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getNext( DDLNode **node ) {
|
bool getNext( DDLNode **node ) {
|
||||||
|
@ -45,33 +90,43 @@ struct DDLNodeIterator {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
OpenDDLExport::OpenDDLExport()
|
static void writeLineEnd( std::string &statement ) {
|
||||||
:m_file( nullptr ) {
|
statement += "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenDDLExport::OpenDDLExport( IOStreamBase *stream )
|
||||||
|
: m_stream( stream ) {
|
||||||
|
if (ddl_nullptr == m_stream) {
|
||||||
|
m_stream = new IOStreamBase();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OpenDDLExport::~OpenDDLExport() {
|
OpenDDLExport::~OpenDDLExport() {
|
||||||
if( nullptr != m_file ) {
|
if (ddl_nullptr != m_stream) {
|
||||||
::fclose( m_file );
|
m_stream->close();
|
||||||
m_file = nullptr;
|
|
||||||
}
|
}
|
||||||
|
delete m_stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenDDLExport::exportContext( Context *ctx, const std::string &filename ) {
|
bool OpenDDLExport::exportContext( Context *ctx, const std::string &filename ) {
|
||||||
if( filename.empty() ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ddl_nullptr == ctx ) {
|
if( ddl_nullptr == ctx ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DDLNode *root( ctx->m_root );
|
DDLNode *root( ctx->m_root );
|
||||||
if( nullptr == root ) {
|
if ( ddl_nullptr == root ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return handleNode( root );
|
if (!filename.empty()) {
|
||||||
|
if (!m_stream->open( filename )) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool retValue( handleNode( root ) );
|
||||||
|
|
||||||
|
return retValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenDDLExport::handleNode( DDLNode *node ) {
|
bool OpenDDLExport::handleNode( DDLNode *node ) {
|
||||||
|
@ -85,12 +140,13 @@ bool OpenDDLExport::handleNode( DDLNode *node ) {
|
||||||
}
|
}
|
||||||
DDLNode *current( ddl_nullptr );
|
DDLNode *current( ddl_nullptr );
|
||||||
DDLNodeIterator it( childs );
|
DDLNodeIterator it( childs );
|
||||||
|
std::string statement;
|
||||||
bool success( true );
|
bool success( true );
|
||||||
while( it.getNext( ¤t ) ) {
|
while( it.getNext( ¤t ) ) {
|
||||||
if( ddl_nullptr != current ) {
|
if( ddl_nullptr != current ) {
|
||||||
success |= writeNode( current );
|
success |= writeNode( current, statement );
|
||||||
if( !handleNode( current ) ) {
|
if( !handleNode( current ) ) {
|
||||||
success != false;
|
success = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,17 +154,257 @@ bool OpenDDLExport::handleNode( DDLNode *node ) {
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenDDLExport::writeNode( DDLNode *node ) {
|
bool OpenDDLExport::writeToStream( const std::string &statement ) {
|
||||||
bool success( true );
|
if (ddl_nullptr == m_stream ) {
|
||||||
if( node->hasProperties() ) {
|
return false;
|
||||||
success |= writeProperties( node );
|
}
|
||||||
|
|
||||||
|
if ( !statement.empty()) {
|
||||||
|
m_stream->write( statement );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenDDLExport::writeProperties( DDLNode *node ) {
|
bool OpenDDLExport::writeNode( DDLNode *node, std::string &statement ) {
|
||||||
|
bool success( true );
|
||||||
|
writeNodeHeader( node, statement );
|
||||||
|
if (node->hasProperties()) {
|
||||||
|
success |= writeProperties( node, statement );
|
||||||
|
}
|
||||||
|
writeLineEnd( statement );
|
||||||
|
|
||||||
|
statement = "}";
|
||||||
|
DataArrayList *al( node->getDataArrayList() );
|
||||||
|
if ( ddl_nullptr != al ) {
|
||||||
|
writeValueType( al->m_dataList->m_type, al->m_numItems, statement );
|
||||||
|
writeValueArray( al, statement );
|
||||||
|
}
|
||||||
|
Value *v( node->getValue() );
|
||||||
|
if (ddl_nullptr != v ) {
|
||||||
|
writeValueType( v->m_type, 1, statement );
|
||||||
|
statement = "{";
|
||||||
|
writeLineEnd( statement );
|
||||||
|
writeValue( v, statement );
|
||||||
|
statement = "}";
|
||||||
|
writeLineEnd( statement );
|
||||||
|
}
|
||||||
|
statement = "}";
|
||||||
|
writeLineEnd( statement );
|
||||||
|
|
||||||
|
writeToStream( statement );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDDLExport::writeNodeHeader( DDLNode *node, std::string &statement ) {
|
||||||
|
if (ddl_nullptr == node) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
statement += node->getType();
|
||||||
|
const std::string &name( node->getName() );
|
||||||
|
if ( !name.empty() ) {
|
||||||
|
statement += " ";
|
||||||
|
statement += "$";
|
||||||
|
statement += name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDDLExport::writeProperties( DDLNode *node, std::string &statement ) {
|
||||||
|
if ( ddl_nullptr == node ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Property *prop( node->getProperties() );
|
Property *prop( node->getProperties() );
|
||||||
|
// if no properties are there, return
|
||||||
|
if ( ddl_nullptr == prop ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ddl_nullptr != prop ) {
|
||||||
|
// for instance (attrib = "position", bla=2)
|
||||||
|
statement += "(";
|
||||||
|
bool first( true );
|
||||||
|
while ( ddl_nullptr != prop ) {
|
||||||
|
if (!first) {
|
||||||
|
statement += ", ";
|
||||||
|
} else {
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
statement += std::string( prop->m_key->m_text.m_buffer );
|
||||||
|
statement += " = ";
|
||||||
|
writeValue( prop->m_value, statement );
|
||||||
|
prop = prop->m_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
statement += ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDDLExport::writeValueType( Value::ValueType type, size_t numItems, std::string &statement ) {
|
||||||
|
if ( Value::ddl_types_max == type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string typeStr( getTypeToken( type ) );
|
||||||
|
statement += typeStr;
|
||||||
|
// if we have an array to write
|
||||||
|
if ( numItems > 1 ) {
|
||||||
|
statement += "[";
|
||||||
|
char buffer[ 256 ];
|
||||||
|
::memset( buffer, '\0', 256 * sizeof( char ) );
|
||||||
|
sprintf( buffer, "%d", numItems );
|
||||||
|
statement += buffer;
|
||||||
|
statement += "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDDLExport::writeValue( Value *val, std::string &statement ) {
|
||||||
|
if (ddl_nullptr == val) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( val->m_type ) {
|
||||||
|
case Value::ddl_bool:
|
||||||
|
if ( true == val->getBool() ) {
|
||||||
|
statement += "true";
|
||||||
|
} else {
|
||||||
|
statement += "false";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_int8:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
const int i = static_cast<int>( val->getInt8() );
|
||||||
|
stream << i;
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_int16:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
char buffer[ 256 ];
|
||||||
|
::memset( buffer, '\0', 256 * sizeof( char ) );
|
||||||
|
sprintf( buffer, "%d", val->getInt16() );
|
||||||
|
statement += buffer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_int32:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
char buffer[ 256 ];
|
||||||
|
::memset( buffer, '\0', 256 * sizeof( char ) );
|
||||||
|
const int i = static_cast< int >( val->getInt32() );
|
||||||
|
sprintf( buffer, "%d", i );
|
||||||
|
statement += buffer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_int64:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
const int i = static_cast< int >( val->getInt64() );
|
||||||
|
stream << i;
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_unsigned_int8:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
const int i = static_cast< unsigned int >( val->getUnsignedInt8() );
|
||||||
|
stream << i;
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_unsigned_int16:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
const int i = static_cast< unsigned int >( val->getUnsignedInt16() );
|
||||||
|
stream << i;
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_unsigned_int32:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
const int i = static_cast< unsigned int >( val->getUnsignedInt32() );
|
||||||
|
stream << i;
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_unsigned_int64:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
const int i = static_cast< unsigned int >( val->getUnsignedInt64() );
|
||||||
|
stream << i;
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_half:
|
||||||
|
break;
|
||||||
|
case Value::ddl_float:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << val->getFloat();
|
||||||
|
statement += stream.str();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_double:
|
||||||
|
break;
|
||||||
|
case Value::ddl_string:
|
||||||
|
{
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << val->getString();
|
||||||
|
statement += "\"";
|
||||||
|
statement += stream.str();
|
||||||
|
statement += "\"";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Value::ddl_ref:
|
||||||
|
break;
|
||||||
|
case Value::ddl_none:
|
||||||
|
case Value::ddl_types_max:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDDLExport::writeValueArray( DataArrayList *al, std::string &statement ) {
|
||||||
|
if (ddl_nullptr == al) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == al->m_numItems) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DataArrayList *nextDataArrayList = al ;
|
||||||
|
Value *nextValue( nextDataArrayList->m_dataList );
|
||||||
|
while (ddl_nullptr != nextDataArrayList) {
|
||||||
|
if (ddl_nullptr != nextDataArrayList) {
|
||||||
|
statement += "{ ";
|
||||||
|
nextValue = nextDataArrayList->m_dataList;
|
||||||
|
size_t idx( 0 );
|
||||||
|
while (ddl_nullptr != nextValue) {
|
||||||
|
if (idx > 0) {
|
||||||
|
statement += ", ";
|
||||||
|
}
|
||||||
|
writeValue( nextValue, statement );
|
||||||
|
nextValue = nextValue->m_next;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
statement += " }";
|
||||||
|
}
|
||||||
|
nextDataArrayList = nextDataArrayList->m_next;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
-----------------------------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------------------------*/
|
||||||
#include <openddlparser/OpenDDLParser.h>
|
#include <openddlparser/OpenDDLParser.h>
|
||||||
|
#include <openddlparser/OpenDDLExport.h>
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
@ -67,6 +68,10 @@ namespace Grammar {
|
||||||
};
|
};
|
||||||
} // Namespace Grammar
|
} // Namespace Grammar
|
||||||
|
|
||||||
|
const char *getTypeToken( Value::ValueType type ) {
|
||||||
|
return Grammar::PrimitiveTypeToken[ type ];
|
||||||
|
}
|
||||||
|
|
||||||
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
|
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << "Invalid token " << *in << ", " << exp << " expected." << std::endl;
|
stream << "Invalid token " << *in << ", " << exp << " expected." << std::endl;
|
||||||
|
@ -211,13 +216,12 @@ bool OpenDDLParser::exportContext( Context *ctx, const std::string &filename ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( filename.empty() ) {
|
OpenDDLExport myExporter;
|
||||||
return false;
|
return myExporter.exportContext( ctx, filename );
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char *OpenDDLParser::parseNextNode( char *in, char *end ) {
|
char *OpenDDLParser::parseNextNode( char *in, char *end ) {
|
||||||
in = parseHeader( in, end );
|
in = parseHeader( in, end );
|
||||||
in = parseStructure( in, end );
|
in = parseStructure( in, end );
|
||||||
|
@ -227,6 +231,7 @@ char *OpenDDLParser::parseNextNode( char *in, char *end ) {
|
||||||
|
|
||||||
static void dumpId( Identifier *id ) {
|
static void dumpId( Identifier *id ) {
|
||||||
if( ddl_nullptr != id ) {
|
if( ddl_nullptr != id ) {
|
||||||
|
if ( ddl_nullptr != id->m_text.m_buffer ) { }
|
||||||
std::cout << id->m_text.m_buffer << std::endl;
|
std::cout << id->m_text.m_buffer << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -366,7 +371,7 @@ char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
|
||||||
Value *values( ddl_nullptr );
|
Value *values( ddl_nullptr );
|
||||||
if( 1 == arrayLen ) {
|
if( 1 == arrayLen ) {
|
||||||
size_t numRefs( 0 ), numValues( 0 );
|
size_t numRefs( 0 ), numValues( 0 );
|
||||||
in = parseDataList( in, end, &values, numValues, &refs, numRefs );
|
in = parseDataList( in, end, type, &values, numValues, &refs, numRefs );
|
||||||
setNodeValues( top(), values );
|
setNodeValues( top(), values );
|
||||||
setNodeReferences( top(), refs );
|
setNodeReferences( top(), refs );
|
||||||
} else if( arrayLen > 1 ) {
|
} else if( arrayLen > 1 ) {
|
||||||
|
@ -548,7 +553,7 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
|
||||||
while ( in != end ) {
|
while ( in != end ) {
|
||||||
in++;
|
in++;
|
||||||
if( *in == Grammar::CloseArrayToken[ 0 ] ) {
|
if( *in == Grammar::CloseArrayToken[ 0 ] ) {
|
||||||
len = atoi( start );
|
len = ::atoi( start );
|
||||||
ok = true;
|
ok = true;
|
||||||
in++;
|
in++;
|
||||||
break;
|
break;
|
||||||
|
@ -814,7 +819,7 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, size_t &numValues, Reference **refs, size_t &numRefs ) {
|
char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type, Value **data, size_t &numValues, Reference **refs, size_t &numRefs ) {
|
||||||
*data = ddl_nullptr;
|
*data = ddl_nullptr;
|
||||||
numValues = numRefs = 0;
|
numValues = numRefs = 0;
|
||||||
if( ddl_nullptr == in || in == end ) {
|
if( ddl_nullptr == in || in == end ) {
|
||||||
|
@ -828,23 +833,37 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, size_t &n
|
||||||
while( '}' != *in ) {
|
while( '}' != *in ) {
|
||||||
current = ddl_nullptr;
|
current = ddl_nullptr;
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
if( isInteger( in, end ) ) {
|
if (Value::ddl_none == type) {
|
||||||
|
if (isInteger( in, end )) {
|
||||||
in = parseIntegerLiteral( in, end, ¤t );
|
in = parseIntegerLiteral( in, end, ¤t );
|
||||||
} else if( isFloat( in, end ) ) {
|
}
|
||||||
|
else if (isFloat( in, end )) {
|
||||||
in = parseFloatingLiteral( in, end, ¤t );
|
in = parseFloatingLiteral( in, end, ¤t );
|
||||||
} else if( isStringLiteral( *in ) ) {
|
}
|
||||||
|
else if (isStringLiteral( *in )) {
|
||||||
in = parseStringLiteral( in, end, ¤t );
|
in = parseStringLiteral( in, end, ¤t );
|
||||||
} else if( isHexLiteral( in, end ) ) {
|
}
|
||||||
|
else if (isHexLiteral( in, end )) {
|
||||||
in = parseHexaLiteral( in, end, ¤t );
|
in = parseHexaLiteral( in, end, ¤t );
|
||||||
} else { // reference data
|
}
|
||||||
|
else { // reference data
|
||||||
std::vector<Name*> names;
|
std::vector<Name*> names;
|
||||||
in = parseReference( in, end, names );
|
in = parseReference( in, end, names );
|
||||||
if( !names.empty() ) {
|
if (!names.empty()) {
|
||||||
Reference *ref = new Reference( names.size(), &names[ 0 ] );
|
Reference *ref = new Reference( names.size(), &names[ 0 ] );
|
||||||
*refs = ref;
|
*refs = ref;
|
||||||
numRefs = names.size();
|
numRefs = names.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (Value::ddl_int32 == type) {
|
||||||
|
in = parseIntegerLiteral( in, end, ¤t );
|
||||||
|
} else if (Value::ddl_float == type) {
|
||||||
|
in = parseFloatingLiteral( in, end, ¤t );
|
||||||
|
} else if (Value::ddl_string == type) {
|
||||||
|
in = parseStringLiteral( in, end, ¤t );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( ddl_nullptr != current ) {
|
if( ddl_nullptr != current ) {
|
||||||
if( ddl_nullptr == *data ) {
|
if( ddl_nullptr == *data ) {
|
||||||
|
@ -891,7 +910,8 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end, DataArrayList **da
|
||||||
do {
|
do {
|
||||||
size_t numRefs( 0 ), numValues( 0 );
|
size_t numRefs( 0 ), numValues( 0 );
|
||||||
currentValue = ddl_nullptr;
|
currentValue = ddl_nullptr;
|
||||||
in = parseDataList( in, end, ¤tValue, numValues, &refs, numRefs );
|
Value::ValueType type( Value::ddl_none );
|
||||||
|
in = parseDataList( in, end, type, ¤tValue, numValues, &refs, numRefs );
|
||||||
if( ddl_nullptr != currentValue ) {
|
if( ddl_nullptr != currentValue ) {
|
||||||
if( ddl_nullptr == prev ) {
|
if( ddl_nullptr == prev ) {
|
||||||
*dataList = createDataArrayList( currentValue, numValues );
|
*dataList = createDataArrayList( currentValue, numValues );
|
||||||
|
|
|
@ -95,7 +95,7 @@ bool Value::Iterator::operator == ( const Iterator &rhs ) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Value *Value::Iterator::operator->( ) const {
|
Value *Value::Iterator::operator->( ) const {
|
||||||
if( nullptr == m_current ) {
|
if(ddl_nullptr == m_current ) {
|
||||||
return ddl_nullptr;
|
return ddl_nullptr;
|
||||||
}
|
}
|
||||||
return m_current;
|
return m_current;
|
||||||
|
@ -120,7 +120,6 @@ void Value::setBool( bool value ) {
|
||||||
|
|
||||||
bool Value::getBool() {
|
bool Value::getBool() {
|
||||||
assert( ddl_bool == m_type );
|
assert( ddl_bool == m_type );
|
||||||
|
|
||||||
return ( *m_data == 1 );
|
return ( *m_data == 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +140,9 @@ void Value::setInt16( int16 value ) {
|
||||||
|
|
||||||
int16 Value::getInt16() {
|
int16 Value::getInt16() {
|
||||||
assert( ddl_int16 == m_type );
|
assert( ddl_int16 == m_type );
|
||||||
return ( int16 ) ( *m_data );
|
int16 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setInt32( int32 value ) {
|
void Value::setInt32( int32 value ) {
|
||||||
|
@ -151,16 +152,21 @@ void Value::setInt32( int32 value ) {
|
||||||
|
|
||||||
int32 Value::getInt32() {
|
int32 Value::getInt32() {
|
||||||
assert( ddl_int32 == m_type );
|
assert( ddl_int32 == m_type );
|
||||||
return ( int32 ) ( *m_data );
|
int32 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setInt64( int64 value ) {
|
void Value::setInt64( int64 value ) {
|
||||||
assert( ddl_int32 == m_type );
|
assert( ddl_int64 == m_type );
|
||||||
::memcpy( m_data, &value, m_size );
|
::memcpy( m_data, &value, m_size );
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 Value::getInt64() {
|
int64 Value::getInt64() {
|
||||||
return ( int64 ) ( *m_data );
|
assert( ddl_int64 == m_type );
|
||||||
|
int64 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setUnsignedInt8( uint8 value ) {
|
void Value::setUnsignedInt8( uint8 value ) {
|
||||||
|
@ -170,7 +176,9 @@ void Value::setUnsignedInt8( uint8 value ) {
|
||||||
|
|
||||||
uint8 Value::getUnsignedInt8() const {
|
uint8 Value::getUnsignedInt8() const {
|
||||||
assert( ddl_unsigned_int8 == m_type );
|
assert( ddl_unsigned_int8 == m_type );
|
||||||
return ( uint8 ) ( *m_data );
|
uint8 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setUnsignedInt16( uint16 value ) {
|
void Value::setUnsignedInt16( uint16 value ) {
|
||||||
|
@ -180,7 +188,9 @@ void Value::setUnsignedInt16( uint16 value ) {
|
||||||
|
|
||||||
uint16 Value::getUnsignedInt16() const {
|
uint16 Value::getUnsignedInt16() const {
|
||||||
assert( ddl_unsigned_int16 == m_type );
|
assert( ddl_unsigned_int16 == m_type );
|
||||||
return ( uint8 ) ( *m_data );
|
uint16 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setUnsignedInt32( uint32 value ) {
|
void Value::setUnsignedInt32( uint32 value ) {
|
||||||
|
@ -190,7 +200,9 @@ void Value::setUnsignedInt32( uint32 value ) {
|
||||||
|
|
||||||
uint32 Value::getUnsignedInt32() const {
|
uint32 Value::getUnsignedInt32() const {
|
||||||
assert( ddl_unsigned_int32 == m_type );
|
assert( ddl_unsigned_int32 == m_type );
|
||||||
return ( uint8 ) ( *m_data );
|
uint32 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setUnsignedInt64( uint64 value ) {
|
void Value::setUnsignedInt64( uint64 value ) {
|
||||||
|
@ -200,7 +212,9 @@ void Value::setUnsignedInt64( uint64 value ) {
|
||||||
|
|
||||||
uint64 Value::getUnsignedInt64() const {
|
uint64 Value::getUnsignedInt64() const {
|
||||||
assert( ddl_unsigned_int64 == m_type );
|
assert( ddl_unsigned_int64 == m_type );
|
||||||
return ( uint64 ) ( *m_data );
|
uint64 i;
|
||||||
|
::memcpy( &i, m_data, m_size );
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setFloat( float value ) {
|
void Value::setFloat( float value ) {
|
||||||
|
@ -226,6 +240,7 @@ void Value::setDouble( double value ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
double Value::getDouble() const {
|
double Value::getDouble() const {
|
||||||
|
assert( ddl_double == m_type );
|
||||||
double v;
|
double v;
|
||||||
::memcpy( &v, m_data, m_size );
|
::memcpy( &v, m_data, m_size );
|
||||||
return v;
|
return v;
|
||||||
|
@ -237,6 +252,7 @@ void Value::setString( const std::string &str ) {
|
||||||
m_data[ str.size() ] = '\0';
|
m_data[ str.size() ] = '\0';
|
||||||
}
|
}
|
||||||
const char *Value::getString() const {
|
const char *Value::getString() const {
|
||||||
|
assert( ddl_string == m_type );
|
||||||
return (const char*) m_data;
|
return (const char*) m_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,22 +328,25 @@ Value *ValueAllocator::allocPrimData( Value::ValueType type, size_t len ) {
|
||||||
data->m_size = sizeof( bool );
|
data->m_size = sizeof( bool );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int8:
|
case Value::ddl_int8:
|
||||||
data->m_size = sizeof( char );
|
data->m_size = sizeof( int8 );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int16:
|
case Value::ddl_int16:
|
||||||
data->m_size = sizeof( short );
|
data->m_size = sizeof( int16 );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int32:
|
case Value::ddl_int32:
|
||||||
data->m_size = sizeof( int );
|
data->m_size = sizeof( int32 );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int64:
|
case Value::ddl_int64:
|
||||||
data->m_size = sizeof( int64 );
|
data->m_size = sizeof( int64 );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int8:
|
case Value::ddl_unsigned_int8:
|
||||||
data->m_size = sizeof( unsigned char );
|
data->m_size = sizeof( uint8 );
|
||||||
|
break;
|
||||||
|
case Value::ddl_unsigned_int16:
|
||||||
|
data->m_size = sizeof( uint16 );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int32:
|
case Value::ddl_unsigned_int32:
|
||||||
data->m_size = sizeof( unsigned int );
|
data->m_size = sizeof( uint32 );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int64:
|
case Value::ddl_unsigned_int64:
|
||||||
data->m_size = sizeof( uint64 );
|
data->m_size = sizeof( uint64 );
|
||||||
|
|
|
@ -26,6 +26,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
# include <inttypes.h>
|
# include <inttypes.h>
|
||||||
|
|
|
@ -23,26 +23,66 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <openddlparser/OpenDDLCommon.h>
|
#include <openddlparser/OpenDDLCommon.h>
|
||||||
|
#include <openddlparser/Value.h>
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
///
|
//-------------------------------------------------------------------------------------------------
|
||||||
/// @ingroup OpenDDLParser
|
/// @ingroup IOStreamBase
|
||||||
/// @brief This class represents the OpenDDLExporter.
|
/// @brief This class represents the stream to write out.
|
||||||
///
|
//-------------------------------------------------------------------------------------------------
|
||||||
class DLL_ODDLPARSER_EXPORT OpenDDLExport {
|
class DLL_ODDLPARSER_EXPORT IOStreamBase {
|
||||||
public:
|
public:
|
||||||
OpenDDLExport();
|
IOStreamBase();
|
||||||
~OpenDDLExport();
|
virtual ~IOStreamBase();
|
||||||
bool exportContext( Context *ctx, const std::string &filename );
|
virtual bool open( const std::string &anme );
|
||||||
bool handleNode( DDLNode *node );
|
virtual bool close();
|
||||||
|
virtual void write( const std::string &statement );
|
||||||
protected:
|
|
||||||
bool writeNode( DDLNode *node );
|
|
||||||
bool writeProperties( DDLNode *node );
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FILE *m_file;
|
FILE *m_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
/// @ingroup OpenDDLParser
|
||||||
|
/// @brief This class represents the OpenDDLExporter.
|
||||||
|
///
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
class DLL_ODDLPARSER_EXPORT OpenDDLExport {
|
||||||
|
public:
|
||||||
|
/// @brief The class constructor
|
||||||
|
OpenDDLExport( IOStreamBase *stream = ddl_nullptr );
|
||||||
|
|
||||||
|
/// @brief The class destructor.
|
||||||
|
~OpenDDLExport();
|
||||||
|
|
||||||
|
/// @brief Export the data of a parser context.
|
||||||
|
/// @param ctx [in] Pointer to the context.
|
||||||
|
/// @param filename [in] The filename for the export.
|
||||||
|
/// @return True in case of success, false in case of an error.
|
||||||
|
bool exportContext( Context *ctx, const std::string &filename );
|
||||||
|
|
||||||
|
/// @brief Handles a node export.
|
||||||
|
/// @param node [in] The node to handle with.
|
||||||
|
/// @return True in case of success, false in case of an error.
|
||||||
|
bool handleNode( DDLNode *node );
|
||||||
|
|
||||||
|
/// @brief Writes the statement to the stream.
|
||||||
|
/// @param statement [in] The content to write.
|
||||||
|
/// @return True in case of success, false in case of an error.
|
||||||
|
bool writeToStream( const std::string &statement );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool writeNode( DDLNode *node, std::string &statement );
|
||||||
|
bool writeNodeHeader( DDLNode *node, std::string &statement );
|
||||||
|
bool writeProperties( DDLNode *node, std::string &statement );
|
||||||
|
bool writeValueType( Value::ValueType type, size_t numItems, std::string &statement );
|
||||||
|
bool writeValue( Value *val, std::string &statement );
|
||||||
|
bool writeValueArray( DataArrayList *al, std::string &statement );
|
||||||
|
|
||||||
|
private:
|
||||||
|
IOStreamBase *m_stream;
|
||||||
|
};
|
||||||
|
|
||||||
END_ODDLPARSER_NS
|
END_ODDLPARSER_NS
|
||||||
|
|
|
@ -80,6 +80,8 @@ enum LogSeverity {
|
||||||
ddl_error_msg ///< Parser errors
|
ddl_error_msg ///< Parser errors
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DLL_ODDLPARSER_EXPORT const char *getTypeToken( Value::ValueType type );
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------
|
||||||
/// @class OpenDDLParser
|
/// @class OpenDDLParser
|
||||||
/// @ingroup OpenDDLParser
|
/// @ingroup OpenDDLParser
|
||||||
|
@ -168,7 +170,7 @@ public: // parser helpers
|
||||||
static char *parseStringLiteral( char *in, char *end, Value **stringData );
|
static char *parseStringLiteral( char *in, char *end, Value **stringData );
|
||||||
static char *parseHexaLiteral( char *in, char *end, Value **data );
|
static char *parseHexaLiteral( char *in, char *end, Value **data );
|
||||||
static char *parseProperty( char *in, char *end, Property **prop );
|
static char *parseProperty( char *in, char *end, Property **prop );
|
||||||
static char *parseDataList( char *in, char *end, Value **data, size_t &numValues, Reference **refs, size_t &numRefs );
|
static char *parseDataList( char *in, char *end, Value::ValueType type, Value **data, size_t &numValues, Reference **refs, size_t &numRefs );
|
||||||
static char *parseDataArrayList( char *in, char *end, DataArrayList **dataList );
|
static char *parseDataArrayList( char *in, char *end, DataArrayList **dataList );
|
||||||
static const char *getVersion();
|
static const char *getVersion();
|
||||||
|
|
||||||
|
|
|
@ -151,11 +151,23 @@ public:
|
||||||
size_t m_size;
|
size_t m_size;
|
||||||
unsigned char *m_data;
|
unsigned char *m_data;
|
||||||
Value *m_next;
|
Value *m_next;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Value &operator =( const Value & );
|
||||||
|
Value( const Value & );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
///------------------------------------------------------------------------------------------------
|
||||||
|
/// @brief This class implements the value allocator.
|
||||||
|
///------------------------------------------------------------------------------------------------
|
||||||
struct DLL_ODDLPARSER_EXPORT ValueAllocator {
|
struct DLL_ODDLPARSER_EXPORT ValueAllocator {
|
||||||
static Value *allocPrimData( Value::ValueType type, size_t len = 1 );
|
static Value *allocPrimData( Value::ValueType type, size_t len = 1 );
|
||||||
static void releasePrimData( Value **data );
|
static void releasePrimData( Value **data );
|
||||||
|
|
||||||
|
private:
|
||||||
|
ValueAllocator();
|
||||||
|
ValueAllocator( const ValueAllocator & );
|
||||||
|
ValueAllocator &operator = ( const ValueAllocator & );
|
||||||
};
|
};
|
||||||
|
|
||||||
END_ODDLPARSER_NS
|
END_ODDLPARSER_NS
|
||||||
|
|
Loading…
Reference in New Issue