#include <iostream>
#include <cstring>
using namespace std;
char* find_markers(char* haystack, const char* marker_opening, const char* marker_closing, char* &contents, char* &after)
{
// ...<marker1>... ... ...<marker2>...
// ^return ^contents ^NULL ^after
char* marker_begin = strstr(haystack, marker_opening);
if(marker_begin)
{
contents = &marker_begin[strlen(marker_opening)];
char* marker_end = strstr(contents, marker_closing);
if(marker_end)
{
haystack[marker_end-haystack] = NULL;
after = &marker_end[strlen(marker_closing)];
return marker_begin;
}
return NULL;
}
return NULL;
}
int main()
{
char text[] = " <tag>contents1</tag> <tag><tag> ";
char* cursor = text;
char* contents = NULL;
while(true)
{
if(!find_markers(cursor, "<tag>", "</tag>", contents, cursor)) break;
cout << contents << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNoYXIqIGZpbmRfbWFya2VycyhjaGFyKiBoYXlzdGFjaywgY29uc3QgY2hhciogbWFya2VyX29wZW5pbmcsIGNvbnN0IGNoYXIqIG1hcmtlcl9jbG9zaW5nLCBjaGFyKiAmY29udGVudHMsIGNoYXIqICZhZnRlcikKewogICAgLy8gLi4uPG1hcmtlcjE+Li4uIC4uLiAuLi48bWFya2VyMj4uLi4KICAgIC8vICAgIF5yZXR1cm4gIF5jb250ZW50cyAgXk5VTEwgICAgXmFmdGVyCgogICAgY2hhciogbWFya2VyX2JlZ2luID0gc3Ryc3RyKGhheXN0YWNrLCBtYXJrZXJfb3BlbmluZyk7CiAgICBpZihtYXJrZXJfYmVnaW4pCiAgICB7CiAgICAgICAgY29udGVudHMgPSAmbWFya2VyX2JlZ2luW3N0cmxlbihtYXJrZXJfb3BlbmluZyldOwoKICAgICAgICBjaGFyKiBtYXJrZXJfZW5kID0gc3Ryc3RyKGNvbnRlbnRzLCBtYXJrZXJfY2xvc2luZyk7CiAgICAgICAgaWYobWFya2VyX2VuZCkKICAgICAgICB7CiAgICAgICAgICAgIGhheXN0YWNrW21hcmtlcl9lbmQtaGF5c3RhY2tdID0gTlVMTDsKICAgICAgICAgICAgYWZ0ZXIgPSAmbWFya2VyX2VuZFtzdHJsZW4obWFya2VyX2Nsb3NpbmcpXTsKICAgICAgICAgICAgcmV0dXJuIG1hcmtlcl9iZWdpbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oKQp7CgogICAgY2hhciB0ZXh0W10gPSAiICAgICAgICAgICAgPHRhZz5jb250ZW50czE8L3RhZz4gICAgICAgPHRhZz48dGFnPiAgICAgICAgICAgIjsKICAgIGNoYXIqIGN1cnNvciA9IHRleHQ7CiAgICBjaGFyKiBjb250ZW50cyA9IE5VTEw7CgogICAgd2hpbGUodHJ1ZSkKICAgIHsKICAgICAgICBpZighZmluZF9tYXJrZXJzKGN1cnNvciwgIjx0YWc+IiwgIjwvdGFnPiIsIGNvbnRlbnRzLCBjdXJzb3IpKSBicmVhazsKICAgICAgICBjb3V0IDw8IGNvbnRlbnRzIDw8ICJcbiI7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K