r1518: Initial revision
[uffi.git] / tests / compress.cl
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          compress.cl
6 ;;;; Purpose:       UFFI Example file for zlib compression
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  Mar 2002
9 ;;;;
10 ;;;; Copyright (c) 2002 Kevin M. Rosenberg
11 ;;;;
12 ;;;; $Id: compress.cl,v 1.1 2002/03/09 19:55:33 kevin Exp $
13 ;;;;
14 ;;;; This file is part of UFFI. 
15 ;;;;
16 ;;;; UFFI is free software; you can redistribute it and/or modify
17 ;;;; it under the terms of the GNU General Public License (version 2) as
18 ;;;; published by the Free Software Foundation.
19 ;;;;
20 ;;;; UFFI is distributed in the hope that it will be useful,
21 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 ;;;; GNU General Public License for more details.
24 ;;;;
25 ;;;; You should have received a copy of the GNU General Public License
26 ;;;; along with UFFI; if not, write to the Free Software Foundation, Inc.,
27 ;;;; 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28 ;;;; *************************************************************************
29
30 (in-package :cl-user)
31
32 (unless (uffi:load-foreign-library "/usr/lib/libz.so" "zlib" '("c"))
33   (warn "Unable to load zlib"))
34
35 (uffi:def-routine ("compress" c-compress)
36     ((dest (* :unsigned-char))
37      (destlen (* :long))
38      (source :c-string)
39      (source-len :long))
40   :returning :int
41   :module "zlib")
42   
43 (defun compress (source)
44   "Returns two values: array of bytes containing the compressed data
45  and the numbe of compressed bytes"
46   (let* ((sourcelen (length source))
47          (destsize (+ 12 (ceiling (* sourcelen 1.01))))
48          (dest (uffi:allocate-foreign-string destsize))
49          (destlen (uffi:allocate-foreign-object :long)))
50     (setf (uffi:deref-pointer destlen :long) destsize)
51     (uffi:with-c-string (source-native source)
52       (let ((result (c-compress dest destlen source-native sourcelen))
53             (newdestlen (uffi:deref-pointer destlen :long)))
54         (unwind-protect
55             (if (zerop result)
56                 (values (uffi:convert-from-foreign-string 
57                          dest
58                          :length newdestlen
59                          :null-terminated-p nil)
60                         newdestlen)
61               (error "zlib error, code ~D" result))
62           (progn
63             (uffi:free-foreign-object destlen)
64             (uffi:free-foreign-object dest)))))))
65
66