X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fincludable-lexer.cc;h=8c78481316a1aa418ac2ccf5614e04883d341f9d;hb=c20e5df6da652c0ad16e1d15a86c10006482520f;hp=f0eed9eb6c48e9e2aea49f6b64a972f261d5b6ba;hpb=a6a4b3fc2009f17a1a48cca0c11bfd3f38645937;p=lilypond.git diff --git a/lily/includable-lexer.cc b/lily/includable-lexer.cc index f0eed9eb6c..8c78481316 100644 --- a/lily/includable-lexer.cc +++ b/lily/includable-lexer.cc @@ -1,9 +1,20 @@ /* - includable-lexer.cc -- implement Includable_lexer + This file is part of LilyPond, the GNU music typesetter. - source file of the LilyPond music typesetter + Copyright (C) 1997--2010 Han-Wen Nienhuys - (c) 1997--2008 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "includable-lexer.hh" @@ -13,6 +24,7 @@ using namespace std; #include "config.hh" +#include "file-name.hh" #include "file-path.hh" #include "international.hh" #include "main.hh" @@ -36,6 +48,8 @@ using namespace std; (yy_buffer_stack != 0 ? yy_buffer_stack[yy_buffer_stack_top] : 0) #endif +extern bool relative_includes; + Includable_lexer::Includable_lexer () { #if HAVE_FLEXLEXER_YY_CURRENT_BUFFER @@ -47,13 +61,17 @@ Includable_lexer::Includable_lexer () void Includable_lexer::new_input (string name, Sources *sources) { - Source_file *file = sources->get_file (&name); + string current_dir = dir_name (main_input_name_); + if (relative_includes) + current_dir = include_stack_.size () ? dir_name (include_stack_.back ()->name_string ()) : ""; + + Source_file *file = sources->get_file (name, current_dir); if (!file) { string msg = _f ("cannot find file: `%s'", name); msg += "\n"; msg += _f ("(search path: `%s')", - sources->path_->to_string ().c_str ()); + (current_dir.length () ? (current_dir + PATHSEP) : "") + sources->path_->to_string ().c_str ()); LexerError (msg.c_str ()); return; } @@ -64,7 +82,12 @@ Includable_lexer::new_input (string name, Sources *sources) state_stack_.push_back (yy_current_buffer); if (be_verbose_global) - progress_indication (string ("[") + name); + { + string spaces = ""; + for (size_t i = 0; i < state_stack_.size (); i++) + spaces += " "; + progress_indication (string ("\n") + spaces + string ("[") + file->name_string ()); + } include_stack_.push_back (file); @@ -87,12 +110,23 @@ Includable_lexer::new_input (string name, string data, Sources *sources) state_stack_.push_back (yy_current_buffer); if (be_verbose_global) - progress_indication (string ("[") + name); + { + string spaces = ""; + for (size_t i = 0; i < state_stack_.size (); i++) + spaces += " "; + progress_indication (string ("\n") + spaces + string ("[") + name); + } include_stack_.push_back (file); 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. */