From e68cc7201cb84e0c54e59c42f8ab99a4b31aa8f9 Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Wed, 10 Sep 2025 21:42:55 +0200 Subject: [PATCH] Call init_locale() when streaming --- src/ifcparse/IfcFile.h | 40 ++--------------------------------- src/ifcparse/IfcParse.cpp | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/ifcparse/IfcFile.h b/src/ifcparse/IfcFile.h index 6559805faa..6572418383 100644 --- a/src/ifcparse/IfcFile.h +++ b/src/ifcparse/IfcFile.h @@ -128,45 +128,9 @@ public: return storage_.byref_excl_; } - InstanceStreamer(const std::string& fn) - : stream_(new IfcSpfStream(fn)) - , lexer_(new IfcSpfLexer(stream_)) - , token_stream_(3, Token{}) - , schema_(nullptr) - , ifcroot_type_(nullptr) - , progress_(0) - { - good_ = file_open_status::NO_HEADER; - if (*stream_) { - header_ = new IfcParse::IfcSpfHeader(lexer_); - if (header_->tryRead() && header_->file_schema()->schema_identifiers().size() == 1) { - try { - schema_ = IfcParse::schema_by_name(header_->file_schema()->schema_identifiers().front()); - good_ = file_open_status::SUCCESS; - } catch (const IfcParse::IfcException&) { - } - } - storage_.file = nullptr; - storage_.schema = schema_; - storage_.tokens = lexer_; - storage_.references_to_resolve = &references_to_resolve_; - } - } + InstanceStreamer(const std::string& fn); - InstanceStreamer(const IfcParse::schema_definition* schema, IfcParse::IfcSpfLexer* lexer) - : stream_(nullptr) - , lexer_(lexer) - , header_(nullptr) - , token_stream_(3, Token{}) - , schema_(schema) - , ifcroot_type_(schema->declaration_by_name("IfcRoot")) - , progress_(0) - { - storage_.file = nullptr; - storage_.schema = schema_; - storage_.tokens = lexer_; - storage_.references_to_resolve = &references_to_resolve_; - } + InstanceStreamer(const IfcParse::schema_definition* schema, IfcParse::IfcSpfLexer* lexer); ~InstanceStreamer() { delete stream_; diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index 50e5b92426..df89a0c2c5 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -1469,6 +1469,50 @@ IfcFile::IfcFile(const IfcParse::schema_definition* schema, filetype ty, const s setDefaultHeaderValues(); } +IfcParse::InstanceStreamer::InstanceStreamer(const std::string& fn) + : stream_(new IfcSpfStream(fn)) + , lexer_(new IfcSpfLexer(stream_)) + , token_stream_(3, Token{}) + , schema_(nullptr) + , ifcroot_type_(nullptr) + , progress_(0) +{ + init_locale(); + + good_ = file_open_status::NO_HEADER; + if (*stream_) { + header_ = new IfcParse::IfcSpfHeader(lexer_); + if (header_->tryRead() && header_->file_schema()->schema_identifiers().size() == 1) { + try { + schema_ = IfcParse::schema_by_name(header_->file_schema()->schema_identifiers().front()); + good_ = file_open_status::SUCCESS; + } catch (const IfcParse::IfcException&) { + } + } + storage_.file = nullptr; + storage_.schema = schema_; + storage_.tokens = lexer_; + storage_.references_to_resolve = &references_to_resolve_; + } +} + +IfcParse::InstanceStreamer::InstanceStreamer(const IfcParse::schema_definition* schema, IfcParse::IfcSpfLexer* lexer) + : stream_(nullptr) + , lexer_(lexer) + , header_(nullptr) + , token_stream_(3, Token{}) + , schema_(schema) + , ifcroot_type_(schema->declaration_by_name("IfcRoot")) + , progress_(0) +{ + init_locale(); + + storage_.file = nullptr; + storage_.schema = schema_; + storage_.tokens = lexer_; + storage_.references_to_resolve = &references_to_resolve_; +} + void IfcParse::impl::in_memory_file_storage::read_from_stream(IfcParse::IfcSpfStream* s, const IfcParse::schema_definition*& schema, unsigned int& max_id) { // Initialize a "C" locale for locale-independent // number parsing. See comment above on line 41.