]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/my-lily-parser.cc
* lily/new-slur.cc (avoid_staff_line): new function: avoid
[lilypond.git] / lily / my-lily-parser.cc
index 365e64694cb406d16e62f9dbee895b265acd0a76..36e11abf0363344847759e836937ddafd5e60efb 100644 (file)
@@ -8,7 +8,6 @@
 */
 
 #include "book.hh"
-
 #include "file-name.hh"
 #include "file-path.hh"
 #include "lily-version.hh"
@@ -23,8 +22,6 @@
 #include "source.hh"
 #include "warn.hh"
 
-#include "ly-smobs.icc"
-
 
 My_lily_parser::My_lily_parser (Sources *sources)
 {
@@ -50,7 +47,8 @@ My_lily_parser::My_lily_parser (My_lily_parser const &src)
   last_beam_start_ = src.last_beam_start_;
 
   smobify_self ();
-  lexer_ = new My_lily_lexer (*src.lexer_);
+  if (src.lexer_)
+    lexer_ = new My_lily_lexer (*src.lexer_);
 }
 
 My_lily_parser::~My_lily_parser ()
@@ -58,6 +56,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);
@@ -66,6 +66,7 @@ SCM
 My_lily_parser::mark_smob (SCM s)
 {
   My_lily_parser *parser = (My_lily_parser*) ly_cdr (s);
+  (void) parser;
   return SCM_EOL;
 }
 
@@ -85,6 +86,9 @@ void
 My_lily_parser::parse_file (String init, String name, String out_name)
 {
   lexer_ = new My_lily_lexer (sources_);
+  // TODO: use $parser 
+  lexer_->set_identifier (ly_symbol2scm ("parser"),
+                         self_scm ());
   output_basename_ = out_name;
   
   lexer_->main_input_name_ = name;
@@ -117,6 +121,14 @@ My_lily_parser::parse_string (String ly_code)
   lexer_ = (parent == 0 ? new My_lily_lexer (sources_)
            : new My_lily_lexer (*parent));
 
+
+  SCM oldmod = scm_current_module ();
+  scm_set_current_module (ly_car (lexer_->scopes_));
+  
+  // TODO: use $parser 
+  lexer_->set_identifier (ly_symbol2scm ("parser"),
+                         self_scm ());
+  
   lexer_->main_input_name_ = "<string>";
   lexer_->main_input_b_ = true;
 
@@ -143,6 +155,10 @@ My_lily_parser::parse_string (String ly_code)
       parent->error_level_ = lexer_->error_level_; 
       parent->main_input_b_ = lexer_->main_input_b_;
     }
+
+  scm_set_current_module (oldmod);
+  delete lexer_;
+  lexer_ = 0;
 }
 
 void
@@ -205,8 +221,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}")
@@ -225,22 +241,24 @@ 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.")
 {
   SCM_ASSERT_TYPE (ly_c_string_p (name), name, SCM_ARG1, __FUNCTION__, "string");
   char const *file = SCM_STRING_CHARS (name);
   char const *extensions[] = {"ly", "", 0};
+
   String file_name = global_path.find (file, extensions);
-  
+
   /* By default, use base name of input file for output file name,
      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;
+
+  global_path.append (out_file_name.dir_);
+  
+  out_file_name.ext_ = "";
   out_file_name.root_ = "";
   out_file_name.dir_ = "";
 
@@ -278,8 +296,7 @@ LY_DEFINE (ly_parse_file, "ly:parse-file",
       progress_indication ("\n");
 
       My_lily_parser *parser = new My_lily_parser (&sources);
-      scm_module_define (global_lily_module, ly_symbol2scm ("parser"),
-                        parser->self_scm ());
+
       parser->parse_file (init, file_name, out_file);
 
       bool error = parser->error_level_;
@@ -293,8 +310,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.")
 {
@@ -312,32 +328,32 @@ 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");
   SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG2, __FUNCTION__, "parser");  
 
-
   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);
 
@@ -352,12 +368,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");
@@ -376,7 +390,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;
 }
 
@@ -404,10 +418,8 @@ get_bookpaper (My_lily_parser *parser)
 }
 
 
-/*
-  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),
@@ -443,12 +455,30 @@ LY_DEFINE (ly_parser_print_score, "ly:parser-print-score",
                         header, os);
       scm_gc_unprotect_object (paper->self_scm ());
     }
-  return SCM_UNDEFINED;
+  return SCM_UNSPECIFIED;
+}
+
+
+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);
@@ -476,5 +506,6 @@ LY_DEFINE (ly_parser_print_book, "ly:parser-print-book",
   scm_gc_unprotect_object (paper->self_scm ());
   scm_gc_unprotect_object (pb->self_scm ());
 
-  return SCM_UNDEFINED;
+  return SCM_UNSPECIFIED;
 }
+