Mercurial > emacs
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"))