liblzma: Add .lz support to lzma_auto_decoder().
Thanks to Michał Górny for the original patch.
This commit is contained in:
parent
0538db038f
commit
034086e1ae
|
@ -700,11 +700,13 @@ extern LZMA_API(lzma_ret) lzma_stream_decoder_mt(
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Decode .xz Streams and .lzma files with autodetection
|
* \brief Decode .xz, .lzma, and .lz (lzip) files with autodetection
|
||||||
*
|
*
|
||||||
* This decoder autodetects between the .xz and .lzma file formats, and
|
* This decoder autodetects between the .xz, .lzma, and .lz file formats,
|
||||||
* calls lzma_stream_decoder() or lzma_alone_decoder() once the type
|
* and calls lzma_stream_decoder(), lzma_alone_decoder(), or
|
||||||
* of the input file has been detected.
|
* lzma_lzip_decoder() once the type of the input file has been detected.
|
||||||
|
*
|
||||||
|
* Support for .lz was added in 5.4.0.
|
||||||
*
|
*
|
||||||
* If the flag LZMA_CONCATENATED is used and the input is a .lzma file:
|
* If the flag LZMA_CONCATENATED is used and the input is a .lzma file:
|
||||||
* For historical reasons concatenated .lzma files aren't supported.
|
* For historical reasons concatenated .lzma files aren't supported.
|
||||||
|
|
|
@ -97,6 +97,7 @@ endif
|
||||||
|
|
||||||
if COND_LZIP_DECODER
|
if COND_LZIP_DECODER
|
||||||
liblzma_la_SOURCES += \
|
liblzma_la_SOURCES += \
|
||||||
common/lzip_decoder.c
|
common/lzip_decoder.c \
|
||||||
|
common/lzip_decoder.h
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file auto_decoder.c
|
/// \file auto_decoder.c
|
||||||
/// \brief Autodetect between .xz Stream and .lzma (LZMA_Alone) formats
|
/// \brief Autodetect between .xz, .lzma (LZMA_Alone), and .lz (lzip)
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// Author: Lasse Collin
|
||||||
//
|
//
|
||||||
|
@ -12,10 +12,13 @@
|
||||||
|
|
||||||
#include "stream_decoder.h"
|
#include "stream_decoder.h"
|
||||||
#include "alone_decoder.h"
|
#include "alone_decoder.h"
|
||||||
|
#ifdef HAVE_LZIP_DECODER
|
||||||
|
# include "lzip_decoder.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Stream decoder or LZMA_Alone decoder
|
/// .xz Stream decoder, LZMA_Alone decoder, or lzip decoder
|
||||||
lzma_next_coder next;
|
lzma_next_coder next;
|
||||||
|
|
||||||
uint64_t memlimit;
|
uint64_t memlimit;
|
||||||
|
@ -46,14 +49,22 @@ auto_decode(void *coder_ptr, const lzma_allocator *allocator,
|
||||||
// SEQ_CODE even if we return some LZMA_*_CHECK.
|
// SEQ_CODE even if we return some LZMA_*_CHECK.
|
||||||
coder->sequence = SEQ_CODE;
|
coder->sequence = SEQ_CODE;
|
||||||
|
|
||||||
// Detect the file format. For now this is simple, since if
|
// Detect the file format. .xz files start with 0xFD which
|
||||||
// it doesn't start with 0xFD (the first magic byte of the
|
// cannot be the first byte of .lzma (LZMA_Alone) format.
|
||||||
// new format), it has to be LZMA_Alone, or something that
|
// The .lz format starts with 0x4C which could be the
|
||||||
// we don't support at all.
|
// first byte of a .lzma file but luckily it would mean
|
||||||
|
// lc/lp/pb being 4/3/1 which liblzma doesn't support because
|
||||||
|
// lc + lp > 4. So using just 0x4C to detect .lz is OK here.
|
||||||
if (in[*in_pos] == 0xFD) {
|
if (in[*in_pos] == 0xFD) {
|
||||||
return_if_error(lzma_stream_decoder_init(
|
return_if_error(lzma_stream_decoder_init(
|
||||||
&coder->next, allocator,
|
&coder->next, allocator,
|
||||||
coder->memlimit, coder->flags));
|
coder->memlimit, coder->flags));
|
||||||
|
#ifdef HAVE_LZIP_DECODER
|
||||||
|
} else if (in[*in_pos] == 0x4C) {
|
||||||
|
return_if_error(lzma_lzip_decoder_init(
|
||||||
|
&coder->next, allocator,
|
||||||
|
coder->memlimit, coder->flags));
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
return_if_error(lzma_alone_decoder_init(&coder->next,
|
return_if_error(lzma_alone_decoder_init(&coder->next,
|
||||||
allocator, coder->memlimit, true));
|
allocator, coder->memlimit, true));
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
/// \file lzip_decoder.h
|
||||||
|
/// \brief Decodes .lz (lzip) files
|
||||||
|
//
|
||||||
|
// Author: Michał Górny
|
||||||
|
//
|
||||||
|
// This file has been put into the public domain.
|
||||||
|
// You can do whatever you want with this file.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef LZMA_LZIP_DECODER_H
|
||||||
|
#define LZMA_LZIP_DECODER_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
extern lzma_ret lzma_lzip_decoder_init(
|
||||||
|
lzma_next_coder *next, const lzma_allocator *allocator,
|
||||||
|
uint64_t memlimit, uint32_t flags);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue