#include <iostream>
#include <map>
#include <string>
#include <vector>
int main() {
std::string str("0=My,1=comma,2=separated,3=string,0=with,3=repeated,7=IDs");
std::vector<std::string> out0;
std::map<std::string, std::string> out;
size_t startPos = 0, delimPos, nameStart, nameEnd, valueStart, valueEnd;
// loop over the string, collecting "key=value" pairs
while (startPos < str.size()){
nameStart = startPos;
delimPos = str.find_first_of("=,", startPos, 2);
if (delimPos == std::string::npos) {
nameEnd = valueStart = valueEnd = str.size();
}
else {
nameEnd = delimPos;
if (str[delimPos] == '=') {
valueStart = nameEnd + 1;
valueEnd = str.find(',', valueStart);
if (valueEnd == std::string::npos) {
valueEnd = str.size();
}
}
else {
valueStart = valueEnd = nameEnd;
}
}
// TODO: if needed, adjust nameStart/End and valueStartEnd to
// ignore leading/trailing whitespace around the name and value
// substrings...
if (str.compare(nameStart, nameEnd - nameStart, "0", 1) == 0) {
out0.push_back(str.substr(valueStart, valueEnd - valueStart));
} else {
out[str.substr(nameStart, nameEnd - nameStart)] = str.substr(valueStart, valueEnd - valueStart);
}
startPos = valueEnd + 1;
}
// print out the data structures
std::cout << "out0:";
for (auto& entry : out0) {
std::cout << ' ' << entry;
}
std::cout << std::endl;
std::cout << "out:";
for (auto &it : out) {
std::cout << ' ' << it.first << '=' << it.second;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKaW50IG1haW4oKSB7CiAgICBzdGQ6OnN0cmluZyBzdHIoIjA9TXksMT1jb21tYSwyPXNlcGFyYXRlZCwzPXN0cmluZywwPXdpdGgsMz1yZXBlYXRlZCw3PUlEcyIpOwogICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dDA7CiAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG91dDsKCiAgICBzaXplX3Qgc3RhcnRQb3MgPSAwLCBkZWxpbVBvcywgbmFtZVN0YXJ0LCBuYW1lRW5kLCB2YWx1ZVN0YXJ0LCB2YWx1ZUVuZDsKCiAgICAvLyBsb29wIG92ZXIgdGhlIHN0cmluZywgY29sbGVjdGluZyAia2V5PXZhbHVlIiBwYWlycwogICAgd2hpbGUgKHN0YXJ0UG9zIDwgc3RyLnNpemUoKSl7CiAgICAgICAgbmFtZVN0YXJ0ID0gc3RhcnRQb3M7CiAgICAgICAgZGVsaW1Qb3MgPSBzdHIuZmluZF9maXJzdF9vZigiPSwiLCBzdGFydFBvcywgMik7CiAgICAgICAgaWYgKGRlbGltUG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgICAgIG5hbWVFbmQgPSB2YWx1ZVN0YXJ0ID0gdmFsdWVFbmQgPSBzdHIuc2l6ZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmFtZUVuZCA9IGRlbGltUG9zOwogICAgICAgICAgICBpZiAoc3RyW2RlbGltUG9zXSA9PSAnPScpIHsKICAgICAgICAgICAgICAgIHZhbHVlU3RhcnQgPSBuYW1lRW5kICsgMTsKICAgICAgICAgICAgICAgIHZhbHVlRW5kID0gc3RyLmZpbmQoJywnLCB2YWx1ZVN0YXJ0KTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZUVuZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlRW5kID0gc3RyLnNpemUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhbHVlU3RhcnQgPSB2YWx1ZUVuZCA9IG5hbWVFbmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFRPRE86IGlmIG5lZWRlZCwgYWRqdXN0IG5hbWVTdGFydC9FbmQgYW5kIHZhbHVlU3RhcnRFbmQgdG8KICAgICAgICAvLyBpZ25vcmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgbmFtZSBhbmQgdmFsdWUKICAgICAgICAvLyBzdWJzdHJpbmdzLi4uCgogICAgICAgIGlmIChzdHIuY29tcGFyZShuYW1lU3RhcnQsIG5hbWVFbmQgLSBuYW1lU3RhcnQsICIwIiwgMSkgPT0gMCkgewogICAgICAgICAgICBvdXQwLnB1c2hfYmFjayhzdHIuc3Vic3RyKHZhbHVlU3RhcnQsIHZhbHVlRW5kIC0gdmFsdWVTdGFydCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG91dFtzdHIuc3Vic3RyKG5hbWVTdGFydCwgbmFtZUVuZCAtIG5hbWVTdGFydCldID0gc3RyLnN1YnN0cih2YWx1ZVN0YXJ0LCB2YWx1ZUVuZCAtIHZhbHVlU3RhcnQpOwogICAgICAgIH0KCiAgICAgICAgc3RhcnRQb3MgPSB2YWx1ZUVuZCArIDE7CiAgICB9CgogICAgLy8gcHJpbnQgb3V0IHRoZSBkYXRhIHN0cnVjdHVyZXMKICAgIHN0ZDo6Y291dCA8PCAib3V0MDoiOwogICAgZm9yIChhdXRvJiBlbnRyeSA6IG91dDApIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgJyAnIDw8IGVudHJ5OwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OmNvdXQgPDwgIm91dDoiOwogICAgZm9yIChhdXRvICZpdCA6IG91dCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAnICcgPDwgaXQuZmlyc3QgPDwgJz0nIDw8IGl0LnNlY29uZDsKICAgIH0KfQo=