#include <iostream>
#include <sstream>
#include <string>
struct Text : std::string { using std::string::string; };
std::istream& operator>>(std::istream& is, Text& t)
{
if (is.flags() & is.skipws) is >> std::skipws;
for (char c: t)
{
if (is.peek() != c)
{
is.setstate(std::ios::failbit);
break;
}
is.get();
}
return is;
}
struct Until_Delim {
Until_Delim(std::string& s, std::string delim) : s_(s), delim_(delim) { }
std::string& s_;
std::string delim_;
};
std::istream& operator>>(std::istream& is, const Until_Delim& ud)
{
std::istream::sentry sentry(is);
size_t in_delim = 0;
for (char c = is.get(); is; c = is.get())
{
if (c == ud.delim_[in_delim])
{
if (++in_delim == ud.delim_.size())
break;
continue;
}
else if (in_delim) // was part-way into delimiter match...
{
ud.s_.append(ud.delim_, 0, in_delim);
in_delim = 0;
}
ud.s_ += c;
}
// may need to trim trailing whitespace...
if (is.flags() & std::ios_base::skipws)
while (!ud.s_.empty() && std::isspace(ud.s_.back()))
ud.s_.pop_back();
return is;
}
int main()
{
Text t{"ignore"};
std::istringstream iss("ignore3.14ignore Some ignorable Text ignore 2.718");
double pi, e;
std::string a_string;
if (iss >> t >> pi >> t >> Until_Delim(a_string, "ignore") >> e)
std::cout << "pi " << pi << ", a_string '" << a_string << "', e " << e << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCiAgICBzdHJ1Y3QgVGV4dCA6IHN0ZDo6c3RyaW5nIHsgdXNpbmcgc3RkOjpzdHJpbmc6OnN0cmluZzsgfTsKCiAgICBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiBpcywgVGV4dCYgdCkKICAgIHsKICAgICAgICBpZiAoaXMuZmxhZ3MoKSAmIGlzLnNraXB3cykgaXMgPj4gc3RkOjpza2lwd3M7CiAgICAgICAgZm9yIChjaGFyIGM6IHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoaXMucGVlaygpICE9IGMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlzLnNldHN0YXRlKHN0ZDo6aW9zOjpmYWlsYml0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlzLmdldCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXM7CiAgICB9CgogICAgc3RydWN0IFVudGlsX0RlbGltIHsKICAgIAlVbnRpbF9EZWxpbShzdGQ6OnN0cmluZyYgcywgc3RkOjpzdHJpbmcgZGVsaW0pIDogc18ocyksIGRlbGltXyhkZWxpbSkgeyB9CiAgICAJc3RkOjpzdHJpbmcmIHNfOwogICAgCXN0ZDo6c3RyaW5nIGRlbGltXzsKICAgIH07CgogICAgc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgaXMsIGNvbnN0IFVudGlsX0RlbGltJiB1ZCkKICAgIHsKICAgICAgICBzdGQ6OmlzdHJlYW06OnNlbnRyeSBzZW50cnkoaXMpOwogICAgICAgIHNpemVfdCBpbl9kZWxpbSA9IDA7CiAgICAgICAgZm9yIChjaGFyIGMgPSBpcy5nZXQoKTsgaXM7IGMgPSBpcy5nZXQoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChjID09IHVkLmRlbGltX1tpbl9kZWxpbV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgrK2luX2RlbGltID09IHVkLmRlbGltXy5zaXplKCkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpbl9kZWxpbSkgLy8gd2FzIHBhcnQtd2F5IGludG8gZGVsaW1pdGVyIG1hdGNoLi4uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVkLnNfLmFwcGVuZCh1ZC5kZWxpbV8sIDAsIGluX2RlbGltKTsKICAgICAgICAgICAgICAgIGluX2RlbGltID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB1ZC5zXyArPSBjOwogICAgICAgIH0KICAgICAgICAvLyBtYXkgbmVlZCB0byB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2UuLi4KICAgICAgICBpZiAoaXMuZmxhZ3MoKSAmIHN0ZDo6aW9zX2Jhc2U6OnNraXB3cykKICAgICAgICAgICAgd2hpbGUgKCF1ZC5zXy5lbXB0eSgpICYmIHN0ZDo6aXNzcGFjZSh1ZC5zXy5iYWNrKCkpKQogICAgICAgICAgICAgICAgdWQuc18ucG9wX2JhY2soKTsKICAgICAgICByZXR1cm4gaXM7CiAgICB9CiAgICAKICAgIGludCBtYWluKCkKICAgIHsKICAgIAlUZXh0IHR7Imlnbm9yZSJ9OwogICAgCXN0ZDo6aXN0cmluZ3N0cmVhbSBpc3MoImlnbm9yZTMuMTRpZ25vcmUgU29tZSBpZ25vcmFibGUgVGV4dCBpZ25vcmUgMi43MTgiKTsKICAgIAkKICAgIAlkb3VibGUgcGksIGU7CiAgICAJc3RkOjpzdHJpbmcgYV9zdHJpbmc7CiAgICAJaWYgKGlzcyA+PiB0ID4+IHBpID4+IHQgPj4gVW50aWxfRGVsaW0oYV9zdHJpbmcsICJpZ25vcmUiKSA+PiBlKQogICAgCSAgICBzdGQ6OmNvdXQgPDwgInBpICIgPDwgcGkgPDwgIiwgYV9zdHJpbmcgJyIgPDwgYV9zdHJpbmcgPDwgIicsIGUgIiA8PCBlIDw8ICdcbic7CiAgICB9