/*
*******************************************************************************
*
*   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);

    /** is this byte sequence valid? */
    UBool
    (*isValid)(NewConverter *cnvData,
               const uint8_t *bytes, int32_t length,
               uint32_t b);

    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);
};

#endif
