/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
#include "context.h"
#endif
#ifndef INCLUDED_RTL_TEXTENC_CONVERTBIG5HKSCS_H
#include "convertbig5hkscs.h"
#endif

#ifndef _RTL_TENCINFO_H
#include "rtl/tencinfo.h"
#endif
#ifndef _RTL_TEXTENC_H
#include "rtl/textenc.h"
#endif

#include "generate/big5hkscs2001.tab"

static ImplBig5HkscsConverterData const aImplBig5HkscsConvertData
    = { aImplBig5Hkscs2001ToUnicodeData,
        aImplBig5Hkscs2001ToUnicodeRowOffsets,
        aBIG5UniLeadTab, /* from tcvttcn6.tab */
        aImplUnicodeToBig5Hkscs2001Data,
        aImplUnicodeToBig5Hkscs2001PageOffsets,
        aImplUnicodeToBig5Hkscs2001PlaneOffsets,
        aBIG5DBCSHighTab, /* from tcvttcn6.tab */
        aImplMS950DBCSEUDCTab, /* from tcvttcn6.tab */
        DBCS_EUDC_MS950_COUNT }; /* from tcvttcn6.tab */

static ImplTextEncodingData const aImplBig5HkscsTextEncodingData
    = { { &aImplBig5HkscsConvertData,
          &ImplConvertBig5HkscsToUnicode,
          &ImplConvertUnicodeToBig5Hkscs,
          &ImplCreateBig5HkscsToUnicodeContext,
          &ImplDestroyContext,
          &ImplResetBig5HkscsToUnicodeContext,
          &ImplCreateUnicodeToTextContext,
          &ImplDestroyContext,
          &ImplResetUnicodeToTextContext },
        1,
        2,
        2,
        136,
        "euc-tw",
        "Big5-HKSCS",
        RTL_TEXTENCODING_INFO_MULTIBYTE | RTL_TEXTENCODING_INFO_MIME };
    /* SCRIPT_CHINESE_TRADITIONAL */
