blob: 556bf6071818211afde13c12dc80714ce322588e [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// 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.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/*
* HISTORY
* $Log: from_GBK.c,v $
* Revision 1.1.12.1 2001/12/07 15:37:40
* * Add __UDC_to_gbk() to map UDC to GBK code.
*
* Revision 1.1.8.1 2000/12/12 14:16:19
* Add UDC checking code in GBK to UCS conversion routine.
*
* Revision 1.1.6.1 2000/01/13 20:25:31
* Remove the old conversion routine in favor of the enhanced
* __<codeset>_index() routine, and add algorithmic UDC conversion
* support. Also add a number of conversion routines to support
* special font charset to Unicode conversion.
*
* Revision 1.1.4.1 1999/09/28 21:10:12
* Cosixsteelos to zincos merge.
*
* Revision 1.1.2.2 1999/08/18 18:36:12
* Add support for Unicode to GBK/GB2312 conversion.
* [1999/08/18 15:04:47 Long_Man]
*
* $EndLog$
*/
#include "fcconv.h"
#include "multi-byte.h"
/*
* This routine converts one GBK character from the input stream to table
* index.
*
* Return Value:
* Table index if no error
* -1 - Invalid sequence (EILSEQ)
* -2 - Input incomplete
*/
int
__gbk_index(_LC_fcconv_iconv_t * cd, uchar_t **in, int len)
{
uint ch1, ch2 ;
uchar *ip ;
if (len < 2)
return(ERR_INPUT_INCOMPLETE) ;
ip = *in ;
ch1 = *ip++ ;
ch2 = *ip++ ;
if (!GBK_VALID1(ch1) || !GBK_VALID2(ch2))
return(ERR_INVALID_CHAR) ;
*in = ip ; /* Adjust input pointer */
if (GBK_PLANE1(ch1, ch2))
{
if (GBK_UDC11(ch1, ch2) || GBK_UDC12(ch1, ch2))
return(GBK_IDXU1(ch1, ch2)) ;
return(GBK_IDX1(ch1, ch2)) ;
}
else if (GBK_PLANE2(ch1, ch2))
{
return(GBK_IDX2(ch1, ch2)) ;
}
else /* GBK_PLANE3(ch1, ch2) */
{
if (GBK_UDC3(ch1, ch2))
return(GBK_IDXU3(ch1, ch2)) ;
return(GBK_IDX3(ch1, ch2)) ;
}
}
/*
* This routine performs the conversion from a GBK code to GBK:GLGR
* code.
*/
int
__gbk_to_gbkglgr(WChar_t code)
{
if (code > 0xff)
return(code) ;
return(BAD) ;
}
/*
* This routine maps UDC characters in Unicode to those in GBK
*/
WChar_t
__UDC_to_gbk(ucs4_t ucs)
{
int uidx = UCS_UIDX(ucs) ;
#if 0 /* Unused - and our C++ compiler complains */
long gb4 ;
int gb4idx ;
#endif
if (uidx < GBK_UCNT)
return(UIDX_GBK(uidx)) ;
/*
* Perform table lookup for other BMP UDCs
*/
return((uidx >= UCS_UCNT) ? BAD : 0) ;
}