mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
2000-09-30 H.J. Lu <hjl@gnu.org> * sysdeps/ieee754/ldbl-96/s_ceill.c (__ceill): Handle overflow. * sysdeps/ieee754/ldbl-96/s_floorl.c (__floorl): Likewise. 2000-09-29 H.J. Lu <hjl@gnu.org> * math/libm-test.inc (init_max_error): Clear all exceptions before starting test. (acosh_test): Test for existence of function. (asinh_test): Likewise. (atan2_test): Likewise. (cabs_test): Likewise. (cacos_test): Likewise. (cacosh_test): Likewise. (casin_test): Likewise. (casinh_test): Likewise. (catan_test): Likewise. (catanh_test): Likewise. (ccos_test): Likewise. (ccosh_test): Likewise. (cexp_test): Likewise. (clog_test): Likewise. (clog10_test): Likewise. (cosh_test): Likewise. (cpow_test): Likewise. (csin_test): Likewise. (csinh_test): Likewise. (csqrt_test): Likewise. (ctan_test): Likewise. (ctanh_test): Likewise. (fmod_test): Likewise. (hypot_test): Likewise. (remainder_test): Likewise. (remquo_test): Likewise. (sincos_test): Likewise. (sinh_test): Likewise. (tanh_test): Likewise. 2000-09-29 H.J. Lu <hjl@gnu.org> * sysdeps/ia64/ieee754.h: New file. * sysdeps/ia64/fpu/math_ldbl.h: New file. 2000-09-30 Jakub Jelinek <jakub@redhat.com> * elf/ldconfig.h (FLAG_X8664_LIB64): Define. * sysdeps/unix/sysv/linux/i386/readelflib.c: New file. 2000-09-30 Ulrich Drepper <drepper@redhat.com> * manual/charset.texi: Correct notations, reference to C90 amd 1, and some other details. * manual/ctype.texi: Likewise. Patches by Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>.
This commit is contained in:
57
ChangeLog
57
ChangeLog
@ -1,3 +1,60 @@
|
|||||||
|
2000-09-30 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* sysdeps/ieee754/ldbl-96/s_ceill.c (__ceill): Handle overflow.
|
||||||
|
* sysdeps/ieee754/ldbl-96/s_floorl.c (__floorl): Likewise.
|
||||||
|
|
||||||
|
2000-09-29 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* math/libm-test.inc (init_max_error): Clear all exceptions
|
||||||
|
before starting test.
|
||||||
|
(acosh_test): Test for existence of function.
|
||||||
|
(asinh_test): Likewise.
|
||||||
|
(atan2_test): Likewise.
|
||||||
|
(cabs_test): Likewise.
|
||||||
|
(cacos_test): Likewise.
|
||||||
|
(cacosh_test): Likewise.
|
||||||
|
(casin_test): Likewise.
|
||||||
|
(casinh_test): Likewise.
|
||||||
|
(catan_test): Likewise.
|
||||||
|
(catanh_test): Likewise.
|
||||||
|
(ccos_test): Likewise.
|
||||||
|
(ccosh_test): Likewise.
|
||||||
|
(cexp_test): Likewise.
|
||||||
|
(clog_test): Likewise.
|
||||||
|
(clog10_test): Likewise.
|
||||||
|
(cosh_test): Likewise.
|
||||||
|
(cpow_test): Likewise.
|
||||||
|
(csin_test): Likewise.
|
||||||
|
(csinh_test): Likewise.
|
||||||
|
(csqrt_test): Likewise.
|
||||||
|
(ctan_test): Likewise.
|
||||||
|
(ctanh_test): Likewise.
|
||||||
|
(fmod_test): Likewise.
|
||||||
|
(hypot_test): Likewise.
|
||||||
|
(remainder_test): Likewise.
|
||||||
|
(remquo_test): Likewise.
|
||||||
|
(sincos_test): Likewise.
|
||||||
|
(sinh_test): Likewise.
|
||||||
|
(tanh_test): Likewise.
|
||||||
|
|
||||||
|
2000-09-29 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* sysdeps/ia64/ieee754.h: New file.
|
||||||
|
|
||||||
|
* sysdeps/ia64/fpu/math_ldbl.h: New file.
|
||||||
|
|
||||||
|
2000-09-30 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* elf/ldconfig.h (FLAG_X8664_LIB64): Define.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/readelflib.c: New file.
|
||||||
|
|
||||||
|
2000-09-30 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* manual/charset.texi: Correct notations, reference to C90 amd 1,
|
||||||
|
and some other details.
|
||||||
|
* manual/ctype.texi: Likewise.
|
||||||
|
Patches by Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>.
|
||||||
|
|
||||||
2000-09-30 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
|
2000-09-30 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
|
||||||
|
|
||||||
* sysdeps/ieee754/flt-32/s_frexpf.c: Make it aliasing safe.
|
* sysdeps/ieee754/flt-32/s_frexpf.c: Make it aliasing safe.
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#define FLAG_REQUIRED_MASK 0xff00
|
#define FLAG_REQUIRED_MASK 0xff00
|
||||||
#define FLAG_SPARC_LIB64 0x0100
|
#define FLAG_SPARC_LIB64 0x0100
|
||||||
#define FLAG_IA64_LIB64 0x0200
|
#define FLAG_IA64_LIB64 0x0200
|
||||||
|
#define FLAG_X8664_LIB64 0x0300
|
||||||
|
|
||||||
/* Declared in cache.c. */
|
/* Declared in cache.c. */
|
||||||
extern void print_cache (const char *cache_name);
|
extern void print_cache (const char *cache_name);
|
||||||
|
@ -15,7 +15,7 @@ limitations of this approach became more apparent as more people
|
|||||||
grappled with non-Roman character sets, where not all the characters
|
grappled with non-Roman character sets, where not all the characters
|
||||||
that make up a language's character set can be represented by @math{2^8}
|
that make up a language's character set can be represented by @math{2^8}
|
||||||
choices. This chapter shows the functionality which was added to the C
|
choices. This chapter shows the functionality which was added to the C
|
||||||
library to correctly support multiple character sets.
|
library to support multiple character sets.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Extended Char Intro:: Introduction to Extended Characters.
|
* Extended Char Intro:: Introduction to Extended Characters.
|
||||||
@ -46,13 +46,13 @@ through whatever communication channel. Examples of external
|
|||||||
representations include files lying in a directory that are going to be
|
representations include files lying in a directory that are going to be
|
||||||
read and parsed.
|
read and parsed.
|
||||||
|
|
||||||
Traditionally there was no difference between the two representations.
|
Traditionally there has been no difference between the two representations.
|
||||||
It was equally comfortable and useful to use the same one-byte
|
It was equally comfortable and useful to use the same single-byte
|
||||||
representation internally and externally. This changes with more and
|
representation internally and externally. This changes with more and
|
||||||
larger character sets.
|
larger character sets.
|
||||||
|
|
||||||
One of the problems to overcome with the internal representation is
|
One of the problems to overcome with the internal representation is
|
||||||
handling text which is externally encoded using different character
|
handling text that is externally encoded using different character
|
||||||
sets. Assume a program which reads two texts and compares them using
|
sets. Assume a program which reads two texts and compares them using
|
||||||
some metric. The comparison can be usefully done only if the texts are
|
some metric. The comparison can be usefully done only if the texts are
|
||||||
internally kept in a common format.
|
internally kept in a common format.
|
||||||
@ -69,14 +69,28 @@ than four bytes seem not to be necessary).
|
|||||||
As shown in some other part of this manual,
|
As shown in some other part of this manual,
|
||||||
@c !!! Ahem, wide char string functions are not yet covered -- drepper
|
@c !!! Ahem, wide char string functions are not yet covered -- drepper
|
||||||
there exists a completely new family of functions which can handle texts
|
there exists a completely new family of functions which can handle texts
|
||||||
of this kind in memory. The most commonly used character set for such
|
of this kind in memory. The most commonly used character sets for such
|
||||||
internal wide character representations are Unicode and @w{ISO 10646}.
|
internal wide character representations are Unicode and @w{ISO 10646}
|
||||||
The former is a subset of the latter and used when wide characters are
|
(also known as UCS for Universal Character Set). Unicode was originally
|
||||||
chosen to by 2 bytes (@math{= 16} bits) wide. The standard names of the
|
planned as a 16-bit character set, whereas @w{ISO 10646} was designed to
|
||||||
@cindex UCS2
|
be a 31-bit large code space. The two standards are practically identical.
|
||||||
@cindex UCS4
|
They have the same character repertoire and code table, but Unicode specifies
|
||||||
encodings used in these cases are UCS2 (@math{= 16} bits) and UCS4
|
added semantics. At the moment, only characters in the first @code{0x10000}
|
||||||
(@math{= 32} bits).
|
code positions (the so-called Basic Multilingual Plane, BMP) have been
|
||||||
|
assigned, but the assignment of more specialized characters outside this
|
||||||
|
16-bit space is already in progress. A number of encodings have been
|
||||||
|
defined for Unicode and @w{ISO 10646} characters:
|
||||||
|
@cindex UCS-2
|
||||||
|
@cindex UCS-4
|
||||||
|
@cindex UTF-8
|
||||||
|
@cindex UTF-16
|
||||||
|
UCS-2 is a 16-bit word that can only represent characters
|
||||||
|
from the BMP, UCS-4 is a 32-bit word than can represent any Unicode
|
||||||
|
and @w{ISO 10646} character, UTF-8 is an ASCII compatible encoding where
|
||||||
|
ASCII characters are represented by ASCII bytes and non-ASCII characters
|
||||||
|
by sequences of 2-6 non-ASCII bytes, and finally UTF-16 is an extension
|
||||||
|
of UCS-2 in which pairs of certain UCS-2 words can be used to encode
|
||||||
|
non-BMP characters up to @code{0x10ffff}.
|
||||||
|
|
||||||
To represent wide characters the @code{char} type is not suitable. For
|
To represent wide characters the @code{char} type is not suitable. For
|
||||||
this reason the @w{ISO C} standard introduces a new type which is
|
this reason the @w{ISO C} standard introduces a new type which is
|
||||||
@ -93,18 +107,18 @@ for multibyte character strings. The type is defined in @file{stddef.h}.
|
|||||||
|
|
||||||
The @w{ISO C90} standard, where this type was introduced, does not say
|
The @w{ISO C90} standard, where this type was introduced, does not say
|
||||||
anything specific about the representation. It only requires that this
|
anything specific about the representation. It only requires that this
|
||||||
type is capable to store all elements of the basic character set.
|
type is capable of storing all elements of the basic character set.
|
||||||
Therefore it would be legitimate to define @code{wchar_t} as
|
Therefore it would be legitimate to define @code{wchar_t} as
|
||||||
@code{char}. This might make sense for embedded systems.
|
@code{char}. This might make sense for embedded systems.
|
||||||
|
|
||||||
But for GNU systems this type is always 32 bits wide. It is therefore
|
But for GNU systems this type is always 32 bits wide. It is therefore
|
||||||
capable to represent all UCS4 value therefore covering all of @w{ISO
|
capable of representing all UCS-4 values and therefore covering all of
|
||||||
10646}. Some Unix systems define @code{wchar_t} as a 16 bit type and
|
@w{ISO 10646}. Some Unix systems define @code{wchar_t} as a 16-bit type and
|
||||||
thereby follow Unicode very strictly. This is perfectly fine with the
|
thereby follow Unicode very strictly. This is perfectly fine with the
|
||||||
standard but it also means that to represent all characters from Unicode
|
standard but it also means that to represent all characters from Unicode
|
||||||
and @w{ISO 10646} one has to use surrogate character which is in fact a
|
and @w{ISO 10646} one has to use UTF-16 surrogate characters which is in
|
||||||
multi-wide-character encoding. But this contradicts the purpose of the
|
fact a multi-wide-character encoding. But this contradicts the purpose
|
||||||
@code{wchar_t} type.
|
of the @code{wchar_t} type.
|
||||||
@end deftp
|
@end deftp
|
||||||
|
|
||||||
@comment wchar.h
|
@comment wchar.h
|
||||||
@ -119,8 +133,8 @@ defined as @code{char} the type @code{wint_t} must be defined as
|
|||||||
@code{int} due to the parameter promotion.
|
@code{int} due to the parameter promotion.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This type is defined in @file{wchar.h} and got introduced in the second
|
This type is defined in @file{wchar.h} and got introduced in
|
||||||
amendment to @w{ISO C90}.
|
@w{Amendment 1} to @w{ISO C90}.
|
||||||
@end deftp
|
@end deftp
|
||||||
|
|
||||||
As there are for the @code{char} data type there also exist macros
|
As there are for the @code{char} data type there also exist macros
|
||||||
@ -133,7 +147,7 @@ type @code{wchar_t}.
|
|||||||
The macro @code{WCHAR_MIN} evaluates to the minimum value representable
|
The macro @code{WCHAR_MIN} evaluates to the minimum value representable
|
||||||
by an object of type @code{wint_t}.
|
by an object of type @code{wint_t}.
|
||||||
|
|
||||||
This macro got introduced in the second amendment to @w{ISO C90}.
|
This macro got introduced in @w{Amendment 1} to @w{ISO C90}.
|
||||||
@end deftypevr
|
@end deftypevr
|
||||||
|
|
||||||
@comment wchar.h
|
@comment wchar.h
|
||||||
@ -142,7 +156,7 @@ This macro got introduced in the second amendment to @w{ISO C90}.
|
|||||||
The macro @code{WCHAR_MIN} evaluates to the maximum value representable
|
The macro @code{WCHAR_MIN} evaluates to the maximum value representable
|
||||||
by an object of type @code{wint_t}.
|
by an object of type @code{wint_t}.
|
||||||
|
|
||||||
This macro got introduced in the second amendment to @w{ISO C90}.
|
This macro got introduced in @w{Amendment 1} to @w{ISO C90}.
|
||||||
@end deftypevr
|
@end deftypevr
|
||||||
|
|
||||||
Another special wide character value is the equivalent to @code{EOF}.
|
Another special wide character value is the equivalent to @code{EOF}.
|
||||||
@ -180,7 +194,7 @@ are used.
|
|||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This macro was introduced in the second amendment to @w{ISO C90} and is
|
This macro was introduced in @w{Amendment 1} to @w{ISO C90} and is
|
||||||
defined in @file{wchar.h}.
|
defined in @file{wchar.h}.
|
||||||
@end deftypevr
|
@end deftypevr
|
||||||
|
|
||||||
@ -198,7 +212,7 @@ oriented character set.
|
|||||||
@cindex multibyte character
|
@cindex multibyte character
|
||||||
@cindex EBCDIC
|
@cindex EBCDIC
|
||||||
For all the above reasons, an external encoding which is different
|
For all the above reasons, an external encoding which is different
|
||||||
from the internal encoding is often used if the latter is UCS2 or UCS4.
|
from the internal encoding is often used if the latter is UCS-2 or UCS-4.
|
||||||
The external encoding is byte-based and can be chosen appropriately for
|
The external encoding is byte-based and can be chosen appropriately for
|
||||||
the environment and for the texts to be handled. There exist a variety
|
the environment and for the texts to be handled. There exist a variety
|
||||||
of different character sets which can be used for this external
|
of different character sets which can be used for this external
|
||||||
@ -215,7 +229,7 @@ system calls have to be converted first anyhow.
|
|||||||
|
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
The simplest character sets are one-byte character sets. There can be
|
The simplest character sets are single-byte character sets. There can be
|
||||||
only up to 256 characters (for @w{8 bit} character sets) which is not
|
only up to 256 characters (for @w{8 bit} character sets) which is not
|
||||||
sufficient to cover all languages but might be sufficient to handle a
|
sufficient to cover all languages but might be sufficient to handle a
|
||||||
specific text. Another reason to choose this is because of constraints
|
specific text. Another reason to choose this is because of constraints
|
||||||
@ -240,7 +254,7 @@ big advantage that whenever one can identify the beginning of the byte
|
|||||||
sequence of a character one can interpret a text correctly. Examples of
|
sequence of a character one can interpret a text correctly. Examples of
|
||||||
character sets using this policy are the various EUC character sets
|
character sets using this policy are the various EUC character sets
|
||||||
(used by Sun's operations systems, EUC-JP, EUC-KR, EUC-TW, and EUC-CN)
|
(used by Sun's operations systems, EUC-JP, EUC-KR, EUC-TW, and EUC-CN)
|
||||||
or SJIS (Shift JIS, a Japanese encoding).
|
or SJIS (Shift-JIS, a Japanese encoding).
|
||||||
|
|
||||||
But there are also character sets using a state which is valid for more
|
But there are also character sets using a state which is valid for more
|
||||||
than one character and has to be changed by another byte sequence.
|
than one character and has to be changed by another byte sequence.
|
||||||
@ -257,23 +271,23 @@ acute accent, following by lower-case `a') to get the ``small a with
|
|||||||
acute'' character. To get the acute accent character on its on one has
|
acute'' character. To get the acute accent character on its on one has
|
||||||
to write @code{0xc2 0x20} (the non-spacing acute followed by a space).
|
to write @code{0xc2 0x20} (the non-spacing acute followed by a space).
|
||||||
|
|
||||||
This type of characters sets is quite frequently used in embedded
|
This type of character set is used in some embedded systems such as
|
||||||
systems such as video text.
|
teletex.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
@cindex UTF-8
|
@cindex UTF-8
|
||||||
Instead of converting the Unicode or @w{ISO 10646} text used internally
|
Instead of converting the Unicode or @w{ISO 10646} text used internally,
|
||||||
it is often also sufficient to simply use an encoding different than
|
it is often also sufficient to simply use an encoding different than
|
||||||
UCS2/UCS4. The Unicode and @w{ISO 10646} standards even specify such an
|
UCS-2/UCS-4. The Unicode and @w{ISO 10646} standards even specify such an
|
||||||
encoding: UTF-8. This encoding is able to represent all of @w{ISO
|
encoding: UTF-8. This encoding is able to represent all of @w{ISO
|
||||||
10464} 31 bits in a byte string of length one to seven.
|
10464} 31 bits in a byte string of length one to six.
|
||||||
|
|
||||||
@cindex UTF-7
|
@cindex UTF-7
|
||||||
There were a few other attempts to encode @w{ISO 10646} such as UTF-7
|
There were a few other attempts to encode @w{ISO 10646} such as UTF-7
|
||||||
but UTF-8 is today the only encoding which should be used. In fact,
|
but UTF-8 is today the only encoding which should be used. In fact,
|
||||||
UTF-8 will hopefully soon be the only external which has to be
|
UTF-8 will hopefully soon be the only external encoding that has to be
|
||||||
supported. It proves to be universally usable and the only disadvantage
|
supported. It proves to be universally usable and the only disadvantage
|
||||||
is that it favor Roman languages very much by making the byte string
|
is that it favors Roman languages by making the byte string
|
||||||
representation of other scripts (Cyrillic, Greek, Asian scripts) longer
|
representation of other scripts (Cyrillic, Greek, Asian scripts) longer
|
||||||
than necessary if using a specific character set for these scripts.
|
than necessary if using a specific character set for these scripts.
|
||||||
Methods like the Unicode compression scheme can alleviate these
|
Methods like the Unicode compression scheme can alleviate these
|
||||||
@ -324,7 +338,7 @@ developing libraries (as opposed to applications).
|
|||||||
The second family of functions got introduced in the early Unix standards
|
The second family of functions got introduced in the early Unix standards
|
||||||
(XPG2) and is still part of the latest and greatest Unix standard:
|
(XPG2) and is still part of the latest and greatest Unix standard:
|
||||||
@w{Unix 98}. It is also the most powerful and useful set of functions.
|
@w{Unix 98}. It is also the most powerful and useful set of functions.
|
||||||
But we will start with the functions defined in the second amendment to
|
But we will start with the functions defined in @w{Amendment 1} to
|
||||||
@w{ISO C90}.
|
@w{ISO C90}.
|
||||||
|
|
||||||
@node Restartable multibyte conversion
|
@node Restartable multibyte conversion
|
||||||
@ -377,7 +391,7 @@ We already said above that the currently selected locale for the
|
|||||||
by the functions we are about to describe. Each locale uses its own
|
by the functions we are about to describe. Each locale uses its own
|
||||||
character set (given as an argument to @code{localedef}) and this is the
|
character set (given as an argument to @code{localedef}) and this is the
|
||||||
one assumed as the external multibyte encoding. The wide character
|
one assumed as the external multibyte encoding. The wide character
|
||||||
character set always is UCS4, at least on GNU systems.
|
character set always is UCS-4, at least on GNU systems.
|
||||||
|
|
||||||
A characteristic of each multibyte character set is the maximum number
|
A characteristic of each multibyte character set is the maximum number
|
||||||
of bytes which can be necessary to represent one character. This
|
of bytes which can be necessary to represent one character. This
|
||||||
@ -456,8 +470,8 @@ about the @dfn{shift state} needed from one call to a conversion
|
|||||||
function to another.
|
function to another.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This type is defined in @file{wchar.h}. It got introduced in the second
|
This type is defined in @file{wchar.h}. It got introduced in
|
||||||
amendment to @w{ISO C90}.
|
@w{Amendment 1} to @w{ISO C90}.
|
||||||
@end deftp
|
@end deftp
|
||||||
|
|
||||||
To use objects of this type the programmer has to define such objects
|
To use objects of this type the programmer has to define such objects
|
||||||
@ -495,7 +509,7 @@ object is in the initial state the return value is nonzero. Otherwise
|
|||||||
it is zero.
|
it is zero.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment to @w{ISO C90} and
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and
|
||||||
is declared in @file{wchar.h}.
|
is declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -559,7 +573,7 @@ which the state information is taken and the function also does not use
|
|||||||
any static state.
|
any static state.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment of @w{ISO C90} and
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and
|
||||||
is declared in @file{wchar.h}.
|
is declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -608,7 +622,7 @@ value of this function is this character. Otherwise the return value is
|
|||||||
@code{EOF}.
|
@code{EOF}.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment of @w{ISO C90} and
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and
|
||||||
is declared in @file{wchar.h}.
|
is declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -655,7 +669,7 @@ a valid multibyte character also no value is stored, the global variable
|
|||||||
@code{(size_t) -1}. The conversion state is afterwards undefined.
|
@code{(size_t) -1}. The conversion state is afterwards undefined.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment to @w{ISO C90} and
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and
|
||||||
is declared in @file{wchar.h}.
|
is declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -733,7 +747,7 @@ object pointed to by @var{ps}. If @var{ps} is a null pointer, a state
|
|||||||
object local to @code{mbrlen} is used.
|
object local to @code{mbrlen} is used.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment to @w{ISO C90} and
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and
|
||||||
is declared in @file{wchar.h}.
|
is declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -839,7 +853,7 @@ character. So the caller has to make sure that there is enough space
|
|||||||
available, otherwise buffer overruns can occur.
|
available, otherwise buffer overruns can occur.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment to @w{ISO C} and is
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and is
|
||||||
declared in @file{wchar.h}.
|
declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -977,7 +991,7 @@ byte in the input string was reached) or the address of the byte
|
|||||||
following the last converted multibyte character.
|
following the last converted multibyte character.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment to @w{ISO C} and is
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and is
|
||||||
declared in @file{wchar.h}.
|
declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -1058,7 +1072,7 @@ the initial shift state in case the terminating NUL wide character was
|
|||||||
converted.
|
converted.
|
||||||
|
|
||||||
@pindex wchar.h
|
@pindex wchar.h
|
||||||
This function was introduced in the second amendment to @w{ISO C} and is
|
This function was introduced in @w{Amendment 1} to @w{ISO C90} and is
|
||||||
declared in @file{wchar.h}.
|
declared in @file{wchar.h}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
@ -1231,8 +1245,8 @@ file_mbsrtowcs (int input, int output)
|
|||||||
@node Non-reentrant Conversion
|
@node Non-reentrant Conversion
|
||||||
@section Non-reentrant Conversion Function
|
@section Non-reentrant Conversion Function
|
||||||
|
|
||||||
The functions described in the last chapter are defined in the second
|
The functions described in the last chapter are defined in
|
||||||
amendment to @w{ISO C90}. But the original @w{ISO C90} standard also
|
@w{Amendment 1} to @w{ISO C90}. But the original @w{ISO C90} standard also
|
||||||
contained functions for character set conversion. The reason that they
|
contained functions for character set conversion. The reason that they
|
||||||
are not described in the first place is that they are almost entirely
|
are not described in the first place is that they are almost entirely
|
||||||
useless.
|
useless.
|
||||||
@ -1369,8 +1383,8 @@ The function @code{mblen} is declared in @file{stdlib.h}.
|
|||||||
|
|
||||||
For convenience reasons the @w{ISO C90} standard defines also functions
|
For convenience reasons the @w{ISO C90} standard defines also functions
|
||||||
to convert entire strings instead of single characters. These functions
|
to convert entire strings instead of single characters. These functions
|
||||||
suffer from the same problems as their reentrant counterparts from the
|
suffer from the same problems as their reentrant counterparts from
|
||||||
second amendment to @w{ISO C90}; see @ref{Converting Strings}.
|
@w{Amendment 1} to @w{ISO C90}; see @ref{Converting Strings}.
|
||||||
|
|
||||||
@comment stdlib.h
|
@comment stdlib.h
|
||||||
@comment ISO
|
@comment ISO
|
||||||
@ -1513,7 +1527,7 @@ common that they operate on character sets which are not directly
|
|||||||
specified by the functions. The multibyte encoding used is specified by
|
specified by the functions. The multibyte encoding used is specified by
|
||||||
the currently selected locale for the @code{LC_CTYPE} category. The
|
the currently selected locale for the @code{LC_CTYPE} category. The
|
||||||
wide character set is fixed by the implementation (in the case of GNU C
|
wide character set is fixed by the implementation (in the case of GNU C
|
||||||
library it always is UCS4 encoded @w{ISO 10646}.
|
library it always is UCS-4 encoded @w{ISO 10646}.
|
||||||
|
|
||||||
This has of course several problems when it comes to general character
|
This has of course several problems when it comes to general character
|
||||||
conversion:
|
conversion:
|
||||||
@ -1806,12 +1820,12 @@ file2wcs (int fd, const char *charset, wchar_t *outbuf, size_t avail)
|
|||||||
int result = 0;
|
int result = 0;
|
||||||
iconv_t cd;
|
iconv_t cd;
|
||||||
|
|
||||||
cd = iconv_open ("UCS4", charset);
|
cd = iconv_open ("UCS-4", charset);
|
||||||
if (cd == (iconv_t) -1)
|
if (cd == (iconv_t) -1)
|
||||||
@{
|
@{
|
||||||
/* @r{Something went wrong.} */
|
/* @r{Something went wrong.} */
|
||||||
if (errno == EINVAL)
|
if (errno == EINVAL)
|
||||||
error (0, 0, "conversion from `%s' to `UCS4' no available",
|
error (0, 0, "conversion from '%s' to 'UCS-4' not available",
|
||||||
charset);
|
charset);
|
||||||
else
|
else
|
||||||
perror ("iconv_open");
|
perror ("iconv_open");
|
||||||
@ -2024,7 +2038,7 @@ will succeed but how to find @math{@cal{B}}?
|
|||||||
|
|
||||||
Unfortunately, the answer is: there is no general solution. On some
|
Unfortunately, the answer is: there is no general solution. On some
|
||||||
systems guessing might help. On those systems most character sets can
|
systems guessing might help. On those systems most character sets can
|
||||||
convert to and from UTF8 encoded @w{ISO 10646} or Unicode text.
|
convert to and from UTF-8 encoded @w{ISO 10646} or Unicode text.
|
||||||
Beside this only some very system-specific methods can help. Since the
|
Beside this only some very system-specific methods can help. Since the
|
||||||
conversion functions come from loadable modules and these modules must
|
conversion functions come from loadable modules and these modules must
|
||||||
be stored somewhere in the filesystem, one @emph{could} try to find them
|
be stored somewhere in the filesystem, one @emph{could} try to find them
|
||||||
@ -2082,7 +2096,7 @@ wanted conversion.
|
|||||||
|
|
||||||
@cindex triangulation
|
@cindex triangulation
|
||||||
This is achieved by providing for each character set a conversion from
|
This is achieved by providing for each character set a conversion from
|
||||||
and to UCS4 encoded @w{ISO 10646}. Using @w{ISO 10646} as an
|
and to UCS-4 encoded @w{ISO 10646}. Using @w{ISO 10646} as an
|
||||||
intermediate representation it is possible to @dfn{triangulate}, i.e.,
|
intermediate representation it is possible to @dfn{triangulate}, i.e.,
|
||||||
converting with an intermediate representation.
|
converting with an intermediate representation.
|
||||||
|
|
||||||
@ -2210,15 +2224,15 @@ ending with @code{//}. There often is a character set named
|
|||||||
@code{INTERNAL} mentioned. From the discussion above and the chosen
|
@code{INTERNAL} mentioned. From the discussion above and the chosen
|
||||||
name it should have become clear that this is the name for the
|
name it should have become clear that this is the name for the
|
||||||
representation used in the intermediate step of the triangulation. We
|
representation used in the intermediate step of the triangulation. We
|
||||||
have said that this is UCS4 but actually it is not quite right. The
|
have said that this is UCS-4 but actually it is not quite right. The
|
||||||
UCS4 specification also includes the specification of the byte ordering
|
UCS-4 specification also includes the specification of the byte ordering
|
||||||
used. Since a UCS4 value consists of four bytes a stored value is
|
used. Since a UCS-4 value consists of four bytes a stored value is
|
||||||
effected by byte ordering. The internal representation is @emph{not}
|
effected by byte ordering. The internal representation is @emph{not}
|
||||||
the same as UCS4 in case the byte ordering of the processor (or at least
|
the same as UCS-4 in case the byte ordering of the processor (or at least
|
||||||
the running process) is not the same as the one required for UCS4. This
|
the running process) is not the same as the one required for UCS-4. This
|
||||||
is done for performance reasons as one does not want to perform
|
is done for performance reasons as one does not want to perform
|
||||||
unnecessary byte-swapping operations if one is not interested in actually
|
unnecessary byte-swapping operations if one is not interested in actually
|
||||||
seeing the result in UCS4. To avoid trouble with endianess the internal
|
seeing the result in UCS-4. To avoid trouble with endianess the internal
|
||||||
representation consistently is named @code{INTERNAL} even on big-endian
|
representation consistently is named @code{INTERNAL} even on big-endian
|
||||||
systems where the representations are identical.
|
systems where the representations are identical.
|
||||||
|
|
||||||
@ -2570,7 +2584,7 @@ One interesting thing is the initialization of the @code{__min_} and
|
|||||||
character can consist of one to four bytes. Therefore the
|
character can consist of one to four bytes. Therefore the
|
||||||
@code{MIN_NEEDED_FROM} and @code{MAX_NEEDED_FROM} macros are defined
|
@code{MIN_NEEDED_FROM} and @code{MAX_NEEDED_FROM} macros are defined
|
||||||
this way. The output is always the @code{INTERNAL} character set (aka
|
this way. The output is always the @code{INTERNAL} character set (aka
|
||||||
UCS4) and therefore each character consists of exactly four bytes. For
|
UCS-4) and therefore each character consists of exactly four bytes. For
|
||||||
the conversion from @code{INTERNAL} to ISO-2022-JP we have to take into
|
the conversion from @code{INTERNAL} to ISO-2022-JP we have to take into
|
||||||
account that escape sequences might be necessary to switch the character
|
account that escape sequences might be necessary to switch the character
|
||||||
sets. Therefore the @code{__max_needed_to} element for this direction
|
sets. Therefore the @code{__max_needed_to} element for this direction
|
||||||
|
@ -265,8 +265,8 @@ with the SVID.
|
|||||||
@node Classification of Wide Characters, Using Wide Char Classes, Case Conversion, Character Handling
|
@node Classification of Wide Characters, Using Wide Char Classes, Case Conversion, Character Handling
|
||||||
@section Character class determination for wide characters
|
@section Character class determination for wide characters
|
||||||
|
|
||||||
The second amendment to @w{ISO C89} defines functions to classify wide
|
@w{Amendment 1} to @w{ISO C90} defines functions to classify wide
|
||||||
characters. Although the original @w{ISO C89} standard already defined
|
characters. Although the original @w{ISO C90} standard already defined
|
||||||
the type @code{wchar_t}, no functions operating on them were defined.
|
the type @code{wchar_t}, no functions operating on them were defined.
|
||||||
|
|
||||||
The general design of the classification functions for wide characters
|
The general design of the classification functions for wide characters
|
||||||
|
@ -189,6 +189,7 @@ init_max_error (void)
|
|||||||
max_error = 0;
|
max_error = 0;
|
||||||
real_max_error = 0;
|
real_max_error = 0;
|
||||||
imag_max_error = 0;
|
imag_max_error = 0;
|
||||||
|
feclearexcept (FE_ALL_EXCEPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -723,6 +724,12 @@ acos_test (void)
|
|||||||
static void
|
static void
|
||||||
acosh_test (void)
|
acosh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(acosh) (7);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (acosh);
|
START (acosh);
|
||||||
|
|
||||||
TEST_f_f (acosh, plus_infty, plus_infty);
|
TEST_f_f (acosh, plus_infty, plus_infty);
|
||||||
@ -770,6 +777,12 @@ asin_test (void)
|
|||||||
static void
|
static void
|
||||||
asinh_test (void)
|
asinh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(asinh) (0.7);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (asinh);
|
START (asinh);
|
||||||
|
|
||||||
TEST_f_f (asinh, 0, 0);
|
TEST_f_f (asinh, 0, 0);
|
||||||
@ -815,6 +828,11 @@ atan_test (void)
|
|||||||
static void
|
static void
|
||||||
atanh_test (void)
|
atanh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(atanh) (0.7);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (atanh);
|
START (atanh);
|
||||||
|
|
||||||
@ -838,6 +856,12 @@ atanh_test (void)
|
|||||||
static void
|
static void
|
||||||
atan2_test (void)
|
atan2_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(atan2) (-0, 1);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (atan2);
|
START (atan2);
|
||||||
|
|
||||||
/* atan2 (0,x) == 0 for x > 0. */
|
/* atan2 (0,x) == 0 for x > 0. */
|
||||||
@ -904,6 +928,12 @@ atan2_test (void)
|
|||||||
static void
|
static void
|
||||||
cabs_test (void)
|
cabs_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(cabs) (BUILD_COMPLEX (0.7, 12.4));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (cabs);
|
START (cabs);
|
||||||
|
|
||||||
/* cabs (x + iy) is specified as hypot (x,y) */
|
/* cabs (x + iy) is specified as hypot (x,y) */
|
||||||
@ -944,6 +974,12 @@ cabs_test (void)
|
|||||||
static void
|
static void
|
||||||
cacos_test (void)
|
cacos_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(cacos) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (cacos);
|
START (cacos);
|
||||||
|
|
||||||
|
|
||||||
@ -1002,6 +1038,12 @@ cacos_test (void)
|
|||||||
static void
|
static void
|
||||||
cacosh_test (void)
|
cacosh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(cacosh) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (cacosh);
|
START (cacosh);
|
||||||
|
|
||||||
|
|
||||||
@ -1125,6 +1167,12 @@ carg_test (void)
|
|||||||
static void
|
static void
|
||||||
casin_test (void)
|
casin_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(casin) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (casin);
|
START (casin);
|
||||||
|
|
||||||
TEST_c_c (casin, 0, 0, 0.0, 0.0);
|
TEST_c_c (casin, 0, 0, 0.0, 0.0);
|
||||||
@ -1183,6 +1231,12 @@ casin_test (void)
|
|||||||
static void
|
static void
|
||||||
casinh_test (void)
|
casinh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(casinh) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (casinh);
|
START (casinh);
|
||||||
|
|
||||||
TEST_c_c (casinh, 0, 0, 0.0, 0.0);
|
TEST_c_c (casinh, 0, 0, 0.0, 0.0);
|
||||||
@ -1241,6 +1295,12 @@ casinh_test (void)
|
|||||||
static void
|
static void
|
||||||
catan_test (void)
|
catan_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(catan) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (catan);
|
START (catan);
|
||||||
|
|
||||||
TEST_c_c (catan, 0, 0, 0, 0);
|
TEST_c_c (catan, 0, 0, 0, 0);
|
||||||
@ -1303,6 +1363,12 @@ catan_test (void)
|
|||||||
static void
|
static void
|
||||||
catanh_test (void)
|
catanh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(catanh) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (catanh);
|
START (catanh);
|
||||||
|
|
||||||
TEST_c_c (catanh, 0, 0, 0.0, 0.0);
|
TEST_c_c (catanh, 0, 0, 0.0, 0.0);
|
||||||
@ -1384,6 +1450,11 @@ cbrt_test (void)
|
|||||||
static void
|
static void
|
||||||
ccos_test (void)
|
ccos_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(ccos) (BUILD_COMPLEX (0, 0));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (ccos);
|
START (ccos);
|
||||||
|
|
||||||
@ -1448,6 +1519,11 @@ ccos_test (void)
|
|||||||
static void
|
static void
|
||||||
ccosh_test (void)
|
ccosh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(ccosh) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (ccosh);
|
START (ccosh);
|
||||||
|
|
||||||
@ -1530,6 +1606,12 @@ ceil_test (void)
|
|||||||
static void
|
static void
|
||||||
cexp_test (void)
|
cexp_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(cexp) (BUILD_COMPLEX (0, 0));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (cexp);
|
START (cexp);
|
||||||
|
|
||||||
TEST_c_c (cexp, plus_zero, plus_zero, 1, 0.0);
|
TEST_c_c (cexp, plus_zero, plus_zero, 1, 0.0);
|
||||||
@ -1602,6 +1684,12 @@ cimag_test (void)
|
|||||||
static void
|
static void
|
||||||
clog_test (void)
|
clog_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(clog) (BUILD_COMPLEX (-2, -3));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (clog);
|
START (clog);
|
||||||
|
|
||||||
TEST_c_c (clog, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
|
TEST_c_c (clog, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
|
||||||
@ -1661,6 +1749,12 @@ clog_test (void)
|
|||||||
static void
|
static void
|
||||||
clog10_test (void)
|
clog10_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(clog10) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (clog10);
|
START (clog10);
|
||||||
|
|
||||||
TEST_c_c (clog10, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
|
TEST_c_c (clog10, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
|
||||||
@ -1791,6 +1885,12 @@ cos_test (void)
|
|||||||
static void
|
static void
|
||||||
cosh_test (void)
|
cosh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(cosh) (0.7);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (cosh);
|
START (cosh);
|
||||||
TEST_f_f (cosh, 0, 1);
|
TEST_f_f (cosh, 0, 1);
|
||||||
TEST_f_f (cosh, minus_zero, 1);
|
TEST_f_f (cosh, minus_zero, 1);
|
||||||
@ -1809,6 +1909,12 @@ cosh_test (void)
|
|||||||
static void
|
static void
|
||||||
cpow_test (void)
|
cpow_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(cpow) (BUILD_COMPLEX (1, 0), BUILD_COMPLEX (0, 0));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (cpow);
|
START (cpow);
|
||||||
|
|
||||||
TEST_cc_c (cpow, 1, 0, 0, 0, 1.0, 0.0);
|
TEST_cc_c (cpow, 1, 0, 0, 0, 1.0, 0.0);
|
||||||
@ -1862,6 +1968,11 @@ creal_test (void)
|
|||||||
static void
|
static void
|
||||||
csin_test (void)
|
csin_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(csin) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (csin);
|
START (csin);
|
||||||
|
|
||||||
@ -1926,6 +2037,11 @@ csin_test (void)
|
|||||||
static void
|
static void
|
||||||
csinh_test (void)
|
csinh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(csinh) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (csinh);
|
START (csinh);
|
||||||
|
|
||||||
@ -1988,6 +2104,12 @@ csinh_test (void)
|
|||||||
static void
|
static void
|
||||||
csqrt_test (void)
|
csqrt_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(csqrt) (BUILD_COMPLEX (-1, 0));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (csqrt);
|
START (csqrt);
|
||||||
|
|
||||||
TEST_c_c (csqrt, 0, 0, 0.0, 0.0);
|
TEST_c_c (csqrt, 0, 0, 0.0, 0.0);
|
||||||
@ -2048,6 +2170,12 @@ csqrt_test (void)
|
|||||||
static void
|
static void
|
||||||
ctan_test (void)
|
ctan_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(ctan) (BUILD_COMPLEX (0.7, 1.2));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (ctan);
|
START (ctan);
|
||||||
|
|
||||||
TEST_c_c (ctan, 0, 0, 0.0, 0.0);
|
TEST_c_c (ctan, 0, 0, 0.0, 0.0);
|
||||||
@ -2100,6 +2228,12 @@ ctan_test (void)
|
|||||||
static void
|
static void
|
||||||
ctanh_test (void)
|
ctanh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(ctanh) (BUILD_COMPLEX (0, 0));
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (ctanh);
|
START (ctanh);
|
||||||
|
|
||||||
TEST_c_c (ctanh, 0, 0, 0.0, 0.0);
|
TEST_c_c (ctanh, 0, 0, 0.0, 0.0);
|
||||||
@ -2485,6 +2619,12 @@ fmin_test (void)
|
|||||||
static void
|
static void
|
||||||
fmod_test (void)
|
fmod_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(fmod) (6.5, 2.3);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (fmod);
|
START (fmod);
|
||||||
|
|
||||||
/* fmod (+0, y) == +0 for y != 0. */
|
/* fmod (+0, y) == +0 for y != 0. */
|
||||||
@ -2585,6 +2725,12 @@ gamma_test (void)
|
|||||||
static void
|
static void
|
||||||
hypot_test (void)
|
hypot_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(hypot) (0.7, 12.4);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (hypot);
|
START (hypot);
|
||||||
|
|
||||||
TEST_ff_f (hypot, plus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
|
TEST_ff_f (hypot, plus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
|
||||||
@ -3399,6 +3545,11 @@ pow_test (void)
|
|||||||
static void
|
static void
|
||||||
remainder_test (void)
|
remainder_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(remainder) (1.625, 1.0);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (remainder);
|
START (remainder);
|
||||||
|
|
||||||
@ -3424,6 +3575,12 @@ remquo_test (void)
|
|||||||
/* x is needed. */
|
/* x is needed. */
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
FUNC(remquo) (1.625, 1.0, &x);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (remquo);
|
START (remquo);
|
||||||
|
|
||||||
TEST_ffI_f1 (remquo, 1, 0, nan_value, IGNORE, INVALID_EXCEPTION);
|
TEST_ffI_f1 (remquo, 1, 0, nan_value, IGNORE, INVALID_EXCEPTION);
|
||||||
@ -3637,6 +3794,12 @@ sincos_test (void)
|
|||||||
{
|
{
|
||||||
FLOAT sin_res, cos_res;
|
FLOAT sin_res, cos_res;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
FUNC(sincos) (0, &sin_res, &cos_res);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (sincos);
|
START (sincos);
|
||||||
|
|
||||||
/* sincos is treated differently because it returns void. */
|
/* sincos is treated differently because it returns void. */
|
||||||
@ -3658,6 +3821,12 @@ sincos_test (void)
|
|||||||
static void
|
static void
|
||||||
sinh_test (void)
|
sinh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(sinh) (0.7);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (sinh);
|
START (sinh);
|
||||||
TEST_f_f (sinh, 0, 0);
|
TEST_f_f (sinh, 0, 0);
|
||||||
TEST_f_f (sinh, minus_zero, minus_zero);
|
TEST_f_f (sinh, minus_zero, minus_zero);
|
||||||
@ -3732,6 +3901,12 @@ tan_test (void)
|
|||||||
static void
|
static void
|
||||||
tanh_test (void)
|
tanh_test (void)
|
||||||
{
|
{
|
||||||
|
errno = 0;
|
||||||
|
FUNC(tanh) (0.7);
|
||||||
|
if (errno == ENOSYS)
|
||||||
|
/* Function not implemented. */
|
||||||
|
return;
|
||||||
|
|
||||||
START (tanh);
|
START (tanh);
|
||||||
|
|
||||||
TEST_f_f (tanh, 0, 0);
|
TEST_f_f (tanh, 0, 0);
|
||||||
|
100
sysdeps/ia64/fpu/math_ldbl.h
Normal file
100
sysdeps/ia64/fpu/math_ldbl.h
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#ifndef _MATH_PRIVATE_H_
|
||||||
|
#error "Never use <math_ldbl.h> directly; include <math_private.h> instead."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* A union which permits us to convert between a long double and
|
||||||
|
three 32 bit ints. */
|
||||||
|
|
||||||
|
#if __FLOAT_WORD_ORDER == BIG_ENDIAN
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
long double value;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned int empty0:32;
|
||||||
|
unsigned int sign_exponent:16;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
u_int32_t msw;
|
||||||
|
u_int32_t lsw;
|
||||||
|
} parts;
|
||||||
|
} ieee_long_double_shape_type;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __FLOAT_WORD_ORDER == LITTLE_ENDIAN
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
long double value;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
u_int32_t lsw;
|
||||||
|
u_int32_t msw;
|
||||||
|
unsigned int sign_exponent:16;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int empty0:32;
|
||||||
|
} parts;
|
||||||
|
} ieee_long_double_shape_type;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get three 32 bit ints from a double. */
|
||||||
|
|
||||||
|
#define GET_LDOUBLE_WORDS(exp,ix0,ix1,d) \
|
||||||
|
do { \
|
||||||
|
ieee_long_double_shape_type ew_u; \
|
||||||
|
ew_u.value = (d); \
|
||||||
|
(exp) = ew_u.parts.sign_exponent; \
|
||||||
|
(ix0) = ew_u.parts.msw; \
|
||||||
|
(ix1) = ew_u.parts.lsw; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Set a double from two 32 bit ints. */
|
||||||
|
|
||||||
|
#define SET_LDOUBLE_WORDS(d,exp,ix0,ix1) \
|
||||||
|
do { \
|
||||||
|
ieee_long_double_shape_type iw_u; \
|
||||||
|
iw_u.parts.sign_exponent = (exp); \
|
||||||
|
iw_u.parts.msw = (ix0); \
|
||||||
|
iw_u.parts.lsw = (ix1); \
|
||||||
|
(d) = iw_u.value; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Get the more significant 32 bits of a long double mantissa. */
|
||||||
|
|
||||||
|
#define GET_LDOUBLE_MSW(v,d) \
|
||||||
|
do { \
|
||||||
|
ieee_long_double_shape_type sh_u; \
|
||||||
|
sh_u.value = (d); \
|
||||||
|
(v) = sh_u.parts.msw; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Set the more significant 32 bits of a long double mantissa from an int. */
|
||||||
|
|
||||||
|
#define SET_LDOUBLE_MSW(d,v) \
|
||||||
|
do { \
|
||||||
|
ieee_long_double_shape_type sh_u; \
|
||||||
|
sh_u.value = (d); \
|
||||||
|
sh_u.parts.msw = (v); \
|
||||||
|
(d) = sh_u.value; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Get int from the exponent of a long double. */
|
||||||
|
|
||||||
|
#define GET_LDOUBLE_EXP(exp,d) \
|
||||||
|
do { \
|
||||||
|
ieee_long_double_shape_type ge_u; \
|
||||||
|
ge_u.value = (d); \
|
||||||
|
(exp) = ge_u.parts.sign_exponent; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Set exponent of a long double from an int. */
|
||||||
|
|
||||||
|
#define SET_LDOUBLE_EXP(d,exp) \
|
||||||
|
do { \
|
||||||
|
ieee_long_double_shape_type se_u; \
|
||||||
|
se_u.value = (d); \
|
||||||
|
se_u.parts.sign_exponent = (exp); \
|
||||||
|
(d) = se_u.value; \
|
||||||
|
} while (0)
|
205
sysdeps/ia64/ieee754.h
Normal file
205
sysdeps/ia64/ieee754.h
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
/* Copyright (C) 2000 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 _IEEE754_H
|
||||||
|
|
||||||
|
#define _IEEE754_H 1
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
|
#include <endian.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
union ieee754_float
|
||||||
|
{
|
||||||
|
float f;
|
||||||
|
|
||||||
|
/* This is the IEEE 754 single-precision format. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int exponent:8;
|
||||||
|
unsigned int mantissa:23;
|
||||||
|
#endif /* Big endian. */
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
unsigned int mantissa:23;
|
||||||
|
unsigned int exponent:8;
|
||||||
|
unsigned int negative:1;
|
||||||
|
#endif /* Little endian. */
|
||||||
|
} ieee;
|
||||||
|
|
||||||
|
/* This format makes it easier to see if a NaN is a signalling NaN. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int exponent:8;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int mantissa:22;
|
||||||
|
#endif /* Big endian. */
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
unsigned int mantissa:22;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int exponent:8;
|
||||||
|
unsigned int negative:1;
|
||||||
|
#endif /* Little endian. */
|
||||||
|
} ieee_nan;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */
|
||||||
|
|
||||||
|
|
||||||
|
union ieee754_double
|
||||||
|
{
|
||||||
|
double d;
|
||||||
|
|
||||||
|
/* This is the IEEE 754 double-precision format. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int exponent:11;
|
||||||
|
/* Together these comprise the mantissa. */
|
||||||
|
unsigned int mantissa0:20;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
#endif /* Big endian. */
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
# if __FLOAT_WORD_ORDER == BIG_ENDIAN
|
||||||
|
unsigned int mantissa0:20;
|
||||||
|
unsigned int exponent:11;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
# else
|
||||||
|
/* Together these comprise the mantissa. */
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
unsigned int mantissa0:20;
|
||||||
|
unsigned int exponent:11;
|
||||||
|
unsigned int negative:1;
|
||||||
|
# endif
|
||||||
|
#endif /* Little endian. */
|
||||||
|
} ieee;
|
||||||
|
|
||||||
|
/* This format makes it easier to see if a NaN is a signalling NaN. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int exponent:11;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
/* Together these comprise the mantissa. */
|
||||||
|
unsigned int mantissa0:19;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
#else
|
||||||
|
# if __FLOAT_WORD_ORDER == BIG_ENDIAN
|
||||||
|
unsigned int mantissa0:19;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int exponent:11;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
# else
|
||||||
|
/* Together these comprise the mantissa. */
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
unsigned int mantissa0:19;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int exponent:11;
|
||||||
|
unsigned int negative:1;
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
} ieee_nan;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */
|
||||||
|
|
||||||
|
|
||||||
|
union ieee854_long_double
|
||||||
|
{
|
||||||
|
long double d;
|
||||||
|
|
||||||
|
/* This is the IEEE 854 double-extended-precision format. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
unsigned int empty0:32;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int exponent:15;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int mantissa0:32;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
#endif
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
# if __FLOAT_WORD_ORDER == BIG_ENDIAN
|
||||||
|
unsigned int empty0:32;
|
||||||
|
unsigned int exponent:15;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int mantissa0:32;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
# else
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
unsigned int mantissa0:32;
|
||||||
|
unsigned int exponent:15;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int empty0:32;
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
} ieee;
|
||||||
|
|
||||||
|
/* This is for NaNs in the IEEE 854 double-extended-precision format. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
unsigned int empty0:32;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int exponent:15;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int one:1;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int mantissa0:30;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
#endif
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
# if __FLOAT_WORD_ORDER == BIG_ENDIAN
|
||||||
|
unsigned int empty0:32;
|
||||||
|
unsigned int exponent:15;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int mantissa0:30;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int one:1;
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
# else
|
||||||
|
unsigned int mantissa1:32;
|
||||||
|
unsigned int mantissa0:30;
|
||||||
|
unsigned int quiet_nan:1;
|
||||||
|
unsigned int one:1;
|
||||||
|
unsigned int exponent:15;
|
||||||
|
unsigned int negative:1;
|
||||||
|
unsigned int empty1:16;
|
||||||
|
unsigned int empty0:32;
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
} ieee_nan;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif /* ieee754.h */
|
@ -59,8 +59,13 @@ static long double huge = 1.0e4930;
|
|||||||
if(((i0&i)|i1)==0) return x; /* x is integral */
|
if(((i0&i)|i1)==0) return x; /* x is integral */
|
||||||
if(huge+x>0.0) { /* raise inexact flag */
|
if(huge+x>0.0) { /* raise inexact flag */
|
||||||
if(sx==0) {
|
if(sx==0) {
|
||||||
if (j0>0) i0 += (0x80000000)>>j0;
|
if (j0>0 && (i0+(0x80000000>>j0))>i0)
|
||||||
else ++se;
|
i0+=0x80000000>>j0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = 0x7fffffff;
|
||||||
|
++se;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
i0 &= (~i); i1=0;
|
i0 &= (~i); i1=0;
|
||||||
}
|
}
|
||||||
|
@ -60,8 +60,13 @@ static long double huge = 1.0e4930;
|
|||||||
if(((i0&i)|i1)==0) return x; /* x is integral */
|
if(((i0&i)|i1)==0) return x; /* x is integral */
|
||||||
if(huge+x>0.0) { /* raise inexact flag */
|
if(huge+x>0.0) { /* raise inexact flag */
|
||||||
if(sx) {
|
if(sx) {
|
||||||
if (j0>0) i0 += (0x80000000)>>j0;
|
if (j0>0 && (i0+(0x80000000>>j0))>i0)
|
||||||
else ++se;
|
i0 += (0x80000000)>>j0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = 0x7fffffff;
|
||||||
|
++se;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
i0 &= (~i); i1=0;
|
i0 &= (~i); i1=0;
|
||||||
}
|
}
|
||||||
|
81
sysdeps/unix/sysv/linux/i386/readelflib.c
Normal file
81
sysdeps/unix/sysv/linux/i386/readelflib.c
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Andreas Jaeger <aj@suse.de>, 1999 and
|
||||||
|
Jakub Jelinek <jakub@redhat.com>, 2000.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
|
||||||
|
int process_elf32_file (const char *file_name, const char *lib, int *flag,
|
||||||
|
char **soname, void *file_contents,
|
||||||
|
size_t file_length);
|
||||||
|
int process_elf64_file (const char *file_name, const char *lib, int *flag,
|
||||||
|
char **soname, void *file_contents,
|
||||||
|
size_t file_length);
|
||||||
|
|
||||||
|
/* Returns 0 if everything is ok, != 0 in case of error. */
|
||||||
|
int
|
||||||
|
process_elf_file (const char *file_name, const char *lib, int *flag,
|
||||||
|
char **soname, void *file_contents, size_t file_length)
|
||||||
|
{
|
||||||
|
ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (elf_header->e_ident [EI_CLASS] == ELFCLASS32)
|
||||||
|
return process_elf32_file (file_name, lib, flag, soname, file_contents,
|
||||||
|
file_length);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (elf_header->e_machine)
|
||||||
|
{
|
||||||
|
case EM_IA_64:
|
||||||
|
case EM_X8664:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error (0, 0, _("%s is for unknown machine %d.\n"),
|
||||||
|
file_name, elf_header->e_machine);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = process_elf64_file (file_name, lib, flag, soname, file_contents,
|
||||||
|
file_length);
|
||||||
|
/* IA64/X86-64 64bit libraries are always libc.so.6+. */
|
||||||
|
if (!ret)
|
||||||
|
switch (elf_header->e_machine)
|
||||||
|
{
|
||||||
|
case EM_IA_64:
|
||||||
|
*flag = FLAG_IA64_LIB64|FLAG_ELF_LIBC6;
|
||||||
|
break;
|
||||||
|
case EM_X8664:
|
||||||
|
*flag = FLAG_X8664_LIB64|FLAG_ELF_LIBC6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef __ELF_NATIVE_CLASS
|
||||||
|
#undef process_elf_file
|
||||||
|
#define process_elf_file process_elf32_file
|
||||||
|
#define __ELF_NATIVE_CLASS 32
|
||||||
|
#include "sysdeps/generic/readelflib.c"
|
||||||
|
|
||||||
|
#undef __ELF_NATIVE_CLASS
|
||||||
|
#undef process_elf_file
|
||||||
|
#define process_elf_file process_elf64_file
|
||||||
|
#define __ELF_NATIVE_CLASS 64
|
||||||
|
#include "sysdeps/generic/readelflib.c"
|
Reference in New Issue
Block a user