/*
 ******************************************************************************
 *
 *   Copyright (C) 1998-2000, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
 *
 *
 *  ucnvstat.c:
 *  UConverterStaticData prototypes for data based converters
 */

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


static const UConverterStaticData _SBCSStaticData={
  sizeof(UConverterStaticData),
  "SBCS",
    0, UCNV_IBM, UCNV_SBCS, 1, 1,
    { 0, 0, 0, 0 }, 1, FALSE, FALSE,
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved bytes */
};


static const UConverterStaticData _DBCSStaticData={
  sizeof(UConverterStaticData),
  "DBCS",
    0, UCNV_IBM, UCNV_DBCS, 2, 2,
    { 0, 0, 0, 0 },1, FALSE, FALSE, /* subchar */
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved bytes */
};

static const UConverterStaticData _MBCSStaticData={
  sizeof(UConverterStaticData),
  "MBCS",
    0, UCNV_IBM, UCNV_MBCS, 1, 1,
    { 0, 0, 0, 0 }, 1, FALSE, FALSE,
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved bytes */
};

static const UConverterStaticData _EBCDICStatefulStaticData={
  sizeof(UConverterStaticData),
 "EBCDICStateful",
    0, UCNV_IBM, UCNV_EBCDIC_STATEFUL, 1, 1,
  { 0, 0, 0, 0 },1, FALSE, FALSE,
  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved bytes */
};

/* NULLs for algorithmic types, their tables live in ucnv_bld.c */
const UConverterStaticData *ucnv_converterStaticData[UCNV_NUMBER_OF_SUPPORTED_CONVERTER_TYPES]={
    &_SBCSStaticData, &_DBCSStaticData, &_MBCSStaticData, NULL/*Lat1*/,
    NULL/*UTF8*/, NULL/*UTF16be*/, NULL/*UTF16LE*/, &_EBCDICStatefulStaticData,
    NULL/*ISO2022*/,
    /* LMBCS */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
};

