summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2006-08-26 20:14:26 (GMT)
committerBrad King <brad.king@kitware.com>2006-08-26 20:14:26 (GMT)
commitdc0c5d082b69e53a8634931c0af6675404fea054 (patch)
tree7e81b1c942329136d76203108f1b171b1efb4097 /Source
parente61eac3f05444faa023c42546d4596679b455aec (diff)
downloadCMake-dc0c5d082b69e53a8634931c0af6675404fea054.zip
CMake-dc0c5d082b69e53a8634931c0af6675404fea054.tar.gz
CMake-dc0c5d082b69e53a8634931c0af6675404fea054.tar.bz2
BUG: GetLineFromStream should remove carriage return characters to make sure newlines do not get duplicates.
Diffstat (limited to 'Source')
-rw-r--r--Source/kwsys/SystemTools.cxx52
1 files changed, 31 insertions, 21 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index d1b31e7..6ef85b9 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -3416,39 +3416,49 @@ kwsys_stl::string SystemTools::MakeCindentifier(const char* s)
// Due to a buggy stream library on the HP and another on Mac OSX, we
// need this very carefully written version of getline. Returns true
// if any data were read before the end-of-file was reached.
-bool SystemTools::GetLineFromStream(kwsys_ios::istream& is, kwsys_stl::string& line,
- bool *has_newline /* = 0 */)
+bool SystemTools::GetLineFromStream(kwsys_ios::istream& is,
+ kwsys_stl::string& line,
+ bool* has_newline /* = 0 */)
{
const int bufferSize = 1024;
char buffer[bufferSize];
- line = "";
bool haveData = false;
- if ( has_newline )
- {
- *has_newline = false;
- }
+ bool haveNewline = false;
+
+ // Start with an empty line.
+ line = "";
// If no characters are read from the stream, the end of file has
- // been reached.
- while((is.getline(buffer, bufferSize), is.gcount() > 0))
+ // been reached. Clear the fail bit just before reading.
+ while(!haveNewline &&
+ (is.clear(is.rdstate() & ~kwsys_ios::ios::failbit),
+ is.getline(buffer, bufferSize), is.gcount() > 0))
{
+ // We have read at least one byte.
haveData = true;
- line.append(buffer);
- // If newline character was read, the gcount includes the
- // character, but the buffer does not. The end of line has been
- // reached.
- if(strlen(buffer) < static_cast<size_t>(is.gcount()))
+ // If newline character was read the gcount includes the character
+ // but the buffer does not: the end of line has been reached.
+ size_t length = strlen(buffer);
+ if(length < static_cast<size_t>(is.gcount()))
{
- if ( has_newline )
- {
- *has_newline = true;
- }
- break;
+ haveNewline = true;
+ }
+
+ // Avoid storing a carriage return character.
+ if(length > 0 && buffer[length-1] == '\r')
+ {
+ buffer[length-1] = 0;
}
- // The fail bit may be set. Clear it.
- is.clear(is.rdstate() & ~kwsys_ios::ios::failbit);
+ // Append the data read to the line.
+ line.append(buffer);
+ }
+
+ // Return the results.
+ if(has_newline)
+ {
+ *has_newline = haveNewline;
}
return haveData;
}