]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Modify Utilities::trim to remove all whitespace.
authorDavid Wells <wellsd2@rpi.edu>
Thu, 3 Dec 2015 03:53:08 +0000 (22:53 -0500)
committerDavid Wells <wellsd2@rpi.edu>
Sun, 6 Dec 2015 01:32:49 +0000 (20:32 -0500)
This fixes issue #1691, where a ParameterHandler could not read files
with DOS line endings because Utilities::trim did not discard the '\r'
characters.

doc/news/changes.h
include/deal.II/base/utilities.h
source/base/utilities.cc
tests/base/utilities_trim.cc
tests/base/utilities_trim.output

index e8afbbf7ea2cb7103bea88ca00e43e1ff6585eb3..bb86ebe9378c253fccc8ba3ac498b0eb913dea49 100644 (file)
@@ -38,6 +38,13 @@ inconvenience this causes.
 </p>
 
 <ol>
+  <li> Changed: The function <code>Utilities::trim</code> now removes general
+  white space characters, such as '<tt>\\r</tt>' and '<tt>\\n</tt>', as well as
+  space characters.
+  <br>
+  (David Wells, 2015/12/05)
+  </li>
+
   <li> Removed: Previously deprecated global instance multithread_info of
   MultithreadInfo has been removed (all members of this class are static
   so there is no reason to use/create an instance). The deprecated
index 582eb6e0dc683d833d7f8b1e70ce70bec6b8fe8f..1ac3b2ec703bb267c3f2f12e5cd6200dc3b854ee 100644 (file)
@@ -199,9 +199,12 @@ namespace Utilities
                                 const std::string &to);
 
   /**
-   * Return a string with all spaces at the beginning and end of @p input removed.
+   * Return a string with all standard whitespace characters (including
+   * '<tt>\\t</tt>', '<tt>\\n</tt>', and '<tt>\\r</tt>') at the beginning and
+   * end of @p input removed.
    */
-  std::string trim(const std::string &input);
+  std::string
+  trim(const std::string &input);
 
   /**
    * Generate a random number from a normalized Gaussian probability
index 4c2961b94a0de1f362f2bcfd735d091085062f09..9de4a062c68ed08d96283c695f20a215bed4482a 100644 (file)
@@ -25,6 +25,7 @@ DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
 DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
 
 #include <algorithm>
+#include <cctype>
 #include <cerrno>
 #include <cmath>
 #include <cstddef>
@@ -115,14 +116,30 @@ namespace Utilities
   std::string
   trim(const std::string &input)
   {
-    std::string::size_type start_idx = input.find_first_not_of(" ");
-    if (start_idx == std::string::npos)
-      return "";
+    std::string::size_type left = 0;
+    std::string::size_type right = input.size() - 1;
 
-    std::string::size_type end_idx = input.find_last_not_of(" ");
-    return std::string( input, start_idx, end_idx+1-start_idx);
+    for (; left < input.size(); ++left)
+      {
+        if (!std::isspace(input[left]))
+          {
+            break;
+          }
+      }
+
+    for (; right >= left; --right)
+      {
+        if (!std::isspace(input[right]))
+          {
+            break;
+          }
+      }
+
+    return std::string(input, left, right - left + 1);
   }
 
+
+
   std::string
   dim_string(const int dim, const int spacedim)
   {
index 4a0a0972eeedaf2a59143f219537c97b65e8172c..09e66c50229901af93ae389e3a5ad8717a644a80 100644 (file)
 // ---------------------------------------------------------------------
 
 
-// test Utilities::trim
-
-#include "../tests.h"
-#include <iomanip>
-#include <iomanip>
-#include <fstream>
-#include <cmath>
+// test Utilities::trim. Note that deallog does not like being given '\n's in
+// the middle of strings, so the output file is almost empty.
 
+#include <deal.II/base/logstream.h>
 #include <deal.II/base/utilities.h>
 
+#include <fstream>
+
+using namespace dealii;
 
 void check(const std::string &input, const std::string &expected)
 {
-  deallog << "trim(\"" << input << "\") = \"" << Utilities::trim(input) << "\"" << std::endl;
-  Assert(Utilities::trim(input) == expected, ExcInternalError());
+  AssertThrow(Utilities::trim(input) == expected, ExcInternalError());
 }
 
 
 
 void test ()
 {
-  check("Hello World", "Hello World");
+  check("\r\nHello World\r\n\r", "Hello World");
   check("", "");
   check(" ", "");
   check("    ", "");
-  check("  middle   ", "middle");
-  check("left   ", "left");
-  check("  right", "right");
-  check("  multiple  words with spaces  ", "multiple  words with spaces");
+  check("  \r\n\v\t\r\n\f  ", "");
+  check("  \rmiddle\r\n   ", "middle");
+  check("left\v\t\r\n   ", "left");
+  check("  \n\v\f\r\nright", "right");
+  check(" \t\v\f\t\r\n\r multiple  words with spaces  \v\f\n", "multiple  words with spaces");
+
+  deallog << "OK" << std::endl;
 }
 
 
index 270fa06572afed22a7169356a197a5355b964e1e..0fd8fc12f0b442283edd8868867114c242b04d11 100644 (file)
@@ -1,9 +1,2 @@
 
-DEAL::trim("Hello World") = "Hello World"
-DEAL::trim("") = ""
-DEAL::trim(" ") = ""
-DEAL::trim("    ") = ""
-DEAL::trim("  middle   ") = "middle"
-DEAL::trim("left   ") = "left"
-DEAL::trim("  right") = "right"
-DEAL::trim("  multiple  words with spaces  ") = "multiple  words with spaces"
+DEAL::OK

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.