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

#ifndef __MAKECONV_H__
#define __MAKECONV_H__

#include "unicode/utypes.h"
#include "ucnv_bld.h"
#include "unewdata.h"

/* exports from makeconv.c */
U_CFUNC UBool VERBOSE;

/* abstract converter generator struct, C++ - style */
struct NewConverter;
typedef struct NewConverter NewConverter;

struct NewConverter {
    void
    (*close)(NewConverter *cnvData);

    UBool
    (*startMappings)(NewConverter *cnvData);

    UBool
    (*addToUnicode)(NewConverter *cnvData,
                    const uint8_t *bytes, int32_t length,
                    UChar32 c, uint32_t b,
                    int8_t isFallback);

    UBool
    (*addFromUnicode)(NewConverter *cnvData,
                      const uint8_t *bytes, int32_t length,
                      UChar32 c, uint32_t b,
                      int8_t isFallback);

    void
    (*finishMappings)(NewConverter *cnvData, const UConverterStaticData *staticData);

    uint32_t
    (*write)(NewConverter *cnvData, const UConverterStaticData *staticData, UNewDataMemory *pData);
};

/* object constructors */
U_CFUNC NewConverter *
SBCSOpen(void);

U_CFUNC NewConverter *
DBCSOpen(void);

U_CFUNC NewConverter *
EBCDICStatefulOpen(void);

#endif
