[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: zip-mode mis-displays large files
From: |
Eli Zaretskii |
Subject: |
Re: zip-mode mis-displays large files |
Date: |
Sat, 22 Apr 2006 15:00:10 +0300 |
> From: Sam Steingold <address@hidden>
> Date: Fri, 21 Apr 2006 16:30:05 -0400
>
> -rw-rw-r-- -174564534 4-Apr-2006 12:27:04 no-match-18.log
> -rw-rw-r-- 1955745 5-Apr-2006 09:00:16 no-match-19.log
> -rw-rw-r-- 7809176 5-Apr-2006 16:20:36 no-match-20.log
> -rw-rw-r-- 2328621 6-Apr-2006 17:25:24 no-match-21.log
> -rw-rw-r-- 959910 7-Apr-2006 16:20:50 no-match-22.log
> -rw-rw-r-- 2142728 17-Apr-2006 09:15:32 no-match-23.log
> -rw-rw-r-- 105777607 17-Apr-2006 16:55:06 no-match-24.log
> -rw-rw-r-- 66358753 18-Apr-2006 16:19:50 no-match-25.log
> - ---------- -------- ----------- -------- ---------------
> 142264156 25 files
>
> note the negative length of the "no-match-18.log" file.
Does the patch below give good results?
Index: lisp/arc-mode.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/arc-mode.el,v
retrieving revision 1.72
diff -u -r1.72 arc-mode.el
--- lisp/arc-mode.el 8 Mar 2006 01:57:59 -0000 1.72
+++ lisp/arc-mode.el 22 Apr 2006 11:57:42 -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,13 @@
(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))
+ (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 (float (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 +1362,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 +1396,9 @@
(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),
+ (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 +1474,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 +1509,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 +1606,7 @@
;; (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))
+ (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 +1632,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 +1658,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 +1712,7 @@
(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))
+ (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 +1736,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 +1758,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"))