]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/warn.cc
Run grand-replace (issue 3765)
[lilypond.git] / flower / warn.cc
index 870420380ed4729c9c9d54be25ab09011837b71b..9ff173bf358b0d3560d101355f30ff963d60cd22 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 #include <cstdlib>
 #include <cstdio>
 
+#include "std-vector.hh"
 #include "international.hh"
 
 using namespace std;
@@ -39,6 +40,7 @@ using namespace std;
 
 /* Define the loglevel (default is INFO) */
 int loglevel = LOGLEVEL_INFO;
+bool warning_as_error = false;
 
 bool
 is_loglevel (int level)
@@ -84,13 +86,58 @@ set_loglevel (string level)
         set_loglevel (l);
       else
         {
-          non_fatal_error (_f ("unknown log level `%s', using default (INFO)", 
+          non_fatal_error (_f ("unknown log level `%s', using default (INFO)",
                                level));
           set_loglevel (LOGLEVEL_INFO);
         }
     }
 }
 
+/**
+ * Register a warning string to be expected and the output suppressed.
+ * If the warning is encountered, it will be removed from the list of
+ * expected warnings again.
+ */
+vector<string> expected_warnings;
+void expect_warning (const string &msg)
+{
+  expected_warnings.push_back (msg);
+}
+
+void check_expected_warnings ()
+{
+  if (expected_warnings.size () > 0)
+    {
+      /* Some expected warning was not triggered, so print out a warning. */
+      string msg = _f ("%d expected warning(s) not encountered: ",
+                       expected_warnings.size ());
+      for (vsize i = 0; i < expected_warnings.size (); i++)
+        msg += "\n        " + expected_warnings[i];
+
+      warning (msg);
+    }
+  expected_warnings.clear ();
+}
+
+bool is_expected (const string &s)
+{
+  bool expected = false;
+  for (vsize i = 0; i < expected_warnings.size (); i++)
+    {
+      // Compare the msg with the suppressed string; If the beginning matches,
+      // i.e. the msg can have additional content AFTER the full (exact)
+      // suppressed message, suppress the warning.
+      // This is needed for the Input class, where the message contains
+      // the input file contents after the real message.
+      if (s.compare (0, expected_warnings[i].size (), expected_warnings[i]) == 0)
+        {
+          expected = true;
+          expected_warnings.erase (expected_warnings.begin () + i);
+          break;
+        }
+    }
+  return expected;
+}
 
 /**
  * Helper functions: print_message_part (no newline prepended)
@@ -104,7 +151,7 @@ static bool message_newline = true;
    if newline is true, start the message on a new line.
 */
 void
-print_message (int level, string location, string s, bool newline)
+print_message (int level, const string &location, string s, bool newline)
 {
   /* Only print the message if the current loglevel allows it: */
   if (!is_loglevel (level))
@@ -124,7 +171,6 @@ print_message (int level, string location, string s, bool newline)
     message_newline = s[s.length () - 1] == '\n';
 }
 
-
 /** The actual output functions to be called in lilypond code.
  *  Sorted in descending order of importance (errors, warnings, progress, info,
  *  debug). Each prints a message on a separate line.
@@ -132,7 +178,7 @@ print_message (int level, string location, string s, bool newline)
 
 /* Display a fatal error message.  Also exits lilypond.  */
 void
-error (string s, string location)
+error (string s, const string &location)
 {
   print_message (LOG_ERROR, location, _f ("fatal error: %s", s) + "\n");
   exit (1);
@@ -140,43 +186,60 @@ error (string s, string location)
 
 /* Display a severe programming error message, but don't exit.  */
 void
-programming_error (string s, string location)
+programming_error (const string &s, const string &location)
 {
-  print_message (LOG_ERROR, location, _f ("programming error: %s", s) + "\n");
-  print_message (LOG_ERROR, location, _ ("continuing, cross fingers") + "\n");
+  if (is_expected (s))
+    print_message (LOG_DEBUG, location, _f ("suppressed programming error: %s", s) + "\n");
+  else if (warning_as_error)
+    error (s, location);
+  else
+    {
+      print_message (LOG_ERROR, location, _f ("programming error: %s", s) + "\n");
+      print_message (LOG_ERROR, location, _ ("continuing, cross fingers") + "\n");
+    }
 }
 
 /* Display a non-fatal error message, don't exit.  */
 void
-non_fatal_error (string s, string location)
+non_fatal_error (const string &s, const string &location)
 {
-  print_message (LOG_ERROR, location, _f ("error: %s", s) + "\n");
+  if (is_expected (s))
+    print_message (LOG_DEBUG, location, _f ("suppressed error: %s", s) + "\n");
+  else if (warning_as_error)
+    error (s, location);
+  else
+    print_message (LOG_ERROR, location, _f ("error: %s", s) + "\n");
 }
 
 /* Display a warning message. */
 void
-warning (string s, string location)
+warning (const string &s, const string &location)
 {
-  print_message (LOG_WARN, location, _f ("warning: %s", s) + "\n");
+  if (is_expected (s))
+    print_message (LOG_DEBUG, location, _f ("suppressed warning: %s", s) + "\n");
+  else if (warning_as_error)
+    error (s, location);
+  else
+    print_message (LOG_WARN, location, _f ("warning: %s", s) + "\n");
 }
 
 /* Display a success message.  */
 void
-successful (string s, string location)
+basic_progress (const string &s, const string &location)
 {
-  print_message (LOG_BASIC, location, _f ("success: %s", s) + "\n", true);
+  print_message (LOG_BASIC, location, s + "\n", true);
 }
 
 /* Display information about the progress.  */
 void
-progress_indication (string s, bool newline, string location)
+progress_indication (const string &s, bool newline, const string &location)
 {
   print_message (LOG_PROGRESS, location, s, newline);
 }
 
 /* Display a single info message.  */
 void
-message (string s, bool newline, string location)
+message (const string &s, bool newline, const string &location)
 {
   // Use the progress loglevel for all normal messages (including progress msg)
   print_message (LOG_INFO, location, s, newline);
@@ -184,7 +247,7 @@ message (string s, bool newline, string location)
 
 /* Display a debug information, not necessarily on a new line.  */
 void
-debug_output (string s, bool newline, string location)
+debug_output (const string &s, bool newline, const string &location)
 {
   print_message (LOG_DEBUG, location, s, newline);
 }