X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fwarn-scheme.cc;h=cd9efc9ad4014abb410bf10ec047de8bca40f3a1;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=69fba1b8b7d94b14fed096a679e337e37e9db935;hpb=f875ef39c544bd3499dae5360e9e24f69933575f;p=lilypond.git diff --git a/lily/warn-scheme.cc b/lily/warn-scheme.cc index 69fba1b8b7..cd9efc9ad4 100644 --- a/lily/warn-scheme.cc +++ b/lily/warn-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2011 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -23,6 +23,7 @@ #include "lily-guile.hh" #include "program-option.hh" #include "version.hh" +#include "international.hh" #include "warn.hh" /* @@ -48,12 +49,7 @@ LY_DEFINE (ly_programming_error, "ly:programming-error", { 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; } @@ -64,12 +60,7 @@ LY_DEFINE (ly_warning, "ly:warning", { 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; } @@ -128,11 +119,81 @@ LY_DEFINE (ly_warning_located, "ly:warning-located", 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); +}