Skip to content
Snippets Groups Projects
Verified Commit f9e91d33 authored by Sébastien Villemot's avatar Sébastien Villemot
Browse files

Macroprocessor: make @#echomacrovars output in case-insensitive alphabetical order

It was previously in case-sensitive alphabetical order (i.e. ASCII order).

Ref. #128
parent 6f845d9e
Branches
No related tags found
No related merge requests found
Pipeline #10649 passed
...@@ -17,7 +17,9 @@ ...@@ -17,7 +17,9 @@
* along with Dynare. If not, see <https://www.gnu.org/licenses/>. * along with Dynare. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <algorithm>
#include <cassert> #include <cassert>
#include <ranges>
#include "Environment.hh" #include "Environment.hh"
#include "Expressions.hh" #include "Expressions.hh"
...@@ -107,9 +109,21 @@ Environment::print(ostream& output, const vector<string>& vars, const optional<i ...@@ -107,9 +109,21 @@ Environment::print(ostream& output, const vector<string>& vars, const optional<i
if (!save && !variables.empty()) if (!save && !variables.empty())
output << "Macro Variables:" << endl; output << "Macro Variables:" << endl;
// For sorting the symbols in a case-insensitive way, see #128
auto case_insensitive_string_less = [](const string& a, const string& b) {
return lexicographical_compare(
begin(a), end(a), begin(b), end(b),
[](const char& c1, const char& c2) { return tolower(c1) < tolower(c2); });
};
if (vars.empty()) if (vars.empty())
for (const auto& it : variables) {
printVariable(output, it.first, line, save); vector<string> variables_sorted;
ranges::copy(views::keys(variables), back_inserter(variables_sorted));
ranges::sort(variables_sorted, case_insensitive_string_less);
for (const auto& it : variables_sorted)
printVariable(output, it, line, save);
}
else else
for (const auto& it : vars) for (const auto& it : vars)
if (isVariableDefined(it)) if (isVariableDefined(it))
...@@ -119,8 +133,13 @@ Environment::print(ostream& output, const vector<string>& vars, const optional<i ...@@ -119,8 +133,13 @@ Environment::print(ostream& output, const vector<string>& vars, const optional<i
output << "Macro Functions:" << endl; output << "Macro Functions:" << endl;
if (vars.empty()) if (vars.empty())
for (const auto& it : functions) {
printFunction(output, it.first, line, save); vector<string> functions_sorted;
ranges::copy(views::keys(functions), back_inserter(functions_sorted));
ranges::sort(functions_sorted, case_insensitive_string_less);
for (const auto& it : functions_sorted)
printFunction(output, it, line, save);
}
else else
for (const auto& it : vars) for (const auto& it : vars)
if (isFunctionDefined(it)) if (isFunctionDefined(it))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment