#include // std::replace #include "dumper.h" #include "Parser.h" #include "PHRQ_io.h" #if defined(PHREEQCI_GUI) #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #endif dumper::dumper(PHRQ_io *io) : PHRQ_base(io) { this->file_name = "dump.out"; this->append = false; this->on = false; } dumper::dumper(CParser & parser, PHRQ_io *io) : PHRQ_base(io) { this->file_name = "dump.out"; this->append = false; this->Read(parser); } dumper::~dumper(void) { } void dumper::SetAll(bool tf) { this->binList.SetAll(tf); } bool dumper::Read(CParser & parser) { bool return_value(true); std::istream::pos_type ptr; std::istream::pos_type next_char; std::string token; int opt_save; opt_save = CParser::OPT_DEFAULT; bool cleared_once = false; this->on = true; for (;;) { int opt; StorageBinListItem cells; opt = parser.get_option(vopts, next_char); if (opt == CParser::OPT_DEFAULT) { opt = opt_save; } else { opt_save = opt; } if (opt > 1 && !cleared_once) { binList.SetAll(false); cleared_once = true; } // Select StorageBinListItem StorageBinListItem *item = NULL; switch (opt) { case 3: // cell case 4: // cells item = &cells; break; case 5: case 6: item = &(this->binList.Get_solution()); break; case 7: case 8: case 9: case 10: item = &(this->binList.Get_pp_assemblage()); break; case 11: item = &(this->binList.Get_exchange()); break; case 12: item = &(this->binList.Get_surface()); break; case 13: case 14: case 15: item = &(this->binList.Get_ss_assemblage()); break; case 16: case 17: item = &(this->binList.Get_gas_phase()); break; case 18: item = &(this->binList.Get_kinetics()); break; case 19: // mix item = &(this->binList.Get_mix()); break; case 20: // reaction case 21: // reactions item = &(this->binList.Get_reaction()); break; case 22: // temperature case 23: // reaction_temperature case 24: // reaction_temperatures item = &(this->binList.Get_temperature()); break; case 25: // pressure case 26: // reaction_pressure case 27: // reaction_pressures item = &(this->binList.Get_pressure()); break; default: break; } // Read dump entity list of numbers or number ranges for line, store in item if ((opt > 2)) { for (;;) { CParser::TOKEN_TYPE j = parser.copy_token(token, next_char); if (item && j == CParser::TT_DIGIT) { item->Augment(token); } else if (item && j == CParser::TT_EMPTY) { item->Augment(token); break; } else { parser.error_msg("Expected single number or range of numbers.", PHRQ_io::OT_CONTINUE); } } } if (opt == 3 || opt == 4) { this->binList.TransferAll(cells); } // Process other identifiers std::set < int >::iterator it; switch (opt) { case CParser::OPT_EOF: break; case CParser::OPT_KEYWORD: break; case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: break; case 0: //file std::getline(parser.get_iss(), this->file_name); trim(this->file_name); if (this->file_name.size() == 0) { this->file_name = "dump.out"; } break; case 1: //append { parser.copy_token(token, next_char); //if (!(parser.get_iss() >> this->append)) this->append = true; if (token.c_str()[0] == 'f' || token.c_str()[0] == 'F') { this->append = false; } } break; case 2: //all this->SetAll(true); break; default: case CParser::OPT_DEFAULT: case CParser::OPT_ERROR: opt = CParser::OPT_EOF; parser.error_msg("Unknown input reading DUMP definition.", PHRQ_io::OT_CONTINUE); parser.error_msg(parser.line().c_str(), PHRQ_io::OT_CONTINUE); return_value = false; break; } if (opt == CParser::OPT_EOF || opt == CParser::OPT_KEYWORD) break; } return(return_value); } bool dumper::Get_bool_any(void) { return ( Get_bool_solution() || Get_bool_pp_assemblage() || Get_bool_exchange() || Get_bool_surface() || Get_bool_ss_assemblage() || Get_bool_gas_phase() || Get_bool_kinetics() || Get_bool_mix() || Get_bool_reaction() || Get_bool_temperature() || Get_bool_pressure() ); } const std::vector< std::string >::value_type temp_vopts[] = { std::vector< std::string >::value_type("file"), // 0 std::vector< std::string >::value_type("append"), // 1 std::vector< std::string >::value_type("all"), // 2 std::vector< std::string >::value_type("cell"), // 3 std::vector< std::string >::value_type("cells"), // 4 std::vector< std::string >::value_type("solution"), // 5 std::vector< std::string >::value_type("solutions"), // 6 std::vector< std::string >::value_type("pp_assemblage"), // 7 std::vector< std::string >::value_type("pp_assemblages"), // 8 std::vector< std::string >::value_type("equilibrium_phase"), // 9 std::vector< std::string >::value_type("equilibrium_phases"), // 10 std::vector< std::string >::value_type("exchange"), // 11 std::vector< std::string >::value_type("surface"), // 12 std::vector< std::string >::value_type("ss_assemblage"), // 13 std::vector< std::string >::value_type("solid_solution"), // 14 std::vector< std::string >::value_type("solid_solutions"), // 15 std::vector< std::string >::value_type("gas_phase"), // 16 std::vector< std::string >::value_type("gas_phases"), // 17 std::vector< std::string >::value_type("kinetics"), // 18 std::vector< std::string >::value_type("mix"), // 19 std::vector< std::string >::value_type("reaction"), // 20 std::vector< std::string >::value_type("reactions"), // 21 std::vector< std::string >::value_type("temperature"), // 22 std::vector< std::string >::value_type("reaction_temperature"), // 23 std::vector< std::string >::value_type("reaction_temperatures"), // 24 std::vector< std::string >::value_type("pressure"), // 25 std::vector< std::string >::value_type("reaction_pressure"), // 26 std::vector< std::string >::value_type("reaction_pressures") // 27 }; const std::vector< std::string > dumper::vopts(temp_vopts, temp_vopts + sizeof temp_vopts / sizeof temp_vopts[0]);