X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-parser.cc;h=bd8939af9d5bca92d663060794895f8646853ac0;hb=2be67678488b5829a52acdf36ab4278477375b6d;hp=018d4b0e8ab0d69ea2e9920c6c60c1697dbacd8a;hpb=652a2aa6f783e1e7e90a8a95ad50b39cbab4284f;p=lilypond.git diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index 018d4b0e8a..bd8939af9d 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -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 "paper-def.hh" -#include "parray.hh" +#include "output-def.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"); @@ -371,28 +369,44 @@ LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string", return SCM_UNSPECIFIED; } -Music_output_def* +Output_def* get_paper (My_lily_parser *parser) { SCM id = parser->lexer_->lookup_identifier ("$defaultpaper"); - Music_output_def *paper = unsmob_music_output_def (id); - return paper ? paper->clone () : new Paper_def; + 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; +} + + +Output_def* +get_midi (My_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; } -Book_paper_def* +Output_def* get_bookpaper (My_lily_parser *parser) { SCM id = parser->lexer_->lookup_identifier ("$defaultbookpaper"); - Book_paper_def *paper = unsmob_book_paper_def (id); - return paper->clone (); + Output_def *paper = unsmob_output_def (id); + + paper = paper ? dynamic_cast (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), @@ -404,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_; @@ -414,30 +428,49 @@ 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 ()) { - Music_output_def *paper = get_paper (parser); + 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 ()); } - 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); Book *book = unsmob_book (book_smob); - Book_paper_def *bp = unsmob_book_paper_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"); @@ -445,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)++; - Music_output_def *paper = get_paper (parser); - book->process (outname.to_string (), paper, header); + + Output_def *paper = get_paper (parser); + + Paper_book* pb = book->process (outname.to_string (), paper); + + pb->output (outname.to_string ()); + scm_gc_unprotect_object (paper->self_scm ()); - return SCM_UNDEFINED; + scm_gc_unprotect_object (pb->self_scm ()); + + return SCM_UNSPECIFIED; } +