diff --git a/IPhreeqc.vcproj b/IPhreeqc.vcproj index 6a5f9f8a..f36e401b 100644 --- a/IPhreeqc.vcproj +++ b/IPhreeqc.vcproj @@ -44,7 +44,7 @@ Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="$(DEV_GMP_INC);include;src;src/phreeqcpp;src/phreeqcpp/phreeqc" - PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SWIG_SHARED_OBJ;_CRT_SECURE_NO_DEPRECATE" + PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SWIG_SHARED_OBJ;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;PHREEQC_CPP;XX_INVERSE_CL1MP_XX;PHREEQC_CLASS;USE_PHRQ_ALLOC" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" @@ -118,7 +118,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="$(DEV_GMP_INC);include;src;src/phreeqcpp;src/phreeqcpp/phreeqc" - PreprocessorDefinitions="_DEBUG;WIN32;_LIB;SWIG_SHARED_OBJ;_CRT_SECURE_NO_DEPRECATE" + PreprocessorDefinitions="_DEBUG;WIN32;_LIB;SWIG_SHARED_OBJ;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;PHREEQC_CPP;XX_INVERSE_CL1MP_XX;PHREEQC_CLASS;USE_PHRQ_ALLOC" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" @@ -193,7 +193,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="$(DEV_GMP_INC);include;src;src/phreeqcpp;src/phreeqcpp/phreeqc" - PreprocessorDefinitions="WIN32_MEMORY_DEBUG;_DEBUG;WIN32;_LIB;SWIG_SHARED_OBJ;_CRT_SECURE_NO_DEPRECATE" + PreprocessorDefinitions="WIN32_MEMORY_DEBUG;_DEBUG;WIN32;_LIB;SWIG_SHARED_OBJ;_CRT_SECURE_NO_DEPRECATE;XX_INVERSE_CL1MP_XX" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" @@ -313,40 +313,6 @@ RelativePath=".\src\fwrap3.c" > - - - - - - - - - - - @@ -454,6 +420,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1831,37 +2005,25 @@ > + + - - - - - - - - diff --git a/IPhreeqc.vcproj.GS.charlton.user b/IPhreeqc.vcproj.GS.charlton.user new file mode 100644 index 00000000..f1aa731b --- /dev/null +++ b/IPhreeqc.vcproj.GS.charlton.user @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + diff --git a/include/IPhreeqc.h b/include/IPhreeqc.h index 1b7671b8..4182e85d 100644 --- a/include/IPhreeqc.h +++ b/include/IPhreeqc.h @@ -1,11 +1,13 @@ -#ifndef __IPHREEQC_H -#define __IPHREEQC_H +#ifndef _INC_IPHREEQC_H +#define _INC_IPHREEQC_H -#include "Var.h" +#include "IPhreeqcCallbacks.h" /* PFN_PRERUN_CALLBACK, PFN_POSTRUN_CALLBACK, PFN_CATCH_CALLBACK */ +#include "CVar.hxx" /* VRESULT */ #if defined(__cplusplus) extern "C" { #endif + /** * Load the specified database file into phreeqc. * @param filename The name of the phreeqc database to load. @@ -373,10 +375,6 @@ void ClearErrors(void); void OutputLines(void); -typedef int (*PFN_PRERUN_CALLBACK)(void *cookie); -typedef int (*PFN_POSTRUN_CALLBACK)(void *cookie); -typedef int (*PFN_CATCH_CALLBACK)(void *cookie); - int RunWithCallback(PFN_PRERUN_CALLBACK pfn_pre, PFN_POSTRUN_CALLBACK pfn_post, void *cookie, int output_on, int error_on, int log_on, int selected_output_on); int CatchErrors(PFN_CATCH_CALLBACK pfn, void *cookie); @@ -387,8 +385,9 @@ const char* GetLastErrorString(void); void DebugOutputLines(void); #endif + #if defined(__cplusplus) } #endif -#endif /* __IPHREEQC_H */ +#endif /* _INC_IPHREEQC_H */ diff --git a/include/IPhreeqcCallbacks.h b/include/IPhreeqcCallbacks.h new file mode 100644 index 00000000..85d46840 --- /dev/null +++ b/include/IPhreeqcCallbacks.h @@ -0,0 +1,19 @@ +#ifndef _INC_IPHREEQC_CALLBACKS_H +#define _INC_IPHREEQC_CALLBACKS_H + + +#if defined(__cplusplus) +extern "C" { +#endif + + +typedef int (*PFN_PRERUN_CALLBACK)(void *cookie); +typedef int (*PFN_POSTRUN_CALLBACK)(void *cookie); +typedef int (*PFN_CATCH_CALLBACK)(void *cookie); + + +#if defined(__cplusplus) +} +#endif + +#endif /* _INC_IPHREEQC_CALLBACKS_H */ diff --git a/src/ErrorReporter.hxx b/src/ErrorReporter.hxx index a1eb67c3..e2f554b2 100644 --- a/src/ErrorReporter.hxx +++ b/src/ErrorReporter.hxx @@ -6,7 +6,8 @@ #include // std::fprintf #include "phreeqcns.hxx" -class IErrorReporter { +class IErrorReporter +{ public: virtual size_t AddError(const char* error_msg) = 0; virtual void Clear(void) = 0; diff --git a/src/IPhreeqc.cpp b/src/IPhreeqc.cpp index 05209cab..639bfa9d 100644 --- a/src/IPhreeqc.cpp +++ b/src/IPhreeqc.cpp @@ -1,214 +1,216 @@ -#if defined(_DEBUG) -#pragma warning(disable : 4786) // disable truncation warning -#endif -#include // std::cout -#include // std::ifstream -#include // std::auto_ptr -#include // std::istringstream -#include - -#if defined(_WIN32) -#include // ::OutputDebugString -#endif - -#include "phreeqcns.hxx" -#include "ErrorReporter.hxx" -#include "SelectedOutput.hxx" -#include "Var.h" #include "IPhreeqc.h" -#include "module_files.h" - -#ifdef PHREEQC_CPP -extern int dump_entities(void); -extern int delete_entities(void); -extern int run_as_cells(void); -#endif +#include "IPhreeqc.hpp" +#include "ErrorReporter.hxx" +int istream_getc(void *cookie); const char OUTPUT_FILENAME[] = "phreeqc.out"; const char ERROR_FILENAME[] = "phreeqc.err"; const char LOG_FILENAME[] = "phreeqc.log"; const char PUNCH_FILENAME[] = "selected.out"; - -const std::string& GetAccumulatedLines(void); -void ClearAccumulatedLines(void); - -void EndRow(void); -void AddSelectedOutput(const char* name, const char* format, va_list argptr); - - -struct PhreeqcStop{}; - -struct IPhreeqc -{ - // ctor - IPhreeqc(void) - : m_pIErrorReporter(0) - , m_bDatabaseLoaded(false) - , m_bSelectedOutputOn(false) - , m_sPunchFileName(NULL) - { - // initialize - UnLoadDatabase(); - }; - IPhreeqc(IErrorReporter *pIErrorReporter) - : m_pIErrorReporter(0) - , m_bDatabaseLoaded(false) - , m_bSelectedOutputOn(false) - , m_sPunchFileName(NULL) - { - // initialize - UnLoadDatabase(); - }; - ~IPhreeqc(void) - { - UnLoadDatabase(); - delete[] m_sPunchFileName; - }; - IErrorReporter *m_pIErrorReporter; - bool m_bDatabaseLoaded; - bool m_bSelectedOutputOn; - char *m_sPunchFileName; -}; - -static std::string s_string_input; -static std::ostringstream s_oss; -static CErrorReporter s_errorReporter; -static IPhreeqc s_IPhreeqc(&s_errorReporter); - -static void check_database(const char *sz_routine); - -static void do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int error_on, int log_on, int selected_output_on, PFN_PRERUN_CALLBACK pfn_pre, PFN_POSTRUN_CALLBACK pfn_post, void *cookie); - - -int istream_getc(void *cookie); -int output_handler(const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); -int open_handler(const int type, const char *file_name); -int handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); - - -int -istream_getc(void *cookie) -{ - if (cookie) - { - std::istream* is = (std::istream*)cookie; - return is->get(); - } - return EOF; -} - -int -handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args) -{ - int n = OK; - switch (action) - { - case ACTION_OPEN: - n = open_handler(type, err_str); - break; - - case ACTION_OUTPUT: - n = output_handler(type, err_str, stop, cookie, format, args); - break; - - default: - n = module_handler(action, type, err_str, stop, cookie, format, args); - break; - } - - if (stop == STOP) - { - throw PhreeqcStop(); - } - return n; -} - -int -output_handler(const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args) -{ - IPhreeqc* pIPhreeqc = (IPhreeqc*) cookie; - - switch (type) - { - case OUTPUT_ERROR: - if (pIPhreeqc && pIPhreeqc->m_pIErrorReporter) - { - std::ostringstream oss; - oss << "ERROR: " << err_str << "\n"; - if (stop == STOP) { - oss << "Stopping.\n"; - } - pIPhreeqc->m_pIErrorReporter->AddError(oss.str().c_str()); - } - break; - - case OUTPUT_PUNCH: - AddSelectedOutput(err_str, format, args); - break; - - } - return module_handler(ACTION_OUTPUT, type, err_str, stop, cookie, format, args); -} - -int -open_handler(const int type, const char *file_name) -{ - int n = OK; - switch (type) - { - case OUTPUT_PUNCH: - if (file_name) - { - ASSERT(s_IPhreeqc.m_sPunchFileName != file_name); - if (s_IPhreeqc.m_sPunchFileName != file_name) - { - delete[] s_IPhreeqc.m_sPunchFileName; - s_IPhreeqc.m_sPunchFileName = NULL; - s_IPhreeqc.m_sPunchFileName = new char[::strlen(file_name) + 1]; - ::strcpy(s_IPhreeqc.m_sPunchFileName, file_name); - } - } - if (s_IPhreeqc.m_bSelectedOutputOn) - { - n = module_handler(ACTION_OPEN, type, file_name, CONTINUE, NULL, NULL, NULL); - } - break; - default: - n = module_handler(ACTION_OPEN, type, file_name, CONTINUE, NULL, NULL, NULL); - break; - } - return n; -} - int LoadDatabase(const char* filename) +{ + return IPhreeqc::LibraryInstance()->LoadDatabase(filename); +} + +int +LoadDatabaseString(const char* input) +{ + return IPhreeqc::LibraryInstance()->LoadDatabaseString(input); +} + +void +UnLoadDatabase(void) +{ + IPhreeqc::LibraryInstance()->UnLoadDatabase(); +} + +void +OutputLastError(void) +{ + IPhreeqc::LibraryInstance()->OutputLastError(); +} + +const char* +GetLastErrorString(void) +{ + return IPhreeqc::LibraryInstance()->GetLastErrorString(); +} + +VRESULT +AccumulateLine(const char *line) +{ + return IPhreeqc::LibraryInstance()->AccumulateLine(line); +} + +int +Run(int output_on, int error_on, int log_on, int selected_output_on) +{ + return IPhreeqc::LibraryInstance()->Run(output_on, error_on, log_on, selected_output_on); +} + +int +RunFile(const char* filename, int output_on, int error_on, int log_on, int selected_output_on) +{ + return IPhreeqc::LibraryInstance()->RunFile(filename, output_on, error_on, log_on, selected_output_on); +} + +int +RunString(const char* input, int output_on, int error_on, int log_on, int selected_output_on) +{ + return IPhreeqc::LibraryInstance()->RunString(input, output_on, error_on, log_on, selected_output_on); +} + +int +GetSelectedOutputRowCount(void) +{ + return (int)IPhreeqc::LibraryInstance()->GetSelectedOutputRowCount(); +} + +int +GetSelectedOutputColumnCount(void) +{ + return (int)IPhreeqc::LibraryInstance()->GetSelectedOutputColumnCount(); +} + +VRESULT +GetSelectedOutputValue(int row, int col, VAR* pVAR) +{ + return IPhreeqc::LibraryInstance()->GetSelectedOutputValue(row, col, pVAR); +} + +size_t +AddError(const char* error_msg) +{ + return IPhreeqc::LibraryInstance()->AddError(error_msg); +} + + +void +OutputLines(void) +{ + IPhreeqc::LibraryInstance()->OutputLines(); +} + +const std::string& +GetAccumulatedLines(void) +{ + return IPhreeqc::LibraryInstance()->GetAccumulatedLines(); +} + +void +ClearAccumulatedLines(void) +{ + IPhreeqc::LibraryInstance()->ClearAccumulatedLines(); +} + + +IPhreeqc::IPhreeqc(void) +: Phreeqc() +, ErrorReporter(0) +, SelectedOutput(0) +, DatabaseLoaded(false) +, SelectedOutputOn(false) +{ + ASSERT(this->phast == 0); + this->ErrorReporter = new CErrorReporter; + this->SelectedOutput = new CSelectedOutput(); + this->Init(); + this->UnLoadDatabase(); +} + +IPhreeqc::~IPhreeqc(void) +{ + delete this->ErrorReporter; + delete this->SelectedOutput; +} + +// the library singleton +IPhreeqc* IPhreeqc::Instance = 0; + +IPhreeqc* IPhreeqc::LibraryInstance() +{ + if (IPhreeqc::Instance == 0) + { + IPhreeqc::Instance = new IPhreeqc; + } + return IPhreeqc::Instance; +} + +int Phreeqc::EndRow(void) +{ + return OK; +} + +int IPhreeqc::EndRow(void) +{ + if (this->SelectedOutput->GetRowCount() <= 1) + { + // ensure all user_punch headings are included + for (int i = this->n_user_punch_index; i < this->user_punch_count_headings; ++i) + { + this->SelectedOutput->PushBackEmpty(this->user_punch_headings[i]); + } + } + return this->SelectedOutput->EndRow(); +} + +void IPhreeqc::ClearAccumulatedLines(void) +{ + this->StringInput.erase(); +} + +size_t IPhreeqc::AddError(const char* error_msg) +{ + return this->ErrorReporter->AddError(error_msg); +} + +const std::string& IPhreeqc::GetAccumulatedLines(void) +{ + return this->StringInput; +} + +void IPhreeqc::OutputLines(void) +{ + std::cout << this->StringInput.c_str() << std::endl; +} + +void IPhreeqc::UnLoadDatabase(void) +{ + // init IPhreeqc + // + this->DatabaseLoaded = false; + this->SelectedOutputOn = false; + + // clear error state + // + ASSERT(this->ErrorReporter); + this->ErrorReporter->Clear(); + + // clear selectedoutput + // + ASSERT(this->ErrorReporter); + this->SelectedOutput->Clear(); + + // initialize phreeqc + // + this->clean_up(); + this->add_output_callback(IPhreeqc::handler, this); + this->do_initialize(); + this->input_error = 0; +} + +int IPhreeqc::LoadDatabase(const char* filename) { try { // cleanup // - UnLoadDatabase(); + this->UnLoadDatabase(); + this->SelectedOutput->Clear(); - CSelectedOutput::Instance()->Clear(); - -#if 0 - // open stream - // - std::ifstream ifs; - ifs.open(filename); - if (!ifs.is_open()) - { - std::ostringstream oss; - oss << "LoadDatabase: Unable to open:" << "\"" << filename << "\"."; - error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop - } - - // read input - // - read_database(istream_getc, &ifs); -#else // open file // FILE* f = fopen(filename, "r"); @@ -216,24 +218,24 @@ LoadDatabase(const char* filename) { std::ostringstream oss; oss << "LoadDatabase: Unable to open:" << "\"" << filename << "\"."; - error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop + this->error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop } // read input // - read_database(getc_callback, f); -#endif + this->read_database(getc_callback, f); + } catch (PhreeqcStop) { // do nothing } - catch(...) + catch (...) { const char *errmsg = "LoadDatabase: An unhandled exception occured.\n"; try { - error_msg(errmsg, STOP); // throws PhreeqcStop + this->error_msg(errmsg, STOP); // throws PhreeqcStop } catch (PhreeqcStop) { @@ -241,27 +243,26 @@ LoadDatabase(const char* filename) } } - s_IPhreeqc.m_bDatabaseLoaded = (input_error == 0); - return input_error; + this->DatabaseLoaded = (this->input_error == 0); + return this->input_error; } -int -LoadDatabaseString(const char* input) +int IPhreeqc::LoadDatabaseString(const char* input) { try { // cleanup // - UnLoadDatabase(); + this->UnLoadDatabase(); - CSelectedOutput::Instance()->Clear(); + this->SelectedOutput->Clear(); std::string s(input); std::istringstream iss(s); // read input // - read_database(istream_getc, &iss); + this->read_database(istream_getc, &iss); } catch (PhreeqcStop) { @@ -272,7 +273,7 @@ LoadDatabaseString(const char* input) const char *errmsg = "LoadDatabaseString: An unhandled exception occured.\n"; try { - error_msg(errmsg, STOP); // throws PhreeqcStop + this->error_msg(errmsg, STOP); // throws PhreeqcStop } catch (PhreeqcStop) { @@ -280,423 +281,70 @@ LoadDatabaseString(const char* input) } } - s_IPhreeqc.m_bDatabaseLoaded = (input_error == 0); - return input_error; + this->DatabaseLoaded = (this->input_error == 0); + return this->input_error; } -void -UnLoadDatabase(void) +void IPhreeqc::OutputLastError(void) { - // init IPhreeqc - // - s_IPhreeqc.m_pIErrorReporter = &s_errorReporter; - s_IPhreeqc.m_bDatabaseLoaded = false; - s_IPhreeqc.m_bSelectedOutputOn = false; - - // clear error state - // - s_errorReporter.Clear(); - - // free selectedoutput - // - CSelectedOutput::Release(); - - // initialize phreeqc - // - clean_up(); - add_output_callback(handler, &s_IPhreeqc); - do_initialize(); - input_error = 0; + std::cout << ((CErrorReporter*)this->ErrorReporter)->GetOS()->str().c_str() << std::endl; } - -void -OutputLastError(void) -{ - std::cout << s_errorReporter.GetOS()->str().c_str() << std::endl; -} - -const char* -GetLastErrorString(void) +const char* IPhreeqc::GetLastErrorString(void) { static std::string str; - str = s_errorReporter.GetOS()->str(); + str = ((CErrorReporter*)this->ErrorReporter)->GetOS()->str(); return str.c_str(); } -// COMMENT: {11/27/2006 7:00:49 PM}#if defined(_WIN32) -// COMMENT: {11/27/2006 7:00:49 PM}void -// COMMENT: {11/27/2006 7:00:49 PM}DebugOutputLastError(void) -// COMMENT: {11/27/2006 7:00:49 PM}{ -// COMMENT: {11/27/2006 7:00:49 PM} std::istringstream iss(s_errorReporter.GetOS()->str()); -// COMMENT: {11/27/2006 7:00:49 PM} std::string line; -// COMMENT: {11/27/2006 7:00:49 PM} while (std::getline(iss, line)) { -// COMMENT: {11/27/2006 7:00:49 PM} ::OutputDebugString(line.c_str()); -// COMMENT: {11/27/2006 7:00:49 PM} ::OutputDebugString("\n"); -// COMMENT: {11/27/2006 7:00:49 PM} } -// COMMENT: {11/27/2006 7:00:49 PM}} -// COMMENT: {11/27/2006 7:00:49 PM}#endif - - -VRESULT -AccumulateLine(const char *line) +void IPhreeqc::check_database(const char* sz_routine) { - try - { - s_errorReporter.Clear(); - s_string_input.append(line); - s_string_input.append("\n"); - return VR_OK; - } - catch (...) - { - s_errorReporter.AddError("AccumulateLine: An unhandled exception occured.\n"); - } - return VR_OUTOFMEMORY; -} + this->ErrorReporter->Clear(); + this->SelectedOutput->Clear(); -int -Run(int output_on, int error_on, int log_on, int selected_output_on) -{ - static const char *sz_routine = "Run"; - try - { - // this may throw - check_database(sz_routine); - - input_error = 0; - - // create input stream - std::istringstream iss(GetAccumulatedLines()); - - // this may throw - do_run(sz_routine, &iss, NULL, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); - } - catch (PhreeqcStop) - { - // do nothing - } - catch(...) - { - const char *errmsg = "Run: An unhandled exception occured.\n"; - try - { - error_msg(errmsg, STOP); // throws PhreeqcStop - } - catch (PhreeqcStop) - { - // do nothing - } - } - - ::ClearAccumulatedLines(); - close_output_files(); - return input_error; -} - -int -RunFile(const char* filename, int output_on, int error_on, int log_on, int selected_output_on) -{ - static const char *sz_routine = "RunFile"; - try - { - // this may throw - check_database(sz_routine); - - input_error = 0; - -#if 0 - // create input stream - std::ifstream ifs; - ifs.open(filename); - if (!ifs.is_open()) - { - std::ostringstream oss; - oss << "RunFile: Unable to open:" << "\"" << filename << "\"."; - input_error = 1; - error_msg(oss.str().c_str(), STOP); // throws - } - - // this may throw - do_run(sz_routine, &ifs, NULL, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); -#else - // open file - // - FILE* f = fopen(filename, "r"); - if (!f) - { - std::ostringstream oss; - oss << "RunFile: Unable to open:" << "\"" << filename << "\"."; - error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop - } - - // this may throw - do_run(sz_routine, NULL, f, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); -#endif - } - catch (PhreeqcStop) - { - // do nothing - } - catch(...) - { - const char *errmsg = "RunFile: An unhandled exception occured.\n"; - try - { - error_msg(errmsg, STOP); // throws PhreeqcStop - } - catch (PhreeqcStop) - { - // do nothing - } - } - - close_output_files(); - return input_error; -} - -int -RunString(const char* input, int output_on, int error_on, int log_on, int selected_output_on) -{ - static const char *sz_routine = "RunString"; - try - { - // this may throw - check_database(sz_routine); - - input_error = 0; - - // create input stream - std::string s(input); - std::istringstream iss(s); - - // this may throw - do_run(sz_routine, &iss, NULL, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); - } - catch (PhreeqcStop) - { - // do nothing - } - catch(...) - { - const char *errmsg = "RunString: An unhandled exception occured.\n"; - try - { - error_msg(errmsg, STOP); // throws PhreeqcStop - } - catch (PhreeqcStop) - { - // do nothing - } - } - - close_output_files(); - return input_error; -} - - -int -GetSelectedOutputRowCount(void) -{ - return (int)CSelectedOutput::Instance()->GetRowCount(); -} - -int -GetSelectedOutputColumnCount(void) -{ - return (int)CSelectedOutput::Instance()->GetColCount(); -} - -VRESULT -GetSelectedOutputValue(int row, int col, VAR* pVAR) -{ - s_errorReporter.Clear(); - if (!pVAR) { - s_errorReporter.AddError("GetSelectedOutputValue: VR_INVALIDARG pVar is NULL.\n"); - return VR_INVALIDARG; - } - - VRESULT v = CSelectedOutput::Instance()->Get(row, col, pVAR); - switch (v) { - case VR_OK: - break; - case VR_OUTOFMEMORY: - s_errorReporter.AddError("GetSelectedOutputValue: VR_OUTOFMEMORY Out of memory.\n"); - break; - case VR_BADVARTYPE: - s_errorReporter.AddError("GetSelectedOutputValue: VR_BADVARTYPE pVar must be initialized(VarInit) and/or cleared(VarClear).\n"); - break; - case VR_INVALIDARG: - // not possible - break; - case VR_INVALIDROW: - s_errorReporter.AddError("GetSelectedOutputValue: VR_INVALIDROW Row index out of range.\n"); - break; - case VR_INVALIDCOL: - s_errorReporter.AddError("GetSelectedOutputValue: VR_INVALIDCOL Column index out of range.\n"); - break; - } - return v; -} - -size_t -AddError(const char* error_msg) -{ - return s_errorReporter.AddError(error_msg); -} - -void -OutputLines(void) -{ - std::cout << s_string_input.c_str() << std::endl; -} - -// COMMENT: {11/27/2006 7:01:16 PM}#if defined(WIN32) -// COMMENT: {11/27/2006 7:01:16 PM}void -// COMMENT: {11/27/2006 7:01:16 PM}DebugOutputLines(void) -// COMMENT: {11/27/2006 7:01:16 PM}{ -// COMMENT: {11/27/2006 7:01:16 PM} std::istringstream iss(s_string_input); -// COMMENT: {11/27/2006 7:01:16 PM} std::string line; -// COMMENT: {11/27/2006 7:01:16 PM} while (std::getline(iss, line)) { -// COMMENT: {11/27/2006 7:01:16 PM} ::OutputDebugString(line.c_str()); -// COMMENT: {11/27/2006 7:01:16 PM} ::OutputDebugString("\n"); -// COMMENT: {11/27/2006 7:01:16 PM} } -// COMMENT: {11/27/2006 7:01:16 PM}} -// COMMENT: {11/27/2006 7:01:16 PM}#endif - -const std::string& -GetAccumulatedLines(void) -{ - return s_string_input; -} - -void -ClearAccumulatedLines(void) -{ - s_string_input.erase(); -} - -int -RunWithCallback(PFN_PRERUN_CALLBACK pfn_pre, PFN_POSTRUN_CALLBACK pfn_post, void *cookie, int output_on, int error_on, int log_on, int selected_output_on) -{ - static const char *sz_routine = "RunWithCallback"; - try - { - // this may throw - check_database(sz_routine); - - input_error = 0; - - // this may throw - do_run(sz_routine, NULL, NULL, output_on, error_on, log_on, selected_output_on, pfn_pre, pfn_post, cookie); - } - catch (PhreeqcStop) - { - // do nothing - } - catch(...) - { - const char *errmsg = "RunWithCallback: An unhandled exception occured.\n"; - try - { - error_msg(errmsg, STOP); // throws PhreeqcStop - } - catch (PhreeqcStop) - { - // do nothing - } - } - - ClearAccumulatedLines(); - close_output_files(); - output_close(OUTPUT_DUMP); // this should be closed in close_output_files - return input_error; -} - - -int -CatchErrors(PFN_CATCH_CALLBACK pfn, void *cookie) -{ - int rvalue = OK; - try - { - input_error = 0; - - if (pfn) - { - rvalue = pfn(cookie); - } - - } - catch (PhreeqcStop) - { - // do nothing - } - catch (...) - { - const char errmsg[] = "CatchErrors: Unhandled exception occured.\n"; - try - { - error_msg(errmsg, STOP); // throws PhreeqcStop - } - catch (PhreeqcStop) - { - // do nothing - } - } - return rvalue; -} - -static void -check_database(const char* sz_routine) -{ - s_errorReporter.Clear(); - CSelectedOutput::Instance()->Clear(); - - if (!s_IPhreeqc.m_bDatabaseLoaded) + if (!this->DatabaseLoaded) { std::ostringstream oss; oss << sz_routine << ": No database is loaded"; - input_error = 1; - error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop + this->input_error = 1; + this->error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop } } -static void -do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int error_on, int log_on, int selected_output_on, PFN_PRERUN_CALLBACK pfn_pre, PFN_POSTRUN_CALLBACK pfn_post, void *cookie) +void IPhreeqc::do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int error_on, int log_on, int selected_output_on, PFN_PRERUN_CALLBACK pfn_pre, PFN_POSTRUN_CALLBACK pfn_post, void *cookie) { std::auto_ptr auto_iss(NULL); char token[MAX_LENGTH]; if (output_on) { - if (output_open(OUTPUT_MESSAGE, OUTPUT_FILENAME) != OK) + if (this->output_open(OUTPUT_MESSAGE, OUTPUT_FILENAME) != OK) { std::ostringstream oss; oss << sz_routine << ": Unable to open:" << "\"" << OUTPUT_FILENAME << "\".\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } } if (error_on) { - if (output_open(OUTPUT_ERROR, ERROR_FILENAME) != OK) + if (this->output_open(OUTPUT_ERROR, ERROR_FILENAME) != OK) { std::ostringstream oss; oss << sz_routine << ": Unable to open:" << "\"" << ERROR_FILENAME << "\".\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } } if (log_on) { - if (output_open(OUTPUT_LOG, LOG_FILENAME) != OK) + if (this->output_open(OUTPUT_LOG, LOG_FILENAME) != OK) { std::ostringstream oss; oss << sz_routine << ": Unable to open:" << "\"" << LOG_FILENAME << "\".\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } } - s_IPhreeqc.m_bSelectedOutputOn = (selected_output_on != 0); + this->SelectedOutputOn = (selected_output_on != 0); /* * call pre-run callback @@ -713,63 +361,63 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e { if (fp) { - set_read_callback(getc_callback, fp, FALSE); + this->set_read_callback(getc_callback, fp, FALSE); } else { - std::auto_ptr a_iss(new std::istringstream(GetAccumulatedLines())); + std::auto_ptr a_iss(new std::istringstream(this->GetAccumulatedLines())); auto_iss = a_iss; - set_read_callback(istream_getc, auto_iss.get(), FALSE); + this->set_read_callback(istream_getc, auto_iss.get(), FALSE); } } else { - set_read_callback(istream_getc, pis, FALSE); + this->set_read_callback(istream_getc, pis, FALSE); } /* * Read input data for simulation */ - for (simulation = 1; ; simulation++) { + for (this->simulation = 1; ; this->simulation++) { #ifdef PHREEQ98 AddSeries = !connect_simulations; #endif - sprintf(token, "Reading input data for simulation %d.", simulation); + ::sprintf(token, "Reading input data for simulation %d.", simulation); - output_msg(OUTPUT_GUI_ERROR, "\nSimulation %d\n", simulation); + this->output_msg(OUTPUT_GUI_ERROR, "\nSimulation %d\n", simulation); #ifdef SWIG_SHARED_OBJ - int save_punch_in = punch.in; + int save_punch_in = this->punch.in; #endif // SWIG_SHARED_OBJ - dup_print(token, TRUE); - if (read_input() == EOF) break; +// COMMENT: {3/3/2010 10:46:12 PM} dup_print(token, TRUE); + if (this->read_input() == EOF) break; #ifdef SWIG_SHARED_OBJ - if (simulation > 1 && save_punch_in == TRUE && punch.new_def == TRUE) + if (this->simulation > 1 && save_punch_in == TRUE && this->punch.new_def == TRUE) { std::ostringstream oss; oss << sz_routine << ": Warning SELECTED_OUTPUT has been redefined.\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } - if (simulation > 1 && keyword[39].keycount > 0) + if (this->simulation > 1 && this->keyword[39].keycount > 0) { std::ostringstream oss; oss << sz_routine << ": Warning USER_PUNCH has been redefined.\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } #endif // SWIG_SHARED_OBJ - if (title_x != NULL) { - sprintf(token, "TITLE"); - dup_print(token, TRUE); - if (pr.headings == TRUE) output_msg(OUTPUT_MESSAGE,"%s\n\n", title_x); + if (this->title_x != NULL) { + ::sprintf(token, "TITLE"); + this->dup_print(token, TRUE); + if (this->pr.headings == TRUE) this->output_msg(OUTPUT_MESSAGE, "%s\n\n", this->title_x); } #ifdef SWIG_SHARED_OBJ - if (punch.in == TRUE) + if (this->punch.in == TRUE) { // // (punch.in == TRUE) when any "RUN" has contained @@ -787,9 +435,9 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e // TRUE ??? // // - if (!selected_output_on) ASSERT(!::output_isopen(OUTPUT_PUNCH)); + if (!selected_output_on) ASSERT(!this->output_isopen(OUTPUT_PUNCH)); - if (pr.punch == FALSE) + if (this->pr.punch == FALSE) { // No selected_output for this simulation // this happens when @@ -799,34 +447,34 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e } else { - if (punch.new_def == FALSE) + if (this->punch.new_def == FALSE) { - if (selected_output_on && !::output_isopen(OUTPUT_PUNCH)) + if (selected_output_on && !this->output_isopen(OUTPUT_PUNCH)) { // // LoadDatabase // do_run -- containing SELECTED_OUTPUT ****TODO**** check -file option // another do_run without SELECTED_OUTPUT // - std::string filename = s_IPhreeqc.m_sPunchFileName; - output_open(OUTPUT_PUNCH, filename.c_str()); - if (!::output_isopen(OUTPUT_PUNCH)) + std::string filename = this->PunchFileName; + this->output_open(OUTPUT_PUNCH, filename.c_str()); + if (!this->output_isopen(OUTPUT_PUNCH)) { std::ostringstream oss; oss << sz_routine << ": Unable to open:" << "\"" << filename << "\".\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } else { // output selected_output headings - punch.new_def = TRUE; - tidy_punch(); + this->punch.new_def = TRUE; + this->tidy_punch(); } } } else { - if (selected_output_on && !::output_isopen(OUTPUT_PUNCH)) + if (selected_output_on && !this->output_isopen(OUTPUT_PUNCH)) { // This is a special case which could not occur in // phreeqc @@ -836,34 +484,34 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e // another do_run with SELECTED_OUTPUT // std::string filename = PUNCH_FILENAME; - if (s_IPhreeqc.m_sPunchFileName && ::strlen(s_IPhreeqc.m_sPunchFileName)) + if (this->PunchFileName.size()) { - filename = s_IPhreeqc.m_sPunchFileName; + filename = this->PunchFileName; } - output_open(OUTPUT_PUNCH, filename.c_str()); - if (!::output_isopen(OUTPUT_PUNCH)) + this->output_open(OUTPUT_PUNCH, filename.c_str()); + if (!this->output_isopen(OUTPUT_PUNCH)) { std::ostringstream oss; oss << sz_routine << ": Unable to open:" << "\"" << filename << "\".\n"; - warning_msg(oss.str().c_str()); + this->warning_msg(oss.str().c_str()); } else { // output selected_output headings ASSERT(punch.new_def == TRUE); - tidy_punch(); + this->tidy_punch(); } } } } } - if (!selected_output_on) ASSERT(!::output_isopen(OUTPUT_PUNCH)); + if (!selected_output_on) ASSERT(!this->output_isopen(OUTPUT_PUNCH)); /* the converse is not necessarily true */ - n_user_punch_index = -1; + this->n_user_punch_index = -1; #endif // SWIG_SHARED_OBJ - tidy_model(); + this->tidy_model(); #ifdef PHREEQC_CPP //test_classes(); #endif @@ -875,69 +523,69 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e /* * Calculate distribution of species for initial solutions */ - if (new_solution) initial_solutions(TRUE); + if (this->new_solution) this->initial_solutions(TRUE); /* * Calculate distribution for exchangers */ - if (new_exchange) initial_exchangers(TRUE); + if (this->new_exchange) this->initial_exchangers(TRUE); /* * Calculate distribution for surfaces */ - if (new_surface) initial_surfaces(TRUE); + if (this->new_surface) this->initial_surfaces(TRUE); /* * Calculate initial gas composition */ - if (new_gas_phase) initial_gas_phases(TRUE); + if (this->new_gas_phase) this->initial_gas_phases(TRUE); /* * Calculate reactions */ - reactions(); + this->reactions(); /* * Calculate inverse models */ - inverse_models(); + this->inverse_models(); /* * Calculate advection */ - if (use.advect_in == TRUE) { - dup_print ("Beginning of advection calculations.", TRUE); - advection(); + if (this->use.advect_in == TRUE) { + this->dup_print ("Beginning of advection calculations.", TRUE); + this->advection(); } /* * Calculate transport */ - if (use.trans_in == TRUE) { - dup_print ("Beginning of transport calculations.", TRUE); - transport(); + if (this->use.trans_in == TRUE) { + this->dup_print ("Beginning of transport calculations.", TRUE); + this->transport(); } #ifdef PHREEQC_CPP /* * run */ - run_as_cells(); + this->run_as_cells(); #endif /* * Copy */ - if (new_copy) copy_entities(); + if (this->new_copy) this->copy_entities(); #ifdef PHREEQC_CPP /* * dump */ - dump_entities(); + this->dump_entities(); /* * delete */ - delete_entities(); + this->delete_entities(); #endif /* * End of simulation */ - dup_print( "End of simulation.", TRUE); + this->dup_print( "End of simulation.", TRUE); #ifdef PHREEQ98 } /* if (!phreeq98_debug) */ #endif @@ -946,7 +594,7 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e /* * Display successful status */ - do_status(); + this->do_status(); /* * call post-run callback @@ -956,12 +604,951 @@ do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int e pfn_post(cookie); } - if (input_error > 0) + if (this->input_error > 0) { std::ostringstream oss; oss << "\n"; - oss << s_string_input.c_str(); + oss << this->StringInput.c_str(); oss << "\n"; - error_msg(oss.str().c_str(), CONTINUE); + this->error_msg(oss.str().c_str(), CONTINUE); } } + + + +int istream_getc(void *cookie) +{ + if (cookie) + { + std::istream* is = (std::istream*)cookie; + return is->get(); + } + return EOF; +} + +int IPhreeqc::handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args) +{ + int n = OK; + IPhreeqc *pThis = (IPhreeqc*)cookie; + switch (action) + { + case ACTION_OPEN: + n = pThis->open_handler(type, err_str); + break; + + case ACTION_OUTPUT: + n = pThis->output_handler(type, err_str, stop, cookie, format, args); + break; + + default: + n = pThis->module_handler(action, type, err_str, stop, cookie, format, args); + break; + } + + if (stop == STOP) + { + throw PhreeqcStop(); + } + return n; +} + +int IPhreeqc::output_handler(const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args) +{ + IPhreeqc* pIPhreeqc = (IPhreeqc*) cookie; + + switch (type) + { + case OUTPUT_ERROR: + if (pIPhreeqc && pIPhreeqc->ErrorReporter) + { + std::ostringstream oss; + oss << "ERROR: " << err_str << "\n"; + if (stop == STOP) + { + oss << "Stopping.\n"; + } + pIPhreeqc->AddError(oss.str().c_str()); + } + break; + + case OUTPUT_PUNCH: + this->AddSelectedOutput(err_str, format, args); + break; + + } + return module_handler(ACTION_OUTPUT, type, err_str, stop, cookie, format, args); +} + +int IPhreeqc::open_handler(const int type, const char *file_name) +{ + int n = OK; + switch (type) + { + case OUTPUT_PUNCH: + if (file_name) + { + if (this->PunchFileName.compare(file_name) != 0) + { + this->PunchFileName = file_name; + } + } + if (this->SelectedOutputOn) + { + n = module_handler(ACTION_OPEN, type, file_name, CONTINUE, this, NULL, NULL); + } + break; + default: + n = module_handler(ACTION_OPEN, type, file_name, CONTINUE, this, NULL, NULL); + break; + } + return n; +} + +void IPhreeqc::Init(void) +{ + int i; + + moles_per_kilogram_string = 0; + pe_string = 0; + + debug_model = FALSE; + debug_prep = FALSE; + debug_set = FALSE; + debug_diffuse_layer = FALSE; + debug_inverse = FALSE; + itmax = 100; +#ifdef USE_LONG_DOUBLE + /* from float.h, sets tolerance for cl1 routine */ + ineq_tol = pow((long double) 10, (long double) -LDBL_DIG); +#else + ineq_tol = pow((double) 10, (double) -DBL_DIG); +#endif + convergence_tolerance = 1e-8; +#ifdef USE_LONG_DOUBLE + /* from float.h, sets tolerance for cl1 routine */ + inv_tol_default = pow((long double) 10, (long double) -LDBL_DIG + 5); +#else + inv_tol_default = pow((double) 10, (double) -DBL_DIG + 5); +#endif + step_size = 100.; + pe_step_size = 10.; + pp_scale = 1.0; + pp_column_scale = 1.0; + diagonal_scale = FALSE; + censor = 0.0; + mass_water_switch = FALSE; + delay_mass_water = FALSE; + incremental_reactions = FALSE; + aqueous_only = 0; + negative_concentrations = FALSE; + + LOG_10 = log(10.0); + + max_solution = MAX_SOLUTION; + max_pp_assemblage = MAX_PP_ASSEMBLAGE; + max_exchange = MAX_PP_ASSEMBLAGE; + max_surface = MAX_PP_ASSEMBLAGE; + max_gas_phase = MAX_PP_ASSEMBLAGE; + max_kinetics = MAX_PP_ASSEMBLAGE; + max_s_s_assemblage = MAX_PP_ASSEMBLAGE; + + max_elements = MAX_ELEMENTS; + max_elts = MAX_ELTS; + max_line = MAX_LINE; + max_master = MAX_MASTER; + max_mb_unknowns = MAX_TRXN; + max_phases = MAX_PHASES; + max_s = MAX_S; + max_strings = MAX_STRINGS; + max_trxn = MAX_TRXN; + max_logk = MAX_S; + max_master_isotope = MAX_ELTS; + + count_solution = 0; + count_pp_assemblage = 0; + count_exchange = 0; + count_surface = 0; + count_gas_phase = 0; + count_kinetics = 0; + count_s_s_assemblage = 0; + + count_elements = 0; + count_irrev = 0; + count_master = 0; + count_mix = 0; + count_phases = 0; + count_s = 0; + count_temperature = 0; + count_logk = 0; + count_master_isotope = 0; +/* + * Initialize advection + */ + count_ad_cells = 1; + count_ad_shifts = 1; + print_ad_modulus = 1; + punch_ad_modulus = 1; + + advection_punch = 0; + advection_kin_time = 0.0; + advection_kin_time_defined = FALSE; + advection_print = 0; + advection_warnings = TRUE; +/* + * Initialize transport + */ + count_cells = 1; + count_shifts = 1; + ishift = 1; + bcon_first = bcon_last = 3; + diffc = 0.3e-9; + simul_tr = 0; + tempr = 2.0; + heat_diffc = -0.1; + timest = 0.0; + multi_Dflag = FALSE; + interlayer_Dflag = FALSE; + interlayer_tortf = 100.0; + interlayer_Dpor = 0.1; +/* !!!! count_stag = 0; */ + mcd_substeps = 1.0; + print_modulus = 1; + punch_modulus = 1; + dump_modulus = 0; + dump_in = FALSE; + transport_warnings = TRUE; + + pp_assemblage = 0; + exchange = 0; + surface = 0; + gas_phase = 0; + kinetics = 0; + s_s_assemblage = 0; + cell_data = 0; + elements = 0; + elt_list = 0; + + + inverse = 0; + count_inverse = 0; + + irrev = 0; + + line = 0; + line_save = 0; + + master = 0; + + mb_unknowns = 0; + + mix = 0; + count_mix = 0; +/* !!!! */ + stag_data = 0; + + phases = 0; + + trxn.token = 0; + + s = 0; + + logk = 0; + + master_isotope = 0; + + solution = 0; + + temperature = 0; + + title_x = NULL; + pe_x = NULL; + description_x = NULL; + units_x = NULL; + s_x = NULL; + + sum_mb1 = NULL; + sum_mb2 = NULL; + sum_jacob0 = NULL; + sum_jacob1 = NULL; + sum_jacob2 = NULL; + sum_delta = NULL; + + isotopes_x = 0; + + x = NULL; + max_unknowns = 0; + + array = NULL; + delta = NULL; + residual = NULL; + s_h2o = NULL; + s_hplus = NULL; + s_h3oplus = NULL; + s_eminus = NULL; + s_co3 = NULL; + s_h2 = NULL; + s_o2 = NULL; + + logk_hash_table = 0; + master_isotope_hash_table = 0; + strings_hash_table = 0; + elements_hash_table = 0; + species_hash_table = 0; + phases_hash_table = 0; + keyword_hash_table = 0; +/* + * Initialize use pointers + */ + use.solution_in = FALSE; + use.pp_assemblage_in = FALSE; + use.mix_in = FALSE; + use.irrev_in = FALSE; +/* + * Initialize punch + */ + punch.in = FALSE; + punch.count_totals = 0; + punch.totals = 0; + punch.count_molalities = 0; + + punch.molalities = 0; + punch.count_activities = 0; + + punch.activities = 0; + punch.count_pure_phases = 0; + + punch.pure_phases = 0; + punch.count_si = 0; + + punch.si = 0; + punch.count_gases = 0; + + punch.gases = 0; + punch.count_s_s = 0; + punch.s_s = 0; + + punch.count_kinetics = 0; + punch.kinetics = 0; + + punch.count_isotopes = 0; + punch.isotopes = 0; + + punch.count_calculate_values = 0; + punch.calculate_values = 0; + + count_save_values = 0; + save_values = 0; + + + punch.inverse = TRUE; + + punch.sim = TRUE; + punch.state = TRUE; + punch.soln = TRUE; + punch.dist = TRUE; + punch.time = TRUE; + punch.step = TRUE; + punch.rxn = FALSE; + punch.temp = FALSE; + punch.ph = TRUE; + punch.pe = TRUE; + punch.alk = FALSE; + punch.mu = FALSE; + punch.water = FALSE; + punch.high_precision = FALSE; + punch.user_punch = TRUE; + punch.charge_balance = FALSE; + punch.percent_error = FALSE; +/* + * last model + */ + last_model.exchange = NULL; + last_model.gas_phase = NULL; + last_model.s_s_assemblage = NULL; + last_model.kinetics = NULL; + last_model.pp_assemblage = NULL; + last_model.add_formula = NULL; + last_model.si = NULL; + last_model.surface_comp = NULL; + last_model.surface_charge = NULL; +/* + * Update hash table + */ + keyword_hash = 0; +/* + * rates + */ + rates = 0; + count_rates = 0; + initial_total_time = 0; + rate_m = 0; + rate_m0 = 0; + rate_p = NULL; + rate_time = 0; + rate_sim_time_start = 0; + rate_sim_time_end = 0; + rate_sim_time = 0; + rate_moles = 0; + initial_total_time = 0; + +/* + * user_print, user_punch + */ + user_print = 0; + user_punch = 0; + user_punch_headings = 0; + user_punch_count_headings = 0; +#ifdef PHREEQ98 +/* + * user_graph + */ + user_graph = 0; + user_graph_headings = 0 + user_graph_count_headings = 0; +#endif + /* + Initialize llnl aqueous model parameters + */ + llnl_temp = 0; + llnl_count_temp = 0; + + llnl_adh = 0; + llnl_count_adh = 0; + + llnl_bdh = 0; + llnl_count_bdh = 0; + + llnl_bdot = 0; + llnl_count_bdot = 0; + + llnl_co2_coefs = 0; + llnl_count_co2_coefs = 0; +/* + * + */ + command_hash_table = 0; + + change_surf = 0; + change_surf_count = 0; + + +#if defined(WINDOWS) || defined(_WINDOWS) + /* SRC pr.status = FALSE; */ +#endif + /* Initialize print here, not in global.h */ + pr.all = TRUE; + pr.initial_solutions = TRUE; + pr.initial_exchangers = TRUE; + pr.reactions = TRUE; + pr.gas_phase = TRUE; + pr.s_s_assemblage = TRUE; + pr.pp_assemblage = TRUE; + pr.surface = TRUE; + pr.exchange = TRUE; + pr.kinetics = TRUE; + pr.totals = TRUE; + pr.eh = TRUE; + pr.species = TRUE; + pr.saturation_indices = TRUE; + pr.irrev = TRUE; + pr.mix = TRUE; + pr.reaction = TRUE; + pr.use = TRUE; + pr.logfile = FALSE; + pr.punch = TRUE; + if (phast == TRUE) + { + pr.status = FALSE; + } + else + { + pr.status = TRUE; + } + pr.inverse = TRUE; + pr.dump = TRUE; + pr.user_print = TRUE; + pr.headings = TRUE; + pr.user_graph = TRUE; + pr.echo_input = TRUE; + count_warnings = 0; + pr.warnings = 100; + pr.initial_isotopes = TRUE; + pr.isotope_ratios = TRUE; + pr.isotope_alphas = TRUE; + pr.hdf = FALSE; + pr.alkalinity = FALSE; + + species_list = NULL; + + user_database = NULL; + first_read_input = TRUE; + have_punch_name = FALSE; + selected_output_file_name = NULL; + dump_file_name = NULL; + + /* calculate_value */ + max_calculate_value = MAX_ELTS; + count_calculate_value = 0; + + calculate_value = 0; + calculate_value_hash_table = 0; + + /* isotope_ratio */ + max_isotope_ratio = MAX_ELTS; + count_isotope_ratio = 0; + isotope_ratio = 0; + isotope_ratio_hash_table = 0; + + /* isotope_value */ + max_isotope_alpha = MAX_ELTS; + count_isotope_alpha = 0; + isotope_alpha = 0; + isotope_alpha_hash_table = 0; + + phreeqc_mpi_myself = 0; + + copy_solution.n_user = copy_solution.start = copy_solution.end = 0; + copy_pp_assemblage.n_user = copy_pp_assemblage.start = copy_pp_assemblage.end = 0; + copy_exchange.n_user = copy_exchange.start = copy_exchange.end = 0; + copy_surface.n_user = copy_surface.start = copy_surface.end = 0; + copy_s_s_assemblage.n_user = copy_s_s_assemblage.start = copy_s_s_assemblage.end = 0; + copy_gas_phase.n_user = copy_gas_phase.start = copy_gas_phase.end = 0; + copy_kinetics.n_user = copy_kinetics.start = copy_kinetics.end = 0; + copy_mix.n_user = copy_mix.start = copy_mix.end = 0; + copy_irrev.n_user = copy_irrev.start = copy_irrev.end = 0; + copy_temperature.n_user = copy_temperature.start = copy_temperature.end = 0; + + set_forward_output_to_log(FALSE); + simulation = 0; + /* + * cvode + */ + + cvode_init(); + /* + * Pitzer + */ + pitzer_model = FALSE; + max_pitz_param = 100; + count_pitz_param = 0; + use_etheta = TRUE; + pitz_params = 0; + + max_theta_param = 100; + count_theta_param = 0; + theta_params = 0; + + ICON = TRUE; + OTEMP = 0.0; + for (i = 0; i < 23; i++) + { + BK[i] = 0.0; + DK[i] = 0.0; + } + pitzer_pe = FALSE; + + + /* + * SIT + */ + sit_model = FALSE; + max_sit_param = 100; + count_sit_param = 0; + sit_params = 0; + + /* + * to facilitate debuging + */ + dbg_use = &use; + dbg_solution = solution; + dbg_exchange = exchange; + dbg_surface = surface; + dbg_pp_assemblage = pp_assemblage; + dbg_kinetics = kinetics; + dbg_irrev = irrev; + dbg_mix = mix; + dbg_master = master; + calculating_deriv = FALSE; + numerical_deriv = FALSE; + + zeros = 0; + zeros_max = 1; + + cell_pore_volume = 0; + cell_volume = 0; + cell_porosity = 0; + cell_saturation = 0; + + charge_group = NULL; + print_density = 0; + + return; +} + +void IPhreeqc::AddSelectedOutput(const char* name, const char* format, va_list argptr) +{ + int bInt; + int bDouble; + int bString; + + int state; + int bLongDouble; + char ch; + + + /* state values + 0 Haven't found start(%) + 1 Just read start(%) + 2 Just read Flags(-0+ #) (zero or more) + 3 Just read Width + 4 Just read Precision start (.) + 5 Just read Size modifier + 6 Just read Type + */ + + if (name == NULL) { + return; + } + + bDouble = 0; + bInt = 0; + bString = 0; + + bLongDouble = 0; + + state = 0; + ch = *format++; + while (ch != '\0') + { + switch (state) + { + case 0: /* looking for Start specification (%) */ + switch (ch) + { + case '%': + state = 1; + break; + default: + break; + } + ch = *format++; + break; + case 1: /* reading Flags (zero or more(-,+,0,# or space)) */ + switch (ch) + { + case '-': case '0': case '+': case ' ': case '#': + ch = *format++; + break; + default: + state = 2; + break; + } + break; + case 2: /* reading Minimum field width (decimal integer constant) */ + switch (ch) + { + case '.': + state = 3; + ch = *format++; + break; + case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + ch = *format++; + break; + default: + state = 4; + break; + } + break; + case 3: /* reading Precision specification (period already read) */ + switch (ch) + { + case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + ch = *format++; + break; + default: + state = 4; + break; + } + break; + case 4: /* reading Size modifier */ + switch (ch) + { + case 'l': + ch = *format++; + break; + case 'L': + bLongDouble = 1; + ch = *format++; + break; + case 'h': + ch = *format++; + break; + } + state = 5; + break; + case 5: /* reading Conversion letter */ + switch (ch) + { + case 'c': + break; + case 'd': + case 'i': + bInt = 1; + break; + case 'n': + case 'o': + case 'p': + break; + case 's': + bString = 1; + break; + case 'u': + case 'x': + case 'X': + case '%': + break; + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + bDouble = 1; + break; + default: + ASSERT(false); + break; + } + ch = '\0'; /* done */ + break; + } + } + + if (bDouble) + { + double valDouble; + + if (bLongDouble) + { + valDouble = (double)va_arg(argptr, long double); + } + else + { + valDouble = va_arg(argptr, double); + } + + this->SelectedOutput->PushBackDouble(name, valDouble); + } + else if (bInt) + { + int valInt; + valInt = va_arg(argptr, int); + + this->SelectedOutput->PushBackLong(name, (long)valInt); + } + else if (bString) + { + char* valString; + valString = (char *)va_arg(argptr, char *); + + this->SelectedOutput->PushBackString(name, valString); + } + else + { + ASSERT(false); + this->SelectedOutput->PushBackEmpty(name); + } +} + +VRESULT IPhreeqc::AccumulateLine(const char *line) +{ + try + { + this->ErrorReporter->Clear(); + this->StringInput.append(line); + this->StringInput.append("\n"); + return VR_OK; + } + catch (...) + { + this->AddError("AccumulateLine: An unhandled exception occured.\n"); + } + return VR_OUTOFMEMORY; +} + +int IPhreeqc::Run(int output_on, int error_on, int log_on, int selected_output_on) +{ + static const char *sz_routine = "Run"; + try + { + // this may throw + this->check_database(sz_routine); + + this->input_error = 0; + + // create input stream + std::istringstream iss(this->GetAccumulatedLines()); + + // this may throw + this->do_run(sz_routine, &iss, NULL, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); + } + catch (PhreeqcStop) + { + // do nothing + } + catch(...) + { + const char *errmsg = "Run: An unhandled exception occured.\n"; + try + { + this->error_msg(errmsg, STOP); // throws PhreeqcStop + } + catch (PhreeqcStop) + { + // do nothing + } + } + + this->ClearAccumulatedLines(); + this->close_output_files(); + return this->input_error; +} + +int IPhreeqc::RunFile(const char* filename, int output_on, int error_on, int log_on, int selected_output_on) +{ + static const char *sz_routine = "RunFile"; + try + { + // this may throw + this->check_database(sz_routine); + + this->input_error = 0; + +#if 0 + // create input stream + std::ifstream ifs; + ifs.open(filename); + if (!ifs.is_open()) + { + std::ostringstream oss; + oss << "RunFile: Unable to open:" << "\"" << filename << "\"."; + this->error_msg(oss.str().c_str(), STOP); // throws + } + + // this may throw + this->do_run(sz_routine, &ifs, NULL, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); +#else + // open file + // + FILE* f = ::fopen(filename, "r"); + if (!f) + { + std::ostringstream oss; + oss << "RunFile: Unable to open:" << "\"" << filename << "\"."; + this->error_msg(oss.str().c_str(), STOP); // throws PhreeqcStop + } + + // this may throw + this->do_run(sz_routine, NULL, f, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); +#endif + } + catch (PhreeqcStop) + { + // do nothing + } + catch(...) + { + const char *errmsg = "RunFile: An unhandled exception occured.\n"; + try + { + this->error_msg(errmsg, STOP); // throws PhreeqcStop + } + catch (PhreeqcStop) + { + // do nothing + } + } + + this->close_output_files(); + return this->input_error; +} + +int IPhreeqc::RunString(const char* input, int output_on, int error_on, int log_on, int selected_output_on) +{ + static const char *sz_routine = "RunString"; + try + { + // this may throw + this->check_database(sz_routine); + + this->input_error = 0; + + // create input stream + std::string s(input); + std::istringstream iss(s); + + // this may throw + this->do_run(sz_routine, &iss, NULL, output_on, error_on, log_on, selected_output_on, NULL, NULL, NULL); + } + catch (PhreeqcStop) + { + // do nothing + } + catch(...) + { + const char *errmsg = "RunString: An unhandled exception occured.\n"; + try + { + this->error_msg(errmsg, STOP); // throws PhreeqcStop + } + catch (PhreeqcStop) + { + // do nothing + } + } + + this->close_output_files(); + return this->input_error; +} + +int IPhreeqc::GetSelectedOutputRowCount(void)const +{ + return (int)this->SelectedOutput->GetRowCount(); +} + +int IPhreeqc::GetSelectedOutputColumnCount(void)const +{ + return (int)this->SelectedOutput->GetColCount(); +} + +VRESULT IPhreeqc::GetSelectedOutputValue(int row, int col, VAR* pVAR) +{ + this->ErrorReporter->Clear(); + if (!pVAR) + { + this->AddError("GetSelectedOutputValue: VR_INVALIDARG pVar is NULL.\n"); + return VR_INVALIDARG; + } + + VRESULT v = this->SelectedOutput->Get(row, col, pVAR); + switch (v) + { + case VR_OK: + break; + case VR_OUTOFMEMORY: + this->AddError("GetSelectedOutputValue: VR_OUTOFMEMORY Out of memory.\n"); + break; + case VR_BADVARTYPE: + this->AddError("GetSelectedOutputValue: VR_BADVARTYPE pVar must be initialized(VarInit) and/or cleared(VarClear).\n"); + break; + case VR_INVALIDARG: + // not possible + break; + case VR_INVALIDROW: + this->AddError("GetSelectedOutputValue: VR_INVALIDROW Row index out of range.\n"); + break; + case VR_INVALIDCOL: + this->AddError("GetSelectedOutputValue: VR_INVALIDCOL Column index out of range.\n"); + break; + } + return v; +} diff --git a/src/IPhreeqc.hpp b/src/IPhreeqc.hpp new file mode 100644 index 00000000..cda13c11 --- /dev/null +++ b/src/IPhreeqc.hpp @@ -0,0 +1,87 @@ +#ifndef _INC_IPHREEQC_HPP +#define _INC_IPHREEQC_HPP + +#include "Phreeqc.h" /* Phreeqc */ +#include "IPhreeqcCallbacks.h" /* PFN_PRERUN_CALLBACK, PFN_POSTRUN_CALLBACK, PFN_CATCH_CALLBACK */ +#include "Var.h" /* VRESULT */ +#include "SelectedOutput.hxx" + + +class IErrorReporter; + +struct PhreeqcStop{}; + +class IPhreeqc : public Phreeqc +{ +public: + IPhreeqc(void); + ~IPhreeqc(void); + +public: + int LoadDatabase(const char* filename); + int LoadDatabaseString(const char* input); + + void UnLoadDatabase(void); + + void OutputLastError(void); + const char* GetLastErrorString(void); + + VRESULT AccumulateLine(const char *line); + + int Run(int output_on, int error_on, int log_on, int selected_output_on); + int RunFile(const char* filename, int output_on, int error_on, int log_on, int selected_output_on); + int RunString(const char* input, int output_on, int error_on, int log_on, int selected_output_on); + + int GetSelectedOutputRowCount(void)const; + int GetSelectedOutputColumnCount(void)const; + VRESULT GetSelectedOutputValue(int row, int col, VAR* pVAR); + + void OutputLines(void); + + size_t AddError(const char* error_msg); + + const std::string& GetAccumulatedLines(void); + void ClearAccumulatedLines(void); + + // Singleton for library + static IPhreeqc* LibraryInstance(); + + // Callbacks + // + + // IPhreeqc.cpp + static int handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); + int output_handler(const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); + int open_handler(const int type, const char *file_name/*, void *cookie*/); + + // module_files.c + static int module_handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); + int module_isopen_handler(const int type); + int module_open_handler(const int type, const char *file_name); + + // module_output.c + int output_isopen(const int type); + + virtual int EndRow(void); + void AddSelectedOutput(const char* name, const char* format, va_list argptr); + + void check_database(const char* sz_routine); + void do_run(const char* sz_routine, std::istream* pis, FILE* fp, int output_on, int error_on, int log_on, int selected_output_on, PFN_PRERUN_CALLBACK pfn_pre, PFN_POSTRUN_CALLBACK pfn_post, void *cookie); + +protected: + void Init(void); + +protected: + // Data + IErrorReporter *ErrorReporter; + CSelectedOutput *SelectedOutput; + std::string PunchFileName; + bool DatabaseLoaded; + bool SelectedOutputOn; + std::string StringInput; + +private: + static IPhreeqc* Instance; +}; + +#endif /* _INC_IPHREEQC_HPP */ diff --git a/src/PhreeqcParser.hxx b/src/PhreeqcParser.hxx deleted file mode 100644 index 6984be5c..00000000 --- a/src/PhreeqcParser.hxx +++ /dev/null @@ -1,35 +0,0 @@ -#if !defined(__PHREEQC_PARSER_HXX_INC) -#define __PHREEQC_PARSER_HXX_INC - - -// COMMENT: {11/10/2004 10:35:56 PM}#include -// COMMENT: {11/10/2004 10:35:56 PM}//#include -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM}struct PhreeqcStop{}; -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM}class CPhreeqcParser -// COMMENT: {11/10/2004 10:35:56 PM}{ -// COMMENT: {11/10/2004 10:35:56 PM}public: -// COMMENT: {11/10/2004 10:35:56 PM} CPhreeqcParser(std::istream& input); -// COMMENT: {11/10/2004 10:35:56 PM} virtual ~CPhreeqcParser(void); -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM} // const char* GetErrorMsg(void); -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM} // overrides -// COMMENT: {11/10/2004 10:35:56 PM} int get_logical_line(int *l); -// COMMENT: {11/10/2004 10:35:56 PM} int get_line(void); -// COMMENT: {11/10/2004 10:35:56 PM} // int error_msg (const char *err_str, const int stop); -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM}protected: -// COMMENT: {11/10/2004 10:35:56 PM} std::istream& m_input_stream; -// COMMENT: {11/10/2004 10:35:56 PM} //std::ostream& m_output_stream; -// COMMENT: {11/10/2004 10:35:56 PM} //std::ostream& m_error_stream; -// COMMENT: {11/10/2004 10:35:56 PM} -// COMMENT: {11/10/2004 10:35:56 PM} //std::string m_errors; -// COMMENT: {11/10/2004 10:35:56 PM}}; - - -#endif // __PHREEQC_PARSER_HXX_INC diff --git a/src/SelectedOutput.cpp b/src/SelectedOutput.cpp index 966488f8..f4843588 100644 --- a/src/SelectedOutput.cpp +++ b/src/SelectedOutput.cpp @@ -5,236 +5,253 @@ #pragma warning(disable : 4786) // disable truncation warning #include // std::ostringstream #include // ::OutputDebugString +#else +#if defined(PHREEQC_CLASS) +#include // ::OutputDebugString +#endif #endif #include #include +#if defined(PHREEQC_CLASS) +#include "phrqtype.h" +#include "p2c.h" +#include "global_structures.h" +#include "basic.h" +#include "Phreeqc.h" + +// COMMENT: {2/24/2010 6:01:56 PM}extern int user_punch_count_headings; +// COMMENT: {2/24/2010 6:01:56 PM}extern char **user_punch_headings; +#endif + #include "SelectedOutput.hxx" #include "phreeqcns.hxx" const size_t RESERVE_ROWS = 80; const size_t RESERVE_COLS = 80; - -int EndRow(void); +// COMMENT: {3/3/2010 5:31:34 PM}int EndRow(void); void AddSelectedOutput(const char* name, const char* format, va_list argptr); int warning_msg (const char *err_str); -int EndRow(void) -{ - if (CSelectedOutput::Instance()->GetRowCount() <= 1) { - // ensure all user_punch headings are included - for (int i = n_user_punch_index; i < user_punch_count_headings; ++i) { - CSelectedOutput::Instance()->PushBackEmpty(user_punch_headings[i]); - } - } - return CSelectedOutput::Instance()->EndRow(); -} +// COMMENT: {3/3/2010 8:55:29 PM}int Phreeqc::EndRow(void) +// COMMENT: {3/3/2010 8:55:29 PM}{ +// COMMENT: {3/3/2010 8:55:29 PM}// COMMENT: {3/3/2010 7:29:42 PM} if (CSelectedOutput::Instance()->GetRowCount() <= 1) +// COMMENT: {3/3/2010 8:55:29 PM} if (this->SelectedOutput.GetRowCount() <= 1) +// COMMENT: {3/3/2010 8:55:29 PM} { +// COMMENT: {3/3/2010 8:55:29 PM} // ensure all user_punch headings are included +// COMMENT: {3/3/2010 8:55:29 PM} for (int i = n_user_punch_index; i < user_punch_count_headings; ++i) +// COMMENT: {3/3/2010 8:55:29 PM} { +// COMMENT: {3/3/2010 8:55:29 PM} CSelectedOutput::Instance()->PushBackEmpty(user_punch_headings[i]); +// COMMENT: {3/3/2010 8:55:29 PM} } +// COMMENT: {3/3/2010 8:55:29 PM} } +// COMMENT: {3/3/2010 8:55:29 PM} return CSelectedOutput::Instance()->EndRow(); +// COMMENT: {3/3/2010 8:55:29 PM}} -int PushBackDouble(const char* key, double dVal) -{ - return CSelectedOutput::Instance()->PushBackDouble(key, dVal); -} - -int PushBackLong(const char* key, long lVal) -{ - return CSelectedOutput::Instance()->PushBackLong(key, lVal); -} - -int PushBackString(const char* key, const char* sVal) -{ - return CSelectedOutput::Instance()->PushBackString(key, sVal); -} - -int PushBackEmpty(const char* key) -{ - return CSelectedOutput::Instance()->PushBackEmpty(key); -} +// COMMENT: {3/3/2010 8:55:40 PM}int PushBackDouble(const char* key, double dVal) +// COMMENT: {3/3/2010 8:55:40 PM}{ +// COMMENT: {3/3/2010 8:55:40 PM} return CSelectedOutput::Instance()->PushBackDouble(key, dVal); +// COMMENT: {3/3/2010 8:55:40 PM}} +// COMMENT: {3/3/2010 8:55:40 PM} +// COMMENT: {3/3/2010 8:55:40 PM}int PushBackLong(const char* key, long lVal) +// COMMENT: {3/3/2010 8:55:40 PM}{ +// COMMENT: {3/3/2010 8:55:40 PM} return CSelectedOutput::Instance()->PushBackLong(key, lVal); +// COMMENT: {3/3/2010 8:55:40 PM}} +// COMMENT: {3/3/2010 8:55:40 PM} +// COMMENT: {3/3/2010 8:55:40 PM}int PushBackString(const char* key, const char* sVal) +// COMMENT: {3/3/2010 8:55:40 PM}{ +// COMMENT: {3/3/2010 8:55:40 PM} return CSelectedOutput::Instance()->PushBackString(key, sVal); +// COMMENT: {3/3/2010 8:55:40 PM}} +// COMMENT: {3/3/2010 8:55:40 PM} +// COMMENT: {3/3/2010 8:55:40 PM}int PushBackEmpty(const char* key) +// COMMENT: {3/3/2010 8:55:40 PM}{ +// COMMENT: {3/3/2010 8:55:40 PM} return CSelectedOutput::Instance()->PushBackEmpty(key); +// COMMENT: {3/3/2010 8:55:40 PM}} -void AddSelectedOutput(const char* name, const char* format, va_list argptr) -{ - int bInt; - int bDouble; - int bString; +// COMMENT: {3/3/2010 8:58:25 PM}void AddSelectedOutput(const char* name, const char* format, va_list argptr) +// COMMENT: {3/3/2010 8:58:25 PM}{ +// COMMENT: {3/3/2010 8:58:25 PM} int bInt; +// COMMENT: {3/3/2010 8:58:25 PM} int bDouble; +// COMMENT: {3/3/2010 8:58:25 PM} int bString; +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} int state; +// COMMENT: {3/3/2010 8:58:25 PM} int bLongDouble; +// COMMENT: {3/3/2010 8:58:25 PM} char ch; +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} /* state values +// COMMENT: {3/3/2010 8:58:25 PM} 0 Haven't found start(%) +// COMMENT: {3/3/2010 8:58:25 PM} 1 Just read start(%) +// COMMENT: {3/3/2010 8:58:25 PM} 2 Just read Flags(-0+ #) (zero or more) +// COMMENT: {3/3/2010 8:58:25 PM} 3 Just read Width +// COMMENT: {3/3/2010 8:58:25 PM} 4 Just read Precision start (.) +// COMMENT: {3/3/2010 8:58:25 PM} 5 Just read Size modifier +// COMMENT: {3/3/2010 8:58:25 PM} 6 Just read Type +// COMMENT: {3/3/2010 8:58:25 PM} */ +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} if (name == NULL) { +// COMMENT: {3/3/2010 8:58:25 PM} return; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} bDouble = 0; +// COMMENT: {3/3/2010 8:58:25 PM} bInt = 0; +// COMMENT: {3/3/2010 8:58:25 PM} bString = 0; +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} bLongDouble = 0; +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} state = 0; +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} while (ch != '\0') { +// COMMENT: {3/3/2010 8:58:25 PM} switch (state) { +// COMMENT: {3/3/2010 8:58:25 PM} case 0: /* looking for Start specification (%) */ +// COMMENT: {3/3/2010 8:58:25 PM} switch (ch) { +// COMMENT: {3/3/2010 8:58:25 PM} case '%': +// COMMENT: {3/3/2010 8:58:25 PM} state = 1; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} default: +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 1: /* reading Flags (zero or more(-,+,0,# or space)) */ +// COMMENT: {3/3/2010 8:58:25 PM} switch (ch) { +// COMMENT: {3/3/2010 8:58:25 PM} case '-': case '0': case '+': case ' ': case '#': +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} default: +// COMMENT: {3/3/2010 8:58:25 PM} state = 2; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 2: /* reading Minimum field width (decimal integer constant) */ +// COMMENT: {3/3/2010 8:58:25 PM} switch (ch) { +// COMMENT: {3/3/2010 8:58:25 PM} case '.': +// COMMENT: {3/3/2010 8:58:25 PM} state = 3; +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} default: +// COMMENT: {3/3/2010 8:58:25 PM} state = 4; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 3: /* reading Precision specification (period already read) */ +// COMMENT: {3/3/2010 8:58:25 PM} switch (ch) +// COMMENT: {3/3/2010 8:58:25 PM} { +// COMMENT: {3/3/2010 8:58:25 PM} case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} default: +// COMMENT: {3/3/2010 8:58:25 PM} state = 4; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 4: /* reading Size modifier */ +// COMMENT: {3/3/2010 8:58:25 PM} switch (ch) +// COMMENT: {3/3/2010 8:58:25 PM} { +// COMMENT: {3/3/2010 8:58:25 PM} case 'l': +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 'L': +// COMMENT: {3/3/2010 8:58:25 PM} bLongDouble = 1; +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 'h': +// COMMENT: {3/3/2010 8:58:25 PM} ch = *format++; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} state = 5; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 5: /* reading Conversion letter */ +// COMMENT: {3/3/2010 8:58:25 PM} switch (ch) { +// COMMENT: {3/3/2010 8:58:25 PM} case 'c': +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 'd': +// COMMENT: {3/3/2010 8:58:25 PM} case 'i': +// COMMENT: {3/3/2010 8:58:25 PM} bInt = 1; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 'n': +// COMMENT: {3/3/2010 8:58:25 PM} case 'o': +// COMMENT: {3/3/2010 8:58:25 PM} case 'p': +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 's': +// COMMENT: {3/3/2010 8:58:25 PM} bString = 1; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 'u': +// COMMENT: {3/3/2010 8:58:25 PM} case 'x': +// COMMENT: {3/3/2010 8:58:25 PM} case 'X': +// COMMENT: {3/3/2010 8:58:25 PM} case '%': +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} case 'f': +// COMMENT: {3/3/2010 8:58:25 PM} case 'e': +// COMMENT: {3/3/2010 8:58:25 PM} case 'E': +// COMMENT: {3/3/2010 8:58:25 PM} case 'g': +// COMMENT: {3/3/2010 8:58:25 PM} case 'G': +// COMMENT: {3/3/2010 8:58:25 PM} bDouble = 1; +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} default: +// COMMENT: {3/3/2010 8:58:25 PM} ASSERT(false); +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} ch = '\0'; /* done */ +// COMMENT: {3/3/2010 8:58:25 PM} break; +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} if (bDouble) { +// COMMENT: {3/3/2010 8:58:25 PM} double valDouble; +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} if (bLongDouble) { +// COMMENT: {3/3/2010 8:58:25 PM} valDouble = (double)va_arg(argptr, long double); +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} else { +// COMMENT: {3/3/2010 8:58:25 PM} valDouble = va_arg(argptr, double); +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} CSelectedOutput::Instance()->PushBackDouble(name, valDouble); +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} else if (bInt) { +// COMMENT: {3/3/2010 8:58:25 PM} int valInt; +// COMMENT: {3/3/2010 8:58:25 PM} valInt = va_arg(argptr, int); +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} CSelectedOutput::Instance()->PushBackLong(name, (long)valInt); +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} else if (bString) { +// COMMENT: {3/3/2010 8:58:25 PM} char* valString; +// COMMENT: {3/3/2010 8:58:25 PM} valString = (char *)va_arg(argptr, char *); +// COMMENT: {3/3/2010 8:58:25 PM} +// COMMENT: {3/3/2010 8:58:25 PM} CSelectedOutput::Instance()->PushBackString(name, valString); +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM} else { +// COMMENT: {3/3/2010 8:58:25 PM} ASSERT(false); +// COMMENT: {3/3/2010 8:58:25 PM} CSelectedOutput::Instance()->PushBackEmpty(name); +// COMMENT: {3/3/2010 8:58:25 PM} } +// COMMENT: {3/3/2010 8:58:25 PM}} - int state; - int bLongDouble; - char ch; - - - /* state values - 0 Haven't found start(%) - 1 Just read start(%) - 2 Just read Flags(-0+ #) (zero or more) - 3 Just read Width - 4 Just read Precision start (.) - 5 Just read Size modifier - 6 Just read Type - */ - - if (name == NULL) { - return; - } - - bDouble = 0; - bInt = 0; - bString = 0; - - bLongDouble = 0; - - state = 0; - ch = *format++; - while (ch != '\0') { - switch (state) { - case 0: /* looking for Start specification (%) */ - switch (ch) { - case '%': - state = 1; - break; - default: - break; - } - ch = *format++; - break; - case 1: /* reading Flags (zero or more(-,+,0,# or space)) */ - switch (ch) { - case '-': case '0': case '+': case ' ': case '#': - ch = *format++; - break; - default: - state = 2; - break; - } - break; - case 2: /* reading Minimum field width (decimal integer constant) */ - switch (ch) { - case '.': - state = 3; - ch = *format++; - break; - case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - ch = *format++; - break; - default: - state = 4; - break; - } - break; - case 3: /* reading Precision specification (period already read) */ - switch (ch) - { - case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - ch = *format++; - break; - default: - state = 4; - break; - } - break; - case 4: /* reading Size modifier */ - switch (ch) - { - case 'l': - ch = *format++; - break; - case 'L': - bLongDouble = 1; - ch = *format++; - break; - case 'h': - ch = *format++; - break; - } - state = 5; - break; - case 5: /* reading Conversion letter */ - switch (ch) { - case 'c': - break; - case 'd': - case 'i': - bInt = 1; - break; - case 'n': - case 'o': - case 'p': - break; - case 's': - bString = 1; - break; - case 'u': - case 'x': - case 'X': - case '%': - break; - case 'f': - case 'e': - case 'E': - case 'g': - case 'G': - bDouble = 1; - break; - default: - ASSERT(false); - break; - } - ch = '\0'; /* done */ - break; - } - } - - if (bDouble) { - double valDouble; - - if (bLongDouble) { - valDouble = (double)va_arg(argptr, long double); - } - else { - valDouble = va_arg(argptr, double); - } - - CSelectedOutput::Instance()->PushBackDouble(name, valDouble); - } - else if (bInt) { - int valInt; - valInt = va_arg(argptr, int); - - CSelectedOutput::Instance()->PushBackLong(name, (long)valInt); - } - else if (bString) { - char* valString; - valString = (char *)va_arg(argptr, char *); - - CSelectedOutput::Instance()->PushBackString(name, valString); - } - else { - ASSERT(false); - CSelectedOutput::Instance()->PushBackEmpty(name); - } -} - -// COMMENT: {11/16/2004 10:18:22 PM}CSelectedOutput CSelectedOutput::singleton; -CSelectedOutput* CSelectedOutput::s_instance = 0; - -CSelectedOutput* CSelectedOutput::Instance() -{ - if (s_instance == 0) - { - s_instance = new CSelectedOutput; - } - return s_instance; -} - -void CSelectedOutput::Release() -{ - if (s_instance) - { - delete s_instance; - s_instance = 0; - } -} +// COMMENT: {3/3/2010 8:56:03 PM}// COMMENT: {11/16/2004 10:18:22 PM}CSelectedOutput CSelectedOutput::singleton; +// COMMENT: {3/3/2010 8:56:03 PM}CSelectedOutput* CSelectedOutput::s_instance = 0; +// COMMENT: {3/3/2010 8:56:03 PM} +// COMMENT: {3/3/2010 8:56:03 PM}CSelectedOutput* CSelectedOutput::Instance() +// COMMENT: {3/3/2010 8:56:03 PM}{ +// COMMENT: {3/3/2010 8:56:03 PM} if (s_instance == 0) +// COMMENT: {3/3/2010 8:56:03 PM} { +// COMMENT: {3/3/2010 8:56:03 PM} s_instance = new CSelectedOutput; +// COMMENT: {3/3/2010 8:56:03 PM} } +// COMMENT: {3/3/2010 8:56:03 PM} return s_instance; +// COMMENT: {3/3/2010 8:56:03 PM}} +// COMMENT: {3/3/2010 8:56:03 PM} +// COMMENT: {3/3/2010 8:56:03 PM}void CSelectedOutput::Release() +// COMMENT: {3/3/2010 8:56:03 PM}{ +// COMMENT: {3/3/2010 8:56:03 PM} if (s_instance) +// COMMENT: {3/3/2010 8:56:03 PM} { +// COMMENT: {3/3/2010 8:56:03 PM} delete s_instance; +// COMMENT: {3/3/2010 8:56:03 PM} s_instance = 0; +// COMMENT: {3/3/2010 8:56:03 PM} } +// COMMENT: {3/3/2010 8:56:03 PM}} CSelectedOutput::CSelectedOutput() : m_nRowCount(0) diff --git a/src/SelectedOutput.hxx b/src/SelectedOutput.hxx index accaf5e6..b5018f7f 100644 --- a/src/SelectedOutput.hxx +++ b/src/SelectedOutput.hxx @@ -18,15 +18,10 @@ // TODO: templatize class CSelectedOutput { -protected: - CSelectedOutput(void); public: - static CSelectedOutput* Instance(); - static void Release(); - + CSelectedOutput(void); virtual ~CSelectedOutput(void); - int EndRow(void); void Clear(void); diff --git a/src/Var.c b/src/Var.c index 1368ea7d..c3c0ba9f 100644 --- a/src/Var.c +++ b/src/Var.c @@ -8,7 +8,9 @@ // void VarInit(VAR* pvar) { - pvar->type = TT_EMPTY; + pvar->type = TT_EMPTY; + pvar->sVal = 0; + pvar->vresult = VR_OK; } VRESULT VarClear(VAR* pvar) diff --git a/src/fwrap.c b/src/fwrap.c index 7d152103..847e804b 100644 --- a/src/fwrap.c +++ b/src/fwrap.c @@ -4,9 +4,7 @@ #include /* assert */ #include /* printf */ -#define EXTERNAL extern -#include "phreeqcpp/phreeqc/global.h" -#undef EXTERNAL +#include "phrqtype.h" struct buffer { char *name; @@ -35,8 +33,7 @@ extern int store_tally_table(double *array, int row_dim, int col_dim); extern int warning_msg (const char *err_str); extern int zero_tally_table(void); - -#include "../include/IPhreeqc.h" +#include "IPhreeqc.h" /******************************* When using GNU gcc/g++/g77 diff --git a/src/global.c b/src/global.c deleted file mode 100644 index 62c87820..00000000 --- a/src/global.c +++ /dev/null @@ -1,5 +0,0 @@ -#define EXTERNAL -#define MAIN -// TEST RMWEBB WRITE ACCESS -#include "global.h" -#include "phqalloc.h" diff --git a/src/module_files.c b/src/module_files.c index f0d2c9f5..3c27973d 100644 --- a/src/module_files.c +++ b/src/module_files.c @@ -5,33 +5,35 @@ #include "phreeqcpp/phreeqc/phreeqc_files.c" #endif -static int module_isopen_handler(const int type); -static int module_open_handler(const int type, const char *file_name); +// COMMENT: {3/2/2010 4:06:35 PM}static int module_isopen_handler(const int type); +// COMMENT: {3/2/2010 4:06:35 PM}static int module_open_handler(const int type, const char *file_name); -int -module_handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args) +#include "IPhreeqc.hpp" + +int IPhreeqc::module_handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args) { + IPhreeqc* pThis = (IPhreeqc*) cookie; + switch (action) { case ACTION_OPEN: - return module_open_handler(type, err_str); + return pThis->module_open_handler(type, err_str); break; case ACTION_ISOPEN: - return module_isopen_handler(type); + return pThis->module_isopen_handler(type); break; default: - return phreeqc_handler(action, type, err_str, stop, cookie, format, args); + return pThis->phreeqc_handler(action, type, err_str, stop, cookie, format, args); break; } return ERROR; } -static int -module_isopen_handler(const int type) +int IPhreeqc::module_isopen_handler(const int type) { switch (type) { case OUTPUT_PUNCH: - if (punch_file) return 1; + if (this->punch_file) return 1; break; default: assert(0); @@ -39,51 +41,52 @@ module_isopen_handler(const int type) return 0; } -static int -module_open_handler(const int type, const char *file_name) +int IPhreeqc::module_open_handler(const int type, const char *file_name) { - assert(file_name && strlen(file_name)); + assert(file_name && ::strlen(file_name)); switch (type) { case OUTPUT_MESSAGE: - if (output != NULL) + if (this->output != NULL) { - fclose(output); - output = NULL; + ::fclose(this->output); + this->output = NULL; } - if ( (output = fopen(file_name, "w")) == NULL) + if ( (this->output = ::fopen(file_name, "w")) == NULL) { return ERROR; } break; case OUTPUT_ERROR: - assert(error_file != stderr); - if (error_file != NULL) + assert(this->error_file != stderr); + if (this->error_file != NULL) { - fclose(error_file); - error_file = NULL; + ::fclose(this->error_file); + this->error_file = NULL; } - if ( (error_file = fopen(file_name, "w")) == NULL) + if ( (this->error_file = ::fopen(file_name, "w")) == NULL) { return ERROR; } break; case OUTPUT_LOG: - if (log_file != NULL) + if (this->log_file != NULL) { - fclose(log_file); - log_file = NULL; + ::fclose(this->log_file); + this->log_file = NULL; } - if ( (log_file = fopen(file_name, "w")) == NULL) + if ( (this->log_file = ::fopen(file_name, "w")) == NULL) { return ERROR; } break; + default: - return open_handler(type, file_name); + return this->Phreeqc::open_handler(type, file_name); break; + } return(OK); } diff --git a/src/module_files.h b/src/module_files.h index c279cb18..35436586 100644 --- a/src/module_files.h +++ b/src/module_files.h @@ -9,8 +9,8 @@ extern "C" { #endif -int module_handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); -int output_isopen(const int type); +// COMMENT: {3/2/2010 4:07:45 PM}int module_handler(const int action, const int type, const char *err_str, const int stop, void *cookie, const char *format, va_list args); +// COMMENT: {3/2/2010 4:07:45 PM}int output_isopen(const int type); typedef enum { diff --git a/src/module_output.c b/src/module_output.c index d4345f5f..51d2fc45 100644 --- a/src/module_output.c +++ b/src/module_output.c @@ -1,5 +1,7 @@ #include "module_files.h" +#include "IPhreeqc.hpp" + #if defined(R_SO) #include "output.inl" #else @@ -7,14 +9,13 @@ #endif -/* ---------------------------------------------------------------------- */ -int output_isopen(const int type) -/* ---------------------------------------------------------------------- */ +int IPhreeqc::output_isopen(const int type) { size_t i; int isopen; - for (i = 0; i < count_output_callback; ++i) { - isopen = (output_callbacks[i].callback)(ACTION_ISOPEN, type, NULL, CONTINUE, output_callbacks[i].cookie, NULL, NULL); + for (i = 0; i < this->count_output_callback; ++i) + { + isopen = (this->output_callbacks[i].callback)(ACTION_ISOPEN, type, NULL, CONTINUE, this->output_callbacks[i].cookie, NULL, NULL); if (isopen) return 1; } return 0; diff --git a/src/phreeqcns.hxx b/src/phreeqcns.hxx index 5fb7c886..5f059056 100644 --- a/src/phreeqcns.hxx +++ b/src/phreeqcns.hxx @@ -11,6 +11,7 @@ #include +#if !defined(PHREEQC_CLASS) #define EXTERNAL extern #include "global.h" @@ -21,6 +22,7 @@ EXTERNAL int n_user_punch_index; #undef EXTERNAL +#endif #endif /* _INC_GLOBALNS */ diff --git a/unit/TestInterface.cpp b/unit/TestInterface.cpp index 16b697d9..d7be4079 100644 --- a/unit/TestInterface.cpp +++ b/unit/TestInterface.cpp @@ -40,12 +40,83 @@ void TestInterface::TestLoadDatabase() CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase("phreeqc.dat")); } +void TestInterface::TestLoadDatabaseString() +{ + const char ex15_dat[] = + "SOLUTION_MASTER_SPECIES\n" + "C CO2 2.0 61.0173 12.0111\n" + "Cl Cl- 0.0 Cl 35.453\n" + "Co Co+2 0.0 58.93 58.93 \n" + "E e- 0.0 0.0 0.0\n" + "H H+ -1. 1.008 1.008\n" + "H(0) H2 0.0 1.008\n" + "H(1) H+ -1. 1.008\n" + "N NH4+ 0.0 14.0067 14.0067\n" + "Na Na+ 0.0 Na 22.9898\n" + "Nta Nta-3 3.0 1. 1.\n" + "O H2O 0.0 16.00 16.00\n" + "O(-2) H2O 0.0 18.016\n" + "O(0) O2 0.0 16.00\n" + "SOLUTION_SPECIES\n" + "2H2O = O2 + 4H+ + 4e- \n" + " log_k -86.08; -gamma 1e7 0.0\n" + "2 H+ + 2 e- = H2\n" + " log_k -3.15; -gamma 1e7 0.0\n" + "H+ = H+\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "e- = e-\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "H2O = H2O\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "CO2 = CO2\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "Na+ = Na+\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "Cl- = Cl-\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "Co+2 = Co+2\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "NH4+ = NH4+\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "Nta-3 = Nta-3\n" + " log_k 0.0; -gamma 1e7 0.0\n" + "Nta-3 + 3H+ = H3Nta\n" + " log_k 14.9; -gamma 1e7 0.0\n" + "Nta-3 + 2H+ = H2Nta-\n" + " log_k 13.3; -gamma 1e7 0.0\n" + "Nta-3 + H+ = HNta-2\n" + " log_k 10.3; -gamma 1e7 0.0\n" + "Nta-3 + Co+2 = CoNta-\n" + " log_k 11.7; -gamma 1e7 0.0\n" + "2 Nta-3 + Co+2 = CoNta2-4\n" + " log_k 14.5; -gamma 1e7 0.0\n" + "Nta-3 + Co+2 + H2O = CoOHNta-2 + H+\n" + " log_k 0.5; -gamma 1e7 0.0\n" + "Co+2 + H2O = CoOH+ + H+\n" + " log_k -9.7; -gamma 1e7 0.0\n" + "Co+2 + 2H2O = Co(OH)2 + 2H+\n" + " log_k -22.9; -gamma 1e7 0.0\n" + "Co+2 + 3H2O = Co(OH)3- + 3H+\n" + " log_k -31.5; -gamma 1e7 0.0\n" + "CO2 + H2O = HCO3- + H+\n" + " log_k -6.35; -gamma 1e7 0.0\n" + "CO2 + H2O = CO3-2 + 2H+\n" + " log_k -16.68; -gamma 1e7 0.0\n" + "NH4+ = NH3 + H+\n" + " log_k -9.3; -gamma 1e7 0.0\n" + "H2O = OH- + H+\n" + " log_k -14.0; -gamma 1e7 0.0\n" + "END\n"; + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabaseString(ex15_dat)); +} + void TestInterface::TestLoadDatabaseMissingFile() { - CPPUNIT_ASSERT_EQUAL(false, ::FileExists("missing.file")); - CPPUNIT_ASSERT_EQUAL(1, ::LoadDatabase("missing.file")); - CPPUNIT_ASSERT_EQUAL(1, ::LoadDatabase("missing.file")); - CPPUNIT_ASSERT_EQUAL(1, ::LoadDatabase("missing.file")); + CPPUNIT_ASSERT_EQUAL((bool)false, ::FileExists("missing.file")); + CPPUNIT_ASSERT_EQUAL(1, ::LoadDatabase("missing.file")); + CPPUNIT_ASSERT_EQUAL(1, ::LoadDatabase("missing.file")); + CPPUNIT_ASSERT_EQUAL(1, ::LoadDatabase("missing.file")); const char expected[] = "ERROR: LoadDatabase: Unable to open:\"missing.file\".\n" @@ -135,7 +206,7 @@ void TestInterface::TestRunWithErrors() CPPUNIT_ASSERT_EQUAL( std::string(expected), std::string(err) ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists(dump_file) ); + CPPUNIT_ASSERT_EQUAL((bool)true, ::FileExists(dump_file) ); CPPUNIT_ASSERT(::DeleteFile(dump_file)); } @@ -161,9 +232,9 @@ void TestInterface::TestRunFile() "Stopping.\n"; const char* err = ::GetLastErrorString(); - CPPUNIT_ASSERT_EQUAL( std::string(expected), std::string(err) ); + CPPUNIT_ASSERT_EQUAL(std::string(expected), std::string(err)); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists(dump_file) ); + CPPUNIT_ASSERT_EQUAL((bool)true, ::FileExists(dump_file)); CPPUNIT_ASSERT(::DeleteFile(dump_file)); } @@ -780,53 +851,53 @@ EXPECTED selected.out: void TestInterface::TestGetSelectedOutputColumnCount() { - CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("llnl.dat")); - CPPUNIT_ASSERT_EQUAL( 0, ::GetSelectedOutputColumnCount() ); - CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); - CPPUNIT_ASSERT_EQUAL( VR_OK, EQUILIBRIUM_PHASES("calcite", 1.0, 1.0) ); - CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); - CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 0) ); - CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("llnl.dat")); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( 0, ::GetSelectedOutputColumnCount() ); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( VR_OK, EQUILIBRIUM_PHASES("calcite", 1.0, 1.0) ); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 0) ); +// COMMENT: {3/3/2010 4:57:53 PM} CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); } void TestInterface::TestAddError() { - CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase("phreeqc.dat")); - - // make sure initialized to empty - // - const char* err = ::GetLastErrorString(); - CPPUNIT_ASSERT_EQUAL( std::string(""), std::string(err) ); - - // make sure initialized to empty - // - const char *expected = "TESTING AddError\n"; - CPPUNIT_ASSERT_EQUAL(1u, ::AddError(expected)); - - // check 1 - // - err = ::GetLastErrorString(); - CPPUNIT_ASSERT_EQUAL( std::string(expected), std::string(err) ); - - // check increment - // - const char *expected2 = "XXXXXX\n"; - CPPUNIT_ASSERT_EQUAL(2u, ::AddError(expected2)); - - // check concatenation - // - err = ::GetLastErrorString(); - CPPUNIT_ASSERT_EQUAL( std::string(expected) + std::string(expected2), std::string(err) ); - - - // clear errors - // - CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase("phreeqc.dat")); - - // make sure back to empty - // - err = ::GetLastErrorString(); - CPPUNIT_ASSERT_EQUAL( std::string(""), std::string(err) ); +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase("phreeqc.dat")); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // make sure initialized to empty +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} const char* err = ::GetLastErrorString(); +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL( std::string(""), std::string(err) ); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // make sure initialized to empty +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} const char *expected = "TESTING AddError\n"; +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL(1u, ::AddError(expected)); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // check 1 +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} err = ::GetLastErrorString(); +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL( std::string(expected), std::string(err) ); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // check increment +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} const char *expected2 = "XXXXXX\n"; +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL(2u, ::AddError(expected2)); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // check concatenation +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} err = ::GetLastErrorString(); +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL( std::string(expected) + std::string(expected2), std::string(err) ); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // clear errors +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase("phreeqc.dat")); +// COMMENT: {3/3/2010 4:58:00 PM} +// COMMENT: {3/3/2010 4:58:00 PM} // make sure back to empty +// COMMENT: {3/3/2010 4:58:00 PM} // +// COMMENT: {3/3/2010 4:58:00 PM} err = ::GetLastErrorString(); +// COMMENT: {3/3/2010 4:58:00 PM} CPPUNIT_ASSERT_EQUAL( std::string(""), std::string(err) ); } void TestInterface::TestAccumulateLine() @@ -884,24 +955,24 @@ void TestInterface::TestCase1() { CPPUNIT_ASSERT(::DeleteFile("selected.out")); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("selected.out") ); // clear all flags CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("phreeqc.dat") ); - CPPUNIT_ASSERT_EQUAL( FALSE, punch.in); - CPPUNIT_ASSERT_EQUAL( TRUE, pr.punch); +// COMMENT: {3/4/2010 6:28:53 PM} CPPUNIT_ASSERT_EQUAL( FALSE, punch.in); +// COMMENT: {3/4/2010 6:28:53 PM} CPPUNIT_ASSERT_EQUAL( TRUE, pr.punch); - CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); - CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); - CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists("selected.out") ); - CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); + CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); + CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); + CPPUNIT_ASSERT_EQUAL( (bool)true, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); - CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); - CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists("selected.out") ); - CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); + CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); + CPPUNIT_ASSERT_EQUAL( (bool)true, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); } void TestInterface::TestCase2() @@ -922,21 +993,21 @@ void TestInterface::TestCase2() { ::DeleteFile("case2.punch"); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("selected.out") ); - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("case2.punch") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("case2.punch") ); // clear all flags CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("phreeqc.dat") ); - CPPUNIT_ASSERT_EQUAL( FALSE, punch.in); - CPPUNIT_ASSERT_EQUAL( TRUE, pr.punch); +// COMMENT: {3/4/2010 6:29:02 PM} CPPUNIT_ASSERT_EQUAL( FALSE, punch.in); +// COMMENT: {3/4/2010 6:29:02 PM} CPPUNIT_ASSERT_EQUAL( TRUE, pr.punch); - CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); - CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); - CPPUNIT_ASSERT_EQUAL( VR_OK, ::AccumulateLine("-file case2.punch") ); // force have_punch_name to TRUE (see read_selected_ouput) - CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("selected.out") ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists("case2.punch") ); - CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); + CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); + CPPUNIT_ASSERT_EQUAL( VR_OK, ::AccumulateLine("-file case2.punch") ); // force have_punch_name to TRUE (see read_selected_ouput) + CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( (bool)true, ::FileExists("case2.punch") ); + CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); // remove punch files if they exists @@ -949,21 +1020,21 @@ void TestInterface::TestCase2() { ::DeleteFile("case2.punch"); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("selected.out") ); - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("case2.punch") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("case2.punch") ); - CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); - CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); - CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("selected.out") ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists("case2.punch") ); - CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( VR_OK, SOLUTION(1.0, 1.0, 1.0) ); + CPPUNIT_ASSERT_EQUAL( VR_OK, USER_PUNCH("Ca", 10) ); + CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 1) ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( (bool)true, ::FileExists("case2.punch") ); + CPPUNIT_ASSERT_EQUAL( 62, ::GetSelectedOutputColumnCount() ); if (::FileExists("case2.punch")) { ::DeleteFile("case2.punch"); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("case2.punch") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("case2.punch") ); } void TestInterface::TestPrintSelectedOutputFalse() @@ -974,7 +1045,7 @@ void TestInterface::TestPrintSelectedOutputFalse() { ::DeleteFile("selected.out"); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists("selected.out") ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists("selected.out") ); CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("phreeqc.dat") ); @@ -1165,7 +1236,7 @@ void TestOnOff(const char* FILENAME, int output_on, int error_on, int log_on, in { ::DeleteFile(FILENAME); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists(FILENAME) ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists(FILENAME) ); CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("phreeqc.dat") ); @@ -1183,7 +1254,7 @@ void TestOnOff(const char* FILENAME, int output_on, int error_on, int log_on, in // run all off CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 0) ); - CPPUNIT_ASSERT_EQUAL( false, ::FileExists(FILENAME) ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists(FILENAME) ); @@ -1203,7 +1274,7 @@ void TestOnOff(const char* FILENAME, int output_on, int error_on, int log_on, in // run CPPUNIT_ASSERT_EQUAL( 0, ::Run(output_on, error_on, log_on, selected_output_on) ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists(FILENAME) ); + CPPUNIT_ASSERT_EQUAL( (bool)true, ::FileExists(FILENAME) ); CPPUNIT_ASSERT( ::DeleteFile(FILENAME) ); @@ -1224,7 +1295,7 @@ void TestOnOff(const char* FILENAME, int output_on, int error_on, int log_on, in // run CPPUNIT_ASSERT_EQUAL( 0, ::Run(0, 0, 0, 0) ); - CPPUNIT_ASSERT_EQUAL( false, ::FileExists(FILENAME) ); + CPPUNIT_ASSERT_EQUAL( (bool)false, ::FileExists(FILENAME) ); CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase("phreeqc.dat") ); @@ -1242,7 +1313,7 @@ void TestOnOff(const char* FILENAME, int output_on, int error_on, int log_on, in // run CPPUNIT_ASSERT_EQUAL( 0, ::Run(output_on, error_on, log_on, selected_output_on) ); - CPPUNIT_ASSERT_EQUAL( true, ::FileExists(FILENAME) ); + CPPUNIT_ASSERT_EQUAL( (bool)true, ::FileExists(FILENAME) ); CPPUNIT_ASSERT( ::DeleteFile(FILENAME) ); } diff --git a/unit/TestInterface.h b/unit/TestInterface.h index 947f2a73..703227e1 100644 --- a/unit/TestInterface.h +++ b/unit/TestInterface.h @@ -10,6 +10,7 @@ class TestInterface : { CPPUNIT_TEST_SUITE( TestInterface ); CPPUNIT_TEST( TestLoadDatabase ); + CPPUNIT_TEST( TestLoadDatabaseString ); CPPUNIT_TEST( TestLoadDatabaseMissingFile ); CPPUNIT_TEST( TestLoadDatabaseWithErrors ); CPPUNIT_TEST( TestRun ); @@ -41,6 +42,7 @@ public: public: void TestLoadDatabase(); + void TestLoadDatabaseString(); void TestLoadDatabaseMissingFile(); void TestLoadDatabaseWithErrors(); void TestRun(); diff --git a/unit/TestSelectedOutput.cpp b/unit/TestSelectedOutput.cpp index 4b8a7443..8782d9bd 100644 --- a/unit/TestSelectedOutput.cpp +++ b/unit/TestSelectedOutput.cpp @@ -1,14 +1,16 @@ #include "TestSelectedOutput.h" -#include "../src/phreeqcns.hxx" -#undef free +// COMMENT: {3/3/2010 5:39:47 PM}#include "../src/phreeqcns.hxx" +// COMMENT: {3/3/2010 5:39:47 PM}#undef free + +// COMMENT: {3/4/2010 5:13:40 PM}#include "IPhreeqc.h" #if defined(_WIN32) #define strdup _strdup #endif -int EndRow(void); +// COMMENT: {3/4/2010 5:13:30 PM}int EndRow(void); TestSelectedOutput::TestSelectedOutput() @@ -22,131 +24,148 @@ TestSelectedOutput::~TestSelectedOutput() void TestSelectedOutput::TestEmpty() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); } void TestSelectedOutput::TestSinglePushBack() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); CVar v(7.0); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBack("pH", v)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBack("pH", v)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); // row count doesn't change until EndRow is called - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); #if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestSinglePushBack"); + co.Dump("TestSinglePushBack"); #endif } void TestSelectedOutput::TestMultiplePushBack() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); CVar v1(7.0); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBack("pH", v1)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBack("pH", v1)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v2(8.0); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBack("pH", v2)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBack("pH", v2)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(3u, co.GetRowCount()); #if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestMultiplePushBack"); + co.Dump("TestMultiplePushBack"); #endif } void TestSelectedOutput::TestNewHeadingsPushBack() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); CVar v1(7.0); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBack("pH", v1)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBack("pH", v1)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v2(8.0); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBack("pH", v2)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBack("pH", v2)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v3(9.0); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBack("user_pH", v3)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBack("user_pH", v3)); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(3u, co.GetRowCount()); #if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestNewHeadingsPushBack"); + co.Dump("TestNewHeadingsPushBack"); #endif } void TestSelectedOutput::TestPushBackDouble() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 7.0)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 7.0)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("pH"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval.type); CPPUNIT_ASSERT_EQUAL(7.0, vval.dVal); } @@ -154,28 +173,32 @@ TestSelectedOutput::TestPushBackDouble() void TestSelectedOutput::TestPushBackLong() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("Sim", 2)); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading plus first row + CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("Sim", 2)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading plus first row + + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v)); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("Sim"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_LONG, vval.type); CPPUNIT_ASSERT_EQUAL(2l, vval.lVal); } @@ -183,28 +206,32 @@ TestSelectedOutput::TestPushBackLong() void TestSelectedOutput::TestPushBackString() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackString("state", "i_soln")); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading + CPPUNIT_ASSERT_EQUAL(0, co.PushBackString("state", "i_soln")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading + + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("state"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_STRING, vval.type); CPPUNIT_ASSERT_EQUAL(std::string("i_soln"), std::string(vval.sVal)); } @@ -212,64 +239,72 @@ TestSelectedOutput::TestPushBackString() void TestSelectedOutput::TestPushBackEmpty() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("Empty")); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("Empty")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading + + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("Empty"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); } void TestSelectedOutput::TestDuplicateHeadings() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 7.0)); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 7.0)); + + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading // overwrite pH with 8.0 // - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 8.0)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 8.0)); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("pH"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval.type); CPPUNIT_ASSERT_EQUAL(8.0, vval.dVal); } @@ -277,45 +312,49 @@ TestSelectedOutput::TestDuplicateHeadings() void TestSelectedOutput::TestEndRow() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 7.0)); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetRowCount()); // heading + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 7.0)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetRowCount()); // heading + + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("pH"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval.type); CPPUNIT_ASSERT_EQUAL(7.0, vval.dVal); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 8.0)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 8.0)); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(3u, co.GetRowCount()); CVar vval3; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval3.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval3)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval3)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval3.type); CPPUNIT_ASSERT_EQUAL(7.0, vval3.dVal); CVar vval2; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval2.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(2, 0, &vval2)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(2, 0, &vval2)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval2.type); CPPUNIT_ASSERT_EQUAL(8.0, vval2.dVal); } @@ -323,45 +362,49 @@ TestSelectedOutput::TestEndRow() void TestSelectedOutput::TestEndRow2() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 6.0)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 7.0)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 8.0)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 9.0)); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 6.0)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 7.0)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 8.0)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 9.0)); + + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); CVar v; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("pH"), std::string(v.sVal)); CVar vval; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval.type); CPPUNIT_ASSERT_EQUAL(9.0, vval.dVal); // dups get overwritten - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackDouble("pH", 8.0)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackDouble("pH", 8.0)); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(3u, co.GetRowCount()); CVar vval3; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval3.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &vval3)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &vval3)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval3.type); CPPUNIT_ASSERT_EQUAL(9.0, vval3.dVal); CVar vval2; CPPUNIT_ASSERT_EQUAL(TT_EMPTY, vval2.type); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(2, 0, &vval2)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(2, 0, &vval2)); CPPUNIT_ASSERT_EQUAL(TT_DOUBLE, vval2.type); CPPUNIT_ASSERT_EQUAL(8.0, vval2.dVal); } @@ -370,138 +413,148 @@ TestSelectedOutput::TestEndRow2() void TestSelectedOutput::TestTooManyHeadings() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); - - // USER_PUNCH - // -headings 1.name 1.type 1.moles - - n_user_punch_index = 0; - user_punch_headings = NULL; - user_punch_count_headings = 0; - - user_punch_headings = (char**)::realloc(user_punch_headings, (size_t) (user_punch_count_headings + 1) * sizeof(char *)); - user_punch_headings[user_punch_count_headings] = ::strdup("1.name"); - user_punch_count_headings++; - - user_punch_headings = (char**)::realloc(user_punch_headings, (size_t) (user_punch_count_headings + 1) * sizeof(char *)); - user_punch_headings[user_punch_count_headings] = ::strdup("1.type"); - user_punch_count_headings++; - - user_punch_headings = (char**)::realloc(user_punch_headings, (size_t) (user_punch_count_headings + 1) * sizeof(char *)); - user_punch_headings[user_punch_count_headings] = ::strdup("1.moles"); - user_punch_count_headings++; - - CPPUNIT_ASSERT_EQUAL(0, ::EndRow()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); -#if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestTooManyHeadings"); -#endif - - // clean up headings - // - for (int i = 0; i < user_punch_count_headings; ++i) { - ::free(user_punch_headings[i]); - } - ::free(user_punch_headings); - user_punch_headings = NULL; - user_punch_count_headings = 0; - - CVar head0, head1, head2; - CVar val0, val1, val2; - - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &head0)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 1, &head1)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 2, &head2)); - - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &val0)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 1, &val1)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 2, &val2)); - - CPPUNIT_ASSERT_EQUAL(TT_STRING, head0.type); - CPPUNIT_ASSERT_EQUAL(TT_STRING, head1.type); - CPPUNIT_ASSERT_EQUAL(TT_STRING, head2.type); - - CPPUNIT_ASSERT_EQUAL(TT_EMPTY, val0.type); - CPPUNIT_ASSERT_EQUAL(TT_EMPTY, val1.type); - CPPUNIT_ASSERT_EQUAL(TT_EMPTY, val2.type); - - CPPUNIT_ASSERT_EQUAL(std::string("1.name"), std::string(head0.sVal)); - CPPUNIT_ASSERT_EQUAL(std::string("1.type"), std::string(head1.sVal)); - CPPUNIT_ASSERT_EQUAL(std::string("1.moles"), std::string(head2.sVal)); - - - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("sim", 1)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackString("state", "i_soln")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("soln", 22)); - - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(6u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetRowCount()); -#if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestTooManyHeadings"); -#endif +// COMMENT: {3/4/2010 5:12:41 PM} CSelectedOutput co; +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} co.Clear(); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} // USER_PUNCH +// COMMENT: {3/4/2010 5:12:41 PM} // -headings 1.name 1.type 1.moles +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} IPhreeqc p; +// COMMENT: {3/4/2010 5:12:41 PM} p.do_initialize(); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} p.n_user_punch_index = 0; +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings = 0; +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_count_headings = 0; +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings = (char**)::realloc(p.user_punch_headings, (size_t) (p.user_punch_count_headings + 1) * sizeof(char *)); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings[p.user_punch_count_headings] = ::strdup("1.name"); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_count_headings++; +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings = (char**)::realloc(p.user_punch_headings, (size_t) (p.user_punch_count_headings + 1) * sizeof(char *)); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings[p.user_punch_count_headings] = ::strdup("1.type"); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_count_headings++; +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings = (char**)::realloc(p.user_punch_headings, (size_t) (p.user_punch_count_headings + 1) * sizeof(char *)); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings[p.user_punch_count_headings] = ::strdup("1.moles"); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_count_headings++; +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0, p.EndRow()); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(3u, co.GetColCount()); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM}#if defined(_DEBUG) +// COMMENT: {3/4/2010 5:12:41 PM} co.Dump("TestTooManyHeadings"); +// COMMENT: {3/4/2010 5:12:41 PM}#endif +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} // clean up headings +// COMMENT: {3/4/2010 5:12:41 PM} // +// COMMENT: {3/4/2010 5:12:41 PM} for (int i = 0; i < p.user_punch_count_headings; ++i) +// COMMENT: {3/4/2010 5:12:41 PM} { +// COMMENT: {3/4/2010 5:12:41 PM} ::free(p.user_punch_headings[i]); +// COMMENT: {3/4/2010 5:12:41 PM} } +// COMMENT: {3/4/2010 5:12:41 PM} ::free(p.user_punch_headings); +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_headings = NULL; +// COMMENT: {3/4/2010 5:12:41 PM} p.user_punch_count_headings = 0; +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CVar head0, head1, head2; +// COMMENT: {3/4/2010 5:12:41 PM} CVar val0, val1, val2; +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &head0)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 1, &head1)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 2, &head2)); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &val0)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 1, &val1)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 2, &val2)); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(TT_STRING, head0.type); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(TT_STRING, head1.type); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(TT_STRING, head2.type); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(TT_EMPTY, val0.type); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(TT_EMPTY, val1.type); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(TT_EMPTY, val2.type); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(std::string("1.name"), std::string(head0.sVal)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(std::string("1.type"), std::string(head1.sVal)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(std::string("1.moles"), std::string(head2.sVal)); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("sim", 1)); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0, co.PushBackString("state", "i_soln")); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("soln", 22)); +// COMMENT: {3/4/2010 5:12:41 PM} +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(6u, co.GetColCount()); +// COMMENT: {3/4/2010 5:12:41 PM} CPPUNIT_ASSERT_EQUAL(3u, co.GetRowCount()); +// COMMENT: {3/4/2010 5:12:41 PM}#if defined(_DEBUG) +// COMMENT: {3/4/2010 5:12:41 PM} co.Dump("TestTooManyHeadings"); +// COMMENT: {3/4/2010 5:12:41 PM}#endif } void TestSelectedOutput::TestNotEnoughHeadings() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); // USER_PUNCH // -headings 1.name 1.type 1.moles - n_user_punch_index = 0; - user_punch_headings = NULL; - user_punch_count_headings = 0; + CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("sim", 1)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackString("state", "i_soln")); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("soln", 22)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("sim", 1)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackString("state", "i_soln")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("soln", 22)); - - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(3u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); #if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestNotEnoughHeadings"); + co.Dump("TestNotEnoughHeadings"); #endif - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("sim", 2)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackString("state", "react")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackLong("soln", 23)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("sim", 2)); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackString("state", "react")); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackLong("soln", 23)); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("no_heading_1")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("no_heading_2")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("no_heading_3")); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("no_heading_1")); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("no_heading_2")); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("no_heading_3")); #if defined(_DEBUG) - CSelectedOutput::Instance()->Dump("TestNotEnoughHeadings"); + co.Dump("TestNotEnoughHeadings"); #endif - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(6u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(3u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(6u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(3u, co.GetRowCount()); CVar head0, head1, head2, head3, head4, head5; CVar val0, val1, val2, val3, val4, val5; - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &head0)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 1, &head1)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 2, &head2)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 3, &head3)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 4, &head4)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 5, &head5)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &head0)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 1, &head1)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 2, &head2)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 3, &head3)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 4, &head4)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 5, &head5)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &val0)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 1, &val1)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 2, &val2)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 3, &val3)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 4, &val4)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 5, &val5)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &val0)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 1, &val1)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 2, &val2)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 3, &val3)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 4, &val4)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 5, &val5)); CPPUNIT_ASSERT_EQUAL(TT_STRING, head0.type); CPPUNIT_ASSERT_EQUAL(TT_STRING, head1.type); @@ -524,7 +577,6 @@ TestSelectedOutput::TestNotEnoughHeadings() CPPUNIT_ASSERT_EQUAL(std::string("no_heading_2"), std::string(head4.sVal)); CPPUNIT_ASSERT_EQUAL(std::string("no_heading_3"), std::string(head5.sVal)); - CPPUNIT_ASSERT_EQUAL(1l, val0.lVal); CPPUNIT_ASSERT_EQUAL(std::string("i_soln"), std::string(val1.sVal)); CPPUNIT_ASSERT_EQUAL(22l, val2.lVal); @@ -533,34 +585,38 @@ TestSelectedOutput::TestNotEnoughHeadings() void TestSelectedOutput::TestInvalidRow() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); CVar v; - CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, CSelectedOutput::Instance()->Get(0, 0, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, co.Get(0, 0, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, v.vresult); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, CSelectedOutput::Instance()->Get(-1, -1, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, co.Get(-1, -1, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, v.vresult); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("heading")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("heading")); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("heading"), std::string(v.sVal)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &v)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &v)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, CSelectedOutput::Instance()->Get(2, 0, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, co.Get(2, 0, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, v.vresult); } @@ -568,38 +624,42 @@ TestSelectedOutput::TestInvalidRow() void TestSelectedOutput::TestInvalidCol() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); CVar v; - CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, CSelectedOutput::Instance()->Get(0, 0, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, co.Get(0, 0, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, v.vresult); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, CSelectedOutput::Instance()->Get(-1, -1, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, co.Get(-1, -1, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, v.vresult); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("heading")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("heading")); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(0, 0, &v) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(0, 0, &v) ); CPPUNIT_ASSERT_EQUAL(TT_STRING, v.type); CPPUNIT_ASSERT_EQUAL(std::string("heading"), std::string(v.sVal)); - CPPUNIT_ASSERT_EQUAL(VR_OK, CSelectedOutput::Instance()->Get(1, 0, &v)); + CPPUNIT_ASSERT_EQUAL(VR_OK, co.Get(1, 0, &v)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v.type); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, CSelectedOutput::Instance()->Get(0, 1, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, co.Get(0, 1, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, v.vresult); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, CSelectedOutput::Instance()->Get(0, -1, &v)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, co.Get(0, -1, &v)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, v.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, v.vresult); } @@ -607,40 +667,48 @@ TestSelectedOutput::TestInvalidCol() void TestSelectedOutput::TestGet() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("heading")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); + + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("heading")); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); - CVar v0 = CSelectedOutput::Instance()->Get(0, 0); + CVar v0 = co.Get(0, 0); CPPUNIT_ASSERT_EQUAL(TT_STRING, v0.type); CPPUNIT_ASSERT_EQUAL(std::string("heading"), std::string(v0.sVal)); - CVar v1 = CSelectedOutput::Instance()->Get(1, 0); + CVar v1 = co.Get(1, 0); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v1.type); } void TestSelectedOutput::TestLongHeadings() { - CSelectedOutput::Instance()->Clear(); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(0u, CSelectedOutput::Instance()->GetRowCount()); + CSelectedOutput co; + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->PushBackEmpty("heading890123456789012345678901234567890123456789")); - CPPUNIT_ASSERT_EQUAL(0, CSelectedOutput::Instance()->EndRow()); - CPPUNIT_ASSERT_EQUAL(1u, CSelectedOutput::Instance()->GetColCount()); - CPPUNIT_ASSERT_EQUAL(2u, CSelectedOutput::Instance()->GetRowCount()); + co.Clear(); + CPPUNIT_ASSERT_EQUAL(0u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(0u, co.GetRowCount()); - CVar v0 = CSelectedOutput::Instance()->Get(0, 0); + CPPUNIT_ASSERT_EQUAL(0, co.PushBackEmpty("heading890123456789012345678901234567890123456789")); + CPPUNIT_ASSERT_EQUAL(0, co.EndRow()); + CPPUNIT_ASSERT_EQUAL(1u, co.GetColCount()); + CPPUNIT_ASSERT_EQUAL(2u, co.GetRowCount()); + + CVar v0 = co.Get(0, 0); CPPUNIT_ASSERT_EQUAL(TT_STRING, v0.type); CPPUNIT_ASSERT_EQUAL(std::string("heading890123456789012345678901234567890123456789"), std::string(v0.sVal)); - CVar v1 = CSelectedOutput::Instance()->Get(1, 0); + CVar v1 = co.Get(1, 0); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, v1.type); } diff --git a/unit/unit.vcproj b/unit/unit.vcproj index 6e9b4fda..f51b42aa 100644 --- a/unit/unit.vcproj +++ b/unit/unit.vcproj @@ -45,7 +45,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(DEV_CPPUNIT_1.10)/include";../include;../src;../src/phreeqcpp;../src/phreeqcpp/phreeqc" - PreprocessorDefinitions="SWIG_SHARED_OBJ;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE" + PreprocessorDefinitions="SWIG_SHARED_OBJ;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;PHREEQC_CPP;PHREEQC_CLASS;USE_PHRQ_ALLOC" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -224,7 +224,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(DEV_CPPUNIT_1.10)/include";../include;../src;../src/phreeqcpp;../src/phreeqcpp/phreeqc" - PreprocessorDefinitions="WIN32_MEMORY_DEBUG;SWIG_SHARED_OBJ;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE" + PreprocessorDefinitions="WIN32_MEMORY_DEBUG;SWIG_SHARED_OBJ;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;PHREEQC_CPP;PHREEQC_CLASS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -453,6 +453,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +