/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1998--2011 Jan Nieuwenhuizen <janneke@gnu.org>
+ Copyright (C) 1998--2015 Jan Nieuwenhuizen <janneke@gnu.org>
Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
#include "lily-guile.hh"
#include "program-option.hh"
#include "version.hh"
+#include "international.hh"
#include "warn.hh"
/*
{
LY_ASSERT_TYPE (scm_is_string, str, 1);
str = scm_simple_format (SCM_BOOL_F, str, rest);
-
- if (get_program_option ("warning-as-error"))
- error (ly_scm2string (str));
- else
- programming_error (ly_scm2string (str));
-
+ programming_error (ly_scm2string (str));
return SCM_UNSPECIFIED;
}
{
LY_ASSERT_TYPE (scm_is_string, str, 1);
str = scm_simple_format (SCM_BOOL_F, str, rest);
-
- if (get_program_option ("warning-as-error"))
- error (ly_scm2string (str));
- else
- warning (ly_scm2string (str));
-
+ warning (ly_scm2string (str));
return SCM_UNSPECIFIED;
}
return SCM_UNSPECIFIED;
}
-LY_DEFINE (ly_success, "ly:success",
+LY_DEFINE (ly_basic_progress, "ly:basic-progress",
1, 0, 1, (SCM str, SCM rest),
- "A Scheme callable function to issue a success message @var{str}."
+ "A Scheme callable function to issue a basic progress message @var{str}."
" The message is formatted with @code{format} and @var{rest}.")
{
LY_ASSERT_TYPE (scm_is_string, str, 1);
str = scm_simple_format (SCM_BOOL_F, str, rest);
- successful (ly_scm2string (str));
+ basic_progress (ly_scm2string (str));
return SCM_UNSPECIFIED;
}
LY_ASSERT_TYPE (scm_is_string, location, 1);
LY_ASSERT_TYPE (scm_is_string, str, 2);
str = scm_simple_format (SCM_BOOL_F, str, rest);
+ warning (ly_scm2string (str), ly_scm2string (location));
+ return SCM_UNSPECIFIED;
+}
- if (get_program_option ("warning-as-error"))
- error (ly_scm2string (str), ly_scm2string (location));
- else
- warning (ly_scm2string (str), ly_scm2string (location));
+LY_DEFINE (ly_expect_warning, "ly:expect-warning",
+ 1, 0, 1, (SCM str, SCM rest),
+ "A Scheme callable function to register a warning to be expected"
+ " and subsequently suppressed. If the warning is not encountered,"
+ " a warning about the missing warning will be shown. The message"
+ " should be translated with @code{(_ ...)} and changing parameters"
+ " given after the format string.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ str = scm_simple_format (SCM_BOOL_F, str, rest);
+ expect_warning (ly_scm2string (str));
+ return SCM_UNSPECIFIED;
+}
+LY_DEFINE (ly_check_expected_warnings, "ly:check-expected-warnings",
+ 0, 0, 0, (),
+ "Check whether all expected warnings have really been triggered.")
+{
+ check_expected_warnings ();
return SCM_UNSPECIFIED;
}
+
+LY_DEFINE (ly_translate_cpp_warning_scheme, "ly:translate-cpp-warning-scheme",
+ 1, 0, 0, (SCM str),
+ "Translates a string in C++ printf format and modifies it to use"
+ " it for scheme formatting.")
+{
+ LY_ASSERT_TYPE (scm_is_string, str, 1);
+ string s = _ (ly_scm2string (str).c_str ());
+
+ /* Now replace all printf placeholders by scheme placeholders (~a).
+ * Guile's format syntax is pretty similar to C's printf, only with
+ * a tilde as the placeholder instead of a percent sign.
+ * There is no easy way to replace all ~ -> ~~, %% -> %, % -> ~,
+ * so simply walk through each character.
+ */
+// size_t pos = 0;
+ const char *pos = s.c_str ();
+ string result = "";
+ while (*pos != '\0')
+ {
+ // In some cases (%%, %s) we need to do a lookahead. As the C string is
+ // always \0-terminated the next char is never beyond the end of the
+ // memory!
+ switch (*pos)
+ {
+ case '~':
+ result += "~~";
+ break;
+ case '%':
+ if (*(pos + 1) == '%')
+ {
+ result += "%";
+ // Skip the second '%'
+ pos++;
+ }
+ else if (*(pos + 1) == 's' || *(pos + 1) == 'd')
+ {
+ // %s in C++ corresponds to ~a; ~s would add quotes!
+ // ~d is only supported by ice-9, use ~a instead
+ result += "~a";
+ // Skip the following 's'
+ pos++;
+ }
+ else
+ result += "~";
+ break;
+ default:
+ result += *pos;
+ }
+ pos++;
+ }
+ return ly_string2scm (result);
+}