From ae3ef643071099ae1fd76d0b7dfbf4459c100519 Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Thu, 1 Mar 2007 14:30:42 -0500 Subject: ENH: added a limit to the getline method --- Source/kwsys/SystemTools.cxx | 21 ++++++++++++++++++++- Source/kwsys/SystemTools.hxx.in | 3 ++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index 3b12216..cbc1859 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -3542,7 +3542,8 @@ kwsys_stl::string SystemTools::MakeCindentifier(const char* s) // 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* has_newline /* = 0 */, + long sizeLimit /* = -1 */) { const int bufferSize = 1024; char buffer[bufferSize]; @@ -3552,9 +3553,12 @@ bool SystemTools::GetLineFromStream(kwsys_ios::istream& is, // Start with an empty line. line = ""; + long leftToRead = sizeLimit; + // If no characters are read from the stream, the end of file has // been reached. Clear the fail bit just before reading. while(!haveNewline && + leftToRead != 0 && (is.clear(is.rdstate() & ~kwsys_ios::ios::failbit), is.getline(buffer, bufferSize), is.gcount() > 0)) { @@ -3575,8 +3579,23 @@ bool SystemTools::GetLineFromStream(kwsys_ios::istream& is, buffer[length-1] = 0; } + // if we read too much then truncate the buffer + if (leftToRead > 0) + { + if (length > leftToRead) + { + buffer[leftToRead-1] = 0; + leftToRead = 0; + } + else + { + leftToRead -= length; + } + } + // Append the data read to the line. line.append(buffer); + sizeLimit -= length; } // Return the results. diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in index 5d7214d..054666f 100644 --- a/Source/kwsys/SystemTools.hxx.in +++ b/Source/kwsys/SystemTools.hxx.in @@ -434,7 +434,8 @@ public: */ static bool GetLineFromStream(kwsys_ios::istream& istr, kwsys_stl::string& line, - bool* has_newline=0); + bool* has_newline=0, + long sizeLimit=-1); /** * Get the parent directory of the directory or file -- cgit v0.12