45f3a6cf8ac0c5478a45418e94d6d30d10f5644e
[kopensolaris-gnu/glibc.git] / iconv / gconv.h
1 /* Copyright (C) 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #ifndef _GCONV_H
21 #define _GCONV_H        1
22
23 #include <features.h>
24 #include <sys/types.h>
25 #include <regex.h>
26
27 /* Error codes for gconv functions.  */
28 enum
29 {
30   GCONV_OK = 0,
31   GCONV_NOCONV,
32   GCONV_NODB,
33   GCONV_NOMEM,
34
35   GCONV_EMPTY_INPUT,
36   GCONV_FULL_OUTPUT,
37   GCONV_ILLEGAL_INPUT,
38
39   GCONV_ILLEGAL_DESCRIPTOR,
40   GCONV_INTERNAL_ERROR
41 };
42
43
44 /* Structure for alias definition.  Simply to strings.  */
45 struct gconv_alias
46 {
47   __const char *fromname;
48   __const char *toname;
49 };
50
51
52 /* Default size of intermediate buffers.  */
53 #define GCONV_DEFAULT_BUFSIZE   8160
54
55
56 /* Forward declarations.  */
57 struct gconv_step;
58 struct gconv_step_data;
59
60
61 /* Type of a conversion function.  */
62 typedef int (*gconv_fct) __P ((struct gconv_step *,
63                                struct gconv_step_data *,
64                                __const char *, size_t *, size_t *, int));
65
66 /* Constructor and destructor for local data for conversion step.  */
67 typedef int (*gconv_init_fct) __P ((struct gconv_step *,
68                                     struct gconv_step_data *));
69 typedef void (*gconv_end_fct) __P ((struct gconv_step_data *));
70
71
72 /* Description of a conversion step.  */
73 struct gconv_step
74 {
75   void *shlib_handle;
76
77   __const char *from_name;
78   __const char *to_name;
79
80   gconv_fct fct;
81   gconv_init_fct init_fct;
82   gconv_end_fct end_fct;
83 };
84
85 /* Additional data for steps in use of conversion descriptor.  This is
86    allocated by the `init' function.  */
87 struct gconv_step_data
88 {
89   char *outbuf;         /* Output buffer for this step.  */
90   size_t outbufavail;   /* Bytes already available in output buffer.  */
91   size_t outbufsize;    /* Size of output buffer.  */
92
93   int is_last;
94
95   void *data;           /* Pointer to step-local data.  */
96 };
97
98 /* Combine conversion step description with data.  */
99 typedef struct gconv_info
100 {
101   size_t nsteps;
102   struct gconv_step *steps;
103   struct gconv_step_data *data;
104 } *gconv_t;
105
106
107 /* Description for an available conversion module.  */
108 struct gconv_module
109 {
110   __const char *from_pattern;
111   __const char *from_constpfx;
112   size_t from_constpfx_len;
113   __const regex_t *from_regex;
114
115   __const char *to_string;
116
117   int cost;
118
119   __const char *module_name;
120 };
121
122
123 /* Global variables.  */
124
125 /* Database of alias names.  */
126 extern void *__gconv_alias_db;
127
128 /* Array with available modules.  */
129 extern size_t __gconv_nmodules;
130 extern struct gconv_module **__gconv_modules_db;
131
132
133 /* Return in *HANDLE decriptor for transformation from FROMSET to TOSET.  */
134 extern int __gconv_open __P ((__const char *__toset, __const char *__fromset,
135                               gconv_t *__handle));
136
137 /* Free resources associated with transformation descriptor CD.  */
138 extern int __gconv_close __P ((gconv_t cd));
139
140 /* Transform at most *INBYTESLEFT bytes from buffer starting at *INBUF
141    according to rules described by CD and place up to *OUTBYTESLEFT
142    bytes in buffer starting at *OUTBUF.  Return number of written
143    characters in *CONVERTED if this pointer is not null.  */
144 extern int __gconv __P ((gconv_t __cd,
145                          __const char **__inbuf, size_t *__inbytesleft,
146                          char **__outbuf, size_t *__outbytesleft,
147                          size_t *__converted));
148
149 /* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
150    the single steps necessary for transformation from FROMSET to TOSET.  */
151 extern int __gconv_find_transform __P ((__const char *__toset,
152                                         __const char *__fromset,
153                                         struct gconv_step **__handle,
154                                         size_t *__nsteps));
155
156 /* Read all the configuration data and cache it.  */
157 extern void __gconv_read_conf __P ((void));
158
159 /* Comparison function to search alias.  */
160 extern int __gconv_alias_compare __P ((__const void *__p1,
161                                        __const void *__p2));
162
163 /* Clear reference to transformation step implementations which might
164    cause the code to be unloaded.  */
165 extern int __gconv_close_transform __P ((struct gconv_step *__steps,
166                                          size_t __nsteps));
167
168
169 /* Find in the shared object associated with HANDLE for a function with
170    name NAME.  Return function pointer or NULL.  */
171 extern void *__gconv_find_func __P ((void *__handle, __const char *__name));
172
173 /* Load shared object named by NAME.  If already loaded increment reference
174    count.  */
175 extern void *__gconv_find_shlib __P ((__const char *__name));
176
177 /* Release shared object.  If no further reference is available unload
178    the object.  */
179 extern int __gconv_release_shlib __P ((void *__handle));
180
181 /* Fill STEP with information about builtin module with NAME.  */
182 extern void __gconv_get_builtin_trans __P ((__const char *__name,
183                                             struct gconv_step *__step));
184
185
186
187 /* Builtin transformations.  */
188 #ifdef _LIBC
189 # define __BUILTIN_TRANS(Name) \
190   extern int Name __P ((struct gconv_step *__step,                            \
191                         struct gconv_step_data *__data, __const char *__inbuf,\
192                         size_t *__inlen, size_t *__written, int __do_flush))
193
194 __BUILTIN_TRANS (__gconv_transform_dummy);
195 __BUILTIN_TRANS (__gconv_transform_ucs4_utf8);
196 __BUILTIN_TRANS (__gconv_transform_utf8_ucs4);
197 # undef __BUITLIN_TRANS
198
199 extern int __gconv_transform_init_rstate __P ((struct gconv_step *__step,
200                                               struct gconv_step_data *__data));
201 extern void __gconv_transform_end_rstate __P ((struct gconv_step_data *__data));
202
203 #endif
204
205 #endif /* gconv.h */