| Index: xz/src/liblzma/common/vli_encoder.c
|
| ===================================================================
|
| --- xz/src/liblzma/common/vli_encoder.c (revision 0)
|
| +++ xz/src/liblzma/common/vli_encoder.c (revision 0)
|
| @@ -0,0 +1,69 @@
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +//
|
| +/// \file vli_encoder.c
|
| +/// \brief Encodes variable-length integers
|
| +//
|
| +// Author: Lasse Collin
|
| +//
|
| +// This file has been put into the public domain.
|
| +// You can do whatever you want with this file.
|
| +//
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +#include "common.h"
|
| +
|
| +
|
| +extern LZMA_API(lzma_ret)
|
| +lzma_vli_encode(lzma_vli vli, size_t *vli_pos,
|
| + uint8_t *restrict out, size_t *restrict out_pos,
|
| + size_t out_size)
|
| +{
|
| + // If we haven't been given vli_pos, work in single-call mode.
|
| + size_t vli_pos_internal = 0;
|
| + if (vli_pos == NULL) {
|
| + vli_pos = &vli_pos_internal;
|
| +
|
| + // In single-call mode, we expect that the caller has
|
| + // reserved enough output space.
|
| + if (*out_pos >= out_size)
|
| + return LZMA_PROG_ERROR;
|
| + } else {
|
| + // This never happens when we are called by liblzma, but
|
| + // may happen if called directly from an application.
|
| + if (*out_pos >= out_size)
|
| + return LZMA_BUF_ERROR;
|
| + }
|
| +
|
| + // Validate the arguments.
|
| + if (*vli_pos >= LZMA_VLI_BYTES_MAX || vli > LZMA_VLI_MAX)
|
| + return LZMA_PROG_ERROR;
|
| +
|
| + // Shift vli so that the next bits to encode are the lowest. In
|
| + // single-call mode this never changes vli since *vli_pos is zero.
|
| + vli >>= *vli_pos * 7;
|
| +
|
| + // Write the non-last bytes in a loop.
|
| + while (vli >= 0x80) {
|
| + // We don't need *vli_pos during this function call anymore,
|
| + // but update it here so that it is ready if we need to
|
| + // return before the whole integer has been decoded.
|
| + ++*vli_pos;
|
| + assert(*vli_pos < LZMA_VLI_BYTES_MAX);
|
| +
|
| + // Write the next byte.
|
| + out[*out_pos] = (uint8_t)(vli) | 0x80;
|
| + vli >>= 7;
|
| +
|
| + if (++*out_pos == out_size)
|
| + return vli_pos == &vli_pos_internal
|
| + ? LZMA_PROG_ERROR : LZMA_OK;
|
| + }
|
| +
|
| + // Write the last byte.
|
| + out[*out_pos] = (uint8_t)(vli);
|
| + ++*out_pos;
|
| + ++*vli_pos;
|
| +
|
| + return vli_pos == &vli_pos_internal ? LZMA_OK : LZMA_STREAM_END;
|
| +
|
| +}
|
|
|
| Property changes on: xz/src/liblzma/common/vli_encoder.c
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|