#include "config.hh"
+#include "file-name.hh"
#include "file-path.hh"
#include "international.hh"
#include "main.hh"
void
Includable_lexer::new_input (string name, Sources *sources)
{
- Source_file *file = sources->get_file (&name);
+ string 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;
}
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);
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 *);
#include "sources.hh"
+#include "config.hh"
#include "source-file.hh"
+#include "file-name.hh"
#include "file-path.hh"
Sources::Sources ()
}
/**
- 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;
}