Fix test suite name
[cl-base64.git] / package.lisp
index 7c119de45ec550dd4873afbd05a3f35d955c12ea..71524cf05565f68162387e854ccd93592aff2c4e 100644 (file)
@@ -1,4 +1,4 @@
-;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
+;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
 ;;;; *************************************************************************
 ;;;; FILE IDENTIFICATION
 ;;;;
@@ -7,68 +7,87 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Dec 2002
 ;;;;
-;;;; $Id: package.lisp,v 1.1 2003/01/12 20:25:26 kevin Exp $
+;;;; $Id$
 ;;;;
 ;;;; *************************************************************************
 
-(declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0)))
-
 (defpackage #:cl-base64
   (:nicknames #:base64)
   (:use #:cl)
   (:export #:base64-stream-to-integer
-          #:base64-string-to-integer
-          #:base64-string-to-string
-          #:base64-stream-to-string
-          #:base64-string-to-stream
-          #:base64-stream-to-stream
-          #:base64-string-to-usb8-array
-          #:base64-stream-to-usb8-array
-          #:string-to-base64-string
-          #:string-to-base64-stream
-          #:usb8-array-to-base64-string
-          #:usb8-array-to-base64-stream
-          #:stream-to-base64-string
-          #:stream-to-base64-stream
-          #:integer-to-base64-string
-          #:integer-to-base64-stream
+           #:base64-stream-to-string
+           #:base64-stream-to-stream
+           #:base64-stream-to-usb8-array
+           #:base64-string-to-integer
+           #:base64-string-to-string
+           #:base64-string-to-stream
+           #:base64-string-to-usb8-array
+           #:string-to-base64-string
+           #:string-to-base64-stream
+           #:usb8-array-to-base64-string
+           #:usb8-array-to-base64-stream
+           #:stream-to-base64-string
+           #:stream-to-base64-stream
+           #:integer-to-base64-string
+           #:integer-to-base64-stream
 
-          ;; For creating custom encode/decode tables
-          #:*uri-encode-table*
-          #:*uri-decode-table*
-          #:make-decode-table
-          ))
+           ;; Conditions.
+           #:base64-error
+           #:bad-base64-character
+           #:incomplete-base64-data
 
-(in-package #:cl-base64)
+           ;; For creating custom encode/decode tables.
+           #:make-decode-table
+           #:+decode-table+
+           #:+uri-decode-table+
+           ;; What's the point of exporting these?
+           #:*uri-encode-table*
+           #:*uri-decode-table*
+           ))
 
+(in-package #:cl-base64)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (defvar *encode-table*
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
-  (declaim (type simple-string *encode-table*))
-  
-  (defvar *uri-encode-table*
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")
-  (declaim (type simple-string *uri-encode-table*))
-  
-  (deftype decode-table () '(array fixnum (256)))
+(defvar *encode-table*
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
+(declaim (type simple-string *encode-table*))
+
+(defvar *uri-encode-table*
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")
+(declaim (type simple-string *uri-encode-table*))
+
+(defvar *pad-char* #\=)
+(defvar *uri-pad-char* #\.)
+(declaim (type character *pad-char* *uri-pad-char*))
+
+  (deftype decode-table () '(simple-array (signed-byte 8) (128)))
+  (defun make-decode-table (encode-table pad-char
+                            &key (whitespace-chars
+                                  '(#\Linefeed #\Return #\Space #\Tab)))
+    (assert (< (length encode-table) 128)
+            (encode-table)
+            "Encode table too big: ~S" encode-table)
+    (let ((dt (make-array 128 :element-type '(signed-byte 8)
+                              :initial-element -1)))
+      (declare (type decode-table dt))
+      (loop for char across encode-table
+            for index upfrom 0
+            do (setf (aref dt (char-code char)) index))
+      (setf (aref dt (char-code pad-char)) -2)
+      (loop for char in whitespace-chars
+            do (setf (aref dt (char-code char)) -3))
+      dt)))
+
+(defconstant +decode-table+
+  (if (boundp '+decode-table+)
+      (symbol-value '+decode-table+)
+      (make-decode-table *encode-table* *pad-char*)))
+(defvar *decode-table* +decode-table+ "Deprecated.")
+(declaim (type decode-table +decode-table+ *decode-table*))
 
-  (defun make-decode-table (encode-table)
-    (let ((dt (make-array 256 :adjustable nil :fill-pointer nil
-                         :element-type 'fixnum
-                         :initial-element -1)))
-      (loop for char of-type character across encode-table
-        for index of-type fixnum from 0 below 64
-        do (setf (aref dt (the fixnum (char-code char))) index))
-      dt))
-    
-  (defvar *decode-table* (make-decode-table *encode-table*))
-  
-  (defvar *uri-decode-table* (make-decode-table *uri-encode-table*))
-  
-  (declaim (type decode-table *decode-table* *uri-decode-table*))
-  
-  (defvar *pad-char* #\=)
-  (defvar *uri-pad-char* #\.)
-  (declaim (type character *pad-char* *uri-pad-char*))
-  )
+(defconstant +uri-decode-table+
+  (if (boundp '+uri-decode-table+)
+      (symbol-value '+uri-decode-table+)
+      (make-decode-table *uri-encode-table* *uri-pad-char*)))
+(defvar *uri-decode-table* +uri-decode-table+ "Deprecated.")
+(declaim (type decode-table +uri-decode-table+ *uri-decode-table*))