Inherit FP modes for new threads on Windows.
[sbcl.git] / src / code / pathname.lisp
index 542aa09..deb6343 100644 (file)
@@ -26,7 +26,6 @@
   (unparse-file (missing-arg) :type function)
   (unparse-enough (missing-arg) :type function)
   (unparse-directory-separator (missing-arg) :type simple-string)
-  (simplify-namestring (missing-arg) :type function)
   (customary-case (missing-arg) :type (member :upper :lower)))
 
 (def!method print-object ((host host) stream)
              (:include host
                        (parse #'parse-logical-namestring)
                        (parse-native
-                        (lambda (x)
+                        (lambda (&rest x)
                           (error "called PARSE-NATIVE-NAMESTRING using a ~
-                                  logical host: ~S" x)))
+                                  logical host: ~S" (first x))))
                        (unparse #'unparse-logical-namestring)
                        (unparse-native
-                        (lambda (x)
+                        (lambda (&rest x)
                           (error "called NATIVE-NAMESTRING using a ~
-                                  logical host: ~S" x)))
+                                  logical host: ~S" (first x))))
                        (unparse-host
                         (lambda (x)
                           (logical-host-name (%pathname-host x))))
@@ -52,7 +51,6 @@
                        (unparse-file #'unparse-logical-file)
                        (unparse-enough #'unparse-enough-namestring)
                        (unparse-directory-separator ";")
-                       (simplify-namestring #'identity)
                        (customary-case :upper)))
   (name "" :type simple-string)
   (translations nil :type list)
@@ -77,7 +75,7 @@
 ;;; all pathname components
 (eval-when (#-sb-xc :compile-toplevel :load-toplevel :execute)
   (def!type pathname-component-tokens ()
-    '(member nil :unspecific :wild)))
+    '(member nil :unspecific :wild :unc)))
 
 (sb!xc:defstruct (pathname (:conc-name %pathname-)
                            (:constructor %make-pathname (host
                                                   name
                                                   type
                                                   version))))
+
+;;; This is used both for Unix and Windows: while we accept both
+;;; \ and / as directory separators on Windows, we print our
+;;; own always with /, which is much less confusing what with
+;;; being \ needing to be escaped.
+(defun unparse-physical-directory (pathname)
+  (declare (pathname pathname))
+  (unparse-physical-directory-list (%pathname-directory pathname)))
+
+(defun unparse-physical-directory-list (directory)
+  (declare (list directory))
+  (collect ((pieces))
+    (when directory
+      (ecase (pop directory)
+       (:absolute
+        (let ((next (pop directory)))
+          (cond ((eq :home next)
+                 (pieces "~"))
+                ((and (consp next) (eq :home (car next)))
+                 (pieces "~")
+                 (pieces (second next)))
+                ((and (plusp (length next)) (char= #\~ (char next 0)))
+                 ;; The only place we need to escape the tilde.
+                 (pieces "\\")
+                 (pieces next))
+                (next
+                 (push next directory)))
+          (pieces "/")))
+        (:relative))
+      (dolist (dir directory)
+        (typecase dir
+         ((member :up)
+          (pieces "../"))
+         ((member :back)
+          (error ":BACK cannot be represented in namestrings."))
+         ((member :wild-inferiors)
+          (pieces "**/"))
+         ((or simple-string pattern (member :wild))
+          (pieces (unparse-physical-piece dir))
+          (pieces "/"))
+         (t
+          (error "invalid directory component: ~S" dir)))))
+    (apply #'concatenate 'simple-string (pieces))))