parse location with optional parens

This commit is contained in:
2025-01-11 19:31:35 -06:00
committed by Celtic Minstrel
parent 4d005cda2a
commit d7d06db50d

View File

@@ -241,25 +241,35 @@ std::ostream& operator<< (std::ostream& out, location l) {
struct match {
char c;
bool optional = false;
};
static std::istream& operator>> (std::istream& in, match m) {
if(in.get() != m.c) {
in.setstate(std::ios_base::failbit);
if(in.eof()){
if(!m.optional){
in.setstate(std::ios_base::failbit);
}else{
in.clear();
}
return in;
}
char next = in.get();
if(next != m.c) {
if(m.optional){
in.putback(next);
}else{
in.setstate(std::ios_base::failbit);
}
}
return in;
}
std::istream& operator>> (std::istream& in, location& l) {
in >> std::ws >> match{'('};
std::stringbuf sstr;
in.get(sstr, ',');
l.x = std::stoi(sstr.str());
in >> std::ws >> match{'(', true};
in >> l.x;
in >> match{','} >> std::ws;
sstr.str("");
in.get(sstr, ')');
l.y = std::stoi(sstr.str());
in >> match{')'};
in >> l.y;
in >> match{')', true};
return in;
}