mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 02:07:36 +00:00
Correctly escape apostrophes in strings on write using the IfcCharacterEncoder
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 + ")";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 << "(";
|
||||||
|
|||||||
Reference in New Issue
Block a user