///////////////////////////////////////////////////////////////////////////////
//
/// \file       help.c
/// \brief      Help messages
//
//  Copyright (C) 2007 Lasse Collin
//
//  This program is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
///////////////////////////////////////////////////////////////////////////////

#include "private.h"


extern void
show_try_help(void)
{
	// Print this with V_WARNING instead of V_ERROR to prevent it from
	// showing up when --quiet has been specified.
	errmsg(V_WARNING, _("Try `%s --help' for more information."), argv0);
	return;
}


extern void lzma_attribute((noreturn))
show_help(void)
{
	printf(_("Usage: %s [OPTION]... [FILE]...\n"
			"Compress or decompress FILEs in the .lzma format.\n"
			"\n"), argv0);

	puts(_("Mandatory arguments to long options are mandatory for "
			"short options too.\n"));

	puts(_(
" Operation mode:\n"
"\n"
"  -z, --compress      force compression\n"
"  -d, --decompress    force decompression\n"
"  -t, --test          test compressed file integrity\n"
"  -l, --list          list block sizes, total sizes, and possible metadata\n"
));

	puts(_(
" Operation modifiers:\n"
"\n"
"  -k, --keep          keep (don't delete) input files\n"
"  -f, --force         force overwrite of output file and (de)compress links\n"
"  -c, --stdout        write to standard output and don't delete input files\n"
"  -S, --suffix=.SUF   use suffix `.SUF' on compressed files instead of `.lzma'\n"
"  -F, --format=FMT    file format to encode or decode; possible values are\n"
"                      `auto', `native', `single', `multi', and `alone'\n"
"      --files=[FILE]  read filenames to process from FILE; if FILE is\n"
"                      omitted, filenames are read from the standard input;\n"
"                      filenames must be terminated with the newline character\n"
"      --files0=[FILE] like --files but use the nul byte as terminator\n"
));

	puts(_(
" Compression presets and basic compression options:\n"
"\n"
"  -1 .. -2            fast compression\n"
"  -3 .. -6            good compression\n"
"  -7 .. -9            excellent compression, but needs a lot of memory;\n"
"                      default is -7 if memory limit allows\n"
"\n"
"  -C, --check=CHECK   integrity check type: `crc32', `crc64' (default),\n"
"                      or `sha256'\n"
));

	puts(_(
" Custom filter chain for compression (alternative for using presets):\n"
"\n"
"  --lzma=[OPTS]       LZMA filter; OPTS is a comma-separated list of zero or\n"
"                      more of the following options (valid values; default):\n"
"                        dict=NUM   dictionary size in bytes (1 - 1Gi; 8Mi)\n"
"                        lc=NUM     number of literal context bits (0-8; 3)\n"
"                        lp=NUM     number of literal position bits (0-4; 0)\n"
"                        pb=NUM     number of position bits (0-4; 2)\n"
"                        mode=MODE  compression mode (`fast' or `best'; `best')\n"
"                        fb=NUM     number of fast bytes (5-273; 128)\n"
"                        mf=NAME    match finder (hc3, hc4, bt2, bt3, bt4; bt4)\n"
"                        mfc=NUM    match finder cycles; 0=automatic (default)\n"
"\n"
"  --x86               x86 filter (sometimes called BCJ filter)\n"
"  --powerpc           PowerPC (big endian) filter\n"
"  --ia64              IA64 (Itanium) filter\n"
"  --arm               ARM filter\n"
"  --armthumb          ARM-Thumb filter\n"
"  --sparc             SPARC filter\n"
"\n"
"  --delta=[OPTS]      Delta filter; valid OPTS (valid values; default):\n"
"                        distance=NUM  Distance between bytes being\n"
"                                      subtracted from each other (1-256; 1)\n"
"\n"
"  --copy              No filtering (useful only when specified alone)\n"
"  --subblock=[OPTS]   Subblock filter; valid OPTS (valid values; default):\n"
"                        size=NUM    number of bytes of data per subblock\n"
"                                    (1 - 256Mi; 4Ki)\n"
"                        rle=NUM     run-length encoder chunk size (0-256; 0)\n"
));

/*
These aren't implemented yet.

	puts(_(
" Metadata options:\n"
"\n"
"  -N, --name          save or restore the original filename and time stamp\n"
"  -n, --no-name       do not save or restore filename and time stamp (default)\n"
"  -S, --sign=KEY      sign the data with GnuPG when compressing, or verify\n"
"                      the signature when decompressing\n"));
*/

	puts(_(
" Resource usage options:\n"
"\n"
"  -M, --memory=NUM    use roughly NUM bytes of memory at maximum\n"
"  -T, --threads=NUM   use at maximum of NUM (de)compression threads\n"
// "      --threading=STR threading style; possible values are `auto' (default),\n"
// "                      `files', and `stream'
));

	puts(_(
" Other options:\n"
"\n"
"  -q, --quiet         suppress warnings; specify twice to suppress errors too\n"
"  -v, --verbose       be verbose; specify twice for even more verbose\n"
"\n"
"  -h, --help          display this help and exit\n"
"  -V, --version       display version and license information and exit\n"));

	puts(_("With no FILE, or when FILE is -, read standard input.\n"));

	size_t mem_limit = opt_memory / (1024 * 1024);
	if (mem_limit == 0)
		mem_limit = 1;

	// We use PRIu64 instead of %zu to support pre-C99 libc.
	puts(_("On this system and configuration, the tool will use"));
	printf(_("  * roughly %" PRIu64 " MiB of memory at maximum; and\n"),
			(uint64_t)(mem_limit));
	printf(N_("  * at maximum of one thread for (de)compression.\n\n",
		"  * at maximum of %" PRIu64
		" threads for (de)compression.\n\n",
		(uint64_t)(opt_threads)), (uint64_t)(opt_threads));

	printf(_("Report bugs to <%s> (in English or Finnish).\n"),
			PACKAGE_BUGREPORT);

	my_exit(SUCCESS);
}


extern void lzma_attribute((noreturn))
show_version(void)
{
	printf(
"lzma (LZMA Utils) " PACKAGE_VERSION "\n"
"\n"
"Copyright (C) 1999-2006 Igor Pavlov\n"
"Copyright (C) 2007 Lasse Collin\n"
"\n"
"This program is free software; you can redistribute it and/or modify\n"
"it under the terms of the GNU General Public License as published by\n"
"the Free Software Foundation; either version 2 of the License, or\n"
"(at your option) any later version.\n"
"\n"
"This program is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
"GNU General Public License for more details.\n"
"\n");
	my_exit(SUCCESS);
}
