[cl-pdf-devel] [patch] cl-pdf and salza2

Daniel Herring dherring at tentpost.com
Wed Feb 11 05:36:34 UTC 2009


I had some problems using cl-pdf because the bundled salza package 
conflicted with another zlib package.  After a little hacking, I got 
cl-pdf working with salza2 instead.  See the attached diffs (based on 
git fd24e80 ~ SVN revision 174) for details.

Later,
Daniel
-------------- next part --------------
From 420f3c67c28916fd87aeebb316d36201a31481cd Mon Sep 17 00:00:00 2001
From: D Herring <dherring at at.tentpost.dot.com>
Date: Wed, 11 Feb 2009 00:20:28 -0500
Subject: [PATCH] changes to use salza2

The included salza conflicts with Matthieu Villeneuve's zlib package.
---
 cl-pdf.asd |    7 ++++---
 zlib.lisp  |   44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/cl-pdf.asd b/cl-pdf.asd
index 68aa9d7..7e40719 100644
--- a/cl-pdf.asd
+++ b/cl-pdf.asd
@@ -13,13 +13,14 @@
 
 ;;;Choose the zlib implementation you want to use (only one!)
 (eval-when (:load-toplevel :compile-toplevel :execute)
-  (pushnew :use-salza-zlib *features*)
+  (pushnew :use-salza2-zlib *features*)
+  ;;(pushnew :use-salza-zlib *features*)
   ;;(pushnew :use-uffi-zlib *features*)
   ;;(pushnew :use-abcl-zlib *features*)
   ;;(pushnew :use-no-zlib *features*)
   )
 
-#-(or use-uffi-zlib use-salza-zlib use-abcl-zlib use-no-zlib)
+#-(or use-uffi-zlib use-salza-zlib use-salza2-zlib use-abcl-zlib use-no-zlib)
 (error "You must choose which zlib implementation you want to use!")
 
 #+(and (not uffi) use-uffi-zlib)
@@ -63,4 +64,4 @@
 	       (:file "text" :depends-on ("pdf-base"))
 	       (:file "bar-codes" :depends-on ("pdf-geom"))
 	       (:file "chart" :depends-on ("text" "pdf-geom")))
-  :depends-on (:iterate #+use-salza-zlib :salza))
+  :depends-on (:iterate #+use-salza-zlib :salza #+use-salza2-zlib :salza2))
diff --git a/zlib.lisp b/zlib.lisp
index e54ec03..76c2f45 100644
--- a/zlib.lisp
+++ b/zlib.lisp
@@ -102,6 +102,50 @@
         (salza::finish-zlib-stream zlib-stream)
 	(nreverse chunks)))))
 
+#+use-salza2-zlib
+(defun load-zlib (&optional force)
+  (declare (ignore force))
+  (setf *compress-streams* t))
+
+;; string-to-octets copied from the original salza
+#+use-salza2-zlib
+(defun string-to-octets (string start end)
+  "Convert STRING to a sequence of octets, if possible."
+  (declare (type string string)
+           (type buffer-offset start end)
+           (optimize (speed 3) (safety 0)))
+  #+(and sbcl (not octet-characters))
+  (sb-ext:string-to-octets string :external-format :iso-8859-1 :start start :end end)
+  #+(and allegro (not octet-characters))
+  (excl:string-to-octets string :start start :end end :null-terminate nil)
+  #+(and clisp (not octet-characters))
+  (ext:convert-string-to-bytes string custom:*default-file-encoding* :start start :end end)
+  #+(or octet-characters lispworks)
+  (let* ((length (- end start))
+         (result (make-array length :element-type 'octet)))
+    (loop for i fixnum from start below end
+          for j fixnum from 0
+          do (setf (aref result j) (char-code (aref string i))))
+    result)
+  #+(and (not octet-characters) (not (or sbcl allegro clisp lispworks)))
+  (error "Do not know how to convert a string to octets."))
+
+#+use-salza2-zlib
+(defun compress-string (string)
+  (let ((input (if (stringp string)
+                   (string-to-octets string 0 (length string))
+                   string))
+        (chunks ()))
+    (flet ((cb (octet-vector end)
+             (push (subseq octet-vector 0 end)
+                   chunks)))
+      (let ((compressor
+             (make-instance 'salza2:zlib-compressor
+              :callback #'cb)))
+        (salza2:compress-octet-vector input compressor)
+        (salza2:finish-compression compressor)))
+    (reverse chunks)))
+
 ;;; no-zlib
 #+use-no-zlib
 (defun load-zlib (&optional force)
-- 
1.6.0.2



More information about the cl-pdf-devel mailing list