Add __BEGIN_DECLS/__END_DECLS.
[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 __BEGIN_DECLS
28
29 /* Error codes for gconv functions.  */
30 enum
31 {
32   GCONV_OK = 0,
33   GCONV_NOCONV,
34   GCONV_NODB,
35   GCONV_NOMEM,
36
37   GCONV_EMPTY_INPUT,
38   GCONV_FULL_OUTPUT,
39   GCONV_ILLEGAL_INPUT,
40
41   GCONV_ILLEGAL_DESCRIPTOR,
42   GCONV_INTERNAL_ERROR
43 };
44
45
46 /* Structure for alias definition.  Simply to strings.  */
47 struct gconv_alias
48 {
49   __const char *fromname;
50   __const char *toname;
51 };
52
53
54 /* Default size of intermediate buffers.  */
55 #define GCONV_DEFAULT_BUFSIZE   8160
56
57
58 /* Forward declarations.  */
59 struct gconv_step;
60 struct gconv_step_data;
61
62
63 /* Type of a conversion function.  */
64 typedef int (*gconv_fct) __P ((struct gconv_step *,
65                                struct gconv_step_data *,
66                                __const char *, size_t *, size_t *, int));
67
68 /* Constructor and destructor for local data for conversion step.  */
69 typedef int (*gconv_init_fct) __P ((struct gconv_step *,
70                                     struct gconv_step_data *));
71 typedef void (*gconv_end_fct) __P ((struct gconv_step_data *));
72
73
74 /* Description of a conversion step.  */
75 struct gconv_step
76 {
77   void *shlib_handle;
78
79   __const char *from_name;
80   __const char *to_name;
81
82   gconv_fct fct;
83   gconv_init_fct init_fct;
84   gconv_end_fct end_fct;
85 };
86
87 /* Additional data for steps in use of conversion descriptor.  This is
88    allocated by the `init' function.  */
89 struct gconv_step_data
90 {
91   char *outbuf;         /* Output buffer for this step.  */
92   size_t outbufavail;   /* Bytes already available in output buffer.  */
93   size_t outbufsize;    /* Size of output buffer.  */
94
95   int is_last;
96
97   void *data;           /* Pointer to step-local data.  */
98 };
99
100 /* Combine conversion step description with data.  */
101 typedef struct gconv_info
102 {
103   size_t nsteps;
104   struct gconv_step *steps;
105   struct gconv_step_data *data;
106 } *gconv_t;
107
108
109 /* Description for an available conversion module.  */
110 struct gconv_module
111 {
112   __const char *from_pattern;
113   __const char *from_constpfx;
114   size_t from_constpfx_len;
115   __const regex_t *from_regex;
116
117   __const char *to_string;
118
119   int cost;
120
121   __const char *module_name;
122 };
123
124
125 /* Global variables.  */
126
127 /* Database of alias names.  */
128 extern void *__gconv_alias_db;
129
130 /* Array with available modules.  */
131 extern size_t __gconv_nmodules;
132 extern struct gconv_module **__gconv_modules_db;
133
134
135 /* Return in *HANDLE decriptor for transformation from FROMSET to TOSET.  */
136 extern int __gconv_open __P ((__const char *__toset, __const char *__fromset,
137                               gconv_t *__handle));
138
139 /* Free resources associated with transformation descriptor CD.  */
140 extern int __gconv_close __P ((gconv_t cd));
141
142 /* Transform at most *INBYTESLEFT bytes from buffer starting at *INBUF
143    according to rules described by CD and place up to *OUTBYTESLEFT
144    bytes in buffer starting at *OUTBUF.  Return number of written
145    characters in *CONVERTED if this pointer is not null.  */
146 extern int __gconv __P ((gconv_t __cd,
147                          __const char **__inbuf, size_t *__inbytesleft,
148                          char **__outbuf, size_t *__outbytesleft,
149                          size_t *__converted));
150
151 /* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
152    the single steps necessary for transformation from FROMSET to TOSET.  */
153 extern int __gconv_find_transform __P ((__const char *__toset,
154                                         __const char *__fromset,
155                                         struct gconv_step **__handle,
156                                         size_t *__nsteps));
157
158 /* Read all the configuration data and cache it.  */
159 extern void __gconv_read_conf __P ((void));
160
161 /* Comparison function to search alias.  */
162 extern int __gconv_alias_compare __P ((__const void *__p1,
163                                        __const void *__p2));
164
165 /* Clear reference to transformation step implementations which might
166    cause the code to be unloaded.  */
167 extern int __gconv_close_transform __P ((struct gconv_step *__steps,
168                                          size_t __nsteps));
169
170
171 /* Find in the shared object associated with HANDLE for a function with
172    name NAME.  Return function pointer or NULL.  */
173 extern void *__gconv_find_func __P ((void *__handle, __const char *__name));
174
175 /* Load shared object named by NAME.  If already loaded increment reference
176    count.  */
177 extern void *__gconv_find_shlib __P ((__const char *__name));
178
179 /* Release shared object.  If no further reference is available unload
180    the object.  */
181 extern int __gconv_release_shlib __P ((void *__handle));
182
183 /* Fill STEP with information about builtin module with NAME.  */
184 extern void __gconv_get_builtin_trans __P ((__const char *__name,
185                                             struct gconv_step *__step));
186
187
188
189 /* Builtin transformations.  */
190 #ifdef _LIBC
191 # define __BUILTIN_TRANS(Name) \
192   extern int Name __P ((struct gconv_step *__step,                            \
193                         struct gconv_step_data *__data, __const char *__inbuf,\
194                         size_t *__inlen, size_t *__written, int __do_flush))
195
196 __BUILTIN_TRANS (__gconv_transform_dummy);
197 __BUILTIN_TRANS (__gconv_transform_ucs4_utf8);
198 __BUILTIN_TRANS (__gconv_transform_utf8_ucs4);
199 # undef __BUITLIN_TRANS
200
201 extern int __gconv_transform_init_rstate __P ((struct gconv_step *__step,
202                                               struct gconv_step_data *__data));
203 extern void __gconv_transform_end_rstate __P ((struct gconv_step_data *__data));
204
205 #endif
206
207 __END_DECLS
208
209 #endif /* gconv.h */