/** * \file lzma/stream_flags.h * \brief .lzma Stream Header and Stream tail encoder and decoder * * \author Copyright (C) 1999-2006 Igor Pavlov * \author Copyright (C) 2007 Lasse Collin * * This library 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 library 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. */ #ifndef LZMA_H_INTERNAL # error Never include this file directly. Use instead. #endif /** * \brief Size of Stream Header * * Magic Bytes (6) + Stream Flags (1) + CRC32 (4) */ #define LZMA_STREAM_HEADER_SIZE (6 + 1 + 4) /** * \brief Size of Stream tail * * Because Stream Footer already has a defined meaning in the file format * specification, we use Stream tail to denote these two fields: * Stream Flags (1) + Magic Bytes (2) */ #define LZMA_STREAM_TAIL_SIZE (1 + 2) /** * Options for encoding and decoding Stream Header and Stream tail */ typedef struct { /** * Type of the Check calculated from uncompressed data */ lzma_check_type check; /** * True if Block Headers have the CRC32 field. Note that the CRC32 * field is always present in the Stream Header. */ lzma_bool has_crc32; /** * True if the Stream is a Multi-Block Stream. */ lzma_bool is_multi; } lzma_stream_flags; #define lzma_stream_flags_is_equal(a, b) \ ((a).check == (b).check \ && (a).has_crc32 == (b).has_crc32 \ && (a).is_multi == (b).is_multi) /** * \brief Encodes Stream Header * * Encoding of the Stream Header is done with a single call instead of * first initializing and then doing the actual work with lzma_code(). * * \param out Beginning of the output buffer * \param out_pos out[*out_pos] is the next write position. This * is updated by the encoder. * \param out_size out[out_size] is the first byte to not write. * \param options Stream Header options to be encoded. * * \return - LZMA_OK: Encoding was successful. * - LZMA_PROG_ERROR: Invalid options. * - LZMA_BUF_ERROR: Not enough output buffer space. */ extern lzma_ret lzma_stream_header_encode( uint8_t *out, const lzma_stream_flags *options); /** * \brief Encodes Stream tail * * \param footer Pointer to a pointer that will hold the * allocated buffer. Caller must free it once * it isn't needed anymore. * \param footer_size Pointer to a variable that will the final size * of the footer buffer. * \param allocator lzma_allocator for custom allocator functions. * Set to NULL to use malloc(). * \param options Stream Header options to be encoded. * * \return - LZMA_OK: Success; *header and *header_size set. * - LZMA_PROG_ERROR: *options is invalid. * - LZMA_MEM_ERROR: Cannot allocate memory. */ extern lzma_ret lzma_stream_tail_encode( uint8_t *out, const lzma_stream_flags *options); /** * \brief Initializes Stream Header decoder * * \param strm Pointer to lzma_stream used to pass input data * \param options Target structure for parsed results * * \return - LZMA_OK: Successfully initialized * - LZMA_MEM_ERROR: Cannot allocate memory * * The actual decoding is done with lzma_code() and freed with lzma_end(). */ extern lzma_ret lzma_stream_header_decoder( lzma_stream *strm, lzma_stream_flags *options); /** * \brief Initializes Stream tail decoder * * \param strm Pointer to lzma_stream used to pass input data * \param options Target structure for parsed results. * \param decode_uncompressed_size * Set to true if the first field to decode is * Uncompressed Size. Set to false if the first * field to decode is Backward Size. * * \return - LZMA_OK: Successfully initialized * - LZMA_MEM_ERROR: Cannot allocate memory * * The actual decoding is done with lzma_code() and freed with lzma_end(). */ extern lzma_ret lzma_stream_tail_decoder( lzma_stream *strm, lzma_stream_flags *options);