master
  1/* Copyright (C) 1997-2025 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, see
 16   <https://www.gnu.org/licenses/>.  */
 17
 18/* This header provides no interface for a user to the internals of
 19   the gconv implementation in the libc.  Therefore there is no use
 20   for these definitions beside for writing additional gconv modules.  */
 21
 22#ifndef _GCONV_H
 23#define _GCONV_H	1
 24
 25#include <features.h>
 26#include <bits/types/__mbstate_t.h>
 27#include <bits/types/wint_t.h>
 28
 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  __GCONV_SWAP = 0x0004,
 60  __GCONV_TRANSLIT = 0x0008
 61};
 62
 63
 64/* Forward declarations.  */
 65struct __gconv_step;
 66struct __gconv_step_data;
 67struct __gconv_loaded_object;
 68
 69
 70/* Type of a conversion function.  */
 71typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
 72			    const unsigned char **, const unsigned char *,
 73			    unsigned char **, size_t *, int, int);
 74
 75/* Type of a specialized conversion function for a single byte to INTERNAL.  */
 76typedef wint_t (*__gconv_btowc_fct) (struct __gconv_step *, unsigned char);
 77
 78/* Constructor and destructor for local data for conversion step.  */
 79typedef int (*__gconv_init_fct) (struct __gconv_step *);
 80typedef void (*__gconv_end_fct) (struct __gconv_step *);
 81
 82
 83/* Description of a conversion step.  */
 84struct __gconv_step
 85{
 86  struct __gconv_loaded_object *__shlib_handle;
 87  const char *__modname;
 88
 89  /* For internal use by glibc.  (Accesses to this member must occur
 90     when the internal __gconv_lock mutex is acquired).  */
 91  int __counter;
 92
 93  char *__from_name;
 94  char *__to_name;
 95
 96  __gconv_fct __fct;
 97  __gconv_btowc_fct __btowc_fct;
 98  __gconv_init_fct __init_fct;
 99  __gconv_end_fct __end_fct;
100
101  /* Information about the number of bytes needed or produced in this
102     step.  This helps optimizing the buffer sizes.  */
103  int __min_needed_from;
104  int __max_needed_from;
105  int __min_needed_to;
106  int __max_needed_to;
107
108  /* Flag whether this is a stateful encoding or not.  */
109  int __stateful;
110
111  void *__data;		/* Pointer to step-local data.  */
112};
113
114/* Additional data for steps in use of conversion descriptor.  This is
115   allocated by the `init' function.  */
116struct __gconv_step_data
117{
118  unsigned char *__outbuf;    /* Output buffer for this step.  */
119  unsigned char *__outbufend; /* Address of first byte after the output
120				 buffer.  */
121
122  /* Is this the last module in the chain.  */
123  int __flags;
124
125  /* Counter for number of invocations of the module function for this
126     descriptor.  */
127  int __invocation_counter;
128
129  /* Flag whether this is an internal use of the module (in the mb*towc*
130     and wc*tomb* functions) or regular with iconv(3).  */
131  int __internal_use;
132
133  __mbstate_t *__statep;
134  __mbstate_t __state;	/* This element must not be used directly by
135			   any module; always use STATEP!  */
136};
137
138
139/* Combine conversion step description with data.  */
140typedef struct __gconv_info
141{
142  size_t __nsteps;
143  struct __gconv_step *__steps;
144  __extension__ struct __gconv_step_data __data[0];
145} *__gconv_t;
146
147#endif /* gconv.h */