From: Han-Wen Nienhuys Date: Sun, 20 Jun 2004 20:27:05 +0000 (+0000) Subject: * scm/lily.scm (collect-scores-for-book): new function. X-Git-Tag: release/2.3.5~21 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=fedb5fe3fe4dda3c89c29af07a7b92cecd6eac70;p=lilypond.git * scm/lily.scm (collect-scores-for-book): new function. * ly/init.ly: print collected scores/musics. * lily/my-lily-parser.cc (LY_DEFINE): define parser in parser scope, not in lily module. * lily/book.cc (LY_DEFINE): ly:make-book. New function. --- diff --git a/ChangeLog b/ChangeLog index a64a4a6536..3afcd91c29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2004-06-20 Han-Wen Nienhuys + * scm/lily.scm (collect-scores-for-book): new function. + + * ly/init.ly: print collected scores/musics. + + * lily/my-lily-parser.cc (LY_DEFINE): define parser in parser + scope, not in lily module. + + * lily/book.cc (LY_DEFINE): ly:make-book. New function. + * configure.in (PKG_CONFIG_PATH): add --enable-gui flag, and encapsulate gtk/pango tests. diff --git a/lily/book.cc b/lily/book.cc index 7387d645d6..f84560d3cd 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -95,3 +95,30 @@ Book::process (String outname, Output_def *default_def) return paper_book; } +LY_DEFINE(ly_make_book, "ly:make-book", + 2, 0, 1, (SCM bookpaper, SCM header, SCM scores), + "Make a \\book of @var{bookpaper} and @var{header} (which may be #f as well) " + "containing @code{\scores}.") +{ + Output_def * odef = unsmob_output_def (bookpaper); + SCM_ASSERT_TYPE (odef, bookpaper, + SCM_ARG1, __FUNCTION__, "Output_def"); + + Book *book = new Book; + book->bookpaper_ = odef; + + if (ly_c_module_p (header)) + book->header_ = header; + + for (SCM s = scores; ly_c_pair_p (s); s = ly_cdr (s)) + { + Score *score = unsmob_score (ly_car (s)); + if (score) + book->scores_.push (score); + } + + SCM x = book->self_scm (); + scm_gc_unprotect_object (x); + return x; +} + diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index bd8939af9d..1abe0fe85a 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -281,8 +281,8 @@ LY_DEFINE (ly_parse_file, "ly:parse-file", My_lily_parser *parser = new My_lily_parser (&sources); // TODO: use $parser - scm_module_define (global_lily_module, ly_symbol2scm ("parser"), - parser->self_scm ()); + parser->lexer_->set_identifier (ly_symbol2scm ("parser"), + parser->self_scm ()); parser->parse_file (init, file_name, out_file); bool error = parser->error_level_; @@ -377,7 +377,7 @@ get_paper (My_lily_parser *parser) paper = paper ? paper->clone () : new Output_def; paper->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T); - paper->parent_ =unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper")); + paper->parent_ = unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper")); return paper; } diff --git a/lily/score.cc b/lily/score.cc index 86eccf3e6e..133e1a987a 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -260,7 +260,7 @@ LY_DEFINE (ly_score_bookify, "ly:score-bookify", "@var{header} as book level header.") { SCM_ASSERT_TYPE (unsmob_score (score_smob), score_smob, - SCM_ARG1, __FUNCTION__, "score_smob"); + SCM_ARG1, __FUNCTION__, "Score"); Score *score = unsmob_score (score_smob); Book *book = new Book; diff --git a/ly/declarations-init.ly b/ly/declarations-init.ly index 92ec2ee052..0c874f436d 100644 --- a/ly/declarations-init.ly +++ b/ly/declarations-init.ly @@ -133,9 +133,6 @@ unusedEntry = \notes { c4 } %% must have size argument for GUILE 1.6 compat. #(define musicQuotes (make-hash-table 29)) -%%#(define-public toplevel-music-handler ly:parser-add-book-and-score) -#(define toplevel-book-handler default-toplevel-book-handler) -#(define toplevel-music-handler default-toplevel-music-handler) -#(define toplevel-score-handler default-toplevel-score-handler) - -#(define toplevel-score-handler default-toplevel-score-handler) +#(define toplevel-book-handler ly:parser-print-book) +#(define toplevel-music-handler collect-music-for-book) +#(define toplevel-score-handler collect-scores-for-book) diff --git a/ly/init.ly b/ly/init.ly index cf9571d58b..4bfdb7fb0e 100644 --- a/ly/init.ly +++ b/ly/init.ly @@ -11,11 +11,11 @@ #(ly:set-option 'new-relative) #(ly:set-point-and-click #f) +#(define toplevel-scores '()) \maininput % there is a problem at the end of the input file - %% %% above and below message is to compensate for look ahead of the parser. %% @@ -29,6 +29,8 @@ )))% there is a problem at the end of the input file +#(if (pair? toplevel-scores) + (ly:parser-print-book parser (apply ly:make-book $defaultbookpaper $globalheader toplevel-scores))) #(if (ly:get-option 'verbose) (begin diff --git a/scm/lily.scm b/scm/lily.scm index e082e897f3..ecd29e3876 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -94,7 +94,7 @@ ;; parser stuff. (define-public (print-music-as-book parser music) - (let* ((score (ly:music-scorify music)) + (let* ( (head (ly:parser-lookup parser '$globalheader)) (book (ly:score-bookify score head))) (ly:parser-print-book parser book))) @@ -111,12 +111,15 @@ (book (ly:score-bookify score head))) (ly:parser-print-score parser book))) -(define-public default-toplevel-music-handler print-music-as-book) -(define-public default-toplevel-book-handler ly:parser-print-book) -(define-public default-toplevel-score-handler print-score-as-book) - - +(define-public (collect-scores-for-book parser score) + (let* + ((oldval (ly:parser-lookup parser 'toplevel-scores))) + (ly:parser-define parser 'toplevel-scores (cons score oldval)) + )) +(define-public (collect-music-for-book parser music) + (collect-scores-for-book parser (score (ly:music-scorify music)))) + ;;;;;;;;;;;;;;;; ; alist (define-public (assoc-get key alist . default) diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm index 10e88ad7ec..47752e3bed 100644 --- a/scm/safe-lily.scm +++ b/scm/safe-lily.scm @@ -177,9 +177,6 @@ make-voice-props-set chord-name->german-markup note-name->german-markup - default-toplevel-music-handler - default-toplevel-book-handler - default-toplevel-score-handler Accidental_interface::after_line_breaking Accidental_interface::print