]> https://gitweb.dealii.org/ - dealii.git/commitdiff
add an extra string parameter to terminate the parsing of a file by ParameterHandler
authorDenis Davydov <davydden@gmail.com>
Wed, 20 Apr 2016 12:59:14 +0000 (14:59 +0200)
committerDenis Davydov <davydden@gmail.com>
Wed, 20 Apr 2016 15:14:05 +0000 (17:14 +0200)
doc/news/changes.h
include/deal.II/base/parameter_handler.h
source/base/parameter_handler.cc

index 17fca7323937dada64a7fc33210c110c4eaa3b96..60152441619a6d212227718846b7ccd905e5bea3 100644 (file)
@@ -201,6 +201,14 @@ inconvenience this causes.
 <h3>Specific improvements</h3>
 
 <ol>
+ <li> New: Added an optional string parameter to the ParameterHandler::read_input ()
+ and ParameterHandler::read_input_from_string() functions.
+ When a line which equals this string is encountered, the parsing of parameters
+ is terminated.
+ <br>
+ (Denis Davydov, 2016/04/20)
+ </li>
+
 
  <li> New: Added move operations to IndexSet.
  <br>
index b7be6c18c108a61b54814b7912a1d9dbae3b1ae1..fb1aa1735c103a71f0f34785233ed75f88545060 100644 (file)
@@ -1576,10 +1576,15 @@ public:
    * the file (if that's what the input stream represents) we are reading
    * from; this is only used when creating output for error messages.
    *
+   * If non-empty @p last_line is provided, the ParameterHandler object
+   * will stop parsing lines after encountering @p last_line .
+   * This is handy when adding extra data that shall be parsed manually.
+   *
    * Return whether the read was successful.
    */
   virtual bool read_input (std::istream &input,
-                           const std::string &filename = "input file");
+                           const std::string &filename = "input file",
+                           const std::string &last_line = "");
 
   /**
    * Read input from a file the name of which is given. The PathSearch class
@@ -1591,18 +1596,28 @@ public:
    * automatically generate the requested file with default values if the file
    * did not exist. This file will not contain additional comments if
    * <tt>write_stripped_file</tt> is <tt>true</tt>.
+   *
+   * If non-empty @p last_line is provided, the ParameterHandler object
+   * will stop parsing lines after encountering @p last_line .
+   * This is handy when adding extra data that shall be parsed manually.
    */
   virtual bool read_input (const std::string &filename,
                            const bool optional = false,
-                           const bool write_stripped_file = false);
+                           const bool write_stripped_file = false,
+                           const std::string &last_line = "");
 
   /**
    * Read input from a string in memory. The lines in memory have to be
    * separated by <tt>@\n</tt> characters.
    *
+   * If non-empty @p last_line is provided, the ParameterHandler object
+   * will stop parsing lines after encountering @p last_line .
+   * This is handy when adding extra data that shall be parsed manually.
+   *
    * Return whether the read was successful.
    */
-  virtual bool read_input_from_string (const char *s);
+  virtual bool read_input_from_string (const char *s,
+                                       const std::string &last_line = "");
 
   /**
    * Read a parameter file in XML format. This could be from a file originally
index dab4492046e7eddd76fd0d74e66d4176f645936b..7aefd994c3a685ee890c7161de1f0edc09c19063 100644 (file)
@@ -1332,7 +1332,8 @@ ParameterHandler::get_current_full_path (const std::string &name) const
 
 
 bool ParameterHandler::read_input (std::istream &input,
-                                   const std::string &filename)
+                                   const std::string &filename,
+                                   const std::string &last_line)
 {
   AssertThrow (input, ExcIO());
 
@@ -1352,6 +1353,12 @@ bool ParameterHandler::read_input (std::istream &input,
       // scan_line. This makes the continuation line logic a lot simpler.
       input_line = Utilities::trim (input_line);
 
+      // If we see the line which is the same as @p last_line ,
+      // terminate the parsing.
+      if (last_line.length() != 0 &&
+          input_line == last_line)
+        break;
+
       // Check whether or not the current line should be joined with the next
       // line before calling scan_line.
       if (input_line.length() != 0 &&
@@ -1418,7 +1425,8 @@ bool ParameterHandler::read_input (std::istream &input,
 
 bool ParameterHandler::read_input (const std::string &filename,
                                    const bool optional,
-                                   const bool write_compact)
+                                   const bool write_compact,
+                                   const std::string &last_line)
 {
   PathSearch search("PARAMETERS");
 
@@ -1428,7 +1436,7 @@ bool ParameterHandler::read_input (const std::string &filename,
       std::ifstream file_stream (openname.c_str());
       AssertThrow(file_stream, ExcIO());
 
-      return read_input (file_stream, filename);
+      return read_input (file_stream, filename, last_line);
     }
   catch (const PathSearch::ExcFileNotFound &)
     {
@@ -1448,10 +1456,11 @@ bool ParameterHandler::read_input (const std::string &filename,
 
 
 
-bool ParameterHandler::read_input_from_string (const char *s)
+bool ParameterHandler::read_input_from_string (const char *s,
+                                               const std::string &last_line)
 {
   std::istringstream input_stream (s);
-  return read_input (input_stream, "input string");
+  return read_input (input_stream, "input string", last_line);
 }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.