diff -p -up mc-4.6.2/edit/edit.c.xz~ mc-4.6.2/edit/edit.c --- mc-4.6.2/edit/edit.c.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/edit/edit.c 2009-02-04 11:37:43.915939133 -0500 @@ -186,7 +186,9 @@ static const struct edit_filters { } all_filters[] = { { "bzip2 -cd %s 2>&1", "bzip2 > %s", ".bz2" }, { "gzip -cd %s 2>&1", "gzip > %s", ".gz" }, - { "gzip -cd %s 2>&1", "gzip > %s", ".Z" } + { "gzip -cd %s 2>&1", "gzip > %s", ".Z" }, + { "lzma -cd %s 2>&1", "lzma > %s", ".lzma" }, + { "xz -cd %s 2>&1", "xz > %s", ".xz" } }; /* Return index of the filter or -1 is there is no appropriate filter */ diff -p -up mc-4.6.2/lib/mc.ext.in.xz~ mc-4.6.2/lib/mc.ext.in --- mc-4.6.2/lib/mc.ext.in.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/lib/mc.ext.in 2009-02-04 11:37:20.656148483 -0500 @@ -119,6 +119,16 @@ regex/\.t(ar\.bz2|bz|b2)$ Open=%cd %p#utar View=%view{ascii} bzip2 -dc %f 2>/dev/null | tar tvvf - +# .tar.lzma, .tlz +regex/\.t(ar\.lzma|lz)$ + Open=%cd %p#utar + View=%view{ascii} lzma -dc %f 2>/dev/null | tar tvvf - + +# .tar.xz, .txz +regex/\.t(ar\.xz|xz)$ + Open=%cd %p#utar + View=%view{ascii} xz -dc %f 2>/dev/null | tar tvvf - + # .tar.F - used in QNX regex/\.tar\.F$ # Open=%cd %p#utar @@ -298,6 +308,14 @@ regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*| Open=case %d/%f in */log/*|*/logs/*) bzip2 -dc %f ;; *) bzip2 -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac | %var{PAGER:more} View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) bzip2 -dc %f ;; *) bzip2 -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lzma$ + Open=case %d/%f in */log/*|*/logs/*) lzma -dc %f ;; *) lzma -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac | %var{PAGER:more} + View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) lzma -dc %f ;; *) lzma -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac + +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.xz$ + Open=case %d/%f in */log/*|*/logs/*) xz -dc %f ;; *) xz -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac | %var{PAGER:more} + View=%view{ascii,nroff} case %d/%f in */log/*|*/logs/*) xz -dc %f ;; *) xz -dc %f | nroff @MAN_FLAGS@ @MANDOC@ ;; esac + ### Images ### @@ -545,6 +563,15 @@ type/^compress Open=gzip -dc %f | %var{PAGER:more} View=%view{ascii} gzip -dc %f 2>/dev/null +# lzma +regex/\.lzma$ + Open=lzma -dc %f | %var{PAGER:more} + View=%view{ascii} lzma -dc %f 2>/dev/null + +# xz +regex/\.xz$ + Open=xz -dc %f | %var{PAGER:more} + View=%view{ascii} xz -dc %f 2>/dev/null ### Default ### diff -p -up mc-4.6.2/src/util.c.xz~ mc-4.6.2/src/util.c --- mc-4.6.2/src/util.c.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/src/util.c 2009-02-04 11:37:20.657147284 -0500 @@ -947,7 +947,7 @@ get_current_wd (char *buffer, int size) enum compression_type get_compression_type (int fd) { - unsigned char magic[4]; + unsigned char magic[16]; /* Read the magic signature */ if (mc_read (fd, (char *) magic, 4) != 4) @@ -991,6 +991,36 @@ get_compression_type (int fd) return COMPRESSION_BZIP2; } } + + /* LZMA files; both LZMA_Alone and LZMA utils formats. The LZMA_Alone + * format is used by the LZMA_Alone tool from LZMA SDK. The LZMA utils + * format is the default format of LZMA utils 4.32.1 and later. */ + if (magic[0] < 0xE1 || (magic[0] == 0xFF && magic[1] == 'L' && + magic[2] == 'Z' && magic[3] == 'M')) { + if (mc_read (fd, (char *) magic + 4, 9) == 9) { + /* LZMA utils format */ + if (magic[0] == 0xFF && magic[4] == 'A' && magic[5] == 0x00) + return COMPRESSION_LZMA; + /* The LZMA_Alone format has no magic bytes, thus we + * need to play a wizard. This can give false positives, + * thus the detection below should be removed when + * the newer LZMA utils format has got popular. */ + if (magic[0] < 0xE1 && magic[4] < 0x20 && + ((magic[10] == 0x00 && magic[11] == 0x00 && + magic[12] == 0x00) || + (magic[5] == 0xFF && magic[6] == 0xFF && + magic[7] == 0xFF && magic[8] == 0xFF && + magic[9] == 0xFF && magic[10] == 0xFF && + magic[11] == 0xFF && magic[12] == 0xFF))) + return COMPRESSION_LZMA; + } + } + + /* XZ (aka LZMA 2) files */ + if ((magic[0] == 0xFD) && (magic[1] == '7') && (magic[2] == 'z') && + (magic[3] >= 'X') && (magic[4] <= 'z') && (magic[5] == 0x00)) + return COMPRESSION_XZ; + return 0; } @@ -1001,6 +1031,8 @@ decompress_extension (int type) case COMPRESSION_GZIP: return "#ugz"; case COMPRESSION_BZIP: return "#ubz"; case COMPRESSION_BZIP2: return "#ubz2"; + case COMPRESSION_LZMA: return "#ulzma"; + case COMPRESSION_XZ: return "#uxz"; } /* Should never reach this place */ fprintf (stderr, "Fatal: decompress_extension called with an unknown argument\n"); diff -p -up mc-4.6.2/src/util.h.xz~ mc-4.6.2/src/util.h --- mc-4.6.2/src/util.h.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/src/util.h 2009-02-04 11:37:20.657147284 -0500 @@ -178,7 +178,9 @@ enum compression_type { COMPRESSION_NONE, COMPRESSION_GZIP, COMPRESSION_BZIP, - COMPRESSION_BZIP2 + COMPRESSION_BZIP2, + COMPRESSION_LZMA, + COMPRESSION_XZ }; /* Looks for ``magic'' bytes at the start of the VFS file to guess the diff -p -up mc-4.6.2/vfs/extfs/iso9660.in.xz~ mc-4.6.2/vfs/extfs/iso9660.in --- mc-4.6.2/vfs/extfs/iso9660.in.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/vfs/extfs/iso9660.in 2009-02-04 11:37:20.657147284 -0500 @@ -31,6 +31,8 @@ mcisofs_list () { case "$1" in *.bz2) MYCAT="bzip2 -dc";; *.gz) MYCAT="gzip -dc";; + *.lzma) MYCAT="lzma -dc";; + *.xz) MYCAT="xz -dc";; *.z) MYCAT="gzip -dc";; *.Z) MYCAT="gzip -dc";; *) MYCAT="cat";; diff -p -up mc-4.6.2/vfs/extfs/lslR.in.xz~ mc-4.6.2/vfs/extfs/lslR.in --- mc-4.6.2/vfs/extfs/lslR.in.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/vfs/extfs/lslR.in 2009-02-04 11:37:20.657147284 -0500 @@ -14,6 +14,8 @@ mclslRfs_list () { case "$1" in *.bz2) MYCAT="bzip2 -dc";; *.gz) MYCAT="gzip -dc";; + *.lzma) MYCAT="lzma -dc";; + *.xz) MYCAT="xz -dc";; *.z) MYCAT="gzip -dc";; *.Z) MYCAT="gzip -dc";; *) MYCAT="cat";; diff -p -up mc-4.6.2/vfs/extfs/mailfs.in.xz~ mc-4.6.2/vfs/extfs/mailfs.in --- mc-4.6.2/vfs/extfs/mailfs.in.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/vfs/extfs/mailfs.in 2009-02-04 11:37:20.658147062 -0500 @@ -7,6 +7,8 @@ use bytes; $zcat="zcat"; # gunzip to stdout $bzcat="bzip2 -dc"; # bunzip2 to stdout +$lzcat="lzma -dc"; # unlzma to stdout +$xz="xz -dc"; # unxz to stdout $file="file"; # "file" command $TZ='GMT'; # default timezone (for Date module) @@ -182,6 +184,10 @@ if (/gzip/) { exit 1 unless (open IN, "$zcat $mbox_qname|"); } elsif (/bzip/) { exit 1 unless (open IN, "$bzcat $mbox_qname|"); +} elsif (/lzma/) { + exit 1 unless (open IN, "$lzcat $mbox_qname|"); +} elsif (/xz/) { + exit 1 unless (open IN, "$xzcat $mbox_qname|"); } else { exit 1 unless (open IN, "<$mbox_name"); } diff -p -up mc-4.6.2/vfs/extfs/patchfs.in.xz~ mc-4.6.2/vfs/extfs/patchfs.in --- mc-4.6.2/vfs/extfs/patchfs.in.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/vfs/extfs/patchfs.in 2009-02-04 11:37:20.658147062 -0500 @@ -14,6 +14,8 @@ use File::Temp 'tempfile'; # standard binaries my $bzip = 'bzip2'; my $gzip = 'gzip'; +my $lzma = 'lzma'; +my $xz = 'xz'; my $fileutil = 'file'; # date parsing requires Date::Parse from TimeDate module @@ -74,6 +76,10 @@ sub myin return "$bzip -dc $qfname"; } elsif (/gzip/) { return "$gzip -dc $qfname"; + } elsif (/lzma/) { + return "$lzma -dc $qfname"; + } elsif (/xz/) { + return "$xz -dc $qfname"; } else { return "cat $qfname"; } @@ -90,6 +96,10 @@ sub myout return "$bzip -c $sep $qfname"; } elsif (/gzip/) { return "$gzip -c $sep $qfname"; + } elsif (/lzma/) { + return "$lzma -c $sep $qfname"; + } elsif (/xz/) { + return "$xz -c $sep $qfname"; } else { return "cat $sep $qfname"; } diff -p -up mc-4.6.2/vfs/extfs/sfs.ini.xz~ mc-4.6.2/vfs/extfs/sfs.ini --- mc-4.6.2/vfs/extfs/sfs.ini.xz~ 2009-02-01 13:46:18.000000000 -0500 +++ mc-4.6.2/vfs/extfs/sfs.ini 2009-02-04 11:37:20.658147062 -0500 @@ -10,8 +10,12 @@ bz/1 bzip < %1 > %3 ubz/1 bzip -d < %1 > %3 bz2/1 bzip2 < %1 > %3 ubz2/1 bzip2 -d < %1 > %3 +lzma/1 lzma < %1 > %3 +ulzma/1 lzma -d < %1 > %3 tar/1 tar cf %3 %1 tgz/1 tar czf %3 %1 +xz/1 xz < %1 > %3 +uxz/1 xz -d < %1 > %3 uhtml/1 lynx -force_html -dump %1 > %3 uman/1 groff -Tascii -man %1 > %3 uue/1 uuenpipe < %1 > %3