blob: 3154a57f8f3f520f8d7138b72d3977c34128b5e5 [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 @@@
#ifndef FCCONV_H
#define FCCONV_H 1
#ifndef _KERNEL
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
//#include "iconv_local.h" // BRL
#endif
typedef unsigned char uchar_t ; // JAC
typedef unsigned char uchar ; // JAC
typedef char * caddr_t ; // JAC
typedef unsigned int uint ; // JAC
typedef unsigned int uint_t ; // JAC
typedef unsigned short ushort_t ; // JAC
//#include <sys/errno.h> //BRL
#include "errno.h" //JAC
#include <sys/types.h>
// #ifdef _KERNEL //BRL
/*
* ICONV status
*/
#define ICONV_DONE 0
#define ICONV_TRUNC 1 /* EINVAL */
#define ICONV_INVAL 2 /* EILSEQ */
#define ICONV_OVER 3 /* E2BIG */
// #endif //BRL
/*
* Default ROW_SIZE
*/
#ifndef ROW_SIZE
#define ROW_SIZE 64
#endif
/*
* Status flags in _LC_fcconv_iconv_t
*/
#define CONV_BOM_WRITTEN 0x0001 /* Byte order mark written */
#define CONV_REVERSE_INBYTE 0x0002 /* Reverse byte ordering of input */
#define CONV_REVERSE_OUTBYTE 0x0004 /* Reverse byte ordering of output */
#define CONV_SAVE_FLAGS 0x0008 /* Save flags value in input routine */
#define CONV_UTF7_CONVTABLE 0x0010 /* UTF-7 conversion table defined */
#define CONV_UTF7_OPTIONAL 0x0020 /* Enable UTF-7 optional direct chars */
#define CONV_UTF7_VERBOSE 0x0040 /* Always output SHIFT_OUT */
#define CONV_REWIND 0x0080 /* Rewind the conversion due to error */
#define CONV_ASCII_INOMAP 0x0100 /* No input ASCII character mapping */
#define CONV_ASCII_IDMAP2 0x0200 /* Map input ASCII to cell2 directly */
#define CONV_ASCII_ONOMAP 0x0100 /* No output ASCII character mapping */
#define CONV_ASCII_ODMAP2 0x0200 /* Map output ASCII to cell2 directly */
#define CONV_INPUT_PROCESSED 0x0400 /* May be set after input processing */
#define CONV_FUNC_FIRST 0x0800 /* Try conversion function first */
#define CONV_FUNC_NEXT 0x1000 /* Try conversion function next if
table lookup fails */
#define CONV_NO_UDC 0x2000 /* Don't map any UCS UDC character */
/*
* Other macros
*/
#define UCS4_BOM 0x0000feff /* UCS-4 byte order mark */
#define UCS4_BOM_REVERSE 0xfffe0000 /* Reversed UCS-4 BOM */
#define UCS2_BOM 0xfeff /* UCS-2 byte order mark */
#define UCS2_BOM_REVERSE 0xfffe /* Reversed UCS-2 BOM */
#define BAD (ucs2_t)-1
#define IDE (ucs2_t)-2 /* Code is identical */
#define UCS2_IDE ((ucs2_t)IDE)
#define UCS2_BAD ((ucs2_t)BAD)
#define UCS4_BAD ((ucs4_t)BAD)
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
#define UCODE_MASK 0x40000000
#define IS_UCODE(c) ((c) & UCODE_MASK)
#define GET_UCODE(c) ((c) & ~UCODE_MASK)
#ifdef _KERNEL
#define _ISASCII(c) ((c) >= 0x21 && (c) <= 0x7e)
#else
#define _ISASCII(c) isascii(c)
#endif
#ifdef _KERNEL
#define _STRCASECMP(f, c) strcmp(f, c)
#else
#define _STRCASECMP(f, c) strcasecmp(f, c)
#endif
/*
* Error return values
*/
#define ERR_INVALID_CHAR -1 /* EILSEQ, ICONV_INVAL */
#define ERR_INPUT_INCOMPLETE -2 /* EINVAL, ICONV_TRUNC */
#define ERR_BUFFER_OVERRUN -3 /* E2BIG , ICONV_OVER */
#define ERR_NOINPUT -4
/*
* Codeset numbers
*/
typedef enum codeset
{
UCS , /* Generic UCS form */
UCS_4 ,
UCS_2 ,
UTF_8 ,
UTF_7 ,
UTF_8_PASCII , /* Pass ASCII directly without table lookup */
UCS_4_1_1 ,
UCS_2_1_1 ,
UTF_8_1_1 ,
UTF_7_1_1 ,
ISO8859_1 ,
ISO8859_2 ,
ISO8859_3 ,
ISO8859_4 ,
ISO8859_5 ,
ISO8859_6 ,
ISO8859_7 ,
ISO8859_8 ,
ISO8859_9 ,
ISO885915 ,
CP437 , /* DOS Latin US */
CP737 , /* DOS Greek */
CP775 , /* DOS Balt Rim */
CP850 , /* DOS Latin 1 */
CP852 , /* DOS Latin 2 */
CP855 , /* DOS Cyrillic */
CP857 , /* DOS Turkish */
CP860 , /* DOS Portuguese */
CP861 , /* DOS Icelandic */
CP862 , /* DOS Hebrew */
CP863 , /* DOS Canadian French */
CP864 , /* DOS Arabic */
CP865 , /* DOS Nordic */
CP866 , /* DOS Cyrillic Russian */
CP869 , /* DOS Greek 2 */
CP874 , /* DOS Thai */
CP932 , /* Shift JIS */
CP936 , /* Extended GB */
CP949 , /* Unified Hangul (Extended Wansung) */
CP950 , /* Big 5 */
CP1250 , /* Windows Latin 2 */
CP1251 , /* Windows Cyrillic */
CP1252 , /* Windows Latin 1 */
CP1253 , /* Windows Greek */
CP1254 , /* Windows Turkish */
CP1255 , /* Windows Hebrew */
CP1256 , /* Windows Arabic */
CP1257 , /* Windows Baltic */
CP1258 , /* Windows Vietnamese */
DINGBATS ,
SYMBOL ,
TACTIS ,
DECKANJI ,
SJIS ,
EUCJP ,
SDECKANJI ,
ISO_2022_JP ,
DECHANYU ,
EUCTW ,
BIG5 ,
DECHANZI ,
GB2312 ,
GBK ,
GB18030 ,
DECKOREAN ,
KSC5601 ,
EUCKR ,
HKSCS , /* Hong Kong Supplementary Character Set */
/*
* Font mapping character sets
*/
JISX0201_GR ,
JISX0208_GL ,
JISX0208_GR ,
JISX0212_GL ,
JISX0212_GR ,
JISX_UDC ,
GB2312_GL ,
GB2312_GR ,
GB2312_UDC ,
GBK_GLGR ,
KSC5601_GL ,
KSC5601_GR ,
CNS11643_1GL ,
CNS11643_1GR ,
CNS11643_2GL ,
CNS11643_2GR ,
CNS11643_3GL ,
CNS11643_3GR ,
CNS11643_4GL ,
CNS11643_4GR ,
DEC_CNS11643 ,
DEC_CNS11643_UDC,
DTSCS ,
BIG5_GLGR ,
BIG5_UDC
} codeset_t ;
/*
* Row and column manipulation macros
*
* Only least significant 11 bits of the row index is used.
* The other bits are used for status bits.
*/
# define ROW_MASK 0x7ff
# define ROW_CELL4 0x800 /* Row is index to 4-byte cell table */
# define IS_CELL4_ROW(c) ((c) & ROW_CELL4)
# define MASKROW(c) ((c) & ROW_MASK )
#define ROW(c) ((c) / ROW_SIZE)
#define COL(c) ((c) % ROW_SIZE)
/*
* The row table is ucs2_t whereas the cell table can be either ucs2_t or
* ucs4_t. So the comparison with BAD must match the proper type to avoid
* sign extension problem.
*/
#ifdef USE_IDMAP
#define GET_VAL(cd, idx, val, io) \
{ \
register ucs2_t _row, _col, _value; \
_row = ROW(idx) ; _col = COL(idx) ; \
if ((_row >= (cd)->##io##row_count) || \
((_row = (cd)->##io##row_table[_row]) == UCS2_IDE))\
val = idx ; \
else if (_row == UCS2_BAD) \
val = BAD ; \
else if (IS_CELL4_ROW(_row)) \
val = (cd)->##io##cell4_tab[MASKROW(_row)][_col]; \
else { \
_value = (cd)->##io##cell2_tab[_row][_col]; \
val = (_value == UCS2_BAD) ? BAD : _value ; \
} \
}
#else /* USE_IDMAP */
#define GET_VAL(cd, idx, val, io) \
{ \
register ucs2_t _row, _col, _value; \
_row = ROW(idx) ; _col = COL(idx) ; \
if ((_row >= (cd)->##io##row_count) || \
((_row = (cd)->##io##row_table[_row]) == UCS2_BAD))\
val = BAD ; \
else if (IS_CELL4_ROW(_row)) \
val = (cd)->##io##cell4_tab[MASKROW(_row)][_col]; \
else { \
_value = (cd)->##io##cell2_tab[_row][_col]; \
val = (_value == UCS2_BAD) ? BAD : _value ; \
} \
}
#endif /* USE_IDMAP */
#define GET_IVAL(cd, idx, val) GET_VAL(cd, idx, val, i)
#define GET_OVAL(cd, idx, val) GET_VAL(cd, idx, val, o)
typedef struct _LC_fcconv_iconv_rec _LC_fcconv_iconv_t ;
typedef unsigned short ucs2_t ;
typedef unsigned int ucs4_t ;
typedef const ucs2_t row_t ;
typedef const ucs2_t cell2_t[ROW_SIZE] ;
typedef const ucs4_t cell4_t[ROW_SIZE] ;
/*
* Need new type because the wchar_t type (used by the DEC source as we
* received it) is only a 2-byte thing on NT and on Yosemite and the
* DEC source code was assuming it was a 4-byte thing.
*/
typedef unsigned int WChar_t;
typedef int (*cfunc_t )(WChar_t) ; /* Font charset conversion function */ // JAC
typedef int (*infunc_t )(_LC_fcconv_iconv_t *, uchar_t **, int) ;
typedef int (*outfunc_t)(_LC_fcconv_iconv_t *, uchar_t * , int, ucs4_t) ;
typedef int (*cnvfunc_t)(_LC_fcconv_iconv_t *, uchar_t **, size_t *,
uchar_t **, size_t *) ;
/* UCS to UDC mapping function */
typedef WChar_t (*udcfunc_t)(ucs4_t) ; // JAC
/*
* _LC_fcconv_iconv_t
*/
struct _LC_fcconv_iconv_rec {
#ifndef _KERNEL
// _LC_core_iconv_t core ; //BRL & JAC -- Don't think we need this.
#endif
int flags ; /* Status and control flags */
int srccode ; /* Source codeset number */
int dstcode ; /* Destination codeset number */
infunc_t infunc ; /* Input function */
outfunc_t outfunc ; /* Output function */
udcfunc_t udcfunc ; /* UCS to UDC conversion function */
cnvfunc_t cnvfunc ; /* Conversion function */
caddr_t convtable ; /* Conversion table (for UTF-7) */
/* To UCS conversion table */
cell2_t *icell2_tab ; /* Input 2-byte cell table */
cell4_t *icell4_tab ; /* Input 4-byte cell table */
row_t *irow_table ; /* Input row to cell mapping table */
int irow_count ; /* No. of rows in input row_table */
/* From UCS conversion table */
cell2_t *ocell2_tab ; /* Output 2-byte cell table */
cell4_t *ocell4_tab ; /* Output 4-byte cell table */
row_t *orow_table ; /* Output row to cell mapping table */
int orow_count ; /* No. of rows in output row_table */
/* Default conversion character or string if cannot be converted */
WChar_t defucsch ; /* Default character in UCS-4 */ // JAC
WChar_t defchar ; /* Default single/multi byte char */ // JAC
char *defstr ; /* Default string */
int defstrlen ; /* Length of the default string */
// BRL wint_t maxucs ; /* Maximum allowable UCS value */
} ;
/*
* Function prototypes
*/
extern int __input_ucs4 (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __input_ucs2 (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __input_utf7 (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __input_utf8 (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __output_ucs4(_LC_fcconv_iconv_t *, uchar_t * , int, ucs4_t) ;
extern int __output_ucs2(_LC_fcconv_iconv_t *, uchar_t * , int, ucs4_t) ;
extern int __output_utf7(_LC_fcconv_iconv_t *, uchar_t * , int, ucs4_t) ;
extern int __output_utf8(_LC_fcconv_iconv_t *, uchar_t * , int, ucs4_t) ;
extern int __from_ucs_exec (_LC_fcconv_iconv_t *, uchar_t** , size_t *,
uchar_t** , size_t *);
extern int __to_ucs_exec (_LC_fcconv_iconv_t *, uchar_t** , size_t *,
uchar_t** , size_t *);
extern int __cs_to_ucs_exec(_LC_fcconv_iconv_t *, uchar_t** , size_t *,
uchar_t** , size_t *);
extern int __sb_to_ucs_exec(_LC_fcconv_iconv_t *, uchar_t** , size_t *,
uchar_t** , size_t *);
extern int __sb_to_sb_exec (_LC_fcconv_iconv_t *, uchar_t** , size_t *,
uchar_t** , size_t *);
extern int __mb_to_mb_exec (_LC_fcconv_iconv_t *, uchar_t** , size_t *,
uchar_t** , size_t *);
extern int __sjis_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __deckanji_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __sdeckanji_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __eucjp_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __jisx0201gr_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __jisx0208gl_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __jisx0208gr_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __jisx0212gl_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __jisx0212gr_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __jisxudc_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __dechanzi_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __dechanyu_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __euctw_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __big5_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __hkscs_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __gb2312_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __gb2312gl_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __gbk_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __gb18030_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __cns116431gl_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __cns116431gr_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __cns116432gl_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __cns116432gr_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __deccns11643_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __deccns11643udc_index(_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __dtscs_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __big5glgr_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __big5udc_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __gb2312udc_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __deckorean_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __ksc5601gl_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
extern int __cp949_index (_LC_fcconv_iconv_t *, uchar_t **, int) ;
/*
* Special font character set conversion functions
*/
extern int __eucjp_to_jisx0201gr (WChar_t) ; // JAC
extern int __eucjp_to_jisx0208gl (WChar_t) ; // JAC
extern int __eucjp_to_jisx0208gr (WChar_t) ; // JAC
extern int __eucjp_to_jisx0212gl (WChar_t) ; // JAC
extern int __eucjp_to_jisx0212gr (WChar_t) ; // JAC
extern int __deckanji_to_jisxudc (WChar_t) ; // JAC
extern int __gb2312_to_gb2312gl (WChar_t) ; // JAC
extern int __gb2312_to_gb2312gr (WChar_t) ; // JAC
extern int __gbk_to_gbkglgr (WChar_t) ; // JAC
extern int __euctw_to_cns116431gl (WChar_t) ; // JAC
extern int __euctw_to_cns116431gr (WChar_t) ; // JAC
extern int __euctw_to_cns116432gl (WChar_t) ; // JAC
extern int __euctw_to_cns116432gr (WChar_t) ; // JAC
extern int __euctw_to_cns116433gl (WChar_t) ; // JAC
extern int __euctw_to_cns116433gr (WChar_t) ; // JAC
extern int __euctw_to_cns116434gl (WChar_t) ; // JAC
extern int __euctw_to_cns116434gr (WChar_t) ; // JAC
extern int __dechanyu_to_dtscs (WChar_t) ; // JAC
extern int __dechanyu_to_deccns11643 (WChar_t) ; // JAC
extern int __dechanyu_to_deccns11643udc (WChar_t) ; // JAC
extern int __big5_to_big5glgr (WChar_t) ; // JAC
extern int __big5_to_big5udc (WChar_t) ; // JAC
extern int __dechanzi_to_gb2312udc (WChar_t) ; // JAC
extern int __deckorean_to_ksc5601gl (WChar_t) ; // JAC
extern int __deckorean_to_ksc5601gr (WChar_t) ; // JAC
/*
* UCS's UDC mapping functions
*/
extern WChar_t __UDC_to_sjis (ucs4_t) ; // JAC
extern WChar_t __UDC_to_big5 (ucs4_t) ; // JAC
extern WChar_t __UDC_to_dechanyu (ucs4_t) ; // JAC
extern WChar_t __UDC_to_dechanzi (ucs4_t) ; // JAC
extern WChar_t __UDC_to_deckanji (ucs4_t) ; // JAC
extern WChar_t __UDC_to_eucjp (ucs4_t) ; // JAC
extern WChar_t __UDC_to_euctw (ucs4_t) ; // JAC
extern WChar_t __UDC_to_sdeckanji(ucs4_t) ; // JAC
extern WChar_t __UDC_to_gb18030 (ucs4_t) ; // JAC
extern WChar_t __UDC_to_gb2312 (ucs4_t) ; // JAC
extern WChar_t __UDC_to_gbk (ucs4_t) ; // JAC
extern WChar_t __UDC_to_hkscs (ucs4_t) ; // JAC
extern WChar_t __UDC_to_deckorean(ucs4_t) ; // JAC
extern WChar_t __UDC_to_cp949 (ucs4_t) ; // JAC
/*
* Special UCS mapping functions
*/
extern WChar_t __UCS_to_gb18030(ucs4_t) ; // JAC BRL
/*
* Function name mappings
*/
#define __gb2312gr_index __gb2312_index
#define __gbkglgr_index __gbk_index
#define __ksc5601gr_index __deckorean_index
#define __UCS_to_sjis NULL
#define __UCS_to_big5 NULL
#define __UCS_to_dechanyu NULL
#define __UCS_to_dechanzi NULL
#define __UCS_to_deckanji NULL
#define __UCS_to_eucjp NULL
#define __UCS_to_sdeckanji NULL
#define __UCS_to_gbk NULL
#define __UCS_to_euctw NULL
#define __UCS_to_deckorean NULL
#define __UCS_to_cp949 NULL
#define __UCS_to_gb2312 NULL
#define __UCS_to_hkscs NULL
#endif /* FCCONV_H */