/[cmucl]/src/code/fd-stream.lisp
ViewVC logotype

Diff of /src/code/fd-stream.lisp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.97 by rtoy, Mon Jan 25 13:58:01 2010 UTC revision 1.97.2.3 by rtoy, Sun Feb 14 03:06:41 2010 UTC
# Line 19  Line 19 
19    
20  (in-package "SYSTEM")  (in-package "SYSTEM")
21    
22    (intl:textdomain "cmucl")
23    
24  (export '(fd-stream fd-stream-p fd-stream-fd make-fd-stream  (export '(fd-stream fd-stream-p fd-stream-fd make-fd-stream
25            io-timeout beep *beep-function* output-raw-bytes            io-timeout beep *beep-function* output-raw-bytes
26            *tty* *stdin* *stdout* *stderr*            *tty* *stdin* *stdout* *stderr*
# Line 38  Line 40 
40  ;;;; Buffer manipulation routines.  ;;;; Buffer manipulation routines.
41    
42  (defvar *available-buffers* ()  (defvar *available-buffers* ()
43    "List of available buffers.  Each buffer is an sap pointing to    _N"List of available buffers.  Each buffer is an sap pointing to
44    bytes-per-buffer of memory.")    bytes-per-buffer of memory.")
45    
46  (defvar lisp::*enable-stream-buffer-p* nil)  (defvar lisp::*enable-stream-buffer-p* nil)
47    
48  (defconstant bytes-per-buffer (* 4 1024)  (defconstant bytes-per-buffer (* 4 1024)
49    "Number of bytes per buffer.")    _N"Number of bytes per buffer.")
50    
51  ;; This limit is rather arbitrary  ;; This limit is rather arbitrary
52  (defconstant max-stream-element-size 1024  (defconstant max-stream-element-size 1024
53    "The maximum supported byte size for a stream element-type.")    _N"The maximum supported byte size for a stream element-type.")
54    
55  ;;; NEXT-AVAILABLE-BUFFER -- Internal.  ;;; NEXT-AVAILABLE-BUFFER -- Internal.
56  ;;;  ;;;
# Line 286  Line 288 
288    (:report    (:report
289     (lambda (condition stream)     (lambda (condition stream)
290       (declare (stream stream))       (declare (stream stream))
291       (format stream "Timeout ~(~A~)ing ~S."       (format stream _"Timeout ~(~A~)ing ~S."
292               (io-timeout-direction condition)               (io-timeout-direction condition)
293               (stream-error-stream condition)))))               (stream-error-stream condition)))))
294    
# Line 294  Line 296 
296  ;;;; Output routines and related noise.  ;;;; Output routines and related noise.
297    
298  (defvar *output-routines* ()  (defvar *output-routines* ()
299    "List of all available output routines. Each element is a list of the    _N"List of all available output routines. Each element is a list of the
300    element-type output, the kind of buffering, the function name, and the number    element-type output, the kind of buffering, the function name, and the number
301    of bytes per element.")    of bytes per element.")
302    
# Line 320  Line 322 
322                           length)                           length)
323        (cond ((not count)        (cond ((not count)
324               (if (= errno unix:ewouldblock)               (if (= errno unix:ewouldblock)
325                   (error "Write would have blocked, but SERVER told us to go.")                   (error _"Write would have blocked, but SERVER told us to go.")
326                   (error "While writing ~S: ~A"                   (error _"While writing ~S: ~A"
327                          stream (unix:get-unix-error-msg errno))))                          stream (unix:get-unix-error-msg errno))))
328              ((eql count length) ; Hot damn, it worked.              ((eql count length) ; Hot damn, it worked.
329               (when reuse-sap               (when reuse-sap
# Line 591  Line 593 
593  ;;; send it directly (after flushing the buffer, of course).  ;;; send it directly (after flushing the buffer, of course).
594  ;;;  ;;;
595  (defun output-raw-bytes (stream thing &optional start end)  (defun output-raw-bytes (stream thing &optional start end)
596    "Output THING to stream.  THING can be any kind of vector or a sap.  If THING    _N"Output THING to stream.  THING can be any kind of vector or a sap.  If THING
597    is a SAP, END must be supplied (as length won't work)."    is a SAP, END must be supplied (as length won't work)."
598    (let ((start (or start 0))    (let ((start (or start 0))
599          (end (or end (length (the (simple-array * (*)) thing)))))          (end (or end (length (the (simple-array * (*)) thing)))))
# Line 609  Line 611 
611             (bytes (- end start))             (bytes (- end start))
612             (newtail (+ tail bytes)))             (newtail (+ tail bytes)))
613        (cond ((minusp bytes) ; Error case        (cond ((minusp bytes) ; Error case
614               (cerror "Just go on as if nothing happened..."               (cerror _"Just go on as if nothing happened..."
615                       "~S called with :END before :START!"                       _"~S called with :END before :START!"
616                       'output-raw-bytes))                       'output-raw-bytes))
617              ((zerop bytes)) ; Easy case              ((zerop bytes)) ; Easy case
618              ((<= bytes space)              ((<= bytes space)
# Line 823  Line 825 
825  ;;;; Input routines and related noise.  ;;;; Input routines and related noise.
826    
827  (defvar *input-routines* ()  (defvar *input-routines* ()
828    "List of all available input routines. Each element is a list of the    _N"List of all available input routines. Each element is a list of the
829    element-type input, the function name, and the number of bytes per element.")    element-type input, the function name, and the number of bytes per element.")
830    
831  ;;; DO-INPUT -- internal  ;;; DO-INPUT -- internal
# Line 890  Line 892 
892                             :format-arguments (list (unix:get-unix-error-msg errno))                             :format-arguments (list (unix:get-unix-error-msg errno))
893                             :errno errno))                             :errno errno))
894                     (t                     (t
895                      (error "Error reading ~S: ~A"                      (error _"Error reading ~S: ~A"
896                             stream                             stream
897                             (unix:get-unix-error-msg errno)))))                             (unix:get-unix-error-msg errno)))))
898              ((zerop count)              ((zerop count)
# Line 1280  Line 1282 
1282                                    now-needed)                                    now-needed)
1283                  (declare (type (or index null) count))                  (declare (type (or index null) count))
1284                  (unless count                  (unless count
1285                    (error "Error reading ~S: ~A" stream                    (error _"Error reading ~S: ~A" stream
1286                           (unix:get-unix-error-msg err)))                           (unix:get-unix-error-msg err)))
1287                  (decf now-needed count)                  (decf now-needed count)
1288                  (if eof-error-p                  (if eof-error-p
# Line 1300  Line 1302 
1302                  (unix:unix-read (fd-stream-fd stream) sap len)                  (unix:unix-read (fd-stream-fd stream) sap len)
1303                (declare (type (or index null) count))                (declare (type (or index null) count))
1304                (unless count                (unless count
1305                  (error "Error reading ~S: ~A" stream                  (error _"Error reading ~S: ~A" stream
1306                         (unix:get-unix-error-msg err)))                         (unix:get-unix-error-msg err)))
1307                (when (and eof-error-p (zerop count))                (when (and eof-error-p (zerop count))
1308                  (error 'end-of-file :stream stream))                  (error 'end-of-file :stream stream))
# Line 1366  Line 1368 
1368            (routine type size)            (routine type size)
1369            (pick-input-routine target-type)            (pick-input-routine target-type)
1370          (unless routine          (unless routine
1371            (error "Could not find any input routine for ~S" target-type))            (error _"Could not find any input routine for ~S" target-type))
1372          (setf (fd-stream-ibuf-sap stream) (next-available-buffer))          (setf (fd-stream-ibuf-sap stream) (next-available-buffer))
1373          (setf (fd-stream-ibuf-length stream) bytes-per-buffer)          (setf (fd-stream-ibuf-length stream) bytes-per-buffer)
1374          (setf (fd-stream-ibuf-tail stream) 0)          (setf (fd-stream-ibuf-tail stream) 0)
# Line 1424  Line 1426 
1426            (routine type size)            (routine type size)
1427            (pick-output-routine target-type (fd-stream-buffering stream))            (pick-output-routine target-type (fd-stream-buffering stream))
1428          (unless routine          (unless routine
1429            (error "Could not find any output routine for ~S buffered ~S."            (error _"Could not find any output routine for ~S buffered ~S."
1430                   (fd-stream-buffering stream)                   (fd-stream-buffering stream)
1431                   target-type))                   target-type))
1432          (setf (fd-stream-obuf-sap stream) (next-available-buffer))          (setf (fd-stream-obuf-sap stream) (next-available-buffer))
# Line 1447  Line 1449 
1449    
1450      (when (and input-size output-size      (when (and input-size output-size
1451                 (not (eql input-size output-size)))                 (not (eql input-size output-size)))
1452        (error "Element sizes for input (~S:~S) and output (~S:~S) differ?"        (error _"Element sizes for input (~S:~S) and output (~S:~S) differ?"
1453               input-type input-size               input-type input-size
1454               output-type output-size))               output-type output-size))
1455      (setf (fd-stream-element-size stream)      (setf (fd-stream-element-size stream)
# Line 1465  Line 1467 
1467                  ((subtypep output-type input-type)                  ((subtypep output-type input-type)
1468                   output-type)                   output-type)
1469                  (t                  (t
1470                   (error "Input type (~S) and output type (~S) are unrelated?"                   (error _"Input type (~S) and output type (~S) are unrelated?"
1471                          input-type                          input-type
1472                          output-type))))))                          output-type))))))
1473    
# Line 1481  Line 1483 
1483      (multiple-value-bind (okay err)      (multiple-value-bind (okay err)
1484          (unix:unix-rename original filename)          (unix:unix-rename original filename)
1485        (unless okay        (unless okay
1486            (cerror "Go on as if nothing bad happened."            (cerror _"Go on as if nothing bad happened."
1487                    "Could not restore ~S to its original contents: ~A"                    _"Could not restore ~S to its original contents: ~A"
1488                    filename (unix:get-unix-error-msg err))))))                    filename (unix:get-unix-error-msg err))))))
1489    
1490  ;;; DELETE-ORIGINAL -- internal  ;;; DELETE-ORIGINAL -- internal
# Line 1616  Line 1618 
1618         (error 'simple-type-error         (error 'simple-type-error
1619                :datum stream                :datum stream
1620                :expected-type 'file-stream                :expected-type 'file-stream
1621                :format-control "~s is not a stream associated with a file."                :format-control _"~s is not a stream associated with a file."
1622                :format-arguments (list stream)))                :format-arguments (list stream)))
1623       (multiple-value-bind       (multiple-value-bind
1624           (okay dev ino mode nlink uid gid rdev size           (okay dev ino mode nlink uid gid rdev size
# Line 1626  Line 1628 
1628                          atime mtime ctime blksize blocks))                          atime mtime ctime blksize blocks))
1629         (unless okay         (unless okay
1630           (error 'simple-file-error           (error 'simple-file-error
1631                  :format-control "Error fstating ~S: ~A"                  :format-control _"Error fstating ~S: ~A"
1632                  :format-arguments (list stream (unix:get-unix-error-msg dev))))                  :format-arguments (list stream (unix:get-unix-error-msg dev))))
1633         (if (zerop mode)         (if (zerop mode)
1634             nil             nil
# Line 1687  Line 1689 
1689                   nil)                   nil)
1690                  (t                  (t
1691                   (system:with-interrupts                   (system:with-interrupts
1692                     (error "Error lseek'ing ~S: ~A"                     (error _"Error lseek'ing ~S: ~A"
1693                            stream                            stream
1694                            (unix:get-unix-error-msg errno)))))))                            (unix:get-unix-error-msg errno)))))))
1695        (let ((offset 0)        (let ((offset 0)
# Line 1723  Line 1725 
1725                 (setf offset (* newpos (fd-stream-element-size stream))                 (setf offset (* newpos (fd-stream-element-size stream))
1726                       origin unix:l_set))                       origin unix:l_set))
1727                (t                (t
1728                 (error "Invalid position given to file-position: ~S" newpos)))                 (error _"Invalid position given to file-position: ~S" newpos)))
1729          (multiple-value-bind          (multiple-value-bind
1730              (posn errno)              (posn errno)
1731              (unix:unix-lseek (fd-stream-fd stream) offset origin)              (unix:unix-lseek (fd-stream-fd stream) offset origin)
# Line 1732  Line 1734 
1734                  ((eq errno unix:espipe)                  ((eq errno unix:espipe)
1735                   nil)                   nil)
1736                  (t                  (t
1737                   (error "Error lseek'ing ~S: ~A"                   (error _"Error lseek'ing ~S: ~A"
1738                          stream                          stream
1739                          (unix:get-unix-error-msg errno))))))))                          (unix:get-unix-error-msg errno))))))))
1740    
# Line 1757  Line 1759 
1759                         pathname                         pathname
1760                         input-buffer-p                         input-buffer-p
1761                         (name (if file                         (name (if file
1762                                   (format nil "file ~S" file)                                   (format nil _"file ~S" file)
1763                                   (format nil "descriptor ~D" fd)))                                   (format nil _"descriptor ~D" fd)))
1764                         auto-close                         auto-close
1765                         (external-format :default)                         (external-format :default)
1766                         binary-stream-p)                         binary-stream-p)
1767    (declare (type index fd) (type (or index null) timeout)    (declare (type index fd) (type (or index null) timeout)
1768             (type (member :none :line :full) buffering))             (type (member :none :line :full) buffering))
1769    "Create a stream for the given unix file descriptor.    _N"Create a stream for the given unix file descriptor.
1770    If input is non-nil, allow input operations.    If input is non-nil, allow input operations.
1771    If output is non-nil, allow output operations.    If output is non-nil, allow output operations.
1772    If neither input nor output are specified, default to allowing input.    If neither input nor output are specified, default to allowing input.
# Line 1777  Line 1779 
1779    (cond ((not (or input-p output-p))    (cond ((not (or input-p output-p))
1780           (setf input t))           (setf input t))
1781          ((not (or input output))          ((not (or input output))
1782           (error "File descriptor must be opened either for input or output.")))           (error _"File descriptor must be opened either for input or output.")))
1783    (let ((stream (if binary-stream-p    (let ((stream (if binary-stream-p
1784                      (%make-binary-text-stream :fd fd                      (%make-binary-text-stream :fd fd
1785                                                :name name                                                :name name
# Line 1812  Line 1814 
1814        (finalize stream        (finalize stream
1815                  #'(lambda ()                  #'(lambda ()
1816                      (unix:unix-close fd)                      (unix:unix-close fd)
1817                      (format *terminal-io* "** Closed ~A~%" name)                      (format *terminal-io* _"** Closed ~A~%" name)
1818                      (when original                      (when original
1819                        (revert-file file original)))))                        (revert-file file original)))))
1820      stream))      stream))
# Line 1823  Line 1825 
1825  ;;; Pick a name to use for the backup file.  ;;; Pick a name to use for the backup file.
1826  ;;;  ;;;
1827  (defvar *backup-extension* ".BAK"  (defvar *backup-extension* ".BAK"
1828    "This is a string that OPEN tacks on the end of a file namestring to produce    _N"This is a string that OPEN tacks on the end of a file namestring to produce
1829     a name for the :if-exists :rename-and-delete and :rename options.  Also,     a name for the :if-exists :rename-and-delete and :rename options.  Also,
1830     this can be a function that takes a namestring and returns a complete     this can be a function that takes a namestring and returns a complete
1831     namestring.")     namestring.")
# Line 1876  Line 1878 
1878  (defun assure-one-of (item list what)  (defun assure-one-of (item list what)
1879    (unless (member item list)    (unless (member item list)
1880      (loop      (loop
1881        (cerror "Enter new value for ~*~S"        (cerror _"Enter new value for ~*~S"
1882                "~S is invalid for ~S. Must be one of~{ ~S~}"                _"~S is invalid for ~S. Must be one of~{ ~S~}"
1883                item                item
1884                what                what
1885                list)                list)
1886        (format (the stream *query-io*) "Enter new value for ~S: " what)        (format (the stream *query-io*) _"Enter new value for ~S: " what)
1887        (force-output *query-io*)        (force-output *query-io*)
1888        (setf item (read *query-io*))        (setf item (read *query-io*))
1889        (when (member item list)        (when (member item list)
# Line 1896  Line 1898 
1898  ;;;  ;;;
1899  (defun do-old-rename (namestring original)  (defun do-old-rename (namestring original)
1900    (unless (unix:unix-access namestring unix:w_ok)    (unless (unix:unix-access namestring unix:w_ok)
1901      (cerror "Try to rename it anyway." "File ~S is not writable." namestring))      (cerror _"Try to rename it anyway." _"File ~S is not writable." namestring))
1902    (multiple-value-bind    (multiple-value-bind
1903        (okay err)        (okay err)
1904        (unix:unix-rename namestring original)        (unix:unix-rename namestring original)
1905      (cond (okay t)      (cond (okay t)
1906            (t            (t
1907             (cerror "Use :SUPERSEDE instead."             (cerror _"Use :SUPERSEDE instead."
1908                     "Could not rename ~S to ~S: ~A."                     _"Could not rename ~S to ~S: ~A."
1909                     namestring                     namestring
1910                     original                     original
1911                     (unix:get-unix-error-msg err))                     (unix:get-unix-error-msg err))
# Line 1984  Line 1986 
1986                               (error 'simple-file-error                               (error 'simple-file-error
1987                                   :pathname pathname                                   :pathname pathname
1988                                   :format-control                                   :format-control
1989                                   "Cannot open ~S for output: Is a directory."                                   _"Cannot open ~S for output: Is a directory."
1990                                   :format-arguments (list name)))                                   :format-arguments (list name)))
1991                             (setf mode (logand orig-mode #o777))                             (setf mode (logand orig-mode #o777))
1992                             t)                             t)
# Line 1993  Line 1995 
1995                            (t                            (t
1996                             (error 'simple-file-error                             (error 'simple-file-error
1997                                    :pathname pathname                                    :pathname pathname
1998                                    :format-control "Cannot find ~S: ~A"                                    :format-control _"Cannot find ~S: ~A"
1999                                    :format-arguments                                    :format-arguments
2000                                      (list name                                      (list name
2001                                        (unix:get-unix-error-msg err/dev)))))))))                                        (unix:get-unix-error-msg err/dev)))))))))
# Line 2023  Line 2025 
2025                    ((eql errno unix:enoent)                    ((eql errno unix:enoent)
2026                     (case if-does-not-exist                     (case if-does-not-exist
2027                       (:error                       (:error
2028                         (cerror "Return NIL."                         (cerror _"Return NIL."
2029                                 'simple-file-error                                 'simple-file-error
2030                                 :pathname pathname                                 :pathname pathname
2031                                 :format-control "Error opening ~S, ~A."                                 :format-control _"Error opening ~S, ~A."
2032                                 :format-arguments                                 :format-arguments
2033                                     (list pathname                                     (list pathname
2034                                           (unix:get-unix-error-msg errno))))                                           (unix:get-unix-error-msg errno))))
2035                       (:create                       (:create
2036                         (cerror "Return NIL."                         (cerror _"Return NIL."
2037                                 'simple-file-error                                 'simple-file-error
2038                                 :pathname pathname                                 :pathname pathname
2039                                 :format-control                                 :format-control
2040                                     "Error creating ~S, path does not exist."                                     _"Error creating ~S, path does not exist."
2041                                 :format-arguments (list pathname))))                                 :format-arguments (list pathname))))
2042                     (return nil))                     (return nil))
2043                    ((eql errno unix:eexist)                    ((eql errno unix:eexist)
2044                     (unless (eq nil if-exists)                     (unless (eq nil if-exists)
2045                       (cerror "Return NIL."                       (cerror _"Return NIL."
2046                               'simple-file-error                               'simple-file-error
2047                               :pathname pathname                               :pathname pathname
2048                               :format-control "Error opening ~S, ~A."                               :format-control _"Error opening ~S, ~A."
2049                               :format-arguments                               :format-arguments
2050                                   (list pathname                                   (list pathname
2051                                         (unix:get-unix-error-msg errno))))                                         (unix:get-unix-error-msg errno))))
2052                     (return nil))                     (return nil))
2053                    ((eql errno unix:eacces)                    ((eql errno unix:eacces)
2054                     (cerror "Try again."                     (cerror _"Try again."
2055                             'simple-file-error                             'simple-file-error
2056                             :pathname pathname                             :pathname pathname
2057                             :format-control "Error opening ~S, ~A."                             :format-control _"Error opening ~S, ~A."
2058                             :format-arguments                             :format-arguments
2059                                 (list pathname                                 (list pathname
2060                                       (unix:get-unix-error-msg errno))))                                       (unix:get-unix-error-msg errno))))
2061                    (t                    (t
2062                     (cerror "Return NIL."                     (cerror _"Return NIL."
2063                             'simple-file-error                             'simple-file-error
2064                             :pathname pathname                             :pathname pathname
2065                             :format-control "Error opening ~S, ~A."                             :format-control _"Error opening ~S, ~A."
2066                             :format-arguments                             :format-arguments
2067                                 (list pathname                                 (list pathname
2068                                       (unix:get-unix-error-msg errno)))                                       (unix:get-unix-error-msg errno)))
# Line 2125  Line 2127 
2127                        (direction direction)                        (direction direction)
2128                        (if-does-not-exist if-does-not-exist)                        (if-does-not-exist if-does-not-exist)
2129                        (if-exists if-exists))                        (if-exists if-exists))
2130    "Return a stream which reads from or writes to Filename.    _N"Return a stream which reads from or writes to Filename.
2131    Defined keywords:    Defined keywords:
2132     :direction - one of :input, :output, :io, or :probe     :direction - one of :input, :output, :io, or :probe
2133     :element-type - Type of object to read or write, default BASE-CHAR     :element-type - Type of object to read or write, default BASE-CHAR
# Line 2182  Line 2184 
2184             (apply #'open-fd-stream filespec options))             (apply #'open-fd-stream filespec options))
2185            ((subtypep class 'stream:simple-stream)            ((subtypep class 'stream:simple-stream)
2186             (when element-type-given             (when element-type-given
2187               (cerror "Do it anyway."               (cerror _"Do it anyway."
2188                       "Can't create simple-streams with an element-type."))                       _"Can't create simple-streams with an element-type."))
2189             (when (and (eq class 'stream:file-simple-stream) mapped)             (when (and (eq class 'stream:file-simple-stream) mapped)
2190               (setq class 'stream:mapped-file-simple-stream)               (setq class 'stream:mapped-file-simple-stream)
2191               (setf (getf options :class) 'stream:mapped-file-simple-stream))               (setf (getf options :class) 'stream:mapped-file-simple-stream))
# Line 2200  Line 2202 
2202               (when stream               (when stream
2203                 (make-instance class :lisp-stream stream))))                 (make-instance class :lisp-stream stream))))
2204            (t            (t
2205             (error "Unable to open streams of class ~S." class)))))             (error _"Unable to open streams of class ~S." class)))))
2206    
2207  ;;;; Initialization.  ;;;; Initialization.
2208    
2209  (defvar *tty* nil  (defvar *tty* nil
2210    "The stream connected to the controlling terminal or NIL if there is none.")    _N"The stream connected to the controlling terminal or NIL if there is none.")
2211  (defvar *stdin* nil  (defvar *stdin* nil
2212    "The stream connected to the standard input (file descriptor 0).")    _N"The stream connected to the standard input (file descriptor 0).")
2213  (defvar *stdout* nil  (defvar *stdout* nil
2214    "The stream connected to the standard output (file descriptor 1).")    _N"The stream connected to the standard output (file descriptor 1).")
2215  (defvar *stderr* nil  (defvar *stderr* nil
2216    "The stream connected to the standard error output (file descriptor 2).")    _N"The stream connected to the standard error output (file descriptor 2).")
2217    
2218  ;;; STREAM-INIT -- internal interface  ;;; STREAM-INIT -- internal interface
2219  ;;;  ;;;
# Line 2263  Line 2265 
2265    (finish-output stream))    (finish-output stream))
2266    
2267  (defvar *beep-function* #'default-beep-function  (defvar *beep-function* #'default-beep-function
2268    "This is called in BEEP to feep the user.  It takes a stream.")    _N"This is called in BEEP to feep the user.  It takes a stream.")
2269    
2270  (defun beep (&optional (stream *terminal-io*))  (defun beep (&optional (stream *terminal-io*))
2271    (funcall *beep-function* stream))    (funcall *beep-function* stream))
# Line 2325  Line 2327 
2327  (defun file-string-length (stream object)  (defun file-string-length (stream object)
2328    (declare (type (or string character) object)    (declare (type (or string character) object)
2329             (type (or file-stream broadcast-stream stream:simple-stream) stream))             (type (or file-stream broadcast-stream stream:simple-stream) stream))
2330    "Return the delta in Stream's FILE-POSITION that would be caused by writing    _N"Return the delta in Stream's FILE-POSITION that would be caused by writing
2331     Object to Stream.  Non-trivial only in implementations that support     Object to Stream.  Non-trivial only in implementations that support
2332     international character sets."     international character sets."
2333    (typecase stream    (typecase stream

Legend:
Removed from v.1.97  
changed lines
  Added in v.1.97.2.3

  ViewVC Help
Powered by ViewVC 1.1.5