]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add a couple of comments to functions in utilities.cc. 8336/head
authorWolfgang Bangerth <bangerth@colostate.edu>
Tue, 2 Jul 2019 15:09:39 +0000 (09:09 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Tue, 2 Jul 2019 15:09:39 +0000 (09:09 -0600)
source/base/utilities.cc

index 08f40984cbe101cca576a36c214062dabd4d21e2..fbf823f7beebc86373d4ca887439054ff64598d0 100644 (file)
@@ -494,15 +494,24 @@ namespace Utilities
     while ((s.size() > 0) && (s[s.size() - 1] == ' '))
       s.erase(s.end() - 1);
 
-    // now convert and see whether we succeed. note that strtol only
+    // Now convert and see whether we succeed. Note that strtol only
     // touches errno if an error occurred, so if we want to check
     // whether an error happened, we need to make sure that errno==0
     // before calling strtol since otherwise it may be that the
     // conversion succeeds and that errno remains at the value it
-    // was before, whatever that was
+    // was before, whatever that was.
     char *p;
     errno       = 0;
     const int i = std::strtol(s.c_str(), &p, 10);
+
+    // We have an error if one of the following conditions is true:
+    // - strtol sets errno != 0
+    // - The original string was empty (we could have checked that
+    //   earlier already)
+    // - The string has non-zero length and strtol converted the
+    //   first part to something useful, but stopped converting short
+    //   of the terminating '\0' character. This happens, for example,
+    //   if the given string is "1234 abc".
     AssertThrow(!((errno != 0) || (s.size() == 0) ||
                   ((s.size() > 0) && (*p != '\0'))),
                 ExcMessage("Can't convert <" + s + "> to an integer."));
@@ -533,15 +542,24 @@ namespace Utilities
     while ((s.size() > 0) && (s[s.size() - 1] == ' '))
       s.erase(s.end() - 1);
 
-    // now convert and see whether we succeed. note that strtol only
+    // Now convert and see whether we succeed. Note that strtol only
     // touches errno if an error occurred, so if we want to check
     // whether an error happened, we need to make sure that errno==0
     // before calling strtol since otherwise it may be that the
     // conversion succeeds and that errno remains at the value it
-    // was before, whatever that was
+    // was before, whatever that was.
     char *p;
     errno          = 0;
     const double d = std::strtod(s.c_str(), &p);
+
+    // We have an error if one of the following conditions is true:
+    // - strtod sets errno != 0
+    // - The original string was empty (we could have checked that
+    //   earlier already)
+    // - The string has non-zero length and strtod converted the
+    //   first part to something useful, but stopped converting short
+    //   of the terminating '\0' character. This happens, for example,
+    //   if the given string is "1.234 abc".
     AssertThrow(!((errno != 0) || (s.size() == 0) ||
                   ((s.size() > 0) && (*p != '\0'))),
                 ExcMessage("Can't convert <" + s + "> to a double."));

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.