/*
 * SpanDSP - a series of DSP components for telephony
 *
 * private/v42bis.h
 *
 * Written by Steve Underwood <steveu@coppice.org>
 *
 * Copyright (C) 2005 Steve Underwood
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 2.1,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#if !defined(_SPANDSP_PRIVATE_V42BIS_H_)
#define _SPANDSP_PRIVATE_V42BIS_H_

/*!
    V.42bis dictionary node.
    Note that 0 is not a valid node to point to (0 is always a control code), so 0 is used
    as a "no such value" marker in this structure.
*/
typedef struct
{
    /*! \brief The value of the octet represented by the current dictionary node */
    uint8_t node_octet;
    /*! \brief The parent of this node */
    uint16_t parent;
    /*! \brief The first child of this node */
    uint16_t child;
    /*! \brief The next node at the same depth */
    uint16_t next;
} v42bis_dict_node_t;

/*!
    V.42bis compression or decompression. This defines the working state for a single instance
    of V.42bis compression or decompression.
*/
typedef struct
{
    /*! \brief Compression enabled. */
    int v42bis_parm_p0;
    /*! \brief Compression mode. */
    int compression_mode;
    /*! \brief Callback function to handle output data. */
    put_msg_func_t handler;
    /*! \brief An opaque pointer passed in calls to the data handler. */
    void *user_data;
    /*! \brief The maximum amount to be passed to the data handler. */
    int max_output_len;

    /*! \brief TRUE if we are in transparent (i.e. uncompressable) mode */
    int transparent;
    /*! \brief Next empty dictionary entry */
    uint16_t v42bis_parm_c1;
    /*! \brief Current codeword size */
    uint16_t v42bis_parm_c2;
    /*! \brief Threshold for codeword size change */
    uint16_t v42bis_parm_c3;
    /*! \brief The current update point in the dictionary */
    uint16_t update_at;
    /*! \brief The last entry matched in the dictionary */
    uint16_t last_matched;
    /*! \brief The last entry added to the dictionary */
    uint16_t last_added;
    /*! \brief Total number of codewords in the dictionary */
    int v42bis_parm_n2;
    /*! \brief Maximum permitted string length */
    int v42bis_parm_n7;
    /*! \brief The dictionary */
    v42bis_dict_node_t dict[V42BIS_MAX_CODEWORDS];

    /*! \brief The octet string in progress */
    uint8_t string[V42BIS_MAX_STRING_SIZE];
    /*! \brief The current length of the octet string in progress */
    int string_length;
    /*! \brief The amount of the octet string in progress which has already
        been flushed out of the buffer */
    int flushed_length;

    /*! \brief Compression performance metric */
    uint16_t compression_performance;

    /*! \brief Outgoing bit buffer (compression), or incoming bit buffer (decompression) */ 
    uint32_t bit_buffer;
    /*! \brief Outgoing bit count (compression), or incoming bit count (decompression) */ 
    int bit_count;

    /*! \brief The output composition buffer */
    uint8_t output_buf[V42BIS_MAX_OUTPUT_LENGTH];
    /*! \brief The length of the contents of the output composition buffer */    
    int output_octet_count;

    /*! \brief The current value of the escape code */
    uint8_t escape_code;
    /*! \brief TRUE if we just hit an escape code, and are waiting for the following octet */
    int escaped;
} v42bis_comp_state_t;

/*!
    V.42bis compression/decompression descriptor. This defines the working state for a
    single instance of V.42bis compress/decompression.
*/
struct v42bis_state_s
{
    /*! \brief Compression state. */
    v42bis_comp_state_t compress;
    /*! \brief Decompression state. */
    v42bis_comp_state_t decompress;

    /*! \brief Error and flow logging control */
};

#endif
/*- End of file ------------------------------------------------------------*/
