]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge commit 'origin' into includes
authorJoe Neeman <joeneeman@gmail.com>
Wed, 31 Dec 2008 21:54:14 +0000 (08:54 +1100)
committerJoe Neeman <joeneeman@gmail.com>
Wed, 31 Dec 2008 21:54:14 +0000 (08:54 +1100)
lily/includable-lexer.cc
lily/include/includable-lexer.hh
lily/include/lily-lexer.hh
lily/include/sources.hh
lily/lily-parser-scheme.cc
lily/program-option-scheme.cc
lily/sources.cc
scm/lily.scm

index f0eed9eb6c48e9e2aea49f6b64a972f261d5b6ba..e241b66230af3724439045acff458aa195315aa0 100644 (file)
@@ -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);
 
index 1e35012f335fe9c48fd357a34c2fcefe08ef7818..f5d0d44a7153c5464abee2f7fa1b39954f046d2e 100644 (file)
@@ -36,6 +36,7 @@ public:
 
   Includable_lexer ();
   ~Includable_lexer ();
+  string main_input_name_;
 
   /// store dependencies for Makefile stuff.
   vector<string> file_name_strings_;
index 83a9f89b9353fa70257bf97b7d74c126dbabe118..284e5636c6ec208db8e0fa9014d83793077d1bc1 100644 (file)
@@ -38,7 +38,6 @@ private:
   int hidden_state_;
 public:
   vector<int> extra_token_types_;
-  string main_input_name_;
   void *lexval;
   Input *lexloc;
   bool is_main_input_;
index fe55fe72ba82d45fbb3f2c2235e62be8fe267501..a964a7bf6a8c802218e9285511a7c4639f6f0228 100644 (file)
@@ -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 *);
 
index fbeb7db5072d0f3aef51382291f377ed7e92dc11..d6a1c79ea6c343b2e3fa7bb36bf6ce8d6b8a5014 100644 (file)
@@ -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
index 1dd74ff69e8a13495e943974898f3c73223302f0..d68af75ab1a1d7e759ad9c91761bc50dd04eb2a3 100644 (file)
@@ -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);
index 05717455e0c4aa038b5b0fd93ff95838ed2c9a40..62ee7a1e9970112aea37d2005ec3ccd23634d97e 100644 (file)
@@ -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;
 }
index 900c347c26aefd9abf303a6a8812e1a7143e505c..086d80f09f4d2b3e86e8438d4311a7d352002dc6 100644 (file)
@@ -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.")