diff --git a/src/ifcparse/IfcCharacterDecoder.cpp b/src/ifcparse/IfcCharacterDecoder.cpp index dd592b3349..7287532ad3 100644 --- a/src/ifcparse/IfcCharacterDecoder.cpp +++ b/src/ifcparse/IfcCharacterDecoder.cpp @@ -314,6 +314,8 @@ IfcCharacterEncoder::~IfcCharacterEncoder() { } IfcCharacterEncoder::operator std::string() { + std::ostringstream oss; + oss.put('\''); #ifdef HAVE_ICU // Either 2 or 4 to uses \X2 or \X4 respectively. // Currently hardcoded to 4, but \X2 might be @@ -321,7 +323,7 @@ IfcCharacterEncoder::operator std::string() { const int num_bytes = 4; const std::string num_bytes_str = std::string(1,num_bytes + 0x30); - std::ostringstream oss; + UChar32 ch; const char* source = str.c_str(); @@ -339,7 +341,7 @@ IfcCharacterEncoder::operator std::string() { } if ( within_spf_range ) { oss.put(ch); - if ( ch == '\\' ) oss.put(ch); + if ( ch == '\\' || ch == '\'' ) oss.put(ch); } else { oss << std::hex << std::setw(num_bytes*2) << std::uppercase << std::setfill('0') << (int) ch; } @@ -347,11 +349,15 @@ IfcCharacterEncoder::operator std::string() { } if ( in_extended ) oss << "\\X0\\"; - - return oss.str(); #else - return str; + for (std::string::const_iterator i = str.begin(); i != str.end(); ++i) { + char ch = *i; + if ( ch == '\\' || ch == '\'' ) oss.put(ch); + oss.put(ch); + } #endif + oss.put('\''); + return oss.str(); } diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index 39b9e2addc..792c28eebf 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -468,7 +468,13 @@ TokenArgument::operator IfcUtil::IfcSchemaEntity() const { return token.first->f TokenArgument::operator IfcEntities() const { throw IfcException("Argument is not a list of entities"); } unsigned int TokenArgument::Size() const { return 1; } ArgumentPtr TokenArgument::operator [] (unsigned int i) const { throw IfcException("Argument is not a list of arguments"); } -std::string TokenArgument::toString(bool upper) const { if ( upper && TokenFunc::isString(token) ) return IfcWrite::IfcCharacterEncoder(TokenFunc::toString(token)); else return TokenFunc::toString(token); } +std::string TokenArgument::toString(bool upper) const { + if ( upper && TokenFunc::isString(token) ) { + return IfcWrite::IfcCharacterEncoder(TokenFunc::asString(token)); + } else { + return TokenFunc::toString(token); + } +} bool TokenArgument::isNull() const { return TokenFunc::isOperator(token,'$'); } // // Functions for casting the EntityArgument to other types @@ -488,11 +494,18 @@ ArgumentPtr EntityArgument::operator [] (unsigned int i) const { throw IfcExcept std::string EntityArgument::toString(bool upper) const { ArgumentPtr arg = entity->wrappedValue(); IfcParse::TokenArgument* token_arg = dynamic_cast(arg); - std::string token_string = ( token_arg ) ? TokenFunc::toString(token_arg->token) : std::string(); + const bool is_string = TokenFunc::isString(token_arg->token); + std::string token_string = token_arg ? (is_string + ? TokenFunc::asString(token_arg->token) + : TokenFunc::toString(token_arg->token)) + : std::string(); std::string dt = Ifc2x3::Type::ToString(entity->type()); if ( upper ) { for (std::string::iterator p = dt.begin(); p != dt.end(); ++p ) *p = toupper(*p); - token_string = IfcWrite::IfcCharacterEncoder(token_string); + if (is_string) token_string = IfcWrite::IfcCharacterEncoder(token_string); + } else { + token_string.insert(token_string.begin(),'\''); + token_string.push_back('\''); } return dt + "(" + token_string + ")"; } diff --git a/src/ifcparse/IfcWrite.cpp b/src/ifcparse/IfcWrite.cpp index 9c611151b6..2a469d5736 100644 --- a/src/ifcparse/IfcWrite.cpp +++ b/src/ifcparse/IfcWrite.cpp @@ -288,7 +288,7 @@ std::string IfcWriteIntegralArgument::toString(bool upper) const { case Argument_STRING: { std::string d = *(std::string*) data; if ( upper ) d = IfcCharacterEncoder(d); - ss << '\'' << d << '\''; + ss << d; break; } case Argument_VECTOR_INT: ss << "(";