Changeset 5264


Ignore:
Timestamp:
Sep 26, 2006, 7:47:42 PM (18 years ago)
Author:
Gary Byers
Message:

More changes. Imagine that.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-1/l1-streams.lisp

    r5258 r5264  
    380380  (write-byte-when-locked-function 'ioblock-no-binary-output)
    381381  (peek-char-function 'ioblock-no-char-input)
    382   (reserved1 nil)
     382  (native-byte-order t)
    383383  (reserved2 nil)
    384384  (reserved3 nil)
     
    768768      (prog1 ch
    769769        (setf (ioblock-untyi-char ioblock) nil))
    770         (let* ((buf (ioblock-inbuf ioblock))
    771          (idx (io-buffer-idx buf))
    772          (limit (io-buffer-count buf)))
    773     (declare (fixnum idx limit))
    774     (when (= idx limit)
    775       (unless (%ioblock-advance ioblock t)
    776         (return-from %ioblock-tyi :eof))
    777       (setq idx (io-buffer-idx buf)
    778             limit (io-buffer-count buf)))
    779     (setf (io-buffer-idx buf) (the fixnum (1+ idx)))
    780     (%code-char (aref (the (simple-array (unsigned-byte 8) (*))
    781                         (io-buffer-buffer buf)) idx))))))
     770      (let* ((buf (ioblock-inbuf ioblock))
     771             (idx (io-buffer-idx buf))
     772             (limit (io-buffer-count buf)))
     773        (declare (fixnum idx limit))
     774        (when (= idx limit)
     775          (unless (%ioblock-advance ioblock t)
     776            (return-from %ioblock-tyi :eof))
     777          (setq idx (io-buffer-idx buf)
     778                limit (io-buffer-count buf)))
     779        (setf (io-buffer-idx buf) (the fixnum (1+ idx)))
     780        (%code-char (aref (the (simple-array (unsigned-byte 8) (*))
     781                            (io-buffer-buffer buf)) idx))))))
    782782
    783783(defun %private-ioblock-tyi (ioblock)
     
    14911491(defun %ioblock-write-u16-encoded-char (ioblock char)
    14921492  (declare (optimize (speed 3) (safety 0)))
     1493  (when (ioblock-pending-byte-order-mark ioblock)
     1494    (setf (ioblock-pending-byte-order-mark ioblock) nil)
     1495    (funcall (ioblock-encode-output-function ioblock)
     1496             byte-order-mark
     1497             #'%ioblock-write-u16-element
     1498             ioblock))
    14931499  (if (eq char #\linefeed)
    14941500    (setf (ioblock-charpos ioblock) 0)
     
    15131519    (%ioblock-write-u16-encoded-char ioblock char)))
    15141520
     1521
    15151522(defun %ioblock-write-u16-encoded-simple-string (ioblock string start-char num-chars)
     1523  (declare (fixnum start-char num-chars)
     1524           (simple-base-strng string)
     1525           (optimize (speed 3) (safety 0)))
     1526  (when (ioblock-pending-byte-order-mark ioblock)
     1527    (setf (ioblock-pending-byte-order-mark ioblock) nil)
     1528    (%ioblock-write-u16-element ioblock byte-order-mark-char-code))
     1529  (do* ((i 0 (1+ i))
     1530        (col (ioblock-charpos ioblock))
     1531        (limit (ioblock-literal-char-code-limit ioblock))
     1532        (encode-function (ioblock-encode-output-function ioblock))
     1533        (start-char start-char (1+ start-char)))
     1534       ((= i num-chars) (setf (ioblock-charpos ioblock) col) num-chars)
     1535    (declare (fixnum i start-char limit))
     1536    (let* ((char (schar string start-char))
     1537           (code (char-code char)))
     1538      (declare (type (mod #x110000) code))
     1539      (if (eq char #\newline)
     1540        (setq col 0)
     1541        (incf col))
     1542      (if (< code limit)
     1543        (%ioblock-write-u16-element ioblock code)
     1544        (funcall encode-function char #'%ioblock-write-u16-element ioblock)))))
     1545
     1546(declaim (inline %ioblock-write-swapped-u16-encoded-char))
     1547(defun %ioblock-write-swapped-u16-encoded-char (ioblock char)
     1548  (declare (optimize (speed 3) (safety 0)))
     1549  (if (eq char #\linefeed)
     1550    (setf (ioblock-charpos ioblock) 0)
     1551    (incf (ioblock-charpos ioblock)))
     1552  (let* ((code (char-code char)))
     1553    (declare (type (mod #x110000) code))
     1554    (if (< code (the fixnum (ioblock-literal-char-code-limit ioblock)))
     1555      (%ioblock-write-swapped-u16-element ioblock code)
     1556      (funcall (ioblock-encode-output-function ioblock)
     1557               char
     1558               #'%ioblock-write-swapped-u16-element
     1559               ioblock))))
     1560
     1561(defun %private-ioblock-write-swapped-u16-encoded-char (ioblock char)
     1562  (declare (optimize (speed 3) (safety 0)))
     1563  (check-ioblock-owner ioblock)
     1564  (%ioblock-write-swapped-u16-encoded-char ioblock char))
     1565
     1566(defun %locked-ioblock-write-swapped-u16-encoded-char (ioblock char)
     1567  (declare (optimize (speed 3) (safety 0)))
     1568  (with-ioblock-output-lock-grabbed (ioblock)
     1569    (%ioblock-write-swapped-u16-encoded-char ioblock char)))
     1570
     1571(defun %ioblock-write-swapped-u16-encoded-simple-string (ioblock string start-char num-chars)
    15161572  (declare (fixnum start-char num-chars)
    15171573           (simple-base-strng string)
     
    15311587        (incf col))
    15321588      (if (< code limit)
    1533         (%ioblock-write-u16-element ioblock code)
    1534         (funcall encode-function char #'%ioblock-write-u16-element ioblock)))))
    1535 
    1536 (declaim (inline %ioblock-write-swapped-u16-encoded-char))
    1537 (defun %ioblock-write-swapped-u16-encoded-char (ioblock char)
    1538   (declare (optimize (speed 3) (safety 0)))
    1539   (if (eq char #\linefeed)
    1540     (setf (ioblock-charpos ioblock) 0)
    1541     (incf (ioblock-charpos ioblock)))
    1542   (let* ((code (char-code char)))
    1543     (declare (type (mod #x110000) code))
    1544     (if (< code (the fixnum (ioblock-literal-char-code-limit ioblock)))
    1545       (%ioblock-write-swapped-u16-element ioblock code)
    1546       (funcall (ioblock-encode-output-function ioblock)
    1547                char
    1548                #'%ioblock-write-swapped-u16-element
    1549                ioblock))))
    1550 
    1551 (defun %private-ioblock-write-swapped-u16-encoded-char (ioblock char)
    1552   (declare (optimize (speed 3) (safety 0)))
    1553   (check-ioblock-owner ioblock)
    1554   (%ioblock-write-swapped-u16-encoded-char ioblock char))
    1555 
    1556 (defun %locked-ioblock-write-swapped-u16-encoded-char (ioblock char)
    1557   (declare (optimize (speed 3) (safety 0)))
    1558   (with-ioblock-output-lock-grabbed (ioblock)
    1559     (%ioblock-write-swapped-u16-encoded-char ioblock char)))
    1560 
    1561 
     1589        (%ioblock-write-swapped-u16-element ioblock code)
     1590        (funcall encode-function char #'%ioblock-write-swapped-u16-element ioblock)))))
    15621591
    15631592
     
    19481977                   (:private '%private-ioblock-read-u8-encoded-char)
    19491978                   (:lock '%locked-ioblock-read-u8-encoded-char)
    1950                    (t '%ioblock-read-u8-encoded-char))))))
     1979                   (t '%ioblock-read-u8-encoded-char)))
     1980                (16
     1981                 (if (character-encoding-native-endianness encoding)
     1982                   (progn
     1983                    (setf (ioblock-read-char-when-locked-function ioblock)
     1984                          '%ioblock-read-u16-encoded-char)
     1985                    (case sharing
     1986                      (:private '%private-ioblock-read-u16-encoded-char)
     1987                      (:lock '%locked-ioblock-read-u16-encoded-char)
     1988                      (t '%ioblock-read-u16-encoded-char)))
     1989                   (progn
     1990                     (setf (ioblock-read-char-when-locked-function ioblock)
     1991                           '%ioblock-read-swapped-u16-encoded-char)
     1992                    (case sharing
     1993                      (:private '%private-ioblock-read-swapped-u16-encoded-char)
     1994                      (:lock '%locked-ioblock-read-swapped-u16-encoded-char)
     1995                      (t '%ioblock-read-swapped-u16-encoded-char))))))))
    19511996      (progn
    19521997        (setf (ioblock-peek-char-function ioblock) '%ioblock-peek-char)
     
    20552100                   (:private '%private-ioblock-write-u8-encoded-char)
    20562101                   (:lock '%locked-ioblock-write-u8-encoded-char)
    2057                    (t '%ioblock-write-u8-encoded-char)))))
     2102                   (t '%ioblock-write-u8-encoded-char)))
     2103                (16
     2104                 (if (character-encoding-native-endianness encoding)
     2105                   (progn
     2106                     (setf (ioblock-write-char-when-locked-function ioblock)
     2107                           '%ioblock-write-u16-encoded-char)
     2108                     (case sharing
     2109                       (:private '%private-ioblock-write-u16-encoded-char)
     2110                       (:lock '%locked-ioblock-write-u16-encoded-char)
     2111                       (t '%ioblock-write-u16-encoded-char)))
     2112                   (progn
     2113                     (setf (ioblock-write-char-when-locked-function ioblock)
     2114                           '%ioblock-write-swapped-u16-encoded-char)
     2115                     (case sharing
     2116                       (:private '%private-ioblock-write-swapped-u16-encoded-char)
     2117                       (:lock '%locked-ioblock-write-swapped-u16-encoded-char)
     2118                       (t '%ioblock-write-swapped-u16-encoded-char)))))))
    20582119        (setf (ioblock-write-simple-string-function ioblock)
    20592120              (ecase unit-size
    2060                 (8 '%ioblock-write-u8-encoded-simple-string))))
     2121                (8 '%ioblock-write-u8-encoded-simple-string)
     2122                (16
     2123                 (if (character-encoding-native-endianness encoding)
     2124                   '%ioblock-write-u16-encoded-simple-string
     2125                   '%ioblock-write-swapped-u8-encoded-simple-string))))
     2126        (when (character-encoding-use-byte-order-mark encoding)
     2127          (setf (ioblock-pending-byte-order-mark ioblock) t)))
    20612128      (progn
    20622129        (setf (ioblock-write-simple-string-function ioblock)
     
    22612328    (when interactive
    22622329      (setf (ioblock-interactive ioblock) interactive))
    2263     (setf (stream-ioblock stream) ioblock)))
     2330    (setf (stream-ioblock stream) ioblock)
     2331    (when encoding
     2332      (setf (ioblock-native-byte-order ioblock)
     2333            (character-encoding-native-endianness encoding)))
     2334    (let* ((bom-info (and insize encoding (character-encoding-use-byte-order-mark encoding))))
     2335      (when bom-info
     2336        (ioblock-check-input-bom ioblock bom-info sharing)))
     2337    ioblock))
     2338
     2339;;; If there's a byte-order-mark (or a reversed byte-order-mark) at
     2340;;; the beginning of the input stream, deal with it.  If there's any
     2341;;; input present, make sure that we don't write a BOM on output.  If
     2342;;; this is a little-endian machine, input data was present, and there
     2343;;; was no BOM in that data, make things big-endian.  If there's a
     2344;;; leading BOM or swapped BOM, eat it (consume it so that it doesn't
     2345;;; ordinarily appear as input.)
     2346;;;
     2347(defun ioblock-check-input-bom (ioblock swapped-encoding-name sharing)
     2348  (when (%ioblock-advance ioblock nil)  ; try to read, don't block
     2349    (setf (ioblock-pending-byte-order-mark ioblock) nil)
     2350    (let* ((inbuf (ioblock-inbuf ioblock))
     2351           (buf (io-buffer-buffer inbuf))
     2352           (swapped-encoding
     2353            (and
     2354             (case (aref buf 0)
     2355               (#.byte-order-mark-char-code
     2356                (setf (io-buffer-idx inbuf) 1)
     2357                nil)
     2358               (#.swapped-byte-order-mark-char-code
     2359                (setf (io-buffer-idx inbuf) 1)
     2360                t)
     2361               (t #+little-endian-target t))
     2362             (lookup-character-encoding swapped-encoding-name))))
     2363      (when swapped-encoding
     2364        (let* ((unit-size (character-encoding-code-unit-size swapped-encoding))
     2365               (output-p (not (null (ioblock-outbuf ioblock)))))
     2366          (setf (ioblock-native-byte-order ioblock)
     2367                (character-encoding-native-endianness swapped-encoding))
     2368          (ecase unit-size
     2369            (16
     2370             (setf (ioblock-read-char-when-locked-function ioblock)
     2371                   '%ioblock-read-swapped-u16-encoded-char)
     2372             (case sharing
     2373               (:private '%private-ioblock-read-swapped-u16-encoded-char)
     2374               (:lock '%locked-ioblock-read-swapped-u16-encoded-char)
     2375               (t '%ioblock-read-swapped-u16-encoded-char))))
     2376          (when output-p
     2377            (ecase unit-size
     2378              (16
     2379              (setf (ioblock-write-char-when-locked-function ioblock)
     2380                    '%ioblock-write-swapped-u16-encoded-char)
     2381              (case sharing
     2382                (:private '%private-ioblock-write-swapped-u16-encoded-char)
     2383                (:lock '%locked-ioblock-write-swapped-u16-encoded-char)
     2384                (t '%ioblock-write-swapped-u16-encoded-char))
     2385              (setf (ioblock-write-simple-string-function ioblock)
     2386                    '%ioblock-write-swapped-u8-encoded-simple-string)))))))))
     2387
     2388
    22642389
    22652390;;; We can't define a MAKE-INSTANCE method on STRUCTURE-CLASS subclasses
     
    41064231            (%incf-ptr buf written)))))))
    41074232
    4108 (defmethod stream-read-line ((s buffered-stream-mixin))
     4233(defmethod stream-read-line ((s buffered-input-stream-mixin))
    41094234   (with-stream-ioblock-input (ioblock s :speedy t)
    41104235     (funcall (ioblock-read-line-function ioblock) ioblock)))
     
    41974322                                               (t :create)))
    41984323                      (external-format :default)
    4199                       (class 'fundamental-file-stream)
     4324                      (class 'file-stream)
    42004325                      (elements-per-buffer *elements-per-buffer*)
    42014326                      (sharing :private)
Note: See TracChangeset for help on using the changeset viewer.