Browse Source

ENH: added LIMIT on file read

Ken Martin 19 years ago
parent
commit
f8c982cf78
2 changed files with 26 additions and 4 deletions
  1. 25 3
      Source/cmFileCommand.cxx
  2. 1 1
      Source/cmFileCommand.h

+ 25 - 3
Source/cmFileCommand.cxx

@@ -190,9 +190,10 @@ bool cmFileCommand::HandleWriteCommand(std::vector<std::string> const& args,
 //----------------------------------------------------------------------------
 bool cmFileCommand::HandleReadCommand(std::vector<std::string> const& args)
 {
-  if ( args.size() != 3 )
+  if ( args.size() < 3 )
     {
-    this->SetError("READ must be called with two additional arguments");
+    this->SetError("READ must be called with at least two additional "
+                   "arguments");
     return false;
     }
 
@@ -214,11 +215,32 @@ bool cmFileCommand::HandleReadCommand(std::vector<std::string> const& args)
     return false;
     }
 
+  // if there a limit?
+  long sizeLimit = -1;
+  if (args.size() >= 5 && args[3] == "LIMIT")
+    {
+    sizeLimit = atof(args[4].c_str());
+    }
+
   std::string output;
   std::string line;
   bool has_newline = false;
-  while ( cmSystemTools::GetLineFromStream(file, line, &has_newline) )
+  while (sizeLimit != 0 &&
+         cmSystemTools::GetLineFromStream(file, line, &has_newline, 
+                                          sizeLimit) )
     {
+    if (sizeLimit > 0)
+      {
+      sizeLimit -= line.size();
+      if (has_newline)
+        {
+        sizeLimit--;
+        }
+      if (sizeLimit < 0)
+        {
+        sizeLimit = 0;
+        }
+      }
     output += line;
     if ( has_newline )
       {

+ 1 - 1
Source/cmFileCommand.h

@@ -66,7 +66,7 @@ public:
     return
       "  FILE(WRITE filename \"message to write\"... )\n"
       "  FILE(APPEND filename \"message to write\"... )\n"
-      "  FILE(READ filename variable)\n"
+      "  FILE(READ filename variable [LIMIT numBytes])\n"
       "  FILE(GLOB variable [RELATIVE path] [globbing expressions]...)\n"
       "  FILE(GLOB_RECURSE variable [RELATIVE path] \n"
       "       [globbing expressions]...)\n"