aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/api/lzma/stream_flags.h
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2008-06-18 18:02:10 +0300
committerLasse Collin <lasse.collin@tukaani.org>2008-06-18 18:02:10 +0300
commit7d17818cec8597f847b0a2537fde991bbc3d9e96 (patch)
tree9c41502e3eb96f103fe98e13456b382fbba7a292 /src/liblzma/api/lzma/stream_flags.h
parentUpdate the file format specification draft. The new one is (diff)
downloadxz-7d17818cec8597f847b0a2537fde991bbc3d9e96.tar.xz
Update the code to mostly match the new simpler file format
specification. Simplify things by removing most of the support for known uncompressed size in most places. There are some miscellaneous changes here and there too. The API of liblzma has got many changes and still some more will be done soon. While most of the code has been updated, some things are not fixed (the command line tool will choke with invalid filter chain, if nothing else). Subblock filter is somewhat broken for now. It will be updated once the encoded format of the Subblock filter has been decided.
Diffstat (limited to 'src/liblzma/api/lzma/stream_flags.h')
-rw-r--r--src/liblzma/api/lzma/stream_flags.h146
1 files changed, 69 insertions, 77 deletions
diff --git a/src/liblzma/api/lzma/stream_flags.h b/src/liblzma/api/lzma/stream_flags.h
index 070c91c9..f4c5c335 100644
--- a/src/liblzma/api/lzma/stream_flags.h
+++ b/src/liblzma/api/lzma/stream_flags.h
@@ -1,6 +1,6 @@
/**
* \file lzma/stream_flags.h
- * \brief .lzma Stream Header and Stream tail encoder and decoder
+ * \brief .lzma Stream Header and Stream Footer encoder and decoder
*
* \author Copyright (C) 1999-2006 Igor Pavlov
* \author Copyright (C) 2007 Lasse Collin
@@ -22,121 +22,113 @@
/**
- * \brief Size of Stream Header
+ * \brief Size of Stream Header and Stream Footer
*
- * Magic Bytes (6) + Stream Flags (1) + CRC32 (4)
+ * Stream Header and Stream Footer have the same size and they are not
+ * going to change even if a newer version of the .lzma file format is
+ * developed in future.
*/
-#define LZMA_STREAM_HEADER_SIZE (6 + 1 + 4)
+#define LZMA_STREAM_HEADER_SIZE 12
/**
- * \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
+ * Options for encoding and decoding Stream Header and Stream Footer
*/
typedef struct {
/**
- * Type of the Check calculated from uncompressed data
+ * Backward Size must be a multiple of four bytes. In this Stream
+ * format version Backward Size is the size of the Index field.
*/
- lzma_check_type check;
+ lzma_vli backward_size;
+# define LZMA_BACKWARD_SIZE_MIN 4
+# define LZMA_BACKWARD_SIZE_MAX (LZMA_VLI_C(1) << 34)
/**
- * 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.
+ * Type of the Check calculated from uncompressed data
*/
- lzma_bool is_multi;
+ lzma_check_type check;
} 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().
+ * \brief Encode Stream Header
*
- * \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 out Beginning of the output buffer of
+ * LZMA_STREAM_HEADER_SIZE bytes.
* \param options Stream Header options to be encoded.
+ * options->index_size is ignored and doesn't
+ * need to be initialized.
*
* \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);
+ const lzma_stream_flags *options, uint8_t *out);
/**
- * \brief Encodes Stream tail
+ * \brief Encode Stream Footer
*
- * \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.
+ * \param out Beginning of the output buffer of
+ * LZMA_STREAM_HEADER_SIZE bytes.
+ * \param options Stream Footer 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.
+ * \return - LZMA_OK: Encoding was successful.
+ * - LZMA_PROG_ERROR: Invalid options.
*/
-extern lzma_ret lzma_stream_tail_encode(
- uint8_t *out, const lzma_stream_flags *options);
+extern lzma_ret lzma_stream_footer_encode(
+ const lzma_stream_flags *options, uint8_t *out);
/**
- * \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
+ * \brief Decode Stream Header
*
- * The actual decoding is done with lzma_code() and freed with lzma_end().
+ * \param options Stream Header options to be encoded.
+ * \param in Beginning of the input buffer of
+ * LZMA_STREAM_HEADER_SIZE bytes.
+ *
+ * options->index_size is always set to LZMA_VLI_VALUE_UNKNOWN. This is to
+ * help comparing Stream Flags from Stream Header and Stream Footer with
+ * lzma_stream_flags_equal().
+ *
+ * \return - LZMA_OK: Decoding was successful.
+ * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given
+ * buffer cannot be Stream Header.
+ * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the header
+ * is corrupt.
+ * - LZMA_HEADER_ERROR: Unsupported options are present
+ * in the header.
*/
-extern lzma_ret lzma_stream_header_decoder(
- lzma_stream *strm, lzma_stream_flags *options);
+extern lzma_ret lzma_stream_header_decode(
+ lzma_stream_flags *options, const uint8_t *in);
/**
- * \brief Initializes Stream tail decoder
+ * \brief Decode Stream Footer
*
- * \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.
+ * \param options Stream Header options to be encoded.
+ * \param in Beginning of the input buffer of
+ * LZMA_STREAM_HEADER_SIZE bytes.
+ *
+ * \return - LZMA_OK: Decoding was successful.
+ * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given
+ * buffer cannot be Stream Footer.
+ * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the footer
+ * is corrupt.
+ * - LZMA_HEADER_ERROR: Unsupported options are present
+ * in the footer.
+ */
+extern lzma_ret lzma_stream_footer_decode(
+ lzma_stream_flags *options, const uint8_t *in);
+
+
+/**
+ * \brief Compare two lzma_stream_flags structures
*
- * \return - LZMA_OK: Successfully initialized
- * - LZMA_MEM_ERROR: Cannot allocate memory
+ * index_size values are compared only if both are not LZMA_VLI_VALUE_UNKNOWN.
*
- * The actual decoding is done with lzma_code() and freed with lzma_end().
+ * \return true if both structures are considered equal; false otherwise.
*/
-extern lzma_ret lzma_stream_tail_decoder(
- lzma_stream *strm, lzma_stream_flags *options);
+extern lzma_bool lzma_stream_flags_equal(
+ const lzma_stream_flags *a, lzma_stream_flags *b);