-
- (let* ((header-line (make-array
- (length *fasl-header-string-start-string*)
- :element-type '(unsigned-byte 8))))
- (read-sequence header-line stream)
- (if (mismatch header-line *fasl-header-string-start-string*
- :test #'(lambda (code char) (= code (char-code char))))
- (let ((truename (probe-file stream)))
- (when (and truename
- (string= (pathname-type truename) *fasl-file-type*))
- (error 'fasl-header-missing
- :stream (namestring truename)
- :fhsss header-line
- :expected *fasl-header-string-start-string*)))
- (progn
- (file-position stream :start)
- (return-from load
- (load-stream stream))))))
+ (let* ((real (probe-file stream))
+ (should-be-fasl-p
+ (and real (string-equal (pathname-type real) *fasl-file-type*))))
+ ;; Don't allow empty .fasls, and assume other empty files
+ ;; are source files.
+ (when (and (or should-be-fasl-p (not (eql 0 (file-length stream))))
+ (fasl-header-p stream :errorp should-be-fasl-p))
+ (return-from load (load-stream stream t)))))
+ ;; Case 3: Open using the gived external format, process as source.