From 4354d8a5781c7dc83b48a7429eee7ee86b7cec41 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Fri, 23 Apr 2021 17:30:38 +0200
Subject: [PATCH] Julia: do not overwrite steady state / auxiliary
 variables/series files if contents has not changed

Ref. DynareJulia/Dynare.jl#1
---
 src/DynamicModel.cc       | 13 +++----------
 src/ModelEquationBlock.cc | 14 ++++----------
 src/StaticModel.cc        | 13 +++----------
 3 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index f4bddc54..da33a68b 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -24,6 +24,7 @@
 #include <algorithm>
 #include <numeric>
 #include <regex>
+#include <sstream>
 
 #include "DynamicModel.hh"
 
@@ -4595,17 +4596,9 @@ DynamicModel::writeSetAuxiliaryVariables(const string &basename, bool julia) con
     return;
 
   string func_name = julia ? basename + "_dynamic_set_auxiliary_series" : "dynamic_set_auxiliary_series";
-  string filename = julia ? func_name + ".jl" : packageDir(basename) + "/" + func_name + ".m";
   string comment = julia ? "#" : "%";
 
-  ofstream output;
-  output.open(filename, ios::out | ios::binary);
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-
+  stringstream output;
   output << "function ds = " << func_name + "(ds, params)" << endl
          << comment << endl
          << comment << " Status : Computes Auxiliary variables of the dynamic model and returns a dseries" << endl
@@ -4614,7 +4607,7 @@ DynamicModel::writeSetAuxiliaryVariables(const string &basename, bool julia) con
          << comment << "           from model file (.mod)" << endl << endl
          << output_func_body.str();
 
-  output.close();
+  writeToFileIfModified(output, julia ? func_name + ".jl" : packageDir(basename) + "/" + func_name + ".m");
 }
 
 void
diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc
index 96d09c64..69531800 100644
--- a/src/ModelEquationBlock.cc
+++ b/src/ModelEquationBlock.cc
@@ -19,6 +19,7 @@
 
 #include <cassert>
 #include <algorithm>
+#include <sstream>
 
 #include "ModelEquationBlock.hh"
 
@@ -190,17 +191,9 @@ SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_model
   if (def_table.size() == 0)
     return;
 
-  string filename = julia ? basename + "SteadyState2.jl" : packageDir(basename) + "/steadystate.m";
-  ofstream output;
-  output.open(filename, ios::out | ios::binary);
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-
   ExprNodeOutputType output_type = (julia ? ExprNodeOutputType::juliaSteadyStateFile : ExprNodeOutputType::steadyStateFile);
 
+  stringstream output;
   if (!julia)
     output << "function [ys_, params, info] = steadystate("
            << "ys_, exo_, params)" << endl
@@ -243,7 +236,8 @@ SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_model
   output << "end" << endl;
   if (julia)
     output << "end" << endl;
-  output.close();
+
+  writeToFileIfModified(output, julia ? basename + "SteadyState2.jl" : packageDir(basename) + "/steadystate.m");
 }
 
 void
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index a3ae89c5..eafb81f8 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -22,6 +22,7 @@
 #include <cstdlib>
 #include <cassert>
 #include <algorithm>
+#include <sstream>
 
 #include "StaticModel.hh"
 #include "DynamicModel.hh"
@@ -2115,17 +2116,9 @@ StaticModel::writeSetAuxiliaryVariables(const string &basename, bool julia) cons
     return;
 
   string func_name = julia ? basename + "_set_auxiliary_variables" : "set_auxiliary_variables";
-  string filename = julia ? func_name + ".jl" : packageDir(basename) + "/" + func_name + ".m";
   string comment = julia ? "#" : "%";
 
-  ofstream output;
-  output.open(filename, ios::out | ios::binary);
-  if (!output.is_open())
-    {
-      cerr << "ERROR: Can't open file " << filename << " for writing" << endl;
-      exit(EXIT_FAILURE);
-    }
-
+  stringstream output;
   output << "function ";
   if (!julia)
     output << "y = ";
@@ -2142,7 +2135,7 @@ StaticModel::writeSetAuxiliaryVariables(const string &basename, bool julia) cons
   if (julia)
     output << "end" << endl;
 
-  output.close();
+  writeToFileIfModified(output, julia ? func_name + ".jl" : packageDir(basename) + "/" + func_name + ".m");
 }
 
 void
-- 
GitLab