/* Copyright (C) 2016-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). 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 */ #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 DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4ERROR_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" #else #include #endif #endif #ifndef DK4BITSH_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4bitsh.h" #else #include #endif #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