1/* Copyright (C) 1997-1999, 2000-2002 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#include <wchar.h>
29#define __need_size_t
30#define __need_wchar_t
31#include <stddef.h>
32
33/* ISO 10646 value used to signal invalid value.  */
34#define __UNKNOWN_10646_CHAR	((wchar_t) 0xfffd)
35
36/* Error codes for gconv functions.  */
37enum
38{
39  __GCONV_OK = 0,
40  __GCONV_NOCONV,
41  __GCONV_NODB,
42  __GCONV_NOMEM,
43
44  __GCONV_EMPTY_INPUT,
45  __GCONV_FULL_OUTPUT,
46  __GCONV_ILLEGAL_INPUT,
47  __GCONV_INCOMPLETE_INPUT,
48
49  __GCONV_ILLEGAL_DESCRIPTOR,
50  __GCONV_INTERNAL_ERROR
51};
52
53
54/* Flags the `__gconv_open' function can set.  */
55enum
56{
57  __GCONV_IS_LAST = 0x0001,
58  __GCONV_IGNORE_ERRORS = 0x0002
59};
60
61
62/* Forward declarations.  */
63struct __gconv_step;
64struct __gconv_step_data;
65struct __gconv_loaded_object;
66struct __gconv_trans_data;
67
68
69/* Type of a conversion function.  */
70typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
71			    __const unsigned char **, __const unsigned char *,
72			    unsigned char **, size_t *, int, int);
73
74/* Type of a specialized conversion function for a single byte to INTERNAL.  */
75typedef wint_t (*__gconv_btowc_fct) (struct __gconv_step *, unsigned char);
76
77/* Constructor and destructor for local data for conversion step.  */
78typedef int (*__gconv_init_fct) (struct __gconv_step *);
79typedef void (*__gconv_end_fct) (struct __gconv_step *);
80
81
82/* Type of a transliteration/transscription function.  */
83typedef int (*__gconv_trans_fct) (struct __gconv_step *,
84				  struct __gconv_step_data *, void *,
85				  __const unsigned char *,
86				  __const unsigned char **,
87				  __const unsigned char *, unsigned char **,
88				  size_t *);
89
90/* Function to call to provide transliteration module with context.  */
91typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *,
92					  __const unsigned char *,
93					  unsigned char *, unsigned char *);
94
95/* Function to query module about supported encoded character sets.  */
96typedef int (*__gconv_trans_query_fct) (__const char *, __const char ***,
97					size_t *);
98
99/* Constructor and destructor for local data for transliteration.  */
100typedef int (*__gconv_trans_init_fct) (void **, const char *);
101typedef void (*__gconv_trans_end_fct) (void *);
102
103struct __gconv_trans_data
104{
105  /* Transliteration/Transscription function.  */
106  __gconv_trans_fct __trans_fct;
107  __gconv_trans_context_fct __trans_context_fct;
108  __gconv_trans_end_fct __trans_end_fct;
109  void *__data;
110  struct __gconv_trans_data *__next;
111};
112
113
114/* Description of a conversion step.  */
115struct __gconv_step
116{
117  struct __gconv_loaded_object *__shlib_handle;
118  __const char *__modname;
119
120  int __counter;
121
122  char *__from_name;
123  char *__to_name;
124
125  __gconv_fct __fct;
126  __gconv_btowc_fct __btowc_fct;
127  __gconv_init_fct __init_fct;
128  __gconv_end_fct __end_fct;
129
130  /* Information about the number of bytes needed or produced in this
131     step.  This helps optimizing the buffer sizes.  */
132  int __min_needed_from;
133  int __max_needed_from;
134  int __min_needed_to;
135  int __max_needed_to;
136
137  /* Flag whether this is a stateful encoding or not.  */
138  int __stateful;
139
140  void *__data;		/* Pointer to step-local data.  */
141};
142
143/* Additional data for steps in use of conversion descriptor.  This is
144   allocated by the `init' function.  */
145struct __gconv_step_data
146{
147  unsigned char *__outbuf;    /* Output buffer for this step.  */
148  unsigned char *__outbufend; /* Address of first byte after the output
149				 buffer.  */
150
151  /* Is this the last module in the chain.  */
152  int __flags;
153
154  /* Counter for number of invocations of the module function for this
155     descriptor.  */
156  int __invocation_counter;
157
158  /* Flag whether this is an internal use of the module (in the mb*towc*
159     and wc*tomb* functions) or regular with iconv(3).  */
160  int __internal_use;
161
162  __mbstate_t *__statep;
163  __mbstate_t __state;	/* This element must not be used directly by
164			   any module; always use STATEP!  */
165
166  /* Transliteration information.  */
167  struct __gconv_trans_data *__trans;
168};
169
170
171/* Combine conversion step description with data.  */
172typedef struct __gconv_info
173{
174  size_t __nsteps;
175  struct __gconv_step *__steps;
176  __extension__ struct __gconv_step_data __data __flexarr;
177} *__gconv_t;
178
179#endif /* gconv.h */
180