diff --git a/phreeqcpp/NameDouble.cxx b/phreeqcpp/NameDouble.cxx index 27c8c3a5..d9ceb6eb 100644 --- a/phreeqcpp/NameDouble.cxx +++ b/phreeqcpp/NameDouble.cxx @@ -406,7 +406,7 @@ cxxNameDouble::add(const char *token, LDBLE total) // { char key[MAX_LENGTH]; - strcpy_s(key, MAX_LENGTH, token); + Utilities::strcpy_safe(key, MAX_LENGTH, token); cxxNameDouble::iterator current = (*this).find(key); if (current != (*this).end()) diff --git a/phreeqcpp/PBasic.cpp b/phreeqcpp/PBasic.cpp index 34e63041..86c60359 100644 --- a/phreeqcpp/PBasic.cpp +++ b/phreeqcpp/PBasic.cpp @@ -550,7 +550,7 @@ numtostr(char * Result, LDBLE n) l_s[i] = '\0'; * p2c: basic.p, line 248: * Note: Modification of string length may translate incorrectly [146] * - strcpy_s(Result, MAX_LENGTH, strltrim(l_s)); + Utilities::strcpy_safe(Result, MAX_LENGTH, strltrim(l_s)); return Result; } */ } @@ -1747,16 +1747,16 @@ void PBasic:: snerr(const char * l_s) { char str[MAX_LENGTH] = {0}; - strcpy_s(str, MAX_LENGTH, "Syntax_error "); + Utilities::strcpy_safe(str, MAX_LENGTH, "Syntax_error "); if (phreeqci_gui) { _ASSERTE(nIDErrPrompt == 0); nIDErrPrompt = IDS_ERR_SYNTAX; } - strcat_s(str, MAX_LENGTH, l_s); - strcat_s(str, MAX_LENGTH, " in line: "); + Utilities::strcat_safe(str, MAX_LENGTH, l_s); + Utilities::strcat_safe(str, MAX_LENGTH, " in line: "); if (strcmp(inbuf, "run")) - strcat_s(str, MAX_LENGTH, inbuf); + Utilities::strcat_safe(str, MAX_LENGTH, inbuf); errormsg(str); } @@ -1764,16 +1764,16 @@ void PBasic:: tmerr(const char * l_s) { char str[MAX_LENGTH] = {0}; - strcpy_s(str, MAX_LENGTH, "Type mismatch error"); + Utilities::strcpy_safe(str, MAX_LENGTH, "Type mismatch error"); if (phreeqci_gui) { _ASSERTE(nIDErrPrompt == 0); nIDErrPrompt = IDS_ERR_MISMATCH; } - strcat_s(str, MAX_LENGTH, l_s); - strcat_s(str, MAX_LENGTH, " in line: "); + Utilities::strcat_safe(str, MAX_LENGTH, l_s); + Utilities::strcat_safe(str, MAX_LENGTH, " in line: "); if (strcmp(inbuf, "run")) - strcat_s(str, MAX_LENGTH, inbuf); + Utilities::strcat_safe(str, MAX_LENGTH, inbuf); errormsg(str); } @@ -1902,8 +1902,8 @@ require(int k, struct LOC_exec *LINK) if (item == command_tokens.end()) snerr(": missing unknown command"); else { - strcpy_s(str, MAX_LENGTH, ": missing "); - strcat_s(str, MAX_LENGTH, item->first.c_str()); + Utilities::strcpy_safe(str, MAX_LENGTH, ": missing "); + Utilities::strcat_safe(str, MAX_LENGTH, item->first.c_str()); snerr(str); } #if !defined(R_SO) @@ -2546,7 +2546,7 @@ factor(struct LOC_exec * LINK) size_t l = elt_name.size(); l = l < 256 ? 256 : l + 1; char* token = (char*)PhreeqcPtr->PHRQ_malloc(l * sizeof(char)); - strcpy_s(token, l, elt_name.c_str()); + Utilities::strcpy_safe(token, l, elt_name.c_str()); *elt_varrec->UU.U1.sval = token; } break; @@ -6242,9 +6242,9 @@ exec(void) _ASSERTE(nIDErrPrompt == 0); nIDErrPrompt = IDS_ERR_ILLEGAL; } - strcat_s(STR1, MAX_LENGTH, "Illegal command in line: "); + Utilities::strcat_safe(STR1, MAX_LENGTH, "Illegal command in line: "); if (strcmp(inbuf, "run")) - strcat_s(STR1, MAX_LENGTH, inbuf); + Utilities::strcat_safe(STR1, MAX_LENGTH, inbuf); errormsg(STR1); break; } @@ -6394,7 +6394,7 @@ cmdplot_xy(struct LOC_exec *LINK) n[i] = expr(LINK); if (n[i].stringval) { - strcpy_s(STR[i], MAX_LENGTH, n[i].UU.sval); + Utilities::strcpy_safe(STR[i], MAX_LENGTH, n[i].UU.sval); PhreeqcPtr->PHRQ_free(n[i].UU.sval); } else diff --git a/phreeqcpp/Phreeqc.cpp b/phreeqcpp/Phreeqc.cpp index a081801b..817bfa26 100644 --- a/phreeqcpp/Phreeqc.cpp +++ b/phreeqcpp/Phreeqc.cpp @@ -14,6 +14,7 @@ #include "PBasic.h" #include "Temperature.h" #include "SSassemblage.h" +#include "Utils.h" #if defined(PHREEQCI_GUI) #ifdef _DEBUG @@ -173,7 +174,7 @@ size_t Phreeqc::list_components(std::list &list_c) { if (it->first == "Charge") continue; char string[MAX_LENGTH]; - strcpy_s(string, MAX_LENGTH, it->first.c_str()); + Utilities::strcpy_safe(string, MAX_LENGTH, it->first.c_str()); class master *master_ptr = master_bsearch_primary(string); if (master_ptr == NULL) continue; if (master_ptr->type != AQ) continue; diff --git a/phreeqcpp/System.cxx b/phreeqcpp/System.cxx index 5b6f6e7b..1456f77f 100644 --- a/phreeqcpp/System.cxx +++ b/phreeqcpp/System.cxx @@ -14,7 +14,7 @@ #include "cxxMix.h" #include "Reaction.h" #include "Temperature.h" - +#include "Utils.h" #if defined(PHREEQCI_GUI) #ifdef _DEBUG #define new DEBUG_NEW @@ -66,11 +66,11 @@ cxxSystem::totalize(Phreeqc * phreeqc_ptr) if (this->solution != NULL) { char token[MAX_LENGTH]; - strcpy_s(token, MAX_LENGTH, "O"); + Utilities::strcpy_safe(token, MAX_LENGTH, "O"); this->totals[token] = this->solution->Get_total_o(); - strcpy_s(token, MAX_LENGTH, "H"); + Utilities::strcpy_safe(token, MAX_LENGTH, "H"); this->totals[token] = this->solution->Get_total_h(); - strcpy_s(token, MAX_LENGTH, "Charge"); + Utilities::strcpy_safe(token, MAX_LENGTH, "Charge"); this->totals[token] = this->solution->Get_cb(); this->totals.add_extensive(this->solution->Get_totals(), 1.0); } diff --git a/phreeqcpp/basicsubs.cpp b/phreeqcpp/basicsubs.cpp index 645e915e..bf545b4f 100644 --- a/phreeqcpp/basicsubs.cpp +++ b/phreeqcpp/basicsubs.cpp @@ -705,7 +705,7 @@ calc_logk_n(const char* name) { l_logk[i] = 0.0; } - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); logk_ptr = logk_search(token); if (logk_ptr != NULL) { @@ -730,7 +730,7 @@ calc_logk_p(const char* name) LDBLE lk = -999.9; LDBLE l_logk[MAX_LOG_K_INDICES]; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); phase_ptr = phase_bsearch(token, &j, FALSE); if (phase_ptr != NULL) @@ -769,7 +769,7 @@ calc_logk_s(const char* name) class species* s_ptr; LDBLE lk, l_logk[MAX_LOG_K_INDICES]; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); s_ptr = s_search(token); if (s_ptr != NULL) { @@ -797,7 +797,7 @@ dh_a0(const char* name) class species* s_ptr; double a = -999.99; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); s_ptr = s_search(token); if (s_ptr != NULL) { @@ -819,7 +819,7 @@ dh_bdot(const char* name) } else { - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); s_ptr = s_search(token); if (s_ptr != NULL) { @@ -839,7 +839,7 @@ calc_deltah_p(const char* name) LDBLE lkm, lkp; LDBLE l_logk[MAX_LOG_K_INDICES]; double dh = -999.99; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); phase_ptr = phase_bsearch(token, &j, FALSE); if (phase_ptr != NULL) @@ -879,7 +879,7 @@ calc_deltah_s(const char* name) class species* s_ptr; LDBLE lkm, lkp, l_logk[MAX_LOG_K_INDICES]; double dh = -999.99; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); s_ptr = s_search(token); if (s_ptr != NULL) { @@ -929,7 +929,7 @@ calc_surface_charge(const char* surface_name) if (token_ptr->s->type != SURF) continue; master_ptr = trxn.token[i].s->primary; - strcpy_s(token, MAX_LENGTH, master_ptr->elt->name); + Utilities::strcpy_safe(token, MAX_LENGTH, master_ptr->elt->name); replace("_", " ", token); cptr = token; copy_token(token1, &cptr, &j); @@ -1237,7 +1237,7 @@ calc_t_sc(const char* name) char token[MAX_LENGTH]; class species* s_ptr; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); s_ptr = s_search(token); if (s_ptr != NULL && s_ptr->in) { @@ -1262,7 +1262,7 @@ calc_f_visc(const char* name) if (print_viscosity) { - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); s_ptr = s_search(token); if (s_ptr != NULL && s_ptr->in) return s_ptr->dw_t_visc; @@ -2111,7 +2111,7 @@ match_elts_in_species(const char* name, const char* mytemplate) char token1[MAX_LENGTH], template1[MAX_LENGTH], equal_list1[MAX_LENGTH]; char str[2]; - strcpy_s(token, MAX_LENGTH, name); + Utilities::strcpy_safe(token, MAX_LENGTH, name); squeeze_white(token); replace("(+", "(", token); if (strstr("token", "++") != NULL) @@ -2168,7 +2168,7 @@ match_elts_in_species(const char* name, const char* mytemplate) /* * Replace elements with first of equivalent elements */ - strcpy_s(template1, MAX_LENGTH, mytemplate); + Utilities::strcpy_safe(template1, MAX_LENGTH, mytemplate); squeeze_white(template1); cptr = template1; while (extract_bracket(&cptr, equal_list) == TRUE) @@ -2229,22 +2229,22 @@ match_elts_in_species(const char* name, const char* mytemplate) token[0] = '\0'; for (i = 0; i < count_match_tokens; i++) { - strcat_s(token, MAX_LENGTH, match_vector[i].first.c_str()); + Utilities::strcat_safe(token, MAX_LENGTH, match_vector[i].first.c_str()); if (match_vector[i].second != 1.0) { snprintf(token1, sizeof(token1), "%g", (double)match_vector[i].second); - strcat_s(token, MAX_LENGTH, token1); + Utilities::strcat_safe(token, MAX_LENGTH, token1); } } /* * Write a template name using first of equivalent elements */ - strcpy_s(template1, MAX_LENGTH, mytemplate); + Utilities::strcpy_safe(template1, MAX_LENGTH, mytemplate); squeeze_white(template1); cptr = template1; while (extract_bracket(&cptr, equal_list) == TRUE) { - strcpy_s(equal_list1, MAX_LENGTH, equal_list); + Utilities::strcpy_safe(equal_list1, MAX_LENGTH, equal_list); replace("{", "", equal_list); replace("}", "", equal_list); while (replace(",", " ", equal_list) == TRUE); @@ -2508,7 +2508,7 @@ surf_total_no_redox(const char* total_name, const char* surface_name) { if (x[j]->type != SURFACE) continue; - strcpy_s(token, MAX_LENGTH, x[j]->master[0]->elt->name); + Utilities::strcpy_safe(token, MAX_LENGTH, x[j]->master[0]->elt->name); replace("_", " ", token); cptr = token; copy_token(name, &cptr, &k); @@ -2524,7 +2524,7 @@ surf_total_no_redox(const char* total_name, const char* surface_name) } if (j >= count_unknowns) return (0); - strcpy_s(surface_name_local, MAX_LENGTH, name); + Utilities::strcpy_safe(surface_name_local, MAX_LENGTH, name); /* * find total moles of each element in diffuse layer... */ @@ -2538,7 +2538,7 @@ surf_total_no_redox(const char* total_name, const char* surface_name) { if (s_x[j]->next_elt[i].elt->master->type != SURF) continue; - strcpy_s(token, MAX_LENGTH, s_x[j]->next_elt[i].elt->name); + Utilities::strcpy_safe(token, MAX_LENGTH, s_x[j]->next_elt[i].elt->name); replace("_", " ", token); cptr = token; copy_token(name, &cptr, &k); @@ -3122,7 +3122,7 @@ system_total_elements(void) { t = master_ptr->total; } - strcpy_s(name, MAX_LENGTH, master[i]->elt->name); + Utilities::strcpy_safe(name, MAX_LENGTH, master[i]->elt->name); count_sys = sys.size(); sys.resize(count_sys + 1); sys[count_sys].name = string_duplicate(name); @@ -3169,7 +3169,7 @@ system_total_si(void) iap += rxn_ptr->s->la * rxn_ptr->coef; } si = -phases[i]->lk + iap; - strcpy_s(name, MAX_LENGTH, phases[i]->name); + Utilities::strcpy_safe(name, MAX_LENGTH, phases[i]->name); size_t count_sys = sys.size(); sys.resize(count_sys + 1); sys[count_sys].name = string_duplicate(name); @@ -3487,7 +3487,7 @@ system_total_elt(const char* total_name) { size_t count_sys = sys.size(); sys.resize(count_sys + 1); - strcpy_s(name, MAX_LENGTH, x[k]->master[0]->elt->name); + Utilities::strcpy_safe(name, MAX_LENGTH, x[k]->master[0]->elt->name); replace("_psi", "", name); sys[count_sys].name = string_duplicate(name); sys[count_sys].moles = elt_list[j].coef; @@ -3732,7 +3732,7 @@ system_total_elt_secondary(const char* total_name) } if (l >= count_elts) continue; - strcpy_s(name, MAX_LENGTH, x[k]->master[0]->elt->name); + Utilities::strcpy_safe(name, MAX_LENGTH, x[k]->master[0]->elt->name); replace("_psi", "", name); size_t count_sys = sys.size(); sys.resize(count_sys + 1); @@ -4047,8 +4047,8 @@ iso_value(const char* total_name) int j; char token[MAX_LENGTH]; char my_total_name[MAX_LENGTH]; - strcpy_s(token, MAX_LENGTH, ""); - strcpy_s(my_total_name, MAX_LENGTH, total_name); + Utilities::strcpy_safe(token, MAX_LENGTH, ""); + Utilities::strcpy_safe(my_total_name, MAX_LENGTH, total_name); while (replace(" ", "_", my_total_name)); for (j = 0; j < (int)isotope_ratio.size(); j++) { @@ -4058,12 +4058,12 @@ iso_value(const char* total_name) continue; return (isotope_ratio[j]->converted_ratio); } - strcpy_s(my_total_name, MAX_LENGTH, total_name); + Utilities::strcpy_safe(my_total_name, MAX_LENGTH, total_name); while (replace("[", "", my_total_name)); while (replace("]", "", my_total_name)); - strcat_s(token, MAX_LENGTH, "R("); - strcat_s(token, MAX_LENGTH, my_total_name); - strcat_s(token, MAX_LENGTH, ")"); + Utilities::strcat_safe(token, MAX_LENGTH, "R("); + Utilities::strcat_safe(token, MAX_LENGTH, my_total_name); + Utilities::strcat_safe(token, MAX_LENGTH, ")"); for (j = 0; j < (int)isotope_ratio.size(); j++) { if (isotope_ratio[j]->ratio == MISSING) @@ -4082,10 +4082,10 @@ iso_unit(const char* total_name) char token[MAX_LENGTH], unit[MAX_LENGTH]; class master_isotope* master_isotope_ptr; char my_total_name[MAX_LENGTH]; - strcpy_s(token, MAX_LENGTH, ""); - strcpy_s(my_total_name, MAX_LENGTH, total_name); + Utilities::strcpy_safe(token, MAX_LENGTH, ""); + Utilities::strcpy_safe(my_total_name, MAX_LENGTH, total_name); while (replace(" ", "_", my_total_name)); - strcpy_s(unit, MAX_LENGTH, "unknown"); + Utilities::strcpy_safe(unit, MAX_LENGTH, "unknown"); for (j = 0; j < (int)isotope_ratio.size(); j++) { if (isotope_ratio[j]->ratio == MISSING) @@ -4095,16 +4095,16 @@ iso_unit(const char* total_name) master_isotope_ptr = master_isotope_search(isotope_ratio[j]->isotope_name); if (master_isotope_ptr != NULL) { - strcpy_s(unit, MAX_LENGTH, master_isotope_ptr->units); + Utilities::strcpy_safe(unit, MAX_LENGTH, master_isotope_ptr->units); } return string_duplicate(unit); } - strcpy_s(my_total_name, MAX_LENGTH, total_name); + Utilities::strcpy_safe(my_total_name, MAX_LENGTH, total_name); while (replace("[", "", my_total_name)); while (replace("]", "", my_total_name)); - strcat_s(token, MAX_LENGTH, "R("); - strcat_s(token, MAX_LENGTH, my_total_name); - strcat_s(token, MAX_LENGTH, ")"); + Utilities::strcat_safe(token, MAX_LENGTH, "R("); + Utilities::strcat_safe(token, MAX_LENGTH, my_total_name); + Utilities::strcat_safe(token, MAX_LENGTH, ")"); for (j = 0; j < (int)isotope_ratio.size(); j++) { if (isotope_ratio[j]->ratio == MISSING) @@ -4114,7 +4114,7 @@ iso_unit(const char* total_name) master_isotope_ptr = master_isotope_search(isotope_ratio[j]->isotope_name); if (master_isotope_ptr != NULL) { - strcpy_s(unit, MAX_LENGTH, master_isotope_ptr->units); + Utilities::strcpy_safe(unit, MAX_LENGTH, master_isotope_ptr->units); } return string_duplicate(unit); } diff --git a/phreeqcpp/common/Utils.cxx b/phreeqcpp/common/Utils.cxx index 72fc8c2d..1eafd439 100644 --- a/phreeqcpp/common/Utils.cxx +++ b/phreeqcpp/common/Utils.cxx @@ -181,6 +181,57 @@ Utilities::safe_exp(LDBLE t) } return exp(t); } +size_t Utilities:: +strcpy_safe(char* dest, size_t max, const char* src) +{ + size_t lsrc = 0; + try + { + if (dest == nullptr || src == nullptr) + { + std::cerr << "nullptr in Utilities::strcpy_safe." << std::endl; + throw; + } + lsrc = strlen(src); + if (lsrc + 1 > max) + { + std::cerr << "Buffer overrun in Utilities::strcpy_safe." << std::endl; + throw; + } + memcpy(dest, src, (lsrc + 1) * sizeof(char)); + } + catch (...) + { + throw; + } + return lsrc; +} +size_t Utilities:: +strcat_safe(char* dest, size_t max, const char* src) +{ + size_t ldest = 0, lsrc = 0; + try + { + if (dest == nullptr || src == nullptr) + { + std::cerr << "nullptr in Utilities::strcat_safe." << std::endl; + throw; + } + lsrc = strlen(src); + ldest = strlen(dest); + if (ldest + lsrc + 1 > max) + { + std::cerr << "Buffer overrun in Utilities::strcat_safe." << std::endl; + throw; + } + memcpy(&dest[ldest], src, (lsrc + 1) * sizeof(char)); + } + catch (...) + { + throw; + } + return ldest + lsrc; +} //+NAN LDBLE: 7ff8000000000000 //-NAN LDBLE: fff8000000000000 /* diff --git a/phreeqcpp/common/Utils.h b/phreeqcpp/common/Utils.h index 74997731..3eb93676 100644 --- a/phreeqcpp/common/Utils.h +++ b/phreeqcpp/common/Utils.h @@ -20,7 +20,8 @@ namespace Utilities void str_toupper(std::string & str); std::string pad_right(const std::string & str, size_t l); bool replace(const char *str1, const char *str2, std::string & str); - + size_t strcat_safe(char* dest, size_t max, const char* src); + size_t strcpy_safe(char* dest, size_t max, const char* src); void squeeze_white(std::string & s_l); double convert_time(double t, std::string in, std::string out); LDBLE safe_exp(LDBLE t); diff --git a/phreeqcpp/input.cpp b/phreeqcpp/input.cpp index ee844ca0..7235f4ef 100644 --- a/phreeqcpp/input.cpp +++ b/phreeqcpp/input.cpp @@ -127,7 +127,7 @@ get_line(void) if (line == NULL) malloc_error(); } - strcpy_s(line, max_line, phrq_io->Get_m_line().c_str()); - strcpy_s(line_save, max_line, phrq_io->Get_m_line_save().c_str()); + Utilities::strcpy_safe(line, max_line, phrq_io->Get_m_line().c_str()); + Utilities::strcpy_safe(line_save, max_line, phrq_io->Get_m_line_save().c_str()); return j; } diff --git a/phreeqcpp/inverse.cpp b/phreeqcpp/inverse.cpp index 7ecb66d4..a25b8a2c 100644 --- a/phreeqcpp/inverse.cpp +++ b/phreeqcpp/inverse.cpp @@ -54,10 +54,10 @@ inverse_models(void) */ if (inverse[n].pat != NULL) { - strcpy_s(string, MAX_LENGTH, inverse[n].pat); + Utilities::strcat_safe(string, MAX_LENGTH, inverse[n].pat); if (replace(".pat", ".pat", string) != TRUE) { - strcat_s(string, strlen(string), ".pat"); + Utilities::strcat_safe(string, strlen(string), ".pat"); } netpath_file = fopen(string, "w"); if (netpath_file == NULL) @@ -4174,11 +4174,11 @@ print_total_multi(FILE * l_netpath_file, cxxSolution *solution_ptr, LDBLE sum; int i, found; - strcpy_s(elts[0], MAX_LENGTH, elt0); - strcpy_s(elts[1], MAX_LENGTH, elt1); - strcpy_s(elts[2], MAX_LENGTH, elt2); - strcpy_s(elts[3], MAX_LENGTH, elt3); - strcpy_s(elts[4], MAX_LENGTH, elt4); + Utilities::strcat_safe(elts[0], MAX_LENGTH, elt0); + Utilities::strcat_safe(elts[1], MAX_LENGTH, elt1); + Utilities::strcat_safe(elts[2], MAX_LENGTH, elt2); + Utilities::strcat_safe(elts[3], MAX_LENGTH, elt3); + Utilities::strcat_safe(elts[4], MAX_LENGTH, elt4); sum = 0; diff --git a/phreeqcpp/isotopes.cpp b/phreeqcpp/isotopes.cpp index e6900c98..316fdef5 100644 --- a/phreeqcpp/isotopes.cpp +++ b/phreeqcpp/isotopes.cpp @@ -1,6 +1,7 @@ #include "Phreeqc.h" #include "phqalloc.h" #include "Solution.h" +#include "Utils.h" #if defined(PHREEQCI_GUI) #ifdef _DEBUG @@ -982,7 +983,7 @@ print_isotope_ratios(void) /* * Print isotope ratio */ - strcpy_s(token, MAX_LENGTH, isotope_ratio[j]->name); + Utilities::strcpy_safe(token, MAX_LENGTH, isotope_ratio[j]->name); while (replace("_", " ", token) == TRUE); output_msg(sformatf( " %-20s\t%12.5e\t%15.5g %-10s\n", token, (double) isotope_ratio[j]->ratio, @@ -1045,7 +1046,7 @@ print_isotope_alphas(void) /* * Print isotope ratio */ - strcpy_s(token, MAX_LENGTH, isotope_alpha[j]->name); + Utilities::strcpy_safe(token, MAX_LENGTH, isotope_alpha[j]->name); while (replace("_", " ", token) == TRUE); if (isotope_alpha[j]->named_logk != NULL) { diff --git a/phreeqcpp/nvector_serial.cpp b/phreeqcpp/nvector_serial.cpp index 5c1ddfaf..4227b899 100644 --- a/phreeqcpp/nvector_serial.cpp +++ b/phreeqcpp/nvector_serial.cpp @@ -67,6 +67,7 @@ #include "nvector_serial.h" #include "sundialstypes.h" #include "sundialsmath.h" +#include "Utils.h" /* WARNING don`t include any headers below here */ @@ -173,7 +174,7 @@ M_EnvInit_Serial(integertype vec_length) me->ops->nvprint = N_VPrint_Serial; /* Attach ID tag */ - strcpy_s(me->tag, 8, ID_TAG_S); + Utilities::strcpy_safe(me->tag, 8, ID_TAG_S); return (me); diff --git a/phreeqcpp/parse.cpp b/phreeqcpp/parse.cpp index 2fed3fe5..96b78acc 100644 --- a/phreeqcpp/parse.cpp +++ b/phreeqcpp/parse.cpp @@ -1,5 +1,6 @@ #include "Phreeqc.h" #include "phqalloc.h" +#include "Utils.h" #if defined(PHREEQCI_GUI) #ifdef _DEBUG @@ -133,7 +134,7 @@ parse_eq(char* eqn, std::vector& new_elt_list, int association) * Get elements in species or mineral formula */ count_elts = 0; - strcpy_s(token, MAX_LENGTH, trxn.token[0].name); + Utilities::strcpy_safe(token, MAX_LENGTH, trxn.token[0].name); replace("(s)", "", token); replace("(S)", "", token); replace("(g)", "", token); diff --git a/phreeqcpp/print.cpp b/phreeqcpp/print.cpp index a0c51b9c..e372db9b 100644 --- a/phreeqcpp/print.cpp +++ b/phreeqcpp/print.cpp @@ -321,7 +321,7 @@ print_diffuse_layer(cxxSurfaceCharge *charge_ptr) add_elt_list(s_x[j]->next_elt, moles_surface); } /* - strcpy_s(token, MAX_LENGTH, s_h2o->name); + Utilities::strcpy_safe(token, MAX_LENGTH, s_h2o->name); ptr = &(token[0]); get_elts_in_species (&ptr, mass_water_surface / gfw_water); */ @@ -427,9 +427,9 @@ print_eh(void) /* * Print result */ - strcpy_s(token, MAX_LENGTH, master[i]->elt->name); - strcat_s(token, MAX_LENGTH, "/"); - strcat_s(token, MAX_LENGTH, master[k]->elt->name); + Utilities::strcpy_safe(token, MAX_LENGTH, master[i]->elt->name); + Utilities::strcat_safe(token, MAX_LENGTH, "/"); + Utilities::strcat_safe(token, MAX_LENGTH, master[k]->elt->name); output_msg(sformatf("\t%-15s%12.4f%12.4f\n", token, (double) pe, (double) eh)); } @@ -2904,34 +2904,34 @@ punch_identifiers(void) switch (state) { case 0: - strcpy_s(token, MAX_LENGTH, "init"); + Utilities::strcpy_safe(token, MAX_LENGTH, "init"); break; case 1: - strcpy_s(token, MAX_LENGTH, "i_soln"); + Utilities::strcpy_safe(token, MAX_LENGTH, "i_soln"); break; case 2: - strcpy_s(token, MAX_LENGTH, "i_exch"); + Utilities::strcpy_safe(token, MAX_LENGTH, "i_exch"); break; case 3: - strcpy_s(token, MAX_LENGTH, "i_surf"); + Utilities::strcpy_safe(token, MAX_LENGTH, "i_surf"); break; case 4: - strcpy_s(token, MAX_LENGTH, "i_gas"); + Utilities::strcpy_safe(token, MAX_LENGTH, "i_gas"); break; case 5: - strcpy_s(token, MAX_LENGTH, "react"); + Utilities::strcpy_safe(token, MAX_LENGTH, "react"); break; case 6: - strcpy_s(token, MAX_LENGTH, "inverse"); + Utilities::strcpy_safe(token, MAX_LENGTH, "inverse"); break; case 7: - strcpy_s(token, MAX_LENGTH, "advect"); + Utilities::strcpy_safe(token, MAX_LENGTH, "advect"); break; case 8: - strcpy_s(token, MAX_LENGTH, "transp"); + Utilities::strcpy_safe(token, MAX_LENGTH, "transp"); break; default: - strcpy_s(token, MAX_LENGTH, "unknown"); + Utilities::strcpy_safe(token, MAX_LENGTH, "unknown"); break; } fpunchf(PHAST_NULL("state"), sformat, token); diff --git a/phreeqcpp/read.cpp b/phreeqcpp/read.cpp index 663b0eb0..2ac1bea7 100644 --- a/phreeqcpp/read.cpp +++ b/phreeqcpp/read.cpp @@ -1097,7 +1097,7 @@ read_exchange_master_species(void) if (token[0] == '[') { cptr1 = token; get_elt(&cptr, element, &l); - strcpy_s(token, MAX_LENGTH, element); + Utilities::strcpy_safe(token, MAX_LENGTH, element); } */ replace("(+", "(", token); @@ -1752,7 +1752,7 @@ read_inv_phases(class inverse *inverse_ptr, const char* cptr) j = copy_token(token, &cptr, &l); if (j == EMPTY) break; - strcpy_s(token1, MAX_LENGTH, token); + Utilities::strcpy_safe(token1, MAX_LENGTH, token); str_tolower(token1); if (token1[0] == 'p') { @@ -3107,7 +3107,7 @@ read_master_species(void) if (token[0] == '[') { cptr1 = token; get_elt(&cptr, element, &l); - strcpy_s(token, MAX_LENGTH, element); + Utilities::strcpy_safe(token, MAX_LENGTH, element); } */ replace("(+", "(", token); @@ -3726,7 +3726,7 @@ read_phases(void) /* * Get pointer to each species in the reaction, store new species if necessary */ - strcpy_s(token1, MAX_LENGTH, trxn.token[0].name); + Utilities::strcpy_safe(token1, MAX_LENGTH, trxn.token[0].name); replace("(g)", "", token1); replace("(s)", "", token1); replace("(G)", "", token1); @@ -3739,7 +3739,7 @@ read_phases(void) (strstr(trxn.token[i].name, "(S)") == NULL) && (strstr(trxn.token[i].name, "(G)") == NULL)) { - strcpy_s(token1, MAX_LENGTH, trxn.token[i].name); + Utilities::strcpy_safe(token1, MAX_LENGTH, trxn.token[i].name); replace("(aq)", "", token1); replace("(AQ)", "", token1); replace("H2O(l)", "H2O", token1); @@ -5737,7 +5737,7 @@ read_use(void) /* * Read number */ - strcpy_s(token1, MAX_LENGTH, token); + Utilities::strcpy_safe(token1, MAX_LENGTH, token); for (;;) { i = copy_token(token, &cptr, &l); @@ -7013,16 +7013,16 @@ read_surface_master_species(void) master[count_master]->s = s_store(token1.c_str(), l_z, FALSE); } master[count_master]->primary = TRUE; - strcpy_s(token, MAX_LENGTH, master[count_master]->elt->name); + Utilities::strcpy_safe(token, MAX_LENGTH, master[count_master]->elt->name); count_master++; /* * Save values in master and species structure for surface psi */ - strcpy_s(token1, MAX_LENGTH, token); + Utilities::strcpy_safe(token1, MAX_LENGTH, token); replace("_", " ", token1); cptr1 = token1; copy_token(token, &cptr1, &l); - strcat_s(token, MAX_LENGTH, "_psi"); + Utilities::strcat_safe(token, MAX_LENGTH, "_psi"); add_psi_master_species(token); opt_save = OPTION_DEFAULT; break; @@ -7043,7 +7043,7 @@ add_psi_master_species(char *token) const char* cptr; char token1[MAX_LENGTH] = ""; int i, n, plane; - strcpy_s(token1, MAX_LENGTH, token); + Utilities::strcpy_safe(token1, MAX_LENGTH, token); for (plane = SURF_PSI; plane <= SURF_PSI2; plane++) { strcpy(token, token1); @@ -9480,7 +9480,7 @@ read_copy(void) switch (next_keyword) { case Keywords::KEY_NONE: /* Have not read line with keyword */ - strcpy_s(nonkeyword, MAX_LENGTH, token); + Utilities::strcpy_safe(nonkeyword, MAX_LENGTH, token); break; case Keywords::KEY_SOLUTION: /* Solution */ case Keywords::KEY_EQUILIBRIUM_PHASES: /* Pure phases */ @@ -9507,7 +9507,7 @@ read_copy(void) /* * Read source index */ - strcpy_s(token1, MAX_LENGTH, token); + Utilities::strcpy_safe(token1, MAX_LENGTH, token); i = copy_token(token, &cptr, &l); if (i == DIGIT) { @@ -9727,8 +9727,8 @@ cleanup_after_parser(CParser &parser) // check_key sets next_keyword if (parser.get_m_line_type() == PHRQ_io::LT_EOF) { - strcpy_s(line, max_line, ""); - strcpy_s(line_save, max_line, ""); + Utilities::strcpy_safe(line, max_line, ""); + Utilities::strcpy_safe(line_save, max_line, ""); next_keyword = Keywords::KEY_END; return(TRUE); } @@ -9750,8 +9750,8 @@ cleanup_after_parser(CParser &parser) if (line == NULL) malloc_error(); } - strcpy_s(line, max_line, parser.line().c_str()); - strcpy_s(line_save, max_line, parser.line_save().c_str()); + Utilities::strcpy_safe(line, max_line, parser.line().c_str()); + Utilities::strcpy_safe(line_save, max_line, parser.line_save().c_str()); return return_value; } /* ---------------------------------------------------------------------- */ diff --git a/phreeqcpp/step.cpp b/phreeqcpp/step.cpp index fcef4671..bd960b36 100644 --- a/phreeqcpp/step.cpp +++ b/phreeqcpp/step.cpp @@ -707,13 +707,13 @@ add_pp_assemblage(cxxPPassemblage *pp_assemblage_ptr) comp_ptr->Set_delta(0.0); if (comp_ptr->Get_add_formula().size() > 0) { - strcpy_s(token, MAX_LENGTH, comp_ptr->Get_add_formula().c_str()); + Utilities::strcpy_safe(token, MAX_LENGTH, comp_ptr->Get_add_formula().c_str()); cptr = &(token[0]); get_elts_in_species(&cptr, 1.0); } else { - strcpy_s(token, MAX_LENGTH, phase_ptr->formula); + Utilities::strcpy_safe(token, MAX_LENGTH, phase_ptr->formula); add_elt_list(phase_ptr->next_elt, 1.0); } if (comp_ptr->Get_moles() > 0.0) diff --git a/phreeqcpp/tally.cpp b/phreeqcpp/tally.cpp index 98dc009d..5f703e93 100644 --- a/phreeqcpp/tally.cpp +++ b/phreeqcpp/tally.cpp @@ -914,13 +914,13 @@ build_tally_table(void) paren_count = 0; if (comp_ptr->Get_add_formula().size() > 0) { - strcpy_s(token, MAX_LENGTH, comp_ptr->Get_add_formula().c_str()); + Utilities::strcpy_safe(token, MAX_LENGTH, comp_ptr->Get_add_formula().c_str()); cptr = &(token[0]); get_elts_in_species(&cptr, 1.0); } else { - strcpy_s(token, MAX_LENGTH, phase_ptr->formula); + Utilities::strcpy_safe(token, MAX_LENGTH, phase_ptr->formula); add_elt_list(phase_ptr->next_elt, 1.0); } elt_list_combine(); @@ -971,7 +971,7 @@ build_tally_table(void) tally_table[n].type = Ss_phase; count_elts = 0; paren_count = 0; - strcpy_s(token, MAX_LENGTH, phase_ptr->formula); + Utilities::strcpy_safe(token, MAX_LENGTH, phase_ptr->formula); add_elt_list(phase_ptr->next_elt, 1.0); elt_list_combine(); tally_table[n].formula = elt_list_vsave(); @@ -1019,7 +1019,7 @@ build_tally_table(void) phase_ptr = NULL; if (kinetics_comp_ptr->Get_namecoef().size() == 1) { - strcpy_s(token, MAX_LENGTH, kinetics_comp_ptr->Get_namecoef().begin()->first.c_str()); + Utilities::strcpy_safe(token, MAX_LENGTH, kinetics_comp_ptr->Get_namecoef().begin()->first.c_str()); phase_ptr = phase_bsearch(token, &p, FALSE); } if (phase_ptr != NULL) diff --git a/phreeqcpp/tidy.cpp b/phreeqcpp/tidy.cpp index f9d9228e..5769b4f5 100644 --- a/phreeqcpp/tidy.cpp +++ b/phreeqcpp/tidy.cpp @@ -819,7 +819,7 @@ replace_solids_gases(void) /* try phase name without (g) or (s) */ if (phase_ptr == NULL) { - strcpy_s(token, MAX_LENGTH, token_ptr->name); + Utilities::strcpy_safe(token, MAX_LENGTH, token_ptr->name); replace("(g)", "", token); replace("(s)", "", token); replace("(G)", "", token); @@ -2013,8 +2013,8 @@ tidy_punch(void) " %s.", pair_ref.first.c_str()); warning_msg(error_string); } - // strcpy_s(token, MAX_LENGTH, "m_"); - //strcat_s(token, punch.molalities[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "m_"); + //Utilities::strcat_safe(token, punch.molalities[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); //if (punch.molalities[i].s == NULL) //{ @@ -2039,8 +2039,8 @@ tidy_punch(void) " %s.", pair_ref.first.c_str()); warning_msg(error_string); } - // strcpy_s(token, MAX_LENGTH, "la_"); - //strcat_s(token, punch.activities[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "la_"); + //Utilities::strcat_safe(token, punch.activities[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); //if (punch.activities[i].s == NULL) //{ @@ -2066,8 +2066,8 @@ tidy_punch(void) " %s.", pair_ref.first.c_str()); warning_msg(error_string); } - // strcpy_s(token, MAX_LENGTH, "d_"); - //strcat_s(token, punch.pure_phases[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "d_"); + //Utilities::strcat_safe(token, punch.pure_phases[i].name); //fpunchf_heading(sformatf("%*s\t", l, punch.pure_phases[i].name)); //fpunchf_heading(sformatf("%*s\t", l, token)); //if (punch.pure_phases[i].phase == NULL) @@ -2093,8 +2093,8 @@ tidy_punch(void) " %s.", pair_ref.first.c_str()); warning_msg(error_string); } - // strcpy_s(token, MAX_LENGTH, "si_"); - //strcat_s(token, punch.si[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "si_"); + //Utilities::strcat_safe(token, punch.si[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); //if (punch.si[i].phase == NULL) //{ @@ -2126,8 +2126,8 @@ tidy_punch(void) " %s.", pair_ref.first.c_str()); warning_msg(error_string); } - // strcpy_s(token, MAX_LENGTH, "g_"); - //strcat_s(token, punch.gases[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "g_"); + //Utilities::strcat_safe(token, punch.gases[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); //if (punch.gases[i].phase == NULL) //{ @@ -2149,11 +2149,11 @@ tidy_punch(void) name = "dk_"; name.append(pair_ref.first); fpunchf_heading(sformatf("%*s\t", l, name.c_str())); - // strcpy_s(token, MAX_LENGTH, "k_"); - //strcat_s(token, punch.kinetics[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "k_"); + //Utilities::strcat_safe(token, punch.kinetics[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); - // strcpy_s(token, MAX_LENGTH, "dk_"); - //strcat_s(token, punch.kinetics[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "dk_"); + //Utilities::strcat_safe(token, punch.kinetics[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); } @@ -2166,8 +2166,8 @@ tidy_punch(void) std::string name = "s_"; name.append(pair_ref.first); fpunchf_heading(sformatf("%*s\t", l, name.c_str())); - // strcpy_s(token, MAX_LENGTH, "s_"); - //strcat_s(token, punch.s_s[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "s_"); + //Utilities::strcat_safe(token, punch.s_s[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); } @@ -2196,8 +2196,8 @@ tidy_punch(void) // punch.isotopes[i].name, punch.isotopes[i].name); // warning_msg(error_string); //} - // strcpy_s(token, MAX_LENGTH, "I_"); - //strcat_s(token, punch.isotopes[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "I_"); + //Utilities::strcat_safe(token, punch.isotopes[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); } @@ -2227,8 +2227,8 @@ tidy_punch(void) // punch.calculate_values[i].name); // warning_msg(error_string); //} - // strcpy_s(token, MAX_LENGTH, "V_"); - //strcat_s(token, punch.calculate_values[i].name); + // Utilities::strcpy_safe(token, MAX_LENGTH, "V_"); + //Utilities::strcat_safe(token, punch.calculate_values[i].name); //fpunchf_heading(sformatf("%*s\t", l, token)); } diff --git a/phreeqcpp/transport.cpp b/phreeqcpp/transport.cpp index 17c8bd35..0bd3d649 100644 --- a/phreeqcpp/transport.cpp +++ b/phreeqcpp/transport.cpp @@ -1784,7 +1784,7 @@ set_initial_moles(int i) cxxExchComp comp; count_elts = 0; paren_count = 0; - strcpy_s(token, MAX_LENGTH, "X"); + Utilities::strcpy_safe(token, MAX_LENGTH, "X"); cptr = token; get_elts_in_species(&cptr, 2e-10); cptr = token; diff --git a/phreeqcpp/utilities.cpp b/phreeqcpp/utilities.cpp index 8f18a74f..79dfae7f 100644 --- a/phreeqcpp/utilities.cpp +++ b/phreeqcpp/utilities.cpp @@ -233,7 +233,7 @@ compute_gfw(const char *string, LDBLE * gfw) count_elts = 0; paren_count = 0; - strcpy_s(token, MAX_LENGTH, string); + Utilities::strcpy_safe(token, MAX_LENGTH, string); cptr = token; if (get_elts_in_species(&cptr, 1.0) == ERROR) { @@ -654,7 +654,7 @@ print_centered(const char *string) for (i = 0; i < l1; i++) token[i] = '-'; token[i] = '\0'; - strcat_s(token, MAX_LENGTH, string); + Utilities::strcat_safe(token, MAX_LENGTH, string); for (i = 0; i < l2; i++) token[i + l1 + l] = '-'; token[79] = '\0';