[4d5026]: src / code / pathname.lisp Maximize Restore History

Download this file

pathname.lisp    116 lines (101 with data), 4.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
;;;; the known-to-the-cross-compiler part of PATHNAME logic
;;;; This software is part of the SBCL system. See the README file for
;;;; more information.
;;;;
;;;; This software is derived from the CMU CL system, which was
;;;; written at Carnegie Mellon University and released into the
;;;; public domain. The software is in the public domain and is
;;;; provided with absolutely no warranty. See the COPYING and CREDITS
;;;; files for more information.
(in-package "SB!IMPL")
;;;; data types used by pathnames
;;; The HOST structure holds the functions that both parse the
;;; pathname information into structure slot entries, and after
;;; translation the inverse (unparse) functions.
(def!struct (host (:constructor nil))
(parse (missing-arg) :type function)
(unparse (missing-arg) :type function)
(unparse-host (missing-arg) :type function)
(unparse-directory (missing-arg) :type function)
(unparse-file (missing-arg) :type function)
(unparse-enough (missing-arg) :type function)
(customary-case (missing-arg) :type (member :upper :lower)))
(def!method print-object ((host host) stream)
(print-unreadable-object (host stream :type t :identity t)))
(def!struct (logical-host
(:make-load-form-fun make-logical-host-load-form-fun)
(:include host
(parse #'parse-logical-namestring)
(unparse #'unparse-logical-namestring)
(unparse-host
(lambda (x)
(logical-host-name (%pathname-host x))))
(unparse-directory #'unparse-logical-directory)
(unparse-file #'unparse-unix-file)
(unparse-enough #'unparse-enough-namestring)
(customary-case :upper)))
(name "" :type simple-base-string)
(translations nil :type list)
(canon-transls nil :type list))
(def!method print-object ((logical-host logical-host) stream)
(print-unreadable-object (logical-host stream :type t)
(prin1 (logical-host-name logical-host) stream)))
(defun make-logical-host-load-form-fun (logical-host)
(values `(find-logical-host ',(logical-host-name logical-host))
nil))
;;; A PATTERN is a list of entries and wildcards used for pattern
;;; matches of translations.
(sb!xc:defstruct (pattern (:constructor make-pattern (pieces)))
(pieces nil :type list))
;;;; PATHNAME structures
;;; the various magic tokens that are allowed to appear in pretty much
;;; all pathname components
(sb!xc:deftype pathname-component-tokens ()
'(member nil :unspecific :wild))
(sb!xc:defstruct (pathname (:conc-name %pathname-)
(:constructor %make-pathname (host
device
directory
name
type
version))
(:predicate pathnamep))
;; the host (at present either a UNIX or logical host)
(host nil :type (or host null))
;; the name of a logical or physical device holding files
(device nil :type (or simple-string pathname-component-tokens))
;; a list of strings that are the component subdirectory components
(directory nil :type list)
;; the filename
(name nil :type (or simple-string pattern pathname-component-tokens))
;; the type extension of the file
(type nil :type (or simple-string pattern pathname-component-tokens))
;; the version number of the file, a positive integer (not supported
;; on standard Unix filesystems)
(version nil :type (or integer pathname-component-tokens (member :newest))))
;;; Logical pathnames have the following format:
;;;
;;; logical-namestring ::=
;;; [host ":"] [";"] {directory ";"}* [name] ["." type ["." version]]
;;;
;;; host ::= word
;;; directory ::= word | wildcard-word | **
;;; name ::= word | wildcard-word
;;; type ::= word | wildcard-word
;;; version ::= pos-int | newest | NEWEST | *
;;; word ::= {uppercase-letter | digit | -}+
;;; wildcard-word ::= [word] '* {word '*}* [word]
;;; pos-int ::= integer > 0
;;;
;;; Physical pathnames include all these slots and a device slot.
;;; Logical pathnames are a subclass of PATHNAME. Their class
;;; relations are mimicked using structures for efficiency.
(sb!xc:defstruct (logical-pathname (:conc-name %logical-pathname-)
(:include pathname)
(:constructor %make-logical-pathname
(host
device
directory
name
type
version))))