1
0
Files
irix-657m-src/eoe/include/iconv_int.h
2022-09-29 17:59:04 +03:00

537 lines
15 KiB
C

#ifndef _ICONV_INT_H
#define _ICONV_INT_H
#ifdef __cplusplus
extern "C" {
#endif
#ident "$Revision: 1.7 $"
/*
*
* Copyright 1995-1997 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
#include <sgidefs.h>
#include <iconv_cnv.h>
/*
* iconv_int.h
*/
/* ==================================================================== */
/* ==================================================================== */
/* ======== ICONV_METHODS ============================================= */
/* PURPOSE:
* Methods for the converter
*/
typedef struct ICONV_METHODS {
ICONV_CNVFUNC iconv_converter; /* ptr to cnv function */
ICONV_CTLFUNC iconv_control; /* ptr to control function */
} ICONV_METHODS;
/* ==================================================================== */
/* ==================================================================== */
/* Helper macros */
#define ICONV_S_MKADDR( typ, baddr, reladd ) \
( (typ)( \
( __mkaddr = ( reladd ), \
__mkaddr ? ( __mkaddr + ( char * ) ( baddr ) ) : 0 \
) \
) )
#define ICONV_S_DEFMKADDR register ICONV_S_RELPTR __mkaddr;
/* ==================================================================== */
/* ==================================================================== */
/* Internal structures */
typedef int ICONV_INT;
typedef short ICONV_SHORT;
typedef ICONV_S_RELPTR ICONV_S_OBJECTSPEC;
typedef ICONV_S_RELPTR ICONV_S_SYMBOL;
typedef ICONV_S_RELPTR ICONV_S_METHSPEC;
typedef ICONV_S_RELPTR ICONV_R_SPEC;
/* ======== ICONV_S_TBLS ============================================== */
/* PURPOSE:
* Specifier for table
*/
typedef struct ICONV_S_TBLS {
ICONV_S_RELPTR iconv_tableobject; /* DSO or a file relptr */
ICONV_S_SYMBOL iconv_table; /* iconv_table == 0 means file*/
} ICONV_S_TBLS;
/* ======== ICONV_S_SPEC ============================================== */
/* PURPOSE:
* Iconv converter specifier
*
* specifiers must be sorted.
*/
typedef struct ICONV_S_SPEC {
ICONV_INT iconv_specnum; /* specnum */
ICONV_S_METHSPEC iconv_meth; /* relptr to methods */
short iconv_ntable; /* This spec is a join of n tables */
ICONV_S_TBLS iconv_table[ 1 ];
} ICONV_S_SPEC;
/* ======== ICONV_S_LSPEC ============================================= */
/* PURPOSE:
* STDLIB converter spec
*/
typedef struct ICONV_S_LSPEC {
ICONV_INT iconv_specnum; /* specnum */
ICONV_S_OBJECTSPEC iconv_obj_lmth; /* relptr to object specifier*/
ICONV_S_SYMBOL iconv_sym_lmth; /* Symbol of stdlib methods */
short iconv_ntable_mbwc; /* Number of tables for mbwc*/
short iconv_ntable_wcmb; /* Number of tables for wcmb*/
ICONV_S_TBLS iconv_table[ 1 ];
} ICONV_S_LSPEC;
/* ======== ICONV_T_SPECKEY =========================================== */
/* PURPOSE:
* Spec keys are loaded first and are searchable. These are used
* both by iconv specs and stdlib specs.
*/
typedef struct ICONV_T_SPECKEY {
ICONV_S_RELPTR iconv_specifier[ 2 ];
#define ICONV_SRC 0
#define ICONV_DST 1
ICONV_R_SPEC iconv_spec; /* relative pntr to spec */
/* ICONV_S_SPEC */
} ICONV_T_SPECKEY;
/* ======== ICONV_T_METHOD ============================================ */
/* PURPOSE:
* Method record
*/
typedef struct ICONV_T_METHOD {
ICONV_INT iconv_num; /* method number */
ICONV_S_OBJECTSPEC iconv_algobject; /* relptr to object specifier*/
ICONV_S_SYMBOL iconv_algorithm; /* symbol to conversion algorithm*/
ICONV_S_OBJECTSPEC iconv_ctlobject; /* relptr to object specifier*/
ICONV_S_SYMBOL iconv_control; /* symbol to compute the size*/
/* of the conversion state */
} ICONV_T_METHOD;
/* ======== ICONV_T_SYMBOL ============================================ */
/* PURPOSE:
* Symbol structure type for shared file
*/
typedef struct ICONV_T_SYMBOL {
ICONV_INT iconv_num; /* symbol number */
ICONV_S_RELPTR iconv_name; /* relative pointer to symbol name */
} ICONV_T_SYMBOL;
/* ======== ICONV_T_OBJECTSPEC ======================================== */
/* PURPOSE:
* Object structure type for shared file
*/
typedef struct ICONV_T_OBJECTSPEC {
ICONV_INT iconv_num; /* object number */
ICONV_S_RELPTR iconv_name; /* relative pointer to object name */
} ICONV_T_OBJECTSPEC;
/* ======== ICONV_T_FILE ============================================ */
/* PURPOSE:
* File structure type for shared file
*/
typedef struct ICONV_T_FILE {
ICONV_INT iconv_num; /* file number */
ICONV_S_RELPTR iconv_name; /* relative pointer to file name */
} ICONV_T_FILE;
/* ======== ICONV_T_LOC_ALIAS ========================================= */
/* PURPOSE:
* A locale alias record
*/
typedef struct ICONV_T_LOC_ALIAS {
ICONV_S_RELPTR iconv_locale; /* relative pointer to locale name */
ICONV_S_RELPTR iconv_value; /* relative pointer to alias value */
} ICONV_T_LOC_ALIAS;
/* ======== ICONV_S_ALIAS_LIST ======================================== */
/* PURPOSE:
* Locale alias list
*/
typedef struct ICONV_S_ALIAS_LIST {
ICONV_INT iconv_count;
ICONV_S_RELPTR iconv_filler;
ICONV_T_LOC_ALIAS iconv_aliases[ 1 ];
} ICONV_S_ALIAS_LIST;
/* ======== ICONV_T_LOC_CODESET ======================================= */
/* PURPOSE:
* A locale codeset specifier
*/
typedef struct ICONV_T_LOC_CODESET {
ICONV_S_RELPTR iconv_locale; /* relative pointer to locale name */
ICONV_S_RELPTR iconv_value; /* relative pointer to alias value */
} ICONV_T_LOC_CODESET;
/* ======== ICONV_S_CODESET_LIST ====================================== */
/* PURPOSE:
* Codeset list
*/
typedef struct ICONV_S_CODESET_LIST {
ICONV_INT iconv_count;
ICONV_S_RELPTR iconv_filler;
ICONV_T_LOC_CODESET iconv_codesets[ 1 ];
} ICONV_S_CODESET_LIST;
/* ======== ICONV_T_LOC_RESOURCE ====================================== */
/* PURPOSE:
* A resource specifier
*/
typedef struct ICONV_T_LOC_RESOURCE {
ICONV_S_RELPTR iconv_resname; /* relative pointer to resource name */
ICONV_S_RELPTR iconv_value; /* relative pointer to resource value */
} ICONV_T_LOC_RESOURCE;
/* ======== ICONV_S_RESOURCE_LIST ===================================== */
/* PURPOSE:
* Resource list
*/
typedef struct ICONV_S_RESOURCE_LIST {
ICONV_INT iconv_count;
ICONV_S_RELPTR iconv_filler;
ICONV_T_LOC_RESOURCE iconv_resources[ 1 ];
} ICONV_S_RESOURCE_LIST;
/* ======== ICONV_S_TABLE ============================================= */
/* PURPOSE:
* On disk image of table of converters
*/
typedef struct ICONV_S_TABLE {
#define ICONV_MAGIC 0x3cb4ca1e
ICONV_INT iconv_magicnum; /* magic number */
ICONV_INT iconv_numfiles; /* number of files */
ICONV_INT iconv_nummethods; /* number of methods */
ICONV_INT iconv_numobject; /* number of objects */
ICONV_INT iconv_symbols; /* number of symbols */
ICONV_INT iconv_numspecobj; /* number of spec objects */
ICONV_INT iconv_numlspcobj; /* number of libspec objects*/
ICONV_S_RELPTR iconv_alias_list; /* relptr to list of aliases*/
ICONV_S_RELPTR iconv_codeset_list; /* relptr to list of codesets*/
ICONV_S_RELPTR iconv_resource_list;/* relptr to list of codesets*/
ICONV_INT iconv_numlibspec; /* number of stdlib specs */
ICONV_INT iconv_numspec; /* number of specifiers */
ICONV_T_SPECKEY iconv_speckey[1]; /* specifier keys */
} ICONV_S_TABLE;
/* ======== ICONV_SPEC ================================================ */
/* PURPOSE:
* Working version of iconv specifier
*/
typedef struct ICONV_SPEC {
ICONV_S_SPEC * iconv_s_spec;
ICONV_METHODS * iconv_meth; /* methods evaluated */
short iconv_numtab; /* number of tables */
void * iconv_table[ 1 ]; /* ptr to converter table */
} ICONV_SPEC;
/* ======== ICONV_LIBSPEC ============================================= */
/* PURPOSE:
* Working version of STDLIB spec
*/
typedef struct ICONV_LIBSPEC {
ICONV_S_LSPEC * iconv_s_spec;
ICONV_LIB_METHODS
* iconv_meth; /* methods evaluated */
short iconv_numtab_mbwc; /* number of tables for mbwc*/
short iconv_numtab_wcmb; /* number of tables for wcmb*/
void * iconv_table[ 1 ]; /* ptr to converter table */
} ICONV_LIBSPEC;
/* ======== ICONV_OBJECT ============================================== */
/* PURPOSE:
* Object pointer !
*/
typedef struct ICONV_OBJECT {
void * iconv_dlhandle; /* DSO handle */
} ICONV_OBJECT;
/* ======== ICONV_SYMBOL ============================================== */
/* PURPOSE:
* Symbol specifier.
*/
typedef struct ICONV_SYMBOL {
void * iconv_symptr; /* Pointer for symbol */
} ICONV_SYMBOL;
/* ======== ICONV_FILE ================================================= */
/* PURPOSE:
* File specifier.
*/
typedef struct ICONV_FILE {
void * iconv_fileptr; /* Pointer for symbol */
} ICONV_FILE;
/* ======== ICONV_HEAD ================================================ */
/* PURPOSE:
* Head of the iconv structures
*/
#define ICONV_DEF_TYPE( NAME, TYPNAME, STUN, DEFREF, ARRAY ) \
STUN TYPNAME { \
ICONV_SPEC DEFREF iconv_spec ARRAY; \
\
ICONV_LIBSPEC DEFREF iconv_lspc ARRAY; \
\
ICONV_SYMBOL DEFREF iconv_sym ARRAY; \
\
ICONV_OBJECT DEFREF iconv_obj ARRAY; \
\
ICONV_METHODS DEFREF iconv_meth ARRAY; \
\
ICONV_FILE DEFREF iconv_file ARRAY; \
} NAME \
/* End of define */
#define __ICONV_NADA
typedef ICONV_DEF_TYPE( ICONV_HASH_TYP_OF, ICONV_HASH_TYP_OF, union, __ICONV_NADA, [1]);
typedef ICONV_DEF_TYPE( ICONV_HASH_TYP, ICONV_HASH_TYP, union, *,__ICONV_NADA );
typedef ICONV_DEF_TYPE( ICONV_INDEXES, ICONV_INDEXES, struct, **,__ICONV_NADA );
/* A macro to compute table number from the ICONV_INDEXES structure */
#define ICONV_TBLNO( A ) ( ( int ) \
( \
( ( void ** ) &( ( ICONV_INDEXES * ) 0 )->A ) \
- ( ( void ** ) 0 ) \
) \
) \
/* End of define */
typedef struct ICONV_HASH_ELEM {
unsigned iconv_tblno:6; /* Which table it belongs to */
unsigned iconv_fill:2; /* unused bits */
unsigned iconv_index:24; /* What is it's index in the table*/
ICONV_HASH_TYP * iconv_data; /* the data being pointed to */
} ICONV_HASH_ELEM;
/* ======== ICONV_HASH_SETTING ======================================== */
/* PURPOSE:
* The settings for the hash operation. These values are extracted
* from the iconvtab as resource "hash_parameters". Default values
* are coded into iconv_lib.c .
*/
typedef struct ICONV_HASH_SETTING {
unsigned short iconv_nelems; /* Number of elems in tbl */
unsigned short iconv_max_occ; /* maximum allowed occupancy */
unsigned short iconv_hash_key[4];/* random hash key */
unsigned short iconv_thresh;
unsigned short iconv_flags;
} ICONV_HASH_SETTING;
typedef struct ICONV_HASH_HEAD {
ICONV_HASH_SETTING *iconv_hash_set;
unsigned short iconv_noccupied;/* Number currently inserted */
ICONV_HASH_ELEM iconv_elems[1]; /* hang the hash elements */
/* off here */
} ICONV_HASH_HEAD;
/* The purpose for hasing is that the iconvtab is often very large and */
/* likely getting bigger and large majority of applications will only call */
/* setlocale and it is a waste of memory and time initializing the entire */
/* indexing array for all possible iconv elements. Using a two tiered */
/* system, allocation is done by dropping elements into a hash table until */
/* it fills and then to allocate the full size index tables so that the */
/* majority of applications will only require the first tier. Setting */
/* the hash table size should be small so that little memory is requested */
/* but large enough to handle a couple of calls to setlocale for the two */
/* worst locales and also be a reasonable hashing number (prime) with some */
/* left over just in case since hash table elements are small. */
typedef struct ICONV_HEAD {
ICONV_S_TABLE * iconv_table; /* if this is nil head is not init'd*/
ICONV_HASH_HEAD * iconv_hashtab; /* ptr to hash table */
union ICONV_TABLE {
ICONV_INDEXES iconv_idx[ 1 ]; /* Tables when in index mode */
ICONV_HASH_TYP ** iconv_array[ sizeof(ICONV_INDEXES)/sizeof(void *) ];
} iconv_tbl[ 1 ];
} ICONV_HEAD;
/* MACRO's to handle hash two tiered access. */
#define ICONV_H_REFTBL( head, tbl, index, lock ) \
( \
head->iconv_hashtab ? \
iconv_hash_seek( head, ICONV_TBLNO( tbl ), index, lock )->tbl : \
( head->iconv_tbl->iconv_idx->tbl[ index ] ) \
) \
/* end of macro */
#define ICONV_H_WRITETBL( head, tbl, index, value, lock, errlabel ) \
if ( head->iconv_hashtab ) { \
if (!iconv_hash_write(head, ICONV_TBLNO(tbl),index,value,lock)) {\
goto errlabel; \
} \
} else { \
if ( ! lock ) { \
ICONV_LOCK \
} \
if ( head->iconv_tbl->iconv_idx->tbl[ index ] ) { \
if ( ! lock ) { \
ICONV_UNLOCK \
} \
goto errlabel; \
} \
head->iconv_tbl->iconv_idx->tbl[ index ] = value; \
if ( ! lock ) { \
ICONV_UNLOCK \
} \
} \
/* end of macro */
#define ICONV_HASHFUNC( hash_key, index, tblno, nelem ) \
( ( \
(((index)^((hash_key)[0])) * ((hash_key)[1])) \
+ (((tblno)^((hash_key)[2])) * ((hash_key)[3])) \
) % (nelem) ) \
/* end of macro */
extern const char * __iconv_tabname__;
#define ICONV_TABNAME __iconv_tabname__
extern char ** __iconv_tabdirs__;
#define ICONV_TABDIRS __iconv_tabdirs__
/* ======== iconv_t ============================================== */
/* PURPOSE:
* This structure contains the header of
*/
struct _t_iconv {
ICONV_CNVFUNC iconv_converter;/* Keep converter function in a */
/* convienient place to reduce */
/* access time when iconv() is called*/
void * iconv_state; /* any required cnv state memory*/
/* required by the algoritm */
ICONV_SPEC * iconv_spec; /* Spec. */
ICONV_T_SPECKEY * iconv_speckey; /* Spec key */
struct ICONV_HEAD * iconv_head; /* mother of all heads */
long iconv_a_state[ 8 ]; /* State for use by conversion*/
};
/* set default mbstate - */
extern int __mbwc_setmbstate( const char * loc );
extern char * __mbwc_locale_alias( const char * loc );
extern char * __mbwc_locale_codeset( const char * loc );
extern void * __iconv_get_resource ( char * resname, void ** relo_base );
extern void * __iconv_open_reference ( ICONV_REFER * p_ref );
#ifdef __cplusplus
}
#endif
#endif