From ff19c86d654797754974ba5a38cb433d02e87a70 Mon Sep 17 00:00:00 2001 From: David L Parkhurst Date: Tue, 3 Nov 2009 17:55:36 +0000 Subject: [PATCH] The tellg and seekg did not work for gz files because the methods are not implemented. Modified the parser to accumulate lines so that they could be turned into a stream and reread. Modified kinetics, exchange, ppassemblage, ssassemblage, and surface to use the new way to reread lines for component values. git-svn-id: svn://136.177.114.72/svn_GW/phreeqcpp/trunk@3742 1feff8c3-07ed-0310-ac33-dd36852eb9cd --- Exchange.cxx | 19 +++++++++++++++++++ PPassemblage.cxx | 22 +++++++++++++++++++++- Parser.cxx | 8 ++++++++ Parser.h | 14 ++++++++++++++ SSassemblage.cxx | 20 +++++++++++++++++++- Surface.cxx | 38 ++++++++++++++++++++++++++++++++++++++ cxxKinetics.cxx | 20 ++++++++++++++++++++ 7 files changed, 139 insertions(+), 2 deletions(-) diff --git a/Exchange.cxx b/Exchange.cxx index 3e57a383..d5d41243 100644 --- a/Exchange.cxx +++ b/Exchange.cxx @@ -356,6 +356,7 @@ cxxExchange::read_raw(CParser & parser, bool check) cxxExchComp ec; // preliminary read +#ifdef SKIP std::istream::pos_type pos = parser.tellg(); CParser::ECHO_OPTION eo = parser.get_echo_file(); parser.set_echo_file(CParser::EO_NONE); @@ -380,6 +381,24 @@ cxxExchange::read_raw(CParser & parser, bool check) std::string str(ec1.get_formula()); this->exchComps[str] = ec1; } +#endif + parser.set_accumulate(true); + ec.read_raw(parser, false); + parser.set_accumulate(false); + std::istringstream is(parser.get_accumulated()); + CParser reread(is); + if (this->exchComps.find(ec.get_formula()) != this->exchComps.end()) + { + cxxExchComp & comp = this->exchComps.find(ec.get_formula())->second; + comp.read_raw(reread, false); + } + else + { + cxxExchComp ec1; + ec1.read_raw(reread, false); + std::string str(ec1.get_formula()); + this->exchComps[str] = ec1; + } } useLastLine = true; break; diff --git a/PPassemblage.cxx b/PPassemblage.cxx index 5611b15d..92763491 100644 --- a/PPassemblage.cxx +++ b/PPassemblage.cxx @@ -230,9 +230,10 @@ cxxPPassemblage::read_raw(CParser & parser, bool check) case 1: // component { - cxxPPassemblageComp ppComp; + cxxPPassemblageComp ec; // preliminary read +#ifdef SKIP std::istream::pos_type pos = parser.tellg(); CParser::ECHO_OPTION eo = parser.get_echo_file(); parser.set_echo_file(CParser::EO_NONE); @@ -258,6 +259,25 @@ cxxPPassemblage::read_raw(CParser & parser, bool check) std::string str(ppComp1.get_name()); this->ppAssemblageComps[str] = ppComp1; } +#endif + parser.set_accumulate(true); + ec.read_raw(parser, false); + parser.set_accumulate(false); + std::istringstream is(parser.get_accumulated()); + CParser reread(is); + + if (this->ppAssemblageComps.find(ec.get_name()) != this->ppAssemblageComps.end()) + { + cxxPPassemblageComp & comp = this->ppAssemblageComps.find(ec.get_name())->second; + comp.read_raw(reread, false); + } + else + { + cxxPPassemblageComp ppComp1; + ppComp1.read_raw(reread, false); + std::string str(ppComp1.get_name()); + this->ppAssemblageComps[str] = ppComp1; + } } useLastLine = true; break; diff --git a/Parser.cxx b/Parser.cxx index b4a4f08d..2552b242 100644 --- a/Parser.cxx +++ b/Parser.cxx @@ -27,6 +27,7 @@ m_next_keyword(KT_NONE) m_line.reserve(80); echo_file = EO_ALL; echo_stream = EO_NONE; + accumulate = false; } CParser::CParser(std::istream & input, std::ostream & output):m_input_stream(input), m_output_stream(output), m_error_stream(std::cerr), @@ -37,6 +38,7 @@ m_next_keyword(KT_NONE) m_line.reserve(80); echo_file = EO_ALL; echo_stream = EO_NONE; + accumulate = false; } CParser::CParser(std::istream & input, std::ostream & output, std::ostream & error):m_input_stream(input), m_output_stream(output), m_error_stream(error), @@ -47,6 +49,7 @@ m_next_keyword(KT_NONE) m_line.reserve(80); echo_file = EO_ALL; echo_stream = EO_NONE; + accumulate = false; } CParser::~CParser() @@ -199,6 +202,11 @@ CParser::LINE_TYPE CParser::get_line() } } + if (this->accumulate) + { + this->accumulated.append(m_line_save); + this->accumulated.append("\n"); + } // // New line character encountered // diff --git a/Parser.h b/Parser.h index 7a12b608..8d436ff6 100644 --- a/Parser.h +++ b/Parser.h @@ -151,6 +151,18 @@ class CParser { return m_line; } + std::string & get_accumulated() + { + return accumulated; + } + void set_accumulate(bool tf) + { + if (tf) + { + accumulated.clear(); + } + this->accumulate = tf; + } std::istringstream & get_iss() { return m_line_iss; @@ -289,6 +301,8 @@ class CParser LINE_TYPE m_line_type; ECHO_OPTION echo_stream; ECHO_OPTION echo_file; + std::string accumulated; + bool accumulate; }; // Global functions diff --git a/SSassemblage.cxx b/SSassemblage.cxx index c46b3c41..1a553059 100644 --- a/SSassemblage.cxx +++ b/SSassemblage.cxx @@ -208,6 +208,7 @@ cxxSSassemblage::read_raw(CParser & parser, bool check) cxxSSassemblageSS ec; // preliminary read +#ifdef SKIP std::istream::pos_type pos = parser.tellg(); CParser::ECHO_OPTION eo = parser.get_echo_file(); parser.set_echo_file(CParser::EO_NONE); @@ -231,7 +232,24 @@ cxxSSassemblage::read_raw(CParser & parser, bool check) std::string str(ec1.get_name()); this->ssAssemblageSSs[str] = ec1; } - +#endif + parser.set_accumulate(true); + ec.read_raw(parser, false); + parser.set_accumulate(false); + std::istringstream is(parser.get_accumulated()); + CParser reread(is); + if (this->ssAssemblageSSs.find(ec.get_name()) != this->ssAssemblageSSs.end()) + { + cxxSSassemblageSS & ec1 = this->ssAssemblageSSs.find(ec.get_name())->second; + ec1.read_raw(reread, false); + } + else + { + cxxSSassemblageSS ec1; + ec1.read_raw(reread, false); + std::string str(ec1.get_name()); + this->ssAssemblageSSs[str] = ec1; + } } useLastLine = true; break; diff --git a/Surface.cxx b/Surface.cxx index 9c4293e8..368788b6 100644 --- a/Surface.cxx +++ b/Surface.cxx @@ -510,6 +510,7 @@ cxxSurface::read_raw(CParser & parser, bool check) cxxSurfaceComp ec; // preliminary read +#ifdef SKIP std::istream::pos_type pos = parser.tellg(); CParser::ECHO_OPTION eo = parser.get_echo_file(); parser.set_echo_file(CParser::EO_NONE); @@ -533,6 +534,24 @@ cxxSurface::read_raw(CParser & parser, bool check) std::string str(ec1.get_formula()); this->surfaceComps[str] = ec1; } +#endif + parser.set_accumulate(true); + ec.read_raw(parser, false); + parser.set_accumulate(false); + std::istringstream is(parser.get_accumulated()); + CParser reread(is); + if (this->surfaceComps.find(ec.get_formula()) != this->surfaceComps.end()) + { + cxxSurfaceComp & comp = this->surfaceComps.find(ec.get_formula())->second; + comp.read_raw(reread, false); + } + else + { + cxxSurfaceComp ec1; + ec1.read_raw(reread, false); + std::string str(ec1.get_formula()); + this->surfaceComps[str] = ec1; + } } useLastLine = true; break; @@ -542,6 +561,7 @@ cxxSurface::read_raw(CParser & parser, bool check) cxxSurfaceCharge ec; // preliminary read +#ifdef SKIP std::istream::pos_type pos = parser.tellg(); CParser::ECHO_OPTION eo = parser.get_echo_file(); parser.set_echo_file(CParser::EO_NONE); @@ -565,6 +585,24 @@ cxxSurface::read_raw(CParser & parser, bool check) std::string str(ec1.get_name()); this->surfaceCharges[str] = ec1; } +#endif + parser.set_accumulate(true); + ec.read_raw(parser, false); + parser.set_accumulate(false); + std::istringstream is(parser.get_accumulated()); + CParser reread(is); + if (this->surfaceCharges.find(ec.get_name()) != this->surfaceCharges.end()) + { + cxxSurfaceCharge & comp = this->surfaceCharges.find(ec.get_name())->second; + comp.read_raw(reread, false); + } + else + { + cxxSurfaceCharge ec1; + ec1.read_raw(reread, false); + std::string str(ec1.get_name()); + this->surfaceCharges[str] = ec1; + } } useLastLine = true; break; diff --git a/cxxKinetics.cxx b/cxxKinetics.cxx index 9bee131e..bc2b8e5f 100644 --- a/cxxKinetics.cxx +++ b/cxxKinetics.cxx @@ -381,6 +381,7 @@ cxxKinetics::read_raw(CParser & parser, bool check) cxxKineticsComp ec; // preliminary read +#ifdef SKIP std::istream::pos_type pos = parser.tellg(); CParser::ECHO_OPTION eo = parser.get_echo_file(); parser.set_echo_file(CParser::EO_NONE); @@ -404,6 +405,25 @@ cxxKinetics::read_raw(CParser & parser, bool check) std::string str(ec1.get_rate_name()); this->kineticsComps[str] = ec1; } +#endif + parser.set_accumulate(true); + ec.read_raw(parser, false); + parser.set_accumulate(false); + std::istringstream is(parser.get_accumulated()); + CParser reread(is); + + if (this->kineticsComps.find(ec.get_rate_name()) != this->kineticsComps.end()) + { + cxxKineticsComp & comp = this->kineticsComps.find(ec.get_rate_name())->second; + comp.read_raw(reread, false); + } + else + { + cxxKineticsComp ec1; + ec1.read_raw(reread, false); + std::string str(ec1.get_rate_name()); + this->kineticsComps[str] = ec1; + } } useLastLine = true; break;