r5209: Auto commit for Debian build
[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.lisp\r
6 ;;;; Purpose:       UFFI Example file for zlib compression\r
7 ;;;; Author:        Kevin M. Rosenberg\r
8 ;;;; Date Started:  Feb 2002\r
9 ;;;;\r
10 ;;;; $Id: compress.lisp,v 1.11 2003/05/02 02:50:12 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 (uffi:def-function ("compress" c-compress)\r
22     ((dest (* :unsigned-char))\r
23      (destlen (* :long))\r
24      (source :cstring)\r
25      (source-len :long))\r
26   :returning :int\r
27   :module "zlib")\r
28   \r
29 (defun compress (source)\r
30   "Returns two values: array of bytes containing the compressed data\r
31  and the numbe of compressed bytes"\r
32   (let* ((sourcelen (length source))\r
33          (destsize (+ 12 (ceiling (* sourcelen 1.01))))\r
34          (dest (uffi:allocate-foreign-string destsize :unsigned t))\r
35          (destlen (uffi:allocate-foreign-object :long)))\r
36     (setf (uffi:deref-pointer destlen :long) destsize)\r
37     (uffi:with-cstring (source-native source)\r
38       (let ((result (c-compress dest destlen source-native sourcelen))\r
39             (newdestlen (uffi:deref-pointer destlen :long)))\r
40         (unwind-protect\r
41             (if (zerop result)\r
42                 (values (uffi:convert-from-foreign-string \r
43                          dest\r
44                          :length newdestlen\r
45                          :null-terminated-p nil)\r
46                         newdestlen)\r
47               (error "zlib error, code ~D" result))\r
48           (progn\r
49             (uffi:free-foreign-object destlen)\r
50             (uffi:free-foreign-object dest)))))))\r
51 \r
52 (uffi:def-function ("uncompress" c-uncompress)\r
53     ((dest (* :unsigned-char))\r
54      (destlen (* :long))\r
55      (source :cstring)\r
56      (source-len :long))\r
57   :returning :int\r
58   :module "zlib")\r
59 \r
60 (defun uncompress (source)\r
61   (let* ((sourcelen (length source))\r
62          (destsize 200000)  ;adjust as needed\r
63          (dest (uffi:allocate-foreign-string destsize :unsigned t))\r
64          (destlen (uffi:allocate-foreign-object :long)))\r
65     (setf (uffi:deref-pointer destlen :long) destsize)\r
66     (uffi:with-cstring (source-native source)\r
67       (let ((result (c-uncompress dest destlen source-native sourcelen))\r
68             (newdestlen (uffi:deref-pointer destlen :long)))\r
69         (unwind-protect\r
70              (if (zerop result)\r
71                  (uffi:convert-from-foreign-string \r
72                   dest\r
73                   :length newdestlen\r
74                   :null-terminated-p nil)\r
75                  (error "zlib error, code ~D" result))\r
76           (progn\r
77             (uffi:free-foreign-object destlen)\r
78             (uffi:free-foreign-object dest)))))))\r
79 \r
80 (deftest compress.1 (map 'list #'char-code (compress ""))\r
81   (120 156 3 0 0 0 0 1))\r
82 (deftest compress.2 (map 'list #'char-code  (compress "test"))\r
83   (120 156 43 73 45 46 1 0 4 93 1 193))\r
84 (deftest compress.3 (map 'list #'char-code (compress "test2"))\r
85   (120 156 43 73 45 46 49 2 0 6 80 1 243))\r
86 \r
87 (defun compress-uncompress (str)\r
88   (multiple-value-bind (compressed len) (compress str)\r
89     (declare (ignore len))\r
90     (multiple-value-bind (uncompressed len2) (uncompress compressed)\r
91       (declare (ignore len2))\r
92       uncompressed)))\r
93 \r
94 \r
95 (deftest uncompress.1 "" "")\r
96 (deftest uncompress.2 "test" "test")\r
97 (deftest uncompress.3 "test2" "test2")\r