liblzma: Add generic support for input seeking (LZMA_SEEK).

Also mention LZMA_SEEK in xz/message.c to silence a warning.
This commit is contained in:
Lasse Collin 2017-03-30 20:00:09 +03:00
parent a0b1dda409
commit a27920002d
3 changed files with 42 additions and 2 deletions

View File

@ -234,6 +234,23 @@ typedef enum {
* can be a sign of a bug in liblzma. See the documentation * can be a sign of a bug in liblzma. See the documentation
* how to report bugs. * how to report bugs.
*/ */
LZMA_SEEK = 12
/**<
* \brief Request to change the input file position
*
* Some coders can do random access in the input file. The
* initialization functions of these coders take the file size
* as an argument. No other coders can return LZMA_SEEK.
*
* When this value is returned, the application must seek to
* the file position given in lzma_stream.seek_in. This value
* is guaranteed to never exceed the file size that was
* specified at the coder initialization.
*
* After seeking the application should read new input and
* pass it normally via lzma_stream.next_in and .avail_in.
*/
} lzma_ret; } lzma_ret;
@ -514,7 +531,19 @@ typedef struct {
void *reserved_ptr2; void *reserved_ptr2;
void *reserved_ptr3; void *reserved_ptr3;
void *reserved_ptr4; void *reserved_ptr4;
uint64_t reserved_int1;
/**
* \brief New seek input position for LZMA_SEEK
*
* When lzma_code() returns LZMA_SEEK, the new input position needed
* by liblzma will be available seek_in. The value is guaranteed to
* not exceed the file size that was specified when this lzma_stream
* was initialized.
*
* In all other situations the value of this variable is undefined.
*/
uint64_t seek_in;
uint64_t reserved_int2; uint64_t reserved_int2;
size_t reserved_int3; size_t reserved_int3;
size_t reserved_int4; size_t reserved_int4;

View File

@ -207,7 +207,6 @@ lzma_code(lzma_stream *strm, lzma_action action)
|| strm->reserved_ptr2 != NULL || strm->reserved_ptr2 != NULL
|| strm->reserved_ptr3 != NULL || strm->reserved_ptr3 != NULL
|| strm->reserved_ptr4 != NULL || strm->reserved_ptr4 != NULL
|| strm->reserved_int1 != 0
|| strm->reserved_int2 != 0 || strm->reserved_int2 != 0
|| strm->reserved_int3 != 0 || strm->reserved_int3 != 0
|| strm->reserved_int4 != 0 || strm->reserved_int4 != 0
@ -318,6 +317,17 @@ lzma_code(lzma_stream *strm, lzma_action action)
ret = LZMA_OK; ret = LZMA_OK;
break; break;
case LZMA_SEEK:
strm->internal->allow_buf_error = false;
// If LZMA_FINISH was used, reset it back to the
// LZMA_RUN-based state so that new input can be supplied
// by the application.
if (strm->internal->sequence == ISEQ_FINISH)
strm->internal->sequence = ISEQ_RUN;
break;
case LZMA_STREAM_END: case LZMA_STREAM_END:
if (strm->internal->sequence == ISEQ_SYNC_FLUSH if (strm->internal->sequence == ISEQ_SYNC_FLUSH
|| strm->internal->sequence == ISEQ_FULL_FLUSH || strm->internal->sequence == ISEQ_FULL_FLUSH

View File

@ -818,6 +818,7 @@ message_strm(lzma_ret code)
case LZMA_STREAM_END: case LZMA_STREAM_END:
case LZMA_GET_CHECK: case LZMA_GET_CHECK:
case LZMA_PROG_ERROR: case LZMA_PROG_ERROR:
case LZMA_SEEK:
// Without "default", compiler will warn if new constants // Without "default", compiler will warn if new constants
// are added to lzma_ret, it is not too easy to forget to // are added to lzma_ret, it is not too easy to forget to
// add the new constants to this function. // add the new constants to this function.