mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
Update.
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.
This commit is contained in:
parent
a5b97402f7
commit
55985355ad
65
ChangeLog
65
ChangeLog
@ -1,3 +1,68 @@
|
|||||||
|
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.
|
||||||
|
|
||||||
2000-04-11 Geoff Keating <geoffk@cygnus.com>
|
2000-04-11 Geoff Keating <geoffk@cygnus.com>
|
||||||
|
|
||||||
* sysdeps/powerpc/dl-machine.c: Include dl-machine.h after the
|
* sysdeps/powerpc/dl-machine.c: Include dl-machine.h after the
|
||||||
|
@ -26,7 +26,7 @@ include ../Makeconfig
|
|||||||
headers = iconv.h gconv.h
|
headers = iconv.h gconv.h
|
||||||
routines = iconv_open iconv iconv_close \
|
routines = iconv_open iconv iconv_close \
|
||||||
gconv_open gconv gconv_close gconv_db gconv_conf \
|
gconv_open gconv gconv_close gconv_db gconv_conf \
|
||||||
gconv_builtin gconv_simple
|
gconv_builtin gconv_simple gconv_trans
|
||||||
ifeq ($(elf),yes)
|
ifeq ($(elf),yes)
|
||||||
routines += gconv_dl
|
routines += gconv_dl
|
||||||
else
|
else
|
||||||
|
@ -46,8 +46,8 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
|
|||||||
if (inbuf == NULL || *inbuf == NULL)
|
if (inbuf == NULL || *inbuf == NULL)
|
||||||
/* We just flush. */
|
/* We just flush. */
|
||||||
result = DL_CALL_FCT (cd->__steps->__fct,
|
result = DL_CALL_FCT (cd->__steps->__fct,
|
||||||
(cd->__steps, cd->__data, NULL, NULL,
|
(cd->__steps, cd->__data, NULL, NULL,
|
||||||
irreversible, 1, 0));
|
cd->__data[0].__outbuf, irreversible, 1, 0));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const unsigned char *last_start;
|
const unsigned char *last_start;
|
||||||
@ -58,8 +58,8 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
|
|||||||
{
|
{
|
||||||
last_start = *inbuf;
|
last_start = *inbuf;
|
||||||
result = DL_CALL_FCT (cd->__steps->__fct,
|
result = DL_CALL_FCT (cd->__steps->__fct,
|
||||||
(cd->__steps, cd->__data, inbuf, inbufend,
|
(cd->__steps, cd->__data, inbuf, inbufend,
|
||||||
irreversible, 0, 0));
|
cd->__data[0].__outbuf, irreversible, 0, 0));
|
||||||
}
|
}
|
||||||
while (result == __GCONV_EMPTY_INPUT && last_start != *inbuf
|
while (result == __GCONV_EMPTY_INPUT && last_start != *inbuf
|
||||||
&& *inbuf + cd->__steps->__min_needed_from <= inbufend);
|
&& *inbuf + cd->__steps->__min_needed_from <= inbufend);
|
||||||
|
@ -62,18 +62,52 @@ enum
|
|||||||
struct __gconv_step;
|
struct __gconv_step;
|
||||||
struct __gconv_step_data;
|
struct __gconv_step_data;
|
||||||
struct __gconv_loaded_object;
|
struct __gconv_loaded_object;
|
||||||
|
struct __gconv_trans_data;
|
||||||
|
|
||||||
|
|
||||||
/* Type of a conversion function. */
|
/* Type of a conversion function. */
|
||||||
typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
|
typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
|
||||||
__const unsigned char **, __const unsigned char *,
|
__const unsigned char **, __const unsigned char *,
|
||||||
size_t *, int, int);
|
unsigned char *, size_t *, int, int);
|
||||||
|
|
||||||
/* Constructor and destructor for local data for conversion step. */
|
/* Constructor and destructor for local data for conversion step. */
|
||||||
typedef int (*__gconv_init_fct) (struct __gconv_step *);
|
typedef int (*__gconv_init_fct) (struct __gconv_step *);
|
||||||
typedef void (*__gconv_end_fct) (struct __gconv_step *);
|
typedef void (*__gconv_end_fct) (struct __gconv_step *);
|
||||||
|
|
||||||
|
|
||||||
|
/* Type of a transliteration/transscription function. */
|
||||||
|
typedef int (*__gconv_trans_fct) (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
__const unsigned char *,
|
||||||
|
__const unsigned char **,
|
||||||
|
__const unsigned char *, unsigned char *,
|
||||||
|
unsigned char **, unsigned char *, size_t *);
|
||||||
|
|
||||||
|
/* Function to call to provide transliteration module with context. */
|
||||||
|
typedef int (*__gconv_trans_context_fct) (struct __gconv_trans_data *data,
|
||||||
|
__const unsigned char *,
|
||||||
|
__const unsigned char *,
|
||||||
|
__const unsigned char *,
|
||||||
|
unsigned char *, unsigned char *,
|
||||||
|
unsigned char *);
|
||||||
|
|
||||||
|
/* Function to query module about supported encoded character sets. */
|
||||||
|
typedef int (*__gconv_trans_query_fct) (__const char **, size_t *);
|
||||||
|
|
||||||
|
/* Constructor and destructor for local data for transliteration. */
|
||||||
|
typedef int (*__gconv_trans_init_fct) (void **, const char *);
|
||||||
|
typedef void (*__gconv_trans_end_fct) (void *);
|
||||||
|
|
||||||
|
struct __gconv_trans_data
|
||||||
|
{
|
||||||
|
/* Transliteration/Transscription function. */
|
||||||
|
__gconv_trans_fct __trans_fct;
|
||||||
|
__gconv_trans_context_fct __trans_context_fct;
|
||||||
|
__gconv_trans_end_fct __trans_end_fct;
|
||||||
|
void *__data;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Description of a conversion step. */
|
/* Description of a conversion step. */
|
||||||
struct __gconv_step
|
struct __gconv_step
|
||||||
{
|
{
|
||||||
@ -124,6 +158,9 @@ struct __gconv_step_data
|
|||||||
__mbstate_t *__statep;
|
__mbstate_t *__statep;
|
||||||
__mbstate_t __state; /* This element must not be used directly by
|
__mbstate_t __state; /* This element must not be used directly by
|
||||||
any module; always use STATEP! */
|
any module; always use STATEP! */
|
||||||
|
|
||||||
|
/* Transliteration information. */
|
||||||
|
struct __gconv_trans_data __trans;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -129,8 +129,8 @@ extern struct gconv_module *__gconv_modules_db;
|
|||||||
|
|
||||||
|
|
||||||
/* Return in *HANDLE decriptor for transformation from FROMSET to TOSET. */
|
/* Return in *HANDLE decriptor for transformation from FROMSET to TOSET. */
|
||||||
extern int __gconv_open (const char *__toset, const char *__fromset,
|
extern int __gconv_open (const char *toset, const char *fromset,
|
||||||
__gconv_t *__handle, int flags)
|
__gconv_t *handle, int flags)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Free resources associated with transformation descriptor CD. */
|
/* Free resources associated with transformation descriptor CD. */
|
||||||
@ -141,55 +141,65 @@ extern int __gconv_close (__gconv_t cd)
|
|||||||
according to rules described by CD and place up to *OUTBYTESLEFT
|
according to rules described by CD and place up to *OUTBYTESLEFT
|
||||||
bytes in buffer starting at *OUTBUF. Return number of non-identical
|
bytes in buffer starting at *OUTBUF. Return number of non-identical
|
||||||
conversions in *IRREVERSIBLE if this pointer is not null. */
|
conversions in *IRREVERSIBLE if this pointer is not null. */
|
||||||
extern int __gconv (__gconv_t __cd, const unsigned char **__inbuf,
|
extern int __gconv (__gconv_t cd, const unsigned char **inbuf,
|
||||||
const unsigned char *inbufend, unsigned char **__outbuf,
|
const unsigned char *inbufend, unsigned char **outbuf,
|
||||||
unsigned char *outbufend, size_t *irreversible)
|
unsigned char *outbufend, size_t *irreversible)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
|
/* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
|
||||||
the single steps necessary for transformation from FROMSET to TOSET. */
|
the single steps necessary for transformation from FROMSET to TOSET. */
|
||||||
extern int __gconv_find_transform (const char *__toset, const char *__fromset,
|
extern int __gconv_find_transform (const char *toset, const char *fromset,
|
||||||
struct __gconv_step **__handle,
|
struct __gconv_step **handle,
|
||||||
size_t *__nsteps, int flags)
|
size_t *nsteps, int flags)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Read all the configuration data and cache it. */
|
/* Read all the configuration data and cache it. */
|
||||||
extern void __gconv_read_conf (void);
|
extern void __gconv_read_conf (void);
|
||||||
|
|
||||||
/* Comparison function to search alias. */
|
/* Comparison function to search alias. */
|
||||||
extern int __gconv_alias_compare (const void *__p1, const void *__p2);
|
extern int __gconv_alias_compare (const void *p1, const void *p2);
|
||||||
|
|
||||||
/* Clear reference to transformation step implementations which might
|
/* Clear reference to transformation step implementations which might
|
||||||
cause the code to be unloaded. */
|
cause the code to be unloaded. */
|
||||||
extern int __gconv_close_transform (struct __gconv_step *__steps,
|
extern int __gconv_close_transform (struct __gconv_step *steps,
|
||||||
size_t __nsteps)
|
size_t nsteps)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Load shared object named by NAME. If already loaded increment reference
|
/* Load shared object named by NAME. If already loaded increment reference
|
||||||
count. */
|
count. */
|
||||||
extern struct __gconv_loaded_object *__gconv_find_shlib (const char *__name)
|
extern struct __gconv_loaded_object *__gconv_find_shlib (const char *name)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Release shared object. If no further reference is available unload
|
/* Release shared object. If no further reference is available unload
|
||||||
the object. */
|
the object. */
|
||||||
extern int __gconv_release_shlib (struct __gconv_loaded_object *__handle)
|
extern int __gconv_release_shlib (struct __gconv_loaded_object *handle)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Fill STEP with information about builtin module with NAME. */
|
/* Fill STEP with information about builtin module with NAME. */
|
||||||
extern void __gconv_get_builtin_trans (const char *__name,
|
extern void __gconv_get_builtin_trans (const char *name,
|
||||||
struct __gconv_step *__step)
|
struct __gconv_step *step)
|
||||||
internal_function;
|
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. */
|
/* Builtin transformations. */
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define __BUILTIN_TRANS(Name) \
|
# define __BUILTIN_TRANS(Name) \
|
||||||
extern int Name (struct __gconv_step *__step, \
|
extern int Name (struct __gconv_step *step, \
|
||||||
struct __gconv_step_data *__data, \
|
struct __gconv_step_data *data, \
|
||||||
const unsigned char **__inbuf, \
|
const unsigned char **inbuf, \
|
||||||
const unsigned char *__inbufend, size_t *__written, \
|
const unsigned char *inbufend, unsigned char *outbufstart, \
|
||||||
int __do_flush, int __consume_incomplete)
|
size_t *irreversible, int do_flush, int consume_incomplete)
|
||||||
|
|
||||||
__BUILTIN_TRANS (__gconv_transform_ascii_internal);
|
__BUILTIN_TRANS (__gconv_transform_ascii_internal);
|
||||||
__BUILTIN_TRANS (__gconv_transform_internal_ascii);
|
__BUILTIN_TRANS (__gconv_transform_internal_ascii);
|
||||||
|
@ -36,25 +36,65 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
|
|||||||
size_t cnt = 0;
|
size_t cnt = 0;
|
||||||
int res;
|
int res;
|
||||||
int conv_flags = 0;
|
int conv_flags = 0;
|
||||||
const char *runp;
|
const char *errhand;
|
||||||
|
|
||||||
/* Find out whether "IGNORE" is part of the options in the `toset'
|
/* Find out whether any error handling method is specified. */
|
||||||
name. If yes, remove the string and remember this in the flag. */
|
errhand = strchr (toset, '/');
|
||||||
runp = __strchrnul (__strchrnul (toset, '/'), '/');
|
if (errhand != NULL)
|
||||||
if (strcmp (runp, "IGNORE") == 0)
|
errhand = strchr (errhand + 1, '/');
|
||||||
|
if (__builtin_expect (errhand != NULL, 1))
|
||||||
{
|
{
|
||||||
/* Found it. This means we should ignore conversion errors. */
|
if (errhand[1] == '\0')
|
||||||
char *newtoset = (char *) alloca (runp - toset + 1);
|
errhand = NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Make copy without the error handling description. */
|
||||||
|
char *newtoset = (char *) alloca (errhand - toset + 1);
|
||||||
|
|
||||||
newtoset[runp - toset] = '\0';
|
newtoset[errhand - toset] = '\0';
|
||||||
toset = memcpy (newtoset, toset, runp - toset);
|
toset = memcpy (newtoset, toset, errhand - toset);
|
||||||
|
|
||||||
flags = __GCONV_IGNORE_ERRORS;
|
flags = __GCONV_IGNORE_ERRORS;
|
||||||
|
|
||||||
|
if (strcasecmp (errhand, "IGNORE") == 0)
|
||||||
|
{
|
||||||
|
/* Found it. This means we should ignore conversion errors. */
|
||||||
|
flags = __GCONV_IGNORE_ERRORS;
|
||||||
|
errhand = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res = __gconv_find_transform (toset, fromset, &steps, &nsteps, flags);
|
res = __gconv_find_transform (toset, fromset, &steps, &nsteps, flags);
|
||||||
if (res == __GCONV_OK)
|
if (res == __GCONV_OK)
|
||||||
{
|
{
|
||||||
|
const char **csnames = NULL;
|
||||||
|
size_t ncsnames = 0;
|
||||||
|
__gconv_trans_fct trans_fct = NULL;
|
||||||
|
__gconv_trans_context_fct trans_context_fct = NULL;
|
||||||
|
__gconv_trans_init_fct trans_init_fct = NULL;
|
||||||
|
__gconv_trans_end_fct trans_end_fct = NULL;
|
||||||
|
|
||||||
|
if (errhand != NULL)
|
||||||
|
{
|
||||||
|
/* Find the appropriate transliteration handling. */
|
||||||
|
if (strcasecmp (errhand, "TRANSLIT") == 0)
|
||||||
|
{
|
||||||
|
/* It's the builtin transliteration handling. We only
|
||||||
|
suport for it working on the internal encoding. */
|
||||||
|
static const char *internal_trans_names[1] = { "INTERNAL" };
|
||||||
|
|
||||||
|
csnames = internal_trans_names;
|
||||||
|
ncsnames = 1;
|
||||||
|
trans_fct = gconv_transliterate;
|
||||||
|
/* No context, init, or end function. */
|
||||||
|
}
|
||||||
|
else if (strcasecmp (errhand, "WORK AROUND A GCC BUG") == 0)
|
||||||
|
{
|
||||||
|
trans_init_fct = (__gconv_trans_init_fct) 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Allocate room for handle. */
|
/* Allocate room for handle. */
|
||||||
result = (__gconv_t) malloc (sizeof (struct __gconv_info)
|
result = (__gconv_t) malloc (sizeof (struct __gconv_info)
|
||||||
+ (nsteps
|
+ (nsteps
|
||||||
@ -63,6 +103,8 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
|
|||||||
res = __GCONV_NOMEM;
|
res = __GCONV_NOMEM;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
size_t n;
|
||||||
|
|
||||||
/* Remember the list of steps. */
|
/* Remember the list of steps. */
|
||||||
result->__steps = steps;
|
result->__steps = steps;
|
||||||
result->__nsteps = nsteps;
|
result->__nsteps = nsteps;
|
||||||
@ -105,6 +147,26 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
|
|||||||
}
|
}
|
||||||
result->__data[cnt].__outbufend =
|
result->__data[cnt].__outbufend =
|
||||||
result->__data[cnt].__outbuf + size;
|
result->__data[cnt].__outbuf + size;
|
||||||
|
|
||||||
|
/* Now see whether we can use the transliteration module
|
||||||
|
for this step. */
|
||||||
|
for (n = 0; n < ncsnames; ++n)
|
||||||
|
if (strcasecmp (steps[cnt].__from_name, csnames[n]) == 0)
|
||||||
|
{
|
||||||
|
/* Match! Now try the initializer. */
|
||||||
|
if (trans_init_fct == NULL
|
||||||
|
|| (trans_init_fct (&result->__data[cnt].__trans.__data,
|
||||||
|
steps[cnt].__to_name)
|
||||||
|
== __GCONV_OK))
|
||||||
|
{
|
||||||
|
result->__data[cnt].__trans.__trans_fct = trans_fct;
|
||||||
|
result->__data[cnt].__trans.__trans_context_fct =
|
||||||
|
trans_context_fct;
|
||||||
|
result->__data[cnt].__trans.__trans_end_fct =
|
||||||
|
trans_end_fct;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now handle the last entry. */
|
/* Now handle the last entry. */
|
||||||
@ -116,6 +178,26 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
|
|||||||
result->__data[cnt].__internal_use = 0;
|
result->__data[cnt].__internal_use = 0;
|
||||||
#endif
|
#endif
|
||||||
result->__data[cnt].__statep = &result->__data[cnt].__state;
|
result->__data[cnt].__statep = &result->__data[cnt].__state;
|
||||||
|
|
||||||
|
/* Now see whether we can use the transliteration module
|
||||||
|
for this step. */
|
||||||
|
for (n = 0; n < ncsnames; ++n)
|
||||||
|
if (strcasecmp (steps[cnt].__from_name, csnames[n]) == 0)
|
||||||
|
{
|
||||||
|
/* Match! Now try the initializer. */
|
||||||
|
if (trans_init_fct == NULL
|
||||||
|
|| trans_init_fct (&result->__data[cnt].__trans.__data,
|
||||||
|
steps[cnt].__to_name)
|
||||||
|
== __GCONV_OK)
|
||||||
|
{
|
||||||
|
result->__data[cnt].__trans.__trans_fct = trans_fct;
|
||||||
|
result->__data[cnt].__trans.__trans_context_fct =
|
||||||
|
trans_context_fct;
|
||||||
|
result->__data[cnt].__trans.__trans_end_fct =
|
||||||
|
trans_end_fct;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res != __GCONV_OK)
|
if (res != __GCONV_OK)
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
@ -62,9 +63,10 @@ static const unsigned char encoding_byte[] =
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
internal_ucs4_loop (const unsigned char **inptrp, const unsigned char *inend,
|
internal_ucs4_loop (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
@ -102,10 +104,11 @@ internal_ucs4_loop (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
#ifndef _STRING_ARCH_unaligned
|
#ifndef _STRING_ARCH_unaligned
|
||||||
static inline int
|
static inline int
|
||||||
internal_ucs4_loop_unaligned (const unsigned char **inptrp,
|
internal_ucs4_loop_unaligned (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
@ -149,12 +152,14 @@ internal_ucs4_loop_unaligned (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
internal_ucs4_loop_single (const unsigned char **inptrp,
|
internal_ucs4_loop_single (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
mbstate_t *state = step_data->__statep;
|
||||||
size_t cnt = state->__count & 7;
|
size_t cnt = state->__count & 7;
|
||||||
|
|
||||||
while (*inptrp < inend && cnt < 4)
|
while (*inptrp < inend && cnt < 4)
|
||||||
@ -205,11 +210,13 @@ internal_ucs4_loop_single (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ucs4_internal_loop (const unsigned char **inptrp, const unsigned char *inend,
|
ucs4_internal_loop (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
int flags = step_data->__flags;
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
unsigned char *outptr = *outptrp;
|
unsigned char *outptr = *outptrp;
|
||||||
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||||
@ -228,6 +235,10 @@ ucs4_internal_loop (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
if (__builtin_expect (inval, 0) > 0x7fffffff)
|
if (__builtin_expect (inval, 0) > 0x7fffffff)
|
||||||
{
|
{
|
||||||
|
/* The value is too large. We don't try transliteration here since
|
||||||
|
this is not an error because of the lack of possibilities to
|
||||||
|
represent the result. This is a genuine bug in the input since
|
||||||
|
UCS4 does not allow such values. */
|
||||||
if (flags & __GCONV_IGNORE_ERRORS)
|
if (flags & __GCONV_IGNORE_ERRORS)
|
||||||
{
|
{
|
||||||
/* Just ignore this character. */
|
/* Just ignore this character. */
|
||||||
@ -259,23 +270,28 @@ ucs4_internal_loop (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
#ifndef _STRING_ARCH_unaligned
|
#ifndef _STRING_ARCH_unaligned
|
||||||
static inline int
|
static inline int
|
||||||
ucs4_internal_loop_unaligned (const unsigned char **inptrp,
|
ucs4_internal_loop_unaligned (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
int flags = step_data->__flags;
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
unsigned char *outptr = *outptrp;
|
unsigned char *outptr = *outptrp;
|
||||||
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||||
int result;
|
int result;
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
|
|
||||||
for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4, outptr += 4)
|
for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4)
|
||||||
{
|
{
|
||||||
if (__builtin_expect (inptr[0], 0) > 0x80)
|
if (__builtin_expect (inptr[0], 0) > 0x80)
|
||||||
{
|
{
|
||||||
/* The value is too large. */
|
/* The value is too large. We don't try transliteration here since
|
||||||
|
this is not an error because of the lack of possibilities to
|
||||||
|
represent the result. This is a genuine bug in the input since
|
||||||
|
UCS4 does not allow such values. */
|
||||||
if (flags & __GCONV_IGNORE_ERRORS)
|
if (flags & __GCONV_IGNORE_ERRORS)
|
||||||
{
|
{
|
||||||
/* Just ignore this character. */
|
/* Just ignore this character. */
|
||||||
@ -299,6 +315,7 @@ ucs4_internal_loop_unaligned (const unsigned char **inptrp,
|
|||||||
outptr[2] = inptr[2];
|
outptr[2] = inptr[2];
|
||||||
outptr[3] = inptr[3];
|
outptr[3] = inptr[3];
|
||||||
# endif
|
# endif
|
||||||
|
outptr += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
*inptrp = inptr;
|
*inptrp = inptr;
|
||||||
@ -318,12 +335,15 @@ ucs4_internal_loop_unaligned (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ucs4_internal_loop_single (const unsigned char **inptrp,
|
ucs4_internal_loop_single (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
mbstate_t *state = step_data->__statep;
|
||||||
|
int flags = step_data->__flags;
|
||||||
size_t cnt = state->__count & 7;
|
size_t cnt = state->__count & 7;
|
||||||
|
|
||||||
while (*inptrp < inend && cnt < 4)
|
while (*inptrp < inend && cnt < 4)
|
||||||
@ -341,7 +361,10 @@ ucs4_internal_loop_single (const unsigned char **inptrp,
|
|||||||
if (__builtin_expect (((unsigned char *) state->__value.__wchb)[0], 0)
|
if (__builtin_expect (((unsigned char *) state->__value.__wchb)[0], 0)
|
||||||
> 0x80)
|
> 0x80)
|
||||||
{
|
{
|
||||||
/* The value is too large. */
|
/* The value is too large. We don't try transliteration here since
|
||||||
|
this is not an error because of the lack of possibilities to
|
||||||
|
represent the result. This is a genuine bug in the input since
|
||||||
|
UCS4 does not allow such values. */
|
||||||
if (!(flags & __GCONV_IGNORE_ERRORS))
|
if (!(flags & __GCONV_IGNORE_ERRORS))
|
||||||
{
|
{
|
||||||
*inptrp -= cnt - (state->__count & 7);
|
*inptrp -= cnt - (state->__count & 7);
|
||||||
@ -386,9 +409,10 @@ ucs4_internal_loop_single (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
internal_ucs4le_loop (const unsigned char **inptrp, const unsigned char *inend,
|
internal_ucs4le_loop (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
@ -426,10 +450,11 @@ internal_ucs4le_loop (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
#ifndef _STRING_ARCH_unaligned
|
#ifndef _STRING_ARCH_unaligned
|
||||||
static inline int
|
static inline int
|
||||||
internal_ucs4le_loop_unaligned (const unsigned char **inptrp,
|
internal_ucs4le_loop_unaligned (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
@ -473,12 +498,14 @@ internal_ucs4le_loop_unaligned (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
internal_ucs4le_loop_single (const unsigned char **inptrp,
|
internal_ucs4le_loop_single (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
mbstate_t *state = step_data->__statep;
|
||||||
size_t cnt = state->__count & 7;
|
size_t cnt = state->__count & 7;
|
||||||
|
|
||||||
while (*inptrp < inend && cnt < 4)
|
while (*inptrp < inend && cnt < 4)
|
||||||
@ -526,11 +553,13 @@ internal_ucs4le_loop_single (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ucs4le_internal_loop (const unsigned char **inptrp, const unsigned char *inend,
|
ucs4le_internal_loop (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
int flags = step_data->__flags;
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
unsigned char *outptr = *outptrp;
|
unsigned char *outptr = *outptrp;
|
||||||
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||||
@ -549,6 +578,10 @@ ucs4le_internal_loop (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
if (__builtin_expect (inval, 0) > 0x7fffffff)
|
if (__builtin_expect (inval, 0) > 0x7fffffff)
|
||||||
{
|
{
|
||||||
|
/* The value is too large. We don't try transliteration here since
|
||||||
|
this is not an error because of the lack of possibilities to
|
||||||
|
represent the result. This is a genuine bug in the input since
|
||||||
|
UCS4 does not allow such values. */
|
||||||
if (flags & __GCONV_IGNORE_ERRORS)
|
if (flags & __GCONV_IGNORE_ERRORS)
|
||||||
{
|
{
|
||||||
/* Just ignore this character. */
|
/* Just ignore this character. */
|
||||||
@ -578,12 +611,14 @@ ucs4le_internal_loop (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
#ifndef _STRING_ARCH_unaligned
|
#ifndef _STRING_ARCH_unaligned
|
||||||
static inline int
|
static inline int
|
||||||
ucs4le_internal_loop_unaligned (const unsigned char **inptrp,
|
ucs4le_internal_loop_unaligned (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
int flags = step_data->__flags;
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
unsigned char *outptr = *outptrp;
|
unsigned char *outptr = *outptrp;
|
||||||
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
size_t n_convert = MIN (inend - inptr, outend - outptr) / 4;
|
||||||
@ -594,7 +629,10 @@ ucs4le_internal_loop_unaligned (const unsigned char **inptrp,
|
|||||||
{
|
{
|
||||||
if (__builtin_expect (inptr[3], 0) > 0x80)
|
if (__builtin_expect (inptr[3], 0) > 0x80)
|
||||||
{
|
{
|
||||||
/* The value is too large. */
|
/* The value is too large. We don't try transliteration here since
|
||||||
|
this is not an error because of the lack of possibilities to
|
||||||
|
represent the result. This is a genuine bug in the input since
|
||||||
|
UCS4 does not allow such values. */
|
||||||
if (flags & __GCONV_IGNORE_ERRORS)
|
if (flags & __GCONV_IGNORE_ERRORS)
|
||||||
{
|
{
|
||||||
/* Just ignore this character. */
|
/* Just ignore this character. */
|
||||||
@ -639,12 +677,15 @@ ucs4le_internal_loop_unaligned (const unsigned char **inptrp,
|
|||||||
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ucs4le_internal_loop_single (const unsigned char **inptrp,
|
ucs4le_internal_loop_single (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
const unsigned char *inend,
|
const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible)
|
size_t *irreversible)
|
||||||
{
|
{
|
||||||
|
mbstate_t *state = step_data->__statep;
|
||||||
|
int flags = step_data->__flags;
|
||||||
size_t cnt = state->__count & 7;
|
size_t cnt = state->__count & 7;
|
||||||
|
|
||||||
while (*inptrp < inend && cnt < 4)
|
while (*inptrp < inend && cnt < 4)
|
||||||
@ -662,7 +703,10 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
if (__builtin_expect (((unsigned char *) state->__value.__wchb)[3], 0)
|
if (__builtin_expect (((unsigned char *) state->__value.__wchb)[3], 0)
|
||||||
> 0x80)
|
> 0x80)
|
||||||
{
|
{
|
||||||
/* The value is too large. */
|
/* The value is too large. We don't try transliteration here since
|
||||||
|
this is not an error because of the lack of possibilities to
|
||||||
|
represent the result. This is a genuine bug in the input since
|
||||||
|
UCS4 does not allow such values. */
|
||||||
if (!(flags & __GCONV_IGNORE_ERRORS))
|
if (!(flags & __GCONV_IGNORE_ERRORS))
|
||||||
return __GCONV_ILLEGAL_INPUT;
|
return __GCONV_ILLEGAL_INPUT;
|
||||||
}
|
}
|
||||||
@ -710,6 +754,10 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
{ \
|
{ \
|
||||||
if (__builtin_expect (*inptr, 0) > '\x7f') \
|
if (__builtin_expect (*inptr, 0) > '\x7f') \
|
||||||
{ \
|
{ \
|
||||||
|
/* The value is too large. We don't try transliteration here since \
|
||||||
|
this is not an error because of the lack of possibilities to \
|
||||||
|
represent the result. This is a genuine bug in the input since \
|
||||||
|
ASCII does not allow such values. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is no correct ANSI_X3.4-1968 character. */ \
|
/* This is no correct ANSI_X3.4-1968 character. */ \
|
||||||
@ -718,13 +766,14 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
++*irreversible; \
|
++*irreversible; \
|
||||||
++inptr; \
|
++inptr; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
/* It's an one byte sequence. */ \
|
/* It's an one byte sequence. */ \
|
||||||
/* XXX unaligned. */ \
|
/* XXX unaligned. */ \
|
||||||
*((uint32_t *) outptr)++ = *inptr++; \
|
*((uint32_t *) outptr)++ = *inptr++; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
#include <iconv/skeleton.c>
|
#include <iconv/skeleton.c>
|
||||||
|
|
||||||
@ -740,6 +789,13 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
#define FUNCTION_NAME __gconv_transform_internal_ascii
|
#define FUNCTION_NAME __gconv_transform_internal_ascii
|
||||||
#define ONE_DIRECTION 1
|
#define ONE_DIRECTION 1
|
||||||
|
|
||||||
|
extern int FUNCTION_NAME (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *data,
|
||||||
|
const unsigned char **inptrp,
|
||||||
|
const unsigned char *inend,
|
||||||
|
unsigned char *outbufstart, size_t *irreversible,
|
||||||
|
int do_flush, int consume_incomplete);
|
||||||
|
|
||||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||||
#define LOOPFCT FROM_LOOP
|
#define LOOPFCT FROM_LOOP
|
||||||
@ -748,20 +804,31 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
/* XXX unaligned. */ \
|
/* XXX unaligned. */ \
|
||||||
if (__builtin_expect (*((uint32_t *) inptr), 0) > 0x7f) \
|
if (__builtin_expect (*((uint32_t *) inptr), 0) > 0x7f) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is no correct ANSI_X3.4-1968 character. */ \
|
/* This is no correct ANSI_X3.4-1968 character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
/* It's an one byte sequence. */ \
|
/* It's an one byte sequence. */ \
|
||||||
*outptr++ = *((uint32_t *) inptr)++; \
|
*outptr++ = *((uint32_t *) inptr)++; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
#include <iconv/skeleton.c>
|
#include <iconv/skeleton.c>
|
||||||
|
|
||||||
@ -916,7 +983,7 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + cnt > inend, 0)) \
|
if (__builtin_expect (inptr + cnt > inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We don't have enough input. But before we report that check \
|
/* We don't have enough input. But before we report that check \
|
||||||
that all the bytes are correct. */ \
|
that all the bytes are correct. */ \
|
||||||
@ -979,6 +1046,7 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
/* Now adjust the pointers and store the result. */ \
|
/* Now adjust the pointers and store the result. */ \
|
||||||
*((uint32_t *) outptr)++ = ch; \
|
*((uint32_t *) outptr)++ = ch; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
|
|
||||||
#define STORE_REST \
|
#define STORE_REST \
|
||||||
{ \
|
{ \
|
||||||
@ -1125,18 +1193,29 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
{ \
|
{ \
|
||||||
if (__builtin_expect (*((uint32_t *) inptr), 0) >= 0x10000) \
|
if (__builtin_expect (*((uint32_t *) inptr), 0) >= 0x10000) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
*((uint16_t *) outptr)++ = *((uint32_t *) inptr)++; \
|
*((uint16_t *) outptr)++ = *((uint32_t *) inptr)++; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
#include <iconv/skeleton.c>
|
#include <iconv/skeleton.c>
|
||||||
|
|
||||||
@ -1181,17 +1260,29 @@ ucs4le_internal_loop_single (const unsigned char **inptrp,
|
|||||||
uint32_t val = *((uint32_t *) inptr); \
|
uint32_t val = *((uint32_t *) inptr); \
|
||||||
if (__builtin_expect (val, 0) >= 0x10000) \
|
if (__builtin_expect (val, 0) >= 0x10000) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
*((uint16_t *) outptr)++ = bswap_16 (val); \
|
*((uint16_t *) outptr)++ = bswap_16 (val); \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
#include <iconv/skeleton.c>
|
#include <iconv/skeleton.c>
|
||||||
|
50
iconv/gconv_trans.c
Normal file
50
iconv/gconv_trans.c
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/* Transliteration using the locale's data.
|
||||||
|
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "gconv_int.h"
|
||||||
|
#include "../locale/localeinfo.h"
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
/* Find out about the locale's transliteration. */
|
||||||
|
uint_fast32_t size = _NL_CURRENT_WORD (LC_CTYPE,
|
||||||
|
_NL_CTYPE_TRANSLIT_HASH_SIZE);
|
||||||
|
uint_fast32_t layers = _NL_CURRENT_WORD (LC_CTYPE,
|
||||||
|
_NL_CTYPE_TRANSLIT_HASH_LAYERS);
|
||||||
|
|
||||||
|
/* If there is no transliteration information in the locale don't do
|
||||||
|
anything and return the error. */
|
||||||
|
if (size == 0)
|
||||||
|
return __GCONV_ILLEGAL_INPUT;
|
||||||
|
|
||||||
|
/* XXX For now we don't do anything. */
|
||||||
|
return __GCONV_ILLEGAL_INPUT;
|
||||||
|
}
|
129
iconv/loop.c
129
iconv/loop.c
@ -175,88 +175,57 @@
|
|||||||
|
|
||||||
/* The function returns the status, as defined in gconv.h. */
|
/* The function returns the status, as defined in gconv.h. */
|
||||||
static inline int
|
static inline int
|
||||||
FCTNAME (LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
|
FCTNAME (LOOPFCT) (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data,
|
|
||||||
size_t *irreversible EXTRA_LOOP_DECLS)
|
size_t *irreversible EXTRA_LOOP_DECLS)
|
||||||
{
|
{
|
||||||
int result = __GCONV_OK;
|
#ifdef LOOP_NEED_STATE
|
||||||
|
mbstate_t *state = step_data->__statep;
|
||||||
|
#endif
|
||||||
|
#ifdef LOOP_NEED_FLAGS
|
||||||
|
int flags = step_data->__flags;
|
||||||
|
#endif
|
||||||
|
#ifdef LOOP_NEED_DATA
|
||||||
|
void *data = step->__data;
|
||||||
|
#endif
|
||||||
|
int result = __GCONV_EMPTY_INPUT;
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
unsigned char *outptr = *outptrp;
|
unsigned char *outptr = *outptrp;
|
||||||
|
|
||||||
/* We run one loop where we avoid checks for underflow/overflow of the
|
|
||||||
buffers to speed up the conversion a bit. */
|
|
||||||
size_t min_in_rounds = (inend - inptr) / MAX_NEEDED_INPUT;
|
|
||||||
size_t min_out_rounds = (outend - outptr) / MAX_NEEDED_OUTPUT;
|
|
||||||
size_t min_rounds = MIN (min_in_rounds, min_out_rounds);
|
|
||||||
|
|
||||||
#ifdef INIT_PARAMS
|
#ifdef INIT_PARAMS
|
||||||
INIT_PARAMS;
|
INIT_PARAMS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef NEED_LENGTH_TEST
|
while (inptr != inend)
|
||||||
#define NEED_LENGTH_TEST 0
|
|
||||||
while (min_rounds-- > 0)
|
|
||||||
{
|
{
|
||||||
/* Here comes the body the user provides. It can stop with RESULT
|
/* `if' cases for MIN_NEEDED_OUTPUT ==/!= 1 is made to help the
|
||||||
set to GCONV_INCOMPLETE_INPUT (if the size of the input characters
|
compiler generating better code. It will optimized away
|
||||||
vary in size), GCONV_ILLEGAL_INPUT, or GCONV_FULL_OUTPUT (if the
|
since MIN_NEEDED_OUTPUT is always a constant. */
|
||||||
output characters vary in size. */
|
if ((MIN_NEEDED_OUTPUT != 1
|
||||||
BODY
|
&& __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0))
|
||||||
}
|
|| (MIN_NEEDED_OUTPUT == 1
|
||||||
|
&& __builtin_expect (outptr >= outend, 0)))
|
||||||
if (result == __GCONV_OK)
|
|
||||||
{
|
|
||||||
#if MIN_NEEDED_INPUT == MAX_NEEDED_INPUT \
|
|
||||||
&& MIN_NEEDED_OUTPUT == MAX_NEEDED_OUTPUT
|
|
||||||
/* We don't need to start another loop since we were able to determine
|
|
||||||
the maximal number of characters to copy in advance. What remains
|
|
||||||
to be determined is the status. */
|
|
||||||
if (inptr == inend)
|
|
||||||
/* No more input. */
|
|
||||||
result = __GCONV_EMPTY_INPUT;
|
|
||||||
else if ((MIN_NEEDED_OUTPUT != 1 && outptr + MIN_NEEDED_OUTPUT > outend)
|
|
||||||
|| (MIN_NEEDED_OUTPUT == 1 && outptr >= outend))
|
|
||||||
/* Overflow in the output buffer. */
|
|
||||||
result = __GCONV_FULL_OUTPUT;
|
|
||||||
else
|
|
||||||
/* We have something left in the input buffer. */
|
|
||||||
result = __GCONV_INCOMPLETE_INPUT;
|
|
||||||
#else
|
|
||||||
result = __GCONV_EMPTY_INPUT;
|
|
||||||
|
|
||||||
# undef NEED_LENGTH_TEST
|
|
||||||
# define NEED_LENGTH_TEST 1
|
|
||||||
while (inptr != inend)
|
|
||||||
{
|
{
|
||||||
/* `if' cases for MIN_NEEDED_OUTPUT ==/!= 1 is made to help the
|
/* Overflow in the output buffer. */
|
||||||
compiler generating better code. It will optimized away
|
result = __GCONV_FULL_OUTPUT;
|
||||||
since MIN_NEEDED_OUTPUT is always a constant. */
|
break;
|
||||||
if ((MIN_NEEDED_OUTPUT != 1
|
|
||||||
&& __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0))
|
|
||||||
|| (MIN_NEEDED_OUTPUT == 1
|
|
||||||
&& __builtin_expect (outptr >= outend, 0)))
|
|
||||||
{
|
|
||||||
/* Overflow in the output buffer. */
|
|
||||||
result = __GCONV_FULL_OUTPUT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (MIN_NEEDED_INPUT > 1
|
|
||||||
&& __builtin_expect (inptr + MIN_NEEDED_INPUT > inend, 0))
|
|
||||||
{
|
|
||||||
/* We don't have enough input for another complete input
|
|
||||||
character. */
|
|
||||||
result = __GCONV_INCOMPLETE_INPUT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here comes the body the user provides. It can stop with
|
|
||||||
RESULT set to GCONV_INCOMPLETE_INPUT (if the size of the
|
|
||||||
input characters vary in size), GCONV_ILLEGAL_INPUT, or
|
|
||||||
GCONV_FULL_OUTPUT (if the output characters vary in size). */
|
|
||||||
BODY
|
|
||||||
}
|
}
|
||||||
#endif /* Input and output charset are not both fixed width. */
|
if (MIN_NEEDED_INPUT > 1
|
||||||
|
&& __builtin_expect (inptr + MIN_NEEDED_INPUT > inend, 0))
|
||||||
|
{
|
||||||
|
/* We don't have enough input for another complete input
|
||||||
|
character. */
|
||||||
|
result = __GCONV_INCOMPLETE_INPUT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here comes the body the user provides. It can stop with
|
||||||
|
RESULT set to GCONV_INCOMPLETE_INPUT (if the size of the
|
||||||
|
input characters vary in size), GCONV_ILLEGAL_INPUT, or
|
||||||
|
GCONV_FULL_OUTPUT (if the output characters vary in size). */
|
||||||
|
BODY
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the pointers pointed to by the parameters. */
|
/* Update the pointers pointed to by the parameters. */
|
||||||
@ -291,11 +260,19 @@ FCTNAME (LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
# define SINGLE(fct) SINGLE2 (fct)
|
# define SINGLE(fct) SINGLE2 (fct)
|
||||||
# define SINGLE2(fct) fct##_single
|
# define SINGLE2(fct) fct##_single
|
||||||
static inline int
|
static inline int
|
||||||
SINGLE(LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
|
SINGLE(LOOPFCT) (struct __gconv_step *step,
|
||||||
|
struct __gconv_step_data *step_data,
|
||||||
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
unsigned char **outptrp, unsigned char *outend,
|
unsigned char **outptrp, unsigned char *outend,
|
||||||
mbstate_t *state, int flags, void *data, size_t *irreversible
|
size_t *irreversible EXTRA_LOOP_DECLS)
|
||||||
EXTRA_LOOP_DECLS)
|
|
||||||
{
|
{
|
||||||
|
mbstate_t *state = step_data->__statep;
|
||||||
|
#ifdef LOOP_NEED_FLAGS
|
||||||
|
int flags = step_data->__flags;
|
||||||
|
#endif
|
||||||
|
#ifdef LOOP_NEED_DATA
|
||||||
|
void *data = step->__data;
|
||||||
|
#endif
|
||||||
int result = __GCONV_OK;
|
int result = __GCONV_OK;
|
||||||
unsigned char bytebuf[MAX_NEEDED_INPUT];
|
unsigned char bytebuf[MAX_NEEDED_INPUT];
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
@ -347,8 +324,7 @@ SINGLE(LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
|
|
||||||
inptr = bytebuf;
|
inptr = bytebuf;
|
||||||
inend = &bytebuf[inlen];
|
inend = &bytebuf[inlen];
|
||||||
#undef NEED_LENGTH_TEST
|
|
||||||
#define NEED_LENGTH_TEST 1
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
BODY
|
BODY
|
||||||
@ -410,9 +386,12 @@ SINGLE(LOOPFCT) (const unsigned char **inptrp, const unsigned char *inend,
|
|||||||
#undef EXTRA_LOOP_DECLS
|
#undef EXTRA_LOOP_DECLS
|
||||||
#undef INIT_PARAMS
|
#undef INIT_PARAMS
|
||||||
#undef UPDATE_PARAMS
|
#undef UPDATE_PARAMS
|
||||||
|
#undef UNPACK_BYTES
|
||||||
|
#undef LOOP_NEED_STATE
|
||||||
|
#undef LOOP_NEED_FLAGS
|
||||||
|
#undef LOOP_NEED_DATA
|
||||||
#undef get16
|
#undef get16
|
||||||
#undef get32
|
#undef get32
|
||||||
#undef put16
|
#undef put16
|
||||||
#undef put32
|
#undef put32
|
||||||
#undef unaligned
|
#undef unaligned
|
||||||
#undef UNPACK_BYTES
|
|
||||||
|
@ -271,7 +271,8 @@ gconv_init (struct __gconv_step *step)
|
|||||||
int
|
int
|
||||||
FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
||||||
const unsigned char **inptrp, const unsigned char *inend,
|
const unsigned char **inptrp, const unsigned char *inend,
|
||||||
size_t *irreversible, int do_flush, int consume_incomplete)
|
unsigned char *outbufstart, size_t *irreversible, int do_flush,
|
||||||
|
int consume_incomplete)
|
||||||
{
|
{
|
||||||
struct __gconv_step *next_step = step + 1;
|
struct __gconv_step *next_step = step + 1;
|
||||||
struct __gconv_step_data *next_data = data + 1;
|
struct __gconv_step_data *next_data = data + 1;
|
||||||
@ -295,13 +296,14 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
|||||||
successfully emitted the escape sequence. */
|
successfully emitted the escape sequence. */
|
||||||
if (status == __GCONV_OK && ! (data->__flags & __GCONV_IS_LAST))
|
if (status == __GCONV_OK && ! (data->__flags & __GCONV_IS_LAST))
|
||||||
status = DL_CALL_FCT (fct, (next_step, next_data, NULL, NULL,
|
status = DL_CALL_FCT (fct, (next_step, next_data, NULL, NULL,
|
||||||
irreversible, 1, consume_incomplete));
|
next_data->__outbuf, irreversible, 1,
|
||||||
|
consume_incomplete));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We preserve the initial values of the pointer variables. */
|
/* We preserve the initial values of the pointer variables. */
|
||||||
const unsigned char *inptr = *inptrp;
|
const unsigned char *inptr = *inptrp;
|
||||||
unsigned char *outbuf = data->__outbuf;
|
unsigned char *outbuf = outbufstart;
|
||||||
unsigned char *outend = data->__outbufend;
|
unsigned char *outend = data->__outbufend;
|
||||||
unsigned char *outstart;
|
unsigned char *outstart;
|
||||||
/* This variable is used to count the number of characters we
|
/* This variable is used to count the number of characters we
|
||||||
@ -333,19 +335,16 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
|||||||
|
|
||||||
# if MAX_NEEDED_FROM > 1
|
# if MAX_NEEDED_FROM > 1
|
||||||
if (MAX_NEEDED_TO == 1 || FROM_DIRECTION)
|
if (MAX_NEEDED_TO == 1 || FROM_DIRECTION)
|
||||||
status = SINGLE(FROM_LOOP) (inptrp, inend, &outbuf, outend,
|
status = SINGLE(FROM_LOOP) (step, data, inptrp, inend, &outbuf,
|
||||||
data->__statep, data->__flags,
|
outend, &lirreversible
|
||||||
step->__data, &lirreversible
|
|
||||||
EXTRA_LOOP_ARGS);
|
EXTRA_LOOP_ARGS);
|
||||||
# endif
|
# endif
|
||||||
# if MAX_NEEDED_FROM > 1 && MAX_NEEDED_TO > 1 && !ONE_DIRECTION
|
# if MAX_NEEDED_FROM > 1 && MAX_NEEDED_TO > 1 && !ONE_DIRECTION
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
# if MAX_NEEDED_TO > 1 && !ONE_DIRECTION
|
# if MAX_NEEDED_TO > 1 && !ONE_DIRECTION
|
||||||
status = SINGLE(TO_LOOP) (inptrp, inend, &outbuf, outend,
|
status = SINGLE(TO_LOOP) (step, data, inptrp, inend, &outbuf,
|
||||||
data->__statep, data->__flags,
|
outend, &lirreversible EXTRA_LOOP_ARGS);
|
||||||
step->__data, &lirreversible
|
|
||||||
EXTRA_LOOP_ARGS);
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
|
if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK)
|
||||||
@ -386,16 +385,12 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
|||||||
{
|
{
|
||||||
if (FROM_DIRECTION)
|
if (FROM_DIRECTION)
|
||||||
/* Run the conversion loop. */
|
/* Run the conversion loop. */
|
||||||
status = FROM_LOOP (inptrp, inend, &outbuf, outend,
|
status = FROM_LOOP (step, data, inptrp, inend, &outbuf, outend,
|
||||||
data->__statep, data->__flags,
|
&lirreversible EXTRA_LOOP_ARGS);
|
||||||
step->__data, &lirreversible
|
|
||||||
EXTRA_LOOP_ARGS);
|
|
||||||
else
|
else
|
||||||
/* Run the conversion loop. */
|
/* Run the conversion loop. */
|
||||||
status = TO_LOOP (inptrp, inend, &outbuf, outend,
|
status = TO_LOOP (step, data, inptrp, inend, &outbuf, outend,
|
||||||
data->__statep, data->__flags,
|
&lirreversible EXTRA_LOOP_ARGS);
|
||||||
step->__data, &lirreversible
|
|
||||||
EXTRA_LOOP_ARGS);
|
|
||||||
}
|
}
|
||||||
#if !defined _STRING_ARCH_unaligned \
|
#if !defined _STRING_ARCH_unaligned \
|
||||||
&& MIN_NEEDED_FROM != 1 && MAX_NEEDED_FROM % MIN_NEEDED_FROM == 0 \
|
&& MIN_NEEDED_FROM != 1 && MAX_NEEDED_FROM % MIN_NEEDED_FROM == 0 \
|
||||||
@ -404,18 +399,14 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
|||||||
{
|
{
|
||||||
if (FROM_DIRECTION)
|
if (FROM_DIRECTION)
|
||||||
/* Run the conversion loop. */
|
/* Run the conversion loop. */
|
||||||
status = GEN_unaligned (FROM_LOOP) (inptrp, inend, &outbuf,
|
status = GEN_unaligned (FROM_LOOP) (step, data, inptrp, inend,
|
||||||
outend, data->__statep,
|
&outbuf, outend,
|
||||||
data->__flags,
|
|
||||||
step->__data,
|
|
||||||
&lirreversible
|
&lirreversible
|
||||||
EXTRA_LOOP_ARGS);
|
EXTRA_LOOP_ARGS);
|
||||||
else
|
else
|
||||||
/* Run the conversion loop. */
|
/* Run the conversion loop. */
|
||||||
status = GEN_unaligned (TO_LOOP) (inptrp, inend, &outbuf,
|
status = GEN_unaligned (TO_LOOP) (step, data, inptrp, inend,
|
||||||
outend, data->__statep,
|
&outbuf, outend,
|
||||||
data->__flags,
|
|
||||||
step->__data,
|
|
||||||
&lirreversible
|
&lirreversible
|
||||||
EXTRA_LOOP_ARGS);
|
EXTRA_LOOP_ARGS);
|
||||||
}
|
}
|
||||||
@ -445,7 +436,8 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
|||||||
int result;
|
int result;
|
||||||
|
|
||||||
result = DL_CALL_FCT (fct, (next_step, next_data, &outerr,
|
result = DL_CALL_FCT (fct, (next_step, next_data, &outerr,
|
||||||
outbuf, irreversible, 0,
|
outbuf, next_data->__outbuf,
|
||||||
|
irreversible, 0,
|
||||||
consume_incomplete));
|
consume_incomplete));
|
||||||
|
|
||||||
if (result != __GCONV_EMPTY_INPUT)
|
if (result != __GCONV_EMPTY_INPUT)
|
||||||
@ -471,22 +463,20 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|
|||||||
/* XXX Handle unaligned access here as well. */
|
/* XXX Handle unaligned access here as well. */
|
||||||
if (FROM_DIRECTION)
|
if (FROM_DIRECTION)
|
||||||
/* Run the conversion loop. */
|
/* Run the conversion loop. */
|
||||||
nstatus = FROM_LOOP ((const unsigned char **) inptrp,
|
nstatus = FROM_LOOP (step, data,
|
||||||
|
(const unsigned char **) inptrp,
|
||||||
(const unsigned char *) inend,
|
(const unsigned char *) inend,
|
||||||
(unsigned char **) &outbuf,
|
(unsigned char **) &outbuf,
|
||||||
(unsigned char *) outerr,
|
(unsigned char *) outerr,
|
||||||
data->__statep, data->__flags,
|
&lirreversible EXTRA_LOOP_ARGS);
|
||||||
step->__data, &lirreversible
|
|
||||||
EXTRA_LOOP_ARGS);
|
|
||||||
else
|
else
|
||||||
/* Run the conversion loop. */
|
/* Run the conversion loop. */
|
||||||
nstatus = TO_LOOP ((const unsigned char **) inptrp,
|
nstatus = TO_LOOP (step, data,
|
||||||
|
(const unsigned char **) inptrp,
|
||||||
(const unsigned char *) inend,
|
(const unsigned char *) inend,
|
||||||
(unsigned char **) &outbuf,
|
(unsigned char **) &outbuf,
|
||||||
(unsigned char *) outerr,
|
(unsigned char *) outerr,
|
||||||
data->__statep, data->__flags,
|
&lirreversible EXTRA_LOOP_ARGS);
|
||||||
step->__data, &lirreversible
|
|
||||||
EXTRA_LOOP_ARGS);
|
|
||||||
|
|
||||||
/* We must run out of output buffer space in this
|
/* We must run out of output buffer space in this
|
||||||
rerun. */
|
rerun. */
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
struct gap
|
struct gap
|
||||||
@ -67,6 +68,7 @@ struct gap
|
|||||||
\
|
\
|
||||||
++inptr; \
|
++inptr; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -83,7 +85,15 @@ struct gap
|
|||||||
if (__builtin_expect (ch, 0) >= 0xffff) \
|
if (__builtin_expect (ch, 0) >= 0xffff) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -98,14 +108,24 @@ struct gap
|
|||||||
if (__builtin_expect (ch < rp->start, 0)) \
|
if (__builtin_expect (ch < rp->start, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -113,20 +133,31 @@ struct gap
|
|||||||
if (__builtin_expect (res, '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (res, '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
*outptr++ = res; \
|
*outptr++ = res; \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
#define FROM_LOOP from_generic
|
#define FROM_LOOP from_generic
|
||||||
#define TO_LOOP to_generic
|
#define TO_LOOP to_generic
|
||||||
#define DEFINE_INIT 1
|
#define DEFINE_INIT 1
|
||||||
@ -50,6 +52,7 @@
|
|||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
++inptr; \
|
++inptr; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -65,19 +68,32 @@
|
|||||||
|| (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0)) \
|
|| (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
*outptr++ = from_ucs4[ch]; \
|
{ \
|
||||||
\
|
*outptr++ = from_ucs4[ch]; \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
|
} \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -407,7 +408,7 @@ static const char from_ucs4[][2] =
|
|||||||
is also available. */ \
|
is also available. */ \
|
||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && inptr + 1 >= inend) \
|
if (inptr + 1 >= inend) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. */ \
|
/* The second character is not available. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
@ -458,6 +459,7 @@ static const char from_ucs4[][2] =
|
|||||||
\
|
\
|
||||||
inptr += incr; \
|
inptr += incr; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -495,14 +497,25 @@ static const char from_ucs4[][2] =
|
|||||||
if (tmp[0] == '\0') \
|
if (tmp[0] == '\0') \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
tmp[1] = '\0'; \
|
tmp[1] = '\0'; \
|
||||||
@ -543,14 +556,25 @@ static const char from_ucs4[][2] =
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -561,14 +585,25 @@ static const char from_ucs4[][2] =
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -577,7 +612,7 @@ static const char from_ucs4[][2] =
|
|||||||
/* Now test for a possible second byte and write this if possible. */ \
|
/* Now test for a possible second byte and write this if possible. */ \
|
||||||
if (cp[1] != '\0') \
|
if (cp[1] != '\0') \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \
|
if (__builtin_expect (outptr >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The result does not fit into the buffer. */ \
|
/* The result does not fit into the buffer. */ \
|
||||||
--outptr; \
|
--outptr; \
|
||||||
@ -590,6 +625,7 @@ static const char from_ucs4[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -8438,7 +8439,7 @@ static const char from_ucs4_tab13[][2] =
|
|||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
int idx; \
|
int idx; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && inptr + 1 >= inend) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. */ \
|
/* The second character is not available. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
@ -8493,6 +8494,7 @@ static const char from_ucs4_tab13[][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -8583,18 +8585,30 @@ static const char from_ucs4_tab13[][2] =
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* See whether there is enough room for the second byte we write. */ \
|
/* See whether there is enough room for the second byte we write. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (cp[1], '\1') != '\0' \
|
if (__builtin_expect (cp[1], '\1') != '\0' \
|
||||||
&& __builtin_expect (outptr + 1 >= outend, 0)) \
|
&& __builtin_expect (outptr + 1 >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We have not enough room. */ \
|
/* We have not enough room. */ \
|
||||||
@ -8609,6 +8623,7 @@ static const char from_ucs4_tab13[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -12592,7 +12593,7 @@ static const char from_ucs4_tab14[][2] =
|
|||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
int idx; \
|
int idx; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && inptr + 1 >= inend) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. */ \
|
/* The second character is not available. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
@ -12647,6 +12648,7 @@ static const char from_ucs4_tab14[][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -12740,18 +12742,30 @@ static const char from_ucs4_tab14[][2] =
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* See whether there is enough room for the second byte we write. */ \
|
/* See whether there is enough room for the second byte we write. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (cp[1], '\1') != '\0' \
|
if (__builtin_expect (cp[1], '\1') != '\0' \
|
||||||
&& __builtin_expect (outptr + 1 >= outend, 0)) \
|
&& __builtin_expect (outptr + 1 >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We have not enough room. */ \
|
/* We have not enough room. */ \
|
||||||
@ -12766,6 +12780,7 @@ static const char from_ucs4_tab14[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gb2312.h>
|
#include <gb2312.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@ -64,7 +65,7 @@
|
|||||||
next character is also available. */ \
|
next character is also available. */ \
|
||||||
const unsigned char *endp; \
|
const unsigned char *endp; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store \
|
/* The second character is not available. Store \
|
||||||
the intermediate result. */ \
|
the intermediate result. */ \
|
||||||
@ -114,6 +115,7 @@
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -133,22 +135,31 @@
|
|||||||
{ \
|
{ \
|
||||||
size_t found; \
|
size_t found; \
|
||||||
\
|
\
|
||||||
found = ucs4_to_gb2312 (ch, outptr, \
|
found = ucs4_to_gb2312 (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
if (__builtin_expect (found, 1) != 0) \
|
||||||
? outend - outptr : MAX_NEEDED_OUTPUT)); \
|
|
||||||
if (!NEED_LENGTH_TEST || __builtin_expect (found, 1) != 0) \
|
|
||||||
{ \
|
{ \
|
||||||
if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -165,6 +176,7 @@
|
|||||||
} \
|
} \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <jis0201.h>
|
#include <jis0201.h>
|
||||||
@ -66,7 +67,7 @@
|
|||||||
character is also available. */ \
|
character is also available. */ \
|
||||||
int ch2; \
|
int ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store the \
|
/* The second character is not available. Store the \
|
||||||
intermediate result. */ \
|
intermediate result. */ \
|
||||||
@ -106,21 +107,17 @@
|
|||||||
/* This is code set 3: JIS X 0212-1990. */ \
|
/* This is code set 3: JIS X 0212-1990. */ \
|
||||||
endp = inptr + 1; \
|
endp = inptr + 1; \
|
||||||
\
|
\
|
||||||
ch = jisx0212_to_ucs4 (&endp, \
|
ch = jisx0212_to_ucs4 (&endp, inend - endp, 0x80); \
|
||||||
NEED_LENGTH_TEST ? inend - endp : 2, \
|
|
||||||
0x80); \
|
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* This is code set 1: JIS X 0208. */ \
|
/* This is code set 1: JIS X 0208. */ \
|
||||||
endp = inptr; \
|
endp = inptr; \
|
||||||
\
|
\
|
||||||
ch = jisx0208_to_ucs4 (&endp, \
|
ch = jisx0208_to_ucs4 (&endp, inend - inptr, 0x80); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, \
|
|
||||||
0x80); \
|
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0) \
|
if (__builtin_expect (ch, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Not enough input available. */ \
|
/* Not enough input available. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
@ -147,6 +144,7 @@
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -174,7 +172,7 @@
|
|||||||
size_t found; \
|
size_t found; \
|
||||||
\
|
\
|
||||||
/* See whether we have room for at least two characters. */ \
|
/* See whether we have room for at least two characters. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 1 >= outend, 0)) \
|
if (__builtin_expect (outptr + 1 >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -202,8 +200,7 @@
|
|||||||
{ \
|
{ \
|
||||||
/* No JIS 0208 character. */ \
|
/* No JIS 0208 character. */ \
|
||||||
found = ucs4_to_jisx0212 (ch, outptr + 1, \
|
found = ucs4_to_jisx0212 (ch, outptr + 1, \
|
||||||
(NEED_LENGTH_TEST \
|
outend - outptr - 1); \
|
||||||
? outend - outptr - 1 : 2)); \
|
|
||||||
\
|
\
|
||||||
if (__builtin_expect (found, 1) == 0) \
|
if (__builtin_expect (found, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
@ -221,14 +218,26 @@
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, \
|
||||||
|
&inptr, inend, *outptrp, \
|
||||||
|
&outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -237,6 +246,7 @@
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <ksc5601.h>
|
#include <ksc5601.h>
|
||||||
|
|
||||||
@ -98,9 +99,8 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
|
|||||||
{ \
|
{ \
|
||||||
/* Two-byte character. First test whether the next character \
|
/* Two-byte character. First test whether the next character \
|
||||||
is also available. */ \
|
is also available. */ \
|
||||||
ch = ksc5601_to_ucs4 (&inptr, \
|
ch = ksc5601_to_ucs4 (&inptr, inptr - inend, 0x80); \
|
||||||
NEED_LENGTH_TEST ? inptr - inend : 2, 0x80); \
|
if (__builtin_expect (ch, 1) == 0) \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0) \
|
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. */ \
|
/* The second character is not available. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
@ -125,6 +125,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -145,14 +146,24 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -160,7 +171,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
|
|||||||
/* Now test for a possible second byte and write this if possible. */ \
|
/* Now test for a possible second byte and write this if possible. */ \
|
||||||
if (cp[1] != '\0') \
|
if (cp[1] != '\0') \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \
|
if (__builtin_expect (outptr >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The result does not fit into the buffer. */ \
|
/* The result does not fit into the buffer. */ \
|
||||||
--outptr; \
|
--outptr; \
|
||||||
@ -172,6 +183,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <cns11643l1.h>
|
#include <cns11643l1.h>
|
||||||
#include <cns11643.h>
|
#include <cns11643.h>
|
||||||
@ -48,8 +49,15 @@
|
|||||||
else if ((ch <= 0xa0 || ch > 0xfe) && ch != 0x8e) \
|
else if ((ch <= 0xa0 || ch > 0xfe) && ch != 0x8e) \
|
||||||
{ \
|
{ \
|
||||||
/* This is illegal. */ \
|
/* This is illegal. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
if (! ignore_errors_p ()) \
|
||||||
break; \
|
{ \
|
||||||
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
++inptr; \
|
||||||
|
++*irreversible; \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -57,7 +65,7 @@
|
|||||||
character is also available. */ \
|
character is also available. */ \
|
||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && inptr + (ch == 0x8e ? 3 : 1) >= inend) \
|
if (inptr + (ch == 0x8e ? 3 : 1) >= inend) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store the \
|
/* The second character is not available. Store the \
|
||||||
intermediate result. */ \
|
intermediate result. */ \
|
||||||
@ -70,9 +78,16 @@
|
|||||||
/* All second bytes of a multibyte character must be >= 0xa1. */ \
|
/* All second bytes of a multibyte character must be >= 0xa1. */ \
|
||||||
if (ch2 < 0xa1 || ch2 == 0xff) \
|
if (ch2 < 0xa1 || ch2 == 0xff) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is illegal. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
if (! ignore_errors_p ()) \
|
||||||
break; \
|
{ \
|
||||||
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
++inptr; \
|
||||||
|
++*irreversible; \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (ch == 0x8e) \
|
if (ch == 0x8e) \
|
||||||
@ -80,16 +95,22 @@
|
|||||||
/* This is code set 2: CNS 11643, planes 1 to 16. */ \
|
/* This is code set 2: CNS 11643, planes 1 to 16. */ \
|
||||||
const char *endp = inptr + 1; \
|
const char *endp = inptr + 1; \
|
||||||
\
|
\
|
||||||
ch = cns11643_to_ucs4 (&endp, \
|
ch = cns11643_to_ucs4 (&endp, inend - inptr - 1, 0x80); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr - 1 : 3, \
|
|
||||||
0x80); \
|
|
||||||
/* Please note that we need not test for the missing input \
|
/* Please note that we need not test for the missing input \
|
||||||
characters here anymore. */ \
|
characters here anymore. */ \
|
||||||
if (ch == __UNKNOWN_10646_CHAR) \
|
if (ch == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal input. */ \
|
/* Illegal input. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
if (! ignore_errors_p ()) \
|
||||||
break; \
|
{ \
|
||||||
|
/* This is an illegal character. */ \
|
||||||
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
++inptr; \
|
||||||
|
++*irreversible; \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
@ -99,16 +120,22 @@
|
|||||||
/* This is code set 1: CNS 11643, plane 1. */ \
|
/* This is code set 1: CNS 11643, plane 1. */ \
|
||||||
const unsigned char *endp = inptr; \
|
const unsigned char *endp = inptr; \
|
||||||
\
|
\
|
||||||
ch = cns11643l1_to_ucs4 (&endp, \
|
ch = cns11643l1_to_ucs4 (&endp, inend - inptr, 0x80); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, \
|
|
||||||
0x80); \
|
|
||||||
/* Please note that we need not test for the missing input \
|
/* Please note that we need not test for the missing input \
|
||||||
characters here anymore. */ \
|
characters here anymore. */ \
|
||||||
if (ch == __UNKNOWN_10646_CHAR) \
|
if (ch == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal input. */ \
|
/* Illegal input. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
if (! ignore_errors_p ()) \
|
||||||
break; \
|
{ \
|
||||||
|
/* This is an illegal character. */ \
|
||||||
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
inptr += 2; \
|
||||||
|
++*irreversible; \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
inptr += 2; \
|
inptr += 2; \
|
||||||
@ -118,6 +145,7 @@
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -138,15 +166,14 @@
|
|||||||
/* Try the JIS character sets. */ \
|
/* Try the JIS character sets. */ \
|
||||||
size_t found; \
|
size_t found; \
|
||||||
\
|
\
|
||||||
found = ucs4_to_cns11643l1 (ch, outptr, \
|
found = ucs4_to_cns11643l1 (ch, outptr, outend - outptr); \
|
||||||
NEED_LENGTH_TEST ? outend - outptr : 2); \
|
if (__builtin_expect (found, 1) == 0) \
|
||||||
if (NEED_LENGTH_TEST && found == 0) \
|
|
||||||
{ \
|
{ \
|
||||||
/* We ran out of space. */ \
|
/* We ran out of space. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (found != __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* It's a CNS 11643, plane 1 character, adjust it for EUC-TW. */ \
|
/* It's a CNS 11643, plane 1 character, adjust it for EUC-TW. */ \
|
||||||
*outptr++ += 0x80; \
|
*outptr++ += 0x80; \
|
||||||
@ -156,20 +183,36 @@
|
|||||||
{ \
|
{ \
|
||||||
/* No CNS 11643, plane 1 character. */ \
|
/* No CNS 11643, plane 1 character. */ \
|
||||||
\
|
\
|
||||||
found = ucs4_to_cns11643 (ch, outptr + 1, \
|
found = ucs4_to_cns11643 (ch, outptr + 1, outend - outptr - 1); \
|
||||||
(NEED_LENGTH_TEST \
|
if (__builtin_expect (found, 1) == 0) \
|
||||||
? outend - outptr - 1 : 3)); \
|
|
||||||
if (NEED_LENGTH_TEST && found == 0) \
|
|
||||||
{ \
|
{ \
|
||||||
/* We ran out of space. */ \
|
/* We ran out of space. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (found == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* No legal input. */ \
|
/* Illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
break; \
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
|
{ \
|
||||||
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
/* It's a CNS 11643 character, adjust it for EUC-TW. */ \
|
/* It's a CNS 11643 character, adjust it for EUC-TW. */ \
|
||||||
@ -182,6 +225,7 @@
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@ -71,7 +72,7 @@
|
|||||||
UCS4 -> GB2312 -> GBK -> UCS4 \
|
UCS4 -> GB2312 -> GBK -> UCS4 \
|
||||||
\
|
\
|
||||||
might not produce identical text. */ \
|
might not produce identical text. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store \
|
/* The second character is not available. Store \
|
||||||
the intermediate result. */ \
|
the intermediate result. */ \
|
||||||
@ -79,7 +80,7 @@
|
|||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outend - outptr < 2, 0)) \
|
if (__builtin_expect (outend - outptr < 2, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We ran out of space. */ \
|
/* We ran out of space. */ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
@ -101,14 +102,25 @@
|
|||||||
&& __builtin_expect (ch, 0xa1a1) <= 0xa8c0)) \
|
&& __builtin_expect (ch, 0xa1a1) <= 0xa8c0)) \
|
||||||
{ \
|
{ \
|
||||||
/* One of the characters we cannot map. */ \
|
/* One of the characters we cannot map. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 2; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 2; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -118,6 +130,7 @@
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -136,7 +149,7 @@
|
|||||||
\
|
\
|
||||||
if (ch > 0x7f) \
|
if (ch > 0x7f) \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store \
|
/* The second character is not available. Store \
|
||||||
the intermediate result. */ \
|
the intermediate result. */ \
|
||||||
@ -144,7 +157,7 @@
|
|||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outend - outptr < 2, 0)) \
|
if (__builtin_expect (outend - outptr < 2, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We ran out of space. */ \
|
/* We ran out of space. */ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -13109,7 +13110,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
|
|||||||
#define MIN_NEEDED_TO 4
|
#define MIN_NEEDED_TO 4
|
||||||
|
|
||||||
|
|
||||||
/* First define the conversion function from ISO 8859-1 to UCS4. */
|
/* First define the conversion function from GBK to UCS4. */
|
||||||
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
#define MIN_NEEDED_INPUT MIN_NEEDED_FROM
|
||||||
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
#define MAX_NEEDED_INPUT MAX_NEEDED_FROM
|
||||||
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
#define MIN_NEEDED_OUTPUT MIN_NEEDED_TO
|
||||||
@ -13142,7 +13143,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
|
|||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
int idx; \
|
int idx; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store \
|
/* The second character is not available. Store \
|
||||||
the intermediate result. */ \
|
the intermediate result. */ \
|
||||||
@ -13194,6 +13195,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -13450,17 +13452,29 @@ static const char __gbk_from_ucs4_tab12[][2] =
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
/* See whether there is enough room for the second byte we write. */ \
|
/* See whether there is enough room for the second byte we write. */ \
|
||||||
else if (NEED_LENGTH_TEST && cp[1] != '\0' \
|
else if (cp[1] != '\0' && __builtin_expect (outptr + 1 >= outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 1 >= outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
/* We have not enough room. */ \
|
/* We have not enough room. */ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
@ -13476,6 +13490,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -140,16 +141,15 @@ enum
|
|||||||
line; we can simply ignore them \
|
line; we can simply ignore them \
|
||||||
- the initial byte of the SS2 sequence. \
|
- the initial byte of the SS2 sequence. \
|
||||||
*/ \
|
*/ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (inptr + 1 > inend, 0) \
|
||||||
&& (__builtin_expect (inptr + 1 > inend, 0) \
|
|| (inptr[1] == '$' \
|
||||||
|| (inptr[1] == '$' \
|
&& (__builtin_expect (inptr + 2 > inend, 0) \
|
||||||
&& (__builtin_expect (inptr + 2 > inend, 0) \
|
|| (inptr[2] == ')' \
|
||||||
|| (inptr[2] == ')' \
|
&& __builtin_expect (inptr + 3 > inend, 0)) \
|
||||||
&& __builtin_expect (inptr + 3 > inend, 0)) \
|
|| (inptr[2] == '*' \
|
||||||
|| (inptr[2] == '*' \
|
&& __builtin_expect (inptr + 3 > inend, 0)))) \
|
||||||
&& __builtin_expect (inptr + 3 > inend, 0)))) \
|
|| (inptr[1] == SS2_1 \
|
||||||
|| (inptr[1] == SS2_1 \
|
&& __builtin_expect (inptr + 3 > inend, 0))) \
|
||||||
&& __builtin_expect (inptr + 3 > inend, 0)))) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_EMPTY_INPUT; \
|
result = __GCONV_EMPTY_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -216,16 +216,14 @@ enum
|
|||||||
{ \
|
{ \
|
||||||
/* That's pretty easy, we have a dedicated functions for this. */ \
|
/* That's pretty easy, we have a dedicated functions for this. */ \
|
||||||
if (set == GB2312_set) \
|
if (set == GB2312_set) \
|
||||||
ch = gb2312_to_ucs4 (&inptr, \
|
ch = gb2312_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0); \
|
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
assert (set == CNS11643_1_set); \
|
assert (set == CNS11643_1_set); \
|
||||||
ch = cns11643l1_to_ucs4 (&inptr, \
|
ch = cns11643l1_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0);\
|
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0) \
|
if (__builtin_expect (ch, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_EMPTY_INPUT; \
|
result = __GCONV_EMPTY_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -248,6 +246,7 @@ enum
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , int *setp
|
#define EXTRA_LOOP_DECLS , int *setp
|
||||||
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
||||||
int ann = *setp & CURRENT_ANN_MASK
|
int ann = *setp & CURRENT_ANN_MASK
|
||||||
@ -272,7 +271,7 @@ enum
|
|||||||
{ \
|
{ \
|
||||||
*outptr++ = SI; \
|
*outptr++ = SI; \
|
||||||
set = ASCII_set; \
|
set = ASCII_set; \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr == outend, 0)) \
|
if (__builtin_expect (outptr == outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -325,14 +324,26 @@ enum
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* Even this does not work. Error. */ \
|
/* Even this does not work. Error. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, \
|
||||||
|
&inptr, inend, *outptrp, \
|
||||||
|
&outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -348,8 +359,7 @@ enum
|
|||||||
{ \
|
{ \
|
||||||
const char *escseq; \
|
const char *escseq; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 4 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 4 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -404,8 +414,7 @@ enum
|
|||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
else if (NEED_LENGTH_TEST \
|
else if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 2 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -418,6 +427,7 @@ enum
|
|||||||
/* Now that we wrote the output increment the input pointer. */ \
|
/* Now that we wrote the output increment the input pointer. */ \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , int *setp
|
#define EXTRA_LOOP_DECLS , int *setp
|
||||||
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
||||||
int ann = *setp & CURRENT_ANN_MASK
|
int ann = *setp & CURRENT_ANN_MASK
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -444,26 +445,22 @@ gconv_end (struct __gconv_step *data)
|
|||||||
JIS X 0208. Therefore I'm using the tables for JIS X \
|
JIS X 0208. Therefore I'm using the tables for JIS X \
|
||||||
0208-1990. If somebody has problems with this please \
|
0208-1990. If somebody has problems with this please \
|
||||||
provide the appropriate tables. */ \
|
provide the appropriate tables. */ \
|
||||||
ch = jisx0208_to_ucs4 (&inptr, \
|
ch = jisx0208_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0); \
|
|
||||||
else if (set == JISX0212_set) \
|
else if (set == JISX0212_set) \
|
||||||
/* Use the JIS X 0212 table. */ \
|
/* Use the JIS X 0212 table. */ \
|
||||||
ch = jisx0212_to_ucs4 (&inptr, \
|
ch = jisx0212_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0); \
|
|
||||||
else if (set == GB2312_set) \
|
else if (set == GB2312_set) \
|
||||||
/* Use the GB 2312 table. */ \
|
/* Use the GB 2312 table. */ \
|
||||||
ch = gb2312_to_ucs4 (&inptr, \
|
ch = gb2312_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0); \
|
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
assert (set == KSC5601_set); \
|
assert (set == KSC5601_set); \
|
||||||
\
|
\
|
||||||
/* Use the KSC 5601 table. */ \
|
/* Use the KSC 5601 table. */ \
|
||||||
ch = ksc5601_to_ucs4 (&inptr, \
|
ch = ksc5601_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0); \
|
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0) \
|
if (__builtin_expect (ch, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_EMPTY_INPUT; \
|
result = __GCONV_EMPTY_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -485,6 +482,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , enum variant var, int *setp
|
#define EXTRA_LOOP_DECLS , enum variant var, int *setp
|
||||||
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
||||||
int set2 = *setp & CURRENT_ASSIGN_MASK
|
int set2 = *setp & CURRENT_ASSIGN_MASK
|
||||||
@ -554,26 +552,19 @@ gconv_end (struct __gconv_step *data)
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
if (set == JISX0208_1978_set || set == JISX0208_1983_set) \
|
if (set == JISX0208_1978_set || set == JISX0208_1983_set) \
|
||||||
written = ucs4_to_jisx0208 (ch, outptr, \
|
written = ucs4_to_jisx0208 (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
|
||||||
? outend - outptr : 2)); \
|
|
||||||
else if (set == JISX0212_set) \
|
else if (set == JISX0212_set) \
|
||||||
written = ucs4_to_jisx0212 (ch, outptr, \
|
written = ucs4_to_jisx0212 (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
|
||||||
? outend - outptr : 2)); \
|
|
||||||
else if (set == GB2312_set) \
|
else if (set == GB2312_set) \
|
||||||
written = ucs4_to_gb2312 (ch, outptr, (NEED_LENGTH_TEST \
|
written = ucs4_to_gb2312 (ch, outptr, outend - outptr); \
|
||||||
? outend - outptr : 2)); \
|
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
assert (set == KSC5601_set); \
|
assert (set == KSC5601_set); \
|
||||||
\
|
\
|
||||||
written = ucs4_to_ksc5601 (ch, outptr, \
|
written = ucs4_to_ksc5601 (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
|
||||||
? outend - outptr : 2)); \
|
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \
|
if (__builtin_expect (written, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -631,7 +622,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
{ \
|
{ \
|
||||||
/* We must encode using ASCII. First write out the \
|
/* We must encode using ASCII. First write out the \
|
||||||
escape sequence. */ \
|
escape sequence. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 3 > outend, 0))\
|
if (__builtin_expect (outptr + 3 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -642,7 +633,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'B'; \
|
*outptr++ = 'B'; \
|
||||||
set = ASCII_set; \
|
set = ASCII_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 1 > outend, 0))\
|
if (__builtin_expect (outptr + 1 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -666,8 +657,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
if (written != __UNKNOWN_10646_CHAR && buf[0] < 0x80) \
|
if (written != __UNKNOWN_10646_CHAR && buf[0] < 0x80) \
|
||||||
{ \
|
{ \
|
||||||
/* We use JIS X 0201. */ \
|
/* We use JIS X 0201. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 3 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -678,8 +668,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'J'; \
|
*outptr++ = 'J'; \
|
||||||
set = JISX0201_Roman_set; \
|
set = JISX0201_Roman_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 1 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 1 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -692,8 +681,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
if (written != __UNKNOWN_10646_CHAR) \
|
if (written != __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* We use JIS X 0208. */ \
|
/* We use JIS X 0208. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 3 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -704,8 +692,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'B'; \
|
*outptr++ = 'B'; \
|
||||||
set = JISX0208_1983_set; \
|
set = JISX0208_1983_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 2 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -716,13 +703,27 @@ gconv_end (struct __gconv_step *data)
|
|||||||
else if (__builtin_expect (var, iso2022jp2) == iso2022jp) \
|
else if (__builtin_expect (var, iso2022jp2) == iso2022jp) \
|
||||||
{ \
|
{ \
|
||||||
/* We have no other choice. */ \
|
/* We have no other choice. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, \
|
||||||
|
&inptr, inend, *outptrp, \
|
||||||
|
&outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -730,8 +731,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
if (written != __UNKNOWN_10646_CHAR) \
|
if (written != __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* We use JIS X 0212. */ \
|
/* We use JIS X 0212. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 4 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 4 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -742,8 +742,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'D'; \
|
*outptr++ = 'D'; \
|
||||||
set = JISX0212_set; \
|
set = JISX0212_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 2 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -758,8 +757,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
&& buf[0] >= 0x80) \
|
&& buf[0] >= 0x80) \
|
||||||
{ \
|
{ \
|
||||||
/* We use JIS X 0201. */ \
|
/* We use JIS X 0201. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 3 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -770,8 +768,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'I'; \
|
*outptr++ = 'I'; \
|
||||||
set = JISX0201_Kana_set; \
|
set = JISX0201_Kana_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 1 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 1 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -781,8 +778,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
else if (ch != 0xa5 && ch >= 0x80 && ch <= 0xff) \
|
else if (ch != 0xa5 && ch >= 0x80 && ch <= 0xff) \
|
||||||
{ \
|
{ \
|
||||||
/* ISO 8859-1 upper half. */ \
|
/* ISO 8859-1 upper half. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 3 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -793,8 +789,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'A'; \
|
*outptr++ = 'A'; \
|
||||||
set2 = ISO88591_set; \
|
set2 = ISO88591_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 > outend, 0)) \
|
||||||
&& __builtin_expect (outptr + 3 > outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -809,9 +804,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
if (written != __UNKNOWN_10646_CHAR) \
|
if (written != __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* We use GB 2312. */ \
|
/* We use GB 2312. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 > outend, 0))\
|
||||||
&& __builtin_expect (outptr + 3 > outend, \
|
|
||||||
0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -822,9 +815,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'A'; \
|
*outptr++ = 'A'; \
|
||||||
set = GB2312_set; \
|
set = GB2312_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 2 > outend, 0))\
|
||||||
&& __builtin_expect (outptr + 2 > outend, \
|
|
||||||
0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -838,9 +829,8 @@ gconv_end (struct __gconv_step *data)
|
|||||||
if (written != __UNKNOWN_10646_CHAR) \
|
if (written != __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* We use KSC 5601. */ \
|
/* We use KSC 5601. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 4 > outend,\
|
||||||
&& __builtin_expect (outptr + 4 \
|
0)) \
|
||||||
> outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -851,9 +841,8 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'C'; \
|
*outptr++ = 'C'; \
|
||||||
set = KSC5601_set; \
|
set = KSC5601_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 2 > outend,\
|
||||||
&& __builtin_expect (outptr + 2 \
|
0)) \
|
||||||
> outend, 0)) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -877,9 +866,8 @@ gconv_end (struct __gconv_step *data)
|
|||||||
if (__builtin_expect (gch, 1) != 0) \
|
if (__builtin_expect (gch, 1) != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* We use ISO 8859-7 greek. */ \
|
/* We use ISO 8859-7 greek. */ \
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 \
|
||||||
&& __builtin_expect (outptr + 3 \
|
> outend, 0)) \
|
||||||
> outend, 0))\
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -889,9 +877,8 @@ gconv_end (struct __gconv_step *data)
|
|||||||
*outptr++ = 'F'; \
|
*outptr++ = 'F'; \
|
||||||
set2 = ISO88597_set; \
|
set2 = ISO88597_set; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST \
|
if (__builtin_expect (outptr + 3 \
|
||||||
&& __builtin_expect (outptr + 3 \
|
> outend, 0)) \
|
||||||
> outend, 0))\
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -902,13 +889,29 @@ gconv_end (struct __gconv_step *data)
|
|||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct \
|
||||||
|
!= NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT \
|
||||||
|
(step_data->__trans.__trans_fct,\
|
||||||
|
(step, step_data, *inptrp, \
|
||||||
|
&inptr, inend, *outptrp, \
|
||||||
|
&outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -922,6 +925,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
/* Now that we wrote the output increment the input pointer. */ \
|
/* Now that we wrote the output increment the input pointer. */ \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , enum variant var, int *setp
|
#define EXTRA_LOOP_DECLS , enum variant var, int *setp
|
||||||
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
#define INIT_PARAMS int set = *setp & CURRENT_SEL_MASK; \
|
||||||
int set2 = *setp & CURRENT_ASSIGN_MASK
|
int set2 = *setp & CURRENT_ASSIGN_MASK
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -141,10 +142,9 @@ enum
|
|||||||
switching is done using the SI and SO bytes. But we have to \
|
switching is done using the SI and SO bytes. But we have to \
|
||||||
recognize `Esc $ ) C' since this is a kind of flag for this \
|
recognize `Esc $ ) C' since this is a kind of flag for this \
|
||||||
encoding. We simply ignore it. */ \
|
encoding. We simply ignore it. */ \
|
||||||
if ((NEED_LENGTH_TEST && __builtin_expect (inptr + 1 > inend, 0)) \
|
if (__builtin_expect (inptr + 1 > inend, 0) \
|
||||||
|| (inptr[1] == '$' \
|
|| (inptr[1] == '$' \
|
||||||
&& ((NEED_LENGTH_TEST \
|
&& (__builtin_expect (inptr + 2 > inend, 0) \
|
||||||
&& __builtin_expect (inptr + 2 > inend, 0)) \
|
|
||||||
|| (inptr[2] == ')' \
|
|| (inptr[2] == ')' \
|
||||||
&& __builtin_expect (inptr + 3 > inend, 0))))) \
|
&& __builtin_expect (inptr + 3 > inend, 0))))) \
|
||||||
\
|
\
|
||||||
@ -184,10 +184,9 @@ enum
|
|||||||
assert (set == KSC5601_set); \
|
assert (set == KSC5601_set); \
|
||||||
\
|
\
|
||||||
/* Use the KSC 5601 table. */ \
|
/* Use the KSC 5601 table. */ \
|
||||||
ch = ksc5601_to_ucs4 (&inptr, \
|
ch = ksc5601_to_ucs4 (&inptr, inend - inptr, 0); \
|
||||||
NEED_LENGTH_TEST ? inend - inptr : 2, 0); \
|
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0) \
|
if (__builtin_expect (ch, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_EMPTY_INPUT; \
|
result = __GCONV_EMPTY_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -210,6 +209,7 @@ enum
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , int *setp
|
#define EXTRA_LOOP_DECLS , int *setp
|
||||||
#define INIT_PARAMS int set = *setp
|
#define INIT_PARAMS int set = *setp
|
||||||
#define UPDATE_PARAMS *setp = set
|
#define UPDATE_PARAMS *setp = set
|
||||||
@ -236,7 +236,7 @@ enum
|
|||||||
{ \
|
{ \
|
||||||
*outptr++ = SI; \
|
*outptr++ = SI; \
|
||||||
set = ASCII_set; \
|
set = ASCII_set; \
|
||||||
if (NEED_LENGTH_TEST && outptr == outend) \
|
if (__builtin_expect (outptr == outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -255,13 +255,26 @@ enum
|
|||||||
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -274,7 +287,7 @@ enum
|
|||||||
set = KSC5601_set; \
|
set = KSC5601_set; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))\
|
if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -288,6 +301,7 @@ enum
|
|||||||
/* Now that we wrote the output increment the input pointer. */ \
|
/* Now that we wrote the output increment the input pointer. */ \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , int *setp
|
#define EXTRA_LOOP_DECLS , int *setp
|
||||||
#define INIT_PARAMS int set = *setp
|
#define INIT_PARAMS int set = *setp
|
||||||
#define UPDATE_PARAMS *setp = set
|
#define UPDATE_PARAMS *setp = set
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
allows one to easily provide a tuned implementation in case this
|
allows one to easily provide a tuned implementation in case this
|
||||||
proofs to be necessary. */
|
proofs to be necessary. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -422,6 +423,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
} \
|
} \
|
||||||
++inptr; \
|
++inptr; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , enum variant var
|
#define EXTRA_LOOP_DECLS , enum variant var
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
@ -883,19 +885,32 @@ gconv_end (struct __gconv_step *data)
|
|||||||
\
|
\
|
||||||
if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT) \
|
if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* Exit the loop with an error. */ \
|
/* Exit the loop with an error. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
*outptr++ = (unsigned char) ch; \
|
*outptr++ = (unsigned char) ch; \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS , enum variant var
|
#define EXTRA_LOOP_DECLS , enum variant var
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/* Definitions used in the body of the `gconv' function. */
|
/* Definitions used in the body of the `gconv' function. */
|
||||||
@ -48,18 +49,31 @@
|
|||||||
if (__builtin_expect (ch, 0) > 0xff) \
|
if (__builtin_expect (ch, 0) > 0xff) \
|
||||||
{ \
|
{ \
|
||||||
/* We have an illegal character. */ \
|
/* We have an illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
*outptr++ = (unsigned char) ch; \
|
*outptr++ = (unsigned char) ch; \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/* Data taken from the WG15 tables. */
|
/* Data taken from the WG15 tables. */
|
||||||
@ -405,7 +406,7 @@ static const char from_ucs4[][2] =
|
|||||||
is also available. */ \
|
is also available. */ \
|
||||||
int ch2; \
|
int ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store the \
|
/* The second character is not available. Store the \
|
||||||
intermediate result. */ \
|
intermediate result. */ \
|
||||||
@ -474,6 +475,7 @@ static const char from_ucs4[][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -491,7 +493,6 @@ static const char from_ucs4[][2] =
|
|||||||
if (__builtin_expect (ch, 0) \
|
if (__builtin_expect (ch, 0) \
|
||||||
>= sizeof (from_ucs4) / sizeof (from_ucs4[0])) \
|
>= sizeof (from_ucs4) / sizeof (from_ucs4[0])) \
|
||||||
{ \
|
{ \
|
||||||
int fail = 0; \
|
|
||||||
switch (ch) \
|
switch (ch) \
|
||||||
{ \
|
{ \
|
||||||
case 0x2c7: \
|
case 0x2c7: \
|
||||||
@ -562,36 +563,52 @@ static const char from_ucs4[][2] =
|
|||||||
cp = "\xd5"; \
|
cp = "\xd5"; \
|
||||||
break; \
|
break; \
|
||||||
default: \
|
default: \
|
||||||
cp = NULL; \
|
|
||||||
fail = 1; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
if (__builtin_expect (fail, 0)) \
|
|
||||||
{ \
|
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
cp = NULL; \
|
||||||
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
else if (__builtin_expect (from_ucs4[ch][0], '\1') == '\0' && ch != 0) \
|
else if (__builtin_expect (from_ucs4[ch][0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
@ -601,7 +618,7 @@ static const char from_ucs4[][2] =
|
|||||||
/* Now test for a possible second byte and write this if possible. */ \
|
/* Now test for a possible second byte and write this if possible. */ \
|
||||||
if (cp[1] != '\0') \
|
if (cp[1] != '\0') \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \
|
if (__builtin_expect (outptr >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The result does not fit into the buffer. */ \
|
/* The result does not fit into the buffer. */ \
|
||||||
--outptr; \
|
--outptr; \
|
||||||
@ -613,6 +630,7 @@ static const char from_ucs4[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/* Data taken from the WG15 tables. */
|
/* Data taken from the WG15 tables. */
|
||||||
@ -397,7 +398,7 @@ static const char from_ucs4[][2] =
|
|||||||
is also available. */ \
|
is also available. */ \
|
||||||
int ch2; \
|
int ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store the \
|
/* The second character is not available. Store the \
|
||||||
intermediate result. */ \
|
intermediate result. */ \
|
||||||
@ -466,6 +467,7 @@ static const char from_ucs4[][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -540,29 +542,50 @@ static const char from_ucs4[][2] =
|
|||||||
if (__builtin_expect (fail, 0)) \
|
if (__builtin_expect (fail, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
else if (__builtin_expect (from_ucs4[ch][0], '\1') == '\0' && ch != 0) \
|
else if (__builtin_expect (from_ucs4[ch][0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
@ -572,7 +595,7 @@ static const char from_ucs4[][2] =
|
|||||||
/* Now test for a possible second byte and write this if possible. */ \
|
/* Now test for a possible second byte and write this if possible. */ \
|
||||||
if (cp[1] != '\0') \
|
if (cp[1] != '\0') \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \
|
if (__builtin_expect (outptr >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The result does not fit into the buffer. */ \
|
/* The result does not fit into the buffer. */ \
|
||||||
--outptr; \
|
--outptr; \
|
||||||
@ -584,6 +607,7 @@ static const char from_ucs4[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <ksc5601.h>
|
#include <ksc5601.h>
|
||||||
|
|
||||||
@ -203,7 +204,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
uint_fast32_t idx; \
|
uint_fast32_t idx; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store the \
|
/* The second character is not available. Store the \
|
||||||
intermediate result. */ \
|
intermediate result. */ \
|
||||||
@ -319,6 +320,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -350,7 +352,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
{ \
|
{ \
|
||||||
if (ch >= 0xac00 && ch <= 0xd7a3) \
|
if (ch >= 0xac00 && ch <= 0xd7a3) \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))\
|
if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -371,7 +373,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
{ \
|
{ \
|
||||||
ch = jamo_from_ucs_table[ch - 0x3131]; \
|
ch = jamo_from_ucs_table[ch - 0x3131]; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))\
|
if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -386,25 +388,34 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
size_t written; \
|
size_t written; \
|
||||||
uint32_t temp; \
|
uint32_t temp; \
|
||||||
\
|
\
|
||||||
written = ucs4_to_ksc5601_hanja (ch, outptr, \
|
written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
if (__builtin_expect (written, 1) == 0) \
|
||||||
? outend - outptr : 2)); \
|
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -423,25 +434,34 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
{ \
|
{ \
|
||||||
size_t written; \
|
size_t written; \
|
||||||
\
|
\
|
||||||
written = ucs4_to_ksc5601_sym (ch, outptr, \
|
written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
if (__builtin_expect (written, 1) == 0) \
|
||||||
? outend - outptr : 2)); \
|
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \
|
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (__builtin_expect (written, 1) == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (written, 1) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -460,6 +480,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
@ -4377,7 +4378,7 @@ static const char from_ucs4_extra[0x100][2] =
|
|||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
uint_fast32_t idx; \
|
uint_fast32_t idx; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store \
|
/* The second character is not available. Store \
|
||||||
the intermediate result. */ \
|
the intermediate result. */ \
|
||||||
@ -4441,6 +4442,7 @@ static const char from_ucs4_extra[0x100][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -4466,15 +4468,26 @@ static const char from_ucs4_extra[0x100][2] =
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -4484,14 +4497,26 @@ static const char from_ucs4_extra[0x100][2] =
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal character. */ \
|
/* Illegal character. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -4499,7 +4524,7 @@ static const char from_ucs4_extra[0x100][2] =
|
|||||||
/* Now test for a possible second byte and write this if possible. */\
|
/* Now test for a possible second byte and write this if possible. */\
|
||||||
if (cp[1] != '\0') \
|
if (cp[1] != '\0') \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \
|
if (__builtin_expect (outptr >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The result does not fit into the buffer. */ \
|
/* The result does not fit into the buffer. */ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
@ -4511,6 +4536,7 @@ static const char from_ucs4_extra[0x100][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -390,7 +391,7 @@ static const char from_ucs4[][2] =
|
|||||||
is also available. */ \
|
is also available. */ \
|
||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. */ \
|
/* The second character is not available. */ \
|
||||||
result = __GCONV_INCOMPLETE_INPUT; \
|
result = __GCONV_INCOMPLETE_INPUT; \
|
||||||
@ -441,6 +442,7 @@ static const char from_ucs4[][2] =
|
|||||||
} \
|
} \
|
||||||
inptr += increment; \
|
inptr += increment; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -467,15 +469,26 @@ static const char from_ucs4[][2] =
|
|||||||
|| __builtin_expect (ch, 0x2d8) == 0x02dc) \
|
|| __builtin_expect (ch, 0x2d8) == 0x02dc) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal characters. */ \
|
/* Illegal characters. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
@ -494,15 +507,26 @@ static const char from_ucs4[][2] =
|
|||||||
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0) \
|
||||||
{ \
|
{ \
|
||||||
/* Illegal. */ \
|
/* Illegal. */ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -511,7 +535,7 @@ static const char from_ucs4[][2] =
|
|||||||
/* Now test for a possible second byte and write this if possible. */ \
|
/* Now test for a possible second byte and write this if possible. */ \
|
||||||
if (cp[1] != '\0') \
|
if (cp[1] != '\0') \
|
||||||
{ \
|
{ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0)) \
|
if (__builtin_expect (outptr >= outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The result does not fit into the buffer. */ \
|
/* The result does not fit into the buffer. */ \
|
||||||
--outptr; \
|
--outptr; \
|
||||||
@ -524,6 +548,7 @@ static const char from_ucs4[][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <ksc5601.h>
|
#include <ksc5601.h>
|
||||||
|
|
||||||
@ -3085,7 +3086,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
|
|||||||
is also available. */ \
|
is also available. */ \
|
||||||
uint32_t ch2; \
|
uint32_t ch2; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
|
if (__builtin_expect (inptr + 1 >= inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* The second character is not available. Store \
|
/* The second character is not available. Store \
|
||||||
the intermediate result. */ \
|
the intermediate result. */ \
|
||||||
@ -3180,6 +3181,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
|
|||||||
put32 (outptr, ch); \
|
put32 (outptr, ch); \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -3199,7 +3201,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
|
|||||||
{ \
|
{ \
|
||||||
const char *s = uhc_hangul_from_ucs[ch - 0xac00]; \
|
const char *s = uhc_hangul_from_ucs[ch - 0xac00]; \
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0)) \
|
if (__builtin_expect (outptr + 2 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
@ -3210,26 +3212,35 @@ static const char uhc_hangul_from_ucs[11172][2] =
|
|||||||
} \
|
} \
|
||||||
else if ((ch >= 0x4e00 && ch <= 0x9fa5) || (ch >= 0xf900 && ch <= 0xfa0b))\
|
else if ((ch >= 0x4e00 && ch <= 0x9fa5) || (ch >= 0xf900 && ch <= 0xfa0b))\
|
||||||
{ \
|
{ \
|
||||||
size_t written = ucs4_to_ksc5601_hanja (ch, outptr, \
|
size_t written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
|
||||||
? outend - outptr : 2)); \
|
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \
|
if (__builtin_expect (written, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -3242,26 +3253,35 @@ static const char uhc_hangul_from_ucs[11172][2] =
|
|||||||
*/ \
|
*/ \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
size_t written = ucs4_to_ksc5601_sym (ch, outptr, \
|
size_t written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr); \
|
||||||
(NEED_LENGTH_TEST \
|
|
||||||
? outend - outptr : 2)); \
|
|
||||||
\
|
\
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0) \
|
if (__builtin_expect (written, 1) == 0) \
|
||||||
{ \
|
{ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
inptr += 4; \
|
{ \
|
||||||
++*irreversible; \
|
inptr += 4; \
|
||||||
|
++*irreversible; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -3271,6 +3291,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -70,7 +71,7 @@
|
|||||||
outbuf += 2; \
|
outbuf += 2; \
|
||||||
} \
|
} \
|
||||||
swap = ((struct unicode_data *) step->__data)->swap;
|
swap = ((struct unicode_data *) step->__data)->swap;
|
||||||
#define EXTRA_LOOP_ARGS , data, swap
|
#define EXTRA_LOOP_ARGS , swap
|
||||||
|
|
||||||
|
|
||||||
/* Direction of the transformation. */
|
/* Direction of the transformation. */
|
||||||
@ -151,14 +152,26 @@ gconv_end (struct __gconv_step *data)
|
|||||||
\
|
\
|
||||||
if (__builtin_expect (c, 0) >= 0x10000) \
|
if (__builtin_expect (c, 0) >= 0x10000) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, inend, \
|
||||||
|
*outptrp, &outptr, outend, irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
|
continue; \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
@ -168,8 +181,9 @@ gconv_end (struct __gconv_step *data)
|
|||||||
\
|
\
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS \
|
#define EXTRA_LOOP_DECLS \
|
||||||
, struct __gconv_step_data *step_data, int swap
|
, int swap
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -190,7 +204,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
#define EXTRA_LOOP_DECLS \
|
#define EXTRA_LOOP_DECLS \
|
||||||
, struct __gconv_step_data *step_data, int swap
|
, int swap
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -72,7 +73,7 @@
|
|||||||
put16u (outbuf, BOM); \
|
put16u (outbuf, BOM); \
|
||||||
outbuf += 2; \
|
outbuf += 2; \
|
||||||
}
|
}
|
||||||
#define EXTRA_LOOP_ARGS , var, data, swap
|
#define EXTRA_LOOP_ARGS , var, swap
|
||||||
|
|
||||||
|
|
||||||
/* Direction of the transformation. */
|
/* Direction of the transformation. */
|
||||||
@ -201,20 +202,31 @@ gconv_end (struct __gconv_step *data)
|
|||||||
{ \
|
{ \
|
||||||
if (__builtin_expect (c, 0) >= 0x110000) \
|
if (__builtin_expect (c, 0) >= 0x110000) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
/* Generate a surrogate character. */ \
|
/* Generate a surrogate character. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 4 > outend, 0))\
|
if (__builtin_expect (outptr + 4 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* Overflow in the output buffer. */ \
|
/* Overflow in the output buffer. */ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
@ -234,20 +246,31 @@ gconv_end (struct __gconv_step *data)
|
|||||||
{ \
|
{ \
|
||||||
if (__builtin_expect (c, 0) >= 0x110000) \
|
if (__builtin_expect (c, 0) >= 0x110000) \
|
||||||
{ \
|
{ \
|
||||||
if (! ignore_errors_p ()) \
|
if (step_data->__trans.__trans_fct != NULL) \
|
||||||
|
{ \
|
||||||
|
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
|
||||||
|
(step, step_data, *inptrp, &inptr, \
|
||||||
|
inend, *outptrp, &outptr, outend, \
|
||||||
|
irreversible)); \
|
||||||
|
if (result != __GCONV_OK) \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
else if (! ignore_errors_p ()) \
|
||||||
{ \
|
{ \
|
||||||
/* This is an illegal character. */ \
|
/* This is an illegal character. */ \
|
||||||
result = __GCONV_ILLEGAL_INPUT; \
|
result = __GCONV_ILLEGAL_INPUT; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
\
|
else \
|
||||||
++*irreversible; \
|
{ \
|
||||||
inptr += 4; \
|
++*irreversible; \
|
||||||
|
inptr += 4; \
|
||||||
|
} \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
/* Generate a surrogate character. */ \
|
/* Generate a surrogate character. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (outptr + 4 > outend, 0))\
|
if (__builtin_expect (outptr + 4 > outend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* Overflow in the output buffer. */ \
|
/* Overflow in the output buffer. */ \
|
||||||
result = __GCONV_FULL_OUTPUT; \
|
result = __GCONV_FULL_OUTPUT; \
|
||||||
@ -264,8 +287,9 @@ gconv_end (struct __gconv_step *data)
|
|||||||
outptr += 2; \
|
outptr += 2; \
|
||||||
inptr += 4; \
|
inptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS \
|
#define EXTRA_LOOP_DECLS \
|
||||||
, enum variant var, struct __gconv_step_data *step_data, int swap
|
, enum variant var, int swap
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
@ -294,7 +318,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
\
|
\
|
||||||
/* It's a surrogate character. At least the first word says \
|
/* It's a surrogate character. At least the first word says \
|
||||||
it is. */ \
|
it is. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 4 > inend, 0)) \
|
if (__builtin_expect (inptr + 4 > inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We don't have enough input for another complete input \
|
/* We don't have enough input for another complete input \
|
||||||
character. */ \
|
character. */ \
|
||||||
@ -337,7 +361,7 @@ gconv_end (struct __gconv_step *data)
|
|||||||
\
|
\
|
||||||
/* It's a surrogate character. At least the first word says \
|
/* It's a surrogate character. At least the first word says \
|
||||||
it is. */ \
|
it is. */ \
|
||||||
if (NEED_LENGTH_TEST && __builtin_expect (inptr + 4 > inend, 0)) \
|
if (__builtin_expect (inptr + 4 > inend, 0)) \
|
||||||
{ \
|
{ \
|
||||||
/* We don't have enough input for another complete input \
|
/* We don't have enough input for another complete input \
|
||||||
character. */ \
|
character. */ \
|
||||||
@ -368,8 +392,9 @@ gconv_end (struct __gconv_step *data)
|
|||||||
} \
|
} \
|
||||||
outptr += 4; \
|
outptr += 4; \
|
||||||
}
|
}
|
||||||
|
#define LOOP_NEED_FLAGS
|
||||||
#define EXTRA_LOOP_DECLS \
|
#define EXTRA_LOOP_DECLS \
|
||||||
, enum variant var, struct __gconv_step_data *step_data, int swap
|
, enum variant var, int swap
|
||||||
#include <iconv/loop.c>
|
#include <iconv/loop.c>
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,6 +21,9 @@
|
|||||||
common_objpfx=$1
|
common_objpfx=$1
|
||||||
objpfx=$2
|
objpfx=$2
|
||||||
|
|
||||||
|
GCONV_PATH=${common_objpfx}iconvdata
|
||||||
|
export GCONV_PATH
|
||||||
|
|
||||||
# Generate the test data.
|
# Generate the test data.
|
||||||
test -d ${objpfx}domaindir || mkdir ${objpfx}domaindir
|
test -d ${objpfx}domaindir || mkdir ${objpfx}domaindir
|
||||||
# Create the locale directories.
|
# Create the locale directories.
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include <libioP.h>
|
#include <libioP.h>
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
# include <dlfcn.h>
|
||||||
# include <wchar.h>
|
# include <wchar.h>
|
||||||
#endif
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -165,15 +166,17 @@ do_out (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
|||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
struct __gconv_step *gs = codecvt->__cd_out.__cd.__steps;
|
struct __gconv_step *gs = codecvt->__cd_out.__cd.__steps;
|
||||||
int status;
|
int status;
|
||||||
size_t written;
|
size_t dummy;
|
||||||
const unsigned char *from_start_copy = (unsigned char *) from_start;
|
const unsigned char *from_start_copy = (unsigned char *) from_start;
|
||||||
|
|
||||||
codecvt->__cd_out.__cd.__data[0].__outbuf = to_start;
|
codecvt->__cd_out.__cd.__data[0].__outbuf = to_start;
|
||||||
codecvt->__cd_out.__cd.__data[0].__outbufend = to_end;
|
codecvt->__cd_out.__cd.__data[0].__outbufend = to_end;
|
||||||
codecvt->__cd_out.__cd.__data[0].__statep = statep;
|
codecvt->__cd_out.__cd.__data[0].__statep = statep;
|
||||||
|
|
||||||
status = (*gs->__fct) (gs, codecvt->__cd_out.__cd.__data, &from_start_copy,
|
status = DL_CALL_FCT (gs->__fct,
|
||||||
(const unsigned char *) from_end, &written, 0, 0);
|
(gs, codecvt->__cd_out.__cd.__data, &from_start_copy,
|
||||||
|
(const unsigned char *) from_end, to_start,
|
||||||
|
&dummy, 0, 0));
|
||||||
|
|
||||||
*from_stop = (wchar_t *) from_start_copy;
|
*from_stop = (wchar_t *) from_start_copy;
|
||||||
*to_stop = codecvt->__cd_out.__cd.__data[0].__outbuf;
|
*to_stop = codecvt->__cd_out.__cd.__data[0].__outbuf;
|
||||||
@ -212,14 +215,15 @@ do_unshift (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
|||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
struct __gconv_step *gs = codecvt->__cd_out.__cd.__steps;
|
struct __gconv_step *gs = codecvt->__cd_out.__cd.__steps;
|
||||||
int status;
|
int status;
|
||||||
size_t written;
|
size_t dummy;
|
||||||
|
|
||||||
codecvt->__cd_out.__cd.__data[0].__outbuf = to_start;
|
codecvt->__cd_out.__cd.__data[0].__outbuf = to_start;
|
||||||
codecvt->__cd_out.__cd.__data[0].__outbufend = to_end;
|
codecvt->__cd_out.__cd.__data[0].__outbufend = to_end;
|
||||||
codecvt->__cd_out.__cd.__data[0].__statep = statep;
|
codecvt->__cd_out.__cd.__data[0].__statep = statep;
|
||||||
|
|
||||||
status = (*gs->__fct) (gs, codecvt->__cd_out.__cd.__data, NULL, NULL,
|
status = DL_CALL_FCT (gs->__fct,
|
||||||
&written, 1, 0);
|
(gs, codecvt->__cd_out.__cd.__data, NULL, NULL,
|
||||||
|
to_start, &dummy, 1, 0));
|
||||||
|
|
||||||
*to_stop = codecvt->__cd_out.__cd.__data[0].__outbuf;
|
*to_stop = codecvt->__cd_out.__cd.__data[0].__outbuf;
|
||||||
|
|
||||||
@ -258,15 +262,16 @@ do_in (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
|||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
struct __gconv_step *gs = codecvt->__cd_in.__cd.__steps;
|
struct __gconv_step *gs = codecvt->__cd_in.__cd.__steps;
|
||||||
int status;
|
int status;
|
||||||
size_t written;
|
size_t dummy;
|
||||||
const unsigned char *from_start_copy = (unsigned char *) from_start;
|
const unsigned char *from_start_copy = (unsigned char *) from_start;
|
||||||
|
|
||||||
codecvt->__cd_in.__cd.__data[0].__outbuf = (char *) to_start;
|
codecvt->__cd_in.__cd.__data[0].__outbuf = (char *) to_start;
|
||||||
codecvt->__cd_in.__cd.__data[0].__outbufend = (char *) to_end;
|
codecvt->__cd_in.__cd.__data[0].__outbufend = (char *) to_end;
|
||||||
codecvt->__cd_in.__cd.__data[0].__statep = statep;
|
codecvt->__cd_in.__cd.__data[0].__statep = statep;
|
||||||
|
|
||||||
status = (*gs->__fct) (gs, codecvt->__cd_in.__cd.__data, &from_start_copy,
|
status = DL_CALL_FCT (gs->__fct,
|
||||||
from_end, &written, 0, 0);
|
(gs, codecvt->__cd_in.__cd.__data, &from_start_copy,
|
||||||
|
from_end, (char *) to_start, &dummy, 0, 0));
|
||||||
|
|
||||||
*from_stop = from_start_copy;
|
*from_stop = from_start_copy;
|
||||||
*to_stop = (wchar_t *) codecvt->__cd_in.__cd.__data[0].__outbuf;
|
*to_stop = (wchar_t *) codecvt->__cd_in.__cd.__data[0].__outbuf;
|
||||||
@ -335,14 +340,15 @@ do_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,
|
|||||||
wchar_t to_buf[max];
|
wchar_t to_buf[max];
|
||||||
struct __gconv_step *gs = codecvt->__cd_in.__cd.__steps;
|
struct __gconv_step *gs = codecvt->__cd_in.__cd.__steps;
|
||||||
int status;
|
int status;
|
||||||
size_t written;
|
size_t dummy;
|
||||||
|
|
||||||
codecvt->__cd_in.__cd.__data[0].__outbuf = (char *) to_buf;
|
codecvt->__cd_in.__cd.__data[0].__outbuf = (char *) to_buf;
|
||||||
codecvt->__cd_in.__cd.__data[0].__outbufend = (char *) &to_buf[max];
|
codecvt->__cd_in.__cd.__data[0].__outbufend = (char *) &to_buf[max];
|
||||||
codecvt->__cd_in.__cd.__data[0].__statep = statep;
|
codecvt->__cd_in.__cd.__data[0].__statep = statep;
|
||||||
|
|
||||||
status = (*gs->__fct) (gs, codecvt->__cd_in.__cd.__data, &cp, from_end,
|
status = DL_CALL_FCT (gs->__fct,
|
||||||
&written, 0, 0);
|
(gs, codecvt->__cd_in.__cd.__data, &cp, from_end,
|
||||||
|
(char *) to_buf, &dummy, 0, 0));
|
||||||
|
|
||||||
result = cp - (const unsigned char *) from_start;
|
result = cp - (const unsigned char *) from_start;
|
||||||
#else
|
#else
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
2000-06-12 Ulrich Drepper <drepper@redhat.com>
|
2000-06-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* Makefile (tests): Add joinrace.
|
||||||
|
|
||||||
* Examples/ex6.c: Test return value of pthread_join.
|
* Examples/ex6.c: Test return value of pthread_join.
|
||||||
|
|
||||||
2000-06-11 Geoff Keating <geoffk@cygnus.com>
|
2000-06-11 Geoff Keating <geoffk@cygnus.com>
|
||||||
|
@ -38,7 +38,7 @@ libpthread-routines := attr cancel condvar join manager mutex ptfork \
|
|||||||
oldsemaphore events getcpuclockid pspinlock
|
oldsemaphore events getcpuclockid pspinlock
|
||||||
|
|
||||||
vpath %.c Examples
|
vpath %.c Examples
|
||||||
tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8
|
tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 joinrace
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
|
|
||||||
@ -68,3 +68,4 @@ $(objpfx)ex5: $(libpthread)
|
|||||||
$(objpfx)ex6: $(libpthread)
|
$(objpfx)ex6: $(libpthread)
|
||||||
$(objpfx)ex7: $(libpthread)
|
$(objpfx)ex7: $(libpthread)
|
||||||
$(objpfx)ex8: $(libpthread)
|
$(objpfx)ex8: $(libpthread)
|
||||||
|
$(objpfx)joinrace: $(libpthread)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
# Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||||
# This file is part of the GNU C Library.
|
# This file is part of the GNU C Library.
|
||||||
|
|
||||||
# The GNU C Library is free software; you can redistribute it and/or
|
# The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -174,7 +174,8 @@ CFLAGS-scheck.c = -Wno-strict-prototypes -DNOID
|
|||||||
# leapseconds.
|
# leapseconds.
|
||||||
testdata = $(objpfx)testdata
|
testdata = $(objpfx)testdata
|
||||||
define build-testdata
|
define build-testdata
|
||||||
$(built-program-cmd) -d $(testdata) -y ./yearistype $<
|
GCONV_PATH=${common-objpfx}iconvdata \
|
||||||
|
$(built-program-cmd) -d $(testdata) -y ./yearistype $<
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(objpfx)test-tz.out: $(addprefix $(testdata)/, America/New_York Etc/UTC UTC)
|
$(objpfx)test-tz.out: $(addprefix $(testdata)/, America/New_York Etc/UTC UTC)
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -58,9 +59,9 @@ __btowc (c)
|
|||||||
/* Create the input string. */
|
/* Create the input string. */
|
||||||
inbuf[0] = c;
|
inbuf[0] = c;
|
||||||
|
|
||||||
status = (*__wcsmbs_gconv_fcts.towc->__fct) (__wcsmbs_gconv_fcts.towc, &data,
|
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.towc->__fct,
|
||||||
&inptr, inptr + 1, &dummy,
|
(__wcsmbs_gconv_fcts.towc, &data, &inptr, inptr + 1,
|
||||||
0, 1);
|
data.__outbuf, &dummy, 0, 1));
|
||||||
/* The conversion failed. */
|
/* The conversion failed. */
|
||||||
if (status != __GCONV_OK && status != __GCONV_FULL_OUTPUT
|
if (status != __GCONV_OK && status != __GCONV_FULL_OUTPUT
|
||||||
&& status != __GCONV_EMPTY_INPUT)
|
&& status != __GCONV_EMPTY_INPUT)
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
@ -69,9 +70,9 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
|||||||
|
|
||||||
/* Do a normal conversion. */
|
/* Do a normal conversion. */
|
||||||
inbuf = (const unsigned char *) s;
|
inbuf = (const unsigned char *) s;
|
||||||
status = (*__wcsmbs_gconv_fcts.towc->__fct) (__wcsmbs_gconv_fcts.towc,
|
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.towc->__fct,
|
||||||
&data, &inbuf, inbuf + n,
|
(__wcsmbs_gconv_fcts.towc, &data, &inbuf, inbuf + n,
|
||||||
&dummy, 0, 1);
|
data.__outbuf, &dummy, 0, 1));
|
||||||
|
|
||||||
/* There must not be any problems with the conversion but illegal input
|
/* There must not be any problems with the conversion but illegal input
|
||||||
characters. The output buffer must be large enough, otherwise the
|
characters. The output buffer must be large enough, otherwise the
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -49,7 +50,7 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
|||||||
size_t result;
|
size_t result;
|
||||||
int status;
|
int status;
|
||||||
struct __gconv_step *towc;
|
struct __gconv_step *towc;
|
||||||
size_t non_reversible;
|
size_t dummy;
|
||||||
|
|
||||||
/* Tell where we want the result. */
|
/* Tell where we want the result. */
|
||||||
data.__invocation_counter = 0;
|
data.__invocation_counter = 0;
|
||||||
@ -79,8 +80,9 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
|||||||
{
|
{
|
||||||
data.__outbuf = (unsigned char *) buf;
|
data.__outbuf = (unsigned char *) buf;
|
||||||
|
|
||||||
status = (*towc->__fct) (__wcsmbs_gconv_fcts.towc, &data, &inbuf,
|
status = DL_CALL_FCT (towc->__fct,
|
||||||
srcend, &non_reversible, 0, 1);
|
(towc, &data, &inbuf, srcend, data.__outbuf,
|
||||||
|
&dummy, 0, 1));
|
||||||
|
|
||||||
result += (wchar_t *) data.__outbuf - buf;
|
result += (wchar_t *) data.__outbuf - buf;
|
||||||
}
|
}
|
||||||
@ -99,9 +101,9 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
|||||||
data.__outbuf = (unsigned char *) dst;
|
data.__outbuf = (unsigned char *) dst;
|
||||||
data.__outbufend = data.__outbuf + len * sizeof (wchar_t);
|
data.__outbufend = data.__outbuf + len * sizeof (wchar_t);
|
||||||
|
|
||||||
status = (*towc->__fct) (__wcsmbs_gconv_fcts.towc, &data,
|
status = DL_CALL_FCT (towc->__fct,
|
||||||
(const unsigned char **) src, srcend,
|
(towc, &data, (const unsigned char **) src, srcend,
|
||||||
&non_reversible, 0, 1);
|
data.__outbuf, &dummy, 0, 1));
|
||||||
|
|
||||||
result = (wchar_t *) data.__outbuf - dst;
|
result = (wchar_t *) data.__outbuf - dst;
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -76,8 +77,9 @@ __mbsrtowcs (dst, src, len, ps)
|
|||||||
{
|
{
|
||||||
data.__outbuf = (char *) buf;
|
data.__outbuf = (char *) buf;
|
||||||
|
|
||||||
status = (*towc->__fct) (__wcsmbs_gconv_fcts.towc, &data, &inbuf,
|
status = DL_CALL_FCT (towc->__fct,
|
||||||
srcend, &non_reversible, 0, 1);
|
(towc, &data, &inbuf, srcend, data.__outbuf,
|
||||||
|
&non_reversible, 0, 1));
|
||||||
|
|
||||||
result += (wchar_t *) data.__outbuf - buf;
|
result += (wchar_t *) data.__outbuf - buf;
|
||||||
}
|
}
|
||||||
@ -105,9 +107,9 @@ __mbsrtowcs (dst, src, len, ps)
|
|||||||
data.__outbuf = (unsigned char *) dst;
|
data.__outbuf = (unsigned char *) dst;
|
||||||
data.__outbufend = data.__outbuf + len * sizeof (wchar_t);
|
data.__outbufend = data.__outbuf + len * sizeof (wchar_t);
|
||||||
|
|
||||||
status = (*towc->__fct) (__wcsmbs_gconv_fcts.towc, &data,
|
status = DL_CALL_FCT (towc->__fct,
|
||||||
(const unsigned char **) src, srcend,
|
(towc, &data, (const unsigned char **) src, srcend,
|
||||||
&non_reversible, 0, 1);
|
data.__outbuf, &non_reversible, 0, 1));
|
||||||
|
|
||||||
result = (wchar_t *) data.__outbuf - dst;
|
result = (wchar_t *) data.__outbuf - dst;
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -71,9 +72,9 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
|
|||||||
by a NUL byte. */
|
by a NUL byte. */
|
||||||
if (wc == L'\0')
|
if (wc == L'\0')
|
||||||
{
|
{
|
||||||
status = (*__wcsmbs_gconv_fcts.tomb->__fct) (__wcsmbs_gconv_fcts.tomb,
|
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.tomb->__fct,
|
||||||
&data, NULL, NULL,
|
(__wcsmbs_gconv_fcts.tomb, &data, NULL, NULL,
|
||||||
&dummy, 1, 1);
|
data.__outbuf, &dummy, 1, 1));
|
||||||
|
|
||||||
if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT)
|
if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT)
|
||||||
*data.__outbuf++ = '\0';
|
*data.__outbuf++ = '\0';
|
||||||
@ -83,10 +84,10 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
|
|||||||
/* Do a normal conversion. */
|
/* Do a normal conversion. */
|
||||||
const unsigned char *inbuf = (const unsigned char *) &wc;
|
const unsigned char *inbuf = (const unsigned char *) &wc;
|
||||||
|
|
||||||
status = (*__wcsmbs_gconv_fcts.tomb->__fct) (__wcsmbs_gconv_fcts.tomb,
|
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.tomb->__fct,
|
||||||
&data, &inbuf,
|
(__wcsmbs_gconv_fcts.tomb, &data, &inbuf,
|
||||||
inbuf + sizeof (wchar_t),
|
inbuf + sizeof (wchar_t), data.__outbuf, &dummy,
|
||||||
&dummy, 0, 1);
|
0, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* There must not be any problems with the conversion but illegal input
|
/* There must not be any problems with the conversion but illegal input
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
@ -79,10 +80,10 @@ __wcsnrtombs (dst, src, nwc, len, ps)
|
|||||||
{
|
{
|
||||||
data.__outbuf = buf;
|
data.__outbuf = buf;
|
||||||
|
|
||||||
status = (*tomb->__fct) (__wcsmbs_gconv_fcts.tomb, &data,
|
status = DL_CALL_FCT (tomb->__fct,
|
||||||
(const unsigned char **) &inbuf,
|
(tomb, &data, (const unsigned char **) &inbuf,
|
||||||
(const unsigned char *) srcend, &dummy,
|
(const unsigned char *) srcend, data.__outbuf,
|
||||||
0, 1);
|
&dummy, 0, 1));
|
||||||
|
|
||||||
/* Count the number of bytes. */
|
/* Count the number of bytes. */
|
||||||
result += data.__outbuf - buf;
|
result += data.__outbuf - buf;
|
||||||
@ -104,9 +105,10 @@ __wcsnrtombs (dst, src, nwc, len, ps)
|
|||||||
data.__outbuf = dst;
|
data.__outbuf = dst;
|
||||||
data.__outbufend = dst + len;
|
data.__outbufend = dst + len;
|
||||||
|
|
||||||
status = (*tomb->__fct) (__wcsmbs_gconv_fcts.tomb, &data,
|
status = DL_CALL_FCT (tomb->__fct,
|
||||||
(const unsigned char **) src,
|
(tomb, &data, (const unsigned char **) src,
|
||||||
(const unsigned char *) srcend, &dummy, 0, 1);
|
(const unsigned char *) srcend, data.__outbuf,
|
||||||
|
&dummy, 0, 1));
|
||||||
|
|
||||||
/* Count the number of bytes. */
|
/* Count the number of bytes. */
|
||||||
result = data.__outbuf - (unsigned char *) dst;
|
result = data.__outbuf - (unsigned char *) dst;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
@ -76,10 +77,10 @@ __wcsrtombs (dst, src, len, ps)
|
|||||||
{
|
{
|
||||||
data.__outbuf = buf;
|
data.__outbuf = buf;
|
||||||
|
|
||||||
status = (*tomb->__fct) (__wcsmbs_gconv_fcts.tomb, &data,
|
status = DL_CALL_FCT (tomb->__fct,
|
||||||
(const unsigned char **) &inbuf,
|
(tomb, &data, (const unsigned char **) &inbuf,
|
||||||
(const unsigned char *) srcend, &dummy,
|
(const unsigned char *) srcend, data.__outbuf,
|
||||||
0, 1);
|
&dummy, 0, 1));
|
||||||
|
|
||||||
/* Count the number of bytes. */
|
/* Count the number of bytes. */
|
||||||
result += data.__outbuf - buf;
|
result += data.__outbuf - buf;
|
||||||
@ -105,9 +106,10 @@ __wcsrtombs (dst, src, len, ps)
|
|||||||
data.__outbuf = dst;
|
data.__outbuf = dst;
|
||||||
data.__outbufend = dst + len;
|
data.__outbufend = dst + len;
|
||||||
|
|
||||||
status = (*tomb->__fct) (__wcsmbs_gconv_fcts.tomb, &data,
|
status = DL_CALL_FCT (tomb->__fct,
|
||||||
(const unsigned char **) src,
|
(tomb, &data, (const unsigned char **) src,
|
||||||
(const unsigned char *) srcend, &dummy, 0, 1);
|
(const unsigned char *) srcend, data.__outbuf,
|
||||||
|
&dummy, 0, 1));
|
||||||
|
|
||||||
/* Count the number of bytes. */
|
/* Count the number of bytes. */
|
||||||
result = data.__outbuf - (unsigned char *) dst;
|
result = data.__outbuf - (unsigned char *) dst;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <gconv.h>
|
#include <gconv.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -52,10 +53,12 @@ wctob (c)
|
|||||||
/* Create the input string. */
|
/* Create the input string. */
|
||||||
inbuf[0] = c;
|
inbuf[0] = c;
|
||||||
|
|
||||||
status = (*__wcsmbs_gconv_fcts.tomb->__fct) (__wcsmbs_gconv_fcts.tomb, &data,
|
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.tomb->__fct,
|
||||||
(const unsigned char **) &inptr,
|
(__wcsmbs_gconv_fcts.tomb, &data,
|
||||||
(const unsigned char *) &inbuf[1],
|
(const unsigned char **) &inptr,
|
||||||
&dummy, 0, 1);
|
(const unsigned char *) &inbuf[1],
|
||||||
|
data.__outbuf, &dummy, 0, 1));
|
||||||
|
|
||||||
/* The conversion failed or the output is too long. */
|
/* The conversion failed or the output is too long. */
|
||||||
if ((status != __GCONV_OK && status != __GCONV_FULL_OUTPUT
|
if ((status != __GCONV_OK && status != __GCONV_FULL_OUTPUT
|
||||||
&& status != __GCONV_EMPTY_INPUT)
|
&& status != __GCONV_EMPTY_INPUT)
|
||||||
|
Loading…
Reference in New Issue
Block a user