#include <iostream>
#include <string>
#include <regex.h>
const int MAX_MATCHES(20);
void elements(const std::string &input)
{
regex_t ElementRegEx;
regcomp(&ElementRegEx, "([0-9]+)", REG_EXTENDED);
regmatch_t ElementMatches[MAX_MATCHES];
if (!regexec(&ElementRegEx, input.c_str(), MAX_MATCHES, ElementMatches, 0))
{
int Element = 0;
while ((ElementMatches[Element].rm_so != -1) && (ElementMatches[Element].rm_eo != -1))
{
regmatch_t &ElementMatch = ElementMatches[Element];
std::string CurrentElement(input.substr(ElementMatch.rm_so, ElementMatch.rm_eo - ElementMatch.rm_so));
std::cout << '\t' << CurrentElement << '\n';
++Element;
}
}
}
void cycles(const std::string &input)
{
regex_t CycleRegEx;
regcomp(&CycleRegEx, "([0-9]+[ ]*,[ ]*)*[0-9]+", REG_EXTENDED);
regmatch_t CycleMatches[MAX_MATCHES];
if (!regexec(&CycleRegEx, input.c_str(), MAX_MATCHES, CycleMatches, 0))
{
int Cycle = 0;
while ((CycleMatches[Cycle].rm_so != -1) && (CycleMatches[Cycle].rm_eo != -1))
{
regmatch_t &CycleMatch = CycleMatches[Cycle];
const std::string CurrentCycle(input.substr(CycleMatch.rm_so, CycleMatch.rm_eo - CycleMatch.rm_so));
std::cout << CurrentCycle << '\n';
elements(CurrentCycle);
++Cycle;
}
}
regfree(&CycleRegEx);
}
int main(int argc, char **argv)
{
std::string input("(1,2,5)(3,4)");
std::cout << "input: " << input << "\n\n";
cycles(input);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPHJlZ2V4Lmg+Cgpjb25zdCBpbnQgTUFYX01BVENIRVMoMjApOwoKdm9pZCBlbGVtZW50cyhjb25zdCBzdGQ6OnN0cmluZyAmaW5wdXQpCnsKICAgIHJlZ2V4X3QgRWxlbWVudFJlZ0V4OwoJcmVnY29tcCgmRWxlbWVudFJlZ0V4LCAiKFswLTldKykiLCBSRUdfRVhURU5ERUQpOwoJCglyZWdtYXRjaF90IEVsZW1lbnRNYXRjaGVzW01BWF9NQVRDSEVTXTsKCWlmICghcmVnZXhlYygmRWxlbWVudFJlZ0V4LCBpbnB1dC5jX3N0cigpLCBNQVhfTUFUQ0hFUywgRWxlbWVudE1hdGNoZXMsIDApKQoJewoJCWludCBFbGVtZW50ID0gMDsKCQkKCQl3aGlsZSAoKEVsZW1lbnRNYXRjaGVzW0VsZW1lbnRdLnJtX3NvICE9IC0xKSAmJiAoRWxlbWVudE1hdGNoZXNbRWxlbWVudF0ucm1fZW8gIT0gLTEpKQoJCXsKCQkJcmVnbWF0Y2hfdCAmRWxlbWVudE1hdGNoID0gRWxlbWVudE1hdGNoZXNbRWxlbWVudF07CgkJCXN0ZDo6c3RyaW5nIEN1cnJlbnRFbGVtZW50KGlucHV0LnN1YnN0cihFbGVtZW50TWF0Y2gucm1fc28sIEVsZW1lbnRNYXRjaC5ybV9lbyAtIEVsZW1lbnRNYXRjaC5ybV9zbykpOwoJCQlzdGQ6OmNvdXQgPDwgJ1x0JyA8PCBDdXJyZW50RWxlbWVudCA8PCAnXG4nOwoJCQkKCQkJKytFbGVtZW50OwoJCX0KCX0KfQoKdm9pZCBjeWNsZXMoY29uc3Qgc3RkOjpzdHJpbmcgJmlucHV0KQp7CglyZWdleF90IEN5Y2xlUmVnRXg7CglyZWdjb21wKCZDeWNsZVJlZ0V4LCAiKFswLTldK1sgXSosWyBdKikqWzAtOV0rIiwgUkVHX0VYVEVOREVEKTsKCQoJcmVnbWF0Y2hfdCBDeWNsZU1hdGNoZXNbTUFYX01BVENIRVNdOwoJaWYgKCFyZWdleGVjKCZDeWNsZVJlZ0V4LCBpbnB1dC5jX3N0cigpLCBNQVhfTUFUQ0hFUywgQ3ljbGVNYXRjaGVzLCAwKSkKCXsKCQlpbnQgQ3ljbGUgPSAwOwoJCQoJCXdoaWxlICgoQ3ljbGVNYXRjaGVzW0N5Y2xlXS5ybV9zbyAhPSAtMSkgJiYgKEN5Y2xlTWF0Y2hlc1tDeWNsZV0ucm1fZW8gIT0gLTEpKQoJCXsKCQkJcmVnbWF0Y2hfdCAmQ3ljbGVNYXRjaCA9IEN5Y2xlTWF0Y2hlc1tDeWNsZV07CgkJCWNvbnN0IHN0ZDo6c3RyaW5nIEN1cnJlbnRDeWNsZShpbnB1dC5zdWJzdHIoQ3ljbGVNYXRjaC5ybV9zbywgQ3ljbGVNYXRjaC5ybV9lbyAtIEN5Y2xlTWF0Y2gucm1fc28pKTsKCQkJc3RkOjpjb3V0IDw8IEN1cnJlbnRDeWNsZSA8PCAnXG4nOwoJCQkKCQkJZWxlbWVudHMoQ3VycmVudEN5Y2xlKTsKCQkJKytDeWNsZTsKCQl9Cgl9CgkKCXJlZ2ZyZWUoJkN5Y2xlUmVnRXgpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIHN0ZDo6c3RyaW5nIGlucHV0KCIoMSwyLDUpKDMsNCkiKTsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJpbnB1dDogIiA8PCBpbnB1dCA8PCAiXG5cbiI7CiAgICAKCWN5Y2xlcyhpbnB1dCk7CglyZXR1cm4gMDsKfQo=