emacs-devel
[Top][All Lists]
Advanced

[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"))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]