Correctly escape apostrophes in strings on write using the IfcCharacterEncoder

This commit is contained in:
Thomas Krijnen
2012-10-09 19:54:35 +00:00
parent 2f500aa098
commit 8b11a1baf7
3 changed files with 28 additions and 9 deletions
+11 -5
View File
@@ -314,6 +314,8 @@ IfcCharacterEncoder::~IfcCharacterEncoder() {
} }
IfcCharacterEncoder::operator std::string() { IfcCharacterEncoder::operator std::string() {
std::ostringstream oss;
oss.put('\'');
#ifdef HAVE_ICU #ifdef HAVE_ICU
// Either 2 or 4 to uses \X2 or \X4 respectively. // Either 2 or 4 to uses \X2 or \X4 respectively.
// Currently hardcoded to 4, but \X2 might be // Currently hardcoded to 4, but \X2 might be
@@ -321,7 +323,7 @@ IfcCharacterEncoder::operator std::string() {
const int num_bytes = 4; const int num_bytes = 4;
const std::string num_bytes_str = std::string(1,num_bytes + 0x30); const std::string num_bytes_str = std::string(1,num_bytes + 0x30);
std::ostringstream oss;
UChar32 ch; UChar32 ch;
const char* source = str.c_str(); const char* source = str.c_str();
@@ -339,7 +341,7 @@ IfcCharacterEncoder::operator std::string() {
} }
if ( within_spf_range ) { if ( within_spf_range ) {
oss.put(ch); oss.put(ch);
if ( ch == '\\' ) oss.put(ch); if ( ch == '\\' || ch == '\'' ) oss.put(ch);
} else { } else {
oss << std::hex << std::setw(num_bytes*2) << std::uppercase << std::setfill('0') << (int) ch; 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\\"; if ( in_extended ) oss << "\\X0\\";
return oss.str();
#else #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 #endif
oss.put('\'');
return oss.str();
} }
+16 -3
View File
@@ -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"); } TokenArgument::operator IfcEntities() const { throw IfcException("Argument is not a list of entities"); }
unsigned int TokenArgument::Size() const { return 1; } unsigned int TokenArgument::Size() const { return 1; }
ArgumentPtr TokenArgument::operator [] (unsigned int i) const { throw IfcException("Argument is not a list of arguments"); } 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,'$'); } bool TokenArgument::isNull() const { return TokenFunc::isOperator(token,'$'); }
// //
// Functions for casting the EntityArgument to other types // 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 { std::string EntityArgument::toString(bool upper) const {
ArgumentPtr arg = entity->wrappedValue(); ArgumentPtr arg = entity->wrappedValue();
IfcParse::TokenArgument* token_arg = dynamic_cast<IfcParse::TokenArgument*>(arg); IfcParse::TokenArgument* token_arg = dynamic_cast<IfcParse::TokenArgument*>(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()); std::string dt = Ifc2x3::Type::ToString(entity->type());
if ( upper ) { if ( upper ) {
for (std::string::iterator p = dt.begin(); p != dt.end(); ++p ) *p = toupper(*p); 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 + ")"; return dt + "(" + token_string + ")";
} }
+1 -1
View File
@@ -288,7 +288,7 @@ std::string IfcWriteIntegralArgument::toString(bool upper) const {
case Argument_STRING: { case Argument_STRING: {
std::string d = *(std::string*) data; std::string d = *(std::string*) data;
if ( upper ) d = IfcCharacterEncoder(d); if ( upper ) d = IfcCharacterEncoder(d);
ss << '\'' << d << '\''; ss << d;
break; break;
} case Argument_VECTOR_INT: } case Argument_VECTOR_INT:
ss << "("; ss << "(";