]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/my-lily-parser.cc
* lily/paper-score.cc (process): Do not show progress newline.
[lilypond.git] / lily / my-lily-parser.cc
index c6bdec50c3313a860905b2de90909ad61488752e..bd9c938a3c1e97367b8c1a406dc45f11248268c0 100644 (file)
@@ -8,24 +8,21 @@
 */
 
 #include "book.hh"
-#include "book-paper-def.hh"
 #include "file-name.hh"
 #include "file-path.hh"
 #include "lily-version.hh"
 #include "ly-module.hh"
-#include "ly-smobs.icc"
 #include "main.hh"
 #include "my-lily-lexer.hh"
 #include "my-lily-parser.hh"
 #include "output-def.hh"
-#include "parray.hh"
+#include "paper-book.hh"
 #include "parser.hh"
-#include "scm-hash.hh"
 #include "score.hh"
 #include "source.hh"
-#include "string.hh"
 #include "warn.hh"
 
+
 My_lily_parser::My_lily_parser (Sources *sources)
 {
   book_count_ = 0;
@@ -35,9 +32,7 @@ My_lily_parser::My_lily_parser (Sources *sources)
   default_duration_ = Duration (2,0);
   error_level_ = 0;
   last_beam_start_ = SCM_EOL;
-  header_ = SCM_EOL;
 
-  header_ = ly_make_anonymous_module (false);
   smobify_self ();
 }
 
@@ -50,7 +45,6 @@ My_lily_parser::My_lily_parser (My_lily_parser const &src)
   default_duration_ = src.default_duration_;
   error_level_ = src.error_level_;
   last_beam_start_ = src.last_beam_start_;
-  header_ = src.header_;
 
   smobify_self ();
   lexer_ = new My_lily_lexer (*src.lexer_);
@@ -61,6 +55,8 @@ My_lily_parser::~My_lily_parser ()
   // FIXME: Memleak: del lexer
 }
 
+#include "ly-smobs.icc"
+
 IMPLEMENT_SMOBS (My_lily_parser);
 IMPLEMENT_TYPE_P (My_lily_parser, "ly:my-lily-parser?");
 IMPLEMENT_DEFAULT_EQUAL_P (My_lily_parser);
@@ -69,7 +65,8 @@ SCM
 My_lily_parser::mark_smob (SCM s)
 {
   My_lily_parser *parser = (My_lily_parser*) ly_cdr (s);
-  return parser->header_;
+  (void) parser;
+  return SCM_EOL;
 }
 
 int
@@ -146,6 +143,9 @@ My_lily_parser::parse_string (String ly_code)
       parent->error_level_ = lexer_->error_level_; 
       parent->main_input_b_ = lexer_->main_input_b_;
     }
+
+  delete lexer_;
+  lexer_ = 0;
 }
 
 void
@@ -208,8 +208,8 @@ My_lily_parser::here_input () const
 bool store_locations_global_b;
 
 /* Do not append `!' suffix, since 1st argument is not modified. */
-LY_DEFINE (ly_set_point_and_click, "ly:set-point-and-click", 1, 0, 0,
-         (SCM what),
+LY_DEFINE (ly_set_point_and_click, "ly:set-point-and-click",
+          1, 0, 0, (SCM what),
          "Set the options for Point-and-click source specials output. The\n"
 "argument is a symbol.  Possible options are @code{none} (no source specials),\n"
 "@code{line} and @code{line-column}")
@@ -228,8 +228,7 @@ LY_DEFINE (ly_set_point_and_click, "ly:set-point-and-click", 1, 0, 0,
 }
 
 LY_DEFINE (ly_parse_file, "ly:parse-file",
-          1, 0, 0,
-          (SCM name),
+          1, 0, 0, (SCM name),
           "Parse a single @code{.ly} file.  "
           "Upon failure, throw @code{ly-file-failed} key.")
 {
@@ -242,8 +241,7 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
      write output to cwd; do not use root and directory parts of input
      file name.  */
   File_name out_file_name (file_name);
-  if (file_name != "-")
-    out_file_name.ext_ = output_format_global;
+  out_file_name.ext_ = "";
   out_file_name.root_ = "";
   out_file_name.dir_ = "";
 
@@ -281,6 +279,8 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
       progress_indication ("\n");
 
       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->parse_file (init, file_name, out_file);
@@ -296,8 +296,7 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
 }
 
 LY_DEFINE (ly_parse_string, "ly:parse-string",
-          1, 0, 0,
-          (SCM ly_code),
+          1, 0, 0, (SCM ly_code),
           "Parse the string LY_CODE.  "
           "Upon failure, throw @code{ly-file-failed} key.")
 {
@@ -315,19 +314,19 @@ LY_DEFINE (ly_parse_string, "ly:parse-string",
 }
 
 LY_DEFINE (ly_clone_parser, "ly:clone-parser",
-           1, 0, 0, 
-           (SCM parser_smob),
+           1, 0, 0, (SCM parser_smob),
            "Return a clone of PARSER_SMOB.")
 {
   My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
   My_lily_parser *clone = new My_lily_parser (*parser);
+
+  /* FIXME: should copy scopes too. */
   return scm_gc_unprotect_object (clone->self_scm ());
 }
 
-LY_DEFINE(ly_parser_define, "ly:parser-define",
-          3, 0, 0, 
-          (SCM parser_smob, SCM symbol, SCM val),
-          "Bind SYMBOL to VAL in PARSER_SMOB's module.")
+LY_DEFINE (ly_parser_define, "ly:parser-define",
+          3, 0, 0, (SCM parser_smob, SCM symbol, SCM val),
+          "Bind SYMBOL to VAL in PARSER_SMOB's module.")
 {
   My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
   SCM_ASSERT_TYPE (ly_c_symbol_p (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
@@ -337,10 +336,11 @@ LY_DEFINE(ly_parser_define, "ly:parser-define",
   parser->lexer_->set_identifier (scm_symbol_to_string (symbol), val);
   return SCM_UNSPECIFIED;
 }
-LY_DEFINE(ly_parser_lookup, "ly:parser-lookup",
-          2, 0, 0, 
-          (SCM parser_smob, SCM symbol),
-          "Lookup @var{symbol} in @var{parser_smob}'s module. Undefined is '().")
+
+LY_DEFINE (ly_parser_lookup, "ly:parser-lookup",
+          2, 0, 0, (SCM parser_smob, SCM symbol),
+          "Lookup @var{symbol} in @var{parser_smob}'s module.  "
+          "Undefined is '().")
 {
   My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
 
@@ -355,12 +355,10 @@ LY_DEFINE(ly_parser_lookup, "ly:parser-lookup",
 }
 
 LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string",
-          2, 0, 0,
-          (SCM parser_smob, SCM ly_code),
+          2, 0, 0, (SCM parser_smob, SCM ly_code),
           "Parse the string LY_CODE with PARSER_SMOB."
           "Upon failure, throw @code{ly-file-failed} key.")
 {
-
   My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
 
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "parser");
@@ -378,6 +376,8 @@ get_paper (My_lily_parser *parser)
   Output_def *paper = unsmob_output_def (id);
   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"));
   return paper;
 }
 
@@ -393,22 +393,20 @@ get_midi (My_lily_parser *parser)
 }
 
 
-Book_output_def*
+Output_def*
 get_bookpaper (My_lily_parser *parser)
 {
   SCM id = parser->lexer_->lookup_identifier ("$defaultbookpaper");
-  Book_output_def *paper = unsmob_book_output_def (id);
+  Output_def *paper = unsmob_output_def (id);
 
-  paper = paper ? dynamic_cast<Book_output_def*> (paper->clone ()) : new Book_output_def;
+  paper = paper ? dynamic_cast<Output_def*> (paper->clone ()) : new Output_def;
   paper->set_variable (ly_symbol2scm ("is-bookpaper"), SCM_BOOL_T);
   return paper;
 }
 
 
-/*
-  TODO: move this to Scheme? Why take the parser arg, and all the back
-  & forth between scm and c++?
- */
+/* TODO: move this to Scheme?  Why take the parser arg, and all the back
+   & forth between scm and c++? */
 LY_DEFINE (ly_parser_print_score, "ly:parser-print-score",
           2, 0, 0,
           (SCM parser_smob, SCM score_smob),
@@ -420,8 +418,8 @@ LY_DEFINE (ly_parser_print_score, "ly:parser-print-score",
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "parser");
   SCM_ASSERT_TYPE (score, score_smob, SCM_ARG2, __FUNCTION__, "score");
 
-  SCM header = is_module (score->header_) ? score->header_
-    : parser->header_.to_SCM ();
+  SCM header = ly_c_module_p (score->header_) ? score->header_
+    : parser->lexer_->lookup_identifier ("$globalheader");
   
   File_name outname (parser->output_basename_);
   int *c = &parser->book_count_;
@@ -430,9 +428,10 @@ LY_DEFINE (ly_parser_print_score, "ly:parser-print-score",
   (*c)++;
 
   SCM os = scm_makfrom0str (outname.to_string ().to_str0 ());
+  SCM bookpaper = get_bookpaper (parser)->self_scm ();
   for (int i = 0; i < score->defs_.size (); i++)
     default_rendering (score->music_, score->defs_[i]->self_scm (),
-                      get_bookpaper (parser)->self_scm (),
+                      bookpaper,
                       header, os);
 
   if (score->defs_.is_empty ())
@@ -446,14 +445,32 @@ LY_DEFINE (ly_parser_print_score, "ly:parser-print-score",
   return SCM_UNDEFINED;
 }
 
+
+LY_DEFINE (ly_parser_set_note_names, "ly:parser-set-note-names",
+          2, 0, 0, (SCM parser, SCM names),
+          "Replace current note names in @var{parser}. "
+          "@var{names} is an alist of symbols.  "
+          "This only has effect if the current mode is notes.")
+{
+  My_lily_parser *p = unsmob_my_lily_parser (parser);
+  SCM_ASSERT_TYPE(p, parser, SCM_ARG1, __FUNCTION__, "Lilypond parser");
+
+  if (p->lexer_->is_note_state ())
+    {
+      p->lexer_->pop_state ();
+      p->lexer_->push_note_state (alist_to_hashq (names));
+    }
+
+  return SCM_UNSPECIFIED;
+}
+
 LY_DEFINE (ly_parser_print_book, "ly:parser-print-book",
-          2, 0, 0,
-          (SCM parser_smob, SCM book_smob),
+          2, 0, 0, (SCM parser_smob, SCM book_smob),
           "Print book.")
 {
   My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
   Book *book = unsmob_book (book_smob);
-  Book_output_def *bp = unsmob_book_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper"));
+  Output_def *bp = unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper"));
   
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "Lilypond parser");
   SCM_ASSERT_TYPE (book, book_smob, SCM_ARG2, __FUNCTION__, "Book");
@@ -461,14 +478,21 @@ LY_DEFINE (ly_parser_print_book, "ly:parser-print-book",
   /*  ugh. changing argument.*/
   book->bookpaper_ = bp;
   
-  SCM header = parser->header_;
   File_name outname (parser->output_basename_);
   int *c = &parser->book_count_;
   if (*c)
     outname.base_ += "-" + to_string (*c);
   (*c)++;
+
   Output_def *paper = get_paper (parser);
-  book->process (outname.to_string (), paper, header);
+
+  Paper_book* pb = book->process (outname.to_string (), paper);
+
+  pb->output (outname.to_string ());
+  
   scm_gc_unprotect_object (paper->self_scm ());
+  scm_gc_unprotect_object (pb->self_scm ());
+
   return SCM_UNDEFINED;
 }
+