#include <stdio.h>
#include <string.h>
#include <ctype.h>
typedef enum { Error='e', First='F', Name='N', Text='T', Left='L', } Mode;
typedef enum { Begin='B', End='E', } Type;
typedef struct Tag {
char name;
Type type;
} Tag;
static inline int
istarch(int ch) {
}
static Tag*
read_tag_name(Tag* tag, char** src) {
Mode m = First;
char* p = *src;
tag->name = 0;
for (; ; ++p) {
char ch = *p;
if (ch == '\0')
goto error;
switch (m) {
default: goto error; break;
case First:
tag->name = ch;
tag->type = Begin;
m = Name;
} else if (ch == '/') {
tag->type = End;
m = Name;
} else {
goto error;
}
break;
case Name:
tag->name = ch;
} else if (ch == '>') {
if (!tag->name)
goto error;
goto success;
}
break;
}
}
error:
*src = p;
return NULL;
success:
*src = p;
return tag;
}
static Tag*
read_tag(Tag* btag, char** src) {
Mode m = First;
char* p = *src;
if (!btag)
goto error;
for (; ; ++p) {
char ch = *p;
if (ch == '\0') {
goto error;
}
switch (m) {
default: goto error; break;
case First:
if (istarch(ch)) m = Text;
else if (ch == '<') m = Left;
break;
case Text:
if (ch == '<') m = Left;
break;
case Left: {
Tag tmp;
if (!read_tag_name(&tmp, &p)) {
goto error;
}
if (tmp.name == 'a' && btag->name == 'b') {
goto error;
}
if (tmp.name == btag->name && tmp.type == End) {
goto success;
}
if (!read_tag(&tmp, &p)) {
goto error;
}
m = First;
} break;
}
}
error:
*src = p;
return NULL;
success:
*src = p;
return btag;
}
static int
parse(char* src) {
Mode m = First;
char* p = src;
for (; ; ++p) {
char ch = *p;
if (ch == '\0') {
if (m == Text || m == First)
goto success;
goto error;
}
switch (m) {
default: goto error; break;
case First:
if (istarch(ch)) m = Text;
else if (ch == '<') m = Left;
else goto error;
break;
case Text:
if (ch == '<') m = Left;
break;
case Left: {
Tag t;
if (!read_tag(read_tag_name(&t, &p), &p)) {
goto error;
}
m = First;
} break;
}
}
error:
return 0;
success:
return 1;
}
int main(void) {
char buf[1024];
while (fgets(buf
, sizeof buf
, stdin
)) { if (buf[len-1] == '\n')
buf[len-1] = '\0';
printf("%d '%s'\n", parse
(buf
), buf
); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+Cgp0eXBlZGVmIGVudW0geyBFcnJvcj0nZScsIEZpcnN0PSdGJywgTmFtZT0nTicsIFRleHQ9J1QnLCBMZWZ0PSdMJywgfSBNb2RlOwp0eXBlZGVmIGVudW0geyBCZWdpbj0nQicsIEVuZD0nRScsIH0gVHlwZTsKCnR5cGVkZWYgc3RydWN0IFRhZyB7CgljaGFyIG5hbWU7CglUeXBlIHR5cGU7Cn0gVGFnOwoKc3RhdGljIGlubGluZSBpbnQKaXN0YXJjaChpbnQgY2gpIHsKCXJldHVybiAoaXNhbG51bShjaCkgfHwgY2ggPT0gJyAnKTsKfQoKc3RhdGljIFRhZyoKcmVhZF90YWdfbmFtZShUYWcqIHRhZywgY2hhcioqIHNyYykgewoJTW9kZSBtID0gRmlyc3Q7CgljaGFyKiBwID0gKnNyYzsKCgl0YWctPm5hbWUgPSAwOwoKCWZvciAoOyA7ICsrcCkgewoJCWNoYXIgY2ggPSAqcDsKCQlpZiAoY2ggPT0gJ1wwJykKCQkJZ290byBlcnJvcjsKCQkKCQlzd2l0Y2ggKG0pIHsKCQkJZGVmYXVsdDogZ290byBlcnJvcjsgYnJlYWs7CgkJCWNhc2UgRmlyc3Q6CgkJCQlpZiAoaXNhbHBoYShjaCkpIHsKCQkJCQl0YWctPm5hbWUgPSBjaDsKCQkJCQl0YWctPnR5cGUgPSBCZWdpbjsKCQkJCQltID0gTmFtZTsKCQkJCX0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7CgkJCQkJdGFnLT50eXBlID0gRW5kOwoJCQkJCW0gPSBOYW1lOwoJCQkJfSBlbHNlIHsKCQkJCQlnb3RvIGVycm9yOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgTmFtZToKCQkJCWlmIChpc2FscGhhKGNoKSkgewoJCQkJCXRhZy0+bmFtZSA9IGNoOwoJCQkJfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKCQkJCQlpZiAoIXRhZy0+bmFtZSkKCQkJCQkJZ290byBlcnJvcjsKCQkJCQlnb3RvIHN1Y2Nlc3M7CgkJCQl9CgkJCQlicmVhazsKCQl9Cgl9CmVycm9yOgoJKnNyYyA9IHA7CglyZXR1cm4gTlVMTDsKc3VjY2VzczoKCSpzcmMgPSBwOwoJcmV0dXJuIHRhZzsKfQoKc3RhdGljIFRhZyoKcmVhZF90YWcoVGFnKiBidGFnLCBjaGFyKiogc3JjKSB7CglNb2RlIG0gPSBGaXJzdDsKCWNoYXIqIHAgPSAqc3JjOwoKCWlmICghYnRhZykKCQlnb3RvIGVycm9yOwoKCWZvciAoOyA7ICsrcCkgewoJCWNoYXIgY2ggPSAqcDsKCQlpZiAoY2ggPT0gJ1wwJykgewoJCQlnb3RvIGVycm9yOwoJCX0KCgkJc3dpdGNoIChtKSB7CgkJCWRlZmF1bHQ6IGdvdG8gZXJyb3I7IGJyZWFrOwoJCQljYXNlIEZpcnN0OgoJCQkJaWYgKGlzdGFyY2goY2gpKSBtID0gVGV4dDsKCQkJCWVsc2UgaWYgKGNoID09ICc8JykgbSA9IExlZnQ7CgkJCQlicmVhazsKCQkJY2FzZSBUZXh0OgoJCQkJaWYgKGNoID09ICc8JykgbSA9IExlZnQ7CgkJCQlicmVhazsKCQkJY2FzZSBMZWZ0OiB7CgkJCQlUYWcgdG1wOwoJCQkJaWYgKCFyZWFkX3RhZ19uYW1lKCZ0bXAsICZwKSkgewoJCQkJCWdvdG8gZXJyb3I7CgkJCQl9CgkJCQlpZiAodG1wLm5hbWUgPT0gJ2EnICYmIGJ0YWctPm5hbWUgPT0gJ2InKSB7CgkJCQkJZ290byBlcnJvcjsKCQkJCX0KCQkJCWlmICh0bXAubmFtZSA9PSBidGFnLT5uYW1lICYmIHRtcC50eXBlID09IEVuZCkgewoJCQkJCWdvdG8gc3VjY2VzczsKCQkJCX0KCQkJCWlmICghcmVhZF90YWcoJnRtcCwgJnApKSB7CgkJCQkJZ290byBlcnJvcjsKCQkJCX0KCQkJCW0gPSBGaXJzdDsKCQkJfSBicmVhazsKCQl9Cgl9CmVycm9yOgoJKnNyYyA9IHA7CglyZXR1cm4gTlVMTDsKc3VjY2VzczoKCSpzcmMgPSBwOwoJcmV0dXJuIGJ0YWc7Cn0KCnN0YXRpYyBpbnQKcGFyc2UoY2hhciogc3JjKSB7CglNb2RlIG0gPSBGaXJzdDsKCWNoYXIqIHAgPSBzcmM7CgoJZm9yICg7IDsgKytwKSB7CgkJY2hhciBjaCA9ICpwOwoJCWlmIChjaCA9PSAnXDAnKSB7CgkJCWlmIChtID09IFRleHQgfHwgbSA9PSBGaXJzdCkKCQkJCWdvdG8gc3VjY2VzczsKCQkJZ290byBlcnJvcjsKCQl9CgoJCXN3aXRjaCAobSkgewoJCQlkZWZhdWx0OiBnb3RvIGVycm9yOyBicmVhazsKCQkJY2FzZSBGaXJzdDoKCQkJCWlmIChpc3RhcmNoKGNoKSkgbSA9IFRleHQ7CgkJCQllbHNlIGlmIChjaCA9PSAnPCcpIG0gPSBMZWZ0OwoJCQkJZWxzZSBnb3RvIGVycm9yOwoJCQlicmVhazsKCQkJY2FzZSBUZXh0OgoJCQkJaWYgKGNoID09ICc8JykgbSA9IExlZnQ7CgkJCWJyZWFrOwoJCQljYXNlIExlZnQ6IHsKCQkJCVRhZyB0OwoJCQkJaWYgKCFyZWFkX3RhZyhyZWFkX3RhZ19uYW1lKCZ0LCAmcCksICZwKSkgewoJCQkJCWdvdG8gZXJyb3I7CgkJCQl9CgkJCQltID0gRmlyc3Q7CgkJCX0gYnJlYWs7CgkJfQoJfQplcnJvcjoKCXJldHVybiAwOwpzdWNjZXNzOgoJcmV0dXJuIDE7Cn0KCmludCBtYWluKHZvaWQpIHsKCWNoYXIgYnVmWzEwMjRdOwoKCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZiBidWYsIHN0ZGluKSkgewoJCXNpemVfdCBsZW4gPSBzdHJsZW4oYnVmKTsKCQlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQoJCQlidWZbbGVuLTFdID0gJ1wwJzsKCQlwcmludGYoIiVkICclcydcbiIsIHBhcnNlKGJ1ZiksIGJ1Zik7Cgl9CglyZXR1cm4gMDsKfQo=
Jmx0O2EmZ3Q7cnVieSZsdDtiJmd0O3BocCZsdDsvYiZndDtweXRob24mbHQ7L2EmZ3Q7Jmx0O2EmZ3Q7Jmx0O2ImZ3Q7Jmx0Oy9iJmd0OyZsdDsvYSZndDsmbHQ7YSZndDsmbHQ7L2EmZ3Q7CiZsdDthJmd0O3J1YnkmbHQ7YiZndDtwaHAmbHQ7L2ImZ3Q7cHl0aG9uJmx0Oy9hJmd0OyZsdDthJmd0OyZsdDsvYiZndDsmbHQ7L2EmZ3Q7Jmx0O2EmZ3Q7Jmx0Oy9hJmd0OwombHQ7YSZndDtydWJ5Jmx0O2ImZ3Q7cGhwJmx0Oy9iJmd0O3B5dGhvbiZsdDsvYSZndDsmbHQ7YSZndDsmbHQ7YiZndDsmbHQ7L2EmZ3Q7Jmx0O2EmZ3Q7Jmx0Oy9hJmd0OwombHQ7YSZndDtydWJ5Jmx0O2ImZ3Q7cGhwJmx0Oy9iJmd0O3B5dGhvbiZsdDsvYSZndDsmbHQ7YSZndDsmbHQ7YiZndDsmbHQ7L2ImZ3Q7Jmx0Oy9hJmd0OyZsdDthJmd0Owp2dnZjJmx0O2EmZ3Q7cnVieSZsdDtiJmd0O3BocCZsdDsvYiZndDtweXRob24mbHQ7L2EmZ3Q7Jmx0O2EmZ3Q7Jmx0O2ImZ3Q7Jmx0Oy9iJmd0OyZsdDsvYSZndDsmbHQ7YSZndDsmbHQ7L2EmZ3Q7IA==
<a>ruby<b>php</b>python</a><a><b></b></a><a></a>
<a>ruby<b>php</b>python</a><a></b></a><a></a>
<a>ruby<b>php</b>python</a><a><b></a><a></a>
<a>ruby<b>php</b>python</a><a><b></b></a><a>
vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a>