2024-01-02 02:12:26 +08:00
|
|
|
/* Copyright (C) 1997-2024 Free Software Foundation, Inc.
|
1998-04-03 23:46:53 +08:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 12:58:11 +08:00
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
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
|
2001-07-06 12:58:11 +08:00
|
|
|
Lesser General Public License for more details.
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2001-07-06 12:58:11 +08:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2012-02-10 07:18:22 +08:00
|
|
|
License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 13:40:42 +08:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
#ifndef _GCONV_INT_H
|
|
|
|
#define _GCONV_INT_H 1
|
|
|
|
|
|
|
|
#include "gconv.h"
|
2002-08-30 04:39:40 +08:00
|
|
|
#include <stdlib.h> /* For alloca used in macro below. */
|
2005-04-06 07:33:08 +08:00
|
|
|
#include <ctype.h> /* For __toupper_l used in macro below. */
|
|
|
|
#include <string.h> /* For strlen et al used in macro below. */
|
2015-09-09 05:11:03 +08:00
|
|
|
#include <libc-lock.h>
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
__BEGIN_DECLS
|
|
|
|
|
2023-02-11 01:09:10 +08:00
|
|
|
/* We have to provide support for machines which are not able to handled
|
|
|
|
unaligned memory accesses. Some of the character encodings have
|
|
|
|
representations with a fixed width of 2 or 4 bytes. */
|
|
|
|
#define get16(addr) \
|
|
|
|
({ \
|
|
|
|
const struct { uint16_t r; } __attribute__ ((__packed__)) *__ptr \
|
|
|
|
= (__typeof(__ptr))(addr); \
|
|
|
|
__ptr->r; \
|
|
|
|
})
|
|
|
|
#define get32(addr) \
|
|
|
|
({ \
|
|
|
|
const struct { uint32_t r; } __attribute__ ((__packed__)) *__ptr \
|
|
|
|
= (__typeof(__ptr))(addr); \
|
|
|
|
__ptr->r; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define put16(addr, val) \
|
|
|
|
do { \
|
|
|
|
struct { uint16_t r; } __attribute__ ((__packed__)) *__ptr \
|
|
|
|
= (__typeof(__ptr))(addr); \
|
|
|
|
__ptr->r = val; \
|
|
|
|
} while (0)
|
|
|
|
#define put32(addr, val) \
|
|
|
|
do { \
|
|
|
|
struct { uint32_t r; } __attribute__ ((__packed__)) *__ptr \
|
|
|
|
= (__typeof(__ptr))(addr); \
|
|
|
|
__ptr->r = val; \
|
|
|
|
} while (0)
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2001-07-12 13:42:07 +08:00
|
|
|
/* Structure for alias definition. Simply two strings. */
|
1998-04-03 23:46:53 +08:00
|
|
|
struct gconv_alias
|
|
|
|
{
|
2000-11-20 17:16:41 +08:00
|
|
|
char *fromname;
|
|
|
|
char *toname;
|
1998-04-03 23:46:53 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
1998-04-04 15:25:25 +08:00
|
|
|
/* Structure describing one loaded shared object. This normally are
|
|
|
|
objects to perform conversation but as a special case the db shared
|
|
|
|
object is also handled. */
|
Update.
* Versions.def: Add GLIBC_2.2 for libc.
* iconv/gconv.h: Make header suitable for inclusion in public header
by protecting all names with __.
* iconv/gconv.c: Adapt for symbol name changes.
* iconv/gconv.h: Likewise.
* iconv/gconv_builtin.c: Likewise.
* iconv/gconv_close.c: Likewise.
* iconv/gconv_db.c: Likewise.
* iconv/gconv_dl.c: Likewise.
* iconv/gconv_int.h: Likewise.
* iconv/gconv_open.c: Likewise.
* iconv/gconv_simple.c: Likewise.
* iconv/iconv.c: Likewise.
* iconv/iconv_close.c: Likewise.
* iconv/iconv_open.c: Likewise.
* iconv/loop.c: Likewise.
* iconv/skeleton.c: Likewise.
* iconvdata/8bit-gap.c: Likewise.
* iconvdata/8bit-generic.c: Likewise.
* iconvdata/ansi_x3.110.c: Likewise.
* iconvdata/big5.c: Likewise.
* iconvdata/cns11643.h: Likewise.
* iconvdata/cns11643l1.h: Likewise.
* iconvdata/euc-cn.c: Likewise.
* iconvdata/euc-jp.c: Likewise.
* iconvdata/euc-kr.c: Likewise.
* iconvdata/euc-tw.c: Likewise.
* iconvdata/gb2312.h: 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/jis0201.h: Likewise.
* iconvdata/jis0208.h: Likewise.
* iconvdata/jis0212.h: Likewise.
* iconvdata/johab.c: Likewise.
* iconvdata/ksc5601.h: Likewise.
* iconvdata/sjis.c: Likewise.
* iconvdata/t.61.c: Likewise.
* iconvdata/uhc.c: Likewise.
* stdlib/mblen.c: Likewise.
* stdlib/mbtowc.c: Likewise.
* stdlib/wctomb.c: Likewise.
* wcsmbs/btowc.c: Likewise.
* wcsmbs/mbrtowc.c: Likewise.
* wcsmbs/mbsnrtowcs.c: Likewise.
* wcsmbs/mbsrtowcs.c: Likewise.
* wcsmbs/wchar.h: Likewise.
* wcsmbs/wcrtomb.c: Likewise.
* wcsmbs/wcsmbsload.c: Likewise.
* wcsmbs/wcsmbsload.h: Likewise.
* wcsmbs/wcsnrtombs.c: Likewise.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/wctob.c: Likewise.
* include/limits.h (MB_LEN_MAX): Increase to 16.
* sysdeps/generic/_G_config.h: Define _G_fpos_t as struct. Define
_G_iconv_t.
* sysdeps/unix/sysv/linux/_G_config.h: Likewise.
* include/wchar.h: Change mbstate_t to __mbstate_t.
* libio/Makefile (routines): Add wfiledoalloc, oldiofgetpos,
oldiofgetpos64, oldiofsetpos, oldiofsetpos64, fputwc, fputwc_u,
getwc, getwc_u, getwchar, getwchar_u, iofgetws, iofgetws_u,
iofputws, iofputws_u, iogetwline, iowpadn, ioungetwc, putwc, putwc_u,
putchar, putchar_u, swprintf, vwprintf, wprintf, wscanf, fwscanf,
vwscanf, vswprintf, iovswscanf, swscanf, wgenops, wstrops, wfileops,
and iofwide.
(tests): Add tst_swprintf, tst_wprintf, tst_swscanf, and tst_wscanf.
* libio/Versions: Add _IO_fgetpos, _IO_fgetpos64, _IO_fsetpos,
_IO_fsetpos64, fgetpos, fgetpos64, fgetwc, fgetwc_unlocked, fgetws,
fgetws_unlocked, fputwc, fputwc_unlocked, fputws, fputws_unlocked,
fsetpos, fsetpos64, fwide, fwprintf, fwscanf, getwc, getwc_unlocked,
getwchar, getwchar_unlocked, putwc, putwc_unlocked, putwchar,
putwchar_unlocked, swprintf, swscanf, ungetwc, vfwprintf, vswprintf,
vwprintf, vfwscanf, vswscanf, vwscanf, wprintf, and wscanf to
GLIBC_2.2 for libc.
* libio/libio.h: Define codecvt struct. Define _IO_wide_data.
Extend _IO_file contain pointer to codecvt, widedata and mode.
(_IO_getwc_unlocked): New macro.
(_IO_putwc_unlocked): New macro.
(_IO_fwide): New macro.
* libio/libioP.h: Add new prototypes and adjust existing declarations.
* libio/fileops.c (_IO_new_file_close_it): Reset normal or widedata
buffers based on mode.
(new_do_write): Set _IO_write_end to _IO_buf_end if stream is wide
oriented.
(_IO_new_file_overflow): Don't depend only on _IO_CURRENTLY_PUTTING
flag to be enough to signal unallocated buffer. For wide oriented
stream don't make it linebuffered. Don't use _IO_do_flush, use
_IO_new_do_write directly.
(_IO_new_file_seekoff): Change return value type to _IO_off64_t.
(_IO_file_seek): Likewise.
* libio/genops.c (_IO_least_marker): Make global.
(__underflow): Orient stream if not already done.
(__uflow): Likewise.
(_IO_default_seekpos): Change to type _IO_off64_t.
(_IO_default_seekoff): Likewise.
(_IO_default_seek): Likewise.
(_IO_no_init): New function. Similar to _IO_init but allows to orient
in initialization.
* libio/iolibio.h: Add prototype for _IO_vswprintf. Change _IO_pos_BAD
to use _IO_off64_t.
* libio/ftello.c: Use _IO_off_t. For now abort when use with wide
char stream.
* libio/ftello64.c: Likewise.
* libio/ioftell.c: Likewise.
* libio/iofopncook.c: Likewise.
* libio/ioseekoff.c: Likewise.
* libio/ioseekpos.c: Likewise.
* libio/oldfileops.c: Likewise.
* libio/iofgetpos.c: Store state of conversion if necessary.
* libio/iofgetpos64.c: Likewise.
* libio/iofsetpos.c: Restore conversion state if necessary.
* libio/iofsetpos64.c: Likewise.
* libio/iofdopen.c: Initialize so that stream can be wide oriented.
* libio/iofopen.c: Likewise.
* libio/iofopen64.c: Likewise.
* libio/iopopen.c: Likewise.
* libio/iovdprintf.c: Likewise.
* libio/iovsprintf.c: Likewise.
* libio/iovsscanf.c: Likewise.
* libio/memstream.c: Likewise.
* libio/obprintf.c: Likewise.
* libio/iofputs.c: Orient stream if not already happened.
* libio/iofputs_u.c: Likewise.
* libio/iofwrite.c: Likewise.
* libio/iofwrite_u.c: Likewise.
* libio/ioputs.c: Likewise.
* libio/iosetbuffer.c: Handle not yet oriented stream.
* libio/iosetvbuf.c: Likewise.
* libio/oldstdfiles.c: Adjust FILEBUF_LITERAL call.
* libio/stdfiles.c: Likewise.
* libio/strops.c (_IO_str_overflow): Correctly free buffer after
failed allocation.
(_IO_str_seekoff): Use _IO_off64_t.
* libio/vasprintf.c: Pre-orient stream.
* libio/vsnprintf.c: Likewise.
* libio/fputwc.c: New file.
* libio/fputwc_u.c: New file.
* libio/fwprintf.c: New file.
* libio/fwscanf.c: New file.
* libio/getwc.c: New file.
* libio/getwc_u.c: New file.
* libio/getwchar.c: New file.
* libio/getwchar_u.c: New file.
* libio/iofgetws.c: New file.
* libio/iofgetws_u.c: New file.
* libio/iofputws.c: New file.
* libio/iofputws_u.c: New file.
* libio/iofwide.c: New file.
* libio/iogetwline.c: New file.
* libio/ioungetwc.c: New file.
* libio/iovswscanf.c: New file.
* libio/iowpadn.c: New file.
* libio/oldiofgetpos.c: New file.
* libio/oldiofgetpos64.c: New file.
* libio/oldiofsetpos.c: New file.
* libio/oldiofsetpos64.c: New file.
* libio/putwc.c: New file.
* libio/putwc_u.c: New file.
* libio/putwchar.c: New file.
* libio/putwchar_u.c: New file.
* libio/swprintf.c: New file.
* libio/swscanf.c: New file.
* libio/tst_swprintf.c: New file.
* libio/tst_swscanf.c: New file.
* libio/tst_wprintf.c: New file.
* libio/tst_wscanf.c: New file.
* libio/tst_wscanf.input: New file.
* libio/vswprintf.c: New file.
* libio/vwprintf.c: New file.
* libio/vwscanf.c: New file.
* libio/wfiledoalloc.c: New file.
* libio/wfileops.c: New file.
* libio/wgenops.c: New file.
* libio/wprintf.c: New file.
* libio/wscanf.c: New file.
* libio/wstrops.c: New file.
* stdio-common/Makefile (routines): Add _itowa, itowa-digits,
vfwprintf, and vfwscanf.
* stdio-common/_itoa.c (base_table): Rename to _IO_base_table and
make global.
* stdio-common/_itowa.c: New file.
* stdio-common/_itowa.h: New file.
* stdio-common/itoa-digits.c: Minimal optimization.
* stdio-common/itowa-digits.c: New file.
* stdio-common/printf-parse.h: Allow use in wide character context.
* stdio-common/printf-prs.c: Define ISASCII and MBRLEN.
* stdio-common/printf.h (printf_info): Add wide bit.
* stdio-common/printf_fp.c: Determine from wide bit whether stream
is wide oriented or not.
* stdio-common/printf_size.c: Likewise.
* sysdeps/generic/printf_fphex.c: Likewise.
* stdlib/strfmon.c: Call __printf_fp with wide bit cleared.
* stdio-common/vfprintf.c: Rewrite to allow use in wide character
context.
* stdio-common/vfscand.c: Likewise.
* stdio-common/vfwprintf.c: New file.
* stdio-common/vfwscanf.c: New file.
* time/Makefile (routines): Add wcsftime.
(tests): Add tst_wcsftime.
* time/Versions: Add wcsftime to GLIBC_2.2 for libc.
* time/strftime.c: Make usable as wcsftime.
* time/wcsftime.c: New file.
* time/tst_wcsftime.c: New file.
* wcsmbs/Makefile (routines): Add wmempcpy and wcschrnul.
* wcsmbs/Versions: Add wmempcpy and wcschrnul to GLIBC_2.2 for libc.
* wcsmbs/wcschrnul.c: New file.
* wcsmbs/wmemcpy.c: New file.
* wcsmbs/wmemcpy.c: Rename to __wmemcpy and make wmemcpy weak alias.
* wcsmbs/wmemmove.c: Likewise for wmemmove.
* manual/stdio.texi: Document is_char and wide element if printf_info.
* manual/time.texi: Document wcsftime.
* include/wchar.h: Add prototypes for __wmemcpy, __wmempcpy,
__wmemmove, __wcschrnul, and __vfwscanf.
* locale/langinfo.h: Add new LC_TIME entries for wchar_t data.
* locale/C-time.c: Adapt for above change.
* locale/categories.def: Likewise.
* locale/localeinfo.h: Likewise.
* localedata/Makefile: Don't run tests for now.
1999-06-17 06:55:47 +08:00
|
|
|
struct __gconv_loaded_object
|
1998-04-04 15:25:25 +08:00
|
|
|
{
|
2000-09-05 10:41:25 +08:00
|
|
|
/* Name of the object. It must be the first structure element. */
|
1998-04-04 15:25:25 +08:00
|
|
|
const char *name;
|
|
|
|
|
|
|
|
/* Reference counter for the db functionality. If no conversion is
|
|
|
|
needed we unload the db library. */
|
|
|
|
int counter;
|
|
|
|
|
|
|
|
/* The handle for the shared object. */
|
1999-06-28 23:52:36 +08:00
|
|
|
void *handle;
|
1998-04-04 15:25:25 +08:00
|
|
|
|
|
|
|
/* Pointer to the functions the module defines. */
|
Update.
* Versions.def: Add GLIBC_2.2 for libc.
* iconv/gconv.h: Make header suitable for inclusion in public header
by protecting all names with __.
* iconv/gconv.c: Adapt for symbol name changes.
* iconv/gconv.h: Likewise.
* iconv/gconv_builtin.c: Likewise.
* iconv/gconv_close.c: Likewise.
* iconv/gconv_db.c: Likewise.
* iconv/gconv_dl.c: Likewise.
* iconv/gconv_int.h: Likewise.
* iconv/gconv_open.c: Likewise.
* iconv/gconv_simple.c: Likewise.
* iconv/iconv.c: Likewise.
* iconv/iconv_close.c: Likewise.
* iconv/iconv_open.c: Likewise.
* iconv/loop.c: Likewise.
* iconv/skeleton.c: Likewise.
* iconvdata/8bit-gap.c: Likewise.
* iconvdata/8bit-generic.c: Likewise.
* iconvdata/ansi_x3.110.c: Likewise.
* iconvdata/big5.c: Likewise.
* iconvdata/cns11643.h: Likewise.
* iconvdata/cns11643l1.h: Likewise.
* iconvdata/euc-cn.c: Likewise.
* iconvdata/euc-jp.c: Likewise.
* iconvdata/euc-kr.c: Likewise.
* iconvdata/euc-tw.c: Likewise.
* iconvdata/gb2312.h: 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/jis0201.h: Likewise.
* iconvdata/jis0208.h: Likewise.
* iconvdata/jis0212.h: Likewise.
* iconvdata/johab.c: Likewise.
* iconvdata/ksc5601.h: Likewise.
* iconvdata/sjis.c: Likewise.
* iconvdata/t.61.c: Likewise.
* iconvdata/uhc.c: Likewise.
* stdlib/mblen.c: Likewise.
* stdlib/mbtowc.c: Likewise.
* stdlib/wctomb.c: Likewise.
* wcsmbs/btowc.c: Likewise.
* wcsmbs/mbrtowc.c: Likewise.
* wcsmbs/mbsnrtowcs.c: Likewise.
* wcsmbs/mbsrtowcs.c: Likewise.
* wcsmbs/wchar.h: Likewise.
* wcsmbs/wcrtomb.c: Likewise.
* wcsmbs/wcsmbsload.c: Likewise.
* wcsmbs/wcsmbsload.h: Likewise.
* wcsmbs/wcsnrtombs.c: Likewise.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/wctob.c: Likewise.
* include/limits.h (MB_LEN_MAX): Increase to 16.
* sysdeps/generic/_G_config.h: Define _G_fpos_t as struct. Define
_G_iconv_t.
* sysdeps/unix/sysv/linux/_G_config.h: Likewise.
* include/wchar.h: Change mbstate_t to __mbstate_t.
* libio/Makefile (routines): Add wfiledoalloc, oldiofgetpos,
oldiofgetpos64, oldiofsetpos, oldiofsetpos64, fputwc, fputwc_u,
getwc, getwc_u, getwchar, getwchar_u, iofgetws, iofgetws_u,
iofputws, iofputws_u, iogetwline, iowpadn, ioungetwc, putwc, putwc_u,
putchar, putchar_u, swprintf, vwprintf, wprintf, wscanf, fwscanf,
vwscanf, vswprintf, iovswscanf, swscanf, wgenops, wstrops, wfileops,
and iofwide.
(tests): Add tst_swprintf, tst_wprintf, tst_swscanf, and tst_wscanf.
* libio/Versions: Add _IO_fgetpos, _IO_fgetpos64, _IO_fsetpos,
_IO_fsetpos64, fgetpos, fgetpos64, fgetwc, fgetwc_unlocked, fgetws,
fgetws_unlocked, fputwc, fputwc_unlocked, fputws, fputws_unlocked,
fsetpos, fsetpos64, fwide, fwprintf, fwscanf, getwc, getwc_unlocked,
getwchar, getwchar_unlocked, putwc, putwc_unlocked, putwchar,
putwchar_unlocked, swprintf, swscanf, ungetwc, vfwprintf, vswprintf,
vwprintf, vfwscanf, vswscanf, vwscanf, wprintf, and wscanf to
GLIBC_2.2 for libc.
* libio/libio.h: Define codecvt struct. Define _IO_wide_data.
Extend _IO_file contain pointer to codecvt, widedata and mode.
(_IO_getwc_unlocked): New macro.
(_IO_putwc_unlocked): New macro.
(_IO_fwide): New macro.
* libio/libioP.h: Add new prototypes and adjust existing declarations.
* libio/fileops.c (_IO_new_file_close_it): Reset normal or widedata
buffers based on mode.
(new_do_write): Set _IO_write_end to _IO_buf_end if stream is wide
oriented.
(_IO_new_file_overflow): Don't depend only on _IO_CURRENTLY_PUTTING
flag to be enough to signal unallocated buffer. For wide oriented
stream don't make it linebuffered. Don't use _IO_do_flush, use
_IO_new_do_write directly.
(_IO_new_file_seekoff): Change return value type to _IO_off64_t.
(_IO_file_seek): Likewise.
* libio/genops.c (_IO_least_marker): Make global.
(__underflow): Orient stream if not already done.
(__uflow): Likewise.
(_IO_default_seekpos): Change to type _IO_off64_t.
(_IO_default_seekoff): Likewise.
(_IO_default_seek): Likewise.
(_IO_no_init): New function. Similar to _IO_init but allows to orient
in initialization.
* libio/iolibio.h: Add prototype for _IO_vswprintf. Change _IO_pos_BAD
to use _IO_off64_t.
* libio/ftello.c: Use _IO_off_t. For now abort when use with wide
char stream.
* libio/ftello64.c: Likewise.
* libio/ioftell.c: Likewise.
* libio/iofopncook.c: Likewise.
* libio/ioseekoff.c: Likewise.
* libio/ioseekpos.c: Likewise.
* libio/oldfileops.c: Likewise.
* libio/iofgetpos.c: Store state of conversion if necessary.
* libio/iofgetpos64.c: Likewise.
* libio/iofsetpos.c: Restore conversion state if necessary.
* libio/iofsetpos64.c: Likewise.
* libio/iofdopen.c: Initialize so that stream can be wide oriented.
* libio/iofopen.c: Likewise.
* libio/iofopen64.c: Likewise.
* libio/iopopen.c: Likewise.
* libio/iovdprintf.c: Likewise.
* libio/iovsprintf.c: Likewise.
* libio/iovsscanf.c: Likewise.
* libio/memstream.c: Likewise.
* libio/obprintf.c: Likewise.
* libio/iofputs.c: Orient stream if not already happened.
* libio/iofputs_u.c: Likewise.
* libio/iofwrite.c: Likewise.
* libio/iofwrite_u.c: Likewise.
* libio/ioputs.c: Likewise.
* libio/iosetbuffer.c: Handle not yet oriented stream.
* libio/iosetvbuf.c: Likewise.
* libio/oldstdfiles.c: Adjust FILEBUF_LITERAL call.
* libio/stdfiles.c: Likewise.
* libio/strops.c (_IO_str_overflow): Correctly free buffer after
failed allocation.
(_IO_str_seekoff): Use _IO_off64_t.
* libio/vasprintf.c: Pre-orient stream.
* libio/vsnprintf.c: Likewise.
* libio/fputwc.c: New file.
* libio/fputwc_u.c: New file.
* libio/fwprintf.c: New file.
* libio/fwscanf.c: New file.
* libio/getwc.c: New file.
* libio/getwc_u.c: New file.
* libio/getwchar.c: New file.
* libio/getwchar_u.c: New file.
* libio/iofgetws.c: New file.
* libio/iofgetws_u.c: New file.
* libio/iofputws.c: New file.
* libio/iofputws_u.c: New file.
* libio/iofwide.c: New file.
* libio/iogetwline.c: New file.
* libio/ioungetwc.c: New file.
* libio/iovswscanf.c: New file.
* libio/iowpadn.c: New file.
* libio/oldiofgetpos.c: New file.
* libio/oldiofgetpos64.c: New file.
* libio/oldiofsetpos.c: New file.
* libio/oldiofsetpos64.c: New file.
* libio/putwc.c: New file.
* libio/putwc_u.c: New file.
* libio/putwchar.c: New file.
* libio/putwchar_u.c: New file.
* libio/swprintf.c: New file.
* libio/swscanf.c: New file.
* libio/tst_swprintf.c: New file.
* libio/tst_swscanf.c: New file.
* libio/tst_wprintf.c: New file.
* libio/tst_wscanf.c: New file.
* libio/tst_wscanf.input: New file.
* libio/vswprintf.c: New file.
* libio/vwprintf.c: New file.
* libio/vwscanf.c: New file.
* libio/wfiledoalloc.c: New file.
* libio/wfileops.c: New file.
* libio/wgenops.c: New file.
* libio/wprintf.c: New file.
* libio/wscanf.c: New file.
* libio/wstrops.c: New file.
* stdio-common/Makefile (routines): Add _itowa, itowa-digits,
vfwprintf, and vfwscanf.
* stdio-common/_itoa.c (base_table): Rename to _IO_base_table and
make global.
* stdio-common/_itowa.c: New file.
* stdio-common/_itowa.h: New file.
* stdio-common/itoa-digits.c: Minimal optimization.
* stdio-common/itowa-digits.c: New file.
* stdio-common/printf-parse.h: Allow use in wide character context.
* stdio-common/printf-prs.c: Define ISASCII and MBRLEN.
* stdio-common/printf.h (printf_info): Add wide bit.
* stdio-common/printf_fp.c: Determine from wide bit whether stream
is wide oriented or not.
* stdio-common/printf_size.c: Likewise.
* sysdeps/generic/printf_fphex.c: Likewise.
* stdlib/strfmon.c: Call __printf_fp with wide bit cleared.
* stdio-common/vfprintf.c: Rewrite to allow use in wide character
context.
* stdio-common/vfscand.c: Likewise.
* stdio-common/vfwprintf.c: New file.
* stdio-common/vfwscanf.c: New file.
* time/Makefile (routines): Add wcsftime.
(tests): Add tst_wcsftime.
* time/Versions: Add wcsftime to GLIBC_2.2 for libc.
* time/strftime.c: Make usable as wcsftime.
* time/wcsftime.c: New file.
* time/tst_wcsftime.c: New file.
* wcsmbs/Makefile (routines): Add wmempcpy and wcschrnul.
* wcsmbs/Versions: Add wmempcpy and wcschrnul to GLIBC_2.2 for libc.
* wcsmbs/wcschrnul.c: New file.
* wcsmbs/wmemcpy.c: New file.
* wcsmbs/wmemcpy.c: Rename to __wmemcpy and make wmemcpy weak alias.
* wcsmbs/wmemmove.c: Likewise for wmemmove.
* manual/stdio.texi: Document is_char and wide element if printf_info.
* manual/time.texi: Document wcsftime.
* include/wchar.h: Add prototypes for __wmemcpy, __wmempcpy,
__wmemmove, __wcschrnul, and __vfwscanf.
* locale/langinfo.h: Add new LC_TIME entries for wchar_t data.
* locale/C-time.c: Adapt for above change.
* locale/categories.def: Likewise.
* locale/localeinfo.h: Likewise.
* localedata/Makefile: Don't run tests for now.
1999-06-17 06:55:47 +08:00
|
|
|
__gconv_fct fct;
|
|
|
|
__gconv_init_fct init_fct;
|
|
|
|
__gconv_end_fct end_fct;
|
1998-04-04 15:25:25 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
/* Description for an available conversion module. */
|
|
|
|
struct gconv_module
|
|
|
|
{
|
2000-06-20 08:34:21 +08:00
|
|
|
const char *from_string;
|
1998-04-04 15:25:25 +08:00
|
|
|
const char *to_string;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
1998-05-08 20:32:47 +08:00
|
|
|
int cost_hi;
|
|
|
|
int cost_lo;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
1998-04-04 15:25:25 +08:00
|
|
|
const char *module_name;
|
1999-01-19 07:15:16 +08:00
|
|
|
|
|
|
|
struct gconv_module *left; /* Prefix smaller. */
|
|
|
|
struct gconv_module *same; /* List of entries with identical prefix. */
|
|
|
|
struct gconv_module *right; /* Prefix larger. */
|
1998-04-03 23:46:53 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2020-07-08 02:31:48 +08:00
|
|
|
/* The specification of the conversion that needs to be performed. */
|
|
|
|
struct gconv_spec
|
|
|
|
{
|
|
|
|
char *fromcode;
|
|
|
|
char *tocode;
|
|
|
|
bool translit;
|
|
|
|
bool ignore;
|
|
|
|
};
|
|
|
|
|
1999-08-23 06:39:16 +08:00
|
|
|
/* Flags for `gconv_open'. */
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
GCONV_AVOID_NOCONV = 1 << 0
|
|
|
|
};
|
|
|
|
|
2007-07-29 03:02:07 +08:00
|
|
|
/* When GCONV_AVOID_NOCONV is set and no conversion is needed,
|
|
|
|
__GCONV_NULCONV should be returned. */
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
__GCONV_NULCONV = -1
|
|
|
|
};
|
1999-08-23 06:39:16 +08:00
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
/* Global variables. */
|
|
|
|
|
|
|
|
/* Database of alias names. */
|
2002-08-05 07:32:14 +08:00
|
|
|
extern void *__gconv_alias_db attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
/* Array with available modules. */
|
2002-08-05 07:32:14 +08:00
|
|
|
extern struct gconv_module *__gconv_modules_db attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2001-07-23 01:47:08 +08:00
|
|
|
/* Value of the GCONV_PATH environment variable. */
|
2002-03-13 04:04:56 +08:00
|
|
|
extern const char *__gconv_path_envvar attribute_hidden;
|
2001-07-23 01:47:08 +08:00
|
|
|
|
2004-03-09 18:04:55 +08:00
|
|
|
/* Lock for the conversion database content. */
|
2006-05-16 04:46:12 +08:00
|
|
|
__libc_lock_define (extern, __gconv_lock attribute_hidden)
|
2004-03-09 18:04:55 +08:00
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2000-05-04 10:46:54 +08:00
|
|
|
/* The gconv functions expects the name to be in upper case and complete,
|
|
|
|
including the trailing slashes if necessary. */
|
2000-06-17 07:04:41 +08:00
|
|
|
#define norm_add_slashes(str,suffix) \
|
2000-05-04 10:46:54 +08:00
|
|
|
({ \
|
|
|
|
const char *cp = (str); \
|
|
|
|
char *result; \
|
|
|
|
char *tmp; \
|
|
|
|
size_t cnt = 0; \
|
2004-03-25 11:54:03 +08:00
|
|
|
const size_t suffix_len = strlen (suffix); \
|
2000-05-04 10:46:54 +08:00
|
|
|
\
|
|
|
|
while (*cp != '\0') \
|
|
|
|
if (*cp++ == '/') \
|
|
|
|
++cnt; \
|
|
|
|
\
|
2002-08-30 04:39:40 +08:00
|
|
|
tmp = result = __alloca (cp - (str) + 3 + suffix_len); \
|
2000-05-04 10:46:54 +08:00
|
|
|
cp = (str); \
|
|
|
|
while (*cp != '\0') \
|
2005-12-21 15:28:33 +08:00
|
|
|
*tmp++ = __toupper_l (*cp++, _nl_C_locobj_ptr); \
|
2000-05-04 10:46:54 +08:00
|
|
|
if (cnt < 2) \
|
|
|
|
{ \
|
|
|
|
*tmp++ = '/'; \
|
|
|
|
if (cnt < 1) \
|
2000-06-17 07:04:41 +08:00
|
|
|
{ \
|
|
|
|
*tmp++ = '/'; \
|
2004-03-25 11:54:03 +08:00
|
|
|
if (suffix_len != 0) \
|
2000-06-17 07:04:41 +08:00
|
|
|
tmp = __mempcpy (tmp, suffix, suffix_len); \
|
|
|
|
} \
|
2000-05-04 10:46:54 +08:00
|
|
|
} \
|
|
|
|
*tmp = '\0'; \
|
|
|
|
result; \
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2023-05-27 14:48:33 +08:00
|
|
|
/* Return in *HANDLE, a descriptor for the transformation. The function expects
|
2020-07-08 02:31:48 +08:00
|
|
|
the specification of the transformation in the structure pointed to by
|
|
|
|
CONV_SPEC. It only reads *CONV_SPEC and does not take ownership of it. */
|
|
|
|
extern int __gconv_open (struct gconv_spec *conv_spec,
|
|
|
|
__gconv_t *handle, int flags);
|
|
|
|
libc_hidden_proto (__gconv_open)
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2020-09-25 20:47:06 +08:00
|
|
|
/* This function accepts the charset names of the source and destination of the
|
|
|
|
conversion and populates *conv_spec with an equivalent conversion
|
|
|
|
specification that may later be used by __gconv_open. The charset names
|
|
|
|
might contain options in the form of suffixes that alter the conversion,
|
|
|
|
e.g. "ISO-10646/UTF-8/TRANSLIT". It processes the charset names, ignoring
|
|
|
|
and truncating any suffix options in fromcode, and processing and truncating
|
|
|
|
any suffix options in tocode. Supported suffix options ("TRANSLIT" or
|
|
|
|
"IGNORE") when found in tocode lead to the corresponding flag in *conv_spec
|
|
|
|
to be set to true. Unrecognized suffix options are silently discarded. If
|
|
|
|
the function succeeds, it returns conv_spec back to the caller. It returns
|
|
|
|
NULL upon failure. */
|
|
|
|
extern struct gconv_spec *
|
|
|
|
__gconv_create_spec (struct gconv_spec *conv_spec, const char *fromcode,
|
|
|
|
const char *tocode);
|
|
|
|
libc_hidden_proto (__gconv_create_spec)
|
|
|
|
|
|
|
|
/* This function frees all heap memory allocated by __gconv_create_spec. */
|
|
|
|
extern void
|
|
|
|
__gconv_destroy_spec (struct gconv_spec *conv_spec);
|
|
|
|
libc_hidden_proto (__gconv_destroy_spec)
|
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
/* Free resources associated with transformation descriptor CD. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern int __gconv_close (__gconv_t cd)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
/* Transform at most *INBYTESLEFT bytes from buffer starting at *INBUF
|
|
|
|
according to rules described by CD and place up to *OUTBYTESLEFT
|
2000-01-19 11:21:41 +08:00
|
|
|
bytes in buffer starting at *OUTBUF. Return number of non-identical
|
2000-06-11 06:54:47 +08:00
|
|
|
conversions in *IRREVERSIBLE if this pointer is not null. */
|
2000-06-13 03:47:50 +08:00
|
|
|
extern int __gconv (__gconv_t cd, const unsigned char **inbuf,
|
|
|
|
const unsigned char *inbufend, unsigned char **outbuf,
|
2017-10-02 06:07:06 +08:00
|
|
|
unsigned char *outbufend, size_t *irreversible)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
/* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
|
|
|
|
the single steps necessary for transformation from FROMSET to TOSET. */
|
2000-06-13 03:47:50 +08:00
|
|
|
extern int __gconv_find_transform (const char *toset, const char *fromset,
|
|
|
|
struct __gconv_step **handle,
|
2017-10-02 06:07:06 +08:00
|
|
|
size_t *nsteps, int flags)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2001-07-23 01:47:08 +08:00
|
|
|
/* Search for transformation in cache data. */
|
|
|
|
extern int __gconv_lookup_cache (const char *toset, const char *fromset,
|
|
|
|
struct __gconv_step **handle, size_t *nsteps,
|
2017-10-02 06:07:06 +08:00
|
|
|
int flags)
|
|
|
|
attribute_hidden;
|
2001-07-23 01:47:08 +08:00
|
|
|
|
2001-07-28 01:34:53 +08:00
|
|
|
/* Compare the two name for whether they are after alias expansion the
|
|
|
|
same. This function uses the cache and fails if none is
|
|
|
|
loaded. */
|
|
|
|
extern int __gconv_compare_alias_cache (const char *name1, const char *name2,
|
2017-10-02 06:07:06 +08:00
|
|
|
int *result)
|
|
|
|
attribute_hidden;
|
2001-07-28 01:34:53 +08:00
|
|
|
|
2001-07-23 01:47:08 +08:00
|
|
|
/* Free data associated with a step's structure. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern void __gconv_release_step (struct __gconv_step *step)
|
|
|
|
attribute_hidden;
|
2001-07-23 01:47:08 +08:00
|
|
|
|
2018-10-17 23:47:29 +08:00
|
|
|
/* Read all the configuration data and cache it if not done so already. */
|
|
|
|
extern void __gconv_load_conf (void) attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2001-07-23 01:47:08 +08:00
|
|
|
/* Try to read module cache file. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern int __gconv_load_cache (void) attribute_hidden;
|
2001-07-23 01:47:08 +08:00
|
|
|
|
2002-08-05 07:32:14 +08:00
|
|
|
/* Retrieve pointer to internal cache. */
|
|
|
|
extern void *__gconv_get_cache (void);
|
|
|
|
|
|
|
|
/* Retrieve pointer to internal module database. */
|
|
|
|
extern struct gconv_module *__gconv_get_modules_db (void);
|
|
|
|
|
|
|
|
/* Retrieve pointer to internal alias database. */
|
|
|
|
extern void *__gconv_get_alias_db (void);
|
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
/* Comparison function to search alias. */
|
2002-03-15 17:30:44 +08:00
|
|
|
extern int __gconv_alias_compare (const void *p1, const void *p2)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
/* Clear reference to transformation step implementations which might
|
|
|
|
cause the code to be unloaded. */
|
2000-06-13 03:47:50 +08:00
|
|
|
extern int __gconv_close_transform (struct __gconv_step *steps,
|
2017-10-02 06:07:06 +08:00
|
|
|
size_t nsteps)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2001-07-25 05:30:18 +08:00
|
|
|
/* Free all resources allocated for the transformation record when
|
|
|
|
using the cache. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern void __gconv_release_cache (struct __gconv_step *steps, size_t nsteps)
|
|
|
|
attribute_hidden;
|
2001-07-25 05:30:18 +08:00
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
/* Load shared object named by NAME. If already loaded increment reference
|
|
|
|
count. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern struct __gconv_loaded_object *__gconv_find_shlib (const char *name)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
/* Release shared object. If no further reference is available unload
|
|
|
|
the object. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern void __gconv_release_shlib (struct __gconv_loaded_object *handle)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
/* Fill STEP with information about builtin module with NAME. */
|
2000-06-13 03:47:50 +08:00
|
|
|
extern void __gconv_get_builtin_trans (const char *name,
|
2017-10-02 06:07:06 +08:00
|
|
|
struct __gconv_step *step)
|
|
|
|
attribute_hidden;
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2019-05-15 13:16:47 +08:00
|
|
|
/* 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,
|
|
|
|
size_t *irreversible);
|
2014-09-12 15:17:32 +08:00
|
|
|
libc_hidden_proto (__gconv_transliterate)
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2003-06-12 05:57:23 +08:00
|
|
|
/* If NAME is an codeset alias expand it. */
|
2017-10-02 06:07:06 +08:00
|
|
|
extern int __gconv_compare_alias (const char *name1, const char *name2)
|
|
|
|
attribute_hidden;
|
2003-06-12 05:57:23 +08:00
|
|
|
|
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
/* Builtin transformations. */
|
|
|
|
#ifdef _LIBC
|
2002-12-03 06:39:58 +08:00
|
|
|
# define __BUILTIN_TRANSFORM(Name) \
|
2000-06-13 03:47:50 +08:00
|
|
|
extern int Name (struct __gconv_step *step, \
|
|
|
|
struct __gconv_step_data *data, \
|
|
|
|
const unsigned char **inbuf, \
|
2000-06-16 08:39:38 +08:00
|
|
|
const unsigned char *inbufend, \
|
|
|
|
unsigned char **outbufstart, size_t *irreversible, \
|
|
|
|
int do_flush, int consume_incomplete)
|
1998-04-03 23:46:53 +08:00
|
|
|
|
2002-12-03 06:39:58 +08:00
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_ascii_internal);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_ascii);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_utf8_internal);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_utf8);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_ucs2_internal);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_ucs2);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_ucs2reverse_internal);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_ucs2reverse);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_ucs4);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_ucs4_internal);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_ucs4le);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_ucs4le_internal);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_internal_utf16);
|
|
|
|
__BUILTIN_TRANSFORM (__gconv_transform_utf16_internal);
|
|
|
|
# undef __BUITLIN_TRANSFORM
|
|
|
|
|
|
|
|
/* Specialized conversion function for a single byte to INTERNAL, recognizing
|
|
|
|
only ASCII characters. */
|
|
|
|
extern wint_t __gconv_btwoc_ascii (struct __gconv_step *step, unsigned char c);
|
1998-04-03 23:46:53 +08:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
__END_DECLS
|
|
|
|
|
2024-09-20 19:10:54 +08:00
|
|
|
/* Internal extensions for <gconv.h>. */
|
|
|
|
|
|
|
|
/* Internal flags for __flags in struct __gconv_step_data. Overlaps
|
|
|
|
with flags for __gconv_open. */
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
/* The conversion encountered an illegal input character at one
|
|
|
|
point. */
|
|
|
|
__GCONV_ENCOUNTERED_ILLEGAL_INPUT = 1U << 30,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Mark *STEP_DATA as having seen illegal input, and return
|
|
|
|
__GCONV_ILLEGAL_INPUT. */
|
|
|
|
static inline int
|
|
|
|
__gconv_mark_illegal_input (struct __gconv_step_data *step_data)
|
|
|
|
{
|
|
|
|
step_data->__flags |= __GCONV_ENCOUNTERED_ILLEGAL_INPUT;
|
|
|
|
return __GCONV_ILLEGAL_INPUT;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Returns true if any of the conversion steps encountered illegal input. */
|
|
|
|
static _Bool __attribute__ ((unused))
|
|
|
|
__gconv_has_illegal_input (__gconv_t cd)
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < cd->__nsteps; ++i)
|
|
|
|
if (cd->__data[i].__flags & __GCONV_ENCOUNTERED_ILLEGAL_INPUT)
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
1998-04-03 23:46:53 +08:00
|
|
|
#endif /* gconv_int.h */
|