summary refs log tree commit diff
path: root/src/fix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fix.cc')
-rw-r--r--src/fix.cc32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/fix.cc b/src/fix.cc
index d17e7b5502..9e5b8b5d41 100644
--- a/src/fix.cc
+++ b/src/fix.cc
@@ -10,6 +10,24 @@
 typedef ATerm Expr;
 
 
+static Strings searchDirs;
+
+
+static string searchPath(string relPath)
+{
+    for (Strings::iterator i = searchDirs.begin();
+         i != searchDirs.end(); i++)
+    {
+        string path = *i + "/" + relPath;
+        if (pathExists(path)) return path;
+    }
+
+    throw Error(
+        format("path `%1%' not found in any of the search directories")
+        % relPath);
+}
+
+
 static Expr evalFile(string fileName);
 
 
@@ -108,7 +126,7 @@ static Expr evalExpr(Expr e)
 
     /* Relative files. */
     if (ATmatch(e, "Relative(<str>)", &s1)) {
-        string srcPath = s1;
+        string srcPath = searchPath(s1);
         string dstPath;
         Hash hash;
         addToStore(srcPath, dstPath, hash);
@@ -198,13 +216,9 @@ static Expr evalExpr(Expr e)
 }
 
 
-static Strings searchPath;
-
-
-static Expr evalFile(string fileName)
+static Expr evalFile(string relPath)
 {
-    Expr e = ATreadFromNamedFile(fileName.c_str());
-    if (!e) throw Error(format("cannot read aterm `%1%'") % fileName);
+    Expr e = ATreadFromNamedFile(searchPath(relPath).c_str());
     return evalExpr(e);
 }
 
@@ -213,7 +227,7 @@ void run(Strings args)
 {
     Strings files;
 
-    searchPath.push_back(".");
+    searchDirs.push_back(".");
     
     for (Strings::iterator it = args.begin();
          it != args.end(); )
@@ -223,7 +237,7 @@ void run(Strings args)
         if (arg == "--includedir" || arg == "-I") {
             if (it == args.end())
                 throw UsageError(format("argument required in `%1%'") % arg);
-            searchPath.push_back(*it++);
+            searchDirs.push_back(*it++);
         }
         else if (arg[0] == '-')
             throw UsageError(format("unknown flag `%1%`") % arg);