Only allow character decoder compatibility mode if HAVE_ICU is defined since it relies on ICU to be available.

This commit is contained in:
Thomas Krijnen
2012-07-18 18:45:34 +00:00
parent 217a7c6599
commit 95d2cdc4b6
2 changed files with 68 additions and 63 deletions
+33 -28
View File
@@ -126,8 +126,9 @@ IfcCharacterDecoder::operator std::string() {
int codepage = 1;
unsigned int hex = 0;
unsigned int hex_count = 0;
unsigned int old_hex = 0; // for compatibility_mode
#ifdef HAVE_ICU
unsigned int old_hex = 0; // for compatibility_mode
#endif
while ( current_char = file->Peek() ) {
if ( EXPECTS_CHARACTER(parse_state) ) {
#ifdef HAVE_ICU
@@ -178,27 +179,31 @@ IfcCharacterDecoder::operator std::string() {
hex <<= 4;
parse_state += HEX((++hex_count));
hex += HEX_TO_INT(current_char);
if ( (hex_count == 2 && !(parse_state & EXTENDED2)) ||
(hex_count == 4 && !(parse_state & EXTENDED4)) ||
(hex_count == 8) ) {
if (compatibility_mode) {
if (old_hex == 0) {
old_hex = hex;
} else {
char characters[3] = { old_hex, hex };
const char* char_array = &characters[0];
UChar32 ch = ucnv_getNextUChar(compatibility_converter,&char_array,char_array+2,&status);
addChar(s,ch);
old_hex = 0;
}
}
else {
addChar(s,(UChar32) hex);
}
if ( hex_count == 2 ) parse_state = 0;
else CLEAR_HEX(parse_state);
hex = hex_count = 0;
}
if ( (hex_count == 2 && !(parse_state & EXTENDED2)) ||
(hex_count == 4 && !(parse_state & EXTENDED4)) ||
(hex_count == 8) ) {
#ifdef HAVE_ICU
if (compatibility_mode) {
if (old_hex == 0) {
old_hex = hex;
} else {
char characters[3] = { old_hex, hex };
const char* char_array = &characters[0];
UChar32 ch = ucnv_getNextUChar(compatibility_converter,&char_array,char_array+2,&status);
addChar(s,ch);
old_hex = 0;
}
}
else {
#endif
addChar(s,(UChar32) hex);
#ifdef HAVE_ICU
}
#endif
if ( hex_count == 2 ) parse_state = 0;
else CLEAR_HEX(parse_state);
hex = hex_count = 0;
}
} else if ( parse_state && !(
(current_char == '\\' && parse_state == FIRST_SOLIDUS) ||
(current_char == '\'' && parse_state == APOSTROPHE)
@@ -207,8 +212,8 @@ IfcCharacterDecoder::operator std::string() {
throw IfcException("Invalid character encountered");
} else {
parse_state = hex = hex_count = 0;
// NOTE: this is in fact wrong, this ought to be the representation of the character.
// In UTF-8 this is the same, but we should not rely on that.
// NOTE: this is in fact wrong, this ought to be the representation of the character.
// In UTF-8 this is the same, but we should not rely on that.
s.put(current_char);
}
file->Inc();
@@ -281,13 +286,13 @@ int IfcCharacterDecoder::previous_codepage = -1;
UErrorCode IfcCharacterDecoder::status = U_ZERO_ERROR;
#endif
//#ifdef HAVE_ICU
#ifdef HAVE_ICU
IfcCharacterDecoder::ConversionMode IfcCharacterDecoder::mode = IfcCharacterDecoder::JSON;
// Many BIM software (eg. Revit, ArchiCAD, ...) has wrong behavior
bool IfcCharacterDecoder::compatibility_mode = false;
std::string IfcCharacterDecoder::compatibility_charset = "";
//#else
#else
char IfcCharacterDecoder::substitution_character = '_';
//#endif
#endif