From 7a8644f06d3c78e1bb7da6f02b090b8bb565b25e Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 19 Jul 2010 23:50:34 +0100 Subject: [PATCH] Add new exported function: ly:parser-include-string. --- input/regression/include-string.ly | 8 ++++++++ lily/includable-lexer.cc | 6 ++++++ lily/include/includable-lexer.hh | 2 ++ lily/include/lily-parser.hh | 1 + lily/lexer.ll | 6 ++++++ lily/lily-parser-scheme.cc | 14 ++++++++++++++ lily/lily-parser.cc | 6 ++++++ 7 files changed, 43 insertions(+) create mode 100644 input/regression/include-string.ly diff --git a/input/regression/include-string.ly b/input/regression/include-string.ly new file mode 100644 index 0000000000..256cc5ab23 --- /dev/null +++ b/input/regression/include-string.ly @@ -0,0 +1,8 @@ +\version "2.13.29" + +\header { + texidoc = "@code{ly:parser-include-string} should include the current +string like a file @code{\include}." +} + +#(ly:parser-include-string parser "\\relative c' { a4 b c d }") diff --git a/lily/includable-lexer.cc b/lily/includable-lexer.cc index 2ddfdd38c0..8c78481316 100644 --- a/lily/includable-lexer.cc +++ b/lily/includable-lexer.cc @@ -121,6 +121,12 @@ Includable_lexer::new_input (string name, string data, Sources *sources) yy_switch_to_buffer (yy_create_buffer (file->get_istream (), YY_BUF_SIZE)); } +void +Includable_lexer::add_string_include (string data) +{ + pending_string_includes_.push_back (data); +} + /** pop the inputstack. conceptually this is a destructor, but it does not destruct the Source_file that Includable_lexer::new_input creates. */ diff --git a/lily/include/includable-lexer.hh b/lily/include/includable-lexer.hh index 9df81461db..cad1e45d71 100644 --- a/lily/include/includable-lexer.hh +++ b/lily/include/includable-lexer.hh @@ -42,6 +42,7 @@ protected: bool close_input (); vector include_stack_; vector char_count_stack_; + vector pending_string_includes_; public: @@ -56,6 +57,7 @@ public: virtual void new_input (string s, Sources *); void new_input (string name, string data, Sources *); + void add_string_include (string data); char const *here_str0 () const; }; diff --git a/lily/include/lily-parser.hh b/lily/include/lily-parser.hh index a3f5667b74..2961ffbb90 100644 --- a/lily/include/lily-parser.hh +++ b/lily/include/lily-parser.hh @@ -63,6 +63,7 @@ public: void clear (); void do_init_file (); void do_yyparse (); + void include_string (string ly_code); void parse_file (string init, string name, string out_name); void parse_string (string ly_code); void parser_error (string); diff --git a/lily/lexer.ll b/lily/lexer.ll index aaa95d7980..5f4aa8ef62 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -51,6 +51,7 @@ using namespace std; #include "interval.hh" #include "lily-guile.hh" #include "lily-lexer.hh" +#include "lily-parser.hh" #include "lilypond-version.hh" #include "main.hh" #include "music.hh" @@ -366,6 +367,11 @@ BOM_UTF8 \357\273\277 yylval.scm = unpack_identifier(sval); return identifier_type (yylval.scm); } + + for (size_t i = 0; i < pending_string_includes_.size (); i++) + new_input ("", pending_string_includes_[i], + parser_->sources_); + pending_string_includes_.clear (); yylval.scm = sval; return SCM_TOKEN; diff --git a/lily/lily-parser-scheme.cc b/lily/lily-parser-scheme.cc index a608111dca..2b968b46c0 100644 --- a/lily/lily-parser-scheme.cc +++ b/lily/lily-parser-scheme.cc @@ -205,6 +205,20 @@ LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string", return SCM_UNSPECIFIED; } +LY_DEFINE (ly_parser_include_string, "ly:parser-include-string", + 2, 0, 0, (SCM parser_smob, SCM ly_code), + "Include the string @var{ly-code} into the input stream" + " for @var{parser-smob}.") +{ + LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); + Lily_parser *parser = unsmob_lily_parser (parser_smob); + LY_ASSERT_TYPE (scm_is_string, ly_code, 2); + + parser->include_string (ly_scm2string (ly_code)); + + 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}." diff --git a/lily/lily-parser.cc b/lily/lily-parser.cc index 4d4b3ac33e..e0722fd980 100644 --- a/lily/lily-parser.cc +++ b/lily/lily-parser.cc @@ -164,6 +164,12 @@ Lily_parser::parse_string (string ly_code) error_level_ = error_level_ | lexer_->error_level_; } +void +Lily_parser::include_string (string ly_code) +{ + lexer_->add_string_include (ly_code); +} + void Lily_parser::clear () { -- 2.39.5