#include <iostream>
#include <string>
#include <sstream>
#include <map>
#include <algorithm>
#include <vector>
size_t find(const std::string& line, std::vector<std::string> vect, int pos=0) {
int eol1;
eol1 = 0;
for (std::vector<std::string>::iterator iter = vect.begin(); iter != vect.end(); ++iter) {
//std::cout << *iter << std::endl;
int eol2 = line.find(*iter, pos);
if (eol1 == 0 && eol2 > 0)
eol1 = eol2;
else if (eol2 > 0 && eol2 < eol1)
eol1 = eol2;
}
return eol1;
}
std::map<std::string, std::string> mappify(std::string const& s, char delim='=') {
std::map<std::string, std::string> m;
std::string::size_type key_pos = 0, i, j;
std::string::size_type key_end;
std::string::size_type val_pos;
std::string::size_type lim_pos;
std::string::size_type val_end;
while ((key_end = s.find(delim, key_pos)) != std::string::npos) {
if ((val_pos = s.find_first_not_of(delim, key_end + 1)) == std::string::npos)break;
while (key_end - 1 > 0 && (s[key_end - 1] <= 32 || s[key_end - 1] == ';'))
key_end--;
while (val_pos < s.size() && (s[val_pos] <= 32 || s[val_pos] == ';'))
val_pos++;
val_end = s.find('\n', val_pos);
i = s.find('\"', val_pos);
if (i != std::string::npos)
j = s.find('\"', i + 1);
else
j = 0;
lim_pos = find(s.substr(0, i), { " ",";","\t" }, val_pos + 1);
//std::cout << "s.substr(j):" << s.substr(j)<<std::endl;
if (lim_pos == 0 && j != std::string::npos)lim_pos = find(s.substr(j), { " ",";","\t" }) + j;
if (lim_pos < val_pos)lim_pos = val_pos + 1;
if (j > 0)val_end = j + 1;
if (val_end > lim_pos)val_end = lim_pos;
m.emplace(s.substr(key_pos, key_end - key_pos), s.substr(val_pos, val_end - val_pos));
key_pos = val_end;
while ((key_pos < s.size() && s[key_pos] <= 32 || s[key_pos] == ';'))
++key_pos;
if (val_end == 0)break;
}
return m;
}
int main() {
std::string s ="\
File=\"c:\\dir\\ocean\\\nCCS_test.txt\"\n\
iEcho=10000; iHrShift=0 rho_Co2 = 1.15d0;\n\
Liner=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
auto m = mappify(s);
for (auto const& p : m)
std::cout << '{' << p.first << " :=> " << p.second << '}' << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnNpemVfdCBmaW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVjdCwgaW50IHBvcz0wKSB7CglpbnQgZW9sMTsKCWVvbDEgPSAwOwoJZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSB2ZWN0LmJlZ2luKCk7IGl0ZXIgIT0gdmVjdC5lbmQoKTsgKytpdGVyKSB7CgkJLy9zdGQ6OmNvdXQgPDwgKml0ZXIgPDwgc3RkOjplbmRsOwoJCWludCBlb2wyID0gbGluZS5maW5kKCppdGVyLCBwb3MpOwoJCWlmIChlb2wxID09IDAgJiYgZW9sMiA+IDApCgkJCWVvbDEgPSBlb2wyOwoJCWVsc2UgaWYgKGVvbDIgPiAwICYmIGVvbDIgPCBlb2wxKQoJCQllb2wxID0gZW9sMjsKCX0KCXJldHVybiBlb2wxOwp9CgpzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1hcHBpZnkoc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgZGVsaW09Jz0nKSB7CglzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG07CgoJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBrZXlfcG9zID0gMCwgaSwgajsKCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUga2V5X2VuZDsKCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgdmFsX3BvczsKCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGltX3BvczsKCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgdmFsX2VuZDsKCgl3aGlsZSAoKGtleV9lbmQgPSBzLmZpbmQoZGVsaW0sIGtleV9wb3MpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewoJCWlmICgodmFsX3BvcyA9IHMuZmluZF9maXJzdF9ub3Rfb2YoZGVsaW0sIGtleV9lbmQgKyAxKSkgPT0gc3RkOjpzdHJpbmc6Om5wb3MpYnJlYWs7CgkJd2hpbGUgKGtleV9lbmQgLSAxID4gMCAmJiAoc1trZXlfZW5kIC0gMV0gPD0gMzIgfHwgc1trZXlfZW5kIC0gMV0gPT0gJzsnKSkKCQkJa2V5X2VuZC0tOwoJCXdoaWxlICh2YWxfcG9zIDwgcy5zaXplKCkgJiYgKHNbdmFsX3Bvc10gPD0gMzIgfHwgc1t2YWxfcG9zXSA9PSAnOycpKQoJCQl2YWxfcG9zKys7CgkJdmFsX2VuZCA9IHMuZmluZCgnXG4nLCB2YWxfcG9zKTsKCQlpID0gcy5maW5kKCdcIicsIHZhbF9wb3MpOwoJCWlmIChpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQoJCQlqID0gcy5maW5kKCdcIicsIGkgKyAxKTsKCQllbHNlCgkJCWogPSAwOwoJCWxpbV9wb3MgPSBmaW5kKHMuc3Vic3RyKDAsIGkpLCB7ICIgIiwiOyIsIlx0IiB9LCB2YWxfcG9zICsgMSk7CgkJLy9zdGQ6OmNvdXQgPDwgInMuc3Vic3RyKGopOiIgPDwgcy5zdWJzdHIoaik8PHN0ZDo6ZW5kbDsKCQlpZiAobGltX3BvcyA9PSAwICYmIGogIT0gc3RkOjpzdHJpbmc6Om5wb3MpbGltX3BvcyA9IGZpbmQocy5zdWJzdHIoaiksIHsgIiAiLCI7IiwiXHQiIH0pICsgajsKCQlpZiAobGltX3BvcyA8IHZhbF9wb3MpbGltX3BvcyA9IHZhbF9wb3MgKyAxOwoJCWlmIChqID4gMCl2YWxfZW5kID0gaiArIDE7CgkJaWYgKHZhbF9lbmQgPiBsaW1fcG9zKXZhbF9lbmQgPSBsaW1fcG9zOwoJCW0uZW1wbGFjZShzLnN1YnN0cihrZXlfcG9zLCBrZXlfZW5kIC0ga2V5X3BvcyksIHMuc3Vic3RyKHZhbF9wb3MsIHZhbF9lbmQgLSB2YWxfcG9zKSk7CgkJa2V5X3BvcyA9IHZhbF9lbmQ7CgkJd2hpbGUgKChrZXlfcG9zIDwgcy5zaXplKCkgJiYgc1trZXlfcG9zXSA8PSAzMiB8fCBzW2tleV9wb3NdID09ICc7JykpCgkJCSsra2V5X3BvczsKCQlpZiAodmFsX2VuZCA9PSAwKWJyZWFrOwoJfQoJcmV0dXJuIG07Cn0KaW50IG1haW4oKSB7CiAgICBzdGQ6OnN0cmluZyBzID0iXApGaWxlPVwiYzpcXGRpclxcb2NlYW5cXFxuQ0NTX3Rlc3QudHh0XCJcblwKaUVjaG89MTAwMDA7IGlIclNoaWZ0PTAgcmhvX0NvMiA9IDEuMTVkMDtcblwKTGluZXI9MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOwogIGF1dG8gbSA9IG1hcHBpZnkocyk7CiAgICBmb3IgKGF1dG8gY29uc3QmIHAgOiBtKQogICAgICBzdGQ6OmNvdXQgPDwgJ3snIDw8IHAuZmlyc3QgPDwgIiA6PT4gIiA8PCBwLnNlY29uZCA8PCAnfScgPDwgJ1xuJzsKCglyZXR1cm4gMDsKfQ==