r8650: Automated commit for Debian build of md5 upstream-version-1.8.3
[md5.git] / md5.lisp
index e0f87b78c2f4cf0bd92c2f04debe535f7db665e9..dbdafb21c2f34cf303c42da04077a299dec376ce 100644 (file)
--- a/md5.lisp
+++ b/md5.lisp
@@ -392,24 +392,34 @@ bounded by start and end, which must be numeric bounding-indices."
           (ext:optimize-interface (safety 1) (debug 1)))
   (let ((regs (md5-state-regs state))
        (block (md5-state-block state))
-       (buffer (md5-state-buffer state))
-       (buffer-index (md5-state-buffer-index state))
-       (length (- end start)))
-    (declare (type md5-regs regs) (type fixnum length)
-            (type (integer 0 63) buffer-index)
+       (buffer (md5-state-buffer state)))
+    (declare (type md5-regs regs)
             (type (simple-array (unsigned-byte 32) (16)) block)
             (type (simple-array (unsigned-byte 8) (64)) buffer))
     ;; Handle old rest
-    (unless (zerop buffer-index)
-      (let ((amount (min (- 64 buffer-index) length)))
-       (declare (type (integer 0 63) amount))
-       (copy-to-buffer sequence start amount buffer buffer-index)
-       (setq start (the fixnum (+ start amount)))
-       (when (>= start end)
-         (setf (md5-state-buffer-index state) (+ buffer-index amount))
-         (return-from update-md5-state state)))
-      (fill-block-ub8 block buffer 0)
-      (update-md5-block regs block))
+    (unless (zerop (md5-state-buffer-index state))
+      (let* ((buffer-index (md5-state-buffer-index state))
+             (remainder (- 64 buffer-index))
+             (length (- end start))
+             (amount (min remainder length)))
+        (declare (type (integer 0 63) buffer-index remainder amount)
+                 (type fixnum length))
+        (copy-to-buffer sequence start amount buffer buffer-index)
+        (setf (md5-state-amount state)
+              #-md5-small-length (+ (md5-state-amount state) amount)
+              #+md5-small-length (the (unsigned-byte 29)
+                                      (+ (md5-state-amount state) amount)))
+        (setq start (the fixnum (+ start amount)))
+        (if (< length remainder)
+            (setf (md5-state-buffer-index state)
+                  (the (integer 0 63) (+ buffer-index amount)))
+          (progn
+            (fill-block-ub8 block buffer 0)
+            (update-md5-block regs block)
+            (setf (md5-state-buffer-index state) 0)))))
+    ;; Leave when nothing to do
+    (when (>= start end)
+      (return-from update-md5-state state))
     ;; Handle main-part and new-rest
     (etypecase sequence
       ((simple-array (unsigned-byte 8) (*))
@@ -439,9 +449,11 @@ bounded by start and end, which must be numeric bounding-indices."
                   (copy-to-buffer sequence offset amount buffer 0))
                 (setf (md5-state-buffer-index state) amount))))))
     (setf (md5-state-amount state)
-         #-md5-small-length (+ (md5-state-amount state) length)
+         #-md5-small-length (+ (md5-state-amount state) 
+                                (the fixnum (- end start)))
          #+md5-small-length (the (unsigned-byte 29)
-                              (+ (md5-state-amount state) length)))
+                              (+ (md5-state-amount state) 
+                                  (the fixnum (- end start)))))
     state))
 
 (defun finalize-md5-state (state)