Changeset 5192


Ignore:
Timestamp:
Sep 11, 2006, 7:09:36 PM (18 years ago)
Author:
Gary Byers
Message:

extend IOBLOCK a bit. Start to provide functionality for encoded streams.

File:
1 edited

Legend:

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

    r5152 r5192  
    368368  (write-char-function 'ioblock-no-char-output)
    369369  (encoding nil)
    370   (alternate-line-termination nil))
     370  (alternate-line-termination nil)
     371  (literal-char-code-limit 256)
     372  (encode-output-function nil)
     373  (decode-input-function nil)
     374  (read-char-no-hang-function nil)
     375  (write-simple-string-function nil)
     376  (reserved0 nil)
     377  (reserved1 nil)
     378  (reserved2 nil)
     379  (reserved3 nil))
    371380
    372381
     
    418427
    419428
    420 
     429(declaim (inline %ioblock-advance))
    421430(defun %ioblock-advance (ioblock read-p)
    422431  (funcall (ioblock-advance-function ioblock)
     
    448457      (uvref (io-buffer-buffer buf) idx))))
    449458
     459
     460
    450461(defun %bivalent-ioblock-read-u8-byte (ioblock)
    451462  (declare (optimize (speed 3) (safety 0)))
     
    465476      (aref (the (simple-array (unsigned-byte 8) (*))
    466477              (io-buffer-buffer buf)) idx))))
     478
     479
     480(declaim (inline %ioblock-read-u8-byte))
    467481
    468482(defun %ioblock-read-u8-byte (ioblock)
     
    570584
    571585
    572 
     586(declaim (inline %ioblock-tyi))
    573587(defun %ioblock-tyi (ioblock)
    574588  (declare (optimize (speed 3) (safety 0)))
     
    577591      (prog1 ch
    578592        (setf (ioblock-untyi-char ioblock) nil))
    579       (let* ((buf (ioblock-inbuf ioblock))
    580              (idx (io-buffer-idx buf))
    581              (limit (io-buffer-count buf)))
    582         (declare (fixnum idx limit))
    583         (when (= idx limit)
    584           (unless (%ioblock-advance ioblock t)
    585             (return-from %ioblock-tyi (if (ioblock-eof ioblock) :eof)))
    586           (setq idx (io-buffer-idx buf)
    587                 limit (io-buffer-count buf)))
    588         (setf (io-buffer-idx buf) (the fixnum (1+ idx)))
    589         (%code-char (aref (the (simple-array (unsigned-byte 8) (*)) (io-buffer-buffer buf)) idx))))))
     593        (let* ((buf (ioblock-inbuf ioblock))
     594         (idx (io-buffer-idx buf))
     595         (limit (io-buffer-count buf)))
     596    (declare (fixnum idx limit))
     597    (when (= idx limit)
     598      (unless (%ioblock-advance ioblock t)
     599        (return-from %ioblock-tyi :eof))
     600      (setq idx (io-buffer-idx buf)
     601            limit (io-buffer-count buf)))
     602    (setf (io-buffer-idx buf) (the fixnum (1+ idx)))
     603    (%code-char (aref (the (simple-array (unsigned-byte 8) (*))
     604                        (io-buffer-buffer buf)) idx))))))
    590605
    591606(defun %private-ioblock-tyi (ioblock)
    592607  (declare (optimize (speed 3) (safety 0)))
    593608  (check-ioblock-owner ioblock)
    594   (if (ioblock-untyi-char ioblock)
    595     (prog1 (ioblock-untyi-char ioblock)
    596       (setf (ioblock-untyi-char ioblock) nil))
    597     (let* ((buf (ioblock-inbuf ioblock))
    598            (idx (io-buffer-idx buf))
    599            (limit (io-buffer-count buf)))
    600       (declare (fixnum idx limit))
    601       (when (= idx limit)
    602         (unless (%ioblock-advance ioblock t)
    603           (return-from %private-ioblock-tyi (if (ioblock-eof ioblock) :eof)))
    604         (setq idx (io-buffer-idx buf)
    605               limit (io-buffer-count buf)))
    606       (setf (io-buffer-idx buf) (the fixnum (1+ idx)))
    607       (%code-char (aref (the (simple-array (unsigned-byte 8) (*)) (io-buffer-buffer buf)) idx)))))
     609  (%ioblock-tyi ioblock))
    608610
    609611(defun %locked-ioblock-tyi (ioblock)
     
    611613  (with-ioblock-lock-grabbed ((locally (declare (optimize (speed 3) (safety 0)))
    612614                                (ioblock-inbuf-lock ioblock)))
    613     (if (ioblock-untyi-char ioblock)
    614       (prog1 (ioblock-untyi-char ioblock)
     615    (%ioblock-tyi ioblock)))
     616
     617;;; Read a character composed of one or more 8-bit code-units.
     618(declaim (inline %ioblock-read-u8-encoded-char))
     619(defun %ioblock-read-u8-encoded-char (ioblock)
     620  (declare (optimize (speed 3) (safety 0)))
     621  (let* ((ch (ioblock-untyi-char ioblock)))
     622    (if ch
     623      (prog1 ch
    615624        (setf (ioblock-untyi-char ioblock) nil))
    616       (let* ((buf (ioblock-inbuf ioblock))
    617              (idx (io-buffer-idx buf))
    618              (limit (io-buffer-count buf)))
    619         (declare (fixnum idx limit))
    620         (when (= idx limit)
    621           (unless (%ioblock-advance ioblock t)
    622             (return-from %locked-ioblock-tyi (if (ioblock-eof ioblock) :eof)))
    623           (setq idx (io-buffer-idx buf)
    624                 limit (io-buffer-count buf)))
    625         (setf (io-buffer-idx buf) (the fixnum (1+ idx)))
    626         (%code-char (aref (the (simple-array (unsigned-byte 8) (*)) (io-buffer-buffer buf)) idx))))))
    627 
    628 (declaim (inline %ioblock-tyy-no-hang))
     625      (let* ((1st-unit (%ioblock-read-u8-byte ioblock)))
     626        (if (eq 1st-unit :eof)
     627          1st-unit
     628          (locally
     629              (declare (type (unsigned-byte 8) 1st-unit))
     630            (if (< 1st-unit
     631                   (the (mod #x110000) (ioblock-literal-char-code-limit ioblock)))
     632              (%code-char 1st-unit)
     633              (funcall (ioblock-decode-input-function ioblock)
     634                       1st-unit
     635                       #'%ioblock-read-u8-byte
     636                       ioblock))))))))
     637 
     638
     639(declaim (inline %ioblock-tyi-no-hang))
    629640
    630641(defun %ioblock-tyi-no-hang (ioblock)
     
    810821    element))
    811822
     823(declaim (inline %ioblock-write-u8-element))
     824(defun %ioblock-write-u8-element (ioblock element)
     825  (declare (optimize (speed 3) (safety 0)))
     826  (unless (eql element (logand #xff element))
     827    (report-bad-arg element '(unsigned-byte 8)))
     828  (let* ((buf (ioblock-outbuf ioblock))
     829         (idx (io-buffer-idx buf))
     830         (count (io-buffer-count buf))
     831         (limit (io-buffer-limit buf)))
     832    (declare (fixnum idx limit count))
     833    (when (= idx limit)
     834      (%ioblock-force-output ioblock nil)
     835      (setq idx 0 count 0))
     836    (setf (aref (the (simple-array (unsigned-byte 8) (*)) (io-buffer-buffer buf)) idx) element)
     837    (incf idx)
     838    (setf (io-buffer-idx buf) idx)
     839    (when (> idx count)
     840      (setf (io-buffer-count buf) idx))
     841    (setf (ioblock-dirty ioblock) t)
     842    element))
     843
     844
    812845(defun %ioblock-write-char (ioblock char)
    813846  (declare (optimize (speed 3) (safety 0)))
     
    815848    (setf (ioblock-charpos ioblock) 0)
    816849    (incf (ioblock-charpos ioblock)))
    817   (unless (eq (typecode (io-buffer-buffer (ioblock-outbuf ioblock)))
    818               target::subtag-simple-base-string)
    819     (setq char (char-code char)))
    820   (%ioblock-write-element ioblock char))
     850  (let* ((code (char-code char)))
     851    (declare (type (mod #x110000) code))
     852    (if (< code 256)
     853      (%ioblock-write-u8-element ioblock code)
     854      (error "Character ~s can't be encoded on ~s" char (ioblock-stream ioblock)))))
    821855
    822856(defun %ioblock-write-byte (ioblock byte)
    823857  (declare (optimize (speed 3) (safety 0)))
    824   (when (eq (typecode (io-buffer-buffer (ioblock-outbuf ioblock)))
    825             target::subtag-simple-base-string)
    826     (setq byte (code-char byte)))
    827858  (%ioblock-write-element ioblock byte))
    828859
     
    14731504  (print-unreadable-object (s out :type t :identity t)
    14741505    (let* ((ioblock (basic-stream.state s))
    1475            (fd (and ioblock (ioblock-device ioblock))))
     1506           (fd (and ioblock (ioblock-device ioblock)))
     1507           (encoding (and ioblock (encoding-name (ioblock-encoding ioblock)))))
    14761508      (if fd
    1477         (format out "(~a/~d)" (%unix-fd-kind fd) fd)
     1509        (format out "~a (~a/~d)" encoding (%unix-fd-kind fd) fd)
    14781510        (format out "~s" :closed)))))
    14791511
     
    28482880  (print-unreadable-object (s out :type t :identity t)
    28492881    (let* ((ioblock (stream-ioblock s nil))
    2850            (fd (and ioblock (ioblock-device ioblock))))
     2882           (fd (and ioblock (ioblock-device ioblock)))
     2883           (encoding (and ioblock (encoding-name (ioblock-encoding ioblock)))))
    28512884      (if fd
    2852         (format out "(~a/~d)" (%unix-fd-kind fd) fd)
     2885        (format out "~s (~a/~d)" encoding (%unix-fd-kind fd) fd)
    28532886        (format out "~s" :closed)))))
    28542887
Note: See TracChangeset for help on using the changeset viewer.