void copyToEndOfStepString( char*& stream_pos, char*& stream_pos_source ) { char* pos_begin = stream_pos_source; findEndOfString( stream_pos_source ); size_t length = stream_pos_source - pos_begin; memcpy( stream_pos, pos_begin, (length)*sizeof( char) ); stream_pos += length; }
int main(int argv, char* argc[]){ int error = 0; while(!eof && readBuff() > 0){ if(findEndOfString() == -1){ error = 1; clean(); } else{ int i; while((i = findEndOfString()) != -1){ if(error == 1){ error = 0; } else { printReverse(0, i); } normalize(i + 1); size -= i + 1; } } } return 0; }
//\brief split one string into a vector of argument strings // caution: when using OpenMP, this method runs in parallel threads void tokenizeEntityArguments( const std::string& argument_str, std::vector<std::string>& entity_arguments ) { char* stream_pos = (char*)argument_str.c_str(); if( *stream_pos != '(' ) { return; } ++stream_pos; int num_open_braces = 1; char* last_token = stream_pos; while( *stream_pos != '\0' ) { if( *stream_pos == '\'' ) { findEndOfString( stream_pos ); continue; } if( *stream_pos == '(' ) { ++num_open_braces; } else if( *stream_pos == ',' ) { if( num_open_braces == 1 ) { if( *last_token == ',' ) { ++last_token; } char* begin_arg = last_token; // skip whitespace while( isspace( *begin_arg ) ) { ++begin_arg; } char* end_arg = stream_pos-1; entity_arguments.push_back( std::string( 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; } char* begin_arg = last_token; // skip whitespace while( isspace( *begin_arg ) ) { ++begin_arg; } int remaining_size = (int)(stream_pos - begin_arg); if( remaining_size > 0 ) { char* end_arg = stream_pos-1; entity_arguments.push_back( std::string( begin_arg, end_arg-begin_arg+1 ) ); } break; } } ++stream_pos; } }
void IfcPPReaderSTEP::splitIntoStepLines(const std::string& read_in, std::vector<std::string>& target_vec) { // set progress to 0 double progress = 0.0; progressValueCallback(progress, "parse"); // find beginning of data lines const size_t length = read_in.length(); char* stream_pos = (char*)&read_in[0]; stream_pos = strstr(stream_pos, "DATA;"); if( stream_pos != NULL ) { stream_pos += 5; while( isspace(*stream_pos) ){ ++stream_pos; } } // find the first data line while( *stream_pos != '\0' ) { if( *stream_pos == '#' ) { break; } ++stream_pos; } // split into data lines: #1234=IFCOBJECTNAME(...,...,(...,...),...); char* progress_anchor = stream_pos; std::string single_step_line = ""; while( *stream_pos != '\0' ) { if( *stream_pos == '\r' ) { // omit newlines ++stream_pos; continue; } if( *( stream_pos ) == '!' ) { char* stream_pos_next = stream_pos; ++stream_pos_next; if( *stream_pos_next != '\0' ) { if( *stream_pos_next == '\r' || *stream_pos_next == '\n' ) { ++stream_pos; // omit newline exclamation mark ++stream_pos; // omit newline continue; } } } if( *stream_pos == '\n' ) { // omit newlines ++stream_pos; continue; } if( isspace(*stream_pos) ) { ++stream_pos; continue; } if( *stream_pos == '\'' ) { char* string_start = stream_pos; findEndOfString(stream_pos); std::string s(string_start, stream_pos - string_start); single_step_line += s; continue; } if( *stream_pos == ';' ) { if( single_step_line[0] == '#' ) { target_vec.push_back(single_step_line); single_step_line = ""; } ++stream_pos; while( isspace(*stream_pos) ){ ++stream_pos; } if( target_vec.size() % 100 == 0 ) { double progress_since_anchor = (double)( stream_pos - progress_anchor ) / double(length); if( progress_since_anchor > 0.03 ) { progress = 0.2*(double)( stream_pos - &read_in[0] ) / double(length); progressValueCallback(progress, "parse"); progress_anchor = stream_pos; } } continue; } single_step_line += *stream_pos; ++stream_pos; } }
void ReaderSTEP::splitIntoStepLines(const std::string& read_in, std::vector<std::string>& target_vec) { // set progress to 0 double progress = 0.0; progressValueCallback(progress, "parse"); // find beginning of data lines const size_t length = read_in.length(); char* stream_pos = const_cast<char*>(&read_in[0]); if( stream_pos == nullptr ) { throw BuildingException("Invalid file content", __FUNC__); } stream_pos = strstr(stream_pos, "DATA;"); if( stream_pos == nullptr ) { throw BuildingException("Invalid file content, couldn't find DATA section", __FUNC__); } // skip whitespaces stream_pos += 5; while( isspace(*stream_pos) ){ ++stream_pos; } // find the first data line while( *stream_pos != '\0' ) { if( *stream_pos == '#' ) { break; } ++stream_pos; } // split into data lines: #1234=IFCOBJECTNAME(...,...,(...,...),...); char* progress_anchor = stream_pos; std::string single_step_line; while( *stream_pos != '\0' ) { if( *stream_pos == '\r' ) { // omit newlines ++stream_pos; continue; } if( *( stream_pos ) == '!' ) { char* stream_pos_next = stream_pos; ++stream_pos_next; if( *stream_pos_next != '\0' ) { if( *stream_pos_next == '\r' || *stream_pos_next == '\n' ) { ++stream_pos; // omit newline exclamation mark ++stream_pos; // omit newline continue; } } } if( *stream_pos == '\n' ) { // omit newlines ++stream_pos; continue; } if( isspace(*stream_pos) ) { ++stream_pos; continue; } if( *stream_pos == '\'' ) { char* string_start = stream_pos; findEndOfString(stream_pos); std::string s(string_start, stream_pos - string_start); single_step_line += s; continue; } if( *stream_pos == ';' ) { if( single_step_line[0] == '#' ) { target_vec.emplace_back(single_step_line); single_step_line = ""; } ++stream_pos; while( isspace(*stream_pos) ){ ++stream_pos; } if( target_vec.size() % 100 == 0 ) { double progress_since_anchor = static_cast<double>( stream_pos - progress_anchor ) / double(length); if( progress_since_anchor > 0.03 ) { progress = 0.2*static_cast<double>( stream_pos - &read_in[0] ) / double(length); progressValueCallback(progress, "parse"); progress_anchor = stream_pos; if ( isCanceled() ) { canceledCallback(); return; } } } continue; } single_step_line += *stream_pos; ++stream_pos; } }