/*
*******************************************************************************
*
*   Copyright (C) 2000, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*   file name:  ucnvmbcs.h
*   encoding:   US-ASCII
*   tab size:   8 (not used)
*   indentation:4
*
*   created on: 2000jul07
*   created by: Markus W. Scherer
*/

#ifndef __UCNVMBCS_H__
#define __UCNVMBCS_H__

#include "unicode/utypes.h"

/* MBCS converter data and state -------------------------------------------- */

enum {
    MBCS_STATE_ILLEGAL,
    MBCS_STATE_CHANGE_ONLY,
    MBCS_STATE_UNASSIGNED,

    MBCS_STATE_FALLBACK_DIRECT_16,
    MBCS_STATE_FALLBACK_DIRECT_20,

    MBCS_STATE_VALID_DIRECT_16,
    MBCS_STATE_VALID_DIRECT_20,

    MBCS_STATE_VALID_16,
    MBCS_STATE_VALID_16_PAIR
};

enum {
    MBCS_OUTPUT_1,
    MBCS_OUTPUT_2,
    MBCS_OUTPUT_3,
    MBCS_OUTPUT_4,

    MBCS_OUTPUT_3_EUC=8,
    MBCS_OUTPUT_4_EUC
};

typedef struct {
    uint32_t offset;
    UChar32 codePoint;
} _MBCSToUFallback;

typedef struct UConverterMBCSTable {
    /* toUnicode */
    uint8_t countStates;
    uint32_t countToUFallbacks;

    const int32_t (*stateTable)/*[countStates]*/[256];
    const uint16_t *unicodeCodeUnits/*[countUnicodeResults]*/;
    const _MBCSToUFallback *toUFallbacks;

    /* fromUnicode */
    const uint16_t *fromUnicodeTable;
    const uint8_t *fromUnicodeBytes;
    uint8_t outputType;
} UConverterMBCSTable;

/*
 * MBCS data structure as part of a .cnv file:
 *
 * uint32_t [8]; -- 8 values:
 *  0   MBCS version in UVersionInfo format (1.0.0.0)
 *  1   countStates
 *  2   countToUFallbacks
 *  3   offsetToUCodeUnits (offsets are counted from the beginning of this header structure)
 *  4   offsetFromUTable
 *  5   offsetFromUBytes
 *  6   flags, bits:
 *          31.. 8 reserved
 *           7.. 0 outputType
 *  7   reserved
 *
 * stateTable[countStates][256];
 *
 * struct { (fallbacks are sorted by offset)
 *     uint32_t offset;
 *     UChar32 codePoint;
 * } toUFallbacks[countToUFallbacks];
 *
 * uint16_t unicodeCodeUnits[?]; (even number of units or padded)
 *
 * uint16_t fromUTable[0x440+?]; (32-bit-aligned)
 *
 * uint8_t fromUBytes[?];
 */
typedef struct {
    UVersionInfo version;
    uint32_t countStates,
             countToUFallbacks,
             offsetToUCodeUnits,
             offsetFromUTable,
             offsetFromUBytes,
             flags,
             reserved;
} _MBCSHeader;

struct UConverterSharedData;
typedef struct UConverterSharedData UConverterSharedData;

U_CFUNC UChar32
_MBCSSimpleGetNextUChar(UConverterSharedData *sharedData,
                        const char **pSource, const char *sourceLimit,
                        UBool useFallback);

U_CFUNC UBool
_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte);

U_CFUNC int32_t
_MBCSFromUChar32(UConverterSharedData *sharedData,
                 UChar32 c, uint32_t *pValue,
                 UBool useFallback);

#endif
