[cig-commits] r7350 - in cs/spatialdata-0.1/trunk/libsrc: geocoords spatialdb utils

brad at geodynamics.org brad at geodynamics.org
Thu Jun 21 13:52:48 PDT 2007


Author: brad
Date: 2007-06-21 13:52:48 -0700 (Thu, 21 Jun 2007)
New Revision: 7350

Added:
   cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.cc
   cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.hh
Modified:
   cs/spatialdata-0.1/trunk/libsrc/geocoords/CSCart.cc
   cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeo.cc
   cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoLocalCart.cc
   cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoProj.cc
   cs/spatialdata-0.1/trunk/libsrc/geocoords/Projector.cc
   cs/spatialdata-0.1/trunk/libsrc/spatialdb/SimpleIOAscii.cc
Log:
Added ability of LineParser to eat whitespace in next(). This solves problems with indented comments. Updated use of LineParser accordingly.

Modified: cs/spatialdata-0.1/trunk/libsrc/geocoords/CSCart.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/geocoords/CSCart.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/geocoords/CSCart.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -82,13 +82,13 @@
 spatialdata::geocoords::CSCart::unpickle(std::istream& s)
 { // unpickle
   utils::LineParser parser(s, "//");
+  parser.eatwhitespace(true);
 
   std::string token;
   std::istringstream buffer;
   const int maxIgnore = 256;
 
   parser.ignore('{');
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -108,7 +108,6 @@
 	  << "  space-dim";
       throw std::runtime_error(msg.str().c_str());
     } // else
-    parser.eatws();
     buffer.str(parser.next());
     buffer.clear();
     buffer >> token;

Modified: cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeo.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeo.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeo.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -213,6 +213,7 @@
 spatialdata::geocoords::CSGeo::unpickle(std::istream& s)
 { // unpickle
   utils::LineParser parser(s, "//");
+  parser.eatwhitespace(true);
 
   std::string token;
   std::istringstream buffer;
@@ -220,7 +221,6 @@
   char cbuffer[maxIgnore];
 
   parser.ignore('{');
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -251,7 +251,6 @@
 	  << "  to-meters, ellipsoid, datum-horiz, datum-vert";
       throw std::runtime_error(msg.str().c_str());
     } // else
-    parser.eatws();
     buffer.str(parser.next());
     buffer.clear();
     buffer >> token;

Modified: cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoLocalCart.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoLocalCart.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoLocalCart.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -401,6 +401,7 @@
 spatialdata::geocoords::CSGeoLocalCart::unpickle(std::istream& s)
 { // unpickle
   utils::LineParser parser(s, "//");
+  parser.eatwhitespace(true);
 
   std::string token;
   std::istringstream buffer;
@@ -410,7 +411,6 @@
   std::string name;
 
   parser.ignore('{');
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -444,7 +444,6 @@
 	  << "  origin-lon, origin-lat, origin-elev\n";
       throw std::runtime_error(msg.str().c_str());
     } // else
-    parser.eatws();
     buffer.str(parser.next());
     buffer.clear();
     buffer >> token;

Modified: cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoProj.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoProj.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/geocoords/CSGeoProj.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -150,6 +150,7 @@
 spatialdata::geocoords::CSGeoProj::unpickle(std::istream& s)
 { // unpickle
   utils::LineParser parser(s, "//");
+  parser.eatwhitespace(true);
 
   std::string token;
   std::istringstream buffer;
@@ -159,7 +160,6 @@
   std::string name;
 
   parser.ignore('{');
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -197,7 +197,6 @@
 	  << "  to-meters, ellipsoid, datum-horiz, datum-vert, projector\n";
       throw std::runtime_error(msg.str().c_str());
     } // else
-    parser.eatws();
     buffer.str(parser.next());
     buffer.clear();
     buffer >> token;

Modified: cs/spatialdata-0.1/trunk/libsrc/geocoords/Projector.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/geocoords/Projector.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/geocoords/Projector.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -172,6 +172,7 @@
 spatialdata::geocoords::Projector::unpickle(std::istream& s)
 { // unpickle
   utils::LineParser parser(s, "//");
+  parser.eatwhitespace(true);
 
   std::string token;
   std::istringstream buffer;
@@ -179,7 +180,6 @@
   char cbuffer[maxIgnore];
 
   parser.ignore('{');
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -201,7 +201,6 @@
 	  << "  projection, units, proj-options";
       throw std::runtime_error(msg.str().c_str());
     } // else
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -210,7 +209,5 @@
     throw std::runtime_error("I/O error while parsing Projector settings.");
 } // unpickle
 
-// version
-// $Id$
 
 // End of file 

Modified: cs/spatialdata-0.1/trunk/libsrc/spatialdb/SimpleIOAscii.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/spatialdb/SimpleIOAscii.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/spatialdb/SimpleIOAscii.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -116,12 +116,12 @@
   pData->spaceDim = 3;
 
   utils::LineParser parser(filein, "//");
+  parser.eatwhitespace(true);
 
   std::string token;
   std::istringstream buffer;
   const int maxIgnore = 256;
 
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -132,7 +132,6 @@
   } // else
 
   int numVals = 0;
-  parser.eatws();
   buffer.str(parser.next());
   buffer.clear();
   buffer >> token;
@@ -185,7 +184,6 @@
       throw std::runtime_error(msg.str());
     } // else
 
-    parser.eatws();
     buffer.str(parser.next());
     buffer.clear();
     buffer >> token;
@@ -220,7 +218,6 @@
   delete[] pData->data; 
   pData->data = (dataTotalSize > 0) ? new double[dataTotalSize] : 0;
   for (int iLoc=0, i=0; iLoc < pData->numLocs; ++iLoc) {
-    parser.eatws();
     buffer.str(parser.next());
     buffer.clear();
     for (int iVal=0; iVal < dataLocSize; ++iVal)

Added: cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.cc	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.cc	2007-06-21 20:52:48 UTC (rev 7350)
@@ -0,0 +1,86 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+#include <portinfo>
+
+#include "LineParser.hh" // implementation of class methods
+
+#include <iostream>
+#include <sstream>
+
+
+// ----------------------------------------------------------------------
+spatialdata::utils::LineParser::LineParser(std::istream& sin,
+				      const char* delimiter,
+				      const size_t bufsize) :
+  _in(sin),
+  _delimiter(delimiter),
+  _bufsize(bufsize),
+  _buffer(0)
+{ // constructor
+  _buffer = new char[bufsize];
+} // constructor
+
+// ----------------------------------------------------------------------
+spatialdata::utils::LineParser::~LineParser(void)
+{ // destructor
+  delete[] _buffer; _buffer = 0;
+} // destructor
+
+// ----------------------------------------------------------------------
+const std::string&
+spatialdata::utils::LineParser::next(void) {
+  if (_eatwhitespace)
+    _in >> std::ws;
+  _in.getline(_buffer, _bufsize);
+  _value = _buffer;
+  size_t pos = _value.find(_delimiter);
+  while (0 == pos && !_in.eof() && _in.good()) {
+    if (_eatwhitespace)
+      _in >> std::ws;
+    _in.getline(_buffer, _bufsize);
+    _value = _buffer;
+    pos = _value.find(_delimiter);
+  } // while
+  const size_t last = (pos == std::string::npos) ? _value.length() : pos;
+  _value = _value.substr(0, last);
+  return _value;
+} // next
+
+// ----------------------------------------------------------------------
+// Ignore input until character read.
+void
+spatialdata::utils::LineParser::ignore(const char marker)
+{ // ignore
+  _in.ignore(_bufsize, marker);
+} // ignore
+
+// ----------------------------------------------------------------------
+// Set eating whitespace flag.
+void
+spatialdata::utils::LineParser::eatwhitespace(const bool flag)
+{ // eatwhitespace
+  _eatwhitespace = flag;
+} // eatwhitespace
+
+// ----------------------------------------------------------------------
+// Putback string.
+void
+spatialdata::utils::LineParser::putback(const std::string& buffer)
+{ // putback
+  const size_t size = buffer.length();
+  for (int i=size-1; i >= 0; --i)
+    _in.putback(buffer[i]);
+} // putback
+
+
+// End of file 

Added: cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.hh
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.hh	2007-06-21 20:22:45 UTC (rev 7349)
+++ cs/spatialdata-0.1/trunk/libsrc/utils/LineParser.hh	2007-06-21 20:52:48 UTC (rev 7350)
@@ -0,0 +1,97 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+//                           Brad T. Aagaard
+//                        U.S. Geological Survey
+//
+// {LicenseText}
+//
+// ======================================================================
+//
+
+/**
+ * @file spatialdata/utils/LineParser.hh
+ *
+ * @brief C++ implementation of a simple text parser that removes
+ * comments and ignores input up to a given character.
+ */
+
+#if !defined(spatialdata_utils_lineparser_hh)
+#define spatialdata_utils_lineparser_hh
+
+#include <string> // HASA std::string
+#include <iosfwd> // USES std::istream
+
+namespace spatialdata {
+  namespace utils {
+    class LineParser;
+  } // utils
+} // spatialdata
+
+class spatialdata::utils::LineParser
+{ // LineParser
+
+// PUBLIC METHODS ///////////////////////////////////////////////////////
+public :
+
+  /** Constructor.
+   *
+   * @param sin Input stream.
+   * @param delimiter Comment that marks beginning of comment.
+   * @param bufsize Maximum size of line
+   */
+  LineParser(std::istream& sin, 
+		 const char* delimiter ="#",
+		 const size_t bufsize =1024);
+
+  // Destructor.
+  ~LineParser(void);
+
+  /** Get next non-comment line from file.
+   *
+   * @returns String with next non-comment information.
+   */
+  const std::string& next(void);
+
+  /** Ignore input until character read.
+   *
+   * @param Character flagging to stop reading.
+   */
+  void ignore(const char marker);
+
+  /** Set eating whitespace flag.
+   *
+   * @param flag True if whitespace should be ignored in fetching next
+   * data.
+   */
+  void eatwhitespace(const bool flag);
+
+  /** Putback string.
+   *
+   * @param buffer Buffer containing characters to put back.
+   */
+  void putback(const std::string& buffer);
+
+// NOT IMPLEMENTED //////////////////////////////////////////////////////
+private :
+
+  LineParser(const LineParser&); ///< Not implemented
+  const LineParser& operator=(const LineParser&); ///< Not implemented
+
+// PRIVATE MEMBERS //////////////////////////////////////////////////////
+private :
+
+  std::istream& _in; ///< Input stream.
+  std::string _value; ///< Value for output.
+  std::string _delimiter; ///< Comment delimiter.
+  const int _bufsize; ///< Size of buffer for line input.
+  char* _buffer; ///< Buffer for line input.
+  bool _eatwhitespace; ///< Flag indicating to eat whitespace before fetching.
+
+}; // LineParser
+
+#endif // spatialdata_utils_lineparser_hh
+
+
+// End of file 



More information about the cig-commits mailing list