Common Lisp mode

        (warn "Ignoring the error which happened while trying to close PostgreSQL socket: ~A" error)))))
 
1
(in-package :cl-postgres)
2
3
;; These are used to synthesize reader and writer names for integer
4
;; reading/writing functions when the amount of bytes and the
5
;; signedness is known. Both the macro that creates the functions and
6
;; some macros that use them create names this way.
7
(eval-when (:compile-toplevel :load-toplevel :execute)
8
  (defun integer-reader-name (bytes signed)
9
    (intern (with-standard-io-syntax
10
              (format nil "~a~a~a~a" '#:read- (if signed "" '#:u) '#:int bytes))))
11
  (defun integer-writer-name (bytes signed)
12
    (intern (with-standard-io-syntax
13
              (format nil "~a~a~a~a" '#:write- (if signed "" '#:u) '#:int bytes)))))
14
15
(defmacro integer-reader (bytes)
16
  "Create a function to read integers from a binary stream."
17
  (let ((bits (* bytes 8)))
18
    (labels ((return-form (signed)
19
               (if signed
20
                   `(if (logbitp ,(1- bits) result)
21
                        (dpb result (byte ,(1- bits) 0) -1)
22
                        result)
23
                   `result))
24
             (generate-reader (signed)
25
               `(defun ,(integer-reader-name bytes signed) (socket)
26
                  (declare (type stream socket)
27
                           #.*optimize*)
28
                  ,(if (= bytes 1)
29
                       `(let ((result (the (unsigned-byte 8) (read-byte socket))))
30
                          (declare (type (unsigned-byte 8) result))
31
                          ,(return-form signed))
32
                       `(let ((result 0))

MIME types defined: text/x-common-lisp.