/* Copyright (C) 2015-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: dk4rle.ctr */ #ifndef DK4RLE_H_INCLUDED /** Avoid multiple inclusions. */ #define DK4RLE_H_INCLUDED 1 #line 10 "dk4rle.ctr" /** @file dk4rle.h Run length encoder as described in the PS and PDF specifications. Use the dk4rle_init() function to initialize the encoder first. Add binary data byte by byte, use dk4rle_add(). If this function returns DK4_EDSTM_ACCEPT, the byte was successfully stored in the encoder, no further action is necessary. If the function returns DK4_EDSTM_FINISHED, either a run or a sequence of literal bytes was completed; use dk4rle_output() to retrieve the output data. After passing all bytes to the encoder there is probably data in the encoder not yet retrieved. Use the dk4rle_finish() function to check. If the function returns DK4_EDSTM_FINISHED, use dk4rle_output() to retrieve the final output data. */ #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 /** Run-length encoder. */ typedef struct { unsigned char ob[144]; /**< Buffer for both input and output. */ unsigned char *ib; /**< Pointer to ob[1], input buffer. */ size_t oused; /**< Output buffer size. */ size_t iused; /**< Number of input bytes available. */ size_t ao_si; /**< Index to save bytes from after output. */ size_t ao_ss; /**< Size of buffer part to save after out. */ size_t ao_iu; /**< Number of input bytes after output. */ int ao_st; /**< New state after output. */ int st; /**< Current state. */ int lwo; /**< Flag: Last operation was output. */ int weod; /**< Flag: Write EOD marker at end. */ } dk4_rl_enc_t; #ifdef __cplusplus extern "C" { #endif /** Initialize encoder before using it. @param enc Encoder to initialize. @param weod Flag: Write EOD marker at end of data. @param erp Error report, may be NULL. Error codes: - DK4_E_INVALID_ARGUMENTS if enc is NULL. */ void dk4rle_init(dk4_rl_enc_t *enc, int weod, dk4_er_t *erp); /** Add a single byte to the encoder. @param enc Encoder. @param ibyte Input byte to process. @param erp Error report, may be NULL. @return Action to take, 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 a run was completed. Use dk4rle_output() to obtain the output data. - DK4_EDSTM_ERROR
if an error occured. Error codes: - DK4_E_INVALID_ARGUMENTS if enc is NULL. */ int dk4rle_add(dk4_rl_enc_t *enc, unsigned char ibyte, dk4_er_t *erp); /** Finish data stream, process final data still stored in the encoder. @param enc Encoder. @param erp Error report, may be NULL. @return Action to take, 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 a run was completed. Use dk4rle_output() to obtain the output data. - DK4_EDSTM_ERROR
if an error occured. Error codes: - DK4_E_INVALID_ARGUMENTS if enc is NULL. */ int dk4rle_finish(dk4_rl_enc_t *enc, dk4_er_t *erp); /** Retrieve encoder output. @param dptr Address of pointer to set to output bytes, should be initialized to NULL. @param szptr Address of size variable for buffer length, should be initialized to 0. @param enc Encoder. @param erp Error report, may be NULL. @return 1 if there is data available, 0 otherwise. Error codes: - DK4_E_INVALID_ARGUMENTS if enc is NULL. */ int dk4rle_output( const unsigned char **dptr, size_t *szptr, dk4_rl_enc_t const *enc, dk4_er_t *erp ); #ifdef __cplusplus } #endif #endif