changeset 70388:000b130bfb7d

(archive-l-e): New optional argument `float' means generate a float value. (archive-arc-summarize, archive-lzh-summarize) (archive-zip-summarize, archive-zoo-summarize): Invoke archive-l-e with 3rd argument non-nil when file's size is being computed. Format the file sizes with %8.0f instead of %8d.
author Eli Zaretskii <eliz@gnu.org>
date Fri, 05 May 2006 10:54:55 +0000
parents a995a8745b40
children 5f67d565fee5
files lisp/arc-mode.el
diffstat 1 files changed, 26 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/arc-mode.el	Fri May 05 06:45:26 2006 +0000
+++ b/lisp/arc-mode.el	Fri May 05 10:54:55 2006 +0000
@@ -464,10 +464,12 @@
 (defsubst archive-name (suffix)
   (intern (concat "archive-" (symbol-name archive-subtype) "-" suffix)))
 
-(defun archive-l-e (str &optional len)
+(defun archive-l-e (str &optional len float)
   "Convert little endian string/vector STR to integer.
 Alternatively, STR may be a buffer position in the current buffer
-in which case a second argument, length LEN, should be supplied."
+in which case a second argument, length LEN, should be supplied.
+FLOAT, if non-nil, means generate and return a float instead of an integer
+\(use this for numbers that can overflow the Emacs integer)."
   (if (stringp str)
       (setq len (length str))
     (setq str (buffer-substring str (+ str len))))
@@ -475,7 +477,8 @@
         (i 0))
     (while (< i len)
       (setq i (1+ i)
-            result (+ (ash result 8) (aref str (- len i)))))
+            result (+ (if float (* result 256.0) (ash result 8))
+		      (aref str (- len i)))))
     result))
 
 (defun archive-int-to-mode (mode)
@@ -1331,13 +1334,14 @@
       (let* ((namefld (buffer-substring (+ p 2) (+ p 2 13)))
 	     (fnlen   (or (string-match "\0" namefld) 13))
 	     (efnname (substring namefld 0 fnlen))
-             (csize   (archive-l-e (+ p 15) 4))
+	     ;; Convert to float to avoid overflow for very large files.
+             (csize   (archive-l-e (+ p 15) 4 'float))
              (moddate (archive-l-e (+ p 19) 2))
              (modtime (archive-l-e (+ p 21) 2))
-             (ucsize  (archive-l-e (+ p 25) 4))
+             (ucsize  (archive-l-e (+ p 25) 4 'float))
 	     (fiddle  (string= efnname (upcase efnname)))
              (ifnname (if fiddle (downcase efnname) efnname))
-             (text    (format "  %8d  %-11s  %-8s  %s"
+             (text    (format "  %8.0f  %-11s  %-8s  %s"
                               ucsize
                               (archive-dosdate moddate)
                               (archive-dostime modtime)
@@ -1359,7 +1363,7 @@
 	      dash)
       (archive-summarize-files (nreverse visual))
       (insert dash
-	      (format "  %8d                         %d file%s"
+	      (format "  %8.0f                         %d file%s"
 		      totalsize
 		      (length files)
 		      (if (= 1 (length files)) "" "s"))
@@ -1393,9 +1397,10 @@
     (while (progn (goto-char p)		;beginning of a base header.
 		  (looking-at "\\(.\\|\n\\)\\(.\\|\n\\)-l[hz][0-9ds]-"))
       (let* ((hsize   (char-after p))	;size of the base header (level 0 and 1)
-	     (csize   (archive-l-e (+ p 7) 4)) ;size of a compressed file to follow (level 0 and 2),
+	     ;; Convert to float to avoid overflow for very large files.
+	     (csize   (archive-l-e (+ p 7) 4 'float)) ;size of a compressed file to follow (level 0 and 2),
 					;size of extended headers + the compressed file to follow (level 1).
-             (ucsize  (archive-l-e (+ p 11) 4))	;size of an uncompressed file.
+             (ucsize  (archive-l-e (+ p 11) 4 'float))	;size of an uncompressed file.
 	     (time1   (archive-l-e (+ p 15) 2))	;date/time (MSDOS format in level 0, 1 headers
 	     (time2   (archive-l-e (+ p 17) 2))	;and UNIX format in level 2 header.)
 	     (hdrlvl  (char-after (+ p 20))) ;header level
@@ -1471,12 +1476,12 @@
 			  (archive-unixtime time1 time2)
 			(archive-dostime time1)))
 	(setq text    (if archive-alternate-display
-			  (format "  %8d  %5S  %5S  %s"
+			  (format "  %8.0f  %5S  %5S  %s"
 				  ucsize
 				  (or uid "?")
 				  (or gid "?")
 				  ifnname)
-			(format "  %10s  %8d  %-11s  %-8s  %s"
+			(format "  %10s  %8.0f  %-11s  %-8s  %s"
 				modestr
 				ucsize
 				moddate
@@ -1506,8 +1511,8 @@
 		       "M   Length    Uid    Gid  File\n"
 		    "M   Filemode    Length  Date         Time      File\n"))
 	  (sumline (if archive-alternate-display
-		       "  %8d                %d file%s"
-		     "              %8d                         %d file%s")))
+		       "  %8.0f                %d file%s"
+		     "              %8.0f                         %d file%s")))
       (insert header dash)
       (archive-summarize-files (nreverse visual))
       (insert dash
@@ -1603,7 +1608,8 @@
 	     ;; (method  (archive-l-e (+ p 10) 2))
              (modtime (archive-l-e (+ p 12) 2))
              (moddate (archive-l-e (+ p 14) 2))
-             (ucsize  (archive-l-e (+ p 24) 4))
+	     ;; Convert to float to avoid overflow for very large files.
+             (ucsize  (archive-l-e (+ p 24) 4 'float))
              (fnlen   (archive-l-e (+ p 28) 2))
              (exlen   (archive-l-e (+ p 30) 2))
              (fclen   (archive-l-e (+ p 32) 2))
@@ -1629,7 +1635,7 @@
 			   (string= (upcase efnname) efnname)))
              (ifnname (if fiddle (downcase efnname) efnname))
 	     (width (string-width ifnname))
-             (text    (format "  %10s  %8d  %-11s  %-8s  %s"
+             (text    (format "  %10s  %8.0f  %-11s  %-8s  %s"
 			      modestr
                               ucsize
                               (archive-dosdate moddate)
@@ -1655,7 +1661,7 @@
 	      dash)
       (archive-summarize-files (nreverse visual))
       (insert dash
-	      (format "              %8d                         %d file%s"
+	      (format "              %8.0f                         %d file%s"
 		      totalsize
 		      (length files)
 		      (if (= 1 (length files)) "" "s"))
@@ -1709,7 +1715,8 @@
       (let* ((next    (1+ (archive-l-e (+ p 6) 4)))
              (moddate (archive-l-e (+ p 14) 2))
              (modtime (archive-l-e (+ p 16) 2))
-             (ucsize  (archive-l-e (+ p 20) 4))
+	     ;; Convert to float to avoid overflow for very large files.
+             (ucsize  (archive-l-e (+ p 20) 4 'float))
 	     (namefld (buffer-substring (+ p 38) (+ p 38 13)))
 	     (dirtype (char-after (+ p 4)))
 	     (lfnlen  (if (= dirtype 2) (char-after (+ p 56)) 0))
@@ -1733,7 +1740,7 @@
 	     (fiddle  (and (= lfnlen 0) (string= efnname (upcase efnname))))
              (ifnname (if fiddle (downcase efnname) efnname))
 	     (width (string-width ifnname))
-             (text    (format "  %8d  %-11s  %-8s  %s"
+             (text    (format "  %8.0f  %-11s  %-8s  %s"
                               ucsize
                               (archive-dosdate moddate)
                               (archive-dostime modtime)
@@ -1755,7 +1762,7 @@
 	      dash)
       (archive-summarize-files (nreverse visual))
       (insert dash
-	      (format "  %8d                         %d file%s"
+	      (format "  %8.0f                         %d file%s"
 		      totalsize
 		      (length files)
 		      (if (= 1 (length files)) "" "s"))