From fedb5fe3fe4dda3c89c29af07a7b92cecd6eac70 Mon Sep 17 00:00:00 2001
From: Han-Wen Nienhuys <hanwen@xs4all.nl>
Date: Sun, 20 Jun 2004 20:27:05 +0000
Subject: [PATCH] * 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.
---
 ChangeLog               |  9 +++++++++
 lily/book.cc            | 27 +++++++++++++++++++++++++++
 lily/my-lily-parser.cc  |  6 +++---
 lily/score.cc           |  2 +-
 ly/declarations-init.ly |  9 +++------
 ly/init.ly              |  4 +++-
 scm/lily.scm            | 15 +++++++++------
 scm/safe-lily.scm       |  3 ---
 8 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a64a4a6536..3afcd91c29 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2004-06-20  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+	* 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
-- 
2.39.5