    p7zip 16.02
    ===========

Homepage : http://p7zip.sourceforge.net/

p7zip is a port of the Windows programs 7z.exe and 7za.exe provided by 7-zip.

7-zip is a file archiver with the highest compression ratio.
Homepage : www.7-zip.org

  7z uses plugins (7z.so and Codecs/Rar.so) to handle archives.
  7za is a stand-alone executable (7za handles less archive formats than 7z).
  7zr is a light stand-alone executable that supports only 7z/LZMA/BCJ/BCJ2.

  Some GUI :
    7zG  : beta  stage
    7zFM : alpha stage

CAUTION :
---------

- FIRST : DO NOT USE the 7-zip format for backup purpose on Linux/Unix because :
  - 7-zip does not store the owner/group of the file

  On Linux/Unix, in order to backup directories you must use tar !
  to backup a directory  : tar cf - directory | 7za a -si directory.tar.7z
  to restore your backup : 7za x -so directory.tar.7z | tar xf -

- if you want to send files and directories (not the owner of file)
  to others Unix/MacOS/Windows users, you can use the 7-zip format.

  example : 7za a directory.7z  directory

  do not use "-r" because this flag does not do what you think
  do not use "directory/*" because of ".*" files
   (example : "directory/*" does not match "directory/.profile")

USAGE:
------
  Remark : you can replace 7za with 7z.

  7za t archive.7z  : tests files in the archive archive.7z
  7za l archive.7z  : lists all files from archive archive.7z
  7za x archive.7z  : extracts all files from archive archive.7z
                   to the current directory

  7za a archive.7z file1 fileN : add files to the archive archive.7z

  7za a archive.7z  dir1 :  add all files and subdirectories from directory "dir1" to archive archive.7z

  CAUTION : do not use the flag "-r" unless you know what you are doing ...

  7za a -sfx archive.x dir1 : add all files from directory "dir1" to SFX archive archive.x

  You can also add or extract files to/from .zip or .tar archives.
  You can also compress/uncompress .gz or .bz2 files.

  7za a -tzip   archive.zip file file2 file3
  7za a -ttar   archive.tar file
  7za a -tgzip  file.gz     file
  7za a -tbzip2 archive.bz2 file

  You can use password for archives:
  7za a -pmy_password archive.7z  dir1

  For .7z archive only, you can enable archive header encryption with "-mhe"
  7za a -mhe=on -pmy_password archive.7z  dir1

  For more, see the documentation of 7za.exe in DOC/MANUAL directory
  7za a -t7z  -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z  dir1
      adds all files from directory "dir1" to archive archive.7z
      using "ultra settings".
      -t7z     : 7z archive
      -m0=lzma : lzma method
      -mx=9    : level of compression = 9 (Ultra)
      -mfb=64  : number of fast bytes for LZMA = 64
      -md=32m  : dictionary size = 32 megabytes
      -ms=on   : solid archive = on

  To use the new codec "lzma2"
  7za a -m0=lzma2 archive.7z directory


BENCHMARKS :
------------
  7za b : bench LZMA codec
  7z b -mm=crc : make internal crc check.
  7za b "-mm=*" : test all methods



hugetlbfs (large pages) :
-------------------------

  Using huges pages in Linux requires some preparations.
  First, make sure your running kernel has support for hugetlbfs compiled in:

  ~$ grep hugetlbfs /proc/filesystems
  nodev       hugetlbfs

  You can view your current huge page configuration like this:

  ~$ grep Huge /proc/meminfo
  HugePages_Total:       0
  HugePages_Free:        0
  HugePages_Rsvd:        0
  HugePages_Surp:        0
  Hugepagesize:       2048 kB

  In this case the size of a huge page is 2 MiB.
  So, if you have 2 GiB of RAM and want to reserve 512 MiB for huge pages,
  you would need 256 pages.

  Do the following as root:

  ~# echo 296 >/proc/sys/vm/nr_hugepages
  ~# grep Huge /proc/meminfo
  HugePages_Total:     296
  HugePages_Free:      296
  HugePages_Rsvd:        0
  HugePages_Surp:        0
  Hugepagesize:       2048 kB

  Finally, make access from user space possible:

  ~# mkdir /hugepages
  ~# mount -t hugetlbfs -o rw,nosuid,nodev,noexec,noatime none /hugepages
  ~# chmod 1777 /hugepages

  Option 1 : Now huge pages are configured.
           In your shell, set the environment variable HUGETLB_PATH to the mount point:
           ~$ export HUGETLB_PATH=/hugepages
  or

  Option 2 : Let p7zip find out the first directory with the type "hugetlbfs"


  To enable huge page use in p7zip, pass the '-slp' switch to it.
  Ex: 7za -slp a t.7z dir



  If you want this to be a permanent setup :
  - mkdir /hugepages

  - add an entry to your /etc/fstab so that when you reboot your computer,
    your hugetlbfs will mount automatically :
    hugetlbfs       /hugepages  hugetlbfs     rw,nosuid,nodev,noexec,noatime   0 0

  - add this in your /etc/rc.local :
    chmod 1777 /hugepages
    echo 296 >  /proc/sys/vm/nr_hugepages

  optional : export HUGETLB_PATH=/hugepages

  To enable huge page use in p7zip, pass the '-slp' switch to it : 7za -slp b


  Remark : with current CPU : "7za -slp b" is not faster than "7za b".
           If you want to see some speedup, compress at least 300MB
           Ex : 7za -slp -mx=9 -a big_file.tar.7z  big_file.tar


LICENSE :
---------
  please read copyright file.

LIMITATIONS from 7-zip :
------------------------

  - does not support uid/gid for the .tar format (so, use tar on Unix)

LIMITATIONS for Unix version only :
-----------------------------------

  - can handle properly UNICODE filenames only if the environment is UTF-8.
  Example : export LANG=en_US.UTF-8 ; unset LC_CTYPE
  Remark  : see the possible values for LANG in the directory
            - /usr/lib/locale   : Fedora 2 / Solaris 8
            - /usr/share/locale : OpenBSD / Debian / FreeBSD / MacOS X / Mandrake 10.1 / NetBSD

    On Linux, to display the available locales : locale -a

  p7zip relies on LC_CTYPE and then on LANG to convert name to/from UNICODE.
  the command "locale" should display these environment variables.
  you can also do "echo $LC_CTYPE" and "echo $LANG".

  If you do not plan to export your archive, you can use the flag "-no-utf16".
  Usage :
    7za a -no-utf16 archive.7z dirOrFile1 ... dirOrFileN
    7za t -no-utf16 archive.7z
    7za l -no-utf16 archive.7z
    7za x -no-utf16 archive.7z

  - ignores Windows file access permissions (files are created with default permissions)

  see also TODO file.

DEVELOPPER CORNER:
------------------

  - static analysis with cppcheck
    make cppcheck

  - static analysis with clang
    scan-build make all4 2>&1 | tee -i scan-build.out

  - dynamic analysis : valgrind
    cp makefile.linux_valgrind makefile.machine
    make test
    
  - dynamic analysis : gcc sanitize
    cp makefile.linux_amd64_sanitizer makefile.machine
    make test

  - WaitForMultipleObject has no equivalence on Unix.
  - Events don't exist.
  - sizeof(wchar_t) = 4 with GCC (2 with MS VC++)
  - "FIXME" in source code indicates that you should add codes to better handle all cases.

  - "FIXED" in source code indicates that the original code has been changed to work in Unix environment.

  see also TODO file.
