From e4916a1d84c89f4e753f6f18dc4cbbbb7f0c45c0 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan.bastani@ens.fr>
Date: Mon, 23 Jan 2012 10:52:27 -0500
Subject: [PATCH] preprocessor: display a summary of preprocessor warnings at
 the end of a Dynare run

---
 ComputingTasks.cc          | 96 ++++++++++++++++++--------------------
 ComputingTasks.hh          | 76 +++++++++++++++---------------
 ConfigFile.cc              |  8 ++--
 ConfigFile.hh              |  6 ++-
 DynareMain2.cc             |  4 +-
 Makefile.am                |  4 +-
 ModFile.cc                 | 19 +++++---
 ModFile.hh                 |  5 +-
 NumericalInitialization.cc | 12 +++--
 NumericalInitialization.hh | 11 +++--
 ParsingDriver.cc           |  7 +--
 Statement.cc               |  2 +-
 Statement.hh               |  3 +-
 WarningConsolidation.cc    | 88 ++++++++++++++++++++++++++++++++++
 WarningConsolidation.hh    | 51 ++++++++++++++++++++
 15 files changed, 272 insertions(+), 120 deletions(-)
 create mode 100644 WarningConsolidation.cc
 create mode 100644 WarningConsolidation.hh

diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index fe7a3a8a..a8ac25d4 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -38,7 +38,7 @@ SteadyStatement::SteadyStatement(const OptionsList &options_list_arg) :
 }
 
 void
-SteadyStatement::checkPass(ModFileStructure &mod_file_struct)
+SteadyStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.steady_present = true;
 }
@@ -63,7 +63,7 @@ CheckStatement::writeOutput(ostream &output, const string &basename) const
 }
 
 void
-CheckStatement::checkPass(ModFileStructure &mod_file_struct)
+CheckStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.check_present = true;
 }
@@ -74,7 +74,7 @@ ModelInfoStatement::ModelInfoStatement(const OptionsList &options_list_arg) :
 }
 
 void
-ModelInfoStatement::checkPass(ModFileStructure &mod_file_struct)
+ModelInfoStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   //mod_file_struct.model_info_present = true;
 }
@@ -92,7 +92,7 @@ SimulStatement::SimulStatement(const OptionsList &options_list_arg) :
 }
 
 void
-SimulStatement::checkPass(ModFileStructure &mod_file_struct)
+SimulStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.simul_present = true;
 }
@@ -112,7 +112,7 @@ StochSimulStatement::StochSimulStatement(const SymbolList &symbol_list_arg,
 }
 
 void
-StochSimulStatement::checkPass(ModFileStructure &mod_file_struct)
+StochSimulStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.stoch_simul_present = true;
 
@@ -173,7 +173,7 @@ RamseyPolicyStatement::RamseyPolicyStatement(const SymbolList &symbol_list_arg,
 }
 
 void
-RamseyPolicyStatement::checkPass(ModFileStructure &mod_file_struct)
+RamseyPolicyStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.ramsey_policy_present = true;
 
@@ -220,7 +220,7 @@ DiscretionaryPolicyStatement::DiscretionaryPolicyStatement(const SymbolList &sym
 }
 
 void
-DiscretionaryPolicyStatement::checkPass(ModFileStructure &mod_file_struct)
+DiscretionaryPolicyStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.discretionary_policy_present = true;
 
@@ -269,7 +269,7 @@ EstimationStatement::EstimationStatement(const SymbolList &symbol_list_arg,
 }
 
 void
-EstimationStatement::checkPass(ModFileStructure &mod_file_struct)
+EstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.estimation_present = true;
 
@@ -331,20 +331,16 @@ EstimationStatement::checkPass(ModFileStructure &mod_file_struct)
     }
 
   if (options_list.string_options.find("datafile") != options_list.string_options.end())
-    cerr << "WARNING: The datafile option of estimation has been deprecated. "
-         << "Use the data command instead." << endl;
+    warnings << "WARNING: The datafile option of estimation has been deprecated. Use the data command instead." << endl;
 
   if (options_list.string_options.find("xls_sheet") != options_list.string_options.end())
-    cerr << "WARNING: The xls_sheet option of estimation has been deprecated. "
-         << "Use the data command instead." << endl;
+    warnings << "WARNING: The xls_sheet option of estimation has been deprecated. Use the data command instead." << endl;
 
   if (options_list.string_options.find("xls_range") != options_list.string_options.end())
-    cerr << "WARNING: The xls_range option of estimation has been deprecated. "
-         << "Use the data command instead." << endl;
+    warnings << "WARNING: The xls_range option of estimation has been deprecated. Use the data command instead." << endl;
 
   if (options_list.num_options.find("first_obs") != options_list.num_options.end())
-    cerr << "WARNING: The first_obs option of estimation has been deprecated. "
-         << "Use the data command instead." << endl;
+    warnings << "WARNING: The first_obs option of estimation has been deprecated. Use the data command instead." << endl;
 }
 
 void
@@ -361,7 +357,7 @@ DynareSensitivityStatement::DynareSensitivityStatement(const OptionsList &option
 }
 
 void
-DynareSensitivityStatement::checkPass(ModFileStructure &mod_file_struct)
+DynareSensitivityStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   OptionsList::num_options_t::const_iterator it = options_list.num_options.find("identification");
   if (it != options_list.num_options.end()
@@ -437,7 +433,7 @@ EstimatedParamsStatement::EstimatedParamsStatement(const vector<EstimationParams
 }
 
 void
-EstimatedParamsStatement::checkPass(ModFileStructure &mod_file_struct)
+EstimatedParamsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   for (vector<EstimationParams>::const_iterator it = estim_params_list.begin();
        it != estim_params_list.end(); it++)
@@ -704,7 +700,7 @@ OsrParamsStatement::OsrParamsStatement(const SymbolList &symbol_list_arg) :
 }
 
 void
-OsrParamsStatement::checkPass(ModFileStructure &mod_file_struct)
+OsrParamsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.osr_params_present = true;
 }
@@ -723,7 +719,7 @@ OsrStatement::OsrStatement(const SymbolList &symbol_list_arg,
 }
 
 void
-OsrStatement::checkPass(ModFileStructure &mod_file_struct)
+OsrStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.osr_present = true;
 
@@ -762,7 +758,7 @@ OptimWeightsStatement::OptimWeightsStatement(const var_weights_t &var_weights_ar
 }
 
 void
-OptimWeightsStatement::checkPass(ModFileStructure &mod_file_struct)
+OptimWeightsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.optim_weights_present = true;
 }
@@ -868,7 +864,7 @@ PlannerObjectiveStatement::~PlannerObjectiveStatement()
 }
 
 void
-PlannerObjectiveStatement::checkPass(ModFileStructure &mod_file_struct)
+PlannerObjectiveStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   assert(model_tree->equation_number() == 1);
   mod_file_struct.planner_objective_present = true;
@@ -899,7 +895,7 @@ BVARDensityStatement::BVARDensityStatement(int maxnlags_arg, const OptionsList &
 }
 
 void
-BVARDensityStatement::checkPass(ModFileStructure &mod_file_struct)
+BVARDensityStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -918,7 +914,7 @@ BVARForecastStatement::BVARForecastStatement(int nlags_arg, const OptionsList &o
 }
 
 void
-BVARForecastStatement::checkPass(ModFileStructure &mod_file_struct)
+BVARForecastStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -936,7 +932,7 @@ SBVARStatement::SBVARStatement(const OptionsList &options_list_arg) :
 }
 
 void
-SBVARStatement::checkPass(ModFileStructure &mod_file_struct)
+SBVARStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -954,7 +950,7 @@ MSSBVAREstimationStatement::MSSBVAREstimationStatement(const OptionsList &option
 }
 
 void
-MSSBVAREstimationStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVAREstimationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -973,7 +969,7 @@ MSSBVARSimulationStatement::MSSBVARSimulationStatement(const OptionsList &option
 }
 
 void
-MSSBVARSimulationStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVARSimulationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -1001,7 +997,7 @@ MSSBVARComputeMDDStatement::MSSBVARComputeMDDStatement(const OptionsList &option
 }
 
 void
-MSSBVARComputeMDDStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVARComputeMDDStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -1020,7 +1016,7 @@ MSSBVARComputeProbabilitiesStatement::MSSBVARComputeProbabilitiesStatement(const
 }
 
 void
-MSSBVARComputeProbabilitiesStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVARComputeProbabilitiesStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 
@@ -1049,7 +1045,7 @@ MSSBVARIrfStatement::MSSBVARIrfStatement(const SymbolList &symbol_list_arg,
 }
 
 void
-MSSBVARIrfStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVARIrfStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -1069,7 +1065,7 @@ MSSBVARForecastStatement::MSSBVARForecastStatement(const OptionsList &options_li
 }
 
 void
-MSSBVARForecastStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVARForecastStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -1088,7 +1084,7 @@ MSSBVARVarianceDecompositionStatement::MSSBVARVarianceDecompositionStatement(con
 }
 
 void
-MSSBVARVarianceDecompositionStatement::checkPass(ModFileStructure &mod_file_struct)
+MSSBVARVarianceDecompositionStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.bvar_present = true;
 }
@@ -1113,7 +1109,7 @@ IdentificationStatement::IdentificationStatement(const OptionsList &options_list
 }
 
 void
-IdentificationStatement::checkPass(ModFileStructure &mod_file_struct)
+IdentificationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.identification_present = true;
 }
@@ -1215,7 +1211,7 @@ SvarIdentificationStatement::getMaxLag() const
 }
 
 void
-SvarIdentificationStatement::checkPass(ModFileStructure &mod_file_struct)
+SvarIdentificationStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   if (!mod_file_struct.svar_identification_present)
     mod_file_struct.svar_identification_present = true;
@@ -1371,7 +1367,7 @@ MarkovSwitchingStatement::MarkovSwitchingStatement(const OptionsList &options_li
 }
 
 void
-MarkovSwitchingStatement::checkPass(ModFileStructure &mod_file_struct)
+MarkovSwitchingStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   OptionsList::num_options_t::const_iterator itChain = options_list.num_options.find("ms.chain");
   assert(itChain != options_list.num_options.end());
@@ -1488,7 +1484,7 @@ SvarStatement::SvarStatement(const OptionsList &options_list_arg) :
 }
 
 void
-SvarStatement::checkPass(ModFileStructure &mod_file_struct)
+SvarStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   OptionsList::num_options_t::const_iterator it0, it1, it2;
   it0 = options_list.string_options.find("ms.coefficients");
@@ -1563,7 +1559,7 @@ EstimationDataStatement::EstimationDataStatement(const OptionsList &options_list
 }
 
 void
-EstimationDataStatement::checkPass(ModFileStructure &mod_file_struct)
+EstimationDataStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.estimation_data_statement_present = true;
 
@@ -1607,7 +1603,7 @@ BasicPriorStatement::BasicPriorStatement(const string &name_arg,
 }
 
 void
-BasicPriorStatement::checkPass(ModFileStructure &mod_file_struct)
+BasicPriorStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   if (prior_shape == eNoShape)
     {
@@ -1693,9 +1689,9 @@ PriorStatement::PriorStatement(const string &name_arg,
 }
 
 void
-PriorStatement::checkPass(ModFileStructure &mod_file_struct)
+PriorStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  BasicPriorStatement::checkPass(mod_file_struct);
+  BasicPriorStatement::checkPass(mod_file_struct, warnings);
   if (!mod_file_struct.prior_statement_present)
     first_statement_encountered = true;
   mod_file_struct.prior_statement_present = true;
@@ -1733,9 +1729,9 @@ StdPriorStatement::StdPriorStatement(const string &name_arg,
 }
 
 void
-StdPriorStatement::checkPass(ModFileStructure &mod_file_struct)
+StdPriorStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  BasicPriorStatement::checkPass(mod_file_struct);
+  BasicPriorStatement::checkPass(mod_file_struct, warnings);
   if (!mod_file_struct.std_prior_statement_present)
     first_statement_encountered = true;
   mod_file_struct.std_prior_statement_present = true;
@@ -1775,9 +1771,9 @@ CorrPriorStatement::CorrPriorStatement(const string &name_arg1, const string &na
 }
 
 void
-CorrPriorStatement::checkPass(ModFileStructure &mod_file_struct)
+CorrPriorStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  BasicPriorStatement::checkPass(mod_file_struct);
+  BasicPriorStatement::checkPass(mod_file_struct, warnings);
   if (symbol_table.getType(name) != symbol_table.getType(name1))
     {
       cerr << "ERROR: In the corr(A,B).prior statement, A and B must be of the same type. "
@@ -1826,7 +1822,7 @@ BasicOptionsStatement::BasicOptionsStatement(const string &name_arg,
 }
 
 void
-BasicOptionsStatement::checkPass(ModFileStructure &mod_file_struct)
+BasicOptionsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   assert((options_list.num_options.find("date1") != options_list.num_options.end() &&
           options_list.num_options.find("date2") != options_list.num_options.end()) ||
@@ -1873,9 +1869,9 @@ OptionsStatement::OptionsStatement(const string &name_arg,
 }
 
 void
-OptionsStatement::checkPass(ModFileStructure &mod_file_struct)
+OptionsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  BasicOptionsStatement::checkPass(mod_file_struct);
+  BasicOptionsStatement::checkPass(mod_file_struct, warnings);
   if (!mod_file_struct.options_statement_present)
     first_statement_encountered = true;
   mod_file_struct.options_statement_present = true;
@@ -1906,9 +1902,9 @@ StdOptionsStatement::StdOptionsStatement(const string &name_arg,
 }
 
 void
-StdOptionsStatement::checkPass(ModFileStructure &mod_file_struct)
+StdOptionsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  BasicOptionsStatement::checkPass(mod_file_struct);
+  BasicOptionsStatement::checkPass(mod_file_struct, warnings);
   if (!mod_file_struct.std_options_statement_present)
     first_statement_encountered = true;
   mod_file_struct.std_options_statement_present = true;
@@ -1942,7 +1938,7 @@ CorrOptionsStatement::CorrOptionsStatement(const string &name_arg1, const string
 }
 
 void
-CorrOptionsStatement::checkPass(ModFileStructure &mod_file_struct)
+CorrOptionsStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   if (symbol_table.getType(name) != symbol_table.getType(name1))
     {
diff --git a/ComputingTasks.hh b/ComputingTasks.hh
index baaa0ac8..46e1896d 100644
--- a/ComputingTasks.hh
+++ b/ComputingTasks.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003-2011 Dynare Team
+ * Copyright (C) 2003-2012 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -34,7 +34,7 @@ private:
   const OptionsList options_list;
 public:
   SteadyStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -44,7 +44,7 @@ private:
   const OptionsList options_list;
 public:
   CheckStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -54,7 +54,7 @@ private:
   const OptionsList options_list;
 public:
   SimulStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -64,7 +64,7 @@ private:
   const OptionsList options_list;
 public:
   ModelInfoStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -76,7 +76,7 @@ private:
 public:
   StochSimulStatement(const SymbolList &symbol_list_arg,
                       const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -99,7 +99,7 @@ private:
 public:
   RamseyPolicyStatement(const SymbolList &symbol_list_arg,
                         const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -111,7 +111,7 @@ private:
 public:
   DiscretionaryPolicyStatement(const SymbolList &symbol_list_arg,
 			       const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -162,7 +162,7 @@ public:
   EstimationStatement(const SymbolList &symbol_list_arg,
                       const OptionsList &options_list_arg,
                       const SymbolTable &symbol_table);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -172,7 +172,7 @@ private:
   const OptionsList options_list;
 public:
   DynareSensitivityStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -195,7 +195,7 @@ private:
   const SymbolList symbol_list;
 public:
   OsrParamsStatement(const SymbolList &symbol_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -207,7 +207,7 @@ private:
 public:
   OsrStatement(const SymbolList &symbol_list_arg,
                const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -281,7 +281,7 @@ private:
 public:
   EstimatedParamsStatement(const vector<EstimationParams> &estim_params_list_arg,
                            const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -320,7 +320,7 @@ public:
   OptimWeightsStatement(const var_weights_t &var_weights_arg,
                         const covar_weights_t &covar_weights_arg,
                         const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -337,7 +337,7 @@ public:
   virtual ~PlannerObjectiveStatement();
   /*! \todo check there are only endogenous variables at the current period in the objective
     (no exogenous, no lead/lag) */
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   /*! \todo allow for the possibility of disabling temporary terms */
   virtual void computingPass();
   virtual void writeOutput(ostream &output, const string &basename) const;
@@ -352,7 +352,7 @@ private:
   const OptionsList options_list;
 public:
   BVARDensityStatement(int maxnlags_arg, const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -363,7 +363,7 @@ private:
   const OptionsList options_list;
 public:
   BVARForecastStatement(int nlags_arg, const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -373,7 +373,7 @@ private:
   const OptionsList options_list;
 public:
   SBVARStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -383,7 +383,7 @@ private:
   const OptionsList options_list;
 public:
   MSSBVAREstimationStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -393,7 +393,7 @@ private:
   const OptionsList options_list;
 public:
   MSSBVARSimulationStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -403,7 +403,7 @@ private:
   const OptionsList options_list;
 public:
   MSSBVARComputeMDDStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -413,7 +413,7 @@ private:
   const OptionsList options_list;
 public:
   MSSBVARComputeProbabilitiesStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -425,7 +425,7 @@ private:
 public:
   MSSBVARIrfStatement(const SymbolList &symbol_list_arg,
 		      const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -435,7 +435,7 @@ private:
   const OptionsList options_list;
 public:
   MSSBVARForecastStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -445,7 +445,7 @@ private:
   const OptionsList options_list;
 public:
   MSSBVARVarianceDecompositionStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -455,7 +455,7 @@ private:
   OptionsList options_list;
 public:
   IdentificationStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -535,7 +535,7 @@ public:
                               const bool &lower_cholesky_present_arg,
 			      const bool &constants_exclusion_present_arg,
                               const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -546,7 +546,7 @@ private:
   map <pair<int, int >, double > restriction_map;
 public:
   MarkovSwitchingStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -556,7 +556,7 @@ private:
   const OptionsList options_list;
 public:
   SvarStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -575,7 +575,7 @@ private:
   const OptionsList options_list;
 public:
   EstimationDataStatement(const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -593,7 +593,7 @@ protected:
                       const PriorDistributions &prior_shape_arg,
                       const expr_t &variance_arg,
                       const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
   void writePriorIndex(ostream &output, const string &lhs_field) const;
   void writeVarianceOption(ostream &output, const string &lhs_field) const;
@@ -608,7 +608,7 @@ public:
                  const PriorDistributions &prior_shape_arg,
                  const expr_t &variance_arg,
                  const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -622,7 +622,7 @@ public:
                     const expr_t &variance_arg,
                     const OptionsList &options_list_arg,
                     const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -638,7 +638,7 @@ public:
                      const expr_t &variance_arg,
                      const OptionsList &options_list_arg,
                      const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -653,7 +653,7 @@ protected:
   BasicOptionsStatement(const string &name_arg,
                          const OptionsList &options_list_arg);
   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   void writeOptionsIndex(ostream &output, const string &lhs_field) const;
   void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
 };
@@ -662,7 +662,7 @@ class OptionsStatement : public BasicOptionsStatement
 {
 public:
   OptionsStatement(const string &name_arg, const OptionsList &options_list_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -673,7 +673,7 @@ private:
 public:
   StdOptionsStatement(const string &name_arg, const OptionsList &options_list_arg,
                     const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -685,7 +685,7 @@ private:
 public:
   CorrOptionsStatement(const string &name_arg1, const string &name_arg2,
                  const OptionsList &options_list_arg, const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
diff --git a/ConfigFile.cc b/ConfigFile.cc
index 734c32c5..eccd1d28 100644
--- a/ConfigFile.cc
+++ b/ConfigFile.cc
@@ -371,7 +371,7 @@ ConfigFile::addConfFileElement(bool inNode, bool inCluster, member_nodes_t membe
 }
 
 void
-ConfigFile::checkPass() const
+ConfigFile::checkPass(WarningConsolidation &warnings) const
 {
   if (!parallel && !parallel_test)
     return;
@@ -389,9 +389,9 @@ ConfigFile::checkPass() const
 #if !defined(_WIN32) && !defined(__CYGWIN32__)
       //For Linux/Mac, check that cpuNbr starts at 0
       if (it->second->minCpuNbr != 0)
-        cerr << "WARNING: On Unix-based operating systems, you cannot specify the CPU that is used" << endl
-             << "         in parallel processing. This will be adjusted for you such that the same" << endl
-             << "         number of CPUs are used." << endl;
+        warnings << "WARNING: On Unix-based operating systems, you cannot specify the CPU that is "
+                 << "used in parallel processing. This will be adjusted for you such that the "
+                 << "same number of CPUs are used." << endl;
 #endif
       if (!it->second->computerName.compare("localhost")) // We are working locally
         {
diff --git a/ConfigFile.hh b/ConfigFile.hh
index 5a591e70..c3f56f68 100644
--- a/ConfigFile.hh
+++ b/ConfigFile.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Dynare Team
+ * Copyright (C) 2010-2012 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -23,6 +23,8 @@
 #include <map>
 #include <vector>
 
+#include "WarningConsolidation.hh"
+
 using namespace std;
 
 typedef map<string, double> member_nodes_t;
@@ -90,7 +92,7 @@ public:
   //! Parse config file
   void getConfigFileInfo(const string &parallel_config_file);
   //! Check Pass
-  void checkPass() const;
+  void checkPass(WarningConsolidation &warnings) const;
   //! Check Pass
   void transformPass();
   //! Create options_.parallel structure, write options
diff --git a/DynareMain2.cc b/DynareMain2.cc
index 9c25eafa..0892ec27 100644
--- a/DynareMain2.cc
+++ b/DynareMain2.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2011 Dynare Team
+ * Copyright (C) 2008-2012 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -43,7 +43,7 @@ main2(stringstream &in, string &basename, bool debug, bool clear_all, bool no_tm
 
   // Run checking pass
   mod_file->checkPass();
-  config_file.checkPass();
+  config_file.checkPass(mod_file->warnings);
 
   // Perform transformations on the model (creation of auxiliary vars and equations)
   mod_file->transformPass();
diff --git a/Makefile.am b/Makefile.am
index d1f6b272..38cf4082 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -51,7 +51,9 @@ dynare_m_SOURCES = \
 	ExternalFunctionsTable.cc \
 	ExternalFunctionsTable.hh \
 	SteadyStateModel.hh \
-	SteadyStateModel.cc
+	SteadyStateModel.cc \
+	WarningConsolidation.hh \
+	WarningConsolidation.cc
 
 # The -I. is for <FlexLexer.h>
 dynare_m_CPPFLAGS = $(BOOST_CPPFLAGS) -I.
diff --git a/ModFile.cc b/ModFile.cc
index 709ea4ec..b6d33b6d 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -80,7 +80,8 @@ ModFile::evalAllExpressions(bool warn_uninit)
           && global_eval_context.find(id) == global_eval_context.end())
         {
           if (warn_uninit)
-            cerr << "WARNING: can't find a numeric initial value for " << symbol_table.getName(id) << ", using zero" << endl;
+            warnings << "WARNING: Can't find a numeric initial value for "
+                     << symbol_table.getName(id) << ", using zero" << endl;
           global_eval_context[id] = 0;
         }
     }
@@ -103,7 +104,7 @@ ModFile::checkPass()
 {
   for (vector<Statement *>::iterator it = statements.begin();
        it != statements.end(); it++)
-    (*it)->checkPass(mod_file_struct);
+    (*it)->checkPass(mod_file_struct, warnings);
 
   // Check the steady state block
   steady_state_model.checkPass(mod_file_struct.ramsey_policy_present);
@@ -192,8 +193,9 @@ ModFile::checkPass()
           exit(EXIT_FAILURE);
         }
       else
-        cerr << "WARNING: When estimating a DSGE-Var, declaring dsge_prior_weight as a parameter is deprecated. "
-             <<  "The preferred method is to do this via the dsge_var option in the estimation statement." << endl;
+        warnings << "WARNING: When estimating a DSGE-Var, declaring dsge_prior_weight as a "
+                 << "parameter is deprecated. The preferred method is to do this via "
+                 << "the dsge_var option in the estimation statement." << endl;
 
       if (mod_file_struct.dsge_var_estimated || !mod_file_struct.dsge_var_calibrated.empty())
         {
@@ -617,9 +619,12 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
 
   config_file.writeEndParallel(mOutputFile);
 
-  mOutputFile << endl << endl 
-	      << "disp(['Total computing time : ' dynsec2hms(toc) ]);" << endl
-	      << "diary off" << endl;
+  mOutputFile << endl << endl
+	      << "disp(['Total computing time : ' dynsec2hms(toc) ]);" << endl;
+
+  warnings.writeOutput(mOutputFile);
+
+  mOutputFile << "diary off" << endl;
 
   mOutputFile.close();
 
diff --git a/ModFile.hh b/ModFile.hh
index e45d5c42..cc2c8d4d 100644
--- a/ModFile.hh
+++ b/ModFile.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2010 Dynare Team
+ * Copyright (C) 2006-2012 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -34,6 +34,7 @@ using namespace std;
 #include "Statement.hh"
 #include "ExternalFunctionsTable.hh"
 #include "ConfigFile.hh"
+#include "WarningConsolidation.hh"
 
 //! The abstract representation of a "mod" file
 class ModFile
@@ -84,6 +85,8 @@ public:
   //! Stores the original number of equations in the model_block
   int ramsey_policy_orig_eqn_nbr;
 
+  //! Warnings Encountered
+  WarningConsolidation warnings;
 private:
   //! List of statements
   vector<Statement *> statements;
diff --git a/NumericalInitialization.cc b/NumericalInitialization.cc
index 0beb0a23..63d1d73a 100644
--- a/NumericalInitialization.cc
+++ b/NumericalInitialization.cc
@@ -19,6 +19,7 @@
 
 #include <iostream>
 #include <fstream>
+#include <sstream>
 #include <cstdlib>
 
 #include "NumericalInitialization.hh"
@@ -33,7 +34,7 @@ InitParamStatement::InitParamStatement(int symb_id_arg,
 }
 
 void
-InitParamStatement::checkPass(ModFileStructure &mod_file_struct)
+InitParamStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   if (symbol_table.getName(symb_id) == "dsge_prior_weight")
     mod_file_struct.dsge_prior_weight_initialized = true;
@@ -147,7 +148,7 @@ EndValStatement::EndValStatement(const init_values_t &init_values_arg,
 }
 
 void
-EndValStatement::checkPass(ModFileStructure &mod_file_struct)
+EndValStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   if (mod_file_struct.shocks_present)
     {
@@ -177,7 +178,7 @@ HistValStatement::HistValStatement(const hist_values_t &hist_values_arg,
 }
 
 void
-HistValStatement::checkPass(ModFileStructure &mod_file_struct)
+HistValStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
   mod_file_struct.histval_present = true;
 }
@@ -298,7 +299,8 @@ SaveParamsAndSteadyStateStatement::writeOutput(ostream &output, const string &ba
 }
 
 LoadParamsAndSteadyStateStatement::LoadParamsAndSteadyStateStatement(const string &filename,
-                                                                     const SymbolTable &symbol_table_arg) :
+                                                                     const SymbolTable &symbol_table_arg,
+                                                                     WarningConsolidation &warnings) :
   symbol_table(symbol_table_arg)
 {
   cout << "Reading " << filename << "." << endl;
@@ -325,7 +327,7 @@ LoadParamsAndSteadyStateStatement::LoadParamsAndSteadyStateStatement(const strin
         }
       catch (SymbolTable::UnknownSymbolNameException &e)
         {
-          cerr << "WARNING: Unknown symbol " << symb_name << " in " << filename << endl;
+          warnings << "WARNING: Unknown symbol " << symb_name << " in " << filename << endl;
         }
     }
   f.close();
diff --git a/NumericalInitialization.hh b/NumericalInitialization.hh
index d791acac..e5ae059c 100644
--- a/NumericalInitialization.hh
+++ b/NumericalInitialization.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003-2011 Dynare Team
+ * Copyright (C) 2003-2012 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -39,7 +39,7 @@ private:
 public:
   InitParamStatement(int symb_id_arg, const expr_t param_value_arg,
                      const SymbolTable &symbol_table_arg);
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
   //! Fill eval context with parameter value
   void fillEvalContext(eval_context_t &eval_context) const;
@@ -81,7 +81,7 @@ public:
   EndValStatement(const init_values_t &init_values_arg,
                   const SymbolTable &symbol_table_arg);
   //! Workaround for trac ticket #35
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -101,7 +101,7 @@ public:
   HistValStatement(const hist_values_t &hist_values_arg,
                    const SymbolTable &symbol_table_arg);
   //! Workaround for trac ticket #157
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -147,7 +147,8 @@ private:
   map<int, string> content;
 public:
   LoadParamsAndSteadyStateStatement(const string &filename,
-                                    const SymbolTable &symbol_table_arg);
+                                    const SymbolTable &symbol_table_arg,
+                                    WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename) const;
   //! Fill eval context with parameters/variables values
   void fillEvalContext(eval_context_t &eval_context) const;
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index a35ee57d..cf58b330 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003-2011 Dynare Team
+ * Copyright (C) 2003-2012 Dynare Team
  *
  * This file is part of Dynare.
  *
@@ -27,6 +27,7 @@
 #include "ParsingDriver.hh"
 #include "Statement.hh"
 #include "ExprNode.hh"
+#include "WarningConsolidation.hh"
 
 bool
 ParsingDriver::symbol_exists_and_is_not_modfile_local_or_external_function(const char *s)
@@ -117,7 +118,7 @@ ParsingDriver::error(const string &m)
 void
 ParsingDriver::warning(const string &m)
 {
-  cerr << "WARNING: " << location << ": " << m << endl;
+  mod_file->warnings << "WARNING: " << location << ": " << m << endl;
 }
 
 void
@@ -1541,7 +1542,7 @@ ParsingDriver::run_dynasave(string *filename)
 void
 ParsingDriver::run_load_params_and_steady_state(string *filename)
 {
-  mod_file->addStatement(new LoadParamsAndSteadyStateStatement(*filename, mod_file->symbol_table));
+  mod_file->addStatement(new LoadParamsAndSteadyStateStatement(*filename, mod_file->symbol_table, mod_file->warnings));
   delete filename;
 }
 
diff --git a/Statement.cc b/Statement.cc
index 67ca01a1..6165b8fb 100644
--- a/Statement.cc
+++ b/Statement.cc
@@ -60,7 +60,7 @@ Statement::~Statement()
 }
 
 void
-Statement::checkPass(ModFileStructure &mod_file_struct)
+Statement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
 }
 
diff --git a/Statement.hh b/Statement.hh
index ccfcbaeb..5625c24f 100644
--- a/Statement.hh
+++ b/Statement.hh
@@ -27,6 +27,7 @@ using namespace std;
 #include <map>
 
 #include "SymbolList.hh"
+#include "WarningConsolidation.hh"
 
 class ModFileStructure
 {
@@ -109,7 +110,7 @@ class Statement
 public:
   virtual ~Statement();
   //! Do some internal check, and fill the ModFileStructure class
-  virtual void checkPass(ModFileStructure &mod_file_struct);
+  virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void computingPass();
   //! Write Matlab output code
   /*!
diff --git a/WarningConsolidation.cc b/WarningConsolidation.cc
new file mode 100644
index 00000000..7b9be917
--- /dev/null
+++ b/WarningConsolidation.cc
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2012 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/>.
+ */
+
+using namespace std;
+
+#include "WarningConsolidation.hh"
+#include <ostream>
+
+WarningConsolidation&
+operator<< (WarningConsolidation& wcc, const string &warning)
+{
+  cerr << warning;
+  wcc.addWarning(warning);
+  return wcc;
+};
+
+WarningConsolidation&
+operator<< (WarningConsolidation& wcc, const Dynare::location& loc)
+{
+  stringstream ostr;
+  Dynare::position last = loc.end - 1;
+  ostr << loc.begin;
+  if (last.filename
+      && (!loc.begin.filename
+          || *loc.begin.filename != *last.filename))
+    ostr << '-' << last;
+  else if (loc.begin.line != last.line)
+    ostr << '-' << last.line  << '.' << last.column;
+  else if (loc.begin.column != last.column)
+    ostr << '-' << last.column;
+
+  cerr << ostr.str();
+  wcc.addWarning(ostr.str());
+  return wcc;
+};
+
+WarningConsolidation&
+operator<< (WarningConsolidation& wcc, ostream& (*pf) (ostream&))
+{
+  cerr << pf;
+  wcc.addWarning(pf);
+  return wcc;
+}
+
+void
+WarningConsolidation::writeOutput(ostream &output) const
+{
+  if (warnings.str().empty())
+    return;
+
+  output << "disp([char(10) 'Dynare Preprocessor Warning(s) Encountered:']);" << endl;
+
+  bool writedisp = true;
+  string warningsstr = warnings.str();
+  for (size_t i = 0; i < warningsstr.length(); i++)
+    {
+      if (writedisp)
+        {
+          output << "disp('     ";
+          writedisp = false;
+        }
+
+      if (warningsstr[i] != '\n')
+        output << warningsstr[i];
+      else
+        {
+          output << "');" << endl;
+          if (i+1 < warningsstr.length())
+            writedisp = true;
+        }
+    }
+}
diff --git a/WarningConsolidation.hh b/WarningConsolidation.hh
new file mode 100644
index 00000000..8efbbc2e
--- /dev/null
+++ b/WarningConsolidation.hh
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012 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/>.
+ */
+
+#ifndef _WARNINGCONSOLIDATION_HH
+#define _WARNINGCONSOLIDATION_HH
+
+using namespace std;
+
+#include <sstream>
+#include <string>
+#include "location.hh"
+
+//! Stores Warnings issued by the Preprocessor
+class WarningConsolidation
+{
+private:
+  stringstream warnings;
+
+public:
+  WarningConsolidation() { };
+  ~WarningConsolidation() { };
+
+  //! Add A Warning to the StringStream
+  friend WarningConsolidation& operator<< (WarningConsolidation& wcc, const string &warning);
+  friend WarningConsolidation& operator<< (WarningConsolidation& wcc, const Dynare::location &loc);
+  friend WarningConsolidation& operator<< (WarningConsolidation& wcc, ostream& (*pf) (ostream&));
+
+  inline void addWarning(const string w) { warnings << w; };
+  inline void addWarning(ostream& (*pf) (ostream&)) { warnings << pf; };
+
+  //! Write Warnings to m file
+  void writeOutput(ostream &output) const;
+};
+
+#endif
-- 
GitLab