diff --git a/test.cpp b/test.cpp index 6dc9f22f82ee18759ef8e04ebe58859097474f6b..67c7a33472de053bfe511bf0a1935652a23e59fc 100644 --- a/test.cpp +++ b/test.cpp @@ -302,6 +302,16 @@ bool testTranslate() free(cdc); free(relaxis); + model = "rc-rc-rc"; + cdc = kiss_eis_to_cdc(model); + relaxis = kiss_eis_to_relaxis(model); + std::cout<<"Eis: "<<model<<'\n'; + std::cout<<"CDC: "<<cdc<<'\n'; + std::cout<<"RelaxIS: "<<relaxis<<'\n'; + + free(cdc); + free(relaxis); + return true; } diff --git a/translators.cpp b/translators.cpp index 9df37e5d9d40f10ca9e3e1c05cba683c1221df73..03d337b12a9250cb95cfbb6869b1706f28e9c13e 100644 --- a/translators.cpp +++ b/translators.cpp @@ -200,6 +200,48 @@ static void replaceBraket(std::string& in, size_t start, size_t num) } +static bool removeUnnededBracket(std::string& in, size_t start_index) +{ + size_t level = 0; + for(size_t i = start_index; i < in.size(); ++i) + { + if(in[i] == '(') + { + ++level; + } + else if(level == 0) + { + if(in[i] == '-') + break; + else if(in[i] == ')') + { + if(i - start_index > 2) + { + in.erase(i, 1); + in.erase(start_index, 1); + return true; + } + break; + } + } + else if(in[i] == ')') + { + --level; + } + } + + return false; +} + +static void removeUnnededBrackets(std::string& in) +{ + for(size_t i = 0; i < in.size(); ++i) + { + if(in[i] == '(' && removeUnnededBracket(in, i) && i > 0) + --i; + } +} + char* kiss_eis_to_relaxis(const char* in) { char* workcstr = kiss_eis_to_cdc(in); @@ -222,6 +264,8 @@ char* kiss_eis_to_relaxis(const char* in) out.pop_back(); out.push_back(')'); --level; + if(level % 2 == 0) + out.push_back('-'); } else { @@ -241,6 +285,8 @@ char* kiss_eis_to_relaxis(const char* in) if(out.back() == '-') out.pop_back(); + removeUnnededBrackets(out); + return strdup(out.c_str()); }