#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
using namespace std;
istream& get_cell(istream& is, string& s)
{
char c;
is >> c; // skips ws
is.unget();
if (c == '\'')
return is >> quoted(s, '\'', '\\');
else
return getline(is, s, ','), is.unget();
}
vector<string> get(const string& s)
{
istringstream iss{ s };
string cell;
vector<string> r;
while (get_cell(iss, cell))
{
r.push_back(cell);
char comma;
iss >> comma;
if (comma != ',')
break;
}
char c;
if (iss >> c)
throw "ill formed";
return r;
}
int main()
{
string s = "1, 10, 'abc', 'test, 1'";
try
{
auto v = get(s);
copy (v.begin(), v.end(), ostream_iterator<string>(cout,"\n"));
}
catch (const char* e)
{
cout << e;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgppc3RyZWFtJiBnZXRfY2VsbChpc3RyZWFtJiBpcywgc3RyaW5nJiBzKQp7CiAgY2hhciBjOwogIGlzID4+IGM7IC8vIHNraXBzIHdzCiAgaXMudW5nZXQoKTsKCiAgaWYgKGMgPT0gJ1wnJykKICAgIHJldHVybiBpcyA+PiBxdW90ZWQocywgJ1wnJywgJ1xcJyk7CiAgZWxzZQogICAgcmV0dXJuIGdldGxpbmUoaXMsIHMsICcsJyksIGlzLnVuZ2V0KCk7Cn0KCnZlY3RvcjxzdHJpbmc+IGdldChjb25zdCBzdHJpbmcmIHMpCnsKICBpc3RyaW5nc3RyZWFtIGlzc3sgcyB9OwogIHN0cmluZyBjZWxsOwogIHZlY3RvcjxzdHJpbmc+IHI7CiAgd2hpbGUgKGdldF9jZWxsKGlzcywgY2VsbCkpCiAgewogICAgci5wdXNoX2JhY2soY2VsbCk7CiAgICBjaGFyIGNvbW1hOwogICAgaXNzID4+IGNvbW1hOwogICAgaWYgKGNvbW1hICE9ICcsJykKICAgICAgYnJlYWs7CiAgfQoKICBjaGFyIGM7IAogIGlmIChpc3MgPj4gYykKICAgIHRocm93ICJpbGwgZm9ybWVkIjsKCiAgcmV0dXJuIHI7Cn0KCmludCBtYWluKCkKewogIHN0cmluZyBzID0gIjEsIDEwLCAnYWJjJywgJ3Rlc3QsIDEnIjsKICB0cnkKICB7CiAgICBhdXRvIHYgPSBnZXQocyk7CiAgICBjb3B5ICh2LmJlZ2luKCksIHYuZW5kKCksIG9zdHJlYW1faXRlcmF0b3I8c3RyaW5nPihjb3V0LCJcbiIpKTsKICAgfQogIGNhdGNoIChjb25zdCBjaGFyKiBlKQogIHsKICAgIGNvdXQgPDwgZTsKICB9Cn0=