From: Joe Neeman Date: Wed, 31 Dec 2008 21:54:14 +0000 (+1100) Subject: Merge commit 'origin' into includes X-Git-Tag: release/2.12.2-1~32^2~17^2~12 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=bb91de5b7f8c4f753452730101c2422946067cc3;hp=9c1421a4c5d42ae3c78218a296596cc9a4c2e4f5;p=lilypond.git Merge commit 'origin' into includes --- diff --git a/lily/includable-lexer.cc b/lily/includable-lexer.cc index f0eed9eb6c..e241b66230 100644 --- a/lily/includable-lexer.cc +++ b/lily/includable-lexer.cc @@ -13,6 +13,7 @@ using namespace std; #include "config.hh" +#include "file-name.hh" #include "file-path.hh" #include "international.hh" #include "main.hh" @@ -36,6 +37,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 +50,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 +71,7 @@ Includable_lexer::new_input (string name, Sources *sources) state_stack_.push_back (yy_current_buffer); if (be_verbose_global) - progress_indication (string ("[") + name); + progress_indication (string ("[") + file->name_string ()); include_stack_.push_back (file); diff --git a/lily/include/includable-lexer.hh b/lily/include/includable-lexer.hh index 1e35012f33..f5d0d44a71 100644 --- a/lily/include/includable-lexer.hh +++ b/lily/include/includable-lexer.hh @@ -36,6 +36,7 @@ public: Includable_lexer (); ~Includable_lexer (); + string main_input_name_; /// store dependencies for Makefile stuff. vector file_name_strings_; diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index 83a9f89b93..284e5636c6 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -38,7 +38,6 @@ private: int hidden_state_; public: vector extra_token_types_; - string main_input_name_; void *lexval; Input *lexloc; bool is_main_input_; diff --git a/lily/include/sources.hh b/lily/include/sources.hh index fe55fe72ba..a964a7bf6a 100644 --- a/lily/include/sources.hh +++ b/lily/include/sources.hh @@ -19,8 +19,7 @@ public: Sources (); ~Sources (); - Source_file *get_file (string *file_name); - Source_file *get_sourcefile (char const *); + Source_file *get_file (string file_name, string const& currentpath); void add (Source_file *sourcefile); void set_path (File_path *); diff --git a/lily/lily-parser-scheme.cc b/lily/lily-parser-scheme.cc index fbeb7db507..d6a1c79ea6 100644 --- a/lily/lily-parser-scheme.cc +++ b/lily/lily-parser-scheme.cc @@ -47,8 +47,6 @@ LY_DEFINE (ly_parse_file, "ly:parse-file", file name. */ File_name out_file_name (file_name); - global_path.append (out_file_name.dir_); - out_file_name.ext_ = ""; out_file_name.root_ = ""; if (ly_get_option (ly_symbol2scm ("gui")) != SCM_BOOL_T diff --git a/lily/program-option-scheme.cc b/lily/program-option-scheme.cc index 1dd74ff69e..d68af75ab1 100644 --- a/lily/program-option-scheme.cc +++ b/lily/program-option-scheme.cc @@ -23,6 +23,8 @@ bool debug_skylines; bool debug_property_callbacks; bool debug_page_breaking_scoring; +bool relative_includes; + /* Backwards compatibility. */ @@ -103,6 +105,11 @@ void internal_set_option (SCM var, SCM val) /* ignore input value. */ val = ly_string2scm (lilypond_datadir); } + else if (var == ly_symbol2scm ("relative-includes")) + { + relative_includes = to_boolean (val); + val = scm_from_bool (to_boolean (val)); + } scm_hashq_set_x (option_hash, var, val); diff --git a/lily/sources.cc b/lily/sources.cc index 05717455e0..62ee7a1e99 100644 --- a/lily/sources.cc +++ b/lily/sources.cc @@ -8,7 +8,9 @@ #include "sources.hh" +#include "config.hh" #include "source-file.hh" +#include "file-name.hh" #include "file-path.hh" Sources::Sources () @@ -30,22 +32,38 @@ Sources::set_path (File_path *f) } /** - open a file + Open a file. If the name is not absolute, look in CURRENT_DIR first. + Afterwards, check the rest of the path_. - File_string the file to be opened, name might be changed if it is - found in a search path. + FILE_STRING the name of the file to be opened. + CURRENT_DIR a path to a directory, either absolute or relative to the + working directory. */ Source_file * -Sources::get_file (string *file_string) //UGH -{ - if (*file_string != "-" && path_) +Sources::get_file (string file_string, string const& current_dir) +{ + if (file_string != "-") { - string file_string_o = path_->find (*file_string); - if ((file_string_o == "") && (*file_string != "")) - return 0; - *file_string = file_string_o; + // First, check for a path relative to the directory of the + // file currently being parsed. + if (current_dir.length () + && file_string.length () + && !File_name (file_string).is_absolute () + && is_file (current_dir + DIRSEP + file_string)) + file_string = current_dir + DIRSEP + file_string; + + // Otherwise, check the rest of the path. + else if (path_) + { + string file_string_o = path_->find (file_string); + if ((file_string_o == "") && (file_string != "")) + return 0; + + file_string = file_string_o; + } } - Source_file *f = new Source_file (*file_string); + + Source_file *f = new Source_file (file_string); add (f); return f; } diff --git a/scm/lily.scm b/scm/lily.scm index 900c347c26..086d80f09f 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -80,6 +80,8 @@ on errors, and print a stack trace.") (resolution 101 "resolution for generating PNG bitmaps") (read-file-list #f "Read files to be processed from command line arguments") + (relative-includes #f "When processing an \\include command, look for the included file +relative to the current file (instead of the root file)") (safe #f "Run safely") (strict-infinity-checking #f "If yes, crash on encountering Inf/NaN.")