From 016d5b0842529aca1b1ff89152dc447e5e8b716f Mon Sep 17 00:00:00 2001 From: uvos <devnull@uvos.xyz> Date: Fri, 10 May 2024 12:37:21 +0200 Subject: [PATCH] Fix kiss_eis_to_relaxis swallowing serial operators and improve the bracket handling --- test.cpp | 10 ++++++++++ translators.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/test.cpp b/test.cpp index 6dc9f22..67c7a33 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 9df37e5..03d337b 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()); } -- GitLab