#include <iostream>
#include <sstream>
#include <string>
#include <vector>
//#include <fstream>
using namespace std;
struct tagattribute {
string name;
string value;
};
istream& operator>>(istream &in, tagattribute &attr)
{
getline(in, attr.name, '=');
in.ignore();
getline(in, attr.value, '"');
return in;
}
struct tagline {
string tag;
vector<tagattribute> attributes;
};
istream& operator>>(istream &in, tagline &t)
{
tagattribute attr;
in >> std::ws;
char ch = in.get();
if (ch != '<')
{
in.setstate(ios_base::failbit);
return in;
}
if (!(in >> t.tag))
return in;
do
{
in >> std::ws;
ch = in.peek();
if (ch == '>')
{
in.ignore();
break;
}
if (!(in >> attr))
break;
t.attributes.push_back(attr);
}
while (true);
return in;
}
int main() {
vector<tagline> information;
string line;
//ifstream readFile("file.txt");
istream &readFile = cin;
while (getline(readFile, line)) {
istringstream in(line);
tagline t;
if (in >> t)
information.push_back(t);
}
vector<tagline>::iterator it = information.begin();
for(; it != information.end(); ++it) {
cout << "Tag: " << it->tag << "\n";
vector<tagattribute>::iterator it2 = it->attributes.begin();
for(; it2 != it->attributes.end(); ++it2) {
cout << "name: " << it2->name << "\n"
<< "value: " << it2->value << "\n";
}
cout << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KLy8jaW5jbHVkZSA8ZnN0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgdGFnYXR0cmlidXRlIHsKICAgIHN0cmluZyBuYW1lOwogICAgc3RyaW5nIHZhbHVlOwp9OwoKaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtICZpbiwgdGFnYXR0cmlidXRlICZhdHRyKQp7CiAgICBnZXRsaW5lKGluLCBhdHRyLm5hbWUsICc9Jyk7CiAgICBpbi5pZ25vcmUoKTsKICAgIGdldGxpbmUoaW4sIGF0dHIudmFsdWUsICciJyk7CiAgICByZXR1cm4gaW47Cn0KCnN0cnVjdCB0YWdsaW5lIHsKICAgIHN0cmluZyB0YWc7CiAgICB2ZWN0b3I8dGFnYXR0cmlidXRlPiBhdHRyaWJ1dGVzOwp9OwoKaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtICZpbiwgdGFnbGluZSAmdCkKewogICAgdGFnYXR0cmlidXRlIGF0dHI7CgogICAgaW4gPj4gc3RkOjp3czsKICAgIAogICAgY2hhciBjaCA9IGluLmdldCgpOwogICAgaWYgKGNoICE9ICc8JykKICAgIHsKICAgICAgICBpbi5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CiAgICAgICAgcmV0dXJuIGluOwogICAgfQoKICAgIGlmICghKGluID4+IHQudGFnKSkKICAgICAgICByZXR1cm4gaW47CgogICAgZG8KICAgIHsKICAgICAgICBpbiA+PiBzdGQ6OndzOwoKICAgICAgICBjaCA9IGluLnBlZWsoKTsKICAgICAgICBpZiAoY2ggPT0gJz4nKQogICAgICAgIHsKICAgICAgICAgICAgaW4uaWdub3JlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEoaW4gPj4gYXR0cikpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICB0LmF0dHJpYnV0ZXMucHVzaF9iYWNrKGF0dHIpOwogICAgfQogICAgd2hpbGUgKHRydWUpOwoKICAgIHJldHVybiBpbjsKfQoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8dGFnbGluZT4gaW5mb3JtYXRpb247CiAgICBzdHJpbmcgbGluZTsKCiAgICAvL2lmc3RyZWFtIHJlYWRGaWxlKCJmaWxlLnR4dCIpOwogICAgaXN0cmVhbSAmcmVhZEZpbGUgPSBjaW47CiAgICAKICAgIHdoaWxlIChnZXRsaW5lKHJlYWRGaWxlLCBsaW5lKSkgewogICAgICAgIGlzdHJpbmdzdHJlYW0gaW4obGluZSk7CiAgICAgICAgdGFnbGluZSB0OwoKICAgICAgICBpZiAoaW4gPj4gdCkKICAgICAgICAgICAgaW5mb3JtYXRpb24ucHVzaF9iYWNrKHQpOwogICAgfQoKICAgIHZlY3Rvcjx0YWdsaW5lPjo6aXRlcmF0b3IgaXQgPSBpbmZvcm1hdGlvbi5iZWdpbigpOwogICAgZm9yKDsgaXQgIT0gaW5mb3JtYXRpb24uZW5kKCk7ICsraXQpIHsKICAgICAgICBjb3V0IDw8ICJUYWc6ICIgPDwgaXQtPnRhZyA8PCAiXG4iOwoKICAgICAgICB2ZWN0b3I8dGFnYXR0cmlidXRlPjo6aXRlcmF0b3IgaXQyID0gaXQtPmF0dHJpYnV0ZXMuYmVnaW4oKTsKICAgICAgICBmb3IoOyBpdDIgIT0gaXQtPmF0dHJpYnV0ZXMuZW5kKCk7ICsraXQyKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIm5hbWU6ICIgPDwgaXQyLT5uYW1lIDw8ICJcbiIKICAgICAgICAgICAgPDwgInZhbHVlOiAiIDw8IGl0Mi0+dmFsdWUgPDwgIlxuIjsKICAgICAgICB9CgogICAgICAgIGNvdXQgPDwgIlxuIjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==