From bda80e88563aea94e396bbbcc746a2440e34dd86 Mon Sep 17 00:00:00 2001
From: Justin Ethier <justin.ethier@gmail.com>
Date: Tue, 31 Jan 2017 17:51:37 -0500
Subject: [PATCH] Add dir options to (lib:import->filename)

---
 scheme/cyclone/libraries.sld | 42 ++++++++++++++++++++++++++++--------
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/scheme/cyclone/libraries.sld b/scheme/cyclone/libraries.sld
index 0c67fb1e..37dfcaf1 100644
--- a/scheme/cyclone/libraries.sld
+++ b/scheme/cyclone/libraries.sld
@@ -187,12 +187,23 @@
      (error "Unexpected type in import set"))))
 
 ;; Resolve library filename given an import. 
-;; Assumes ".sld" file extension if one is not specified.
-(define (lib:import->filename import . ext)
+;; Options:
+;; - Extension, assumes ".sld" file extension if one is not specified.
+;; - Append path, list of strings
+;; - Prepend path, list of strings
+(define (lib:import->filename import . opts)
   (let* ((file-ext 
-          (if (null? ext)
+          (if (null? opts)
               ".sld"
-              (car ext)))
+              (car opts)))
+         (append-dirs
+          (if (or (null? opts) (null? (cdr opts)))
+              '()
+              (cadr opts)))
+         (prepend-dirs
+          (if (or (null? opts) (null? (cdr opts)) (null? (cddr opts)))
+              '()
+              (caddr opts)))
          (filename*
           (string-append
             (apply
@@ -203,11 +214,24 @@
                 import))
             file-ext))
          (filename
-           (substring filename* 1 (string-length filename*))))
-    (if (or (tagged-list? 'scheme import)
-            (tagged-list? 'srfi import))
-      (string-append (Cyc-installation-dir 'sld) "/" filename) ;; Built-in library
-      filename)))
+           (substring filename* 1 (string-length filename*)))
+         (dir (if (or (tagged-list? 'scheme import)
+                      (tagged-list? 'srfi import))
+                  (Cyc-installation-dir 'sld)
+                  "")))
+    (call/cc
+      (lambda (return)
+        (for-each
+          (lambda (path)
+            (let ((f (string-append path "/" filename)))
+              (if (file-exists? f) 
+                  (return f))))
+          (append prepend-dirs (list dir) append-dirs))
+        ;; Not found, just return base name
+        (if (> (string-length dir) 0)
+            (string-append dir "/" filename)
+            filename)))
+  ))
 
 ;; Get path to directory that contains the library
 (define (lib:import->path import)