/* ******************************************************************************* * * * COPYRIGHT: * * (C) Copyright International Business Machines Corporation, 1998 * * Licensed Material - Program-Property of IBM - All Rights Reserved. * * US Government Users Restricted Rights - Use, duplication, or disclosure * * restricted by GSA ADP Schedule Contract with IBM Corp. * * * ******************************************************************************* * * File scsu.h * * Modification History: * * Date Name Description * 05/17/99 stephen Creation (ported from java UnicodeCompressor.java) * 09/21/99 stephen Updated to handle data splits on decompression. ******************************************************************************* */ #ifndef SCSU_H #define SCSU_H 1 #include "utypes.h" /* Number of windows */ #define USCSU_NUM_WINDOWS 8 #define USCSU_NUM_STATIC_WINDOWS 8 /* Maximum value for a window's index */ #define USCSU_MAX_INDEX 0xFF /* The size of the internal buffer for a UnicodeCompressor. */ #define USCSU_BUFSIZE 3 /** The UnicodeCompressor struct */ struct UnicodeCompressor { /** Alias to current dynamic window */ int32_t fCurrentWindow; /** Dynamic compression window offsets */ int32_t fOffsets [ USCSU_NUM_WINDOWS ]; /** Current compression mode */ int32_t fMode; /** Keeps count of times character indices are encountered */ int32_t fIndexCount [ USCSU_MAX_INDEX + 1 ]; /** The time stamps indicate when a window was last defined */ int32_t fTimeStamps [ USCSU_NUM_WINDOWS ]; /** The current time stamp */ int32_t fTimeStamp; /** Internal buffer for saving state */ uint8_t fBuffer [ USCSU_BUFSIZE ]; /** Number of characters in our internal buffer */ int32_t fBufferLength; }; typedef struct UnicodeCompressor UnicodeCompressor; /** * Initialize a UnicodeCompressor. * Sets all windows to their default values. * @see #reset */ U_CAPI void U_EXPORT2 scsu_init(UnicodeCompressor *comp); /** * Reset the compressor to its initial state. * @param comp The UnicodeCompressor to reset. */ U_CAPI void U_EXPORT2 scsu_reset(UnicodeCompressor *comp); /** * Compress a Unicode character array into a byte array. * * This function is not guaranteed to completely fill the output buffer, nor * is it guaranteed to compress the entire input. * If the source data is completely compressed, status will be set * to U_ZERO_ERROR. * If the source data is not completely compressed, status will be * set to U_INDEX_OUTOFBOUNDS_ERROR. If this occurs, larger buffers * should be allocated, or data flushed, and the function should be called * again with the new buffers. * * @param comp A pointer to a previously-initialized UnicodeCompressor * @param target I/O parameter. On input, a pointer to a buffer of bytes to * receive the compressed data. On output, points to the byte following * the last byte written. This buffer must be at least 4 bytes. * @param targetLimit A pointer to the end of the array target. * @param source I/O parameter. On input, a pointer to a buffer of * Unicode characters to be compressed. On output, points to the character * following the last character compressed. * @param sourceLimit A pointer to the end of the array source. * @param status A pointer to an UErrorCode to receive any errors. * * @see #decompress */ U_CAPI void U_EXPORT2 scsu_compress(UnicodeCompressor *comp, uint8_t **target, const uint8_t *targetLimit, const UChar **source, const UChar *sourceLimit, UErrorCode *status); /** * Decompress a byte array into a Unicode character array. * * This function will either completely fill the output buffer, or * consume the entire input. * If the source data is completely compressed, status will be set * to U_ZERO_ERROR. * If the source data is not completely compressed, status will be * set to U_INDEX_OUTOFBOUNDS_ERROR. If this occurs, larger buffers * should be allocated, or data flushed, and the function should be called * again with the new buffers. * * @param comp A pointer to a previously-initialized UnicodeDecompressor * @param target I/O parameter. On input, a pointer to a buffer of Unicode * characters to receive the compressed data. On output, points to the * character following the last character written. This buffer must be * at least 2 bytes. * @param targetLimit A pointer to the end of the array target. * @param source I/O parameter. On input, a pointer to a buffer of * bytes to be decompressed. On output, points to the byte following the * last byte decompressed. * @param sourceLimit A pointer to the end of the array source. * @param status A pointer to an UErrorCode to receive any errors. * @return The number of Unicode characters writeten to target. * * @see #compress */ U_CAPI void U_EXPORT2 scsu_decompress(UnicodeCompressor *comp, UChar **target, const UChar *targetLimit, const uint8_t **source, const uint8_t *sourceLimit, UErrorCode *status); #endif