]> git.eshelyaron.com Git - emacs.git/commitdiff
(archive-lzh-summarize): Only apply the "downcase if all upcase" rule
authorChong Yidong <cyd@stupidchicken.com>
Mon, 16 Apr 2007 19:40:14 +0000 (19:40 +0000)
committerChong Yidong <cyd@stupidchicken.com>
Mon, 16 Apr 2007 19:40:14 +0000 (19:40 +0000)
to OS-ID 0 "generic".  Always downcase for OS-ID M "MSDOS".

lisp/arc-mode.el

index 1b0f3a3d5847dda25ff5157a815d97aad80b50f5..8630d3e8b06ea3db146c0818386a2db5cf12814f 100644 (file)
@@ -1415,7 +1415,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
             (time2   (archive-l-e (+ p 17) 2)) ;and UNIX format in level 2 header.)
             (hdrlvl  (char-after (+ p 20))) ;header level
             thsize             ;total header size (base + extensions)
-            fnlen efnname fiddle ifnname width p2
+            fnlen efnname osid fiddle ifnname width p2
             neh        ;beginning of next extension header (level 1 and 2)
             mode modestr uid gid text dir prname
             gname uname modtime moddate)
@@ -1474,7 +1474,22 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
              (setq thsize (- neh p))))
        (if (= hdrlvl 0)  ;total header size
            (setq thsize hsize))
-       (setq fiddle  (if efnname (string= efnname (upcase efnname))))
+        ;; OS ID field not present in level 0 header, use code 0 "generic"
+        ;; in that case as per lha program header.c get_header()
+       (setq osid (cond ((= hdrlvl 0)  0)
+                         ((= hdrlvl 1)  (char-after (+ p 22 fnlen 2)))
+                         ((= hdrlvl 2)  (char-after (+ p 23)))))
+        ;; Filename fiddling must follow the lha program, otherwise the name
+        ;; passed to "lha pq" etc won't match (which for an extract silently
+        ;; results in no output).  As of version 1.14i it goes from the OS ID,
+        ;; - For 'M' MSDOS: msdos_to_unix_filename() downcases always, and
+        ;;   converts "\" to "/".
+        ;; - For 0 generic: generic_to_unix_filename() downcases if there's
+        ;;   no lower case already present, and converts "\" to "/".
+        ;; - For 'm' MacOS: macos_to_unix_filename() changes "/" to ":" and
+        ;;   ":" to "/"
+       (setq fiddle (cond ((= ?M osid) t)
+                           ((= 0 osid)  (string= efnname (upcase efnname)))))
        (setq ifnname (if fiddle (downcase efnname) efnname))
        (setq prname (if dir (concat dir ifnname) ifnname))
        (setq width (if prname (string-width prname) 0))