3 ;; copyright (C) 2012, 2013 David Vazquez
4 ;; Copyright (C) 2012 Raimon Grau
6 ;; JSCL is free software: you can redistribute it and/or
7 ;; modify it under the terms of the GNU General Public License as
8 ;; published by the Free Software Foundation, either version 3 of the
9 ;; License, or (at your option) any later version.
11 ;; JSCL is distributed in the hope that it will be useful, but
12 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ;; General Public License for more details.
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with JSCL. If not, see <http://www.gnu.org/licenses/>.
19 ;;; TODO: Use structures to represent streams, but we would need
22 (defvar *standard-output*)
25 (and (vectorp x) (eq (aref x 0) 'stream)))
27 (defun make-string-output-stream ()
28 (let ((buffer (make-string 0)))
32 (vector-push-extend ch buffer))
36 (defun get-output-stream-string (stream)
37 (eq (aref stream 2) 'string-stream)
38 (prog1 (aref stream 3)
39 (aset stream 3 (make-string 0))))
41 (defun write-char (char &optional (stream *standard-output*))
42 (funcall (aref stream 1) char))
44 (defmacro with-output-to-string ((var) &body body)
45 `(let ((,var (make-string-output-stream)))
47 (get-output-stream-string ,var)))