move some methods

This commit is contained in:
John
2022-04-17 18:12:21 +02:00
parent 49b6d53d3b
commit ba5d264098
2 changed files with 25 additions and 9 deletions
+9 -9
View File
@@ -388,7 +388,7 @@ static const char* knownFieldNames[] = {
/** the number of known field names. */
static const size_t knownFieldCount = sizeof(knownFieldNames) / sizeof(char*);
std::pair<string, int> makeField(const string& name, bool isField) {
std::pair<string, int> MqttReplacer::makeField(const string& name, bool isField) {
if (!isField) {
return {name, -1};
}
@@ -400,7 +400,7 @@ std::pair<string, int> makeField(const string& name, bool isField) {
return {name, knownFieldCount};
}
void addPart(ostringstream& stack, int inField, vector<std::pair<string, int>>& parts) {
void MqttReplacer::addPart(ostringstream& stack, int inField) {
string str = stack.str();
if (inField == 1 && str == "_") {
inField = 0; // single "%_" pattern to reduce to "_"
@@ -412,12 +412,12 @@ void addPart(ostringstream& stack, int inField, vector<std::pair<string, int>>&
return;
}
stack.str("");
if (inField == 0 && !parts.empty() && parts[parts.size()-1].second < 0) {
if (inField == 0 && !m_parts.empty() && m_parts[m_parts.size()-1].second < 0) {
// append constant to previous constant
parts[parts.size()-1].first += str;
m_parts[m_parts.size()-1].first += str;
return;
}
parts.push_back(makeField(str, inField > 0));
m_parts.push_back(makeField(str, inField > 0));
}
bool MqttReplacer::parse(const string& templateStr, bool onlyKnown, bool noKnownDuplicates, bool emptyIfMissing) {
@@ -431,24 +431,24 @@ bool MqttReplacer::parse(const string& templateStr, bool onlyKnown, bool noKnown
inField = 0;
stack << ch;
} else {
addPart(stack, inField, m_parts);
addPart(stack, inField);
inField = 1;
}
} else if (ch == '{' && inField == 1 && empty) {
inField = 2;
} else if (ch == '}' && inField == 2) {
addPart(stack, 1, m_parts);
addPart(stack, 1);
inField = 0;
} else {
if (inField > 0 && !((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch == '_')) {
// invalid field character
addPart(stack, inField, m_parts);
addPart(stack, inField);
inField = 0;
}
stack << ch;
}
}
addPart(stack, inField, m_parts);
addPart(stack, inField);
if (onlyKnown || noKnownDuplicates) {
int foundMask = 0;
int knownCount = knownFieldCount;
+16
View File
@@ -180,6 +180,22 @@ class MqttReplacer {
/** true when the complete result is supposed to be empty when at least one referenced variable
* is empty or not defined. */
bool m_emptyIfMissing;
/**
* Create a named field or constant.
* @param name the plain string or the name of the field.
* @param isField true when it is a field.
* @return the created pair.
*/
static std::pair<string, int> makeField(const string& name, bool isField);
/**
* Add a part to the list of parts.
* @param stack the parsing stack.
* @param inField 1 after '%', 2 after '%{', 0 otherwise.
*/
void addPart(ostringstream& stack, int inField);
};