Changeset 5264
- Timestamp:
- Sep 26, 2006, 7:47:42 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/level-1/l1-streams.lisp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/level-1/l1-streams.lisp
r5258 r5264 380 380 (write-byte-when-locked-function 'ioblock-no-binary-output) 381 381 (peek-char-function 'ioblock-no-char-input) 382 ( reserved1 nil)382 (native-byte-order t) 383 383 (reserved2 nil) 384 384 (reserved3 nil) … … 768 768 (prog1 ch 769 769 (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)))))) 782 782 783 783 (defun %private-ioblock-tyi (ioblock) … … 1491 1491 (defun %ioblock-write-u16-encoded-char (ioblock char) 1492 1492 (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)) 1493 1499 (if (eq char #\linefeed) 1494 1500 (setf (ioblock-charpos ioblock) 0) … … 1513 1519 (%ioblock-write-u16-encoded-char ioblock char))) 1514 1520 1521 1515 1522 (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) 1516 1572 (declare (fixnum start-char num-chars) 1517 1573 (simple-base-strng string) … … 1531 1587 (incf col)) 1532 1588 (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))))) 1562 1591 1563 1592 … … 1948 1977 (:private '%private-ioblock-read-u8-encoded-char) 1949 1978 (: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)))))))) 1951 1996 (progn 1952 1997 (setf (ioblock-peek-char-function ioblock) '%ioblock-peek-char) … … 2055 2100 (:private '%private-ioblock-write-u8-encoded-char) 2056 2101 (: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))))))) 2058 2119 (setf (ioblock-write-simple-string-function ioblock) 2059 2120 (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))) 2061 2128 (progn 2062 2129 (setf (ioblock-write-simple-string-function ioblock) … … 2261 2328 (when interactive 2262 2329 (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 2264 2389 2265 2390 ;;; We can't define a MAKE-INSTANCE method on STRUCTURE-CLASS subclasses … … 4106 4231 (%incf-ptr buf written))))))) 4107 4232 4108 (defmethod stream-read-line ((s buffered- stream-mixin))4233 (defmethod stream-read-line ((s buffered-input-stream-mixin)) 4109 4234 (with-stream-ioblock-input (ioblock s :speedy t) 4110 4235 (funcall (ioblock-read-line-function ioblock) ioblock))) … … 4197 4322 (t :create))) 4198 4323 (external-format :default) 4199 (class 'f undamental-file-stream)4324 (class 'file-stream) 4200 4325 (elements-per-buffer *elements-per-buffer*) 4201 4326 (sharing :private)
Note:
See TracChangeset
for help on using the changeset viewer.
