14 #define SNPRINTF _snprintf 16 #define SNPRINTF snprintf 25 #include <boost/algorithm/string.hpp> 29 namespace ba = boost::algorithm;
35 const std::string& sep)
39 for (
size_t i = 0; i < v.size(); i++) {
40 SNPRINTF(buf, 63,
fmt.c_str(), v[i]);
42 if (i != v.size() - 1) {
52 for (
size_t i = 0; i < s.size(); i++) {
61 const std::vector<std::string>& names)
64 for (
size_t k = 0; k < names.size(); k++) {
71 while (stop < ss.size()) {
72 size_t colon = ss.find(
':', left);
76 size_t valstart = ss.find_first_not_of(
" \t\n", colon+1);
77 stop = ss.find_first_of(
", ;\n\t", valstart);
78 std::string name = ba::trim_copy(ss.substr(start, colon-start));
79 if (!names.empty() && x.find(name) == x.end()) {
81 "unknown species '" + name +
"'");
86 value =
fpValueCheck(ss.substr(valstart, stop-valstart));
92 std::string testname = ss.substr(start, stop-start);
93 if (testname.find_first_of(
" \n\t") !=
npos) {
96 }
else if (ss.substr(valstart, stop-valstart).find(
':') !=
npos) {
104 if (
getValue(x, name, 0.0) != 0.0) {
106 "Duplicate key: '" + name +
"'.");
110 start = ss.find_first_not_of(
", ;\n\t", stop+1);
114 throw CanteraError(
"parseCompString",
"Unable to parse key-value pair:" 115 "\n'{}'", ss.substr(start, stop));
117 if (stop !=
npos && !ba::trim_copy(ss.substr(stop)).empty()) {
118 throw CanteraError(
"parseCompString",
"Found non-key:value data " 119 "in composition string: '" + ss.substr(stop) +
"'");
126 return std::atoi(ba::trim_copy(val).c_str());
132 std::stringstream ss(val);
133 ss.imbue(std::locale(
"C"));
140 std::string str = ba::trim_copy(val);
142 throw CanteraError(
"fpValueCheck",
"string has zero length");
149 if (ch ==
'+' || ch ==
'-') {
152 for (
size_t i = istart; i < str.size(); i++) {
155 }
else if (ch ==
'.') {
159 "string has more than one .");
163 "string has decimal point in exponent");
165 }
else if (ch ==
'e' || ch ==
'E' || ch ==
'd' || ch ==
'D') {
170 "string has more than one exp char");
173 if (ch ==
'+' || ch ==
'-') {
178 "Trouble processing string, " + str);
186 std::string s = ba::trim_copy(nameStr);
188 size_t ibegin = s.find_first_not_of(
" ;\n\t");
190 s = s.substr(ibegin,s.size());
191 size_t icolon = s.find(
':');
192 size_t iend = s.find_first_of(
" ;\n\t");
194 phaseName = s.substr(0, icolon);
195 s = s.substr(icolon+1, s.size());
196 icolon = s.find(
':');
198 throw CanteraError(
"parseSpeciesName()",
"two colons in name: " + nameStr);
203 "Species name has \" ;/\n/\t\" in the middle of it: " + nameStr);
211 std::vector<std::string> v;
215 if (n > 2 || n < 1) {
217 "number of tokens is too high");
227 std::string val = ba::trim_copy(in_val);
234 ba::split(v, val, ba::is_space(), ba::token_compress_on);
237 size_t copyString(
const std::string& source,
char* dest,
size_t length)
239 const char* c_src = source.c_str();
240 size_t N = std::min(length, source.length()+1);
241 size_t ret = (length >= source.length() + 1) ? 0 : source.length() + 1;
242 std::copy(c_src, c_src + N, dest);
244 dest[length-1] =
'\0';
250 return ba::trim_copy(input);
254 return ba::to_lower_copy(input);
258 return ba::iequals(input, test);
std::map< std::string, doublereal > compositionMap
Map connecting a string name with a double.
doublereal fpValue(const std::string &val)
Translate a string into one doublereal value.
std::string trimCopy(const std::string &input)
Trim.
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data...
std::string vec2str(const vector_fp &v, const std::string &fmt, const std::string &sep)
Convert a vector to a string (separated by commas)
Various templated functions that carry out common vector operations (see Templated Utility Functions)...
doublereal toSI(const std::string &unit)
Return the conversion factor to convert unit std::string 'unit' to SI units.
const size_t npos
index returned by functions to indicate "no position"
This file contains definitions of terms that are used in internal routines and are unlikely to need m...
void tokenizeString(const std::string &in_val, std::vector< std::string > &v)
This function separates a string up into tokens according to the location of white space...
bool caseInsensitiveEquals(const std::string &input, const std::string &test)
Case insensitive equality predicate.
const U & getValue(const std::map< T, U > &m, const T &key, const U &default_val)
Const accessor for a value in a std::map.
Base class for exceptions thrown by Cantera classes.
std::string parseSpeciesName(const std::string &nameStr, std::string &phaseName)
Parse a name string, separating out the phase name from the species name.
size_t copyString(const std::string &source, char *dest, size_t length)
Copy the contents of a std::string into a char array of a given length.
int intValue(const std::string &val)
Translate a string into one integer value.
compositionMap parseCompString(const std::string &ss, const std::vector< std::string > &names)
Parse a composition string into a map consisting of individual key:composition pairs.
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
Contains declarations for string manipulation functions within Cantera.
std::string toLowerCopy(const std::string &input)
Convert to lower case.
Namespace for the Cantera kernel.
doublereal strSItoDbl(const std::string &strSI)
Interpret one or two token string as a single double.
std::string stripnonprint(const std::string &s)
Strip non-printing characters wherever they are.
doublereal fpValueCheck(const std::string &val)
Translate a string into one doublereal value, with error checking.
Definitions for the classes that are thrown when Cantera experiences an error condition (also contain...