#include <iostream>
#include <sstream>
#include <string>
std::istream& get_word_or_quote( std::istream& is, std::string& s )
{
char c;
// skip ws and get the first character
if ( !std::ws( is ) || !is.get( c ) )
return is;
// if it is a word
if ( c != '"' )
{
is.putback( c );
return is >> s;
}
// if it is a quote (no escape sequence)
std::string q;
while ( is.get( c ) && c != '"' )
q += c;
if ( c != '"' )
throw "closing quote expected";
//
s = std::move( q );
return is;
}
int main()
{
std::istringstream is {"not-quoted \"quoted\" \"quoted with spaces\" \"no closing quote!" };
try
{
std::string word;
while ( get_word_or_quote( is, word ) )
std::cout << word << std::endl;
}
catch ( const char* e )
{
std::cout << "ERROR: " << e;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnN0ZDo6aXN0cmVhbSYgZ2V0X3dvcmRfb3JfcXVvdGUoIHN0ZDo6aXN0cmVhbSYgaXMsIHN0ZDo6c3RyaW5nJiBzICkKewogIGNoYXIgYzsKICAKICAvLyBza2lwIHdzIGFuZCBnZXQgdGhlIGZpcnN0IGNoYXJhY3RlcgogIGlmICggIXN0ZDo6d3MoIGlzICkgfHwgIWlzLmdldCggYyApICkKICAgIHJldHVybiBpczsKCiAgLy8gaWYgaXQgaXMgYSB3b3JkCiAgaWYgKCBjICE9ICciJyApCiAgewogICAgaXMucHV0YmFjayggYyApOwogICAgcmV0dXJuIGlzID4+IHM7CiAgfQoKICAvLyBpZiBpdCBpcyBhIHF1b3RlIChubyBlc2NhcGUgc2VxdWVuY2UpCiAgc3RkOjpzdHJpbmcgcTsKICB3aGlsZSAoIGlzLmdldCggYyApICYmIGMgIT0gJyInICkKICAgIHEgKz0gYzsKICBpZiAoIGMgIT0gJyInICkKICAgIHRocm93ICJjbG9zaW5nIHF1b3RlIGV4cGVjdGVkIjsKCiAgLy8KICBzID0gc3RkOjptb3ZlKCBxICk7CiAgcmV0dXJuIGlzOwp9CgppbnQgbWFpbigpCnsKICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXMgeyJub3QtcXVvdGVkIFwicXVvdGVkXCIgXCJxdW90ZWQgd2l0aCBzcGFjZXNcIiBcIm5vIGNsb3NpbmcgcXVvdGUhIiB9OwoKICB0cnkKICB7CiAgICBzdGQ6OnN0cmluZyB3b3JkOwogICAgd2hpbGUgKCBnZXRfd29yZF9vcl9xdW90ZSggaXMsIHdvcmQgKSApCiAgICAgIHN0ZDo6Y291dCA8PCB3b3JkIDw8IHN0ZDo6ZW5kbDsKICB9CiAgY2F0Y2ggKCBjb25zdCBjaGFyKiBlICkKICB7CiAgICBzdGQ6OmNvdXQgPDwgIkVSUk9SOiAiIDw8IGU7CiAgfQoKICByZXR1cm4gMDsKfQ==