39 using namespace VMlib;
42 StreamParser::StreamParser(
LogStream& infoStream,
const std::string& label, std::istream& mainStream, std::istream& defaultsStream, std::istream& switchersStream, std::istream& varsStream, std::vector<std::string> specificKey)
81 std::string str(line);
105 if (line.length() > 0)
110 return std::vector<std::string>({});
117 std::vector<std::string> vecLine;
119 while ( ((pos = line.find(
',', 0)) < line.find(openBracket, 1)) ||
120 ( (pos = line.find(
',', std::max(1, static_cast<int>(line.find(closeBracket, 1)) ))) != std::string::npos) ||
121 (pos = line.length()-1) )
123 std::string subline = line.substr(1, pos - 1);
125 vecLine.push_back(subline);
127 line.erase(1, subline.size() + 1);
134 return std::vector<std::string>({});
145 for (
size_t q = 0; q < _vecString.size(); ++q)
147 buf.append(_vecString[q]);
158 size_t posBegin = line.find(
'(', 0);
159 size_t posEnd = line.find(
')', 0);
160 if ((posBegin != -1) && (posEnd == -1))
162 info(
'e') <<
"error while parsing line " << line << std::endl;
167 std::string sub = line.substr(0, posBegin);
168 if ((posBegin == -1) && (posEnd == -1))
169 return std::pair<std::string, std::string>(upcase ?
UpperCase(sub) : sub,
"{}");
171 return std::pair<std::string, std::string>(upcase ?
UpperCase(sub) : sub,
"{" + line.substr(posBegin + 1, posEnd - posBegin - 1) +
"}");
177 void StreamParser::ParseStream(std::istream& stream, std::unordered_map<std::string, std::vector<std::string>>&
database, std::vector<std::string> specificKey,
bool replaceVars,
char openBracket,
char closeBracket)
179 std::string line, readline;
180 size_t defVarNum = 0;
182 while (stream.good())
188 getline(stream, readline);
190 size_t posComment = std::min(readline.find(
'#'), readline.find(
"//"));
192 if (posComment != std::string::npos)
193 readline = readline.substr(0, posComment);
197 readline.erase(
remove(readline.begin(), readline.end(),
' '), readline.end());
198 readline.erase(
remove(readline.begin(), readline.end(),
'\t'), readline.end());
200 }
while ( (readline.size()>0) && (readline[readline.size() - 1] ==
'\\') && (stream.good()));
202 line.erase(
remove(line.begin(), line.end(),
'\\'), line.end());
203 line.erase(
remove(line.begin(), line.end(),
' '), line.end());
204 line.erase(
remove(line.begin(), line.end(),
'\t'), line.end());
206 size_t posEqual = line.find(
'=');
209 std::string key = line.substr(0, posEqual);
214 if ((specificKey.size() == 0) || (std::find(specificKey.begin(),specificKey.end(),key) != specificKey.end()) )
216 std::string value = line.substr(posEqual + 1, line.length());
224 info(
'e') <<
"key <" << key <<
"> is found twice" << std::endl;
228 else if (line.size() > 0)
230 std::string value = line;
234 std::stringstream ssDef;
235 ssDef <<
"_defVar_" << defVarNum;
245 stream.seekg(0, std::ios::beg);
252 while (st.find(
"$") != -1)
254 size_t startVar = st.find(
'$');
256 size_t endVar = -1 + std::min({
257 st.find(
" ", startVar + 1),
258 st.find(
",", startVar + 1),
259 st.find(
";", startVar + 1),
260 st.find(
"$", startVar + 1),
261 st.find(
"(", startVar + 1),
262 st.find(
")", startVar + 1),
263 st.find(
"{", startVar + 1),
264 st.find(
"}", startVar + 1),
265 st.find(
"\n", startVar + 1),
269 std::string var = st.substr(startVar + 1, endVar - startVar);
272 if ((search_var !=
vars.end()) && ((search_var->second).size() > 0))
274 std::vector<std::string> findString = search_var->second;
276 std::stringstream ss;
278 ss << st.substr(0, startVar);
280 if (findString.size() == 1)
286 ss <<
"{" << findString[0];
287 if (findString.size() > 0)
289 for (
size_t sz = 1; sz < findString.size(); ++sz)
290 ss <<
"," << findString[sz];
296 size_t startP = endVar+1;
297 size_t endP = st.length() - 1;
300 ss << st.substr(startP, endP);
306 info(
'e') <<
"substitution $" << var <<
" is undefined" << std::endl;
Глобальные параметры по умолчанию
void ReplaceVarsInString(std::string &st)
Замена переменных в строке их значениями
Класс, определяющий работу с потоком логов
LogStream info
Поток для вывода логов и сообщений об ошибках
static std::vector< std::string > StringToVector(std::string line, char openBracket= '(', char closeBracket= ')')
Pазбор строки, содержащей запятые, на отдельные строки
Заголовочный файл с описанием класса StreamParser.
static std::pair< std::string, std::string > SplitString(LogStream &info, std::string line, bool upcase=true)
Разбор строки на пару ключ-значение
std::unordered_map< std::string, std::vector< std::string > > database
Данные считываемые из основного файла-паспорта расчета
std::unordered_map< std::string, std::vector< std::string > > vars
Данные считываемые из параметров конкретной задачи
StreamParser(LogStream &infoStream, const std::string &label, std::istream &mainStream, std::istream &defaultsStream, std::istream &switchersStream, std::istream &varsStream, std::vector< std::string > specificKey={})
Конструктор, принимающий четыре потока
static std::string VectorStringToString(const std::vector< std::string > &_vecString)
Объединение вектора (списка) из строк в одну строку
void ParseStream(std::istream &stream, std::unordered_map< std::string, std::vector< std::string >> &database, std::vector< std::string > specificKey={}, bool replaceVars=false, char openBracket= '(', char closeBracket= ')')
Парсинг заданного потока
void inheritStream(LogStream &infoStream_, const std::string &label_)
Связывание потока логов с потоком вывода от другого потока логов
std::unordered_map< std::string, std::vector< std::string > > switchers
Данные считываемые из перечня параметров-переключателей
static std::string UpperCase(const std::string &line)
Перевод строки в верхний регистр