diff --git a/src/phreeqcpp/Phreeqc.h b/src/phreeqcpp/Phreeqc.h index e27c324b..c91b6ed0 100644 --- a/src/phreeqcpp/Phreeqc.h +++ b/src/phreeqcpp/Phreeqc.h @@ -781,8 +781,6 @@ public: class spread_row* string_to_spread_row(char* string); #ifdef PHREEQCI_GUI void add_row(class spread_row* spread_row_ptr); - void copy_defaults(class defaults* dest_ptr, - class defaults* src_ptr); void free_spread(void); class spread_row* copy_row(class spread_row* spread_row_ptr); #endif diff --git a/src/phreeqcpp/global_structures.h b/src/phreeqcpp/global_structures.h index 1ecb2b82..e66b374c 100644 --- a/src/phreeqcpp/global_structures.h +++ b/src/phreeqcpp/global_structures.h @@ -1258,10 +1258,9 @@ public: //d_vector.clear(); //type_vector.clear(); } - int count; - int empty, string, number; - std::vector char_vector; - std::vector d_vector; + size_t count; + size_t empty, string, number; + std::vector str_vector; std::vector type_vector; }; class defaults @@ -1300,14 +1299,11 @@ public: { heading = NULL; units = NULL; - count_rows = 0; - rows = NULL; //class defaults defaults; } class spread_row* heading; class spread_row* units; - int count_rows; - class spread_row** rows; + std::vector rows; class defaults defaults; }; /* ---------------------------------------------------------------------- diff --git a/src/phreeqcpp/mainsubs.cpp b/src/phreeqcpp/mainsubs.cpp index f8d8b1a6..2ebd8fd3 100644 --- a/src/phreeqcpp/mainsubs.cpp +++ b/src/phreeqcpp/mainsubs.cpp @@ -77,12 +77,10 @@ initialize(void) #ifdef PHREEQCI_GUI g_spread_sheet.heading = NULL; g_spread_sheet.units = NULL; - g_spread_sheet.count_rows = 0; - g_spread_sheet.rows = NULL; g_spread_sheet.defaults.units = NULL; - g_spread_sheet.defaults.count_iso = 0; - g_spread_sheet.defaults.iso = NULL; g_spread_sheet.defaults.redox = NULL; + assert(g_spread_sheet.rows.empty()); + assert(g_spread_sheet.defaults.iso.empty()); #endif // Initialize cvode @@ -435,7 +433,7 @@ initial_solutions(int print) print_all(); /* free_model_allocs(); */ // remove pr_in - for (int i = 0; i < count_unknowns; i++) + for (size_t i = 0; i < count_unknowns; i++) { if (x[i]->type == SOLUTION_PHASE_BOUNDARY) x[i]->phase->pr_in = false; @@ -1003,7 +1001,7 @@ xexchange_save(int n_user) * Save exchanger assemblage into structure exchange with user * number n_user. */ - int i, j; + size_t i, j; char token[MAX_LENGTH]; LDBLE charge; @@ -1043,7 +1041,7 @@ xexchange_save(int n_user) count_elts = 0; paren_count = 0; charge = 0.0; - for (j = 0; j < (int)species_list.size(); j++) + for (j = 0; j < species_list.size(); j++) { if (species_list[j].master_s == x[i]->master[0]->s) { diff --git a/src/phreeqcpp/spread.cpp b/src/phreeqcpp/spread.cpp index 8299ea08..03cf4439 100644 --- a/src/phreeqcpp/spread.cpp +++ b/src/phreeqcpp/spread.cpp @@ -448,7 +448,7 @@ read_solution_spread(void) error_msg(error_string, PHRQ_io::OT_CONTINUE); continue; } - int i; + size_t i; for (i = 0; i < soln_defaults.iso.size(); i++) { if (strcmp(token.c_str(), soln_defaults.iso[i].name) == 0) @@ -458,7 +458,7 @@ read_solution_spread(void) } if (i == soln_defaults.iso.size()) { - soln_defaults.iso.resize((size_t)i + 1); + soln_defaults.iso.resize(i + 1); soln_defaults.iso[i].name = string_hsave(token.c_str()); soln_defaults.iso[i].value = NAN; soln_defaults.iso[i].uncertainty = NAN; @@ -502,8 +502,8 @@ read_solution_spread(void) int i; for (i = 0; i < heading->count; i++) { - while (replace(" ", "", heading->char_vector[i]) == TRUE); - while (replace(",", "_", heading->char_vector[i]) == TRUE); + while (replace(" ", "", heading->str_vector[i]) == TRUE); + while (replace(",", "_", heading->str_vector[i]) == TRUE); } } break; @@ -522,7 +522,7 @@ read_solution_spread(void) assert(g_spread_sheet.units == NULL); g_spread_sheet.units = copy_row(units); } - copy_defaults(&g_spread_sheet.defaults, &soln_defaults); + g_spread_sheet.defaults = soln_defaults; #endif spread_row_free(heading); spread_row_free(units); @@ -573,7 +573,7 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, int i; for (i = 0; i < heading->count; i++) { - if (strcmp_nocase(heading->char_vector[i], "number") == 0) + if (strcmp_nocase(heading->str_vector[i].c_str(), "number") == 0) { break; } @@ -588,13 +588,13 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, input_error++; error_string = sformatf( "Expected solution number or number range in 'number' column, found: %s.", - data->char_vector[i]); + data->str_vector[i].c_str()); error_msg(error_string, CONTINUE); } else { string = "solution_s "; - string.append( data->char_vector[i] ); + string.append(data->str_vector[i]); next_keyword_save = next_keyword; next_keyword = Keywords::KEY_SOLUTION_SPREAD; cxxNumKeyword nk; @@ -647,13 +647,13 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, return_value = UNKNOWN; for (int i = 0; i < heading->count; i++) { - if (strcmp_nocase(heading->char_vector[i], "number") == 0) + if (strcmp_nocase(heading->str_vector[i].c_str(), "number") == 0) continue; - if (strcmp_nocase(heading->char_vector[i], "uncertainty") == 0) + if (strcmp_nocase(heading->str_vector[i].c_str(), "uncertainty") == 0) continue; - if (strcmp_nocase(heading->char_vector[i], "uncertainties") == 0) + if (strcmp_nocase(heading->str_vector[i].c_str(), "uncertainties") == 0) continue; - if (strcmp_nocase(heading->char_vector[i], "isotope_uncertainty") == + if (strcmp_nocase(heading->str_vector[i].c_str(), "isotope_uncertainty") == 0) continue; /* @@ -661,14 +661,14 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, */ if (heading->type_vector[i] == EMPTY) continue; - string = heading->char_vector[i]; + string = heading->str_vector[i]; string.append(" "); /* * Copy in concentration data */ if (i >= data->count || data->type_vector[i] == EMPTY) continue; - string.append(data->char_vector[i]); + string.append(data->str_vector[i]); string.append(" "); /* * Copy in concentration data @@ -676,7 +676,7 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, if (units != NULL && i < units->count && units->type_vector[i] != EMPTY) { - string.append(units->char_vector[i]); + string.append(units->str_vector[i]); } /* * Parse string just like read_solution input @@ -828,7 +828,7 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, { for (int ii = 0; ii < heading->count; ii++) { - error_string = sformatf("%d\t%s\n",ii,heading->char_vector[ii]); + error_string = sformatf("%d\t%s\n",ii,heading->str_vector[ii].c_str()); error_msg(error_string, PHRQ_io::OT_CONTINUE); } } @@ -843,7 +843,7 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, { for (int ii = 0; ii < data->count; ii++) { - error_string = sformatf("%d\t%s\t%d\n",ii,data->char_vector[ii],data->type_vector[ii]); + error_string = sformatf("%d\t%s\t%d\n",ii,data->str_vector[ii].c_str(),data->type_vector[ii]); error_msg(error_string, PHRQ_io::OT_CONTINUE); } } @@ -857,7 +857,7 @@ spread_row_to_solution(class spread_row *heading, class spread_row *units, { for (int ii = 0; ii < units->count; ii++) { - error_string = sformatf("%d\t%s\n",ii,units->char_vector[ii]); + error_string = sformatf("%d\t%s\n",ii,units->str_vector[ii].c_str()); error_msg(error_string, PHRQ_io::OT_CONTINUE); } } @@ -1070,8 +1070,7 @@ string_to_spread_row(char *string) j = copy_token_tab(token, &cptr); if (j == EOL) break; - spread_row_ptr->char_vector.push_back(string_duplicate(token.c_str())); - spread_row_ptr->d_vector.push_back(NAN); + spread_row_ptr->str_vector.push_back(token); if (j == EMPTY || token.size() == 0) { spread_row_ptr->empty++; @@ -1085,7 +1084,6 @@ string_to_spread_row(char *string) else if (j == DIGIT) { spread_row_ptr->number++; - spread_row_ptr->d_vector.push_back(strtod(token.c_str(), NULL)); spread_row_ptr->type_vector.push_back(NUMBER); } else @@ -1098,6 +1096,9 @@ string_to_spread_row(char *string) } spread_row_ptr->count++; } + assert(spread_row_ptr->count == spread_row_ptr->str_vector.size()); + assert(spread_row_ptr->count == spread_row_ptr->type_vector.size()); + assert(spread_row_ptr->count == spread_row_ptr->empty + spread_row_ptr->string + spread_row_ptr->number); return (spread_row_ptr); } @@ -1106,18 +1107,9 @@ int Phreeqc:: spread_row_free(class spread_row *spread_row_ptr) /* ---------------------------------------------------------------------- */ { - int i; - if (spread_row_ptr == NULL) return (OK); - for (i = 0; i < spread_row_ptr->count; i++) - { - spread_row_ptr->char_vector[i] = - (char *) free_check_null(spread_row_ptr->char_vector[i]); - } - - spread_row_ptr->char_vector.clear(); - spread_row_ptr->d_vector.clear(); + spread_row_ptr->str_vector.clear(); spread_row_ptr->type_vector.clear(); delete spread_row_ptr; return (OK); @@ -1203,14 +1195,6 @@ copy_token_tab(std::string& token, const char **cptr) i++; } } -/* - * Strip trailing spaces - */ - for (j = i - 1; j >= 0; j--) - { - if (j != ' ') - break; - } return (return_value); } @@ -1263,7 +1247,7 @@ get_option_string(const char **opt_list, int count_opt_list, const char **next_c return (j); } -#ifdef PHREEQCI_GUI +#if defined(PHREEQCI_GUI) /* ---------------------------------------------------------------------- */ void Phreeqc:: free_spread(void) @@ -1272,29 +1256,18 @@ free_spread(void) int i; spread_row_free(g_spread_sheet.heading); spread_row_free(g_spread_sheet.units); - for (i = 0; i < g_spread_sheet.count_rows; i++) + for (i = 0; i < g_spread_sheet.rows.size(); ++i) { spread_row_free(g_spread_sheet.rows[i]); } - g_spread_sheet.rows = (spread_row**)free_check_null(g_spread_sheet.rows); + g_spread_sheet.rows.clear(); + g_spread_sheet.defaults.iso.clear(); + g_spread_sheet.defaults.redox = NULL; + g_spread_sheet.defaults.units = NULL; - for (i = 0; i < g_spread_sheet.defaults.count_iso; i++) - { - g_spread_sheet.defaults.iso[i].name = - (const char *)free_check_null((void*)g_spread_sheet.defaults.iso[i].name); - } - g_spread_sheet.defaults.iso = - (class iso*)free_check_null(g_spread_sheet.defaults.iso); - - g_spread_sheet.defaults.redox = - (const char *)free_check_null((void*)g_spread_sheet.defaults.redox); - g_spread_sheet.defaults.units = - (const char *)free_check_null((void*)g_spread_sheet.defaults.units); - - g_spread_sheet.heading = 0; - g_spread_sheet.units = 0; - g_spread_sheet.count_rows = 0; - g_spread_sheet.defaults.count_iso = 0; + g_spread_sheet.heading = NULL; + g_spread_sheet.units = NULL; + g_spread_sheet.defaults.iso.clear(); } /* ---------------------------------------------------------------------- */ @@ -1302,19 +1275,7 @@ void Phreeqc:: add_row(class spread_row *spread_row_ptr) /* ---------------------------------------------------------------------- */ { - g_spread_sheet.rows = - (class spread_row **) PHRQ_realloc(g_spread_sheet.rows, - sizeof(class spread_row *) * - (g_spread_sheet.count_rows + 1)); - if (g_spread_sheet.rows == NULL) - { - malloc_error(); - } - else - { - g_spread_sheet.rows[g_spread_sheet.count_rows++] = - copy_row(spread_row_ptr); - } + g_spread_sheet.rows.push_back(copy_row(spread_row_ptr)); } /* ---------------------------------------------------------------------- */ @@ -1322,74 +1283,9 @@ class spread_row * Phreeqc:: copy_row(class spread_row *spread_row_ptr) /* ---------------------------------------------------------------------- */ { - int i; - class spread_row *new_spread_row_ptr; -/* - * Allocate space - */ - new_spread_row_ptr = - (class spread_row *) PHRQ_malloc((size_t) sizeof(class spread_row)); - if (new_spread_row_ptr == NULL) + spread_row *copy = new spread_row(*spread_row_ptr); + if (copy == NULL) malloc_error(); - new_spread_row_ptr->char_vector = - (char **) PHRQ_malloc((size_t) spread_row_ptr->count * - sizeof(char *)); - if (new_spread_row_ptr->char_vector == NULL) - malloc_error(); - new_spread_row_ptr->d_vector = - (LDBLE *) PHRQ_malloc((size_t) spread_row_ptr->count * sizeof(LDBLE)); - if (new_spread_row_ptr->d_vector == NULL) - malloc_error(); - new_spread_row_ptr->type_vector = - (int *) PHRQ_malloc((size_t) spread_row_ptr->count * sizeof(int)); - if (new_spread_row_ptr->type_vector == NULL) - malloc_error(); - - for (i = 0; i < spread_row_ptr->count; i++) - { - new_spread_row_ptr->char_vector[i] = - string_duplicate(spread_row_ptr->char_vector[i]); - new_spread_row_ptr->d_vector[i] = spread_row_ptr->d_vector[i]; - new_spread_row_ptr->type_vector[i] = spread_row_ptr->type_vector[i]; - } - new_spread_row_ptr->count = spread_row_ptr->count; - new_spread_row_ptr->empty = spread_row_ptr->empty; - new_spread_row_ptr->number = spread_row_ptr->number; - new_spread_row_ptr->string = spread_row_ptr->string; - - return new_spread_row_ptr; + return copy; } - -/* ---------------------------------------------------------------------- */ -void Phreeqc:: -copy_defaults(class defaults *dest_ptr, class defaults *src_ptr) -/* ---------------------------------------------------------------------- */ -{ - int i; - dest_ptr->count_iso = src_ptr->count_iso; - dest_ptr->density = src_ptr->density; - dest_ptr->iso = - (class iso *) PHRQ_malloc(sizeof(class iso) * src_ptr->count_iso); - if (dest_ptr->iso == NULL) - { - malloc_error(); - } - else - { - for (i = 0; i < src_ptr->count_iso; i++) - { - dest_ptr->iso[i] = src_ptr->iso[i]; - dest_ptr->iso[i].name = string_duplicate(src_ptr->iso[i].name); - } - } - - dest_ptr->pe = src_ptr->pe; - dest_ptr->ph = src_ptr->ph; - dest_ptr->redox = string_duplicate(src_ptr->redox); - dest_ptr->temp = src_ptr->temp; - dest_ptr->units = string_duplicate(src_ptr->units); - dest_ptr->water = src_ptr->water; - dest_ptr->pressure = src_ptr->pressure; -} - #endif