mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-01 17:30:07 +00:00
55985355ad
2000-06-12 Ulrich Drepper <drepper@redhat.com> * Rules (%.out): Define GCONV_PATH in the environment. * assert/Depend: New file. * iconvdata/Depend: New file. * intl/Depend: New file. * timezone/Makefile (build-testdata): Add GCONV_PATH to environment. * intl/tst-gettext.sh: Likewise. * iconv/Makefile (routines): Add gconv_trans. * iconv/gconv_trans.c: New file. * iconv/gconv.h (struct __gconv_trans_data): New type. (__gconv_fct): New parameter with starting position in output buffer. (__gconv_trans_fct, __gconv_trans_context_fct, __gconv_trans_query_fct, __gconv_trans_init_fct, __gconv_trans_end_fct): New types. (struct __gconv_step): Add new member __trans. * iconv/gconv_int.h: Pretty print prototypes. (gconv_transliterate): New prototype. (__BUILTIN_TRANS): Update for new conversion function interface. * iconv/gconv.c (__gconv): Pass new parameter to conversion function. * iconv/gconv_open.c (__gconv_open): Recognize error handling suffix in names, find appropriate function, and install in the conversion steps it can be used. * iconv/skeleton.c: Add additional parameter for beginning of output buffer. Change calls of downstream functions. * iconv/loop.c: Change loop function interface completely. Pass in step and step_data structure. Remove optimization for BODY with NEED_LENGTH_TEST == 0. * iconv/gconv_simple.c: Update interfaces of functions. Insert appropriate error handling code to use transliteration steps. Remove optimization for BODY with NEED_LENGTH_TEST == 0. * iconvdata/8bit-gap.c: Likewise. * iconvdata/8bit-generic.c: Likewise. * iconvdata/ansi_x3.110.c: Likewise. * iconvdata/big5.c: Likewise. * iconvdata/big5hkscs.c: Likewise. * iconvdata/euc-cn.c: Likewise. * iconvdata/euc-jp.c: Likewise. * iconvdata/euc-kr.c: Likewise. * iconvdata/euc-tw.c: Likewise. * iconvdata/gbgbk.c: Likewise. * iconvdata/gbk.c: Likewise. * iconvdata/iso-2022-cn.c: Likewise. * iconvdata/iso-2022-jp.c: Likewise. * iconvdata/iso-2022-kr.c: Likewise. * iconvdata/iso646.c: Likewise. * iconvdata/iso8859-1.c: Likewise. * iconvdata/iso_6937-2.c: Likewise. * iconvdata/iso_6937.c: Likewise. * iconvdata/johab.c: Likewise. * iconvdata/sjis.c: Likewise. * iconvdata/t.61.c: Likewise. * iconvdata/uhc.c: Likewise. * iconvdata/unicode.c: Likewise. * iconvdata/utf-16.c: Likewise. * libio/iofwide.c: Adjust to new interface of gconv functions. Use DL_CALL_FCT. * wcsmbs/btowc.c: Likewise. * wcsmbs/mbrtowc.c: Likewise. * wcsmbs/mbsnrtowcs.c: Likewise. * wcsmbs/mbsrtowcs.c: Likewise. * wcsmbs/wcrtomb.c: Likewise. * wcsmbs/wcsnrtombs.c: Likewise. * wcsmbs/wcsrtombs.c: Likewise. * wcsmbs/wctob.c: Likewise.
225 lines
7.0 KiB
C
225 lines
7.0 KiB
C
/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Boston, MA 02111-1307, USA. */
|
|
|
|
#ifndef _GCONV_INT_H
|
|
#define _GCONV_INT_H 1
|
|
|
|
#include "gconv.h"
|
|
#include <regex.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
|
|
/* Structure for alias definition. Simply to strings. */
|
|
struct gconv_alias
|
|
{
|
|
const char *fromname;
|
|
const char *toname;
|
|
};
|
|
|
|
|
|
/* How many character should be conveted in one call? */
|
|
#define GCONV_NCHAR_GOAL 8160
|
|
|
|
|
|
/* Structure describing one loaded shared object. This normally are
|
|
objects to perform conversation but as a special case the db shared
|
|
object is also handled. */
|
|
struct __gconv_loaded_object
|
|
{
|
|
/* Name of the object. */
|
|
const char *name;
|
|
|
|
/* Reference counter for the db functionality. If no conversion is
|
|
needed we unload the db library. */
|
|
int counter;
|
|
|
|
/* The handle for the shared object. */
|
|
void *handle;
|
|
|
|
/* Pointer to the functions the module defines. */
|
|
__gconv_fct fct;
|
|
__gconv_init_fct init_fct;
|
|
__gconv_end_fct end_fct;
|
|
};
|
|
|
|
|
|
/* Description for an available conversion module. */
|
|
struct gconv_module
|
|
{
|
|
const char *from_pattern;
|
|
const char *from_constpfx;
|
|
size_t from_constpfx_len;
|
|
const regex_t *from_regex;
|
|
regex_t from_regex_mem;
|
|
|
|
const char *to_string;
|
|
|
|
int cost_hi;
|
|
int cost_lo;
|
|
|
|
const char *module_name;
|
|
|
|
struct gconv_module *left; /* Prefix smaller. */
|
|
struct gconv_module *same; /* List of entries with identical prefix. */
|
|
struct gconv_module *matching;/* Next node with more specific prefix. */
|
|
struct gconv_module *right; /* Prefix larger. */
|
|
};
|
|
|
|
|
|
/* Flags for `gconv_open'. */
|
|
enum
|
|
{
|
|
GCONV_AVOID_NOCONV = 1 << 0
|
|
};
|
|
|
|
|
|
/* Global variables. */
|
|
|
|
/* Database of alias names. */
|
|
extern void *__gconv_alias_db;
|
|
|
|
/* Array with available modules. */
|
|
extern size_t __gconv_nmodules;
|
|
extern struct gconv_module *__gconv_modules_db;
|
|
|
|
|
|
/* The gconv functions expects the name to be in upper case and complete,
|
|
including the trailing slashes if necessary. */
|
|
#define norm_add_slashes(str) \
|
|
({ \
|
|
const char *cp = (str); \
|
|
char *result; \
|
|
char *tmp; \
|
|
size_t cnt = 0; \
|
|
\
|
|
while (*cp != '\0') \
|
|
if (*cp++ == '/') \
|
|
++cnt; \
|
|
\
|
|
tmp = result = alloca (cp - (str) + 3); \
|
|
cp = (str); \
|
|
while (*cp != '\0') \
|
|
*tmp++ = _toupper (*cp++); \
|
|
if (cnt < 2) \
|
|
{ \
|
|
*tmp++ = '/'; \
|
|
if (cnt < 1) \
|
|
*tmp++ = '/'; \
|
|
} \
|
|
*tmp = '\0'; \
|
|
result; \
|
|
})
|
|
|
|
|
|
/* Return in *HANDLE decriptor for transformation from FROMSET to TOSET. */
|
|
extern int __gconv_open (const char *toset, const char *fromset,
|
|
__gconv_t *handle, int flags)
|
|
internal_function;
|
|
|
|
/* Free resources associated with transformation descriptor CD. */
|
|
extern int __gconv_close (__gconv_t cd)
|
|
internal_function;
|
|
|
|
/* Transform at most *INBYTESLEFT bytes from buffer starting at *INBUF
|
|
according to rules described by CD and place up to *OUTBYTESLEFT
|
|
bytes in buffer starting at *OUTBUF. Return number of non-identical
|
|
conversions in *IRREVERSIBLE if this pointer is not null. */
|
|
extern int __gconv (__gconv_t cd, const unsigned char **inbuf,
|
|
const unsigned char *inbufend, unsigned char **outbuf,
|
|
unsigned char *outbufend, size_t *irreversible)
|
|
internal_function;
|
|
|
|
/* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
|
|
the single steps necessary for transformation from FROMSET to TOSET. */
|
|
extern int __gconv_find_transform (const char *toset, const char *fromset,
|
|
struct __gconv_step **handle,
|
|
size_t *nsteps, int flags)
|
|
internal_function;
|
|
|
|
/* Read all the configuration data and cache it. */
|
|
extern void __gconv_read_conf (void);
|
|
|
|
/* Comparison function to search alias. */
|
|
extern int __gconv_alias_compare (const void *p1, const void *p2);
|
|
|
|
/* Clear reference to transformation step implementations which might
|
|
cause the code to be unloaded. */
|
|
extern int __gconv_close_transform (struct __gconv_step *steps,
|
|
size_t nsteps)
|
|
internal_function;
|
|
|
|
/* Load shared object named by NAME. If already loaded increment reference
|
|
count. */
|
|
extern struct __gconv_loaded_object *__gconv_find_shlib (const char *name)
|
|
internal_function;
|
|
|
|
/* Release shared object. If no further reference is available unload
|
|
the object. */
|
|
extern int __gconv_release_shlib (struct __gconv_loaded_object *handle)
|
|
internal_function;
|
|
|
|
/* Fill STEP with information about builtin module with NAME. */
|
|
extern void __gconv_get_builtin_trans (const char *name,
|
|
struct __gconv_step *step)
|
|
internal_function;
|
|
|
|
/* Transliteration using the locale's data. */
|
|
extern int gconv_transliterate (struct __gconv_step *step,
|
|
struct __gconv_step_data *step_data,
|
|
__const unsigned char *inbufstart,
|
|
__const unsigned char **inbufp,
|
|
__const unsigned char *inbufend,
|
|
unsigned char *outbufstart,
|
|
unsigned char **outbufp,
|
|
unsigned char *outbufend,
|
|
size_t *irreversible);
|
|
|
|
|
|
/* Builtin transformations. */
|
|
#ifdef _LIBC
|
|
# define __BUILTIN_TRANS(Name) \
|
|
extern int Name (struct __gconv_step *step, \
|
|
struct __gconv_step_data *data, \
|
|
const unsigned char **inbuf, \
|
|
const unsigned char *inbufend, unsigned char *outbufstart, \
|
|
size_t *irreversible, int do_flush, int consume_incomplete)
|
|
|
|
__BUILTIN_TRANS (__gconv_transform_ascii_internal);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_ascii);
|
|
__BUILTIN_TRANS (__gconv_transform_utf8_internal);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_utf8);
|
|
__BUILTIN_TRANS (__gconv_transform_ucs2_internal);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_ucs2);
|
|
__BUILTIN_TRANS (__gconv_transform_ucs2reverse_internal);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_ucs2reverse);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_ucs4);
|
|
__BUILTIN_TRANS (__gconv_transform_ucs4_internal);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_ucs4le);
|
|
__BUILTIN_TRANS (__gconv_transform_ucs4le_internal);
|
|
__BUILTIN_TRANS (__gconv_transform_internal_utf16);
|
|
__BUILTIN_TRANS (__gconv_transform_utf16_internal);
|
|
# undef __BUITLIN_TRANS
|
|
|
|
#endif
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* gconv_int.h */
|