]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lily-parser.cc
* lily/modified-font-metric.cc (text_dimension): try
[lilypond.git] / lily / lily-parser.cc
index 3183421f39e6278b3171b57f58a4895073486dd9..fb09a41e5290f3356b5d99eeae0e425fc444694d 100644 (file)
@@ -7,14 +7,16 @@
        Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
+#include "lily-parser.hh"
+
 #include "book.hh"
+#include "lilypond-key.hh"
 #include "file-name.hh"
 #include "file-path.hh"
 #include "lily-version.hh"
 #include "ly-module.hh"
 #include "main.hh"
 #include "lily-lexer.hh"
-#include "lily-parser.hh"
 #include "output-def.hh"
 #include "paper-book.hh"
 #include "parser.hh"
@@ -22,7 +24,6 @@
 #include "source.hh"
 #include "warn.hh"
 
-
 Lily_parser::Lily_parser (Sources *sources)
 {
   book_count_ = 0;
@@ -66,7 +67,7 @@ IMPLEMENT_DEFAULT_EQUAL_P (Lily_parser);
 SCM
 Lily_parser::mark_smob (SCM s)
 {
-  Lily_parser *parser = (Lily_parser*) ly_cdr (s);
+  Lily_parser *parser = (Lily_parser*) SCM_CELL_WORD_1 (s);
   return (parser->lexer_) ? parser->lexer_->self_scm () : SCM_EOL;
 }
 
@@ -74,7 +75,7 @@ int
 Lily_parser::print_smob (SCM s, SCM port, scm_print_state*)
 {
   scm_puts ("#<my_lily_parser ", port);
-  Lily_parser *parser = (Lily_parser*) ly_cdr (s);
+  Lily_parser *parser = (Lily_parser*) SCM_CELL_WORD_1 (s);
   (void) parser;
   scm_puts (" >", port);
   return 1;
@@ -101,10 +102,15 @@ Lily_parser::parse_file (String init, String name, String out_name)
 
   lexer_->new_input (init, sources_);
 
+  File_name f (name);
+  String s = global_path.find (f.base_ + ".twy");
+  s = gulp_file_to_string (s, false);
+  scm_eval_string (scm_makfrom0str (s.to_str0 ()));
+
   /* Read .ly IN_FILE, lex, parse, write \score blocks from IN_FILE to
      OUT_FILE (unless IN_FILE redefines output file name).  */
   do_yyparse ();
-  
+
   if (!define_spots_.is_empty ())
     {
       define_spots_.top ().warning (_ ("Braces don't match"));
@@ -118,10 +124,6 @@ Lily_parser::parse_file (String init, String name, String out_name)
 void
 Lily_parser::parse_string (String ly_code)
 {
-#if 0
-  SCM parent_prot = lexer_ ? lexer_->self_scm () : SCM_EOL;
-#endif
-
   Lily_lexer * parent = lexer_;
   lexer_ = (parent == 0 ? new Lily_lexer (sources_)
            : new Lily_lexer (*parent));
@@ -129,7 +131,7 @@ Lily_parser::parse_string (String ly_code)
 
 
   SCM oldmod = scm_current_module ();
-  scm_set_current_module (ly_car (lexer_->scopes_));
+  scm_set_current_module (scm_car (lexer_->scopes_));
   
   // TODO: use $parser 
   lexer_->set_identifier (ly_symbol2scm ("parser"),
@@ -144,30 +146,13 @@ Lily_parser::parse_string (String ly_code)
   
   if (!define_spots_.is_empty ())
     {
-      define_spots_.top ().warning (_ ("Braces don't match"));
-      error_level_ = 1;
+      if (define_spots_.is_empty()
+         && !error_level_ )
+       programming_error ("Braces don't match, but error_level_ not set.");
     }
 
   error_level_ = error_level_ | lexer_->error_level_;
 
-#if 0
-  if (Lily_lexer::unsmob (parent_prot))
-    {
-      /*
-       what the fuck is this good for?
-       */
-      parent->encoding_ = lexer_->encoding_;
-      parent->chordmodifier_tab_ = lexer_->chordmodifier_tab_;
-      parent->pitchname_tab_stack_ = lexer_->pitchname_tab_stack_;
-      parent->sources_ = lexer_->sources_;
-      parent->scopes_ = lexer_->scopes_;
-      parent->error_level_ = lexer_->error_level_; 
-      parent->main_input_b_ = lexer_->main_input_b_;
-    }
-  
-  scm_remember_upto_here_1 (parent_prot);
-#endif
-  
   scm_set_current_module (oldmod);
   lexer_ = 0;
 }
@@ -241,9 +226,9 @@ LY_DEFINE (ly_set_point_and_click, "ly:set-point-and-click",
   /* UGH. */
   SCM val = SCM_BOOL_F;
   if (ly_symbol2scm ("line-column") == what)
-    val = ly_scheme_function ("line-column-location");
+    val = ly_lily_module_constant ("line-column-location");
   else if (what == ly_symbol2scm ("line"))
-    val = ly_scheme_function ("line-location");
+    val = ly_lily_module_constant ("line-location");
 
   scm_module_define (global_lily_module, ly_symbol2scm ("point-and-click"),
                     val);
@@ -303,7 +288,7 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
       Sources sources;
       sources.set_path (&global_path);
   
-      progress_indication (_f ("Now processing `%s'", file_name.to_str0 ()));
+      progress_indication (_f ("Processing `%s'", file_name.to_str0 ()));
       progress_indication ("\n");
 
       Lily_parser *parser = new Lily_parser (&sources);
@@ -356,7 +341,7 @@ LY_DEFINE (ly_parser_define, "ly:parser-define",
           "Bind SYMBOL to VAL in PARSER_SMOB's module.")
 {
   Lily_parser *parser = unsmob_my_lily_parser (parser_smob);
-  SCM_ASSERT_TYPE (ly_c_symbol_p (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
+  SCM_ASSERT_TYPE (scm_is_symbol (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG2, __FUNCTION__, "parser");  
 
   parser->lexer_->set_identifier (scm_symbol_to_string (symbol), val);
@@ -370,10 +355,10 @@ LY_DEFINE (ly_parser_lookup, "ly:parser-lookup",
 {
   Lily_parser *parser = unsmob_my_lily_parser (parser_smob);
 
-  SCM_ASSERT_TYPE (ly_c_symbol_p (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
+  SCM_ASSERT_TYPE (scm_is_symbol (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG2, __FUNCTION__, "parser");  
 
-  SCM val= parser->lexer_->lookup_identifier (ly_scm2string (scm_symbol_to_string (symbol)));
+  SCM val = parser->lexer_->lookup_identifier (ly_scm2string (scm_symbol_to_string (symbol)));
   if (val != SCM_UNDEFINED)
     return val;
   else
@@ -396,15 +381,14 @@ LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string",
 }
 
 Output_def*
-get_paper (Lily_parser *parser)
+get_layout (Lily_parser *parser)
 {
-  SCM id = parser->lexer_->lookup_identifier ("$defaultpaper");
-  Output_def *paper = unsmob_output_def (id);
-  paper = paper ? paper->clone () : new Output_def;
-  paper->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T);
+  SCM id = parser->lexer_->lookup_identifier ("$defaultlayout");
+  Output_def *layout = unsmob_output_def (id);
+  layout = layout ? layout->clone () : new Output_def;
+  layout->set_variable (ly_symbol2scm ("is-layout"), SCM_BOOL_T);
 
-  paper->parent_ = unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper"));
-  return paper;
+  return layout;
 }
 
 
@@ -412,22 +396,22 @@ Output_def*
 get_midi (Lily_parser *parser)
 {
   SCM id = parser->lexer_->lookup_identifier ("$defaultmidi");
-  Output_def *paper = unsmob_output_def (id);
-  paper = paper ? paper->clone () : new Output_def;
-  paper->set_variable (ly_symbol2scm ("is-midi"), SCM_BOOL_T);
-  return paper;
+  Output_def *layout = unsmob_output_def (id);
+  layout = layout ? layout->clone () : new Output_def;
+  layout->set_variable (ly_symbol2scm ("is-midi"), SCM_BOOL_T);
+  return layout;
 }
 
 
 Output_def*
-get_bookpaper (Lily_parser *parser)
+get_paper (Lily_parser *parser)
 {
-  SCM id = parser->lexer_->lookup_identifier ("$defaultbookpaper");
-  Output_def *paper = unsmob_output_def (id);
+  SCM id = parser->lexer_->lookup_identifier ("$defaultpaper");
+  Output_def *layout = unsmob_output_def (id);
 
-  paper = paper ? dynamic_cast<Output_def*> (paper->clone ()) : new Output_def;
-  paper->set_variable (ly_symbol2scm ("is-bookpaper"), SCM_BOOL_T);
-  return paper;
+  layout = layout ? dynamic_cast<Output_def*> (layout->clone ()) : new Output_def;
+  layout->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T);
+  return layout;
 }
 
 
@@ -441,6 +425,11 @@ LY_DEFINE (ly_parser_print_score, "ly:parser-print-score",
   Lily_parser *parser = unsmob_my_lily_parser (parser_smob);
   Score *score = unsmob_score (score_smob);
 
+  Object_key * key = new Lilypond_general_key (0, score->user_key_, 0);
+  
+  if (score->error_found_)
+    return SCM_UNSPECIFIED;
+  
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "parser");
   SCM_ASSERT_TYPE (score, score_smob, SCM_ARG2, __FUNCTION__, "score");
 
@@ -454,20 +443,23 @@ 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 ();
+  SCM paper = get_paper (parser)->self_scm ();
   for (int i = 0; i < score->defs_.size (); i++)
-    default_rendering (score->music_, score->defs_[i]->self_scm (),
-                      bookpaper,
-                      header, os);
+    default_rendering (score->get_music (), score->defs_[i]->self_scm (),
+                      paper,
+                      header, os,
+                      key->self_scm ());
 
   if (score->defs_.is_empty ())
     {
-      Output_def *paper = get_paper (parser);
-      default_rendering (score->music_, paper->self_scm (),
-                        get_bookpaper (parser)->self_scm (),
-                        header, os);
-      scm_gc_unprotect_object (paper->self_scm ());
+      Output_def *layout = get_layout (parser);
+      default_rendering (score->get_music(), layout->self_scm (),
+                        get_paper (parser)->self_scm (),
+                        header, os, key->self_scm ());
+      scm_gc_unprotect_object (layout->self_scm ());
     }
+
+  scm_gc_unprotect_object (key->self_scm ());
   return SCM_UNSPECIFIED;
 }
 
@@ -496,13 +488,13 @@ LY_DEFINE (ly_parser_print_book, "ly:parser-print-book",
 {
   Lily_parser *parser = unsmob_my_lily_parser (parser_smob);
   Book *book = unsmob_book (book_smob);
-  Output_def *bp = unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper"));
+  Output_def *bp = unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultpaper"));
   
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "Lilypond parser");
   SCM_ASSERT_TYPE (book, book_smob, SCM_ARG2, __FUNCTION__, "Book");
   
   /*  ugh. changing argument.*/
-  book->bookpaper_ = bp;
+  book->paper_ = bp;
   
   File_name outname (parser->output_basename_);
   int *c = &parser->book_count_;
@@ -510,15 +502,16 @@ LY_DEFINE (ly_parser_print_book, "ly:parser-print-book",
     outname.base_ += "-" + to_string (*c);
   (*c)++;
 
-  Output_def *paper = get_paper (parser);
-
-  Paper_book* pb = book->process (outname.to_string (), paper);
-
-  pb->output (outname.to_string ());
+  Output_def *layout = get_layout (parser);
+  Paper_book* pb = book->process (outname.to_string (), layout);
   
-  scm_gc_unprotect_object (paper->self_scm ());
-  scm_gc_unprotect_object (pb->self_scm ());
+  if (pb)
+    {
+      pb->output (outname.to_string ());
+      scm_gc_unprotect_object (pb->self_scm ());
+    }
 
+  scm_gc_unprotect_object (layout->self_scm ());
   return SCM_UNSPECIFIED;
 }