X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsources.cc;h=dc784d2bdb5f20c17058f2219309d2e6e44c08b2;hb=9e781b7dc83b60a543ce218aa1a5f139f74c760f;hp=05717455e0c4aa038b5b0fd93ff95838ed2c9a40;hpb=e344ae579fa1d81fc6c6f3049494697872fd39f9;p=lilypond.git diff --git a/lily/sources.cc b/lily/sources.cc index 05717455e0..dc784d2bdb 100644 --- a/lily/sources.cc +++ b/lily/sources.cc @@ -1,14 +1,27 @@ /* - source.cc -- implement Sources + This file is part of LilyPond, the GNU music typesetter. - source file of the LilyPond music typesetter + Copyright (C) 1997--2014 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 "sources.hh" +#include "config.hh" #include "source-file.hh" +#include "file-name.hh" #include "file-path.hh" Sources::Sources () @@ -16,13 +29,11 @@ Sources::Sources () path_ = 0; } - Sources::Sources (Sources const &) { assert (false); } - void Sources::set_path (File_path *f) { @@ -30,22 +41,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 +Sources::get_file (string file_string, string const ¤t_dir) { - if (*file_string != "-" && path_) + 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; }