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