Merge commit '62c51bb410b3f9fd18cc5a21b5341e9652089d86'

This commit is contained in:
Darth Vader 2021-03-06 01:42:53 +00:00
commit 606942c6ed
4 changed files with 165 additions and 133 deletions

View File

@ -1443,6 +1443,7 @@ listtokens(FILE * f, tokenrec * l_buf)
output_msg("TRIM"); output_msg("TRIM");
break; break;
case tokpad_:
case tokpad: case tokpad:
output_msg("PAD"); output_msg("PAD");
break; break;
@ -2639,6 +2640,7 @@ factor(struct LOC_exec * LINK)
n.UU.sval = (parse_all) ? PhreeqcPtr->string_duplicate("unknown") : PhreeqcPtr->iso_unit(STR1.c_str()); n.UU.sval = (parse_all) ? PhreeqcPtr->string_duplicate("unknown") : PhreeqcPtr->iso_unit(STR1.c_str());
break; break;
case tokpad_:
case tokpad: case tokpad:
n.stringval = true; n.stringval = true;
require(toklp, LINK); require(toklp, LINK);
@ -2664,145 +2666,157 @@ factor(struct LOC_exec * LINK)
break; break;
case toksys: case toksys:
require(toklp, LINK);
elt_name = stringfactor(STR1, LINK);
/*
* Parse arguments
*/
if (LINK->t != NULL && LINK->t->kind == tokcomma)
{ {
/* return number of species */ int isort = 0;
LINK->t = LINK->t->next; require(toklp, LINK);
count_varrec = LINK->t->UU.vp; elt_name = stringfactor(STR1, LINK);
if (LINK->t->kind != tokvar || !count_varrec || count_varrec->stringvar != 0) /*
* Parse arguments
*/
if (LINK->t != NULL && LINK->t->kind == tokcomma)
{ {
snerr(": can`t find variable"); /* return number of species */
#if !defined(R_SO) LINK->t = LINK->t->next;
exit(4); count_varrec = LINK->t->UU.vp;
#endif if (LINK->t->kind != tokvar || !count_varrec || count_varrec->stringvar != 0)
{
snerr(": can`t find variable");
#if !defined(R_SO)
exit(4);
#endif
}
/* return number of names of species */
LINK->t = LINK->t->next;
require(tokcomma, LINK);
names_varrec = LINK->t->UU.vp;
if (LINK->t->kind != tokvar || !names_varrec || names_varrec->stringvar != 1)
{
snerr(": can`t find name of species");
#if !defined(R_SO)
exit(4);
#endif
}
/* return number of types of species */
LINK->t = LINK->t->next;
require(tokcomma, LINK);
types_varrec = LINK->t->UU.vp;
if (LINK->t->kind != tokvar || types_varrec->stringvar != 1)
snerr(": can`t find type of species");
/* return number of moles of species */
LINK->t = LINK->t->next;
require(tokcomma, LINK);
moles_varrec = LINK->t->UU.vp;
if (LINK->t->kind != tokvar || moles_varrec->stringvar != 0)
snerr(": can`t find moles of species");
LINK->t = LINK->t->next;
if (LINK->t != NULL && LINK->t->kind == tokcomma)
{
LINK->t = LINK->t->next;
isort = intexpr(LINK);
arg_num = 5;
}
else
{
arg_num = 4;
}
}
else
{
arg_num = 1;
}
require(tokrp, LINK);
if (arg_num > 1)
{
free_dim_stringvar(names_varrec);
free_dim_stringvar(types_varrec);
PhreeqcPtr->free_check_null(moles_varrec->UU.U0.arr);
moles_varrec->UU.U0.arr = NULL;
}
/*
* Call subroutine
*/
/*
n.UU.val = system_total(elt_name, count_varrec->UU.U0.val, &(names_varrec->UU.U1.sarr), &(types_varrec->UU.U1.sarr), &(moles_varrec->UU.U0.arr));
*/
if (parse_all)
{
PhreeqcPtr->sys_tot = 0;
PhreeqcPtr->count_sys = 1000;
int count_sys = PhreeqcPtr->count_sys;
names_arg = (char**)PhreeqcPtr->PHRQ_calloc((size_t)(count_sys + 1), sizeof(char*));
if (names_arg == NULL)
{
PhreeqcPtr->malloc_error();
#if !defined(R_SO)
exit(4);
#endif
}
types_arg = (char**)PhreeqcPtr->PHRQ_calloc((size_t)(count_sys + 1), sizeof(char*));
if (types_arg == NULL)
{
PhreeqcPtr->malloc_error();
#if !defined(R_SO)
exit(4);
#endif
}
moles_arg = (LDBLE*)PhreeqcPtr->PHRQ_calloc((size_t)(count_sys + 1), sizeof(LDBLE));
if (moles_arg == NULL)
{
PhreeqcPtr->malloc_error();
#if !defined(R_SO)
exit(4);
#endif
}
names_arg[0] = NULL;
types_arg[0] = NULL;
moles_arg[0] = 0;
count_species = (LDBLE)count_sys;
n.UU.val = 0;
}
else
{
n.UU.val = PhreeqcPtr->system_total(elt_name, &count_species, &(names_arg),
&(types_arg), &(moles_arg), isort);
} }
/* return number of names of species */ /*
LINK->t = LINK->t->next; * fill in varrec structure
require(tokcomma, LINK); */
names_varrec = LINK->t->UU.vp; if (arg_num > 1)
if (LINK->t->kind != tokvar || !names_varrec || names_varrec->stringvar != 1)
{ {
snerr(": can`t find name of species"); *count_varrec->UU.U0.val = count_species;
#if !defined(R_SO) names_varrec->UU.U1.sarr = names_arg;
exit(4); types_varrec->UU.U1.sarr = types_arg;
#endif moles_varrec->UU.U0.arr = moles_arg;
}
/* return number of types of species */ for (i = 0; i < maxdims; i++)
LINK->t = LINK->t->next; {
require(tokcomma, LINK); names_varrec->dims[i] = 0;
types_varrec = LINK->t->UU.vp; types_varrec->dims[i] = 0;
if (LINK->t->kind != tokvar || types_varrec->stringvar != 1) moles_varrec->dims[i] = 0;
snerr(": can`t find type of species"); }
names_varrec->dims[0] = (long)(*count_varrec->UU.U0.val) + 1;
/* return number of moles of species */ types_varrec->dims[0] = (long)(*count_varrec->UU.U0.val) + 1;
LINK->t = LINK->t->next; moles_varrec->dims[0] = (long)(*count_varrec->UU.U0.val) + 1;
require(tokcomma, LINK); names_varrec->numdims = 1;
moles_varrec = LINK->t->UU.vp; types_varrec->numdims = 1;
if (LINK->t->kind != tokvar || moles_varrec->stringvar != 0) moles_varrec->numdims = 1;
snerr(": can`t find moles of species");
LINK->t = LINK->t->next;
arg_num = 4;
}
else
{
arg_num = 1;
}
require(tokrp, LINK);
if (arg_num > 1)
{
free_dim_stringvar(names_varrec);
free_dim_stringvar(types_varrec);
PhreeqcPtr->free_check_null(moles_varrec->UU.U0.arr);
moles_varrec->UU.U0.arr = NULL;
}
/*
* Call subroutine
*/
/*
n.UU.val = system_total(elt_name, count_varrec->UU.U0.val, &(names_varrec->UU.U1.sarr), &(types_varrec->UU.U1.sarr), &(moles_varrec->UU.U0.arr));
*/
if (parse_all)
{
PhreeqcPtr->sys_tot = 0;
PhreeqcPtr->count_sys = 1000;
int count_sys = PhreeqcPtr->count_sys;
names_arg = (char **) PhreeqcPtr->PHRQ_calloc((size_t) (count_sys + 1), sizeof(char *));
if (names_arg == NULL)
{
PhreeqcPtr->malloc_error();
#if !defined(R_SO)
exit(4);
#endif
} }
types_arg = (char **)PhreeqcPtr->PHRQ_calloc((size_t) (count_sys + 1), sizeof(char *)); else
if (types_arg == NULL)
{ {
PhreeqcPtr->malloc_error(); for (i = 0; i < count_species + 1; i++)
#if !defined(R_SO) {
exit(4); PhreeqcPtr->free_check_null(names_arg[i]);
#endif PhreeqcPtr->free_check_null(types_arg[i]);
}
PhreeqcPtr->free_check_null(names_arg);
PhreeqcPtr->free_check_null(types_arg);
PhreeqcPtr->free_check_null(moles_arg);
} }
moles_arg = (LDBLE *) PhreeqcPtr->PHRQ_calloc((size_t) (count_sys + 1), sizeof(LDBLE));
if (moles_arg == NULL)
{
PhreeqcPtr->malloc_error();
#if !defined(R_SO)
exit(4);
#endif
}
names_arg[0] = NULL;
types_arg[0] = NULL;
moles_arg[0] = 0;
count_species = (LDBLE) count_sys;
n.UU.val = 0;
}
else
{
n.UU.val = PhreeqcPtr->system_total(elt_name, &count_species, &(names_arg),
&(types_arg), &(moles_arg));
}
/*
* fill in varrec structure
*/
if (arg_num > 1)
{
*count_varrec->UU.U0.val = count_species;
names_varrec->UU.U1.sarr = names_arg;
types_varrec->UU.U1.sarr = types_arg;
moles_varrec->UU.U0.arr = moles_arg;
for (i = 0; i < maxdims; i++)
{
names_varrec->dims[i] = 0;
types_varrec->dims[i] = 0;
moles_varrec->dims[i] = 0;
}
names_varrec->dims[0] = (long) (*count_varrec->UU.U0.val) + 1;
types_varrec->dims[0] = (long) (*count_varrec->UU.U0.val) + 1;
moles_varrec->dims[0] = (long) (*count_varrec->UU.U0.val) + 1;
names_varrec->numdims = 1;
types_varrec->numdims = 1;
moles_varrec->numdims = 1;
}
else
{
for (i = 0; i < count_species + 1; i++)
{
PhreeqcPtr->free_check_null(names_arg[i]);
PhreeqcPtr->free_check_null(types_arg[i]);
}
PhreeqcPtr->free_check_null(names_arg);
PhreeqcPtr->free_check_null(types_arg);
PhreeqcPtr->free_check_null(moles_arg);
} }
break; break;
@ -7415,6 +7429,7 @@ const std::map<const std::string, PBasic::BASIC_TOKEN>::value_type temp_tokens[]
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rtrim", PBasic::tokrtrim), std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rtrim", PBasic::tokrtrim),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("trim", PBasic::toktrim), std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("trim", PBasic::toktrim),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("pad", PBasic::tokpad), std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("pad", PBasic::tokpad),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("pad$", PBasic::tokpad_),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rxn", PBasic::tokrxn), std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rxn", PBasic::tokrxn),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("dist", PBasic::tokdist), std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("dist", PBasic::tokdist),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("mol", PBasic::tokmol), std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("mol", PBasic::tokmol),

View File

@ -272,6 +272,7 @@ public:
tokrtrim, tokrtrim,
toktrim, toktrim,
tokpad, tokpad,
tokpad_,
tokchange_por, tokchange_por,
tokget_por, tokget_por,
tokosmotic, tokosmotic,

View File

@ -151,8 +151,9 @@ public:
LDBLE surf_total(const char *total_name, const char *surface_name); LDBLE surf_total(const char *total_name, const char *surface_name);
LDBLE surf_total_no_redox(const char *total_name, const char *surface_name); LDBLE surf_total_no_redox(const char *total_name, const char *surface_name);
static int system_species_compare(const void *ptr1, const void *ptr2); static int system_species_compare(const void *ptr1, const void *ptr2);
static int system_species_compare_name(const void* ptr1, const void* ptr2);
LDBLE system_total(const char *total_name, LDBLE * count, char ***names, LDBLE system_total(const char *total_name, LDBLE * count, char ***names,
char ***types, LDBLE ** moles); char ***types, LDBLE ** moles, int i);
std::string kinetics_formula(std::string kinetics_name, cxxNameDouble &stoichiometry); std::string kinetics_formula(std::string kinetics_name, cxxNameDouble &stoichiometry);
std::string phase_formula(std::string phase_name, cxxNameDouble &stoichiometry); std::string phase_formula(std::string phase_name, cxxNameDouble &stoichiometry);
std::string species_formula(std::string phase_name, cxxNameDouble &stoichiometry); std::string species_formula(std::string phase_name, cxxNameDouble &stoichiometry);

View File

@ -2980,7 +2980,7 @@ edl_species(const char *surf_name, LDBLE * count, char ***names, LDBLE ** moles,
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
LDBLE Phreeqc:: LDBLE Phreeqc::
system_total(const char *total_name, LDBLE * count, char ***names, system_total(const char *total_name, LDBLE * count, char ***names,
char ***types, LDBLE ** moles) char ***types, LDBLE ** moles, int isort)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
{ {
/* /*
@ -3043,11 +3043,16 @@ system_total(const char *total_name, LDBLE * count, char ***names,
/* /*
* Sort system species * Sort system species
*/ */
if (count_sys > 1) if (count_sys > 1 && isort == 0)
{ {
qsort(sys, (size_t) count_sys, qsort(sys, (size_t) count_sys,
(size_t) sizeof(struct system_species), system_species_compare); (size_t) sizeof(struct system_species), system_species_compare);
} }
else
{
qsort(sys, (size_t)count_sys,
(size_t)sizeof(struct system_species), system_species_compare_name);
}
/* /*
* malloc space * malloc space
*/ */
@ -4211,6 +4216,16 @@ system_species_compare(const void *ptr1, const void *ptr2)
return (-1); return (-1);
return (0); return (0);
} }
int Phreeqc::
system_species_compare_name(const void* ptr1, const void* ptr2)
/* ---------------------------------------------------------------------- */
{
const struct system_species* a, * b;
a = (const struct system_species*)ptr1;
b = (const struct system_species*)ptr2;
return (strncmp(a->name, b->name, MAX_LENGTH));
}
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
int Phreeqc:: int Phreeqc::