uffi/examples compress.lisp,1.3,1.4
"Kevin M. Rosenberg" <[email protected]> Mon, 10 Mar 2003 10:37:07 -0700
| Newsgroups | gmane.lisp.uffi.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /pubcvs/uffi/examples
In directory boa.b9.com:/tmp/cvs-serv10359/examples
Modified Files:
compress.lisp
Log Message:
Index: compress.lisp
===================================================================
RCS file: /pubcvs/uffi/examples/compress.lisp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** compress.lisp 9 Dec 2002 16:30:20 -0000 1.3
--- compress.lisp 10 Mar 2003 17:37:05 -0000 1.4
***************
*** 1,120 ****
! ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
! ;;;; *************************************************************************
! ;;;; FILE IDENTIFICATION
! ;;;;
! ;;;; Name: compress.cl
! ;;;; Purpose: UFFI Example file for zlib compression
! ;;;; Programmer: Kevin M. Rosenberg
! ;;;; Date Started: Feb 2002
! ;;;;
! ;;;; $Id$
! ;;;;
! ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg
! ;;;;
! ;;;; UFFI users are granted the rights to distribute and use this software
! ;;;; as governed by the terms of the Lisp Lesser GNU Public License
! ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
! ;;;; *************************************************************************
!
! (in-package :cl-user)
!
! (eval-when (:load-toplevel :execute)
! (unless (uffi:load-foreign-library
! #-(or macosx darwin)
! (uffi:find-foreign-library
! "libz"
! '("/usr/local/lib/" "/usr/lib/" "/zlib/")
! :types '("so" "a"))
! #+(or macosx darwin)
! (uffi:find-foreign-library "z"
! `(,(pathname-directory *load-pathname*)))
! :module "zlib"
! :supporting-libraries '("c"))
! (warn "Unable to load zlib")))
!
! (uffi:def-function ("compress" c-compress)
! ((dest (* :unsigned-char))
! (destlen (* :long))
! (source :cstring)
! (source-len :long))
! :returning :int
! :module "zlib")
!
! (defun compress (source)
! "Returns two values: array of bytes containing the compressed data
! and the numbe of compressed bytes"
! (let* ((sourcelen (length source))
! (destsize (+ 12 (ceiling (* sourcelen 1.01))))
! (dest (uffi:allocate-foreign-string destsize :unsigned t))
! (destlen (uffi:allocate-foreign-object :long)))
! (setf (uffi:deref-pointer destlen :long) destsize)
! (uffi:with-cstring (source-native source)
! (let ((result (c-compress dest destlen source-native sourcelen))
! (newdestlen (uffi:deref-pointer destlen :long)))
! (unwind-protect
! (if (zerop result)
! (values (uffi:convert-from-foreign-string
! dest
! :length newdestlen
! :null-terminated-p nil)
! newdestlen)
! (error "zlib error, code ~D" result))
! (progn
! (uffi:free-foreign-object destlen)
! (uffi:free-foreign-object dest)))))))
!
! (uffi:def-function ("uncompress" c-uncompress)
! ((dest (* :unsigned-char))
! (destlen (* :long))
! (source :cstring)
! (source-len :long))
! :returning :int
! :module "zlib")
!
! (defun uncompress (source)
! (let* ((sourcelen (length source))
! (destsize 200000) ;adjust as needed
! (dest (uffi:allocate-foreign-string destsize :unsigned t))
! (destlen (uffi:allocate-foreign-object :long)))
! (setf (uffi:deref-pointer destlen :long) destsize)
! (uffi:with-cstring (source-native source)
! (let ((result (c-uncompress dest destlen source-native sourcelen))
! (newdestlen (uffi:deref-pointer destlen :long)))
! (unwind-protect
! (if (zerop result)
! (uffi:convert-from-foreign-string
! dest
! :length newdestlen
! :null-terminated-p nil)
! (error "zlib error, code ~D" result))
! (progn
! (uffi:free-foreign-object destlen)
! (uffi:free-foreign-object dest)))))))
!
! #+examples-uffi
! (progn
! (flet ((print-results (str)
! (multiple-value-bind (compressed len) (compress str)
! (format t "~&(compress ~S) => " str)
! (dotimes (i len)
! (format t "~X" (char-code (char compressed i))))
! (format t ",~D" len))))
! (print-results "")
! (print-results "test")
! (print-results "test2")))
!
! #+test-uffi
! (progn
! (flet ((test-compress (str)
! (multiple-value-bind (compressed len) (compress str)
! (multiple-value-bind (uncompressed len2) (uncompress compressed)
! (util.test:test str uncompressed :test #'string=
! :fail-info "Error uncompressing a compressed string")))))
! (test-compress "")
! (test-compress "test")
! (test-compress "test2")))
!
! ;; Results of the above on my system:
! ;; (compress "") => 789c300001,8
! ;; (compress "test") => 789c2b492d2e1045d1c1,12
! ;; (compress "test2") => 789c2b492d2e31206501f3,13
--- 1,119 ----
! ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
! ;;;; *************************************************************************
! ;;;; FILE IDENTIFICATION
! ;;;;
! ;;;; Name: compress.cl
! ;;;; Purpose: UFFI Example file for zlib compression
! ;;;; Programmer: Kevin M. Rosenberg
! ;;;; Date Started: Feb 2002
! ;;;;
! ;;;; $Id$
! ;;;;
! ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg
! ;;;;
! ;;;; UFFI users are granted the rights to distribute and use this software
! ;;;; as governed by the terms of the Lisp Lesser GNU Public License
! ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
! ;;;; *************************************************************************
!
! (in-package :cl-user)
!
! (eval-when (:load-toplevel :execute)
! (unless (uffi:load-foreign-library
! #-(or macosx darwin)
! (uffi:find-foreign-library
! "libz"
! '("/usr/local/lib/" "/usr/lib/" "/zlib/")
! :types '("so" "a"))
! #+(or macosx darwin)
! (uffi:find-foreign-library "z"
! `(,(pathname-directory *load-pathname*)))
! :module "zlib"
! :supporting-libraries '("c"))
! (warn "Unable to load zlib")))
!
! (uffi:def-function ("compress" c-compress)
! ((dest (* :unsigned-char))
! (destlen (* :long))
! (source :cstring)
! (source-len :long))
! :returning :int
! :module "zlib")
!
! (defun compress (source)
! "Returns two values: array of bytes containing the compressed data
! and the numbe of compressed bytes"
! (let* ((sourcelen (length source))
! (destsize (+ 12 (ceiling (* sourcelen 1.01))))
! (dest (uffi:allocate-foreign-string destsize :unsigned t))
! (destlen (uffi:allocate-foreign-object :long)))
! (setf (uffi:deref-pointer destlen :long) destsize)
! (uffi:with-cstring (source-native source)
! (let ((result (c-compress dest destlen source-native sourcelen))
! (newdestlen (uffi:deref-pointer destlen :long)))
! (unwind-protect
! (if (zerop result)
! (values (uffi:convert-from-foreign-string
! dest
! :length newdestlen
! :null-terminated-p nil)
! newdestlen)
! (error "zlib error, code ~D" result))
! (progn
! (uffi:free-foreign-object destlen)
! (uffi:free-foreign-object dest)))))))
!
! (uffi:def-function ("uncompress" c-uncompress)
! ((dest (* :unsigned-char))
! (destlen (* :long))
! (source :cstring)
! (source-len :long))
! :returning :int
! :module "zlib")
!
! (defun uncompress (source)
! (let* ((sourcelen (length source))
! (destsize 200000) ;adjust as needed
! (dest (uffi:allocate-foreign-string destsize :unsigned t))
! (destlen (uffi:allocate-foreign-object :long)))
! (setf (uffi:deref-pointer destlen :long) destsize)
! (uffi:with-cstring (source-native source)
! (let ((result (c-uncompress dest destlen source-native sourcelen))
! (newdestlen (uffi:deref-pointer destlen :long)))
! (unwind-protect
! (if (zerop result)
! (uffi:convert-from-foreign-string
! dest
! :length newdestlen
! :null-terminated-p nil)
! (error "zlib error, code ~D" result))
! (progn
! (uffi:free-foreign-object destlen)
! (uffi:free-foreign-object dest)))))))
!
! #+examples-uffi
! (progn
! (flet ((print-results (str)
! (multiple-value-bind (compressed len) (compress str)
! (let ((*print-length* nil))
! (format t "~&(compress ~S) => " str)
! (format t "~S~%" (map 'list #'char-code compressed))))))
! (print-results "")
! (print-results "test")
! (print-results "test2")))
!
! #+test-uffi
! (progn
! (flet ((test-compress (str)
! (multiple-value-bind (compressed len) (compress str)
! (multiple-value-bind (uncompressed len2) (uncompress compressed)
! (util.test:test str uncompressed :test #'string=
! :fail-info "Error uncompressing a compressed string")))))
! (test-compress "")
! (test-compress "test")
! (test-compress "test2")))
!
! ;; Results of the above on my system:
! ;; (compress "") => 789c300001,8
! ;; (compress "test") => 789c2b492d2e1045d1c1,12
! ;; (compress "test2") => 789c2b492d2e31206501f3,13