[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