r4729: Automatic commit for debian_version_1_2_13-1
[uffi.git] / tests / compress.lisp
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-\r
2 ;;;; *************************************************************************\r
3 ;;;; FILE IDENTIFICATION\r
4 ;;;;\r
5 ;;;; Name:          compress.cl\r
6 ;;;; Purpose:       UFFI Example file for zlib compression\r
7 ;;;; Programmer:    Kevin M. Rosenberg\r
8 ;;;; Date Started:  Feb 2002\r
9 ;;;;\r
10 ;;;; $Id: compress.lisp,v 1.9 2003/05/02 02:36:22 kevin Exp $\r
11 ;;;;\r
12 ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg\r
13 ;;;;\r
14 ;;;; UFFI users are granted the rights to distribute and use this software\r
15 ;;;; as governed by the terms of the Lisp Lesser GNU Public License\r
16 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.\r
17 ;;;; *************************************************************************\r
18 \r
19 (in-package :uffi-tests)\r
20 \r
21 (unless (uffi:load-foreign-library\r
22          #-(or macosx darwin)\r
23          (uffi:find-foreign-library\r
24           "libz"\r
25           '("/usr/local/lib/" "/usr/lib/" "/zlib/")\r
26           :types '("so" "a"))\r
27          #+(or macosx darwin)\r
28          (uffi:find-foreign-library "z"\r
29                                     `(,(pathname-directory *load-pathname*)))\r
30          :module "zlib" \r
31          :supporting-libraries '("c"))\r
32   (warn "Unable to load zlib"))\r
33   \r
34 (uffi:def-function ("compress" c-compress)\r
35     ((dest (* :unsigned-char))\r
36      (destlen (* :long))\r
37      (source :cstring)\r
38      (source-len :long))\r
39   :returning :int\r
40   :module "zlib")\r
41   \r
42 (defun compress (source)\r
43   "Returns two values: array of bytes containing the compressed data\r
44  and the numbe of compressed bytes"\r
45   (let* ((sourcelen (length source))\r
46          (destsize (+ 12 (ceiling (* sourcelen 1.01))))\r
47          (dest (uffi:allocate-foreign-string destsize :unsigned t))\r
48          (destlen (uffi:allocate-foreign-object :long)))\r
49     (setf (uffi:deref-pointer destlen :long) destsize)\r
50     (uffi:with-cstring (source-native source)\r
51       (let ((result (c-compress dest destlen source-native sourcelen))\r
52             (newdestlen (uffi:deref-pointer destlen :long)))\r
53         (unwind-protect\r
54             (if (zerop result)\r
55                 (values (uffi:convert-from-foreign-string \r
56                          dest\r
57                          :length newdestlen\r
58                          :null-terminated-p nil)\r
59                         newdestlen)\r
60               (error "zlib error, code ~D" result))\r
61           (progn\r
62             (uffi:free-foreign-object destlen)\r
63             (uffi:free-foreign-object dest)))))))\r
64 \r
65 (uffi:def-function ("uncompress" c-uncompress)\r
66     ((dest (* :unsigned-char))\r
67      (destlen (* :long))\r
68      (source :cstring)\r
69      (source-len :long))\r
70   :returning :int\r
71   :module "zlib")\r
72 \r
73 (defun uncompress (source)\r
74   (let* ((sourcelen (length source))\r
75          (destsize 200000)  ;adjust as needed\r
76          (dest (uffi:allocate-foreign-string destsize :unsigned t))\r
77          (destlen (uffi:allocate-foreign-object :long)))\r
78     (setf (uffi:deref-pointer destlen :long) destsize)\r
79     (uffi:with-cstring (source-native source)\r
80       (let ((result (c-uncompress dest destlen source-native sourcelen))\r
81             (newdestlen (uffi:deref-pointer destlen :long)))\r
82         (unwind-protect\r
83              (if (zerop result)\r
84                  (uffi:convert-from-foreign-string \r
85                   dest\r
86                   :length newdestlen\r
87                   :null-terminated-p nil)\r
88                  (error "zlib error, code ~D" result))\r
89           (progn\r
90             (uffi:free-foreign-object destlen)\r
91             (uffi:free-foreign-object dest)))))))\r
92 \r
93 (deftest compress.1 (map 'list #'char-code (compress ""))\r
94   (120 156 3 0 0 0 0 1))\r
95 (deftest compress.2 (map 'list #'char-code  (compress "test"))\r
96   (120 156 43 73 45 46 1 0 4 93 1 193))\r
97 (deftest compress.3 (map 'list #'char-code (compress "test2"))\r
98   (120 156 43 73 45 46 49 2 0 6 80 1 243))\r
99 \r
100 (defun compress-uncompress (str)\r
101   (multiple-value-bind (compressed len) (compress str)\r
102     (declare (ignore len))\r
103     (multiple-value-bind (uncompressed len2) (uncompress compressed)\r
104       (declare (ignore len2))\r
105       uncompressed)))\r
106 \r
107 \r
108 (deftest uncompress.1 "" "")\r
109 (deftest uncompress.2 "test" "test")\r
110 (deftest uncompress.3 "test2" "test2")\r