From de6ca5cdcc916ad8361c4d8a62ad125c149368e3 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Wed, 5 Feb 2020 16:24:35 +0100
Subject: [PATCH] Combine `DynareMain.cc` and `DynareMain2.cc`

---
 src/DynareMain.cc  | 65 ++++++++++++++++++++++++++------------
 src/DynareMain2.cc | 77 ----------------------------------------------
 src/Makefile.am    |  1 -
 3 files changed, 45 insertions(+), 98 deletions(-)
 delete mode 100644 src/DynareMain2.cc

diff --git a/src/DynareMain.cc b/src/DynareMain.cc
index 42506dac..9429c978 100644
--- a/src/DynareMain.cc
+++ b/src/DynareMain.cc
@@ -17,6 +17,7 @@
  * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <filesystem>
 #include <iostream>
 #include <sstream>
 #include <fstream>
@@ -35,22 +36,12 @@
 #include "ParsingDriver.hh"
 #include "ExtendedPreprocessorTypes.hh"
 #include "ConfigFile.hh"
+#include "ModFile.hh"
 
 /* Prototype for second part of main function
    Splitting main() in two parts was necessary because ParsingDriver.h and MacroDriver.h can't be
    included simultaneously (because of Bison limitations).
 */
-void main2(stringstream &in, const string &basename, bool debug, bool clear_all, bool clear_global,
-           bool no_tmp_terms, bool no_log, bool no_warn, bool warn_uninit, bool console,
-           bool nograph, bool nointeractive, bool parallel, const ConfigFile &config_file,
-           WarningConsolidation &warnings_arg, bool nostrict, bool stochastic, bool check_model_changes,
-           bool minimal_workspace, bool compute_xrefs, FileOutputType output_mode,
-           LanguageOutputType lang, int params_derivs_order, bool transform_unary_ops,
-           const string &exclude_eqs, const string &include_eqs,
-           JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple,
-           const string &mexext, const filesystem::path &matlabroot,
-           const filesystem::path &dynareroot, bool onlymodel);
-
 void main1(const string &filename, const string &basename, istream &modfile, bool debug, bool save_macro, string &save_macro_file,
            bool line_macro, const vector<pair<string, string>> &defines, vector<filesystem::path> &paths, stringstream &macro_output);
 
@@ -427,7 +418,9 @@ main(int argc, char **argv)
   for (const auto &it : config_file.getIncludePaths())
     paths.emplace_back(it);
 
-  // Do macro processing
+  /*
+   * Macro-expand MOD file
+   */
   stringstream macro_output;
   main1(filename, basename, modfile, debug, save_macro, save_macro_file, line_macro,
         defines, paths, macro_output);
@@ -441,13 +434,45 @@ main(int argc, char **argv)
       exit(EXIT_FAILURE);
     }
 
-  // Do the rest
-  main2(macro_output, basename, debug, clear_all, clear_global,
-        no_tmp_terms, no_log, no_warn, warn_uninit, console, nograph, nointeractive,
-        parallel, config_file, warnings, nostrict, stochastic, check_model_changes, minimal_workspace,
-        compute_xrefs, output_mode, language, params_derivs_order, transform_unary_ops, exclude_eqs, include_eqs,
-        json, json_output_mode, onlyjson, jsonderivsimple,
-        mexext, matlabroot, dynareroot, onlymodel);
-
+  /*
+   * Process Macro-expanded MOD file
+   */
+  ParsingDriver p(warnings, nostrict);
+
+  filesystem::remove_all(basename + "/model/json");
+
+  // Do parsing and construct internal representation of mod file
+  unique_ptr<ModFile> mod_file = p.parse(macro_output, debug);
+  if (json == JsonOutputPointType::parsing)
+    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson);
+
+  // Run checking pass
+  mod_file->checkPass(nostrict, stochastic);
+  if (json == JsonOutputPointType::checkpass)
+    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson);
+
+  // Perform transformations on the model (creation of auxiliary vars and equations)
+  mod_file->transformPass(nostrict, stochastic, compute_xrefs || json == JsonOutputPointType::transformpass,
+                          transform_unary_ops, exclude_eqs, include_eqs);
+  if (json == JsonOutputPointType::transformpass)
+    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson);
+
+  // Evaluate parameters initialization, initval, endval and pounds
+  mod_file->evalAllExpressions(warn_uninit);
+
+  // Do computations
+  mod_file->computingPass(no_tmp_terms, output_mode, params_derivs_order);
+  if (json == JsonOutputPointType::computingpass)
+    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson, jsonderivsimple);
+
+  // Write outputs
+  if (output_mode != FileOutputType::none)
+    mod_file->writeExternalFiles(basename, language);
+  else
+    mod_file->writeOutputFiles(basename, clear_all, clear_global, no_log, no_warn, console, nograph,
+                               nointeractive, config_file, check_model_changes, minimal_workspace, compute_xrefs,
+                               mexext, matlabroot, dynareroot, onlymodel);
+
+  cout << "Preprocessing completed." << endl;
   return EXIT_SUCCESS;
 }
diff --git a/src/DynareMain2.cc b/src/DynareMain2.cc
deleted file mode 100644
index abcb9dda..00000000
--- a/src/DynareMain2.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright © 2008-2019 Dynare Team
- *
- * This file is part of Dynare.
- *
- * Dynare is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Dynare is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <iostream>
-#include <filesystem>
-
-#include "ParsingDriver.hh"
-#include "ModFile.hh"
-#include "ConfigFile.hh"
-#include "ExtendedPreprocessorTypes.hh"
-
-void
-main2(stringstream &in, const string &basename, bool debug, bool clear_all, bool clear_global,
-      bool no_tmp_terms, bool no_log, bool no_warn, bool warn_uninit, bool console,
-      bool nograph, bool nointeractive, bool parallel, const ConfigFile &config_file,
-      WarningConsolidation &warnings, bool nostrict, bool stochastic, bool check_model_changes,
-      bool minimal_workspace, bool compute_xrefs, FileOutputType output_mode,
-      LanguageOutputType language, int params_derivs_order, bool transform_unary_ops,
-      const string &exclude_eqs, const string &include_eqs,
-      JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple,
-      const string &mexext, const filesystem::path &matlabroot,
-      const filesystem::path &dynareroot, bool onlymodel)
-{
-  ParsingDriver p(warnings, nostrict);
-
-  filesystem::remove_all(basename + "/model/json");
-
-  // Do parsing and construct internal representation of mod file
-  unique_ptr<ModFile> mod_file = p.parse(in, debug);
-  if (json == JsonOutputPointType::parsing)
-    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson);
-
-  // Run checking pass
-  mod_file->checkPass(nostrict, stochastic);
-  if (json == JsonOutputPointType::checkpass)
-    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson);
-
-  // Perform transformations on the model (creation of auxiliary vars and equations)
-  mod_file->transformPass(nostrict, stochastic, compute_xrefs || json == JsonOutputPointType::transformpass,
-                          transform_unary_ops, exclude_eqs, include_eqs);
-  if (json == JsonOutputPointType::transformpass)
-    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson);
-
-  // Evaluate parameters initialization, initval, endval and pounds
-  mod_file->evalAllExpressions(warn_uninit);
-
-  // Do computations
-  mod_file->computingPass(no_tmp_terms, output_mode, params_derivs_order);
-  if (json == JsonOutputPointType::computingpass)
-    mod_file->writeJsonOutput(basename, json, json_output_mode, onlyjson, jsonderivsimple);
-
-  // Write outputs
-  if (output_mode != FileOutputType::none)
-    mod_file->writeExternalFiles(basename, language);
-  else
-    mod_file->writeOutputFiles(basename, clear_all, clear_global, no_log, no_warn, console, nograph,
-                               nointeractive, config_file, check_model_changes, minimal_workspace, compute_xrefs,
-                               mexext, matlabroot, dynareroot, onlymodel);
-
-  cout << "Preprocessing completed." << endl;
-}
diff --git a/src/Makefile.am b/src/Makefile.am
index 24c56e11..ccd508d5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -44,7 +44,6 @@ dynare_m_SOURCES = \
 	MinimumFeedbackSet.hh \
 	DynareMain.cc \
 	DynareMain1.cc \
-	DynareMain2.cc \
 	CodeInterpreter.hh \
 	ExternalFunctionsTable.cc \
 	ExternalFunctionsTable.hh \
-- 
GitLab