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