TEST_F( OpenDDLDefectsTest, Issue20_WrongColorNodeParsing ) {
    char token[] = "{0.588235, 0.588235, 0.588235}\n";
    size_t len( 0 );
    char *end = findEnd( token, len );

    Value *data( ddl_nullptr );
    Reference *refs( ddl_nullptr );
    size_t numRefs( 0 ), numValues( 0 );
    Value::ValueType type( Value::ddl_none );
    char *in = OpenDDLParser::parseDataList( token, end, type, &data, numValues, &refs, numRefs );
    ASSERT_FALSE( ddl_nullptr == in );
    ASSERT_FALSE( ddl_nullptr == data );
    ASSERT_EQ( 3U, numValues );
    delete data;
    delete refs;
}
示例#2
0
char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
    if( !isNumeric( *in ) && !isCharacter( *in ) ) {
        ++in;
    }

    in = lookForNextToken( in, end );
    Value::ValueType type( Value::ddl_none );
    size_t arrayLen( 0 );
    in = OpenDDLParser::parsePrimitiveDataType( in, end, type, arrayLen );
    if( Value::ddl_none != type ) {
        // parse a primitive data type
        in = lookForNextToken( in, end );
        if( *in == Grammar::OpenBracketToken[ 0 ] ) {
            Reference *refs( ddl_nullptr );
            DataArrayList *dtArrayList( ddl_nullptr );
            Value *values( ddl_nullptr );
            if( 1 == arrayLen ) {
                size_t numRefs( 0 ), numValues( 0 );
                in = parseDataList( in, end, type, &values, numValues, &refs, numRefs );
                setNodeValues( top(), values );
                setNodeReferences( top(), refs );
            } else if( arrayLen > 1 ) {
                in = parseDataArrayList( in, end, type, &dtArrayList );
                setNodeDataArrayList( top(), dtArrayList );
            } else {
                std::cerr << "0 for array is invalid." << std::endl;
                error = true;
            }
        }

        in = lookForNextToken( in, end );
        if( *in != '}' ) {
            logInvalidTokenError( in, std::string( Grammar::CloseBracketToken ), m_logCallback );
            return ddl_nullptr;
        } else {
            //in++;
        }
    } else {
        // parse a complex data type
        in = parseNextNode( in, end );
    }

    return in;
}
示例#3
0
char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType type, 
                                         DataArrayList **dataArrayList ) {
    if ( ddl_nullptr == dataArrayList ) {
        return in;
    }

    *dataArrayList = ddl_nullptr;
    if( ddl_nullptr == in || in == end ) {
        return in;
    }

    in = lookForNextToken( in, end );
    if( *in == Grammar::OpenBracketToken[ 0 ] ) {
        ++in;
        Value *currentValue( ddl_nullptr );
        Reference *refs( ddl_nullptr );
        DataArrayList *prev( ddl_nullptr ), *currentDataList( ddl_nullptr );
        do {
            size_t numRefs( 0 ), numValues( 0 );
            currentValue = ddl_nullptr;

            in = parseDataList( in, end, type, &currentValue, numValues, &refs, numRefs );
            if( ddl_nullptr != currentValue || 0 != numRefs ) {
                if( ddl_nullptr == prev ) {
                    *dataArrayList = createDataArrayList( currentValue, numValues, refs, numRefs );
                    prev = *dataArrayList;
                } else {
                    currentDataList = createDataArrayList( currentValue, numValues, refs, numRefs );
                    if( ddl_nullptr != prev ) {
                        prev->m_next = currentDataList;
                        prev = currentDataList;
                    }
                }
            }
        } while( Grammar::CommaSeparator[ 0 ] == *in && in != end );
        in = lookForNextToken( in, end );
        ++in;
    }

    return in;
}
示例#4
0
void ParticleChannelMap::DeleteIObject()
{
	_numRefs() -= 1;
	if (numRefs() <= 0) delete this;
}
void ParticleChannelInt::ReleaseIObject()
{
	_numRefs() -= 1;
	if (numRefs() <= 0) delete this;
}