[Openmcl-devel] Handling of :CASE :COMMON in MAKE-PATHNAME

Gary Byers gb at clozure.com
Wed Apr 30 08:02:52 PDT 2008


As far as I can see (which admittedly isn't far), your analysis is correct
and the patch seems to be.  Thanks!

On Tue, 29 Apr 2008, Richard M Kreuter wrote:

> Hi,
>
> Using the 1.2-r9226-RC1 snapshot, I see the following when calling
> MAKE-PATHNAME with :CASE :COMMON:
>
> ? (make-pathname :case :common :name "ABC"
>                 :defaults (user-homedir-pathname))
> #P"/HOME/KREUTER/abc"
>
> That is, case conversion is being performed on fields filled in from
> the DEFAULTS argument.  ISTM that MAKE-PATHNAME shouldn't perform case
> conversion on components it fills in from DEFAULTS, for two reasons:
>
> (1) those components are filled in under the rules used by
> MERGE-PATHNAMES, and MERGE-PATHNAMES doesn't frob case:
>
> ? (merge-pathnames (make-pathname :name "ABC" :case :common)
>                   (user-homedir-pathname))
> #P"/home/kreuter/abc"
>
> (2) 19.2.2.1.2.1 and 19.2.2.1.2.2 describes the behavior of various
>    functions when receiving strings, and the :DEFAULTS argument to
>    MAKE-PATHNAME isn't a string argument per se.
>
> The following patch should ensure that any case conversion is only
> carried out on arguments supplied to MAKE-PATHNAME, before filling the
> new pathname's components from the defaults.
>
> Thanks,
> Richard Kreuter
>
> --- l1-files.lisp.orig	2008-04-20 09:35:15.000000000 -0400
> +++ l1-files.lisp	2008-04-29 17:24:55.000000000 -0400
> @@ -546,6 +546,10 @@
> 		   (pathname-host defaulted-defaults)
> 		   :unspecific)))
>     (unless host (setq host :unspecific)))
> +  (when (and case (neq case :local))
> +    (setf directory (%reverse-component-case directory case)
> +          name (%reverse-component-case name case)
> +          type (%reverse-component-case type case)))
>   (if directory-p
>     (setq directory (%std-directory-component directory host)))
>   (if (and defaults (not directory-p))
> @@ -576,11 +580,6 @@
>   (let* ((after-wif (cadr (member :wild-inferiors directory))))
>     (when (member after-wif '(:up :back))
>           (error 'simple-file-error :pathname path :error-type "Directory component in ~s contains :WILD-INFERIORS followed by ~s" :format-arguments (list after-wif))))
> -
> -  (when (and case (neq case :local))
> -    (setf (%pathname-directory path) (%reverse-component-case (%pathname-directory path) case)
> -          (%pathname-name path) (%reverse-component-case (%pathname-name path) case)
> -          (%pathname-type path) (%reverse-component-case (%pathname-type path) case)))
>   path)
>
> ;;;  In portable CL, if the :directory argument to make pathname is a
>
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel
>
>



More information about the Openmcl-devel mailing list