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; int codepage = 1;
unsigned int hex = 0; unsigned int hex = 0;
unsigned int hex_count = 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() ) { while ( current_char = file->Peek() ) {
if ( EXPECTS_CHARACTER(parse_state) ) { if ( EXPECTS_CHARACTER(parse_state) ) {
#ifdef HAVE_ICU #ifdef HAVE_ICU
@@ -178,27 +179,31 @@ IfcCharacterDecoder::operator std::string() {
hex <<= 4; hex <<= 4;
parse_state += HEX((++hex_count)); parse_state += HEX((++hex_count));
hex += HEX_TO_INT(current_char); hex += HEX_TO_INT(current_char);
if ( (hex_count == 2 && !(parse_state & EXTENDED2)) || if ( (hex_count == 2 && !(parse_state & EXTENDED2)) ||
(hex_count == 4 && !(parse_state & EXTENDED4)) || (hex_count == 4 && !(parse_state & EXTENDED4)) ||
(hex_count == 8) ) { (hex_count == 8) ) {
if (compatibility_mode) { #ifdef HAVE_ICU
if (old_hex == 0) { if (compatibility_mode) {
old_hex = hex; if (old_hex == 0) {
} else { old_hex = hex;
char characters[3] = { old_hex, hex }; } else {
const char* char_array = &characters[0]; char characters[3] = { old_hex, hex };
UChar32 ch = ucnv_getNextUChar(compatibility_converter,&char_array,char_array+2,&status); const char* char_array = &characters[0];
addChar(s,ch); UChar32 ch = ucnv_getNextUChar(compatibility_converter,&char_array,char_array+2,&status);
old_hex = 0; addChar(s,ch);
} old_hex = 0;
} }
else { }
addChar(s,(UChar32) hex); else {
} #endif
if ( hex_count == 2 ) parse_state = 0; addChar(s,(UChar32) hex);
else CLEAR_HEX(parse_state); #ifdef HAVE_ICU
hex = hex_count = 0; }
} #endif
if ( hex_count == 2 ) parse_state = 0;
else CLEAR_HEX(parse_state);
hex = hex_count = 0;
}
} else if ( parse_state && !( } else if ( parse_state && !(
(current_char == '\\' && parse_state == FIRST_SOLIDUS) || (current_char == '\\' && parse_state == FIRST_SOLIDUS) ||
(current_char == '\'' && parse_state == APOSTROPHE) (current_char == '\'' && parse_state == APOSTROPHE)
@@ -207,8 +212,8 @@ IfcCharacterDecoder::operator std::string() {
throw IfcException("Invalid character encountered"); throw IfcException("Invalid character encountered");
} else { } else {
parse_state = hex = hex_count = 0; parse_state = hex = hex_count = 0;
// NOTE: this is in fact wrong, this ought to be the representation of the character. // 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. // In UTF-8 this is the same, but we should not rely on that.
s.put(current_char); s.put(current_char);
} }
file->Inc(); file->Inc();
@@ -281,13 +286,13 @@ int IfcCharacterDecoder::previous_codepage = -1;
UErrorCode IfcCharacterDecoder::status = U_ZERO_ERROR; UErrorCode IfcCharacterDecoder::status = U_ZERO_ERROR;
#endif #endif
//#ifdef HAVE_ICU #ifdef HAVE_ICU
IfcCharacterDecoder::ConversionMode IfcCharacterDecoder::mode = IfcCharacterDecoder::JSON; IfcCharacterDecoder::ConversionMode IfcCharacterDecoder::mode = IfcCharacterDecoder::JSON;
// Many BIM software (eg. Revit, ArchiCAD, ...) has wrong behavior // Many BIM software (eg. Revit, ArchiCAD, ...) has wrong behavior
bool IfcCharacterDecoder::compatibility_mode = false; bool IfcCharacterDecoder::compatibility_mode = false;
std::string IfcCharacterDecoder::compatibility_charset = ""; std::string IfcCharacterDecoder::compatibility_charset = "";
//#else #else
char IfcCharacterDecoder::substitution_character = '_'; char IfcCharacterDecoder::substitution_character = '_';
//#endif #endif
+35 -35
View File
@@ -1,29 +1,29 @@
/******************************************************************************** /********************************************************************************
* * * *
* This file is part of IfcOpenShell. * * This file is part of IfcOpenShell. *
* * * *
* IfcOpenShell is free software: you can redistribute it and/or modify * * IfcOpenShell is free software: you can redistribute it and/or modify *
* it under the terms of the Lesser GNU General Public License as published by * * it under the terms of the Lesser GNU General Public License as published by *
* the Free Software Foundation, either version 3.0 of the License, or * * the Free Software Foundation, either version 3.0 of the License, or *
* (at your option) any later version. * * (at your option) any later version. *
* * * *
* IfcOpenShell is distributed in the hope that it will be useful, * * IfcOpenShell is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of * * but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* Lesser GNU General Public License for more details. * * Lesser GNU General Public License for more details. *
* * * *
* You should have received a copy of the Lesser GNU General Public License * * You should have received a copy of the Lesser GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. * * along with this program. If not, see <http://www.gnu.org/licenses/>. *
* * * *
********************************************************************************/ ********************************************************************************/
/******************************************************************************** /********************************************************************************
* * * *
* Implementation of character decoding as described in ISO 10303-21 table 2 and * * Implementation of character decoding as described in ISO 10303-21 table 2 and *
* table 4 * * table 4 *
* * * *
********************************************************************************/ ********************************************************************************/
#ifndef IFCCHARACTERDECODER_H #ifndef IFCCHARACTERDECODER_H
#define IFCCHARACTERDECODER_H #define IFCCHARACTERDECODER_H
@@ -46,25 +46,25 @@ namespace IfcParse {
#ifdef HAVE_ICU #ifdef HAVE_ICU
static UConverter* destination; static UConverter* destination;
static UConverter* converter; static UConverter* converter;
static UConverter* compatibility_converter; static UConverter* compatibility_converter;
static int previous_codepage; static int previous_codepage;
static UErrorCode status; static UErrorCode status;
#endif #endif
void addChar(std::stringstream& s,const UChar32& ch); void addChar(std::stringstream& s,const UChar32& ch);
public: public:
//#ifdef HAVE_ICU #ifdef HAVE_ICU
enum ConversionMode {DEFAULT,UTF8,LATIN,JSON,PYTHON}; enum ConversionMode {DEFAULT,UTF8,LATIN,JSON,PYTHON};
static ConversionMode mode; static ConversionMode mode;
// Many BIM software (eg. Revit, ArchiCAD, ...) has wrong behavior to encode characters. // Many BIM software (eg. Revit, ArchiCAD, ...) has wrong behavior to encode characters.
// It just translate to extended string in system default code page, not unicode. // It just translate to extended string in system default code page, not unicode.
// If you want to process these strings, set true. // If you want to process these strings, set true.
static bool compatibility_mode; static bool compatibility_mode;
static std::string compatibility_charset; static std::string compatibility_charset;
//#else #else
static char substitution_character; static char substitution_character;
//#endif #endif
IfcCharacterDecoder(IfcParse::File* file); IfcCharacterDecoder(IfcParse::File* file);
~IfcCharacterDecoder(); ~IfcCharacterDecoder();
void dryRun(); void dryRun();