Update.
1997-11-18 02:31 Ulrich Drepper <drepper@cygnus.com> * iconv/Makefile: New file. * iconv/gconv.c: New file. * iconv/gconv.h: New file. * iconv/gconv_builtin.c: New file. * iconv/gconv_builtin.h: New file. * iconv/gconv_close.c: New file. * iconv/gconv_conf.c: New file. * iconv/gconv_db.c: New file. * iconv/gconv_dl.c: New file. * iconv/gconv_open.c: New file. * iconv/gconv_simple.c: New file. * iconv/iconv.c: New file. * iconv/iconv.h: New file. * iconv/iconv_close.c: New file. * iconv/iconv_open.c: New file. * include/gconv.h: New file. * Makeconfig: Define gconvdir. * Makefile (subdirs): Add iconv. * string/bits/string2.h: Add optimization for strtok_r. * sysdeps/generic/_G_config.h: Define __need_NULL to get definition for NULL. Reported by H.J. Lu <hjl@gnu.ai.mit.edu>. * configure.in: Correct test for bash2. * locale/Makefile (CFLAGS-charmap.c): Add -Wno-char-subscripts. (CFLAGS-locfile.c): Likewise. Suggested by Zack Weinberg <zack@rabi.phys.columbia.edu>. * misc/hsearch_r.c (hsearch_r): Avoid undefinitely search for non-existing entry if the table is full. * posix/regex.h: Pretty print. * stdio-common/printf_fp.c: Don't define NDEBUG if already defined. * sysdeps/posix/ctermid.c: Simplify a bit. * sysdeps/unix/sysv/linux/net/if.h: Pretty print. 1997-11-17 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/unix/sysv/linux/sys/quota.h: Add include for <sys/types.h> instead of <asm/types.h>. 1997-11-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/libm-test.c (asin_test): Add epsilon for asin (0.5). 1997-11-16 17:09 H.J. Lu <hjl@gnu.ai.mit.edu> * libc.map (_IO_stdin_, _IO_stdout_, _IO_stderr_, _IO_fopen, fopen, freopen, _IO_fclose, fclose): Added to GLIBC_2.0. (_IO_stdin_, _IO_stdout_, _IO_stderr_): Removed from GLIBC_2.1. (_IO_2_1_stdin_, _IO_2_1_stdout_, _IO_2_1_stderr_, _IO_fclose, fclose): Added to GLIBC_2.1. * libio/Makefile (routines, shared-only-routines): Add oldiofclose. Remove oldfreopen. * libio/freopen.c (freopen): When PIC is defined, call _IO_old_freopen () for old stdio. * libio/iofclose.c (_IO_new_fclose): Renamed from _IO_fclose. (_IO_fclose, fclose): Use _IO_new_fclose as default version for GLIBC_2.1. * libio/iolibio.h (_IO_old_freopen): Use _IO_old_file_close_it instead of _IO_file_close_it. * libio/libio.h (_IO_stdin_, _IO_stdout_, _IO_stderr_): Changed to _IO_2_1_stdxxx_. (_IO_stdin, _IO_stdout, _IO_stderr): Declare as extern if _LIBC * libio/libioP.h (_IO_old_do_flush): New. * libio/oldfileops.c (_IO_old_file_close_it, _IO_old_file_finish, _IO_old_file_overflow, _IO_old_file_sync): Call _IO_old_do_flush () instead of _IO_do_flush (). (_IO_old_file_xsputn): Call _IO_old_do_write () instead of _IO_do_write (). * libio/oldiofopen.c (_IO_old_fopen): Call _IO_old_file_init () instead of _IO_file_init (). Bind old symbols to version GLIBC_2.0. * libio/oldstdfiles.c (DEF_STDFILE): Don't use symbol_version. (_IO_old_stdin_, _IO_old_stdout_, _IO_old_stderr_): Changed to _IO_stdxxx_. (_IO_check_libio): New function in .init. * libio/oldiofclose.c: New file. * libio/stdfiles.c (_IO_new_stdin_, _IO_new_stdout_, _IO_new_stderr_): Changed to _IO_2_1_stdxxx_. (DEF_STDFILE): Don't use default_symbol_version. * libio/stdio.c (stdin, stdout, stderr): Set to _IO_2_1_stdxxx_._ (_IO_stdin, _IO_stdout, _IO_stderr): New, strong alias of stdxxx. * csu/Makefile (distribute): Add init.c. (extra-objs): Add init.o for ELF. (start-installed-name): Add $(objpfx)init.o. * csu/init.c: New file. 1997-11-12 08:02 H.J. Lu <hjl@gnu.ai.mit.edu> * elf/dl-lookup.c (do_lookup): Don't use the hidden base definition as the default. 1997-08-27 Klaus Espenlaub <kespenla@hydra.informatik.uni-ulm.de> * erand48_r.c (__erand48_r): Implement for 32 bit short int. 1997-11-15 Andreas Jaeger <aj@arthur.rhein-neckar.de> * elf/genrtldtbl.awk: Replace gensub for compatibility with gawk2 (PR 351). 1997-11-16 21:01 Philip Blundell <Philip.Blundell@pobox.com> * sysdeps/arm/sysdep.h: Use __APCS_32__ to decide whether or not to preserve condition codes on function call. 1997-11-13 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/generic/s_exp2l.c: Change exp2l to __ieee754_exp2l. 1997-11-14 Andreas Jaeger <aj@arthur.rhein-neckar.de> * math/libm-test.c (asin_test): Add epsilon for float. (tan_test): Add epsilon for float. (log1p_test): Add epsilon for float. (inverse_functions): Add epsilons. * sysdeps/unix/sysv/linux/Makefile (sysdep_headers) [socket]: Add net/if_packet.h. * sysdeps/unix/sysv/linux/Dist: Add net/if_packet.h. 1997-11-10 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * md5-crypt/Makefile (extra-objs): Make recursively expanded variable, since $(object-suffixes) is not defined yet. 1997-11-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * db2/Makefile (distribute): db185/db185_int.src -> db185/db185_int.h. 1997-11-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * misc/tst-fdset.c: Don't require the value of FD_ISSET to be exactly one. 1997-11-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/generic/e_acoshl.c: Fix stub_warning: use the user level * sysdeps/generic/e_acosl.c: Likewise. * sysdeps/generic/e_asinl.c: Likewise. * sysdeps/generic/e_atan2l.c: Likewise. * sysdeps/generic/e_expl.c: Likewise. * sysdeps/generic/e_fmodl.c: Likewise. * sysdeps/generic/e_j0l.c: Likewise. * sysdeps/generic/e_j1l.c: Likewise. * sysdeps/generic/e_jnl.c: Likewise. * sysdeps/generic/e_lgammal_r.c: Likewise. * sysdeps/generic/e_log10l.c: Likewise. * sysdeps/generic/e_logl.c: Likewise. * sysdeps/generic/e_powl.c: Likewise. * sysdeps/generic/e_sqrtl.c: Likewise. * sysdeps/generic/e_exp2l.c: Likewise. 1997-11-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Make-dist (+sysdep-names): Remove extra paren. * Makefile (distribute): Add stub-tag.h. * elf/Makefile (distribute): Add atomicity.h. * stdlib/Makefile (headers): Add ucontext.h and sys/ucontext.h. * sysdeps/unix/sysv/linux/Makefile (sysdep_headers) [$(subdir)=socket]: Add net/if_packet.h. * sysdeps/alpha/Dist: Remove setjmp_aux.c. * sysdeps/unix/sysv/linux/Dist: Add s_pread64.c, s_pwrite64.c, net/if_packet.h, scsi/sg.h. 1997-11-13 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makefile (install): Quote $(CC) expansion. 1997-11-14 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/unix/sysv/linux/getcwd.c (__getcwd): Added caching of working /proc cwd and no restrictions on path length. Following some ideas from Andi Kleen <ak@muc.de> (PR 350). 1997-11-14 19:14 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nis/nss_compat/compat-grp.c: Remove buggy assert call. 1997-11-14 22:23 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-i387/s_fdim.S: New file. * sysdeps/libm-i387/s_fdimf.S: New file. * sysdeps/libm-i387/s_fdiml.S: New file. * sysdeps/libm-i387/i686/s_fdim.S: New file. * sysdeps/libm-i387/i686/s_fdimf.S: New file. * sysdeps/libm-i387/i686/s_fdiml.S: New file. 1997-11-12 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * string/bits/string2.h (strstr): Avoid warning if HAYSTACK is a pointer to unsigned char. 1997-11-13 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/libm-ieee754/s_llrintf.c (__llrintf): Fix function. * sysdeps/libm-ieee754/s_lrintf.c (__lrintf): Fix function. * sysdeps/libm-ieee754/s_lrint.c (__lrint): Fix function. 1997-11-12 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/libm-ieee754/s_ilogbf.c: Correct return values for ilogb(0/NaN). * sysdeps/libm-ieee754/s_ilogbl.c: Likewise. * sysdeps/libm-ieee754/s_ilogb.c: Likewise. 1997-11-14 05:44 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-i387/s_fmin.S: New file. * sysdeps/libm-i387/s_fminf.S: New file. * sysdeps/libm-i387/s_fminl.S: New file. * sysdeps/libm-i387/s_fmax.S: New file. * sysdeps/libm-i387/s_fmaxf.S: New file. * sysdeps/libm-i387/s_fmaxl.S: New file. * sysdeps/libm-i387/i686/s_fmin.S: New file. * sysdeps/libm-i387/i686/s_fminf.S: New file. * sysdeps/libm-i387/i686/s_fminl.S: New file. * sysdeps/libm-i387/i686/s_fmax.S: New file. * sysdeps/libm-i387/i686/s_fmaxf.S: New file. * sysdeps/libm-i387/i686/s_fmaxl.S: New file. 1997-11-14 03:06 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/accept.S: Add __libc_accept as alias. * sysdeps/unix/sysv/linux/send.S: Likewise. * sysdeps/unix/sysv/linux/recv.S: Likewise. * sysdeps/unix/sysv/linux/connect.S: Likewise. Reported by Christopher Wiles <wileyc@ai.cs.fujitsu.co.jp>. See ChangeLog.7 for earlier changes.
This commit is contained in:
parent
fe0ec73edb
commit
6973fc0127
14580
ChangeLog.7
Normal file
14580
ChangeLog.7
Normal file
File diff suppressed because it is too large
Load Diff
28
FAQ
28
FAQ
@ -104,6 +104,11 @@ please let me know.
|
||||
[Q29] ``I don't include any kernel header myself but still the
|
||||
compiler complains about type redeclarations of types in the
|
||||
kernel headers.''
|
||||
|
||||
[Q30] ``When I start the program XXX after upgrading the library
|
||||
I get
|
||||
XXX: Symbol `_sys_errlist' has different size in shared object, consider re-linking
|
||||
Why? What to do?''
|
||||
|
||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||
[Q1] ``What systems does the GNU C Library run on?''
|
||||
@ -776,6 +781,29 @@ There might be some more problems left but 2.1.61 fixes some of the known
|
||||
ones. See the BUGS file for other known problems.
|
||||
|
||||
|
||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||
[Q30] ``When I start the program XXX after upgrading the library
|
||||
I get
|
||||
XXX: Symbol `_sys_errlist' has different size in shared object, consider re-linking
|
||||
Why? What to do?''
|
||||
|
||||
[A30] {UD} As the message says, relink the binary. The problem is that
|
||||
very few symbols from the library can change in size and there is no way
|
||||
to avoid this. _sys_errlist is a good example. Occasionally there are
|
||||
new error numbers added to the kernel and this must be reflected at user
|
||||
level.
|
||||
|
||||
But this does not mean all programs are doomed once such a change is
|
||||
necessary. Such symbols should normally not be used at all. There are
|
||||
mechanisms to avoid using them. In the case of _sys_errlist, there is the
|
||||
strerror() function which should _always_ be used instead. So the correct
|
||||
fix is to rewrite that part of the application.
|
||||
|
||||
In some situations (especially when testing a new library release) it might
|
||||
be possible that such a symbol size change slipped in though it must not
|
||||
happen. So in case of doubt report such a warning message as a problem.
|
||||
|
||||
|
||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||
|
||||
Answers were given by:
|
||||
|
@ -96,7 +96,7 @@ foo:=$(shell echo 'try-sysdeps=$(try-sysdeps)'>&2)
|
||||
foo:=$(shell echo 'generic +sysdeps=$(+sysdeps)'>&2)
|
||||
+sysdep-names := $(sort $(patsubst $(..)sysdeps/generic/%,%,\
|
||||
$(patsubst $(..)sysdeps/libm-ieee754/%,%,\
|
||||
$(+sysdeps)))))
|
||||
$(+sysdeps))))
|
||||
foo:=$(shell echo '+sysdep-names=$(+sysdep-names)' >&2)
|
||||
|
||||
ifdef subdir-dirs
|
||||
|
@ -217,6 +217,12 @@ i18ndir = $(datadir)/i18n
|
||||
endif
|
||||
inst_i18ndir = $(install_root)$(i18ndir)
|
||||
|
||||
# Where to install the shared object for charset transformation.
|
||||
ifndef gconvdir
|
||||
gconvdir = $(libdir)/gconv
|
||||
endif
|
||||
inst_gconvdir = $(install_root)$(gconvdir)
|
||||
|
||||
|
||||
# Where to install programs.
|
||||
ifndef bindir
|
||||
|
9
Makefile
9
Makefile
@ -53,7 +53,7 @@ endif
|
||||
# These are the subdirectories containing the library source.
|
||||
subdirs = csu assert ctype db2 locale intl catgets math setjmp signal stdlib \
|
||||
stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd \
|
||||
posix io termios resource misc socket sysvipc gmon gnulib \
|
||||
posix io termios resource misc socket sysvipc gmon gnulib iconv \
|
||||
wctype manual shadow md5-crypt po argp $(add-ons) nss \
|
||||
$(sysdep-subdirs) $(binfmt-subdir)
|
||||
export subdirs := $(subdirs) # Benign, useless in GNU make before 3.63.
|
||||
@ -117,7 +117,7 @@ include Makerules
|
||||
# Install from subdirectories too.
|
||||
install: subdir_install
|
||||
|
||||
# Create linkfs for shared libraries using the `ldconfig' program is possible.
|
||||
# Create links for shared libraries using the `ldconfig' program is possible.
|
||||
# Ignore the error if we cannot update /etc/ld.so.cache.
|
||||
ifeq (no,$(cross-compiling))
|
||||
ifeq (yes,$(build-shared))
|
||||
@ -127,7 +127,7 @@ install:
|
||||
ifneq (no,$(PERL))
|
||||
ifeq (/usr,$(prefix))
|
||||
ifeq (,$(install_root))
|
||||
CC=$(CC) $(PERL) test-installation.pl $(common-objpfx)
|
||||
CC="$(CC)" $(PERL) test-installation.pl $(common-objpfx)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@ -312,7 +312,8 @@ distribute := README INSTALL FAQ NOTES NEWS PROJECTS BUGS \
|
||||
config.h.in config.make.in config-name.in Makefile.in \
|
||||
autolock.sh rellns-sh munch-tmpl.c munch.awk interp.c \
|
||||
sysdep.h set-hooks.h libc-symbols.h version.h shlib-versions \
|
||||
rpm/Makefile rpm/template rpm/rpmrc glibcbug.in abi-tags
|
||||
rpm/Makefile rpm/template rpm/rpmrc glibcbug.in abi-tags \
|
||||
stub-tag.h
|
||||
|
||||
distribute := $(strip $(distribute))
|
||||
generated := $(generated) stubs.h version-info.h
|
||||
|
83
configure
vendored
83
configure
vendored
@ -1636,7 +1636,8 @@ else
|
||||
fi
|
||||
|
||||
if test "$BASH" != no &&
|
||||
$BASH -c 'test "$BASH_VERSINFO" -ge 2 >&/dev/null'; then
|
||||
$BASH -c 'test "$BASH_VERSINFO"
|
||||
&& test "$BASH_VERSINFO" -ge 2 >&/dev/null'; then
|
||||
libc_cv_have_bash2=yes
|
||||
else
|
||||
libc_cv_have_bash2=no
|
||||
@ -1647,7 +1648,7 @@ if test "$BASH" = no; then
|
||||
# Extract the first word of "ksh", so it can be a program name with args.
|
||||
set dummy ksh; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1651: checking for $ac_word" >&5
|
||||
echo "configure:1652: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1693,7 +1694,7 @@ do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1697: checking for $ac_word" >&5
|
||||
echo "configure:1698: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1728,7 +1729,7 @@ test -n "$PERL" || PERL="no"
|
||||
|
||||
|
||||
echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6
|
||||
echo "configure:1732: checking for signed size_t type" >&5
|
||||
echo "configure:1733: checking for signed size_t type" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1752,12 +1753,12 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6
|
||||
echo "configure:1756: checking for libc-friendly stddef.h" >&5
|
||||
echo "configure:1757: checking for libc-friendly stddef.h" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1761 "configure"
|
||||
#line 1762 "configure"
|
||||
#include "confdefs.h"
|
||||
#define __need_size_t
|
||||
#define __need_wchar_t
|
||||
@ -1772,7 +1773,7 @@ size_t size; wchar_t wchar;
|
||||
if (&size == NULL || &wchar == NULL) abort ();
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1776: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:1777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_friendly_stddef=yes
|
||||
else
|
||||
@ -1791,7 +1792,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly."
|
||||
fi
|
||||
|
||||
echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6
|
||||
echo "configure:1795: checking whether we need to use -P to assemble .S files" >&5
|
||||
echo "configure:1796: checking whether we need to use -P to assemble .S files" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1822,7 +1823,7 @@ if test $ac_cv_prog_gcc = yes; then
|
||||
# We must check this even if -pipe is not given here, because the user
|
||||
# might do `make CFLAGS=-pipe'.
|
||||
echo $ac_n "checking for gcc 2.7.x -pipe bug""... $ac_c" 1>&6
|
||||
echo "configure:1826: checking for gcc 2.7.x -pipe bug" >&5
|
||||
echo "configure:1827: checking for gcc 2.7.x -pipe bug" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_gcc_pipe_bug'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1851,7 +1852,7 @@ else
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6
|
||||
echo "configure:1855: checking for assembler global-symbol directive" >&5
|
||||
echo "configure:1856: checking for assembler global-symbol directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1881,7 +1882,7 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6
|
||||
echo "configure:1885: checking for .set assembler directive" >&5
|
||||
echo "configure:1886: checking for .set assembler directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1915,7 +1916,7 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6
|
||||
echo "configure:1919: checking for .symver assembler directive" >&5
|
||||
echo "configure:1920: checking for .symver assembler directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1934,7 +1935,7 @@ fi
|
||||
|
||||
echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6
|
||||
echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6
|
||||
echo "configure:1938: checking for ld --version-script" >&5
|
||||
echo "configure:1939: checking for ld --version-script" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1953,7 +1954,7 @@ EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o
|
||||
-nostartfiles -nostdlib
|
||||
-Wl,--version-script,conftest.map
|
||||
1>&5'; { (eval echo configure:1957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
|
||||
1>&5'; { (eval echo configure:1958: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
|
||||
then
|
||||
libc_cv_ld_version_script_option=yes
|
||||
else
|
||||
@ -1984,7 +1985,7 @@ fi
|
||||
|
||||
if test $elf = yes; then
|
||||
echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6
|
||||
echo "configure:1988: checking for .previous assembler directive" >&5
|
||||
echo "configure:1989: checking for .previous assembler directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1992,7 +1993,7 @@ else
|
||||
.section foo_section
|
||||
.previous
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1996: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1997: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_asm_previous_directive=yes
|
||||
else
|
||||
libc_cv_asm_previous_directive=no
|
||||
@ -2008,7 +2009,7 @@ EOF
|
||||
|
||||
else
|
||||
echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6
|
||||
echo "configure:2012: checking for .popsection assembler directive" >&5
|
||||
echo "configure:2013: checking for .popsection assembler directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2016,7 +2017,7 @@ else
|
||||
.pushsection foo_section
|
||||
.popsection
|
||||
EOF
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:2020: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:2021: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_asm_popsection_directive=yes
|
||||
else
|
||||
libc_cv_asm_popsection_directive=no
|
||||
@ -2036,12 +2037,12 @@ fi
|
||||
|
||||
if test $elf != yes; then
|
||||
echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
|
||||
echo "configure:2040: checking for .init and .fini sections" >&5
|
||||
echo "configure:2041: checking for .init and .fini sections" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2045 "configure"
|
||||
#line 2046 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
@ -2050,7 +2051,7 @@ asm (".section .init");
|
||||
asm (".text");
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:2054: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:2055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_have_initfini=yes
|
||||
else
|
||||
@ -2078,19 +2079,19 @@ if test $elf = yes; then
|
||||
else
|
||||
if test $ac_cv_prog_cc_works = yes; then
|
||||
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
|
||||
echo "configure:2082: checking for _ prefix on C symbol names" >&5
|
||||
echo "configure:2083: checking for _ prefix on C symbol names" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2087 "configure"
|
||||
#line 2088 "configure"
|
||||
#include "confdefs.h"
|
||||
asm ("_glibc_foobar:");
|
||||
int main() {
|
||||
glibc_foobar ();
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:2094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||
if { (eval echo configure:2095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||
rm -rf conftest*
|
||||
libc_cv_asm_underscores=yes
|
||||
else
|
||||
@ -2105,17 +2106,17 @@ fi
|
||||
echo "$ac_t""$libc_cv_asm_underscores" 1>&6
|
||||
else
|
||||
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
|
||||
echo "configure:2109: checking for _ prefix on C symbol names" >&5
|
||||
echo "configure:2110: checking for _ prefix on C symbol names" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2114 "configure"
|
||||
#line 2115 "configure"
|
||||
#include "confdefs.h"
|
||||
void underscore_test(void) {
|
||||
return; }
|
||||
EOF
|
||||
if { (eval echo configure:2119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:2120: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if grep _underscore_test conftest* >/dev/null; then
|
||||
rm -f conftest*
|
||||
libc_cv_asm_underscores=yes
|
||||
@ -2148,7 +2149,7 @@ if test $elf = yes; then
|
||||
libc_cv_asm_weakext_directive=no
|
||||
else
|
||||
echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
|
||||
echo "configure:2152: checking for assembler .weak directive" >&5
|
||||
echo "configure:2153: checking for assembler .weak directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2171,7 +2172,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
|
||||
|
||||
if test $libc_cv_asm_weak_directive = no; then
|
||||
echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
|
||||
echo "configure:2175: checking for assembler .weakext directive" >&5
|
||||
echo "configure:2176: checking for assembler .weakext directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2208,7 +2209,7 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
|
||||
echo "configure:2212: checking for ld --no-whole-archive" >&5
|
||||
echo "configure:2213: checking for ld --no-whole-archive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2219,7 +2220,7 @@ __throw () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-nostdlib -nostartfiles -Wl,--no-whole-archive
|
||||
-o conftest conftest.c 1>&5'; { (eval echo configure:2223: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
-o conftest conftest.c 1>&5'; { (eval echo configure:2224: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_ld_no_whole_archive=yes
|
||||
else
|
||||
libc_cv_ld_no_whole_archive=no
|
||||
@ -2230,7 +2231,7 @@ fi
|
||||
echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
|
||||
|
||||
echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
|
||||
echo "configure:2234: checking for gcc -fno-exceptions" >&5
|
||||
echo "configure:2235: checking for gcc -fno-exceptions" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2241,7 +2242,7 @@ __throw () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-nostdlib -nostartfiles -fno-exceptions
|
||||
-o conftest conftest.c 1>&5'; { (eval echo configure:2245: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
-o conftest conftest.c 1>&5'; { (eval echo configure:2246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_gcc_no_exceptions=yes
|
||||
else
|
||||
libc_cv_gcc_no_exceptions=no
|
||||
@ -2252,12 +2253,12 @@ fi
|
||||
echo "$ac_t""$libc_cv_gcc_no_exceptions" 1>&6
|
||||
|
||||
echo $ac_n "checking for DWARF2 unwind info support""... $ac_c" 1>&6
|
||||
echo "configure:2256: checking for DWARF2 unwind info support" >&5
|
||||
echo "configure:2257: checking for DWARF2 unwind info support" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_gcc_dwarf2_unwind_info'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.c <<EOF
|
||||
#line 2261 "configure"
|
||||
#line 2262 "configure"
|
||||
static char __EH_FRAME_BEGIN__;
|
||||
_start ()
|
||||
{
|
||||
@ -2278,7 +2279,7 @@ __bzero () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-nostdlib -nostartfiles
|
||||
-o conftest conftest.c -lgcc >&5'; { (eval echo configure:2282: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
-o conftest conftest.c -lgcc >&5'; { (eval echo configure:2283: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_gcc_dwarf2_unwind_info=yes
|
||||
else
|
||||
libc_cv_gcc_dwarf2_unwind_info=no
|
||||
@ -2336,7 +2337,7 @@ if test "$uname" = "sysdeps/generic"; then
|
||||
fi
|
||||
|
||||
echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
|
||||
echo "configure:2340: checking OS release for uname" >&5
|
||||
echo "configure:2341: checking OS release for uname" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2358,7 +2359,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
|
||||
uname_release="$libc_cv_uname_release"
|
||||
|
||||
echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
|
||||
echo "configure:2362: checking OS version for uname" >&5
|
||||
echo "configure:2363: checking OS version for uname" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2380,7 +2381,7 @@ else
|
||||
fi
|
||||
|
||||
echo $ac_n "checking stdio selection""... $ac_c" 1>&6
|
||||
echo "configure:2384: checking stdio selection" >&5
|
||||
echo "configure:2385: checking stdio selection" >&5
|
||||
|
||||
case $stdio in
|
||||
libio) cat >> confdefs.h <<\EOF
|
||||
@ -2392,7 +2393,7 @@ esac
|
||||
echo "$ac_t""$stdio" 1>&6
|
||||
|
||||
echo $ac_n "checking ldap selection""... $ac_c" 1>&6
|
||||
echo "configure:2396: checking ldap selection" >&5
|
||||
echo "configure:2397: checking ldap selection" >&5
|
||||
|
||||
case $add_ons in
|
||||
*ldap*)
|
||||
@ -2442,7 +2443,7 @@ if test $shared = default; then
|
||||
fi
|
||||
|
||||
echo $ac_n "checking whether -fPIC is default""... $ac_c" 1>&6
|
||||
echo "configure:2446: checking whether -fPIC is default" >&5
|
||||
echo "configure:2447: checking whether -fPIC is default" >&5
|
||||
if eval "test \"`echo '$''{'pic_default'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -422,7 +422,8 @@ AC_CHECK_TOOL(RANLIB, ranlib, :)
|
||||
|
||||
AC_PATH_PROG(BASH, bash, no)
|
||||
if test "$BASH" != no &&
|
||||
$BASH -c 'test "$BASH_VERSINFO" -ge 2 >&/dev/null'; then
|
||||
$BASH -c 'test "$BASH_VERSINFO"
|
||||
&& test "$BASH_VERSINFO" -ge 2 >&/dev/null'; then
|
||||
libc_cv_have_bash2=yes
|
||||
else
|
||||
libc_cv_have_bash2=no
|
||||
|
@ -36,7 +36,7 @@ omit-deps = $(patsubst %.o,%,$(start-installed-name) g$(start-installed-name) \
|
||||
$(csu-dummies))
|
||||
install-lib = $(start-installed-name) g$(start-installed-name) \
|
||||
$(csu-dummies)
|
||||
distribute = initfini.c gmon-start.c start.c defs.awk abi-note.S
|
||||
distribute = initfini.c gmon-start.c start.c defs.awk abi-note.S init.c
|
||||
|
||||
all: # Make this the default target; it will be defined in Rules.
|
||||
|
||||
@ -89,7 +89,7 @@ $(objpfx)defs.h: $(objpfx)initfini.s
|
||||
endif
|
||||
|
||||
ifeq (yes,$(elf))
|
||||
extra-objs += abi-note.o
|
||||
extra-objs += abi-note.o init.o
|
||||
asm-CPPFLAGS += -I$(objpfx).
|
||||
endif
|
||||
|
||||
@ -103,7 +103,8 @@ ifndef start-installed-name-rule
|
||||
ifeq (yes,$(elf))
|
||||
# We link the ELF startfile along with a SHT_NOTE section indicating
|
||||
# the the kernel ABI the binaries linked with this library will require.
|
||||
$(objpfx)$(start-installed-name): $(objpfx)start.o $(objpfx)abi-note.o
|
||||
$(objpfx)$(start-installed-name): $(objpfx)start.o $(objpfx)abi-note.o \
|
||||
$(objpfx)init.o
|
||||
$(link-relocatable)
|
||||
else
|
||||
# The startfile is installed under different names, so we just call our
|
||||
|
37
csu/init.c
Normal file
37
csu/init.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* Special startup support.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
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.
|
||||
|
||||
In addition to the permissions in the GNU Library General Public
|
||||
License, the Free Software Foundation gives you unlimited
|
||||
permission to link the compiled version of this file with other
|
||||
programs, and to distribute those programs without any restriction
|
||||
coming from the use of this file. (The Library General Public
|
||||
License restrictions do apply in other respects; for example, they
|
||||
cover modification of the file, and distribution when not linked
|
||||
into another program.)
|
||||
|
||||
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, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
|
||||
#undef _LIBC
|
||||
#include <libio.h>
|
||||
|
||||
/* This records which stdio is linked against in the application. */
|
||||
const void *const _IO_stdin_used = _IO_stdin;
|
||||
|
||||
#endif
|
@ -33,7 +33,7 @@ subdir-dirs = btree common db db185 dbm hash lock log mp mutex os txn \
|
||||
headers = db.h db_185.h
|
||||
|
||||
distribute = db_int.h config.h compat.h clib/getlong.c btree/btree.src \
|
||||
db/db.src db185/db185_int.src hash/hash.src log/log.src \
|
||||
db/db.src db185/db185_int.h hash/hash.src log/log.src \
|
||||
txn/txn.src \
|
||||
$(addprefix include/,btree.h btree_auto.h btree_ext.h \
|
||||
clib_ext.h common_ext.h cxx_int.h \
|
||||
|
@ -37,7 +37,7 @@ elide-routines.os = $(dl-routines) dl-support enbl-secure
|
||||
rtld-routines := rtld $(dl-routines) dl-sysdep dl-minimal
|
||||
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
|
||||
dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c \
|
||||
genrtldtbl.awk
|
||||
genrtldtbl.awk atomicity.h
|
||||
|
||||
extra-libs = libdl
|
||||
extra-libs-others = $(extra-libs)
|
||||
|
@ -155,11 +155,12 @@ do_lookup (const char *undef_name, unsigned long int hash,
|
||||
else
|
||||
{
|
||||
/* We can match the version information or use the
|
||||
default one. */
|
||||
default one if it is not hidden. */
|
||||
ElfW(Half) ndx = verstab[symidx] & 0x7fff;
|
||||
if ((map->l_versions[ndx].hash != version->hash
|
||||
|| strcmp (map->l_versions[ndx].name, version->name))
|
||||
&& (version->hidden || map->l_versions[ndx].hash))
|
||||
&& (version->hidden || map->l_versions[ndx].hash
|
||||
|| (verstab[symidx] & 0x8000)))
|
||||
/* It's not the version we want. */
|
||||
continue;
|
||||
}
|
||||
|
@ -5,7 +5,8 @@ BEGIN {
|
||||
}
|
||||
{
|
||||
for (i = 1; i <= NF; ++i) {
|
||||
dir[count++] = gensub(/((.*)[^/])?[/]*/, "\\1", "", $i);
|
||||
gsub (/\/*$/, "", $i);
|
||||
dir[count++] = $i;
|
||||
}
|
||||
}
|
||||
END {
|
||||
|
32
iconv/Makefile
Normal file
32
iconv/Makefile
Normal file
@ -0,0 +1,32 @@
|
||||
# Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
# This file is part of the GNU C Library.
|
||||
|
||||
# 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.
|
||||
|
||||
#
|
||||
# Makefile for iconv.
|
||||
#
|
||||
subdir := iconv
|
||||
|
||||
headers = iconv.h gconv.h
|
||||
routines = iconv_open iconv iconv_close \
|
||||
gconv_open gconv gconv_close gconv_db gconv_conf \
|
||||
gconv_dl gconv_builtin gconv_simple
|
||||
distribute = gconv_builtin.h
|
||||
|
||||
CFLAGS-gconv_conf.c = -DGCONV_PATH='"$(gconvdir)"'
|
||||
|
||||
include ../Rules
|
46
iconv/gconv.c
Normal file
46
iconv/gconv.c
Normal file
@ -0,0 +1,46 @@
|
||||
/* Convert characters in input buffer using conversion descriptor to
|
||||
output buffer.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
|
||||
|
||||
int
|
||||
__gconv (gconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf,
|
||||
size_t *outbytesleft, size_t *converted)
|
||||
{
|
||||
size_t last_step = cd->nsteps - 1;
|
||||
int result;
|
||||
|
||||
cd->data[last_step].outbuf = *outbuf;
|
||||
cd->data[last_step].outbufavail = 0;
|
||||
cd->data[last_step].outbufsize = *outbytesleft;
|
||||
|
||||
if (converted != NULL)
|
||||
*converted = 0;
|
||||
|
||||
result = (*cd->steps->fct) (cd->steps, cd->data, inbuf, inbytesleft,
|
||||
converted, inbuf == NULL || *inbuf == NULL);
|
||||
|
||||
*outbuf += cd->data[last_step].outbufavail;
|
||||
*outbytesleft -= cd->data[last_step].outbufavail;
|
||||
|
||||
return result;
|
||||
}
|
205
iconv/gconv.h
Normal file
205
iconv/gconv.h
Normal file
@ -0,0 +1,205 @@
|
||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _GCONV_H
|
||||
#define _GCONV_H 1
|
||||
|
||||
#include <features.h>
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
|
||||
/* Error codes for gconv functions. */
|
||||
enum
|
||||
{
|
||||
GCONV_OK = 0,
|
||||
GCONV_NOCONV,
|
||||
GCONV_NODB,
|
||||
GCONV_NOMEM,
|
||||
|
||||
GCONV_EMPTY_INPUT,
|
||||
GCONV_FULL_OUTPUT,
|
||||
GCONV_ILLEGAL_INPUT,
|
||||
|
||||
GCONV_ILLEGAL_DESCRIPTOR,
|
||||
GCONV_INTERNAL_ERROR
|
||||
};
|
||||
|
||||
|
||||
/* Structure for alias definition. Simply to strings. */
|
||||
struct gconv_alias
|
||||
{
|
||||
__const char *fromname;
|
||||
__const char *toname;
|
||||
};
|
||||
|
||||
|
||||
/* Default size of intermediate buffers. */
|
||||
#define GCONV_DEFAULT_BUFSIZE 8160
|
||||
|
||||
|
||||
/* Forward declarations. */
|
||||
struct gconv_step;
|
||||
struct gconv_step_data;
|
||||
|
||||
|
||||
/* Type of a conversion function. */
|
||||
typedef int (*gconv_fct) __P ((struct gconv_step *,
|
||||
struct gconv_step_data *,
|
||||
__const char *, size_t *, size_t *, int));
|
||||
|
||||
/* Constructor and destructor for local data for conversion step. */
|
||||
typedef int (*gconv_init_fct) __P ((struct gconv_step *,
|
||||
struct gconv_step_data *));
|
||||
typedef void (*gconv_end_fct) __P ((struct gconv_step_data *));
|
||||
|
||||
|
||||
/* Description of a conversion step. */
|
||||
struct gconv_step
|
||||
{
|
||||
void *shlib_handle;
|
||||
|
||||
__const char *from_name;
|
||||
__const char *to_name;
|
||||
|
||||
gconv_fct fct;
|
||||
gconv_init_fct init_fct;
|
||||
gconv_end_fct end_fct;
|
||||
};
|
||||
|
||||
/* Additional data for steps in use of conversion descriptor. This is
|
||||
allocated by the `init' function. */
|
||||
struct gconv_step_data
|
||||
{
|
||||
char *outbuf; /* Output buffer for this step. */
|
||||
size_t outbufavail; /* Bytes already available in output buffer. */
|
||||
size_t outbufsize; /* Size of output buffer. */
|
||||
|
||||
int is_last;
|
||||
|
||||
void *data; /* Pointer to step-local data. */
|
||||
};
|
||||
|
||||
/* Combine conversion step description with data. */
|
||||
typedef struct gconv_info
|
||||
{
|
||||
size_t nsteps;
|
||||
struct gconv_step *steps;
|
||||
struct gconv_step_data *data;
|
||||
} *gconv_t;
|
||||
|
||||
|
||||
/* Description for an available conversion module. */
|
||||
struct gconv_module
|
||||
{
|
||||
__const char *from_pattern;
|
||||
__const char *from_constpfx;
|
||||
size_t from_constpfx_len;
|
||||
__const regex_t *from_regex;
|
||||
|
||||
__const char *to_string;
|
||||
|
||||
int cost;
|
||||
|
||||
__const char *module_name;
|
||||
};
|
||||
|
||||
|
||||
/* Global variables. */
|
||||
|
||||
/* Database of alias names. */
|
||||
extern void *__gconv_alias_db;
|
||||
|
||||
/* Array with available modules. */
|
||||
extern size_t __gconv_nmodules;
|
||||
extern struct gconv_module **__gconv_modules_db;
|
||||
|
||||
|
||||
/* Return in *HANDLE decriptor for transformation from FROMSET to TOSET. */
|
||||
extern int __gconv_open __P ((__const char *__toset, __const char *__fromset,
|
||||
gconv_t *__handle));
|
||||
|
||||
/* Free resources associated with transformation descriptor CD. */
|
||||
extern int __gconv_close __P ((gconv_t cd));
|
||||
|
||||
/* Transform at most *INBYTESLEFT bytes from buffer starting at *INBUF
|
||||
according to rules described by CD and place up to *OUTBYTESLEFT
|
||||
bytes in buffer starting at *OUTBUF. Return number of written
|
||||
characters in *CONVERTED if this pointer is not null. */
|
||||
extern int __gconv __P ((gconv_t __cd,
|
||||
__const char **__inbuf, size_t *__inbytesleft,
|
||||
char **__outbuf, size_t *__outbytesleft,
|
||||
size_t *__converted));
|
||||
|
||||
/* Return in *HANDLE a pointer to an array with *NSTEPS elements describing
|
||||
the single steps necessary for transformation from FROMSET to TOSET. */
|
||||
extern int __gconv_find_transform __P ((__const char *__toset,
|
||||
__const char *__fromset,
|
||||
struct gconv_step **__handle,
|
||||
size_t *__nsteps));
|
||||
|
||||
/* Read all the configuration data and cache it. */
|
||||
extern void __gconv_read_conf __P ((void));
|
||||
|
||||
/* Comparison function to search alias. */
|
||||
extern int __gconv_alias_compare __P ((__const void *__p1,
|
||||
__const void *__p2));
|
||||
|
||||
/* Clear reference to transformation step implementations which might
|
||||
cause the code to be unloaded. */
|
||||
extern int __gconv_close_transform __P ((struct gconv_step *__steps,
|
||||
size_t __nsteps));
|
||||
|
||||
|
||||
/* Find in the shared object associated with HANDLE for a function with
|
||||
name NAME. Return function pointer or NULL. */
|
||||
extern void *__gconv_find_func __P ((void *__handle, __const char *__name));
|
||||
|
||||
/* Load shared object named by NAME. If already loaded increment reference
|
||||
count. */
|
||||
extern void *__gconv_find_shlib __P ((__const char *__name));
|
||||
|
||||
/* Release shared object. If no further reference is available unload
|
||||
the object. */
|
||||
extern int __gconv_release_shlib __P ((void *__handle));
|
||||
|
||||
/* Fill STEP with information about builtin module with NAME. */
|
||||
extern void __gconv_get_builtin_trans __P ((__const char *__name,
|
||||
struct gconv_step *__step));
|
||||
|
||||
|
||||
|
||||
/* Builtin transformations. */
|
||||
#ifdef _LIBC
|
||||
# define __BUILTIN_TRANS(Name) \
|
||||
extern int Name __P ((struct gconv_step *__step, \
|
||||
struct gconv_step_data *__data, __const char *__inbuf,\
|
||||
size_t *__inlen, size_t *__written, int __do_flush))
|
||||
|
||||
__BUILTIN_TRANS (__gconv_transform_dummy);
|
||||
__BUILTIN_TRANS (__gconv_transform_ucs4_utf8);
|
||||
__BUILTIN_TRANS (__gconv_transform_utf8_ucs4);
|
||||
# undef __BUITLIN_TRANS
|
||||
|
||||
extern int __gconv_transform_init_rstate __P ((struct gconv_step *__step,
|
||||
struct gconv_step_data *__data));
|
||||
extern void __gconv_transform_end_rstate __P ((struct gconv_step_data *__data));
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* gconv.h */
|
64
iconv/gconv_builtin.c
Normal file
64
iconv/gconv_builtin.c
Normal file
@ -0,0 +1,64 @@
|
||||
/* Table for builtin transformation mapping.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
static struct builtin_map
|
||||
{
|
||||
const char *name;
|
||||
gconv_fct fct;
|
||||
gconv_init_fct init;
|
||||
gconv_end_fct end;
|
||||
|
||||
} map[] =
|
||||
{
|
||||
#define BUILTIN_TRANSFORMATION(From, ConstPfx, ConstLen, To, Cost, Name, \
|
||||
Fct, Init, End) \
|
||||
{ \
|
||||
name: Name, \
|
||||
fct: Fct, \
|
||||
init: Init, \
|
||||
end: End, \
|
||||
},
|
||||
|
||||
#include <gconv_builtin.h>
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
__gconv_get_builtin_trans (const char *name, struct gconv_step *step)
|
||||
{
|
||||
size_t cnt;
|
||||
|
||||
for (cnt = 0; cnt < sizeof (map) / sizeof (map[0]); ++cnt)
|
||||
if (strcmp (name, map[cnt].name) == 0)
|
||||
break;
|
||||
|
||||
assert (cnt < sizeof (map) / sizeof (map[0]));
|
||||
|
||||
step->fct = map[cnt].fct;
|
||||
step->init_fct = map[cnt].init;
|
||||
step->end_fct = map[cnt].end;
|
||||
step->shlib_handle = NULL;
|
||||
}
|
34
iconv/gconv_builtin.h
Normal file
34
iconv/gconv_builtin.h
Normal file
@ -0,0 +1,34 @@
|
||||
/* Builtin transformations.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
BUILTIN_TRANSFORMATION ("\\([^/]+\\)/UCS4/\\([^/]*\\)", NULL, 0,
|
||||
"\\1/UTF8/\\2", 1, "=ucs4->utf8",
|
||||
__gconv_transform_ucs4_utf8,
|
||||
__gconv_transform_init_rstate,
|
||||
__gconv_transform_end_rstate)
|
||||
|
||||
BUILTIN_TRANSFORMATION ("\\([^/]+\\)/UTF8/\\([^/]*\\)", NULL, 0,
|
||||
"\\1/UCS4/\\2", 1, "=utf8->ucs4",
|
||||
__gconv_transform_utf8_ucs4,
|
||||
__gconv_transform_init_rstate,
|
||||
__gconv_transform_end_rstate)
|
||||
|
||||
BUILTIN_TRANSFORMATION ("\\(.*\\)", NULL, 0, "\\1", 1, "=dummy",
|
||||
__gconv_transform_dummy, NULL, NULL)
|
64
iconv/gconv_close.c
Normal file
64
iconv/gconv_close.c
Normal file
@ -0,0 +1,64 @@
|
||||
/* Release any resource associated with given conversion descriptor.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
int
|
||||
__gconv_close (gconv_t cd)
|
||||
{
|
||||
struct gconv_step *srunp;
|
||||
struct gconv_step_data *drunp;
|
||||
size_t nsteps;
|
||||
|
||||
/* Free all resources by calling destructor functions and release
|
||||
the implementations. */
|
||||
srunp = cd->steps;
|
||||
nsteps = cd->nsteps;
|
||||
drunp = cd->data;
|
||||
do
|
||||
{
|
||||
/* Call destructor. */
|
||||
if (srunp->end_fct != NULL)
|
||||
(*srunp->end_fct) (drunp);
|
||||
else
|
||||
{
|
||||
free (drunp->outbuf);
|
||||
if (drunp->data != NULL)
|
||||
free (drunp->data);
|
||||
}
|
||||
|
||||
/* Next step. */
|
||||
++srunp;
|
||||
++drunp;
|
||||
}
|
||||
while (!drunp->is_last);
|
||||
|
||||
/* Save the pointer, we need it below. */
|
||||
srunp = cd->steps;
|
||||
|
||||
/* Free the data allocated for the descriptor. */
|
||||
free (cd->data);
|
||||
free (cd);
|
||||
|
||||
/* Close the participating modules. */
|
||||
return __gconv_close_transform (srunp, nsteps);
|
||||
}
|
420
iconv/gconv_conf.c
Normal file
420
iconv/gconv_conf.c
Normal file
@ -0,0 +1,420 @@
|
||||
/* Handle configuration data.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <gconv.h>
|
||||
#include <search.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
|
||||
/* This is the default path where we look for module lists. */
|
||||
static const char default_gconv_path[] = GCONV_PATH;
|
||||
|
||||
/* Name of the file containing the module information in the directories
|
||||
along the path. */
|
||||
static const char gconv_conf_filename[] = "gconv-modules";
|
||||
|
||||
/* We have a few builtin transformations. */
|
||||
static struct gconv_module builtin_modules[] =
|
||||
{
|
||||
#define BUILTIN_TRANSFORMATION(From, ConstPfx, ConstLen, To, Cost, Name, \
|
||||
Fct, Init, End) \
|
||||
{ \
|
||||
from_pattern: From, \
|
||||
from_constpfx: ConstPfx, \
|
||||
from_constpfx_len: ConstLen, \
|
||||
from_regex: NULL, \
|
||||
to_string: To, \
|
||||
cost: Cost, \
|
||||
module_name: Name \
|
||||
},
|
||||
|
||||
#include "gconv_builtin.h"
|
||||
};
|
||||
|
||||
|
||||
/* Function for searching module. */
|
||||
static int
|
||||
module_compare (const void *p1, const void *p2)
|
||||
{
|
||||
struct gconv_module *s1 = (struct gconv_module *) p1;
|
||||
struct gconv_module *s2 = (struct gconv_module *) p2;
|
||||
int result;
|
||||
|
||||
if (s1->from_pattern == NULL)
|
||||
{
|
||||
if (s2->from_pattern == NULL)
|
||||
result = strcmp (s1->from_constpfx, s2->from_constpfx);
|
||||
else
|
||||
result = -1;
|
||||
}
|
||||
else if (s2->from_pattern == NULL)
|
||||
result = 1;
|
||||
else
|
||||
result = strcmp (s1->from_pattern, s2->from_pattern);
|
||||
|
||||
if (result == 0)
|
||||
result = strcmp (s1->to_string, s2->to_string);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Add new alias. */
|
||||
static inline void
|
||||
add_alias (char *rp)
|
||||
{
|
||||
/* We now expect two more string. The strings are normalized
|
||||
(converted to UPPER case) and strored in the alias database. */
|
||||
struct gconv_alias *new_alias;
|
||||
char *from, *to, *wp;
|
||||
|
||||
while (isspace (*rp))
|
||||
++rp;
|
||||
from = wp = rp;
|
||||
while (*rp != '\0' && !isspace (*rp))
|
||||
++rp;
|
||||
if (*rp == '\0')
|
||||
/* There is no `to' string on the line. Ignore it. */
|
||||
return;
|
||||
*rp++ = '\0';
|
||||
to = wp = rp;
|
||||
while (isspace (*rp))
|
||||
++rp;
|
||||
while (*rp != '\0' && !isspace (*rp))
|
||||
*wp++ = *rp++;
|
||||
if (to == wp)
|
||||
/* No `to' string, ignore the line. */
|
||||
return;
|
||||
*wp++ = '\0';
|
||||
|
||||
new_alias = (struct gconv_alias *)
|
||||
malloc (sizeof (struct gconv_alias) + (wp - from));
|
||||
new_alias->fromname = memcpy ((char *) new_alias
|
||||
+ sizeof (struct gconv_alias),
|
||||
from, to - from);
|
||||
new_alias->toname = memcpy ((char *) new_alias + sizeof (struct gconv_alias)
|
||||
+ (to - from), to, wp - to);
|
||||
|
||||
if (__tsearch (new_alias, &__gconv_alias_db, __gconv_alias_compare) == NULL)
|
||||
/* Something went wrong, free this entry. */
|
||||
free (new_alias);
|
||||
}
|
||||
|
||||
|
||||
/* Add new module. */
|
||||
static inline void
|
||||
add_module (char *rp, const char *directory, size_t dir_len, void **modules,
|
||||
size_t *nmodules)
|
||||
{
|
||||
/* We expect now
|
||||
1. `from' name
|
||||
2. `to' name
|
||||
3. filename of the module
|
||||
4. an optional cost value
|
||||
*/
|
||||
struct gconv_module *new_module;
|
||||
char *from, *to, *module, *wp;
|
||||
size_t const_len;
|
||||
int from_is_regex;
|
||||
int cost;
|
||||
|
||||
while (isspace (*rp))
|
||||
++rp;
|
||||
from = rp;
|
||||
from_is_regex = 0;
|
||||
while (*rp != '\0' && !isspace (*rp))
|
||||
{
|
||||
if (!isalnum (*rp) && *rp != '-' && *rp != '/' && *rp != '.'
|
||||
&& *rp != '_')
|
||||
from_is_regex = 1;
|
||||
++rp;
|
||||
}
|
||||
if (*rp == '\0')
|
||||
return;
|
||||
*rp++ = '\0';
|
||||
to = wp = rp;
|
||||
while (isspace (*rp))
|
||||
++rp;
|
||||
while (*rp != '\0' && !isspace (*rp))
|
||||
*wp++ = *rp++;
|
||||
if (*rp == '\0')
|
||||
return;
|
||||
*wp++ = '\0';
|
||||
do
|
||||
++rp;
|
||||
while (isspace (*rp));
|
||||
module = wp;
|
||||
while (*rp != '\0' && !isspace (*rp))
|
||||
*wp++ = *rp++;
|
||||
if (*rp == '\0')
|
||||
{
|
||||
/* There is no cost, use one by default. */
|
||||
*wp++ = '\0';
|
||||
cost = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There might be a cost value. */
|
||||
char *endp;
|
||||
|
||||
*wp++ = '\0';
|
||||
cost = strtol (rp, &endp, 10);
|
||||
if (rp == endp)
|
||||
/* No useful information. */
|
||||
cost = 1;
|
||||
}
|
||||
|
||||
if (module[0] == '\0')
|
||||
/* No module name given. */
|
||||
return;
|
||||
if (module[0] == '/')
|
||||
dir_len = 0;
|
||||
else
|
||||
/* Increment by one for the slash. */
|
||||
++dir_len;
|
||||
|
||||
/* We've collected all the information, now create an entry. */
|
||||
|
||||
const_len = 0;
|
||||
if (from_is_regex)
|
||||
do
|
||||
++const_len;
|
||||
while (isalnum (from[const_len]) || from[const_len] == '-'
|
||||
|| from[const_len] == '/' || from[const_len] == '.'
|
||||
|| from[const_len] == '_');
|
||||
|
||||
new_module = (struct gconv_module *) malloc (sizeof (struct gconv_module)
|
||||
+ (wp - from) + const_len
|
||||
+ dir_len);
|
||||
if (new_module != NULL)
|
||||
{
|
||||
if (from_is_regex)
|
||||
{
|
||||
new_module->from_pattern = memcpy ((char *) new_module
|
||||
+ sizeof (struct gconv_module),
|
||||
from, to - from);
|
||||
new_module->from_constpfx = memcpy ((char *) new_module->from_pattern
|
||||
+ (to - from),
|
||||
from, const_len);
|
||||
((char *) new_module->from_constpfx)[const_len] = '\0';
|
||||
new_module->from_constpfx_len = const_len;
|
||||
++const_len;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_module->from_pattern = NULL;
|
||||
new_module->from_constpfx = memcpy ((char *) new_module
|
||||
+ sizeof (struct gconv_module),
|
||||
from, to - from);
|
||||
new_module->from_constpfx_len = to - from - 1;
|
||||
const_len = to - from;
|
||||
}
|
||||
new_module->from_regex = NULL;
|
||||
|
||||
new_module->to_string = memcpy ((char *) new_module->from_constpfx
|
||||
+ const_len + 1, to, module - to);
|
||||
|
||||
new_module->cost = cost;
|
||||
|
||||
if (dir_len == 0)
|
||||
new_module->module_name = memcpy ((char *) new_module->to_string
|
||||
+ (module - to),
|
||||
module, wp - module);
|
||||
else
|
||||
{
|
||||
char *tmp;
|
||||
new_module->module_name = ((char *) new_module->to_string
|
||||
+ (module - to));
|
||||
tmp = __mempcpy ((char *) new_module->module_name,
|
||||
directory, dir_len - 1);
|
||||
*tmp++ = '/';
|
||||
memcpy (tmp, module, wp - module);
|
||||
}
|
||||
|
||||
if (__tfind (new_module, *modules, module_compare) != NULL)
|
||||
if (__tsearch (new_module, modules, module_compare) == NULL)
|
||||
/* Something went wrong while inserting the new module. */
|
||||
free (new_module);
|
||||
else
|
||||
++*nmodules;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
insert_module (const void *nodep, VISIT value, int level)
|
||||
{
|
||||
if (value == preorder || value == leaf)
|
||||
__gconv_modules_db[__gconv_nmodules++] = (struct gconv_module *) nodep;
|
||||
}
|
||||
|
||||
static void
|
||||
nothing (void *unused __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/* Read the next configuration file. */
|
||||
static void
|
||||
internal_function
|
||||
read_conf_file (const char *filename, const char *directory, size_t dir_len,
|
||||
void **modules, size_t *nmodules)
|
||||
{
|
||||
FILE *fp = fopen (filename, "r");
|
||||
char *line = NULL;
|
||||
size_t line_len = 0;
|
||||
|
||||
/* Don't complain if a file is not present or readable, simply silently
|
||||
ignore it. */
|
||||
if (fp == NULL)
|
||||
return;
|
||||
|
||||
/* Process the known entries of the file. Comments start with `#' and
|
||||
end with the end of the line. Empty lines are ignored. */
|
||||
while (!feof (fp))
|
||||
{
|
||||
char *rp, *endp, *word;
|
||||
ssize_t n = __getdelim (&line, &line_len, '\n', fp);
|
||||
if (n < 0)
|
||||
/* An error occurred. */
|
||||
break;
|
||||
|
||||
rp = line;
|
||||
while (isspace (*rp))
|
||||
++rp;
|
||||
/* Terminate the line (excluding comments or newline) by an NUL byte
|
||||
to simplify the following code. */
|
||||
endp = strchr (rp, '#');
|
||||
if (endp != NULL)
|
||||
*endp = '\0';
|
||||
else
|
||||
{
|
||||
endp = strchr (rp, '\n');
|
||||
if (endp != NULL)
|
||||
*endp = '\0';
|
||||
}
|
||||
|
||||
/* If this is an empty line go on with the next one. */
|
||||
if (rp == endp)
|
||||
continue;
|
||||
|
||||
word = rp;
|
||||
while (*rp != '\0' && !isspace (*rp))
|
||||
++rp;
|
||||
|
||||
if (rp - word == sizeof ("alias") - 1
|
||||
&& memcpy (word, "alias", sizeof ("alias") - 1) == 0)
|
||||
add_alias (rp);
|
||||
else if (rp - word == sizeof ("module") - 1
|
||||
&& memcpy (word, "module", sizeof ("module") - 1) == 0)
|
||||
add_module (rp, directory, dir_len, modules, nmodules);
|
||||
/* else */
|
||||
/* Otherwise ignore the line. */
|
||||
}
|
||||
|
||||
if (line != NULL)
|
||||
free (line);
|
||||
fclose (fp);
|
||||
}
|
||||
|
||||
|
||||
/* Read all configuration files found in the user-specified and the default
|
||||
path. */
|
||||
void
|
||||
__gconv_read_conf (void)
|
||||
{
|
||||
const char *user_path = __secure_getenv ("GCONV_PATH");
|
||||
char *gconv_path, *elem;
|
||||
void *modules = NULL;
|
||||
size_t nmodules = 0;
|
||||
|
||||
if (user_path == NULL)
|
||||
/* No user-defined path. Make a modifiable copy of the default path. */
|
||||
gconv_path = strdupa (default_gconv_path);
|
||||
else
|
||||
{
|
||||
/* Append the default path to the user-defined path. */
|
||||
size_t user_len = strlen (user_path);
|
||||
char *tmp;
|
||||
|
||||
gconv_path = alloca (user_len + 1 + sizeof (default_gconv_path));
|
||||
tmp = __mempcpy (gconv_path, user_path, user_len);
|
||||
*tmp++ = ':';
|
||||
__mempcpy (tmp, default_gconv_path, sizeof (default_gconv_path));
|
||||
}
|
||||
|
||||
elem = strtok_r (gconv_path, ":", &gconv_path);
|
||||
while (elem != NULL)
|
||||
{
|
||||
char real_elem[MAXPATHLEN];
|
||||
|
||||
if (realpath (elem, real_elem) != NULL)
|
||||
{
|
||||
size_t elem_len = strlen (real_elem);
|
||||
char *filename, *tmp;
|
||||
|
||||
filename = alloca (elem_len + 1 + sizeof (gconv_conf_filename));
|
||||
tmp = __mempcpy (filename, real_elem, elem_len);
|
||||
*tmp++ = '/';
|
||||
__mempcpy (tmp, gconv_conf_filename, sizeof (gconv_conf_filename));
|
||||
|
||||
/* Read the next configuration file. */
|
||||
read_conf_file (filename, real_elem, elem_len, &modules, &nmodules);
|
||||
}
|
||||
|
||||
/* Get next element in the path. */
|
||||
elem = strtok_r (NULL, ":", &gconv_path);
|
||||
}
|
||||
|
||||
/* If the configuration files do not contain any valid module specification
|
||||
remember this by setting the pointer to the module array to NULL. */
|
||||
nmodules = sizeof (builtin_modules) / sizeof (struct gconv_module);
|
||||
if (nmodules == 0)
|
||||
{
|
||||
__gconv_modules_db = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
__gconv_modules_db =
|
||||
(struct gconv_module **) malloc (nmodules * sizeof (struct gconv_module));
|
||||
if (__gconv_modules_db == NULL)
|
||||
/* We cannot do anything. */
|
||||
return;
|
||||
|
||||
/* First insert the builtin transformations. */
|
||||
while (__gconv_nmodules < (sizeof (builtin_modules)
|
||||
/ sizeof (struct gconv_module)))
|
||||
{
|
||||
__gconv_modules_db[__gconv_nmodules] =
|
||||
&builtin_modules[__gconv_nmodules];
|
||||
++__gconv_nmodules;
|
||||
}
|
||||
|
||||
/* Insert all module entries into the array. */
|
||||
__twalk (modules, insert_module);
|
||||
|
||||
/* No remove the tree data structure. */
|
||||
__tdestroy (modules, nothing);
|
||||
}
|
538
iconv/gconv_db.c
Normal file
538
iconv/gconv_db.c
Normal file
@ -0,0 +1,538 @@
|
||||
/* Provide access to the collection of available transformation modules.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
#include <search.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <bits/libc-lock.h>
|
||||
|
||||
|
||||
/* Simple data structure for alias mapping. We have two names, `from'
|
||||
and `to'. */
|
||||
void *__gconv_alias_db;
|
||||
|
||||
/* Array with available modules. */
|
||||
size_t __gconv_nmodules;
|
||||
struct gconv_module **__gconv_modules_db;
|
||||
|
||||
|
||||
/* Function for searching alias. */
|
||||
int
|
||||
__gconv_alias_compare (const void *p1, const void *p2)
|
||||
{
|
||||
struct gconv_alias *s1 = (struct gconv_alias *) p1;
|
||||
struct gconv_alias *s2 = (struct gconv_alias *) p2;
|
||||
return __strcasecmp (s1->fromname, s2->fromname);
|
||||
}
|
||||
|
||||
|
||||
/* To search for a derivation we create a list of intermediate steps.
|
||||
Each element contains a pointer to the element which precedes it
|
||||
in the derivation order. */
|
||||
struct derivation_step
|
||||
{
|
||||
const char *result_set;
|
||||
struct gconv_module *code;
|
||||
struct derivation_step *last;
|
||||
struct derivation_step *next;
|
||||
};
|
||||
|
||||
#define NEW_STEP(result, module, last_mod) \
|
||||
({ struct derivation_step *newp = alloca (sizeof (struct derivation_step)); \
|
||||
newp->result_set = result; \
|
||||
newp->code = module; \
|
||||
newp->last = last_mod; \
|
||||
newp->next = NULL; \
|
||||
newp; })
|
||||
|
||||
|
||||
/* If a specific transformation is used more than once we should not need
|
||||
to start looking for it again. Instead cache each successful result. */
|
||||
struct known_derivation
|
||||
{
|
||||
const char *from;
|
||||
const char *to;
|
||||
struct gconv_step *steps;
|
||||
size_t nsteps;
|
||||
};
|
||||
|
||||
/* Compare function for database of found derivations. */
|
||||
static int
|
||||
derivation_compare (const void *p1, const void *p2)
|
||||
{
|
||||
struct known_derivation *s1 = (struct known_derivation *) p1;
|
||||
struct known_derivation *s2 = (struct known_derivation *) p2;
|
||||
int result;
|
||||
|
||||
result = strcmp (s1->from, s2->from);
|
||||
if (result == 0)
|
||||
result = strcmp (s1->to, s2->to);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* The search tree for known derivations. */
|
||||
static void *known_derivations;
|
||||
|
||||
/* Look up whether given transformation was already requested before. */
|
||||
static int
|
||||
derivation_lookup (const char *fromset, const char *toset,
|
||||
struct gconv_step **handle, size_t *nsteps)
|
||||
{
|
||||
struct known_derivation key = { fromset, toset, NULL, 0 };
|
||||
struct known_derivation *result;
|
||||
|
||||
result = __tfind (&key, known_derivations, derivation_compare);
|
||||
|
||||
if (result == NULL)
|
||||
return GCONV_NOCONV;
|
||||
|
||||
*handle = result->steps;
|
||||
*nsteps = result->nsteps;
|
||||
|
||||
/* Please note that we return GCONV_OK even if the last search for
|
||||
this transformation was unsuccessful. */
|
||||
return GCONV_OK;
|
||||
}
|
||||
|
||||
/* Add new derivation to list of known ones. */
|
||||
static void
|
||||
add_derivation (const char *fromset, const char *toset,
|
||||
struct gconv_step *handle, size_t nsteps)
|
||||
{
|
||||
struct known_derivation *new_deriv;
|
||||
size_t fromset_len = strlen (fromset) + 1;
|
||||
size_t toset_len = strlen (toset) + 1;
|
||||
|
||||
new_deriv = (struct known_derivation *)
|
||||
malloc (sizeof (struct known_derivation) + fromset_len + toset_len);
|
||||
if (new_deriv != NULL)
|
||||
{
|
||||
new_deriv->from = memcpy ((char *) new_deriv
|
||||
+ sizeof (struct known_derivation),
|
||||
fromset, fromset_len);
|
||||
new_deriv->to = memcpy ((char *) new_deriv->from + fromset_len,
|
||||
toset, toset_len);
|
||||
|
||||
new_deriv->steps = handle;
|
||||
new_deriv->nsteps = nsteps;
|
||||
|
||||
__tsearch (new_deriv, &known_derivations, derivation_compare);
|
||||
}
|
||||
/* Please note that we don't complain if the allocation failed. This
|
||||
is not tragically but in case we use the memory debugging facilities
|
||||
not all memory will be freed. */
|
||||
}
|
||||
|
||||
static void
|
||||
free_derivation (void *p)
|
||||
{
|
||||
struct known_derivation *deriv = (struct known_derivation *) p;
|
||||
|
||||
free ((struct gconv_step *) deriv->steps);
|
||||
free (deriv);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
internal_function
|
||||
gen_steps (struct derivation_step *best, const char *toset,
|
||||
const char *fromset, struct gconv_step **handle, size_t *nsteps)
|
||||
{
|
||||
size_t step_cnt = 0;
|
||||
struct gconv_step *result;
|
||||
struct derivation_step *current;
|
||||
int status = GCONV_NOMEM;
|
||||
|
||||
/* First determine number of steps. */
|
||||
for (current = best; current->last != NULL; current = current->last)
|
||||
++step_cnt;
|
||||
|
||||
result = (struct gconv_step *) malloc (sizeof (struct gconv_step)
|
||||
* step_cnt);
|
||||
if (result != NULL)
|
||||
{
|
||||
current = best;
|
||||
while (step_cnt-- > 0)
|
||||
{
|
||||
result[step_cnt].from_name = current->last->result_set;
|
||||
result[step_cnt].to_name = current->result_set;
|
||||
|
||||
if (current->code->module_name[0] == '/')
|
||||
{
|
||||
/* Load the module, return handle for it. */
|
||||
void *shlib_handle =
|
||||
__gconv_find_shlib (current->code->module_name);
|
||||
|
||||
if (shlib_handle == NULL)
|
||||
break;
|
||||
|
||||
result[step_cnt].shlib_handle = shlib_handle;
|
||||
|
||||
result[step_cnt].fct = __gconv_find_func (shlib_handle, "gconv");
|
||||
if (result[step_cnt].fct == NULL)
|
||||
{
|
||||
/* Argh, no conversion function. There is something
|
||||
wrong here. */
|
||||
__gconv_release_shlib (result[step_cnt].shlib_handle);
|
||||
break;
|
||||
}
|
||||
|
||||
result[step_cnt].init_fct = __gconv_find_func (shlib_handle,
|
||||
"gconv_init");
|
||||
result[step_cnt].end_fct = __gconv_find_func (shlib_handle,
|
||||
"gconv_end");
|
||||
}
|
||||
else
|
||||
/* It's a builtin transformation. */
|
||||
__gconv_get_builtin_trans (current->code->module_name,
|
||||
&result[step_cnt]);
|
||||
|
||||
current = current->last;
|
||||
}
|
||||
|
||||
if (step_cnt != 0)
|
||||
{
|
||||
/* Something went wrong while initializing the modules. */
|
||||
while (step_cnt-- > 0)
|
||||
__gconv_release_shlib (result[step_cnt].shlib_handle);
|
||||
free (result);
|
||||
status = GCONV_NOCONV;
|
||||
}
|
||||
else
|
||||
{
|
||||
*handle = result;
|
||||
*nsteps = step_cnt;
|
||||
status = GCONV_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/* The main function: find a possible derivation from the `fromset' (either
|
||||
the given name or the alias) to the `toset' (again with alias). */
|
||||
static int
|
||||
find_derivation (const char *toset, const char *toset_expand,
|
||||
const char *fromset, const char *fromset_expand,
|
||||
struct gconv_step **handle, size_t *nsteps)
|
||||
{
|
||||
__libc_lock_define_initialized (static, lock)
|
||||
struct derivation_step *current, **lastp, *best = NULL;
|
||||
int best_cost = 0;
|
||||
int result;
|
||||
|
||||
result = derivation_lookup (fromset_expand ?: fromset, toset_expand ?: toset,
|
||||
handle, nsteps);
|
||||
if (result == GCONV_OK)
|
||||
return result;
|
||||
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
/* There is a small chance that this derivation is meanwhile found. This
|
||||
can happen if in `find_derivation' we look for this derivation, didn't
|
||||
find it but at the same time another thread looked for this derivation. */
|
||||
result = derivation_lookup (fromset_expand ?: fromset, toset_expand ?: toset,
|
||||
handle, nsteps);
|
||||
if (result == GCONV_OK)
|
||||
return result;
|
||||
|
||||
/* ### TODO
|
||||
For now we use a simple algorithm with quadratic runtime behaviour.
|
||||
The task is to match the `toset' with any of the available. */
|
||||
if (fromset_expand != NULL)
|
||||
{
|
||||
current = NEW_STEP (fromset_expand, NULL, NULL);
|
||||
current->next = NEW_STEP (fromset, NULL, NULL);
|
||||
lastp = ¤t->next->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
current = NEW_STEP (fromset, NULL, NULL);
|
||||
lastp = ¤t->next;
|
||||
}
|
||||
|
||||
while (current != NULL)
|
||||
{
|
||||
/* Now match all the available module specifications against the
|
||||
current charset name. If any of them matches check whether
|
||||
we already have a derivation for this charset. If yes, use the
|
||||
one with the lower costs. Otherwise add the new charset at the
|
||||
end. */
|
||||
size_t cnt;
|
||||
|
||||
for (cnt = 0; cnt < __gconv_nmodules; ++cnt)
|
||||
{
|
||||
const char *result_set = NULL;
|
||||
|
||||
if (__gconv_modules_db[cnt]->from_pattern == NULL)
|
||||
{
|
||||
if (__strcasecmp (current->result_set,
|
||||
__gconv_modules_db[cnt]->from_constpfx) == 0)
|
||||
{
|
||||
if (strcmp (__gconv_modules_db[cnt]->to_string, "-") == 0)
|
||||
result_set = toset_expand ?: toset;
|
||||
else
|
||||
result_set = __gconv_modules_db[cnt]->to_string;
|
||||
}
|
||||
}
|
||||
else
|
||||
/* We have a regular expression. First see if the prefix
|
||||
matches. */
|
||||
if (__strncasecmp (current->result_set,
|
||||
__gconv_modules_db[cnt]->from_constpfx,
|
||||
__gconv_modules_db[cnt]->from_constpfx_len)
|
||||
== 0)
|
||||
{
|
||||
/* First compile the regex if not already done. */
|
||||
if (__gconv_modules_db[cnt]->from_regex == NULL)
|
||||
{
|
||||
regex_t *newp = (regex_t *) malloc (sizeof (regex_t));
|
||||
|
||||
if (regcomp (newp, __gconv_modules_db[cnt]->from_pattern,
|
||||
REG_EXTENDED | REG_ICASE) != 0)
|
||||
{
|
||||
/* Something is wrong. Remember this. */
|
||||
free (newp);
|
||||
__gconv_modules_db[cnt]->from_regex = (regex_t *) -1L;
|
||||
}
|
||||
else
|
||||
__gconv_modules_db[cnt]->from_regex = newp;
|
||||
}
|
||||
|
||||
if (__gconv_modules_db[cnt]->from_regex != (regex_t *) -1L)
|
||||
{
|
||||
/* Try to match the from name. */
|
||||
regmatch_t match[4];
|
||||
|
||||
if (regexec (__gconv_modules_db[cnt]->from_regex,
|
||||
current->result_set, 4, match, 0) == 0
|
||||
&& match[0].rm_so == 0
|
||||
&& current->result_set[match[0].rm_eo] == '\0')
|
||||
{
|
||||
/* At least the whole <from> string is matched.
|
||||
We must now match sed-like possible
|
||||
subexpressions from the match to the
|
||||
toset expression. */
|
||||
#define ENSURE_LEN(LEN) \
|
||||
if (wp + (LEN) >= constr + len - 1) \
|
||||
{ \
|
||||
char *newp = alloca (len += 128); \
|
||||
memcpy (newp, constr, wp - constr); \
|
||||
wp = newp + (wp - constr); \
|
||||
constr = newp; \
|
||||
}
|
||||
size_t len = 128;
|
||||
char *constr = alloca (len);
|
||||
char *wp = constr;
|
||||
const char *cp = __gconv_modules_db[cnt]->to_string;
|
||||
|
||||
while (*cp != '\0')
|
||||
{
|
||||
if (*cp != '\\')
|
||||
{
|
||||
ENSURE_LEN (1);
|
||||
*wp++ = *cp++;
|
||||
}
|
||||
else if (cp[1] == '\0')
|
||||
/* Backslash at end of string. */
|
||||
break;
|
||||
else
|
||||
{
|
||||
++cp;
|
||||
if (*cp == '\\')
|
||||
{
|
||||
*wp++ = *cp++;
|
||||
ENSURE_LEN (1);
|
||||
}
|
||||
else if (*cp < '1' || *cp > '3')
|
||||
break;
|
||||
else
|
||||
{
|
||||
int idx = *cp - '0';
|
||||
if (match[idx].rm_so == -1)
|
||||
/* No match. */
|
||||
break;
|
||||
|
||||
ENSURE_LEN (match[idx].rm_eo
|
||||
- match[idx].rm_so);
|
||||
wp = __mempcpy (wp,
|
||||
¤t->result_set[match[idx].rm_so],
|
||||
match[idx].rm_eo
|
||||
- match[idx].rm_so);
|
||||
++cp;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (*cp == '\0' && wp != constr)
|
||||
{
|
||||
/* Terminate the constructed string. */
|
||||
*wp = '\0';
|
||||
result_set = constr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (result_set != NULL)
|
||||
{
|
||||
/* We managed to find a derivation. First see whether
|
||||
this is what we are looking for. */
|
||||
if (__strcasecmp (result_set, toset) == 0
|
||||
|| (toset_expand != NULL
|
||||
&& __strcasecmp (result_set, toset_expand) == 0))
|
||||
{
|
||||
/* Determine the costs. If they are lower than the
|
||||
previous solution (or this is the first solution)
|
||||
remember this solution. */
|
||||
int cost = __gconv_modules_db[cnt]->cost;
|
||||
struct derivation_step *runp = current;
|
||||
while (runp->code != NULL)
|
||||
{
|
||||
cost += runp->code->cost;
|
||||
runp = runp->last;
|
||||
}
|
||||
if (best == NULL || cost < best_cost)
|
||||
{
|
||||
best = NEW_STEP (result_set, __gconv_modules_db[cnt],
|
||||
current);
|
||||
best_cost = cost;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Append at the end. */
|
||||
*lastp = NEW_STEP (result_set, __gconv_modules_db[cnt],
|
||||
current);
|
||||
lastp = &(*lastp)->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (best != NULL)
|
||||
/* We really found a way to do the transformation. Now build a data
|
||||
structure describing the transformation steps.*/
|
||||
result = gen_steps (best, toset_expand ?: toset, fromset_expand ?: fromset,
|
||||
handle, nsteps);
|
||||
else
|
||||
{
|
||||
/* We haven't found a transformation. Clear the result values. */
|
||||
*handle = NULL;
|
||||
*nsteps = 0;
|
||||
}
|
||||
|
||||
/* Add result in any case to list of known derivations. */
|
||||
add_derivation (fromset_expand ?: fromset, toset_expand ?: toset,
|
||||
*handle, *nsteps);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__gconv_find_transform (const char *toset, const char *fromset,
|
||||
struct gconv_step **handle, size_t *nsteps)
|
||||
{
|
||||
__libc_once_define (static, once);
|
||||
const char *fromset_expand = NULL;
|
||||
const char *toset_expand = NULL;
|
||||
int result;
|
||||
|
||||
/* Ensure that the configuration data is read. */
|
||||
__libc_once (once, __gconv_read_conf);
|
||||
|
||||
/* If we don't have a module database return with an error. */
|
||||
if (__gconv_modules_db == NULL)
|
||||
return GCONV_NOCONV;
|
||||
|
||||
/* See whether the names are aliases. */
|
||||
if (__gconv_alias_db != NULL)
|
||||
{
|
||||
struct gconv_alias key;
|
||||
struct gconv_alias *found;
|
||||
|
||||
key.fromname = fromset;
|
||||
found = __tfind (&key, __gconv_alias_db, __gconv_alias_compare);
|
||||
fromset_expand = found != NULL ? found->toname : NULL;
|
||||
|
||||
key.fromname = toset;
|
||||
found = __tfind (&key, __gconv_alias_db, __gconv_alias_compare);
|
||||
toset_expand = found != NULL ? found->toname : NULL;
|
||||
}
|
||||
|
||||
result = find_derivation (toset, toset_expand, fromset, fromset_expand,
|
||||
handle, nsteps);
|
||||
|
||||
/* The following code is necessary since `find_derivation' will return
|
||||
GCONV_OK even when no derivation was found but the same request
|
||||
was processed before. I.e., negative results will also be cached. */
|
||||
return (result == GCONV_OK
|
||||
? (*handle == NULL ? GCONV_NOCONV : GCONV_OK)
|
||||
: result);
|
||||
}
|
||||
|
||||
|
||||
/* Release the entries of the modules list. */
|
||||
int
|
||||
__gconv_close_transform (struct gconv_step *steps, size_t nsteps)
|
||||
{
|
||||
int result = GCONV_OK;
|
||||
|
||||
while (nsteps-- > 0)
|
||||
if (steps[nsteps].shlib_handle != NULL)
|
||||
{
|
||||
result = __gconv_release_shlib (steps[nsteps].shlib_handle);
|
||||
if (result != GCONV_OK)
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Free all resources if necessary. */
|
||||
static void __attribute__ ((unused))
|
||||
free_mem (void)
|
||||
{
|
||||
size_t cnt;
|
||||
|
||||
if (__gconv_alias_db != NULL)
|
||||
__tdestroy (__gconv_alias_db, free);
|
||||
|
||||
for (cnt = 0; cnt < __gconv_nmodules; ++cnt)
|
||||
{
|
||||
if (__gconv_modules_db[cnt]->from_regex != NULL)
|
||||
regfree ((regex_t *) __gconv_modules_db[cnt]->from_regex);
|
||||
|
||||
/* Modules which names do not start with a slash are builtin
|
||||
transformations and the memory is not allocated dynamically. */
|
||||
if (__gconv_modules_db[cnt]->module_name[0] == '/')
|
||||
free (__gconv_modules_db[cnt]);
|
||||
}
|
||||
|
||||
if (known_derivations != NULL)
|
||||
__tdestroy (known_derivations, free_derivation);
|
||||
}
|
||||
|
||||
text_set_element (__libc_subfreeres, free_mem);
|
254
iconv/gconv_dl.c
Normal file
254
iconv/gconv_dl.c
Normal file
@ -0,0 +1,254 @@
|
||||
/* Handle loading/unloading of shared object for transformation.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <gconv.h>
|
||||
#include <inttypes.h>
|
||||
#include <link.h>
|
||||
#include <search.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <bits/libc-lock.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
|
||||
/* This is a tuning parameter. If a transformation module is not used
|
||||
anymore it gets not immediately unloaded. Instead we wait a certain
|
||||
number of load attempts for further modules. If none of the
|
||||
subsequent load attempts name the same object it finally gets unloaded.
|
||||
Otherwise it is still available which hopefully is the frequent case.
|
||||
The following number is the number of unloading attempts we wait
|
||||
before unloading. */
|
||||
#define TRIES_BEFORE_UNLOAD 2
|
||||
|
||||
|
||||
/* Structure describing one loaded shared object. This normally are
|
||||
objects to perform conversation but as a special case the db shared
|
||||
object is also handled. */
|
||||
struct loaded_object
|
||||
{
|
||||
/* Name of the object. */
|
||||
const char *name;
|
||||
|
||||
/* Reference counter for the db functionality. If no conversion is
|
||||
needed we unload the db library. */
|
||||
int counter;
|
||||
|
||||
/* The handle for the shared object. */
|
||||
void *handle;
|
||||
};
|
||||
|
||||
|
||||
/* Array of loaded objects. This is shared by all threads so we have
|
||||
to use semaphores to access it. */
|
||||
static void *loaded;
|
||||
__libc_lock_define_initialized (static, lock)
|
||||
|
||||
|
||||
|
||||
/* Comparison function for searching `loaded_object' tree. */
|
||||
static int
|
||||
known_compare (const void *p1, const void *p2)
|
||||
{
|
||||
const struct loaded_object *s1 = (const struct loaded_object *) p1;
|
||||
const struct loaded_object *s2 = (const struct loaded_object *) p2;
|
||||
|
||||
return (intptr_t) s1->handle - (intptr_t) s2->handle;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
do_open (void *a)
|
||||
{
|
||||
struct loaded_object *args = (struct loaded_object *) a;
|
||||
/* Open and relocate the shared object. */
|
||||
args->handle = _dl_open (args->name, RTLD_LAZY);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
dlerror_run (void (*operate) (void *), void *args)
|
||||
{
|
||||
char *last_errstring = NULL;
|
||||
const char *last_object_name = NULL;
|
||||
int result;
|
||||
|
||||
(void) _dl_catch_error (&last_errstring, &last_object_name, operate, args);
|
||||
|
||||
result = last_errstring != NULL;
|
||||
if (result)
|
||||
free (last_errstring);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
struct get_sym_args
|
||||
{
|
||||
/* Arguments to get_sym. */
|
||||
struct link_map *map;
|
||||
const char *name;
|
||||
|
||||
/* Return values of get_sym. */
|
||||
ElfW(Addr) loadbase;
|
||||
const ElfW(Sym) *ref;
|
||||
};
|
||||
|
||||
static void
|
||||
get_sym (void *a)
|
||||
{
|
||||
struct get_sym_args *args = (struct get_sym_args *) a;
|
||||
struct link_map *scope[2] = { args->map, NULL };
|
||||
args->ref = NULL;
|
||||
args->loadbase = _dl_lookup_symbol (args->name, &args->ref,
|
||||
scope, args->map->l_name, 0);
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
__gconv_find_func (void *handle, const char *name)
|
||||
{
|
||||
struct get_sym_args args;
|
||||
|
||||
args.map = handle;
|
||||
args.name = name;
|
||||
|
||||
return (dlerror_run (get_sym, &args) ? NULL
|
||||
: (void *) (args.loadbase + args.ref->st_value));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Open the gconv database if necessary. A non-negative return value
|
||||
means success. */
|
||||
void *
|
||||
__gconv_find_shlib (const char *name)
|
||||
{
|
||||
void *result = NULL;
|
||||
struct loaded_object *found;
|
||||
|
||||
/* Acquire the lock. */
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
/* Search the tree of shared objects previously requested. Data in
|
||||
the tree are `loaded_object' structures, whose first member is a
|
||||
`const char *', the lookup key. The search returns a pointer to
|
||||
the tree node structure; the first member of the is a pointer to
|
||||
our structure (i.e. what will be a `loaded_object'); since the
|
||||
first member of that is the lookup key string, &FCT_NAME is close
|
||||
enough to a pointer to our structure to use as a lookup key that
|
||||
will be passed to `known_compare' (above). */
|
||||
|
||||
found = __tfind (&name, loaded, known_compare);
|
||||
if (found == NULL)
|
||||
{
|
||||
/* This name was not known before. */
|
||||
found = malloc (sizeof (struct loaded_object));
|
||||
if (found != NULL)
|
||||
{
|
||||
/* Point the tree node at this new structure. */
|
||||
found->name = name;
|
||||
found->counter = -TRIES_BEFORE_UNLOAD - 1;
|
||||
found->handle = NULL;
|
||||
|
||||
if (__tsearch (found, &loaded, known_compare) == NULL)
|
||||
{
|
||||
/* Something went wrong while inserting the entry. */
|
||||
free (found);
|
||||
found = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Try to load the shared object if the usage count is 0. This
|
||||
implies that if the shared object is not loadable, the handle is
|
||||
NULL and the usage count > 0. */
|
||||
if (found != NULL)
|
||||
{
|
||||
if (found->counter < -TRIES_BEFORE_UNLOAD)
|
||||
{
|
||||
if (dlerror_run (do_open, found) == 0)
|
||||
found->counter = 1;
|
||||
}
|
||||
else if (found->handle != NULL)
|
||||
found->counter = MAX (found->counter + 1, 1);
|
||||
|
||||
result = found->handle;
|
||||
}
|
||||
|
||||
/* Release the lock. */
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* This is very ugly but the tsearch functions provide no way to pass
|
||||
information to the walker function. So we use a global variable.
|
||||
It is MT safe since we use a lock. */
|
||||
static void *release_handle;
|
||||
|
||||
static void
|
||||
do_release_shlib (const void *nodep, VISIT value, int level)
|
||||
{
|
||||
struct loaded_object *obj = (struct loaded_object *) nodep;
|
||||
|
||||
if (value != preorder && value != leaf)
|
||||
return;
|
||||
|
||||
if (obj->handle == release_handle)
|
||||
/* This is the object we want to unload. Now set the release
|
||||
counter to zero. */
|
||||
obj->counter = 0;
|
||||
else if (obj->counter <= 0)
|
||||
{
|
||||
if (--obj->counter < -TRIES_BEFORE_UNLOAD && obj->handle != NULL)
|
||||
{
|
||||
/* Unload the shared object. We don't use the trick to
|
||||
catch errors since in the case an error is signalled
|
||||
something is really wrong. */
|
||||
_dl_close ((struct link_map *) obj->handle);
|
||||
|
||||
obj->handle = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Notify system that a shared object is not longer needed. */
|
||||
int
|
||||
__gconv_release_shlib (void *handle)
|
||||
{
|
||||
/* Acquire the lock. */
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
/* Urgh, this is ugly but we have no other possibility. */
|
||||
release_handle = handle;
|
||||
|
||||
/* Process all entries. Please note that we also visit entries
|
||||
with release counts <= 0. This way we can finally unload them
|
||||
if necessary. */
|
||||
__twalk (loaded, do_release_shlib);
|
||||
|
||||
/* Release the lock. */
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
return GCONV_OK;
|
||||
}
|
123
iconv/gconv_open.c
Normal file
123
iconv/gconv_open.c
Normal file
@ -0,0 +1,123 @@
|
||||
/* Find matching transformation algorithms and initialize steps.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <gconv.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
int
|
||||
__gconv_open (const char *toset, const char *fromset, gconv_t *handle)
|
||||
{
|
||||
struct gconv_step *steps;
|
||||
size_t nsteps;
|
||||
gconv_t result = NULL;
|
||||
size_t cnt = 0;
|
||||
int res;
|
||||
|
||||
res = __gconv_find_transform (toset, fromset, &steps, &nsteps);
|
||||
if (res == GCONV_OK)
|
||||
{
|
||||
/* Allocate room for handle. */
|
||||
result = (gconv_t) malloc (sizeof (struct gconv_info));
|
||||
if (result == NULL)
|
||||
res = GCONV_NOMEM;
|
||||
else
|
||||
{
|
||||
/* Remember the list of steps. */
|
||||
result->steps = steps;
|
||||
result->nsteps = nsteps;
|
||||
|
||||
/* Allocate array for the step data. */
|
||||
result->data = (struct gconv_step_data *)
|
||||
calloc (nsteps, sizeof (struct gconv_step_data));
|
||||
|
||||
if (result->data == NULL)
|
||||
res = GCONV_NOMEM;
|
||||
else
|
||||
{
|
||||
/* Call all initialization functions for the transformation
|
||||
step implemenations. */
|
||||
struct gconv_step_data *data = result->data;
|
||||
|
||||
for (cnt = 0; cnt < nsteps; ++cnt)
|
||||
{
|
||||
/* If this is the last step we must not allocate an output
|
||||
buffer. Signal this to the initializer. */
|
||||
data[cnt].is_last = cnt == nsteps - 1;
|
||||
|
||||
if (steps[cnt].init_fct != NULL)
|
||||
{
|
||||
res = (steps[cnt].init_fct) (&steps[cnt], &data[cnt]);
|
||||
if (res != GCONV_OK)
|
||||
break;
|
||||
}
|
||||
else
|
||||
if (!data[cnt].is_last)
|
||||
{
|
||||
data[cnt].outbufsize = GCONV_DEFAULT_BUFSIZE;
|
||||
data[cnt].outbuf =
|
||||
(char *) malloc (data[cnt].outbufsize);
|
||||
if (data[cnt].outbuf == NULL)
|
||||
{
|
||||
res = GCONV_NOMEM;
|
||||
break;
|
||||
}
|
||||
data[cnt].outbufavail = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (res != GCONV_OK)
|
||||
{
|
||||
/* Something went wrong. Free all the resources. */
|
||||
int serrno = errno;
|
||||
|
||||
if (result != NULL)
|
||||
{
|
||||
if (result->data != NULL)
|
||||
{
|
||||
while (cnt-- > 0)
|
||||
if (steps[cnt].end_fct != NULL)
|
||||
(*steps[cnt].end_fct) (&result->data[cnt]);
|
||||
else
|
||||
{
|
||||
free (result->data[cnt].outbuf);
|
||||
if (result->data[cnt].data != NULL)
|
||||
free (result->data[cnt].data);
|
||||
}
|
||||
|
||||
free (result->data);
|
||||
}
|
||||
|
||||
free (result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
__gconv_close_transform (steps, nsteps);
|
||||
|
||||
__set_errno (serrno);
|
||||
}
|
||||
|
||||
*handle = result;
|
||||
return res;
|
||||
}
|
240
iconv/gconv_simple.c
Normal file
240
iconv/gconv_simple.c
Normal file
@ -0,0 +1,240 @@
|
||||
/* Simple transformations functions.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
|
||||
int
|
||||
__gconv_transform_dummy (struct gconv_step *step, struct gconv_step_data *data,
|
||||
const char *inbuf, size_t *inlen, size_t *written,
|
||||
int do_flush)
|
||||
{
|
||||
size_t do_write;
|
||||
|
||||
/* We have no stateful encoding. So we don't have to do anything
|
||||
special. */
|
||||
if (do_flush)
|
||||
do_write = 0;
|
||||
else
|
||||
{
|
||||
do_write = MIN (*inlen, data->outbufsize - data->outbufavail);
|
||||
|
||||
memcpy (data->outbuf, inbuf, do_write);
|
||||
|
||||
*inlen -= do_write;
|
||||
data->outbufavail += do_write;
|
||||
}
|
||||
|
||||
/* ### TODO Actually, this number must be devided according to the
|
||||
size of the input charset. I.e., if the input is in UCS4 the
|
||||
number of copied bytes must be divided by 4. */
|
||||
if (written != NULL)
|
||||
*written = do_write;
|
||||
|
||||
return GCONV_OK;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__gconv_transform_init_rstate (struct gconv_step *step,
|
||||
struct gconv_step_data *data)
|
||||
{
|
||||
/* We have to provide the transformation function an correctly initialized
|
||||
object of type `mbstate_t'. This must be dynamically allocated. */
|
||||
data->data = calloc (1, sizeof (mbstate_t));
|
||||
|
||||
return data->data == NULL ? GCONV_NOMEM : GCONV_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
__gconv_transform_end_rstate (struct gconv_step_data *data)
|
||||
{
|
||||
if (data->data != NULL)
|
||||
free (data->data);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__gconv_transform_ucs4_utf8 (struct gconv_step *step,
|
||||
struct gconv_step_data *data, const char *inbuf,
|
||||
size_t *inlen, size_t *written, int do_flush)
|
||||
{
|
||||
struct gconv_step *next_step = step + 1;
|
||||
struct gconv_step_data *next_data = data + 1;
|
||||
gconv_fct fct = next_step->fct;
|
||||
size_t do_write;
|
||||
int result;
|
||||
|
||||
/* If the function is called with no input this means we have to reset
|
||||
to the initial state. The possibly partly converted input is
|
||||
dropped. */
|
||||
if (do_flush)
|
||||
{
|
||||
/* Clear the state. */
|
||||
memset (data->data, '\0', sizeof (mbstate_t));
|
||||
do_write = 0;
|
||||
|
||||
/* Call the steps down the chain if there are any. */
|
||||
if (data->is_last)
|
||||
result = GCONV_OK;
|
||||
else
|
||||
{
|
||||
struct gconv_step *next_step = step + 1;
|
||||
struct gconv_step_data *next_data = data + 1;
|
||||
|
||||
result = (*fct) (next_step, next_data, NULL, 0, written, 1);
|
||||
|
||||
/* Clear output buffer. */
|
||||
data->outbufavail = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
do_write = 0;
|
||||
|
||||
do
|
||||
{
|
||||
const char *newinbuf = inbuf;
|
||||
size_t actually = __wcsnrtombs (&data->outbuf[data->outbufavail],
|
||||
(const wchar_t **) &newinbuf,
|
||||
*inlen / sizeof (wchar_t),
|
||||
data->outbufsize - data->outbufavail,
|
||||
(mbstate_t *) data->data);
|
||||
|
||||
/* Status so far. */
|
||||
result = GCONV_EMPTY_INPUT;
|
||||
|
||||
/* Remember how much we converted. */
|
||||
do_write += newinbuf - inbuf;
|
||||
*inlen -= (newinbuf - inbuf) * sizeof (wchar_t);
|
||||
|
||||
data->outbufavail += actually;
|
||||
if (data->outbufavail > 0)
|
||||
{
|
||||
/* Call the functions below in the chain. */
|
||||
size_t newavail = data->outbufavail;
|
||||
|
||||
result = (*fct) (next_step, next_data, data->outbuf, &newavail,
|
||||
written, 0);
|
||||
|
||||
/* Correct the output buffer. */
|
||||
if (newavail != data->outbufavail)
|
||||
{
|
||||
memmove (data->outbuf,
|
||||
&data->outbuf[data->outbufavail - newavail],
|
||||
newavail);
|
||||
data->outbufavail = newavail;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (*inlen > 0 && result == GCONV_EMPTY_INPUT);
|
||||
}
|
||||
|
||||
if (written != NULL && data->is_last)
|
||||
*written = do_write / sizeof (wchar_t);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__gconv_transform_utf8_ucs4 (struct gconv_step *step,
|
||||
struct gconv_step_data *data, const char *inbuf,
|
||||
size_t *inlen, size_t *written, int do_flush)
|
||||
{
|
||||
struct gconv_step *next_step = step + 1;
|
||||
struct gconv_step_data *next_data = data + 1;
|
||||
gconv_fct fct = next_step->fct;
|
||||
size_t do_write;
|
||||
int result;
|
||||
|
||||
/* If the function is called with no input this means we have to reset
|
||||
to the initial state. The possibly partly converted input is
|
||||
dropped. */
|
||||
if (do_flush)
|
||||
{
|
||||
/* Clear the state. */
|
||||
memset (data->data, '\0', sizeof (mbstate_t));
|
||||
do_write = 0;
|
||||
|
||||
/* Call the steps down the chain if there are any. */
|
||||
if (data->is_last)
|
||||
result = GCONV_OK;
|
||||
else
|
||||
{
|
||||
struct gconv_step *next_step = step + 1;
|
||||
struct gconv_step_data *next_data = data + 1;
|
||||
|
||||
result = (*fct) (next_step, next_data, NULL, 0, written, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
do_write = 0;
|
||||
|
||||
do
|
||||
{
|
||||
const char *newinbuf = inbuf;
|
||||
size_t actually = __mbsnrtowcs ((wchar_t *) &data->outbuf[data->outbufavail],
|
||||
&newinbuf, *inlen,
|
||||
((data->outbufsize
|
||||
- data->outbufavail)
|
||||
/ sizeof (wchar_t)),
|
||||
(mbstate_t *) data->data);
|
||||
|
||||
/* Status so far. */
|
||||
result = GCONV_EMPTY_INPUT;
|
||||
|
||||
/* Remember how much we converted. */
|
||||
do_write += actually;
|
||||
*inlen -= newinbuf - inbuf;
|
||||
|
||||
data->outbufavail += actually * sizeof (wchar_t);
|
||||
if (data->outbufavail > 0)
|
||||
{
|
||||
/* Call the functions below in the chain. */
|
||||
size_t newavail = data->outbufavail;
|
||||
|
||||
result = (*fct) (next_step, next_data, data->outbuf, &newavail,
|
||||
written, 0);
|
||||
|
||||
/* Correct the output buffer. */
|
||||
if (newavail != data->outbufavail)
|
||||
{
|
||||
memmove (data->outbuf,
|
||||
&data->outbuf[data->outbufavail - newavail],
|
||||
newavail);
|
||||
data->outbufavail = newavail;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (*inlen > 0 && result == GCONV_EMPTY_INPUT);
|
||||
}
|
||||
|
||||
if (written != NULL && data->is_last)
|
||||
*written = do_write;
|
||||
|
||||
return GCONV_OK;
|
||||
}
|
38
iconv/iconv.c
Normal file
38
iconv/iconv.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Convert characters in input buffer using conversion descriptor to
|
||||
output buffer.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <iconv.h>
|
||||
#include <gconv.h>
|
||||
|
||||
|
||||
size_t
|
||||
iconv (iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf,
|
||||
size_t *outbytesleft)
|
||||
{
|
||||
gconv_t gcd = (gconv_t) cd;
|
||||
size_t converted;
|
||||
|
||||
if (__gconv (gcd, inbuf, inbytesleft, outbuf, outbytesleft, &converted)
|
||||
!= GCONV_OK)
|
||||
return (size_t) -1;
|
||||
|
||||
return converted;
|
||||
}
|
50
iconv/iconv.h
Normal file
50
iconv/iconv.h
Normal file
@ -0,0 +1,50 @@
|
||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _ICONV_H
|
||||
#define _ICONV_H 1
|
||||
|
||||
#include <features.h>
|
||||
#define __need_size_t
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Identifier for conversion method from one codeset to another. */
|
||||
typedef void *iconv_t;
|
||||
|
||||
|
||||
/* Allocate descriptor for code conversion from codeset FROMCODE to
|
||||
codeset TOCODE. */
|
||||
extern iconv_t iconv_open __P ((__const char *__tocode,
|
||||
__const char *__fromcode));
|
||||
|
||||
/* Convert at most *INBYTESLEFT bytes from *INBUF according to the
|
||||
code conversion algorithm specified by CD and place up to
|
||||
*OUTBYTESLEFT bytes in buffer at *OUTBUF. */
|
||||
extern size_t iconv __P ((iconv_t cd,
|
||||
__const char **__inbuf, size_t *__inbytesleft,
|
||||
char **__outbuf, size_t *__outbytesleft));
|
||||
|
||||
/* Free resources allocated for descriptor CD for code conversion. */
|
||||
extern int iconv_close __P ((iconv_t __cd));
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* iconv.h */
|
30
iconv/iconv_close.c
Normal file
30
iconv/iconv_close.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Release any resource associated with given conversion descriptor.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <iconv.h>
|
||||
|
||||
#include <gconv.h>
|
||||
|
||||
|
||||
int
|
||||
iconv_close (iconv_t cd)
|
||||
{
|
||||
return __gconv_close ((gconv_t) cd) ? -1 : 0;
|
||||
}
|
45
iconv/iconv_open.c
Normal file
45
iconv/iconv_open.c
Normal file
@ -0,0 +1,45 @@
|
||||
/* Get descriptor for character set conversion.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <iconv.h>
|
||||
|
||||
#include <gconv.h>
|
||||
|
||||
|
||||
iconv_t
|
||||
iconv_open (const char *tocode, const char *fromcode)
|
||||
{
|
||||
gconv_t cd;
|
||||
int res;
|
||||
|
||||
res = __gconv_open (tocode, fromcode, &cd);
|
||||
|
||||
if (res != GCONV_OK)
|
||||
{
|
||||
/* We must set the error number according to the specs. */
|
||||
if (res == GCONV_NOCONV || res == GCONV_NODB)
|
||||
__set_errno (EINVAL);
|
||||
|
||||
return (iconv_t) -1;
|
||||
}
|
||||
|
||||
return (iconv_t) cd;
|
||||
}
|
1
include/gconv.h
Normal file
1
include/gconv.h
Normal file
@ -0,0 +1 @@
|
||||
#include <iconv/gconv.h>
|
7
libc.map
7
libc.map
@ -415,12 +415,15 @@ GLIBC_2.0 {
|
||||
|
||||
_IO_list_all;
|
||||
|
||||
_IO_stdin_; _IO_stdout_; _IO_stderr_;
|
||||
_IO_fopen; fopen; freopen; _IO_fclose; fclose;
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
||||
|
||||
GLIBC_2.1 {
|
||||
global:
|
||||
_IO_fopen; fopen; _IO_stdin_; _IO_stdout_; _IO_stderr_;
|
||||
freopen;
|
||||
_IO_fopen; fopen; _IO_fclose; fclose;
|
||||
_IO_2_1_stdin_; _IO_2_1_stdout_; _IO_2_1_stderr_;
|
||||
} GLIBC_2.0;
|
||||
|
@ -43,7 +43,7 @@ all: # Make this the default target; it will be defined in Rules.
|
||||
include ../Makeconfig
|
||||
|
||||
ifeq ($(versioning),yes)
|
||||
routines += oldiofopen oldfreopen
|
||||
routines += oldiofopen oldiofclose
|
||||
endif
|
||||
|
||||
CPPFLAGS-.o += -DIO_DEBUG
|
||||
@ -62,7 +62,7 @@ ifeq ($(versioning),yes)
|
||||
aux += oldfileops oldstdfiles
|
||||
endif
|
||||
|
||||
shared-only-routines = oldiofopen oldfreopen oldfileops oldstdfiles
|
||||
shared-only-routines = oldiofopen oldiofclose oldfileops oldstdfiles
|
||||
|
||||
distribute := iolibio.h libioP.h strfile.h Banner
|
||||
|
||||
|
@ -26,8 +26,13 @@
|
||||
#include "libioP.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#ifdef PIC
|
||||
extern void *_IO_stdin_used;
|
||||
weak_extern (_IO_stdin_used);
|
||||
#endif
|
||||
|
||||
FILE*
|
||||
__new_freopen (filename, mode, fp)
|
||||
freopen (filename, mode, fp)
|
||||
const char* filename;
|
||||
const char* mode;
|
||||
FILE* fp;
|
||||
@ -38,9 +43,17 @@ __new_freopen (filename, mode, fp)
|
||||
return NULL;
|
||||
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
|
||||
_IO_flockfile (fp);
|
||||
result = _IO_freopen (filename, mode, fp);
|
||||
#ifdef PIC
|
||||
if (&_IO_stdin_used == NULL)
|
||||
/* If the shared C library is used by the application binary which
|
||||
was linked against the older version of libio, we just use the
|
||||
older one even for internal use to avoid trouble since a pointer
|
||||
to the old libio may be passed into shared C library and wind
|
||||
up here. */
|
||||
result = _IO_old_freopen (filename, mode, fp);
|
||||
else
|
||||
#endif
|
||||
result = _IO_freopen (filename, mode, fp);
|
||||
_IO_cleanup_region_end (1);
|
||||
return result;
|
||||
}
|
||||
|
||||
default_symbol_version (__new_freopen, freopen, GLIBC_2.1);
|
||||
|
@ -29,7 +29,7 @@
|
||||
#endif
|
||||
|
||||
int
|
||||
_IO_fclose (fp)
|
||||
_IO_new_fclose (fp)
|
||||
_IO_FILE *fp;
|
||||
{
|
||||
int status;
|
||||
@ -53,6 +53,13 @@ _IO_fclose (fp)
|
||||
return status;
|
||||
}
|
||||
|
||||
#ifdef weak_alias
|
||||
weak_alias (_IO_fclose, fclose)
|
||||
#ifdef DO_VERSIONING
|
||||
strong_alias (_IO_new_fclose, __new_fclose)
|
||||
default_symbol_version (_IO_new_fclose, _IO_fclose, GLIBC_2.1);
|
||||
default_symbol_version (__new_fclose, fclose, GLIBC_2.1);
|
||||
#else
|
||||
# ifdef weak_alias
|
||||
weak_alias (_IO_new_fclose, _IO_fclose)
|
||||
weak_alias (_IO_new_fclose, fclose)
|
||||
# endif
|
||||
#endif
|
||||
|
@ -53,7 +53,7 @@ extern int _IO_obstack_printf __P ((struct obstack *, const char *, ...));
|
||||
#define _IO_freopen(FILENAME, MODE, FP) \
|
||||
(_IO_file_close_it(FP), _IO_file_fopen(FP, FILENAME, MODE, 0))
|
||||
#define _IO_old_freopen(FILENAME, MODE, FP) \
|
||||
(_IO_file_close_it(FP), _IO_old_file_fopen(FP, FILENAME, MODE))
|
||||
(_IO_old_file_close_it (FP), _IO_old_file_fopen(FP, FILENAME, MODE))
|
||||
#define _IO_freopen64(FILENAME, MODE, FP) \
|
||||
(_IO_file_close_it(FP), _IO_file_fopen(FP, FILENAME, MODE, 1))
|
||||
#define _IO_fileno(FP) ((FP)->_fileno)
|
||||
|
@ -225,10 +225,18 @@ typedef struct _IO_FILE _IO_FILE;
|
||||
#endif
|
||||
|
||||
struct _IO_FILE_complete;
|
||||
extern struct _IO_FILE_complete _IO_stdin_, _IO_stdout_, _IO_stderr_;
|
||||
#define _IO_stdin ((_IO_FILE*)(&_IO_stdin_))
|
||||
#define _IO_stdout ((_IO_FILE*)(&_IO_stdout_))
|
||||
#define _IO_stderr ((_IO_FILE*)(&_IO_stderr_))
|
||||
extern struct _IO_FILE_complete _IO_2_1_stdin_;
|
||||
extern struct _IO_FILE_complete _IO_2_1_stdout_;
|
||||
extern struct _IO_FILE_complete _IO_2_1_stderr_;
|
||||
#ifndef _LIBC
|
||||
#define _IO_stdin ((_IO_FILE*)(&_IO_2_1_stdin_))
|
||||
#define _IO_stdout ((_IO_FILE*)(&_IO_2_1_stdout_))
|
||||
#define _IO_stderr ((_IO_FILE*)(&_IO_2_1_stderr_))
|
||||
#else
|
||||
extern _IO_FILE *_IO_stdin;
|
||||
extern _IO_FILE *_IO_stdout;
|
||||
extern _IO_FILE *_IO_stderr;
|
||||
#endif
|
||||
|
||||
|
||||
/* Define the user-visible type, with user-friendly member names. */
|
||||
|
@ -346,6 +346,9 @@ extern void _IO_flush_all_linebuffered __P ((void));
|
||||
#define _IO_do_flush(_f) \
|
||||
_IO_do_write(_f, (_f)->_IO_write_base, \
|
||||
(_f)->_IO_write_ptr-(_f)->_IO_write_base)
|
||||
#define _IO_old_do_flush(_f) \
|
||||
_IO_old_do_write(_f, (_f)->_IO_write_base, \
|
||||
(_f)->_IO_write_ptr-(_f)->_IO_write_base)
|
||||
#define _IO_in_put_mode(_fp) ((_fp)->_flags & _IO_CURRENTLY_PUTTING)
|
||||
#define _IO_mask_flags(fp, f, mask) \
|
||||
((fp)->_flags = ((fp)->_flags & ~(mask)) | ((f) & (mask)))
|
||||
|
@ -130,7 +130,7 @@ _IO_old_file_close_it (fp)
|
||||
if (!_IO_file_is_open (fp))
|
||||
return EOF;
|
||||
|
||||
write_status = _IO_do_flush (fp);
|
||||
write_status = _IO_old_do_flush (fp);
|
||||
|
||||
_IO_unsave_markers(fp);
|
||||
|
||||
@ -156,7 +156,7 @@ _IO_old_file_finish (fp, dummy)
|
||||
{
|
||||
if (_IO_file_is_open (fp))
|
||||
{
|
||||
_IO_do_flush (fp);
|
||||
_IO_old_do_flush (fp);
|
||||
if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
|
||||
_IO_SYSCLOSE (fp);
|
||||
}
|
||||
@ -378,14 +378,14 @@ _IO_old_file_overflow (f, ch)
|
||||
f->_flags |= _IO_CURRENTLY_PUTTING;
|
||||
}
|
||||
if (ch == EOF)
|
||||
return _IO_do_flush (f);
|
||||
return _IO_old_do_flush (f);
|
||||
if (f->_IO_write_ptr == f->_IO_buf_end ) /* Buffer is really full */
|
||||
if (_IO_do_flush (f) == EOF)
|
||||
if (_IO_old_do_flush (f) == EOF)
|
||||
return EOF;
|
||||
*f->_IO_write_ptr++ = ch;
|
||||
if ((f->_flags & _IO_UNBUFFERED)
|
||||
|| ((f->_flags & _IO_LINE_BUF) && ch == '\n'))
|
||||
if (_IO_do_flush (f) == EOF)
|
||||
if (_IO_old_do_flush (f) == EOF)
|
||||
return EOF;
|
||||
return (unsigned char) ch;
|
||||
}
|
||||
@ -401,7 +401,7 @@ _IO_old_file_sync (fp)
|
||||
_IO_flockfile (fp);
|
||||
/* char* ptr = cur_ptr(); */
|
||||
if (fp->_IO_write_ptr > fp->_IO_write_base)
|
||||
if (_IO_do_flush(fp)) return EOF;
|
||||
if (_IO_old_do_flush(fp)) return EOF;
|
||||
delta = fp->_IO_read_ptr - fp->_IO_read_end;
|
||||
if (delta != 0)
|
||||
{
|
||||
@ -679,7 +679,7 @@ _IO_old_file_xsputn (f, data, n)
|
||||
dont_write = block_size >= 128 ? to_do % block_size : 0;
|
||||
|
||||
count = to_do - dont_write;
|
||||
if (_IO_do_write (f, s, count) == EOF)
|
||||
if (_IO_old_do_write (f, s, count) == EOF)
|
||||
return n - to_do;
|
||||
to_do = dont_write;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU IO Library.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
@ -24,23 +24,35 @@
|
||||
General Public License. */
|
||||
|
||||
#include "libioP.h"
|
||||
#include "stdio.h"
|
||||
#ifdef __STDC__
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
FILE*
|
||||
__old_freopen (filename, mode, fp)
|
||||
const char* filename;
|
||||
const char* mode;
|
||||
FILE* fp;
|
||||
int
|
||||
_IO_old_fclose (fp)
|
||||
_IO_FILE *fp;
|
||||
{
|
||||
FILE *result;
|
||||
CHECK_FILE (fp, NULL);
|
||||
if (!(fp->_flags & _IO_IS_FILEBUF))
|
||||
return NULL;
|
||||
int status;
|
||||
|
||||
CHECK_FILE(fp, EOF);
|
||||
|
||||
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
|
||||
_IO_flockfile (fp);
|
||||
result = _IO_old_freopen (filename, mode, fp);
|
||||
if (fp->_IO_file_flags & _IO_IS_FILEBUF)
|
||||
status = _IO_old_file_close_it (fp);
|
||||
else
|
||||
status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
|
||||
_IO_FINISH (fp);
|
||||
_IO_cleanup_region_end (1);
|
||||
return result;
|
||||
if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr)
|
||||
{
|
||||
fp->_IO_file_flags = 0;
|
||||
free(fp);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
symbol_version (__old_freopen, freopen,);
|
||||
strong_alias (_IO_old_fclose, __old_fclose)
|
||||
symbol_version (_IO_old_fclose, _IO_fclose, GLIBC_2.0);
|
||||
symbol_version (__old_fclose, fclose, GLIBC_2.0);
|
@ -49,7 +49,7 @@ _IO_old_fopen (filename, mode)
|
||||
#endif
|
||||
_IO_init (&new_f->fp.file, 0);
|
||||
_IO_JUMPS (&new_f->fp.file) = &_IO_old_file_jumps;
|
||||
_IO_file_init (&new_f->fp.file);
|
||||
_IO_old_file_init (&new_f->fp.file);
|
||||
#if !_IO_UNIFIED_JUMPTABLES
|
||||
new_f->fp.vtable = NULL;
|
||||
#endif
|
||||
@ -61,5 +61,5 @@ _IO_old_fopen (filename, mode)
|
||||
}
|
||||
|
||||
strong_alias (_IO_old_fopen, __old_fopen)
|
||||
symbol_version (_IO_old_fopen, _IO_fopen,);
|
||||
symbol_version (__old_fopen, fopen,);
|
||||
symbol_version (_IO_old_fopen, _IO_fopen, GLIBC_2.0);
|
||||
symbol_version (__old_fopen, fopen, GLIBC_2.0);
|
||||
|
@ -36,22 +36,52 @@
|
||||
#define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
|
||||
static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
|
||||
struct _IO_FILE_plus INAME \
|
||||
= {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps}; \
|
||||
symbol_version (INAME, NAME,)
|
||||
= {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps};
|
||||
#else
|
||||
#define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
|
||||
struct _IO_FILE_plus INAME \
|
||||
= {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps}; \
|
||||
symbol_version (INAME, NAME,)
|
||||
= {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps};
|
||||
#endif
|
||||
|
||||
DEF_STDFILE(_IO_old_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
|
||||
DEF_STDFILE(_IO_old_stdout_, _IO_stdout_, 1, &_IO_stdin_.plus.file,
|
||||
DEF_STDFILE(_IO_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
|
||||
DEF_STDFILE(_IO_stdout_, _IO_stdout_, 1, &_IO_stdin_.file,
|
||||
_IO_NO_READS);
|
||||
DEF_STDFILE(_IO_old_stderr_, _IO_stderr_, 2, &_IO_stdout_.plus.file,
|
||||
DEF_STDFILE(_IO_stderr_, _IO_stderr_, 2, &_IO_stdout_.file,
|
||||
_IO_NO_READS+_IO_UNBUFFERED);
|
||||
|
||||
#if 0
|
||||
_IO_FILE *_IO_old_list_all = &_IO_stderr_.plus.file;
|
||||
symbol_version (_IO_old_list_all, _IO_list_all,);
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
extern void * _IO_stdin_used;
|
||||
weak_extern (_IO_stdin_used);
|
||||
|
||||
#undef stdin
|
||||
#undef stdout
|
||||
#undef stderr
|
||||
|
||||
extern FILE *stdin;
|
||||
extern FILE *stdout;
|
||||
extern FILE *stderr;
|
||||
|
||||
extern FILE *_IO_list_all;
|
||||
|
||||
static void _IO_check_libio __P ((void)) __attribute__ ((constructor));
|
||||
|
||||
/* This function determines which shared C library the application
|
||||
was linked against. We then set up the stdin/stdout/stderr and
|
||||
_IO_list_all accordingly. */
|
||||
|
||||
static void
|
||||
_IO_check_libio ()
|
||||
{
|
||||
if (&_IO_stdin_used == NULL)
|
||||
{
|
||||
/* We are using the old one. */
|
||||
stdin = &_IO_stdin_.file;
|
||||
stdout = &_IO_stdout_.file;
|
||||
stderr = _IO_list_all = &_IO_stderr_.file;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -36,22 +36,17 @@
|
||||
#define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
|
||||
static _IO_lock_t _IO_stdfile_##FD##_lock = _IO_lock_initializer; \
|
||||
struct _IO_FILE_complete INAME \
|
||||
= {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},}; \
|
||||
default_symbol_version (INAME, NAME, GLIBC_2.1)
|
||||
= {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},};
|
||||
#else
|
||||
#define DEF_STDFILE(INAME, NAME, FD, CHAIN, FLAGS) \
|
||||
struct _IO_FILE_complete INAME \
|
||||
= {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},}; \
|
||||
default_symbol_version (INAME, NAME, GLIBC_2.1)
|
||||
= {{FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_file_jumps},};
|
||||
#endif
|
||||
|
||||
DEF_STDFILE(_IO_new_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
|
||||
DEF_STDFILE(_IO_new_stdout_, _IO_stdout_, 1, &_IO_stdin_.plus.file,
|
||||
DEF_STDFILE(_IO_2_1_stdin_, _IO_stdin_, 0, 0, _IO_NO_WRITES);
|
||||
DEF_STDFILE(_IO_2_1_stdout_, _IO_stdout_, 1, &_IO_2_1_stdin_.plus.file,
|
||||
_IO_NO_READS);
|
||||
DEF_STDFILE(_IO_new_stderr_, _IO_stderr_, 2, &_IO_stdout_.plus.file,
|
||||
DEF_STDFILE(_IO_2_1_stderr_, _IO_stderr_, 2, &_IO_2_1_stdout_.plus.file,
|
||||
_IO_NO_READS+_IO_UNBUFFERED);
|
||||
|
||||
_IO_FILE *_IO_list_all = &_IO_stderr_.plus.file;
|
||||
#if 0
|
||||
default_symbol_version (_IO_new_list_all, _IO_list_all, GLIBC_2.1);
|
||||
#endif
|
||||
_IO_FILE *_IO_list_all = &_IO_2_1_stderr_.plus.file;
|
||||
|
@ -29,6 +29,13 @@
|
||||
#undef stdin
|
||||
#undef stdout
|
||||
#undef stderr
|
||||
FILE *stdin = &_IO_stdin_.plus.file;
|
||||
FILE *stdout = &_IO_stdout_.plus.file;
|
||||
FILE *stderr = &_IO_stderr_.plus.file;
|
||||
FILE *stdin = &_IO_2_1_stdin_.plus.file;
|
||||
FILE *stdout = &_IO_2_1_stdout_.plus.file;
|
||||
FILE *stderr = &_IO_2_1_stderr_.plus.file;
|
||||
|
||||
#undef _IO_stdin
|
||||
#undef _IO_stdout
|
||||
#undef _IO_stderr
|
||||
strong_alias (stdin, _IO_stdin);
|
||||
strong_alias (stdout, _IO_stdout);
|
||||
strong_alias (stderr, _IO_stderr);
|
||||
|
@ -80,8 +80,8 @@ CPPFLAGS := -DLOCALE_PATH='$(localepath)' \
|
||||
-DLOCSRCDIR='"$(i18ndir)/locales"' -DHAVE_CONFIG_H \
|
||||
-Iprograms $(CPPFLAGS)
|
||||
|
||||
CFLAGS-charmap.c = -Wno-write-strings
|
||||
CFLAGS-locfile.c = -Wno-write-strings
|
||||
CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts
|
||||
CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts
|
||||
|
||||
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
|
||||
# This ensures they will load libc.so for needed symbols if loaded by
|
||||
|
@ -1,5 +1,5 @@
|
||||
@c We need some definitions here.
|
||||
@ifclear cdor
|
||||
@ifclear cdot
|
||||
@ifhtml
|
||||
@set cdot ·
|
||||
@end ifhtml
|
||||
@ -140,6 +140,7 @@ from real values:
|
||||
@smallexample
|
||||
3.0 - _Complex_I * 4.0
|
||||
@end smallexample
|
||||
@end deftypevr
|
||||
|
||||
@noindent
|
||||
Without an optimizing compiler this is more expensive than the use of
|
||||
@ -150,6 +151,7 @@ problem.
|
||||
@deftypevr Macro {const float imaginary} _Imaginary_I
|
||||
This macro is a representation of the value ``@math{1i}''. I.e., it is
|
||||
the value for which
|
||||
@end deftypevr
|
||||
|
||||
@smallexample
|
||||
_Imaginary_I * _Imaginary_I = -1
|
||||
@ -166,7 +168,6 @@ One can use it to easily construct complex number like in
|
||||
@noindent
|
||||
which results in the complex number with a real part of 3.0 and a
|
||||
imaginary part -4.0.
|
||||
@end deftypevr
|
||||
|
||||
@noindent
|
||||
A more intuitive approach is to use the following macro.
|
||||
|
@ -856,7 +856,8 @@ asin_test (void)
|
||||
#endif
|
||||
|
||||
check ("asin (0) == 0", FUNC(asin) (0), 0);
|
||||
check ("asin (0.5) == pi/6", FUNC(asin) (0.5), M_PI_6);
|
||||
check_eps ("asin (0.5) == pi/6", FUNC(asin) (0.5), M_PI_6,
|
||||
CHOOSE(3.5e-18, 0, 2e-7));
|
||||
check ("asin (1.0) == pi/2", FUNC(asin) (1.0), M_PI_2);
|
||||
}
|
||||
|
||||
@ -1508,7 +1509,7 @@ log1p_test (void)
|
||||
check_isinfp ("log1p (+inf) == +inf", FUNC(log1p) (plus_infty));
|
||||
|
||||
check_eps ("log1p (e-1) == 1", FUNC(log1p) (M_E - 1.0), 1,
|
||||
CHOOSE (1e-18L, 0, 0));
|
||||
CHOOSE (1e-18L, 0, 6e-8));
|
||||
|
||||
}
|
||||
|
||||
@ -1779,7 +1780,7 @@ tan_test (void)
|
||||
FUNC(tan) (minus_infty), INVALID_EXCEPTION);
|
||||
|
||||
check_eps ("tan (pi/4) == 1", FUNC(tan) (M_PI_4), 1,
|
||||
CHOOSE (2e-18L, 1e-15L, 0));
|
||||
CHOOSE (2e-18L, 1e-15L, 2e-7));
|
||||
}
|
||||
|
||||
|
||||
@ -4880,26 +4881,31 @@ static void
|
||||
inverse_functions (void)
|
||||
{
|
||||
inverse_func_pair_test ("asin(sin(x)) == x",
|
||||
FUNC(sin), FUNC(asin), 1.0, CHOOSE (2e-18L, 0, 3e-7L));
|
||||
FUNC(sin), FUNC(asin), 1.0,
|
||||
CHOOSE (2e-18L, 0, 3e-7L));
|
||||
inverse_func_pair_test ("sin(asin(x)) == x",
|
||||
FUNC(asin), FUNC(sin), 1.0, 0.0);
|
||||
|
||||
inverse_func_pair_test ("acos(cos(x)) == x",
|
||||
FUNC(cos), FUNC(acos), 1.0, CHOOSE (4e-18L, 1e-15L, 0));
|
||||
FUNC(cos), FUNC(acos), 1.0,
|
||||
CHOOSE (4e-18L, 1e-15L, 0));
|
||||
inverse_func_pair_test ("cos(acos(x)) == x",
|
||||
FUNC(acos), FUNC(cos), 1.0, 0.0);
|
||||
inverse_func_pair_test ("atan(tan(x)) == x",
|
||||
FUNC(tan), FUNC(atan), 1.0, CHOOSE (2e-18L, 0, 0));
|
||||
inverse_func_pair_test ("tan(atan(x)) == x",
|
||||
FUNC(atan), FUNC(tan), 1.0, CHOOSE (2e-18L, 1e-15L, 0));
|
||||
FUNC(atan), FUNC(tan), 1.0,
|
||||
CHOOSE (2e-18L, 1e-15L, 2e-7));
|
||||
|
||||
inverse_func_pair_test ("asinh(sinh(x)) == x",
|
||||
FUNC(sinh), FUNC(asinh), 1.0, CHOOSE (1e-18L, 0, 1e-7));
|
||||
inverse_func_pair_test ("sinh(asinh(x)) == x",
|
||||
FUNC(asinh), FUNC(sinh), 1.0, CHOOSE (2e-18L, 0, 0));
|
||||
FUNC(asinh), FUNC(sinh), 1.0,
|
||||
CHOOSE (2e-18L, 2e-16L, 2e-7));
|
||||
|
||||
inverse_func_pair_test ("acosh(cosh(x)) == x",
|
||||
FUNC(cosh), FUNC(acosh), 1.0, CHOOSE (1e-18L, 1e-15L, 0));
|
||||
FUNC(cosh), FUNC(acosh), 1.0,
|
||||
CHOOSE (1e-18L, 1e-15L, 6e-8));
|
||||
inverse_func_pair_test ("cosh(acosh(x)) == x",
|
||||
FUNC(acosh), FUNC(cosh), 1.0, 0.0);
|
||||
|
||||
|
@ -36,7 +36,7 @@ libcrypt-map := libcrypt.map
|
||||
|
||||
onlymd5-routines := onlymd5-entry md5-crypt md5
|
||||
distribute += onlymd5-entry.c
|
||||
extra-objs := $(patsubst %,onlymd5-entry%,$(object-suffixes))
|
||||
extra-objs = $(patsubst %,onlymd5-entry%,$(object-suffixes))
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
|
@ -187,6 +187,10 @@ hsearch_r (item, action, retval, htab)
|
||||
else
|
||||
idx -= hval2;
|
||||
|
||||
/* If we visited all entries leave the loop unsuccessfully. */
|
||||
if (idx == hval)
|
||||
break;
|
||||
|
||||
/* If entry is found use it. */
|
||||
if (htab->table[idx].used == hval
|
||||
&& strcmp (item.key, htab->table[idx].entry.key) == 0)
|
||||
|
@ -42,7 +42,7 @@ main (void)
|
||||
fputs (", set", stdout);
|
||||
FD_SET (i, &set);
|
||||
fputs (", check:", stdout);
|
||||
if (FD_ISSET (i, &set) == 1)
|
||||
if (FD_ISSET (i, &set))
|
||||
fputs ("ok", stdout);
|
||||
else
|
||||
{
|
||||
|
@ -29,10 +29,6 @@
|
||||
#include <rpcsvc/nis.h>
|
||||
#include <nsswitch.h>
|
||||
|
||||
/* Comment out the following line for the production version. */
|
||||
/* #define NDEBUG 1 */
|
||||
#include <assert.h>
|
||||
|
||||
#include "nss-nisplus.h"
|
||||
#include "nisplus-parser.h"
|
||||
|
||||
@ -101,10 +97,6 @@ _nss_first_init (void)
|
||||
key, sizeof (key) - 1),
|
||||
local_dir, len_local_dir + 1)
|
||||
- grptable) - 1;
|
||||
|
||||
/* *Maybe* (I'm no NIS expert) we have to duplicate the `local_dir'
|
||||
value since it might change during our work. So add a test here. */
|
||||
assert (grptablelen == sizeof (key) + len_local_dir);
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
@ -705,7 +697,7 @@ getgrgid_plusgroup (gid_t gid, struct group *result, char *buffer,
|
||||
if (use_nisplus) /* Do the NIS+ query here */
|
||||
{
|
||||
nis_result *res;
|
||||
char buf[1024 + grptablelen];
|
||||
char buf[24 + grptablelen];
|
||||
|
||||
sprintf(buf, "[gid=%d],%s", gid, grptable);
|
||||
res = nis_list(buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
@ -727,7 +719,7 @@ getgrgid_plusgroup (gid_t gid, struct group *result, char *buffer,
|
||||
}
|
||||
else /* Use NIS */
|
||||
{
|
||||
char buf[1024];
|
||||
char buf[24];
|
||||
char *domain, *outval, *p;
|
||||
int outvallen;
|
||||
|
||||
|
@ -30,10 +30,6 @@
|
||||
#include <rpcsvc/nis.h>
|
||||
#include <nsswitch.h>
|
||||
|
||||
/* Comment out the following line for the production version. */
|
||||
/* #define NDEBUG 1 */
|
||||
#include <assert.h>
|
||||
|
||||
#include "netgroup.h"
|
||||
#include "nss-nisplus.h"
|
||||
#include "nisplus-parser.h"
|
||||
@ -227,10 +223,6 @@ internal_setpwent (ent_t *ent)
|
||||
key, sizeof (key) - 1),
|
||||
local_dir, len_local_dir + 1)
|
||||
- pwdtable) - 1;
|
||||
|
||||
/* *Maybe* (I'm no NIS expert) we have to duplicate the `local_dir'
|
||||
value since it might change during our work. So add a test here. */
|
||||
assert (pwdtablelen == sizeof (key) + len_local_dir);
|
||||
}
|
||||
|
||||
ent->blacklist.current = 0;
|
||||
|
@ -30,10 +30,6 @@
|
||||
#include <rpcsvc/nis.h>
|
||||
#include <nsswitch.h>
|
||||
|
||||
/* Comment out the following line for the production version. */
|
||||
/* #define NDEBUG 1 */
|
||||
#include <assert.h>
|
||||
|
||||
#include "netgroup.h"
|
||||
#include "nss-nisplus.h"
|
||||
#include "nisplus-parser.h"
|
||||
@ -179,10 +175,6 @@ internal_setspent (ent_t *ent)
|
||||
key, sizeof (key) - 1),
|
||||
local_dir, len_local_dir + 1)
|
||||
- pwdtable) - 1;
|
||||
|
||||
/* *Maybe* (I'm no NIS expert) we have to duplicate the `local_dir'
|
||||
value since it might change during our work. So add a test here. */
|
||||
assert (pwdtablelen == sizeof (key) + len_local_dir);
|
||||
}
|
||||
|
||||
ent->blacklist.current = 0;
|
||||
|
@ -31,10 +31,10 @@ extern "C" {
|
||||
/* POSIX says that <sys/types.h> must be included (by the caller) before
|
||||
<regex.h>. */
|
||||
|
||||
#if !defined (_POSIX_C_SOURCE) && !defined (_POSIX_SOURCE) && defined (VMS)
|
||||
#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
|
||||
/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
|
||||
should be there. */
|
||||
#include <stddef.h>
|
||||
# include <stddef.h>
|
||||
#endif
|
||||
|
||||
/* The following two types have to be signed and unsigned integer type
|
||||
@ -239,7 +239,7 @@ extern reg_syntax_t re_syntax_options;
|
||||
(erroneously) define this in other header files, but we want our
|
||||
value, so remove any previous define. */
|
||||
#ifdef RE_DUP_MAX
|
||||
#undef RE_DUP_MAX
|
||||
# undef RE_DUP_MAX
|
||||
#endif
|
||||
/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */
|
||||
#define RE_DUP_MAX (0x7fff)
|
||||
@ -313,7 +313,7 @@ typedef enum
|
||||
private to the regex routines. */
|
||||
|
||||
#ifndef RE_TRANSLATE_TYPE
|
||||
#define RE_TRANSLATE_TYPE char *
|
||||
# define RE_TRANSLATE_TYPE char *
|
||||
#endif
|
||||
|
||||
struct re_pattern_buffer
|
||||
@ -404,7 +404,7 @@ struct re_registers
|
||||
`re_match_2' returns information about at least this many registers
|
||||
the first time a `regs' structure is passed. */
|
||||
#ifndef RE_NREGS
|
||||
#define RE_NREGS 30
|
||||
# define RE_NREGS 30
|
||||
#endif
|
||||
|
||||
|
||||
@ -427,11 +427,11 @@ typedef struct
|
||||
|
||||
#if __STDC__
|
||||
|
||||
#define _RE_ARGS(args) args
|
||||
# define _RE_ARGS(args) args
|
||||
|
||||
#else /* not __STDC__ */
|
||||
|
||||
#define _RE_ARGS(args) ()
|
||||
# define _RE_ARGS(args) ()
|
||||
|
||||
#endif /* not __STDC__ */
|
||||
|
||||
@ -502,11 +502,11 @@ extern void re_set_registers
|
||||
unsigned num_regs, regoff_t *starts, regoff_t *ends));
|
||||
|
||||
#ifdef _REGEX_RE_COMP
|
||||
#ifndef _CRAY
|
||||
# ifndef _CRAY
|
||||
/* 4.2 bsd compatibility. */
|
||||
extern char *re_comp _RE_ARGS ((const char *));
|
||||
extern int re_exec _RE_ARGS ((const char *));
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* POSIX compatibility. */
|
||||
|
@ -42,7 +42,9 @@
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define NDEBUG /* Undefine this for debugging assertions. */
|
||||
#ifndef NDEBUG
|
||||
# define NDEBUG /* Undefine this for debugging assertions. */
|
||||
#endif
|
||||
#include <assert.h>
|
||||
|
||||
/* This defines make it possible to use the same code for GNU C library and
|
||||
|
@ -21,7 +21,7 @@
|
||||
#
|
||||
subdir := stdlib
|
||||
|
||||
headers := stdlib.h alloca.h monetary.h fmtmsg.h
|
||||
headers := stdlib.h alloca.h monetary.h fmtmsg.h ucontext.h sys/ucontext.h
|
||||
|
||||
routines := \
|
||||
atof atoi atol atoll \
|
||||
|
@ -42,12 +42,18 @@ __erand48_r (xsubi, buffer, result)
|
||||
temp.ieee.exponent = IEEE754_DOUBLE_BIAS;
|
||||
temp.ieee.mantissa0 = (xsubi[2] << 4) | (xsubi[1] >> 12);
|
||||
temp.ieee.mantissa1 = ((xsubi[1] & 0xfff) << 20) | (xsubi[0] << 4);
|
||||
/* Please note the lower 4 bits of mantissa1 are always 0. */
|
||||
*result = temp.d - 1.0;
|
||||
#elif USHRT_MAX == 2147483647
|
||||
temp.ieee.negative = 0;
|
||||
temp.ieee.exponent = IEEE754_DOUBLE_BIAS;
|
||||
temp.ieee.mantissa0 = (xsubi[1] << 4) | (xsubi[0] >> 28);
|
||||
temp.ieee.mantissa1 = ((xsubi[0] & 0xfffffff) << 4);
|
||||
#else
|
||||
# error Unsupported size of short int
|
||||
#endif
|
||||
|
||||
/* Please note the lower 4 bits of mantissa1 are always 0. */
|
||||
*result = temp.d - 1.0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
weak_alias (__erand48_r, erand48_r)
|
||||
|
@ -583,7 +583,7 @@ __strspn_c1 (__const char *__s, char __accept)
|
||||
# define strstr(haystack, needle) \
|
||||
(__extension__ (__builtin_constant_p (needle) && __string2_1bptr_p (needle) \
|
||||
? (((__const unsigned char *) (needle))[0] == '\0' \
|
||||
? haystack \
|
||||
? (char *) (haystack) \
|
||||
: (((__const unsigned char *) (needle))[1] == '\0' \
|
||||
? strchr (haystack, \
|
||||
((__const unsigned char *) (needle))[0]) \
|
||||
@ -605,6 +605,47 @@ strnlen (__const char *__string, size_t __maxlen)
|
||||
#endif
|
||||
|
||||
|
||||
#if defined __USE_POSIX || defined __USE_MISC
|
||||
# ifndef _HAVE_STRING_ARCH_strtok_r
|
||||
# define strtok_r(s, sep, nextp) \
|
||||
(__extension__ (__builtin_constant_p (sep) && __string2_1bptr_p (sep) \
|
||||
? (((__const unsigned char *) (sep))[0] != '\0' \
|
||||
&& ((__const unsigned char *) (sep))[1] == '\0' \
|
||||
? __strtok_r_1c (s, ((__const unsigned char *) (sep))[0],\
|
||||
nextp) \
|
||||
: strtok_r (s, sep, nextp)) \
|
||||
: strtok_r (s, sep, nextp)))
|
||||
|
||||
__STRING_INLINE char *__strtok_r_1c (char *__s, char __sep, char **__nextp);
|
||||
__STRING_INLINE char *
|
||||
__strtok_r_1c (char *__s, char __sep, char **__nextp)
|
||||
{
|
||||
char *__result;
|
||||
if (__s == NULL)
|
||||
__s = *__nextp;
|
||||
while (*__s == __sep)
|
||||
++__s;
|
||||
if (*__s == '\0')
|
||||
__result = NULL;
|
||||
else
|
||||
{
|
||||
__result = __s;
|
||||
while (*__s != '\0' && *__s != __sep)
|
||||
++__s;
|
||||
if (*__s == '\0')
|
||||
*__nextp = __s;
|
||||
else
|
||||
{
|
||||
*__s = '\0';
|
||||
*__nextp = __s + 1;
|
||||
}
|
||||
}
|
||||
return __result;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __USE_BSD
|
||||
# ifndef _HAVE_STRING_ARCH_strsep
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
setjmp_aux.c
|
||||
divrem.h
|
||||
divl.S divq.S reml.S remq.S
|
||||
_mcount.S
|
||||
|
@ -43,13 +43,13 @@
|
||||
|
||||
#endif
|
||||
|
||||
/* ARM 6 needs slightly different handling */
|
||||
#ifdef __arm6__
|
||||
/* APCS-32 doesn't preserve the condition codes across function call. */
|
||||
#ifdef __APCS_32__
|
||||
#define LOADREGS(cond, base, reglist...)\
|
||||
ldm##cond base,reglist
|
||||
#define RETINSTR(instr, regs...)\
|
||||
instr regs
|
||||
#else /* arm 3 */
|
||||
#else /* APCS-26 */
|
||||
#define LOADREGS(cond, base, reglist...)\
|
||||
ldm##cond base,reglist^
|
||||
#define RETINSTR(instr, regs...)\
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <bits/types.h>
|
||||
#define __need_size_t
|
||||
#define __need_wint_t
|
||||
#define __need_NULL
|
||||
#include <stddef.h>
|
||||
#ifndef _WINT_T
|
||||
/* Integral type unchanged by default argument promotions that can
|
||||
|
@ -10,5 +10,5 @@ __ieee754_acoshl (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_acoshl)
|
||||
stub_warning (acoshl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_acosl (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_acosl)
|
||||
stub_warning (acosl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_asinl (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_asinl)
|
||||
stub_warning (asinl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_atan2l (long double x, long double y)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_atan2l)
|
||||
stub_warning (atan2l)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_expl (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_expl)
|
||||
stub_warning (expl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_fmodl (long double x, long double y)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_fmodl)
|
||||
stub_warning (fmodl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,7 +10,7 @@ __ieee754_j0l (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_j0l)
|
||||
stub_warning (j0l)
|
||||
|
||||
long double
|
||||
__ieee754_y0l (long double x)
|
||||
@ -20,5 +20,5 @@ __ieee754_y0l (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_y0l)
|
||||
stub_warning (y0l)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,7 +10,7 @@ __ieee754_j1l (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_j1l)
|
||||
stub_warning (j1l)
|
||||
|
||||
long double
|
||||
__ieee754_y1l (long double x)
|
||||
@ -20,5 +20,5 @@ __ieee754_y1l (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_y1l)
|
||||
stub_warning (y1l)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,7 +10,7 @@ __ieee754_jnl (int n, long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_jnl)
|
||||
stub_warning (jnl)
|
||||
|
||||
long double
|
||||
__ieee754_ynl (int n, long double x)
|
||||
@ -20,5 +20,5 @@ __ieee754_ynl (int n, long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_ynl)
|
||||
stub_warning (ynl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,6 @@ __ieee754_lgammal_r (long double x, int *signgamp)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_lgammal_r)
|
||||
stub_warning (lgammal)
|
||||
stub_warning (lgammal_r)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_log10l (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_log10l)
|
||||
stub_warning (log10l)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_logl (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_logl)
|
||||
stub_warning (logl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_powl (long double x, long double y)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_powl)
|
||||
stub_warning (powl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -10,5 +10,5 @@ __ieee754_sqrtl (long double x)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_sqrtl)
|
||||
stub_warning (sqrtl)
|
||||
#include <stub-tag.h>
|
||||
|
@ -3,13 +3,12 @@
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__exp2l (long double x)
|
||||
__ieee754_exp2l (long double x)
|
||||
{
|
||||
fputs ("__exp2l not implemented\n", stderr);
|
||||
fputs ("__ieee754_exp2l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
weak_alias (__exp2l, exp2l)
|
||||
|
||||
stub_warning (exp2l)
|
||||
#include <stub-tag.h>
|
||||
|
41
sysdeps/libm-i387/i686/s_fdim.S
Normal file
41
sysdeps/libm-i387/i686/s_fdim.S
Normal file
@ -0,0 +1,41 @@
|
||||
/* Compute positive difference.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fdim)
|
||||
fldl 4(%esp) // x
|
||||
fldl 12(%esp) // x : y
|
||||
|
||||
fucomi %st(1), %st
|
||||
jp 1f
|
||||
|
||||
fsubp %st(1), %st
|
||||
fldz
|
||||
fcmovnb %st(1), %st
|
||||
jmp 2f
|
||||
|
||||
1: fucomi %st(0), %st
|
||||
fcmovu %st, %st(1)
|
||||
2: fstp %st(1)
|
||||
ret
|
||||
END(__fdim)
|
||||
weak_alias (__fdim, fdim)
|
41
sysdeps/libm-i387/i686/s_fdimf.S
Normal file
41
sysdeps/libm-i387/i686/s_fdimf.S
Normal file
@ -0,0 +1,41 @@
|
||||
/* Compute positive difference.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fdimf)
|
||||
flds 4(%esp) // x
|
||||
flds 8(%esp) // x : y
|
||||
|
||||
fucomi %st(1), %st
|
||||
jp 1f
|
||||
|
||||
fsubp %st(1), %st
|
||||
fldz
|
||||
fcmovnb %st(1), %st
|
||||
jmp 2f
|
||||
|
||||
1: fucomi %st(0), %st
|
||||
fcmovu %st, %st(1)
|
||||
2: fstp %st(1)
|
||||
ret
|
||||
END(__fdimf)
|
||||
weak_alias (__fdimf, fdimf)
|
41
sysdeps/libm-i387/i686/s_fdiml.S
Normal file
41
sysdeps/libm-i387/i686/s_fdiml.S
Normal file
@ -0,0 +1,41 @@
|
||||
/* Compute positive difference.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fdiml)
|
||||
fldt 4(%esp) // x
|
||||
fldt 16(%esp) // x : y
|
||||
|
||||
fucomi %st(1), %st
|
||||
jp 1f
|
||||
|
||||
fsubp %st(1), %st
|
||||
fldz
|
||||
fcmovnb %st(1), %st
|
||||
jmp 2f
|
||||
|
||||
1: fucomi %st(0), %st
|
||||
fcmovu %st, %st(1)
|
||||
2: fstp %st(1)
|
||||
ret
|
||||
END(__fdiml)
|
||||
weak_alias (__fdiml, fdiml)
|
40
sysdeps/libm-i387/i686/s_fmax.S
Normal file
40
sysdeps/libm-i387/i686/s_fmax.S
Normal file
@ -0,0 +1,40 @@
|
||||
/* Compute maximum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmax)
|
||||
fldl 4(%esp) // x
|
||||
fldl 12(%esp) // x : y
|
||||
|
||||
fucomi %st(0), %st
|
||||
fcmovu %st(1), %st // now %st contains y if not NaN, x otherwise
|
||||
|
||||
fxch
|
||||
|
||||
fucomi %st(1), %st
|
||||
fcmovb %st(1), %st
|
||||
|
||||
fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmax)
|
||||
weak_alias (__fmax, fmax)
|
40
sysdeps/libm-i387/i686/s_fmaxf.S
Normal file
40
sysdeps/libm-i387/i686/s_fmaxf.S
Normal file
@ -0,0 +1,40 @@
|
||||
/* Compute maximum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmaxf)
|
||||
flds 4(%esp) // x
|
||||
flds 8(%esp) // x : y
|
||||
|
||||
fucomi %st(0), %st
|
||||
fcmovu %st(1), %st // now %st contains y if not NaN, x otherwise
|
||||
|
||||
fxch
|
||||
|
||||
fucomi %st(1), %st
|
||||
fcmovb %st(1), %st
|
||||
|
||||
fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmaxf)
|
||||
weak_alias (__fmaxf, fmaxf)
|
40
sysdeps/libm-i387/i686/s_fmaxl.S
Normal file
40
sysdeps/libm-i387/i686/s_fmaxl.S
Normal file
@ -0,0 +1,40 @@
|
||||
/* Compute maximum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmaxl)
|
||||
fldt 4(%esp) // x
|
||||
fldt 16(%esp) // x : y
|
||||
|
||||
fucomi %st(0), %st
|
||||
fcmovu %st(1), %st // now %st contains y if not NaN, x otherwise
|
||||
|
||||
fxch
|
||||
|
||||
fucomi %st(1), %st
|
||||
fcmovb %st(1), %st
|
||||
|
||||
fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmaxl)
|
||||
weak_alias (__fmaxl, fmaxl)
|
38
sysdeps/libm-i387/i686/s_fmin.S
Normal file
38
sysdeps/libm-i387/i686/s_fmin.S
Normal file
@ -0,0 +1,38 @@
|
||||
/* Compute minimum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmin)
|
||||
fldl 4(%esp) // x
|
||||
fldl 12(%esp) // x : y
|
||||
|
||||
fucomi %st(0), %st
|
||||
fcmovu %st(1), %st // now %st contains y if not NaN, x otherwise
|
||||
|
||||
fucomi %st(1), %st
|
||||
fcmovb %st(1), %st
|
||||
|
||||
fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmin)
|
||||
weak_alias (__fmin, fmin)
|
38
sysdeps/libm-i387/i686/s_fminf.S
Normal file
38
sysdeps/libm-i387/i686/s_fminf.S
Normal file
@ -0,0 +1,38 @@
|
||||
/* Compute minimum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fminf)
|
||||
flds 4(%esp) // x
|
||||
flds 8(%esp) // x : y
|
||||
|
||||
fucomi %st(0), %st
|
||||
fcmovu %st(1), %st // now %st contains y if not NaN, x otherwise
|
||||
|
||||
fucomi %st(1), %st
|
||||
fcmovb %st(1), %st
|
||||
|
||||
fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fminf)
|
||||
weak_alias (__fminf, fminf)
|
38
sysdeps/libm-i387/i686/s_fminl.S
Normal file
38
sysdeps/libm-i387/i686/s_fminl.S
Normal file
@ -0,0 +1,38 @@
|
||||
/* Compute minimum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fminl)
|
||||
fldt 4(%esp) // x
|
||||
fldt 16(%esp) // x : y
|
||||
|
||||
fucomi %st(0), %st
|
||||
fcmovu %st(1), %st // now %st contains y if not NaN, x otherwise
|
||||
|
||||
fucomi %st(1), %st
|
||||
fcmovb %st(1), %st
|
||||
|
||||
fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fminl)
|
||||
weak_alias (__fminl, fminl)
|
51
sysdeps/libm-i387/s_fdim.S
Normal file
51
sysdeps/libm-i387/s_fdim.S
Normal file
@ -0,0 +1,51 @@
|
||||
/* Compute positive difference.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fdim)
|
||||
fldl 4(%esp) // x
|
||||
fldl 12(%esp) // x : y
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jp 1f
|
||||
|
||||
fsubp %st(1), %st
|
||||
jc 2f
|
||||
|
||||
fstp %st(0)
|
||||
fldz
|
||||
jmp 2f
|
||||
|
||||
1: fxam
|
||||
fnstsw
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 3f
|
||||
|
||||
fxch
|
||||
3: fstp %st(1)
|
||||
|
||||
2: ret
|
||||
END(__fdim)
|
||||
weak_alias (__fdim, fdim)
|
51
sysdeps/libm-i387/s_fdimf.S
Normal file
51
sysdeps/libm-i387/s_fdimf.S
Normal file
@ -0,0 +1,51 @@
|
||||
/* Compute positive difference.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fdimf)
|
||||
flds 4(%esp) // x
|
||||
flds 8(%esp) // x : y
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jp 1f
|
||||
|
||||
fsubp %st(1), %st
|
||||
jc 2f
|
||||
|
||||
fstp %st(0)
|
||||
fldz
|
||||
jmp 2f
|
||||
|
||||
1: fxam
|
||||
fnstsw
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 3f
|
||||
|
||||
fxch
|
||||
3: fstp %st(1)
|
||||
|
||||
2: ret
|
||||
END(__fdimf)
|
||||
weak_alias (__fdimf, fdimf)
|
51
sysdeps/libm-i387/s_fdiml.S
Normal file
51
sysdeps/libm-i387/s_fdiml.S
Normal file
@ -0,0 +1,51 @@
|
||||
/* Compute positive difference.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fdiml)
|
||||
fldt 4(%esp) // x
|
||||
fldt 16(%esp) // x : y
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jp 1f
|
||||
|
||||
fsubp %st(1), %st
|
||||
jc 2f
|
||||
|
||||
fstp %st(0)
|
||||
fldz
|
||||
jmp 2f
|
||||
|
||||
1: fxam
|
||||
fnstsw
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 3f
|
||||
|
||||
fxch
|
||||
3: fstp %st(1)
|
||||
|
||||
2: ret
|
||||
END(__fdiml)
|
||||
weak_alias (__fdiml, fdiml)
|
44
sysdeps/libm-i387/s_fmax.S
Normal file
44
sysdeps/libm-i387/s_fmax.S
Normal file
@ -0,0 +1,44 @@
|
||||
/* Compute maximum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmax)
|
||||
fldl 12(%esp) // y
|
||||
fxam
|
||||
fnstsw
|
||||
fldl 4(%esp) // y : x
|
||||
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 1f // y == NaN
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jnc 1f
|
||||
|
||||
fxch %st(1)
|
||||
1: fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmax)
|
||||
weak_alias (__fmax, fmax)
|
44
sysdeps/libm-i387/s_fmaxf.S
Normal file
44
sysdeps/libm-i387/s_fmaxf.S
Normal file
@ -0,0 +1,44 @@
|
||||
/* Compute maximum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmaxf)
|
||||
flds 8(%esp) // y
|
||||
fxam
|
||||
fnstsw
|
||||
flds 4(%esp) // y : x
|
||||
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 1f // y == NaN
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jnc 1f
|
||||
|
||||
fxch %st(1)
|
||||
1: fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmaxf)
|
||||
weak_alias (__fmaxf, fmaxf)
|
44
sysdeps/libm-i387/s_fmaxl.S
Normal file
44
sysdeps/libm-i387/s_fmaxl.S
Normal file
@ -0,0 +1,44 @@
|
||||
/* Compute maximum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmaxl)
|
||||
fldt 16(%esp) // y
|
||||
fxam
|
||||
fnstsw
|
||||
fldt 4(%esp) // y : x
|
||||
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 1f // y == NaN
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jnc 1f
|
||||
|
||||
fxch %st(1)
|
||||
1: fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmaxl)
|
||||
weak_alias (__fmaxl, fmaxl)
|
44
sysdeps/libm-i387/s_fmin.S
Normal file
44
sysdeps/libm-i387/s_fmin.S
Normal file
@ -0,0 +1,44 @@
|
||||
/* Compute minimum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fmin)
|
||||
fldl 4(%esp) // x
|
||||
fldl 12(%esp) // x : y
|
||||
|
||||
fxam
|
||||
fnstsw
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 1f // y == NaN
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jc 2f
|
||||
|
||||
1: fxch %st(1)
|
||||
2: fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fmin)
|
||||
weak_alias (__fmin, fmin)
|
44
sysdeps/libm-i387/s_fminf.S
Normal file
44
sysdeps/libm-i387/s_fminf.S
Normal file
@ -0,0 +1,44 @@
|
||||
/* Compute minimum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fminf)
|
||||
flds 4(%esp) // x
|
||||
flds 8(%esp) // x : y
|
||||
|
||||
fxam
|
||||
fnstsw
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 1f // y == NaN
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jc 2f
|
||||
|
||||
1: fxch %st(1)
|
||||
2: fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fminf)
|
||||
weak_alias (__fminf, fminf)
|
44
sysdeps/libm-i387/s_fminl.S
Normal file
44
sysdeps/libm-i387/s_fminl.S
Normal file
@ -0,0 +1,44 @@
|
||||
/* Compute minimum of two numbers, regarding NaN as missing argument.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
ENTRY(__fminl)
|
||||
fldt 4(%esp) // x
|
||||
fldt 16(%esp) // x : y
|
||||
|
||||
fxam
|
||||
fnstsw
|
||||
andb $0x45, %ah
|
||||
cmpb $0x01, %ah
|
||||
je 1f // y == NaN
|
||||
|
||||
fucom %st(1)
|
||||
fnstsw
|
||||
sahf
|
||||
jc 2f
|
||||
|
||||
1: fxch %st(1)
|
||||
2: fstp %st(1)
|
||||
|
||||
ret
|
||||
END(__fminl)
|
||||
weak_alias (__fminl, fminl)
|
@ -37,7 +37,7 @@ static char rcsid[] = "$NetBSD: s_ilogb.c,v 1.9 1995/05/10 20:47:28 jtc Exp $";
|
||||
if(hx<0x00100000) {
|
||||
GET_LOW_WORD(lx,x);
|
||||
if((hx|lx)==0)
|
||||
return 0x80000001; /* ilogb(0) = 0x80000001 */
|
||||
return FP_ILOGB0; /* ilogb(0) = FP_ILOGB0 */
|
||||
else /* subnormal x */
|
||||
if(hx==0) {
|
||||
for (ix = -1043; lx>0; lx<<=1) ix -=1;
|
||||
@ -47,7 +47,7 @@ static char rcsid[] = "$NetBSD: s_ilogb.c,v 1.9 1995/05/10 20:47:28 jtc Exp $";
|
||||
return ix;
|
||||
}
|
||||
else if (hx<0x7ff00000) return (hx>>20)-1023;
|
||||
else return 0x7fffffff;
|
||||
else return FP_ILOGBNAN;
|
||||
}
|
||||
weak_alias (__ilogb, ilogb)
|
||||
#ifdef NO_LONG_DOUBLE
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
@ -32,13 +32,13 @@ static char rcsid[] = "$NetBSD: s_ilogbf.c,v 1.4 1995/05/10 20:47:31 jtc Exp $";
|
||||
GET_FLOAT_WORD(hx,x);
|
||||
hx &= 0x7fffffff;
|
||||
if(hx<0x00800000) {
|
||||
if(hx==0)
|
||||
return 0x80000001; /* ilogb(0) = 0x80000001 */
|
||||
if(hx==0)
|
||||
return FP_ILOGB0; /* ilogb(0) = FP_ILOGB0 */
|
||||
else /* subnormal x */
|
||||
for (ix = -126,hx<<=8; hx>0; hx<<=1) ix -=1;
|
||||
return ix;
|
||||
}
|
||||
else if (hx<0x7f800000) return (hx>>23)-127;
|
||||
else return 0x7fffffff;
|
||||
else return FP_ILOGBNAN;
|
||||
}
|
||||
weak_alias (__ilogbf, ilogbf)
|
||||
|
@ -41,7 +41,7 @@ static char rcsid[] = "$NetBSD: $";
|
||||
if(es==0) {
|
||||
GET_LDOUBLE_WORDS(es,hx,lx,x);
|
||||
if((hx|lx)==0)
|
||||
return 0x80000001; /* ilogbl(0) = 0x80000001 */
|
||||
return FP_ILOGB0; /* ilogbl(0) = FP_ILOGB0 */
|
||||
else /* subnormal x */
|
||||
if(hx==0) {
|
||||
for (ix = -16415; lx>0; lx<<=1) ix -=1;
|
||||
@ -51,6 +51,6 @@ static char rcsid[] = "$NetBSD: $";
|
||||
return ix;
|
||||
}
|
||||
else if (es<0x7fff) return es-0x3fff;
|
||||
else return 0x7fffffff;
|
||||
else return FP_ILOGBNAN;
|
||||
}
|
||||
weak_alias (__ilogbl, ilogbl)
|
||||
|
@ -34,17 +34,17 @@ long long int
|
||||
__llrintf (float x)
|
||||
{
|
||||
int32_t j0;
|
||||
u_int32_t i, i0;
|
||||
u_int32_t i0;
|
||||
volatile float w;
|
||||
float t;
|
||||
long long int result;
|
||||
int sx;
|
||||
|
||||
GET_FLOAT_WORD (i, x);
|
||||
GET_FLOAT_WORD (i0, x);
|
||||
|
||||
sx = i0 >> 31;
|
||||
j0 = ((i0 >> 23) & 0xff) - 0x7f;
|
||||
i0 = i & 0x7fffff;
|
||||
i0 &= 0x7fffff;
|
||||
i0 |= 0x800000;
|
||||
|
||||
if (j0 < (int32_t) (sizeof (long long int) * 8) - 1)
|
||||
@ -57,10 +57,10 @@ __llrintf (float x)
|
||||
{
|
||||
w = two23[sx] + x;
|
||||
t = w - two23[sx];
|
||||
GET_FLOAT_WORD (i, t);
|
||||
i0 = i & 0x7fffff;
|
||||
i0 |= 0x800000;
|
||||
GET_FLOAT_WORD (i0, t);
|
||||
j0 = ((i0 >> 23) & 0xff) - 0x7f;
|
||||
i0 &= 0x7fffff;
|
||||
i0 |= 0x800000;
|
||||
|
||||
result = i0 >> (23 - j0);
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ long int
|
||||
__lrint (double x)
|
||||
{
|
||||
int32_t j0;
|
||||
u_int32_t i0,i1,i;
|
||||
u_int32_t i0,i1;
|
||||
volatile double w;
|
||||
double t;
|
||||
long int result;
|
||||
@ -55,9 +55,9 @@ __lrint (double x)
|
||||
w = two52[sx] + x;
|
||||
t = w - two52[sx];
|
||||
EXTRACT_WORDS (i0, i1, t);
|
||||
i0 = i & 0xfffff;
|
||||
i0 |= 0x100000;
|
||||
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
|
||||
i0 &= 0xfffff;
|
||||
i0 |= 0x100000;
|
||||
|
||||
result = i0 >> (20 - j0);
|
||||
}
|
||||
@ -71,9 +71,9 @@ __lrint (double x)
|
||||
w = two52[sx] + x;
|
||||
t = w - two52[sx];
|
||||
EXTRACT_WORDS (i0, i1, t);
|
||||
i0 = i & 0xfffff;
|
||||
i0 |= 0x100000;
|
||||
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
|
||||
i0 &= 0xfffff;
|
||||
i0 |= 0x100000;
|
||||
|
||||
result = ((long int) i0 << (j0 - 20)) | (i1 >> (52 - j0));
|
||||
}
|
||||
|
@ -34,17 +34,17 @@ long int
|
||||
__lrintf (float x)
|
||||
{
|
||||
int32_t j0;
|
||||
u_int32_t i, i0;
|
||||
u_int32_t i0;
|
||||
volatile float w;
|
||||
float t;
|
||||
long int result;
|
||||
int sx;
|
||||
|
||||
GET_FLOAT_WORD (i, x);
|
||||
GET_FLOAT_WORD (i0, x);
|
||||
|
||||
sx = i0 >> 31;
|
||||
j0 = ((i0 >> 23) & 0xff) - 0x7f;
|
||||
i0 = i & 0x7fffff;
|
||||
i0 &= 0x7fffff;
|
||||
i0 |= 0x800000;
|
||||
|
||||
if (j0 < (int32_t) (sizeof (long int) * 8) - 1)
|
||||
@ -57,10 +57,10 @@ __lrintf (float x)
|
||||
{
|
||||
w = two23[sx] + x;
|
||||
t = w - two23[sx];
|
||||
GET_FLOAT_WORD (i, t);
|
||||
i0 = i & 0x7fffff;
|
||||
i0 |= 0x800000;
|
||||
GET_FLOAT_WORD (i0, t);
|
||||
j0 = ((i0 >> 23) & 0xff) - 0x7f;
|
||||
i0 &= 0x7fffff;
|
||||
i0 |= 0x800000;
|
||||
|
||||
result = i0 >> (23 - j0);
|
||||
}
|
||||
|
@ -35,6 +35,6 @@ __nanf (const char *tagp)
|
||||
return strtof (buf, NULL);
|
||||
}
|
||||
|
||||
return NANF;
|
||||
return NAN;
|
||||
}
|
||||
weak_alias (__nanf, nanf)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user