ossimKeywordlist::KeywordlistParseState ossimKeywordlist::readComments(ossimString& sequence, std::istream& in)const { KeywordlistParseState result = KeywordlistParseState_FAIL; char c = (char)in.peek(); if(c == '/') { sequence += (char)in.get(); c = in.peek(); if(c == '/') { result = KeywordlistParseState_OK; sequence += c; while(!in.bad()&&!in.eof()) { c = (char)in.get(); if(!isValidKeywordlistCharacter(c)) { result = KeywordlistParseState_BAD_STREAM; break; } if((c == '\n')|| (c == '\r')) { break; } sequence += c; } } } return result; }
ossimKeywordlist::KeywordlistParseState ossimKeywordlist::readValue(ossimString& sequence, std::istream& in)const { KeywordlistParseState result = KeywordlistParseState_OK; ossim_int32 quoteCount = 0; // mark as not set // make sure we check for a blank value while(!in.eof()&&!in.bad()) { if(in.peek() == ' '|| in.peek() == '\t') { in.ignore(); } else if(in.peek() == '\n' || in.peek() == '\r') { in.ignore(); return result; } else { break; } } // The ifstream object will end in 'ÿ' (character 255 or -1) if the end-of-file indicator // will not be set(e.g \n). In this case, end-of-file conditions would never be detected. // add EOF (which is actually the integer -1 or 255) check here. // Reference link http://www.cplusplus.com/forum/general/33821/ while(!in.eof()&&!in.bad()&&in.peek()!=EOF) { ossim_uint8 c = in.get(); if(isValidKeywordlistCharacter(c)) { if(((c == '\n'||c=='\r') && !quoteCount) || in.eof()) { break; } sequence += (char)c; if(sequence.size() >2) { if(quoteCount < 1) { // if quoted if(ossimString(sequence.begin(), sequence.begin()+3) == "\"\"\"") { ++quoteCount; } } else // check for ending quotes { if(ossimString(sequence.begin() + sequence.size()-3, sequence.end()) == "\"\"\"") { ++quoteCount; } } } if(quoteCount > 1) { sequence = ossimString(sequence.begin()+3, sequence.begin()+(sequence.size()-3)); break; } } else { result = KeywordlistParseState_BAD_STREAM; break; } } return result; }
ossimKeywordlist::KeywordlistParseState ossimKeywordlist::readKey(ossimString& sequence, std::istream& in)const { KeywordlistParseState result = KeywordlistParseState_FAIL; if(!sequence.empty()) { if(*(sequence.begin()+(sequence.size()-1)) == m_delimiter) { sequence = ossimString(sequence.begin(), sequence.begin() + (sequence.size()-1)); return KeywordlistParseState_OK; } } // not a comment so read til key delimeter while(!in.eof() && in.good()) { ossim_uint8 c = in.get(); if( isValidKeywordlistCharacter(c) ) { if ( (c == '\n') || (c == '\r') ) { // Hit end of line with no delimiter. if ( in.peek() == EOF ) { //--- // Allowing on last line only. // Note the empty key will trigger parseStream to return true. //--- sequence.clear(); result = KeywordlistParseState_OK; break; } else // Line with no delimiter. { // mal formed input stream for keyword list specification result = KeywordlistParseState_BAD_STREAM; break; } } else if(c != m_delimiter) { sequence += (char)c; } else // at m_delimiter { result = KeywordlistParseState_OK; sequence = sequence.trim(); break; } } else { // mal formed input stream for keyword list specification result = KeywordlistParseState_BAD_STREAM; break; } } // we never found a delimeter so we are mal formed if(!sequence.empty()&&(result!=KeywordlistParseState_OK)) { result = KeywordlistParseState_BAD_STREAM; } return result; }
ossimKeywordlist::KeywordlistParseState ossimKeywordlist::readValue(ossimString& sequence, std::istream& in)const { KeywordlistParseState result = KeywordlistParseState_OK; ossim_int32 quoteCount = 0; // mark as not set // make sure we check for a blank value while(!in.eof()&&!in.bad()) { if(in.peek() == ' '|| in.peek() == '\t') { in.ignore(); } else if(in.peek() == '\n' || in.peek() == '\r') { in.ignore(); return result; } else { break; } } // The ifstream object will end in 'ÿ' (character 255 or -1) if the end-of-file indicator // will not be set(e.g \n). In this case, end-of-file conditions would never be detected. // add EOF (which is actually the integer -1 or 255) check here. // Reference link http://www.cplusplus.com/forum/general/33821/ while(!in.eof()&&!in.bad()&&in.peek()!=EOF) { ossim_uint8 c = in.get(); if(isValidKeywordlistCharacter(c)) { if(((c == '\n'||c=='\r') && !quoteCount) || in.eof()) { break; } sequence += (char)c; if(sequence.size() >2) { if(quoteCount < 1) { //--- // If string has leading tripple quoted bump the "quoteCount" so // we start skipping line breaks, preserving paragraph style strings. //--- if(ossimString(sequence.begin(), sequence.begin()+3) == "\"\"\"") { ++quoteCount; } } else // check for ending quotes { if(ossimString(sequence.begin() + sequence.size()-3, sequence.end()) == "\"\"\"") { ++quoteCount; } } } if(quoteCount > 1) { //--- // Have leading and trailing tripple quotes. Some tiff writers, e.g. Space // Imaging are using four quotes. Below code strips all quotes from each end. //--- char quote = '"'; std::string::size_type startPos = sequence.string().find_first_not_of(quote); std::string::size_type stopPos = sequence.string().find_last_not_of(quote); if ( ( startPos != std::string::npos ) && (stopPos != std::string::npos) ) { sequence = sequence.string().substr( startPos, stopPos-startPos+1 ); } break; } } else { result = KeywordlistParseState_BAD_STREAM; break; } } return result; }