1*53ee8cc1Swenshuai.xi /* Copyright (C) 1997-1999, 2000-2002, 2007 Free Software Foundation, Inc. 2*53ee8cc1Swenshuai.xi This file is part of the GNU C Library. 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or 5*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public 6*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either 7*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version. 8*53ee8cc1Swenshuai.xi 9*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful, 10*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of 11*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12*53ee8cc1Swenshuai.xi Lesser General Public License for more details. 13*53ee8cc1Swenshuai.xi 14*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public 15*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free 16*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17*53ee8cc1Swenshuai.xi 02111-1307 USA. */ 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xi /* This header provides no interface for a user to the internals of 20*53ee8cc1Swenshuai.xi the gconv implementation in the libc. Therefore there is no use 21*53ee8cc1Swenshuai.xi for these definitions beside for writing additional gconv modules. */ 22*53ee8cc1Swenshuai.xi 23*53ee8cc1Swenshuai.xi #ifndef _GCONV_H 24*53ee8cc1Swenshuai.xi #define _GCONV_H 1 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xi #include <features.h> 27*53ee8cc1Swenshuai.xi #define __need_mbstate_t 28*53ee8cc1Swenshuai.xi #define __need_wint_t 29*53ee8cc1Swenshuai.xi #include <wchar.h> 30*53ee8cc1Swenshuai.xi #define __need_size_t 31*53ee8cc1Swenshuai.xi #define __need_wchar_t 32*53ee8cc1Swenshuai.xi #include <stddef.h> 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi /* ISO 10646 value used to signal invalid value. */ 35*53ee8cc1Swenshuai.xi #define __UNKNOWN_10646_CHAR ((wchar_t) 0xfffd) 36*53ee8cc1Swenshuai.xi 37*53ee8cc1Swenshuai.xi /* Error codes for gconv functions. */ 38*53ee8cc1Swenshuai.xi enum 39*53ee8cc1Swenshuai.xi { 40*53ee8cc1Swenshuai.xi __GCONV_OK = 0, 41*53ee8cc1Swenshuai.xi __GCONV_NOCONV, 42*53ee8cc1Swenshuai.xi __GCONV_NODB, 43*53ee8cc1Swenshuai.xi __GCONV_NOMEM, 44*53ee8cc1Swenshuai.xi 45*53ee8cc1Swenshuai.xi __GCONV_EMPTY_INPUT, 46*53ee8cc1Swenshuai.xi __GCONV_FULL_OUTPUT, 47*53ee8cc1Swenshuai.xi __GCONV_ILLEGAL_INPUT, 48*53ee8cc1Swenshuai.xi __GCONV_INCOMPLETE_INPUT, 49*53ee8cc1Swenshuai.xi 50*53ee8cc1Swenshuai.xi __GCONV_ILLEGAL_DESCRIPTOR, 51*53ee8cc1Swenshuai.xi __GCONV_INTERNAL_ERROR 52*53ee8cc1Swenshuai.xi }; 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi 55*53ee8cc1Swenshuai.xi /* Flags the `__gconv_open' function can set. */ 56*53ee8cc1Swenshuai.xi enum 57*53ee8cc1Swenshuai.xi { 58*53ee8cc1Swenshuai.xi __GCONV_IS_LAST = 0x0001, 59*53ee8cc1Swenshuai.xi __GCONV_IGNORE_ERRORS = 0x0002 60*53ee8cc1Swenshuai.xi }; 61*53ee8cc1Swenshuai.xi 62*53ee8cc1Swenshuai.xi 63*53ee8cc1Swenshuai.xi /* Forward declarations. */ 64*53ee8cc1Swenshuai.xi struct __gconv_step; 65*53ee8cc1Swenshuai.xi struct __gconv_step_data; 66*53ee8cc1Swenshuai.xi struct __gconv_loaded_object; 67*53ee8cc1Swenshuai.xi struct __gconv_trans_data; 68*53ee8cc1Swenshuai.xi 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi /* Type of a conversion function. */ 71*53ee8cc1Swenshuai.xi typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *, 72*53ee8cc1Swenshuai.xi __const unsigned char **, __const unsigned char *, 73*53ee8cc1Swenshuai.xi unsigned char **, size_t *, int, int); 74*53ee8cc1Swenshuai.xi 75*53ee8cc1Swenshuai.xi /* Type of a specialized conversion function for a single byte to INTERNAL. */ 76*53ee8cc1Swenshuai.xi typedef wint_t (*__gconv_btowc_fct) (struct __gconv_step *, unsigned char); 77*53ee8cc1Swenshuai.xi 78*53ee8cc1Swenshuai.xi /* Constructor and destructor for local data for conversion step. */ 79*53ee8cc1Swenshuai.xi typedef int (*__gconv_init_fct) (struct __gconv_step *); 80*53ee8cc1Swenshuai.xi typedef void (*__gconv_end_fct) (struct __gconv_step *); 81*53ee8cc1Swenshuai.xi 82*53ee8cc1Swenshuai.xi 83*53ee8cc1Swenshuai.xi /* Type of a transliteration/transscription function. */ 84*53ee8cc1Swenshuai.xi typedef int (*__gconv_trans_fct) (struct __gconv_step *, 85*53ee8cc1Swenshuai.xi struct __gconv_step_data *, void *, 86*53ee8cc1Swenshuai.xi __const unsigned char *, 87*53ee8cc1Swenshuai.xi __const unsigned char **, 88*53ee8cc1Swenshuai.xi __const unsigned char *, unsigned char **, 89*53ee8cc1Swenshuai.xi size_t *); 90*53ee8cc1Swenshuai.xi 91*53ee8cc1Swenshuai.xi /* Function to call to provide transliteration module with context. */ 92*53ee8cc1Swenshuai.xi typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *, 93*53ee8cc1Swenshuai.xi __const unsigned char *, 94*53ee8cc1Swenshuai.xi unsigned char *, unsigned char *); 95*53ee8cc1Swenshuai.xi 96*53ee8cc1Swenshuai.xi /* Function to query module about supported encoded character sets. */ 97*53ee8cc1Swenshuai.xi typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***, 98*53ee8cc1Swenshuai.xi size_t *); 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi /* Constructor and destructor for local data for transliteration. */ 101*53ee8cc1Swenshuai.xi typedef int (*__gconv_trans_init_fct) (void **, const char *); 102*53ee8cc1Swenshuai.xi typedef void (*__gconv_trans_end_fct) (void *); 103*53ee8cc1Swenshuai.xi 104*53ee8cc1Swenshuai.xi struct __gconv_trans_data 105*53ee8cc1Swenshuai.xi { 106*53ee8cc1Swenshuai.xi /* Transliteration/Transscription function. */ 107*53ee8cc1Swenshuai.xi __gconv_trans_fct __trans_fct; 108*53ee8cc1Swenshuai.xi __gconv_trans_context_fct __trans_context_fct; 109*53ee8cc1Swenshuai.xi __gconv_trans_end_fct __trans_end_fct; 110*53ee8cc1Swenshuai.xi void *__data; 111*53ee8cc1Swenshuai.xi struct __gconv_trans_data *__next; 112*53ee8cc1Swenshuai.xi }; 113*53ee8cc1Swenshuai.xi 114*53ee8cc1Swenshuai.xi 115*53ee8cc1Swenshuai.xi /* Description of a conversion step. */ 116*53ee8cc1Swenshuai.xi struct __gconv_step 117*53ee8cc1Swenshuai.xi { 118*53ee8cc1Swenshuai.xi struct __gconv_loaded_object *__shlib_handle; 119*53ee8cc1Swenshuai.xi __const char *__modname; 120*53ee8cc1Swenshuai.xi 121*53ee8cc1Swenshuai.xi int __counter; 122*53ee8cc1Swenshuai.xi 123*53ee8cc1Swenshuai.xi char *__from_name; 124*53ee8cc1Swenshuai.xi char *__to_name; 125*53ee8cc1Swenshuai.xi 126*53ee8cc1Swenshuai.xi __gconv_fct __fct; 127*53ee8cc1Swenshuai.xi __gconv_btowc_fct __btowc_fct; 128*53ee8cc1Swenshuai.xi __gconv_init_fct __init_fct; 129*53ee8cc1Swenshuai.xi __gconv_end_fct __end_fct; 130*53ee8cc1Swenshuai.xi 131*53ee8cc1Swenshuai.xi /* Information about the number of bytes needed or produced in this 132*53ee8cc1Swenshuai.xi step. This helps optimizing the buffer sizes. */ 133*53ee8cc1Swenshuai.xi int __min_needed_from; 134*53ee8cc1Swenshuai.xi int __max_needed_from; 135*53ee8cc1Swenshuai.xi int __min_needed_to; 136*53ee8cc1Swenshuai.xi int __max_needed_to; 137*53ee8cc1Swenshuai.xi 138*53ee8cc1Swenshuai.xi /* Flag whether this is a stateful encoding or not. */ 139*53ee8cc1Swenshuai.xi int __stateful; 140*53ee8cc1Swenshuai.xi 141*53ee8cc1Swenshuai.xi void *__data; /* Pointer to step-local data. */ 142*53ee8cc1Swenshuai.xi }; 143*53ee8cc1Swenshuai.xi 144*53ee8cc1Swenshuai.xi /* Additional data for steps in use of conversion descriptor. This is 145*53ee8cc1Swenshuai.xi allocated by the `init' function. */ 146*53ee8cc1Swenshuai.xi struct __gconv_step_data 147*53ee8cc1Swenshuai.xi { 148*53ee8cc1Swenshuai.xi unsigned char *__outbuf; /* Output buffer for this step. */ 149*53ee8cc1Swenshuai.xi unsigned char *__outbufend; /* Address of first byte after the output 150*53ee8cc1Swenshuai.xi buffer. */ 151*53ee8cc1Swenshuai.xi 152*53ee8cc1Swenshuai.xi /* Is this the last module in the chain. */ 153*53ee8cc1Swenshuai.xi int __flags; 154*53ee8cc1Swenshuai.xi 155*53ee8cc1Swenshuai.xi /* Counter for number of invocations of the module function for this 156*53ee8cc1Swenshuai.xi descriptor. */ 157*53ee8cc1Swenshuai.xi int __invocation_counter; 158*53ee8cc1Swenshuai.xi 159*53ee8cc1Swenshuai.xi /* Flag whether this is an internal use of the module (in the mb*towc* 160*53ee8cc1Swenshuai.xi and wc*tomb* functions) or regular with iconv(3). */ 161*53ee8cc1Swenshuai.xi int __internal_use; 162*53ee8cc1Swenshuai.xi 163*53ee8cc1Swenshuai.xi __mbstate_t *__statep; 164*53ee8cc1Swenshuai.xi __mbstate_t __state; /* This element must not be used directly by 165*53ee8cc1Swenshuai.xi any module; always use STATEP! */ 166*53ee8cc1Swenshuai.xi 167*53ee8cc1Swenshuai.xi /* Transliteration information. */ 168*53ee8cc1Swenshuai.xi struct __gconv_trans_data *__trans; 169*53ee8cc1Swenshuai.xi }; 170*53ee8cc1Swenshuai.xi 171*53ee8cc1Swenshuai.xi 172*53ee8cc1Swenshuai.xi /* Combine conversion step description with data. */ 173*53ee8cc1Swenshuai.xi typedef struct __gconv_info 174*53ee8cc1Swenshuai.xi { 175*53ee8cc1Swenshuai.xi size_t __nsteps; 176*53ee8cc1Swenshuai.xi struct __gconv_step *__steps; 177*53ee8cc1Swenshuai.xi __extension__ struct __gconv_step_data __data __flexarr; 178*53ee8cc1Swenshuai.xi } *__gconv_t; 179*53ee8cc1Swenshuai.xi 180*53ee8cc1Swenshuai.xi #endif /* gconv.h */ 181