From b5d92fbcaf636b705c7e10b0cf4a5f26079e8beb Mon Sep 17 00:00:00 2001
From: Francois-Rene Rideau <tunes@google.com>
Date: Wed, 26 Feb 2014 12:16:51 -0500
Subject: [PATCH] Some fixes to CLISP on Windows: use ext:probe-pathname, not
 posix:file-stat; use ext:run-program, not ext:shell.

---
 test/test-run-program.script |  5 +++++
 uiop/filesystem.lisp         |  2 +-
 uiop/run-program.lisp        | 17 ++++++++++-------
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/test/test-run-program.script b/test/test-run-program.script
index 76b1dc62..39abbe49 100644
--- a/test/test-run-program.script
+++ b/test/test-run-program.script
@@ -1,6 +1,11 @@
 ;; -*- Lisp -*-
 (declaim (optimize (debug 3) (safety #-gcl 3 #+gcl 0)))
 
+#+(and clisp os-windows)
+(ext:without-package-lock ()
+  (trace uiop:run-program uiop/run-program::%run-program uiop/run-program::%system
+         ext:shell ext:run-shell-command ext:run-program))
+
 ;; On Windows, normalize away CRLF into jut the unixy LF.
 (defun dewindowize (x)
   (block ()
diff --git a/uiop/filesystem.lisp b/uiop/filesystem.lisp
index abad3624..24152993 100644
--- a/uiop/filesystem.lisp
+++ b/uiop/filesystem.lisp
@@ -116,7 +116,7 @@ or the original (parsed) pathname if it is false (the default)."
                                  (cond
                                    (truename foundtrue)
                                    (foundtrue p)))))
-                       (let* ((fs (find-symbol* '#:file-stat :posix nil))
+                       (let* ((fs (or #-os-windows (find-symbol* '#:file-stat :posix nil)))
                               (pp (find-symbol* '#:probe-pathname :ext nil))
                               (resolve (if pp
                                            `(ignore-errors (,pp p))
diff --git a/uiop/run-program.lisp b/uiop/run-program.lisp
index 5102f7d6..a11d6099 100644
--- a/uiop/run-program.lisp
+++ b/uiop/run-program.lisp
@@ -410,7 +410,7 @@ It returns a process-info plist with possible keys:
     ;; NB: these implementations have unix vs windows set at compile-time.
     (declare (ignorable if-input-does-not-exist if-output-exists if-error-output-exists))
     (assert (not (and wait (member :stream (list input output error-output)))))
-    #-(or allegro clozure cmu (and lispworks os-unix) sbcl scl)
+    #-(or allegro clisp clozure cmu (and lispworks os-unix) sbcl scl)
     (progn command keys directory
            (error "run-program not available"))
     #+(or allegro clisp clozure cmu (and lispworks os-unix) sbcl scl)
@@ -435,10 +435,10 @@ It returns a process-info plist with possible keys:
              #-allegro
              (with-current-directory (#-sbcl directory)
                #+clisp
-               (flet ((run (f &rest args)
+               (flet ((run (f x &rest args)
                         (multiple-value-list
-                         (apply f :input %input :output %output
-                                  :allow-other-keys t `(,@args ,@keys)))))
+                         (apply f x :input %input :output %output
+                                    :allow-other-keys t `(,@args ,@keys)))))
                  (assert (eq %error-output :terminal))
                  ;;; since we now always return a code, we can't use this code path, anyway!
                  (etypecase %command
@@ -769,14 +769,17 @@ It returns a process-info plist with possible keys:
     #+(or allegro clozure cmu (and lispworks os-unix) sbcl scl)
     (%wait-process-result
      (apply '%run-program (%normalize-system-command command) :wait t keys))
-    #+(or abcl clisp cormanlisp ecl gcl (and lispworks os-windows) mkcl xcl)
+    #+(or abcl cormanlisp clisp ecl gcl (and lispworks os-windows) mkcl xcl)
     (let ((%command (%redirected-system-command command input output error-output directory)))
       #+(and lispworks os-windows)
       (system:call-system %command :current-directory directory :wait t)
-      #-(and lispworks os-windows)
+      #+clisp
+      (%wait-process-result
+       (apply '%run-program %command :wait t
+              :input :interactive :output :interactive :error-output :interactive keys))
+      #-(or clisp (and lispworks os-windows))
       (with-current-directory ((unless (os-unix-p) directory))
         #+abcl (ext:run-shell-command %command)
-        #+clisp (clisp-exit-code (ext:shell %command))
         #+cormanlisp (win32:system %command)
         #+ecl (let ((*standard-input* *stdin*)
                     (*standard-output* *stdout*)
-- 
GitLab