/*
WARNING: This file was generated by dkct.
Changes you make here will be lost if dkct is run again!
You should modify the original source and run dkct on it.
Original source: dk4lzwe.ctr
*/
/*
Copyright (C) 2016-2017, Dirk Krause
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above opyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the author nor the names of contributors may be used
to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef DK4LZWE_H_INCLUDED
/** Avoid multiple inclusions. */
#define DK4LZWE_H_INCLUDED 1
#line 8 "dk4lzwe.ctr"
/** @file dk4lzwe.h LZW encoder to produce PS level 2 output.
- The unit length (input data length) is 8 bits.
- Code 256 is used for table cleanup, 257 is the end of data marker.
- EarlyChange is in use: the number of bits per code is increased after
creating table entries for codes 511, 1023 and 2047.
- Table entries are created for codes up to 4093. Instead of generating
an entry for 4094, the table is cleared.
*/
#ifndef DK4ERROR_H_INCLUDED
#include
#endif
#ifndef DK4BITSH_H_INCLUDED
#include
#endif
/** Table size.
The table must be large enough to keep 4096 entries. Adding
25 percent size significantly decreases the number of lookups.
A prime number is required to ensure traversal of the entire
table if necessary.
*/
enum {
LZW_TABLE_SIZE = 5147 /**< Size of LZW compression table. */
};
/** One table entry for LZW compression.
*/
typedef struct {
unsigned short os; /**< Current (old) state or code. */
unsigned short ns; /**< New state after applying input. */
unsigned char in; /**< Input byte. */
} dk4_lzw_cell_t;
/** LZW encoder structure.
*/
typedef struct {
unsigned char ob[8]; /**< Output buffer. */
dk4_bit_shift_t bs; /**< Bit shifter. */
dk4_lzw_cell_t *p_tbl; /**< Pointer to dynamically allocated table. */
size_t obu; /**< Used bytes in output buffer. */
int mret; /**< Flag: Must retrieve output data. */
int hst; /**< Flag: Have internal state. */
unsigned short bits; /**< Number of bits to use for output. */
unsigned short cs; /**< Current state. */
unsigned short ns; /**< Next state for new table entry. */
} dk4_lzwe_t;
#ifdef __cplusplus
extern "C" {
#endif
/** Initialize LZW encoder, allocate memory for resources.
@param lzwptr Encoder to initialize.
@param erp Error report, may be NULL.
@return 1 on success, 0 on error.
Error codes:
- DK4_E_INVALID_ARGUMENTS
if lzwptr is NULL,
- DK4_E_MATH_OVERFLOW
on numeric overflow when calculating the
product of elsize and nelem,
- DK4_E_MEMORY_ALLOCATION_FAILED
with mem.elsize and mem.nelem
set if there is not enough memory available,
- DK4_E_BUG
if the dk4bit_shift_add() call indicates an error
(should not happen as we provide a valid address to the function),
- DK4_E_BUFFER_TOO_SMALL
if the output buffer is already full. Typically this means
that output was not retrieved as expected by the library.
*/
int
dk4lzwe_init(
dk4_lzwe_t *lzwptr,
dk4_er_t *erp
);
/** Add one byte to the encoder.
@param lzwptr Encoder to use.
@param uc Byte to add.
@param erp Error report, may be NULL.
@return Operation result, one from:
- DK4_EDSTM_ACCEPT
if the input byte was successfully stored in the internal data
structures without completing a run. No further action
necessary.
- DK4_EDSTM_FINISHED
if output was created. Use dk4lzwe_output() to obtain the
output data.
- DK4_EDSTM_ERROR
if an error occured.
*/
int
dk4lzwe_add(
dk4_lzwe_t *lzwptr,
unsigned char uc,
dk4_er_t *erp
);
/** Finish encoded data stream, flush internal state and bits from
the bit shifter to output buffer and release dynamic memory.
@param lzwptr Encoder to use.
@param erp Error report, may be NULL.
@return Operation result, one from:
- DK4_EDSTM_ACCEPT
if the input byte was successfully stored in the internal data
structures without completing a run. No further action
necessary.
- DK4_EDSTM_FINISHED
if output was created. Use dk4lzwe_output() to obtain the
output data.
- DK4_EDSTM_ERROR
if an error occured.
Error codes:
- DK4_E_INVALID_ARGUMENTS
if lzwptr is NULL or lzwptr->s_tbl or lzwptr->i_tbl is NULL,
- DK4_E_BUG
if the dk4bit_shift_add() call indicates an error
(should not happen as we provide a valid address to the function),
- DK4_E_BUFFER_TOO_SMALL
if the output buffer is already full. Typically this means
that output was not retrieved as expected by the library.
*/
int
dk4lzwe_finish(
dk4_lzwe_t *lzwptr,
dk4_er_t *erp
);
/** Retrieve output from encoder.
@param dptr Address of result pointer.
@param szptr Address of result size variable.
@param lzwptr Encoder to use.
@param erp Error report, may be NULL.
@return 1 if data available, 0 otherwise.
*/
int
dk4lzwe_output(
const unsigned char **dptr,
size_t *szptr,
dk4_lzwe_t *lzwptr,
dk4_er_t *erp
);
#ifdef __cplusplus
}
#endif
/* vim: set ai sw=4 ts=4 : */
#endif