Edit

cffi-posix/fd-flexi/fd-flexi.lisp

Branch :

  • fd-flexi.lisp
  • ;;
    ;;  fd-flexi  -  Unix file descriptor flexi streams for Common Lisp
    ;;
    ;;  Copyright 2017 Thomas de Grivel <thoxdg@gmail.com>
    ;;
    ;;  Permission to use, copy, modify, and distribute this software for any
    ;;  purpose with or without fee is hereby granted, provided that the above
    ;;  copyright notice and this permission notice appear in all copies.
    ;;
    ;;  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    ;;  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    ;;  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    ;;  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    ;;  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    ;;  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    ;;  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    ;;
    
    (in-package :fd-flexi)
    
    (defun input-stream (fd &optional (external-format :utf-8))
      (make-flexi-stream (fd-gray:input-stream fd)
                         :external-format external-format))
    
    (defmacro with-input-stream ((var fd &optional (external-format :utf-8))
                                 &body body)
      (let ((stream (gensym "STREAM-")))
        `(let ((,stream (input-stream ,fd ,external-format)))
           (unwind-protect (let ((,var ,stream))
                             ,@body)
             (close ,stream)))))
    
    (defun output-stream (fd &optional (external-format :utf-8))
      (make-flexi-stream (fd-gray:output-stream fd)
                         :external-format external-format))
    
    (defmacro with-output-stream ((var fd &optional (external-format :utf-8))
                                  &body body)
      (let ((stream (gensym "STREAM-")))
        `(let ((,stream (output-stream ,fd ,external-format)))
           (unwind-protect (let ((,var ,stream))
                             ,@body)
             (close ,stream)))))
    
    (defun io-stream (fd &optional (external-format :utf-8))
      (make-flexi-stream (fd-gray:io-stream fd)
                         :external-format external-format))
    
    (defmacro with-io-stream ((var fd &optional (external-format :utf-8))
                              &body body)
      (let ((stream (gensym "STREAM-")))
        `(let ((,stream (io-stream ,fd ,external-format)))
           (unwind-protect (let ((,var ,stream))
                             ,@body)
             (close ,stream)))))