//\brief split one string into a vector of argument strings // caution: when using OpenMP, this method runs in parallel threads void tokenizeEntityArguments( const std::wstring& argument_str, std::vector<std::wstring>& entity_arguments ) { wchar_t* stream_pos = (wchar_t*)argument_str.c_str(); if( *stream_pos != '(' ) { return; } ++stream_pos; int num_open_braces = 1; wchar_t* last_token = stream_pos; while( *stream_pos != '\0' ) { if( *stream_pos == '\'' ) { findEndOfWString( stream_pos ); continue; } if( *stream_pos == '(' ) { ++num_open_braces; } else if( *stream_pos == ',' ) { if( num_open_braces == 1 ) { if( *last_token == ',' ) { ++last_token; } wchar_t* begin_arg = last_token; // skip whitespace while( isspace( *begin_arg ) ) { ++begin_arg; } wchar_t* end_arg = stream_pos-1; entity_arguments.push_back( std::wstring( begin_arg, end_arg-begin_arg+1 ) ); last_token = stream_pos; } } else if( *stream_pos == ')' ) { --num_open_braces; if( num_open_braces == 0 ) { if( *last_token == ',' ) { ++last_token; } wchar_t* begin_arg = last_token; // skip whitespace while( isspace( *begin_arg ) ) { ++begin_arg; } int remaining_size = (int)(stream_pos - begin_arg); if( remaining_size > 0 ) { wchar_t* end_arg = stream_pos-1; entity_arguments.push_back( std::wstring( begin_arg, end_arg-begin_arg+1 ) ); } break; } } ++stream_pos; } }
void IfcPPReaderSTEP::readStreamHeader( const std::string& read_in, shared_ptr<IfcPPModel>& target_model ) { if( !target_model ) { throw IfcPPException( "Model not set.", __FUNC__ ); } target_model->m_file_header = L""; target_model->m_IFC_FILE_DESCRIPTION = L""; target_model->m_IFC_FILE_NAME = L""; size_t file_header_start = read_in.find("HEADER;"); size_t file_header_end = read_in.find("ENDSEC;"); if( file_header_start == std::string::npos || file_header_end == std::string::npos ) { return; } IfcPPModel::IfcPPSchemaVersion schema_version( L"", IfcPPModel::IFC_VERSION_UNDEFINED ); target_model->setIfcSchemaVersion( schema_version ); file_header_start += 7; std::string file_header = read_in.substr( file_header_start, file_header_end - file_header_start ); std::vector<std::string> vec_header; std::vector<std::wstring> vec_header_wstr; vec_header.push_back( file_header ); decodeArgumentStrings( vec_header, vec_header_wstr ); std::wstring file_header_wstr; if( vec_header_wstr.size() > 0 ) { file_header_wstr = vec_header_wstr[0]; } target_model->setFileHeader( file_header_wstr ); std::vector<std::wstring> vec_header_lines; // split into lines wchar_t* stream_pos = &file_header_wstr[0]; wchar_t* last_token = stream_pos; while( *stream_pos != '\0' ) { if( *stream_pos == '\'' ) { findEndOfWString( stream_pos ); continue; } if( *stream_pos == ';' ) { wchar_t* begin_line = last_token; std::wstring single_step_line( begin_line, stream_pos-last_token ); vec_header_lines.push_back( single_step_line ); ++stream_pos; while(isspace(*stream_pos)){++stream_pos;} last_token = stream_pos; continue; } ++stream_pos; } for( size_t i=0; i<vec_header_lines.size(); ++i ) { std::wstring header_line = vec_header_lines[i]; if( header_line.find(L"FILE_DESCRIPTION") != std::string::npos ) { target_model->setFileDescription( header_line ); continue; } if( header_line.find(L"FILE_NAME") != std::string::npos ) { target_model->setFileName( header_line ); continue; } if( header_line.find(L"FILE_SCHEMA") != std::string::npos ) { size_t file_schema_begin = header_line.find(L"FILE_SCHEMA") + 11; target_model->getIfcSchemaVersion().m_IFC_FILE_SCHEMA = header_line; std::wstring file_schema_args = header_line.substr( 11 ); size_t find_whitespace = file_schema_args.find(L" "); while(find_whitespace != std::string::npos){ file_schema_args.erase(find_whitespace,1); find_whitespace = file_schema_args.find(L" "); } if( file_schema_args.at(0) =='(' && file_schema_args.at(file_schema_args.size()-1) ==')' ) { file_schema_args = file_schema_args.substr( 1, file_schema_args.size()-2 ); } if( file_schema_args.at(0) =='(' && file_schema_args.at(file_schema_args.size()-1) ==')' ) { file_schema_args = file_schema_args.substr( 1, file_schema_args.size()-2 ); } if( file_schema_args.at(0) =='\'' && file_schema_args.at(file_schema_args.size()-1) =='\'' ) { file_schema_args = file_schema_args.substr( 1, file_schema_args.size()-2 ); } if( file_schema_args.substr(0,6).compare(L"IFC2X2") == 0 ) { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC2X2; } else if( file_schema_args.substr(0,6).compare(L"IFC2X3") == 0 ) { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC2X3; } else if( file_schema_args.substr(0,6).compare(L"IFC2X4") == 0 ) { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC2X4; } else if( file_schema_args.substr(0,5).compare(L"IFC2X") == 0 ) { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC2X; } else if( file_schema_args.compare(L"IFC4") == 0 ) { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC4; } else if( file_schema_args.compare(L"IFC4RC4") == 0 ) { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC4; } else { target_model->m_ifc_schema_version.m_ifc_file_schema_enum = IfcPPModel::IFC_VERSION_UNDEFINED; } } } }