Raymond Toy pushed to branch issue-158-darwin-pathnames at cmucl / cmucl

Commits:

4 changed files:

Changes:

  • src/code/lispinit.lisp
    ... ... @@ -308,7 +308,8 @@
    308 308
     ;;; in Unwind-Protects will get executed.
    
    309 309
     
    
    310 310
     (declaim (special *lisp-initialization-functions*
    
    311
    -		  *load-time-values*))
    
    311
    +		  *load-time-values*
    
    312
    +		  *enable-normalization*))
    
    312 313
     
    
    313 314
     (eval-when (compile)
    
    314 315
       (defmacro print-and-call (name)
    
    ... ... @@ -344,6 +345,7 @@
    344 345
       (setf *type-system-initialized* nil)
    
    345 346
       (setf *break-on-signals* nil)
    
    346 347
       (setf unix::*filename-encoding* nil)
    
    348
    +  (setf *enable-normalization* nil)
    
    347 349
       #+gengc (setf conditions::*handler-clusters* nil)
    
    348 350
       (setq intl::*default-domain* "cmucl")
    
    349 351
       (setq intl::*locale* "C")
    

  • src/code/pathname.lisp
    ... ... @@ -252,6 +252,24 @@
    252 252
     ;;; This constructor is used to make an instance of the correct type
    
    253 253
     ;;; from parsed arguments.
    
    254 254
     
    
    255
    +(defvar *enable-normalization* nil)
    
    256
    +
    
    257
    +(defun normalize-name (piece)
    
    258
    +  ;; Normalize Darwin pathnames by converting Hangul
    
    259
    +  ;; syllables to conjoining jamo, and converting the
    
    260
    +  ;; string to NFD form, but skipping over a range of
    
    261
    +  ;; characters.
    
    262
    +  (typecase piece
    
    263
    +    (string
    
    264
    +     (if *enable-normalization*
    
    265
    +	 (decompose (unicode::decompose-hangul piece)
    
    266
    +		    :compatibility nil
    
    267
    +		    :darwinp t)
    
    268
    +	 piece))
    
    269
    +    (t
    
    270
    +     ;; What should we do about lisp::pattern objects?
    
    271
    +     piece)))
    
    272
    +  
    
    255 273
     (defun %make-pathname-object (host device directory name type version)
    
    256 274
       (if (typep host 'logical-host)
    
    257 275
           (flet ((upcasify (thing)
    
    ... ... @@ -271,24 +289,16 @@
    271 289
     				(upcasify name)
    
    272 290
     				(upcasify type)
    
    273 291
     				(upcasify version)))
    
    274
    -      #-darwin
    
    292
    +      #-(not nil)
    
    275 293
           (%make-pathname host device directory name type version)
    
    276
    -      #+darwin
    
    277
    -      (flet ((normalize-name (string)
    
    278
    -	       ;; Normalize Darwin pathnames by converting Hangul
    
    279
    -	       ;; syllables to conjoining jamo, and converting the
    
    280
    -	       ;; string to NFD form, but skipping over a range of
    
    281
    -	       ;; characters.
    
    282
    -	       (decompose (with-output-to-string (s)
    
    283
    -			    (unicode::decompose-hangul string s))
    
    284
    -			  :compatibility nil
    
    285
    -			  :darwinp t)))
    
    286
    -	(%make-pathname host device
    
    287
    -			(list (car directory)
    
    288
    -			      (mapcar #'normalize-name (cdr directory)))
    
    289
    -			(normalize-name name)
    
    290
    -			(normalize-name type)
    
    291
    -			version))))
    
    294
    +      #+(not nil)
    
    295
    +      (%make-pathname host device
    
    296
    +		      (when directory
    
    297
    +			(list* (car directory)
    
    298
    +			       (mapcar #'normalize-name (cdr directory))))
    
    299
    +		      (normalize-name name)
    
    300
    +		      (normalize-name type)
    
    301
    +		      version))))
    
    292 302
     
    
    293 303
     ;;; *LOGICAL-HOSTS* --internal.
    
    294 304
     ;;;
    

  • src/code/save.lisp
    ... ... @@ -284,6 +284,16 @@
    284 284
     	     (set-up-locale-external-format)
    
    285 285
     	     ;; Set terminal encodings to :locale
    
    286 286
     	     (set-system-external-format :locale)
    
    287
    +	     ;; Get some unicode stuff needed for decomposing strings.
    
    288
    +	     ;; This is needed on Darwin to normalize pathname
    
    289
    +	     ;; objects, which needs this information.  If we don't,
    
    290
    +	     ;; we'll load the information at runtime when creating
    
    291
    +	     ;; the path to "unidata.dat", which then calls decompose
    
    292
    +	     ;; again, and so on.
    
    293
    +	     (progn
    
    294
    +	       (lisp::load-decomp)
    
    295
    +	       (lisp::load-combining)
    
    296
    +	       (setf *enable-normalization* t))
    
    287 297
     	     (ext::process-command-strings process-command-line)
    
    288 298
     	     (setf *editor-lisp-p* nil)
    
    289 299
     	     (macrolet ((find-switch (name)
    

  • src/code/unidata.lisp
    ... ... @@ -513,11 +513,12 @@
    513 513
     		    (read-vector lvec stm :endian-swap :network-order)
    
    514 514
     		    (values split hvec mvec lvec))))
    
    515 515
     	 (declare (ignorable #'read16 #'read32 #'read-ntrie))
    
    516
    -	 (with-open-file (,stm *unidata-path* :direction :input
    
    517
    -			       :element-type '(unsigned-byte 8))
    
    518
    -	   (unless (unidata-locate ,stm ,locn)
    
    519
    -	     (error (intl:gettext "No data in file.")))
    
    520
    -	   ,@body)))))
    
    516
    +	 (let (#+nil(lisp::*enable-normalization* nil))
    
    517
    +	   (with-open-file (,stm *unidata-path* :direction :input
    
    518
    +						:element-type '(unsigned-byte 8))
    
    519
    +	     (unless (unidata-locate ,stm ,locn)
    
    520
    +	       (error (intl:gettext "No data in file.")))
    
    521
    +	     ,@body))))))
    
    521 522
     
    
    522 523
     (defloader load-range (stm 0)
    
    523 524
       (let* ((n (read32 stm))