Update.
Thu Aug 8 16:17:38 1996 Ulrich Drepper <drepper@cygnus.com> * pwd/getpwent.c: Define BUFLEN from NSS_BUFLEN_PASSWD. * pwd/getpwent_r.c: Likewise. * pwd/getpwnam.c: Likewise. * pwd/getpwnam_r.c: Likewise. * pwd/getpwuid.c: Likewise. * pwd/getpwuid_r.c: Likewise. * grp/getgrent.c: Define BUFLEN from NSS_BUFLEN_GROUP. * grp/getgrent_r.c: Likewise. * grp/getgrgid.c: Likewise. * grp/getgrgid_r.c: Likewise. * grp/getgrnam.c: Likewise. * pwd/fgetpwent_r.c: New file. Reentrant version of fgetpwent. * pwd/fgetpwent.c: Rewrite to use fgetpwent_r. * pwd/Makefile (routines): Add fgetpwent_r. * pwd/pwd.h: Add prototypes for __fgetpwent_r and fgetpwent_r. * grp/fgetgrent_r.c: New file. Reentrant version of fgetgrent. * grp/fgetgrent.c: Rewrite to use fgetgrent_r. * grp/Makefile (routines): Add fgetgrent_r. * grp/grp.h: Add prototypes for __fgetgrent_r and fgetgrent_r. Implement shadow password lookup functions. This is no complete shadow password suite. * shadow/Makefile: New file. * shadow/fgetspent.c: New file. * shadow/fgetspent_r.c: New file. * shadow/getspent.c: New file. * shadow/getspent_r.c: New file. * shadow/getspnam.c: New file. * shadow/getspnam_r.c: New file. * shadow/putspent.c: New file. * shadow/sgetspent.c: New file. * shadow/sgetspent_r.c: New file. * shadow/shadow.h: New file. * shadow/spwd-lookup.c: New file. * shadow/nss_files/files-spwd.c: New file. Thu Aug 8 13:33:45 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/ftime.c: New file. Available system call is only a stub. Reported by Matthias Urlichs. * Makeconfig [!default_cflags]: Change default value from `-g' to `-g -O'. * configure.in: Recognize i686. * sysdeps/i386/i686/Implies: Default on i586 optimized code. Thu Aug 8 12:40:20 1996 Matthias Urlichs <smurf@smurf.noris.de> * Makeconfig [$(build-omitfp) == yes]: Add to CFLAGS-.so value of CFLAGS-.o, not CFLAGS-o. * sysdeps/unix/sysv/linux/init-first.c (init): Add volatile pointer to ourself. Otherwise `gcc -O3' optimized init away. sure that all tables in binary file are word-aligned.
This commit is contained in:
parent
233963756b
commit
a5113b141c
63
ChangeLog
63
ChangeLog
|
@ -1,3 +1,64 @@
|
|||
Thu Aug 8 16:17:38 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* pwd/getpwent.c: Define BUFLEN from NSS_BUFLEN_PASSWD.
|
||||
* pwd/getpwent_r.c: Likewise.
|
||||
* pwd/getpwnam.c: Likewise.
|
||||
* pwd/getpwnam_r.c: Likewise.
|
||||
* pwd/getpwuid.c: Likewise.
|
||||
* pwd/getpwuid_r.c: Likewise.
|
||||
|
||||
* grp/getgrent.c: Define BUFLEN from NSS_BUFLEN_GROUP.
|
||||
* grp/getgrent_r.c: Likewise.
|
||||
* grp/getgrgid.c: Likewise.
|
||||
* grp/getgrgid_r.c: Likewise.
|
||||
* grp/getgrnam.c: Likewise.
|
||||
|
||||
* pwd/fgetpwent_r.c: New file. Reentrant version of fgetpwent.
|
||||
* pwd/fgetpwent.c: Rewrite to use fgetpwent_r.
|
||||
* pwd/Makefile (routines): Add fgetpwent_r.
|
||||
* pwd/pwd.h: Add prototypes for __fgetpwent_r and fgetpwent_r.
|
||||
|
||||
* grp/fgetgrent_r.c: New file. Reentrant version of fgetgrent.
|
||||
* grp/fgetgrent.c: Rewrite to use fgetgrent_r.
|
||||
* grp/Makefile (routines): Add fgetgrent_r.
|
||||
* grp/grp.h: Add prototypes for __fgetgrent_r and fgetgrent_r.
|
||||
|
||||
Implement shadow password lookup functions. This is no complete
|
||||
shadow password suite.
|
||||
* shadow/Makefile: New file.
|
||||
* shadow/fgetspent.c: New file.
|
||||
* shadow/fgetspent_r.c: New file.
|
||||
* shadow/getspent.c: New file.
|
||||
* shadow/getspent_r.c: New file.
|
||||
* shadow/getspnam.c: New file.
|
||||
* shadow/getspnam_r.c: New file.
|
||||
* shadow/putspent.c: New file.
|
||||
* shadow/sgetspent.c: New file.
|
||||
* shadow/sgetspent_r.c: New file.
|
||||
* shadow/shadow.h: New file.
|
||||
* shadow/spwd-lookup.c: New file.
|
||||
* shadow/nss_files/files-spwd.c: New file.
|
||||
|
||||
Thu Aug 8 13:33:45 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/ftime.c: New file. Available system
|
||||
call is only a stub.
|
||||
Reported by Matthias Urlichs.
|
||||
|
||||
* Makeconfig [!default_cflags]: Change default value from `-g'
|
||||
to `-g -O'.
|
||||
|
||||
* configure.in: Recognize i686.
|
||||
* sysdeps/i386/i686/Implies: Default on i586 optimized code.
|
||||
|
||||
Thu Aug 8 12:40:20 1996 Matthias Urlichs <smurf@smurf.noris.de>
|
||||
|
||||
* Makeconfig [$(build-omitfp) == yes]: Add to CFLAGS-.so
|
||||
value of CFLAGS-.o, not CFLAGS-o.
|
||||
|
||||
* sysdeps/unix/sysv/linux/init-first.c (init): Add volatile
|
||||
pointer to ourself. Otherwise `gcc -O3' optimized init away.
|
||||
|
||||
Thu Aug 8 01:41:43 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* elf/Makefile: Undo change of Tue Aug 6 14:27:11 1996.
|
||||
|
@ -479,7 +540,7 @@ Mon Jul 29 02:46:23 1996 Ulrich Drepper <drepper@cygnus.com>
|
|||
warning.
|
||||
|
||||
* locale/programs/ld-ctype.c (ctype_output): Add code to make
|
||||
sure that all tables in binary file are words aligned.
|
||||
sure that all tables in binary file are word-aligned.
|
||||
|
||||
* locale/programs/locfile.c (write_locale_data): Correct handling
|
||||
of LC_MESSAGES locale. Create directory if necessary.
|
||||
|
|
455
INSTALL
455
INSTALL
|
@ -4,16 +4,13 @@ Library Maintenance
|
|||
How to Install the GNU C Library
|
||||
================================
|
||||
|
||||
Installation of the GNU C library is relatively simple.
|
||||
|
||||
You need the latest version of GNU `make'. Modifying the GNU C
|
||||
Library to work with other `make' programs would be so hard that we
|
||||
recommend you port GNU `make' instead. *Really.*
|
||||
Installation of the GNU C library is relatively simple, but usually
|
||||
requires several GNU tools to be installed already.
|
||||
|
||||
To configure the GNU C library for your system, run the shell script
|
||||
`configure' with `sh'. Use an argument which is the conventional GNU
|
||||
name for your system configuration--for example, `sparc-sun-sunos4.1',
|
||||
for a Sun 4 running Sunos 4.1. *Note Installation:
|
||||
for a Sun 4 running SunOS 4.1. *Note Installation:
|
||||
(gcc.info)Installation, for a full description of standard GNU
|
||||
configuration names. If you omit the configuration name, `configure'
|
||||
will try to guess one for you by inspecting the system it is running
|
||||
|
@ -21,46 +18,6 @@ on. It may or may not be able to come up with a guess, and the its
|
|||
guess might be wrong. `configure' will tell you the canonical name of
|
||||
the chosen configuration before proceeding.
|
||||
|
||||
The GNU C Library currently supports configurations that match the
|
||||
following patterns:
|
||||
|
||||
alpha-dec-osf1
|
||||
i386-ANYTHING-bsd4.3
|
||||
i386-ANYTHING-gnu
|
||||
i386-ANYTHING-isc2.2
|
||||
i386-ANYTHING-isc3.N
|
||||
i386-ANYTHING-sco3.2
|
||||
i386-ANYTHING-sco3.2v4
|
||||
i386-ANYTHING-sysv
|
||||
i386-ANYTHING-sysv4
|
||||
i386-force_cpu386-none
|
||||
i386-sequent-bsd
|
||||
i960-nindy960-none
|
||||
m68k-hp-bsd4.3
|
||||
m68k-mvme135-none
|
||||
m68k-mvme136-none
|
||||
m68k-sony-newsos3
|
||||
m68k-sony-newsos4
|
||||
m68k-sun-sunos4.N
|
||||
mips-dec-ultrix4.N
|
||||
mips-sgi-irix4.N
|
||||
sparc-sun-solaris2.N
|
||||
sparc-sun-sunos4.N
|
||||
|
||||
While no other configurations are supported, there are handy aliases
|
||||
for these few. (These aliases work in other GNU software as well.)
|
||||
|
||||
decstation
|
||||
hp320-bsd4.3 hp300bsd
|
||||
i386-sco
|
||||
i386-sco3.2v4
|
||||
i386-sequent-dynix
|
||||
i386-svr4
|
||||
news
|
||||
sun3-sunos4.N sun3
|
||||
sun4-solaris2.N sun4-sunos5.N
|
||||
sun4-sunos4.N sun4
|
||||
|
||||
Here are some options that you should specify (if appropriate) when
|
||||
you run `configure':
|
||||
|
||||
|
@ -76,8 +33,15 @@ you run `configure':
|
|||
building the GNU C Library. On some systems, the library may not
|
||||
build properly if you do *not* use `gas'.
|
||||
|
||||
`--with-gnu-binutils'
|
||||
This option implies both `--with-gnu-ld' and `--with-gnu-as'. On
|
||||
systems where GNU tools are the system tools, there is no need to
|
||||
specify this option. These include GNU, GNU/Linux, and free BSD
|
||||
systems.
|
||||
|
||||
`--without-fp'
|
||||
`--nfp'
|
||||
Use this option if your computer lacks hardware floating point
|
||||
Use this option if your computer lacks hardware floating-point
|
||||
support.
|
||||
|
||||
`--prefix=DIRECTORY'
|
||||
|
@ -89,6 +53,29 @@ you run `configure':
|
|||
subdirectories of `DIRECTORY'. (You can also set this in
|
||||
`configparms'; see below.)
|
||||
|
||||
`--enable-shared'
|
||||
`--disable-shared'
|
||||
Enable or disable building of an ELF shared library on systems that
|
||||
support it. The default is to build the shared library on systems
|
||||
using ELF when the GNU `binutils' are available.
|
||||
|
||||
`--enable-profile'
|
||||
`--disable-profile'
|
||||
Enable or disable building of the profiled C library, `-lc_p'. The
|
||||
default is to build the profiled library. You may wish to disable
|
||||
it if you don't plan to do profiling, because it doubles the build
|
||||
time of compiling just the unprofiled static library.
|
||||
|
||||
`--enable-omitfp'
|
||||
Enable building a highly-optimized but possibly undebuggable
|
||||
static C library. This causes the normal static and shared (if
|
||||
enabled) C libraries to be compiled with maximal optimization,
|
||||
including the `-fomit-frame-pointer' switch that makes debugging
|
||||
impossible on many machines, and without debugging information
|
||||
(which makes the binaries substantially smaller). An additional
|
||||
static library is compiled with no optimization and full debugging
|
||||
information, and installed as `-lc_g'.
|
||||
|
||||
The simplest way to run `configure' is to do it in the directory
|
||||
that contains the library sources. This prepares to build the library
|
||||
in that very directory.
|
||||
|
@ -141,57 +128,101 @@ work with object files for the target you configured for.
|
|||
in the GNU C compiler, so you may need to compile the library with GCC.
|
||||
(In fact, all of the existing complete ports require GCC.)
|
||||
|
||||
The current release of the C library contains some header files that
|
||||
the compiler normally provides: `stddef.h', `stdarg.h', and several
|
||||
files with names of the form `va-MACHINE.h'. The versions of these
|
||||
files that came with older releases of GCC do not work properly with
|
||||
the GNU C library. The `stddef.h' file in release 2.2 and later of GCC
|
||||
is correct. If you have release 2.2 or later of GCC, use its version
|
||||
of `stddef.h' instead of the C library's. To do this, put the line
|
||||
`override stddef.h =' in `configparms'. The other files are corrected
|
||||
in release 2.3 and later of GCC. `configure' will automatically detect
|
||||
whether the installed `stdarg.h' and `va-MACHINE.h' files are
|
||||
compatible with the C library, and use its own if not.
|
||||
|
||||
There is a potential problem with the `size_t' type and versions of
|
||||
GCC prior to release 2.4. ANSI C requires that `size_t' always be an
|
||||
unsigned type. For compatibility with existing systems' header files,
|
||||
GCC defines `size_t' in `stddef.h' to be whatever type the system's
|
||||
`sys/types.h' defines it to be. Most Unix systems that define `size_t'
|
||||
in `sys/types.h', define it to be a signed type. Some code in the
|
||||
library depends on `size_t' being an unsigned type, and will not work
|
||||
correctly if it is signed.
|
||||
|
||||
The GNU C library code which expects `size_t' to be unsigned is
|
||||
correct. The definition of `size_t' as a signed type is incorrect.
|
||||
Versions 2.4 and later of GCC always define `size_t' as an unsigned
|
||||
type, and GCC's `fixincludes' script massages the system's
|
||||
`sys/types.h' so as not to conflict with this.
|
||||
|
||||
In the meantime, we work around this problem by telling GCC
|
||||
explicitly to use an unsigned type for `size_t' when compiling the GNU C
|
||||
library. `configure' will automatically detect what type GCC uses for
|
||||
`size_t' arrange to override it if necessary.
|
||||
|
||||
To build the library, type `make lib'. This will produce a lot of
|
||||
output, some of which looks like errors from `make' (but isn't). Look
|
||||
for error messages from `make' containing `***'. Those indicate that
|
||||
something is really wrong.
|
||||
To build the library and related programs, type `make'. This will
|
||||
produce a lot of output, some of which may look like errors from `make'
|
||||
(but isn't). Look for error messages from `make' containing `***'.
|
||||
Those indicate that something is really wrong.
|
||||
|
||||
To build and run some test programs which exercise some of the
|
||||
library facilities, type `make tests'. This will produce several files
|
||||
library facilities, type `make check'. This will produce several files
|
||||
with names like `PROGRAM.out'.
|
||||
|
||||
To format the `GNU C Library Reference Manual' for printing, type
|
||||
`make dvi'. To format the Info version of the manual for on line
|
||||
reading with `C-h i' in Emacs or with the `info' program, type
|
||||
`make info'.
|
||||
`make dvi'.
|
||||
|
||||
To install the library and its header files, and the Info files of
|
||||
the manual, type `make install', after setting the installation
|
||||
directories in `configparms'. This will build things if necessary,
|
||||
the manual, type `make install'. This will build things if necessary,
|
||||
before installing them.
|
||||
|
||||
Recommended Tools to Install the GNU C Library
|
||||
----------------------------------------------
|
||||
|
||||
We recommend installing the following GNU tools before attempting to
|
||||
build the GNU C library:
|
||||
|
||||
* `make' 3.75
|
||||
|
||||
You need the latest version of GNU `make'. Modifying the GNU C
|
||||
Library to work with other `make' programs would be so hard that we
|
||||
recommend you port GNU `make' instead. *Really.* We recommend
|
||||
version GNU `make' version 3.75 or later.
|
||||
|
||||
* GCC 2.7.2
|
||||
|
||||
On most platforms, the GNU C library can only be compiled with the
|
||||
GNU C compiler. We recommend GCC version 2.7.2 or later; earlier
|
||||
versions may have problems.
|
||||
|
||||
* `binutils' 2.6
|
||||
|
||||
Using the GNU `binutils' (assembler, linker, and related tools) is
|
||||
preferable when possible, and they are required to build an ELF
|
||||
shared C library. We recommend `binutils' version 2.6 or later;
|
||||
earlier versions are known to have problems.
|
||||
|
||||
Supported Configurations
|
||||
------------------------
|
||||
|
||||
The GNU C Library currently supports configurations that match the
|
||||
following patterns:
|
||||
|
||||
alpha-dec-osf1
|
||||
alpha-ANYTHING-linux
|
||||
alpha-ANYTHING-linuxecoff
|
||||
iX86-ANYTHING-bsd4.3
|
||||
iX86-ANYTHING-gnu
|
||||
iX86-ANYTHING-isc2.2
|
||||
iX86-ANYTHING-isc3.N
|
||||
iX86-ANYTHING-linux
|
||||
iX86-ANYTHING-sco3.2
|
||||
iX86-ANYTHING-sco3.2v4
|
||||
iX86-ANYTHING-sysv
|
||||
iX86-ANYTHING-sysv4
|
||||
iX86-force_cpu386-none
|
||||
iX86-sequent-bsd
|
||||
i960-nindy960-none
|
||||
m68k-hp-bsd4.3
|
||||
m68k-mvme135-none
|
||||
m68k-mvme136-none
|
||||
m68k-sony-newsos3
|
||||
m68k-sony-newsos4
|
||||
m68k-sun-sunos4.N
|
||||
mips-dec-ultrix4.N
|
||||
mips-sgi-irix4.N
|
||||
sparc-sun-solaris2.N
|
||||
sparc-sun-sunos4.N
|
||||
|
||||
Each case of `iX86' can be `i386', `i486', `i586', or `i686'.. All
|
||||
of those configurations produce a library that can run on any of these
|
||||
processors. The library will be optimized for the specified processor,
|
||||
but will not use instructions not available on all of them.
|
||||
|
||||
While no other configurations are supported, there are handy aliases
|
||||
for these few. (These aliases work in other GNU software as well.)
|
||||
|
||||
decstation
|
||||
hp320-bsd4.3 hp300bsd
|
||||
i486-gnu
|
||||
i586-linux
|
||||
i386-sco
|
||||
i386-sco3.2v4
|
||||
i386-sequent-dynix
|
||||
i386-svr4
|
||||
news
|
||||
sun3-sunos4.N sun3
|
||||
sun4-solaris2.N sun4-sunos5.N
|
||||
sun4-sunos4.N sun4
|
||||
|
||||
Reporting Bugs
|
||||
==============
|
||||
|
||||
|
@ -246,8 +277,10 @@ But what they do is fairly straightforward, and only requires that you
|
|||
define a few variables in the right places.
|
||||
|
||||
The library sources are divided into subdirectories, grouped by
|
||||
topic. The `string' subdirectory has all the string-manipulation
|
||||
functions, `stdio' has all the standard I/O functions, etc.
|
||||
topic.
|
||||
|
||||
The `string' subdirectory has all the string-manipulation functions,
|
||||
`math' has all the mathematical functions, etc.
|
||||
|
||||
Each subdirectory contains a simple makefile, called `Makefile',
|
||||
which defines a few `make' variables and then includes the global
|
||||
|
@ -283,7 +316,9 @@ The basic variables that a subdirectory makefile defines are:
|
|||
data in a file called `TEST-PROGRAM.input'; it will be given to
|
||||
the test program on its standard input. If a test program wants
|
||||
to be run with arguments, put the arguments (all on a single line)
|
||||
in a file called `TEST-PROGRAM.args'.
|
||||
in a file called `TEST-PROGRAM.args'. Test programs should exit
|
||||
with zero status when the test passes, and nonzero status when the
|
||||
test indicates a bug in the library or error in building.
|
||||
|
||||
`others'
|
||||
The names of "other" programs associated with this section of the
|
||||
|
@ -362,18 +397,24 @@ So the final list is `unix/bsd/vax unix/bsd unix/inet unix posix'.
|
|||
`sysdeps' has two "special" subdirectories, called `generic' and
|
||||
`stub'. These two are always implicitly appended to the list of
|
||||
subdirectories (in that order), so you needn't put them in an `Implies'
|
||||
file, and you should not create any subdirectories under them.
|
||||
`generic' is for things that can be implemented in machine-independent
|
||||
C, using only other machine-independent functions in the C library.
|
||||
`stub' is for "stub" versions of functions which cannot be implemented
|
||||
on a particular machine or operating system. The stub functions always
|
||||
return an error, and set `errno' to `ENOSYS' (Function not
|
||||
implemented). *Note Error Reporting::.
|
||||
file, and you should not create any subdirectories under them intended
|
||||
to be new specific categories. `generic' is for things that can be
|
||||
implemented in machine-independent C, using only other
|
||||
machine-independent functions in the C library. `stub' is for "stub"
|
||||
versions of functions which cannot be implemented on a particular
|
||||
machine or operating system. The stub functions always return an
|
||||
error, and set `errno' to `ENOSYS' (Function not implemented). *Note
|
||||
Error Reporting::.
|
||||
|
||||
A source file is known to be system-dependent by its having a
|
||||
version in `generic' or `stub'; every system-dependent function should
|
||||
have either a generic or stub implementation (there is no point in
|
||||
having both).
|
||||
version in `generic' or `stub'; every generally-available function whose
|
||||
implementation is system-dependent in should have either a generic or
|
||||
stub implementation (there is no point in having both). Some rare
|
||||
functions are only useful on specific systems and aren't defined at all
|
||||
on others; these do not appear anywhere in the system-independent
|
||||
source code or makefiles (including the `generic' and `stub'
|
||||
directories), only in the system-dependent `Makefile' in the specific
|
||||
system's subdirectory.
|
||||
|
||||
If you come across a file that is in one of the main source
|
||||
directories (`string', `stdio', etc.), and you want to write a machine-
|
||||
|
@ -629,18 +670,106 @@ generated are `ioctls.h', `errnos.h', `sys/param.h', and `errlist.c'
|
|||
Contributors to the GNU C Library
|
||||
=================================
|
||||
|
||||
The GNU C library was written almost entirely by Roland McGrath, who
|
||||
now maintains it. Some parts of the library were contributed or worked
|
||||
on by other people.
|
||||
The GNU C library was written originally by Roland McGrath. Some
|
||||
parts of the library were contributed or worked on by other people.
|
||||
|
||||
* The `getopt' function and related code were written by Richard
|
||||
Stallman, David J. MacKenzie, and Roland McGrath.
|
||||
|
||||
* Most of the math functions are taken from 4.4 BSD; they have been
|
||||
modified only slightly to work with the GNU C library. The
|
||||
Internet-related code (most of the `inet' subdirectory) and several
|
||||
other miscellaneous functions and header files have been included
|
||||
with little or no modification.
|
||||
* The merge sort function `qsort' was written by Michael J. Haertel.
|
||||
|
||||
* The quick sort function used as a fallback by `qsort' was written
|
||||
by Douglas C. Schmidt.
|
||||
|
||||
* The memory allocation functions `malloc', `realloc' and `free' and
|
||||
related code were written by Michael J. Haertel.
|
||||
|
||||
* Fast implementations of many of the string functions (`memcpy',
|
||||
`strlen', etc.) were written by Torbjorn Granlund.
|
||||
|
||||
* The `tar.h' header file was written by David J. MacKenzie.
|
||||
|
||||
* The port to the MIPS DECStation running Ultrix 4
|
||||
(`mips-dec-ultrix4') was contributed by Brendan Kehoe and Ian
|
||||
Lance Taylor.
|
||||
|
||||
* The DES encryption function `crypt' and related functions were
|
||||
contributed by Michael Glad.
|
||||
|
||||
* The `ftw' function was contributed by Ian Lance Taylor.
|
||||
|
||||
* The startup code to support SunOS shared libraries was contributed
|
||||
by Tom Quinn.
|
||||
|
||||
* The `mktime' function was contributed by Paul Eggert.
|
||||
|
||||
* The port to the Sequent Symmetry running Dynix version 3
|
||||
(`i386-sequent-bsd') was contributed by Jason Merrill.
|
||||
|
||||
* The timezone support code is derived from the public-domain
|
||||
timezone package by Arthur David Olson and his many contributors.
|
||||
|
||||
* The port to the DEC Alpha running OSF/1 (`alpha-dec-osf1') was
|
||||
contributed by Brendan Kehoe, using some code written by Roland
|
||||
McGrath.
|
||||
|
||||
* The port to SGI machines running Irix 4 (`mips-sgi-irix4') was
|
||||
contributed by Tom Quinn.
|
||||
|
||||
* The port of the Mach and Hurd code to the MIPS architecture
|
||||
(`mips-ANYTHING-gnu') was contributed by Kazumoto Kojima.
|
||||
|
||||
* The floating-point printing function used by `printf' and friends
|
||||
and the floating-point reading function used by `scanf', `strtod'
|
||||
and friends were written by Ulrich Drepper. The multi-precision
|
||||
integer functions used in those functions are taken from GNU MP,
|
||||
which was contributed by Torbjorn Granlund.
|
||||
|
||||
* The internationalization support in the library, and the support
|
||||
programs `locale' and `localedef', were written by Ulrich Drepper.
|
||||
Ulrich Drepper adapted the support code for message catalogs
|
||||
(`libintl.h', etc.) from the GNU `gettext' package, which he also
|
||||
wrote. He also contributed the `catgets' support and the entire
|
||||
suite of multi-byte and wide-character support functions
|
||||
(`wctype.h', `wchar.h', etc.).
|
||||
|
||||
* The implementations of the `nsswitch.conf' mechanism and the files
|
||||
and DNS backends for it were designed and written by Ulrich
|
||||
Drepper and Roland McGrath, based on a backend interface defined
|
||||
by Peter Eriksson.
|
||||
|
||||
* The port to Linux i386/ELF (`i386-ANYTHING-linux') was contributed
|
||||
by Ulrich Drepper, based in large part on work done in Hongjiu
|
||||
Lu's Linux version of the GNU C Library.
|
||||
|
||||
* The port to Linux/m68k (`m68k-ANYTHING-linux') was contributed by
|
||||
Andreas Schwab.
|
||||
|
||||
* Richard Henderson contributed the ELF dynamic linking code and
|
||||
other support for the Alpha processor.
|
||||
|
||||
* David Mosberger-Tang contributed the port to Linux/Alpha
|
||||
(`alpha-ANYTHING-linux').
|
||||
|
||||
* Stephen R. van den Berg contributed a highly-optimized `strstr'
|
||||
function.
|
||||
|
||||
* Ulrich Drepper contributed the `hsearch' and `drand48' families of
|
||||
functions; reentrant `...`_r'' versions of the `random' family;
|
||||
System V shared memory and IPC support code; and several
|
||||
highly-optimized string functions for iX86 processors.
|
||||
|
||||
* The math functions are taken from `fdlibm-5.1' by Sun
|
||||
Microsystems, as modified by J.T. Conklin, Ian Lance Taylor,
|
||||
Ulrich Drepper, Andreas Schwab, and Roland McGrath.
|
||||
|
||||
* The `libio' library used to implement `stdio' functions on some
|
||||
platforms was written by Per Bothner and modified by Ulrich
|
||||
Drepper.
|
||||
|
||||
* The Internet-related code (most of the `inet' subdirectory) and
|
||||
several other miscellaneous functions and header files have been
|
||||
included from 4.4 BSD with little or no modification.
|
||||
|
||||
All code incorporated from 4.4 BSD is under the following
|
||||
copyright:
|
||||
|
@ -694,70 +823,7 @@ on by other people.
|
|||
changes to fit into the GNU C library and to fit the ANSI C
|
||||
standard, but the functional code is Berkeley's.
|
||||
|
||||
* The merge sort function `qsort' was written by Michael J. Haertel.
|
||||
|
||||
* The quick sort function used as a fallback by `qsort' was written
|
||||
by Douglas C. Schmidt.
|
||||
|
||||
* The memory allocation functions `malloc', `realloc' and `free' and
|
||||
related code were written by Michael J. Haertel.
|
||||
|
||||
* Fast implementations of many of the string functions (`memcpy',
|
||||
`strlen', etc.) were written by Torbjorn Granlund.
|
||||
|
||||
* Some of the support code for Mach is taken from Mach 3.0 by CMU,
|
||||
and is under the following copyright terms:
|
||||
|
||||
Mach Operating System
|
||||
Copyright (C) 1991,1990,1989 Carnegie Mellon University
|
||||
All Rights Reserved.
|
||||
|
||||
Permission to use, copy, modify and distribute this software
|
||||
and its documentation is hereby granted, provided that both
|
||||
the copyright notice and this permission notice appear in all
|
||||
copies of the software, derivative works or modified
|
||||
versions, and any portions thereof, and that both notices
|
||||
appear in supporting documentation.
|
||||
|
||||
CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS
|
||||
IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF
|
||||
ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
|
||||
THIS SOFTWARE.
|
||||
|
||||
Carnegie Mellon requests users of this software to return to
|
||||
|
||||
Software Distribution Coordinator
|
||||
School of Computer Science
|
||||
Carnegie Mellon University
|
||||
Pittsburgh PA 15213-3890
|
||||
|
||||
or `Software.Distribution@CS.CMU.EDU' any improvements or
|
||||
extensions that they make and grant Carnegie Mellon the
|
||||
rights to redistribute these changes.
|
||||
|
||||
* The `tar.h' header file was written by David J. MacKenzie.
|
||||
|
||||
* The port to the MIPS DECStation running Ultrix 4
|
||||
(`mips-dec-ultrix4') was contributed by Brendan Kehoe and Ian
|
||||
Lance Taylor.
|
||||
|
||||
* The DES encryption function `crypt' and related functions were
|
||||
contributed by Michael Glad.
|
||||
|
||||
* The `ftw' function was contributed by Ian Lance Taylor.
|
||||
|
||||
* The code to support SunOS shared libraries was contributed by Tom
|
||||
Quinn.
|
||||
|
||||
* The `mktime' function was contributed by Noel Cragg.
|
||||
|
||||
* The port to the Sequent Symmetry running Dynix version 3
|
||||
(`i386-sequent-bsd') was contributed by Jason Merrill.
|
||||
|
||||
* The timezone support code is derived from the public-domain
|
||||
timezone package by Arthur David Olson.
|
||||
|
||||
* The Internet resolver code is taken directly from BIND 4.9.1,
|
||||
* The Internet resolver code is taken directly from BIND 4.9.4,
|
||||
which is under both the Berkeley copyright above and also:
|
||||
|
||||
Portions Copyright (C) 1993 by Digital Equipment Corporation.
|
||||
|
@ -780,15 +846,6 @@ on by other people.
|
|||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
* The port to the DEC Alpha running OSF/1 (`alpha-dec-osf1') was
|
||||
contributed by Brendan Kehoe, using some code written by Roland
|
||||
McGrath.
|
||||
|
||||
* The floating-point printing function used by `printf' and friends
|
||||
was written by Roland McGrath and Torbjorn Granlund. The
|
||||
multi-precision integer functions used in that function are taken
|
||||
from GNU MP, which was contributed by Torbjorn Granlund.
|
||||
|
||||
* The code to support Sun RPC is taken verbatim from Sun's
|
||||
RPCSRC-4.0 distribution, and is covered by this copyright:
|
||||
|
||||
|
@ -824,9 +881,33 @@ on by other people.
|
|||
2550 Garcia Avenue
|
||||
Mountain View, California 94043
|
||||
|
||||
* The port to SGI machines running Irix 4 (`mips-sgi-irix4') was
|
||||
contributed by Tom Quinn.
|
||||
* Some of the support code for Mach is taken from Mach 3.0 by CMU,
|
||||
and is under the following copyright terms:
|
||||
|
||||
* The port of the Mach and Hurd code to the MIPS architecture
|
||||
(`mips-ANYTHING-gnu') was contribued by Kazumoto Kojima.
|
||||
Mach Operating System
|
||||
Copyright (C) 1991,1990,1989 Carnegie Mellon University
|
||||
All Rights Reserved.
|
||||
|
||||
Permission to use, copy, modify and distribute this software
|
||||
and its documentation is hereby granted, provided that both
|
||||
the copyright notice and this permission notice appear in all
|
||||
copies of the software, derivative works or modified
|
||||
versions, and any portions thereof, and that both notices
|
||||
appear in supporting documentation.
|
||||
|
||||
CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS
|
||||
IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF
|
||||
ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
|
||||
THIS SOFTWARE.
|
||||
|
||||
Carnegie Mellon requests users of this software to return to
|
||||
|
||||
Software Distribution Coordinator
|
||||
School of Computer Science
|
||||
Carnegie Mellon University
|
||||
Pittsburgh PA 15213-3890
|
||||
|
||||
or `Software.Distribution@CS.CMU.EDU' any improvements or
|
||||
extensions that they make and grant Carnegie Mellon the
|
||||
rights to redistribute these changes.
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ catopen (const char *cat_name, int flag)
|
|||
|
||||
result->status = closed;
|
||||
|
||||
result->cat_name = strdup (cat_name);
|
||||
result->cat_name = __strdup (cat_name);
|
||||
if (result->cat_name == NULL)
|
||||
{
|
||||
free (result);
|
||||
|
@ -71,7 +71,7 @@ catopen (const char *cat_name, int flag)
|
|||
env_var = "C";
|
||||
}
|
||||
|
||||
result->env_var = strdup (env_var);
|
||||
result->env_var = __strdup (env_var);
|
||||
if (result->env_var == NULL)
|
||||
{
|
||||
free ((void *) result->cat_name);
|
||||
|
@ -80,9 +80,9 @@ catopen (const char *cat_name, int flag)
|
|||
}
|
||||
|
||||
if (getenv ("NLSPATH") != NULL)
|
||||
result->nlspath = strdup (getenv ("NLSPATH"));
|
||||
result->nlspath = __strdup (getenv ("NLSPATH"));
|
||||
else
|
||||
result->nlspath = strdup (NLSPATH);
|
||||
result->nlspath = __strdup (NLSPATH);
|
||||
|
||||
if (result->nlspath == NULL)
|
||||
{
|
||||
|
|
|
@ -79,12 +79,12 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
case 'N':
|
||||
/* Use the catalog name. */
|
||||
ENOUGH (strlen (catalog->cat_name));
|
||||
bufact = stpcpy (&buf[bufact], catalog->cat_name) - buf;
|
||||
bufact = __stpcpy (&buf[bufact], catalog->cat_name) - buf;
|
||||
break;
|
||||
case 'L':
|
||||
/* Use the current locale category value. */
|
||||
ENOUGH (strlen (catalog->env_var));
|
||||
bufact = stpcpy (&buf[bufact], catalog->env_var) - buf;
|
||||
bufact = __stpcpy (&buf[bufact], catalog->env_var) - buf;
|
||||
break;
|
||||
case 'l':
|
||||
/* Use language element of locale category value. */
|
||||
|
@ -152,7 +152,7 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
|
||||
if (bufact != 0)
|
||||
{
|
||||
fd = open (buf, O_RDONLY);
|
||||
fd = __open (buf, O_RDONLY);
|
||||
if (fd >= 0)
|
||||
break;
|
||||
}
|
||||
|
@ -161,7 +161,7 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
}
|
||||
}
|
||||
|
||||
if (fd < 0 || fstat (fd, &st) < 0)
|
||||
if (fd < 0 || __fstat (fd, &st) < 0)
|
||||
{
|
||||
catalog->status = nonexisting;
|
||||
return;
|
||||
|
@ -181,8 +181,8 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
#endif
|
||||
catalog->file_size = st.st_size;
|
||||
catalog->file_ptr =
|
||||
(struct catalog_obj *) mmap (NULL, st.st_size, PROT_READ,
|
||||
MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0);
|
||||
(struct catalog_obj *) __mmap (NULL, st.st_size, PROT_READ,
|
||||
MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0);
|
||||
if (catalog->file_ptr != (struct catalog_obj *) -1)
|
||||
/* Tell the world we managed to mmap the file. */
|
||||
catalog->status = mmaped;
|
||||
|
@ -201,8 +201,8 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
/* Save read, handle partial reads. */
|
||||
do
|
||||
{
|
||||
size_t now = read (fd, (((char *) &catalog->file_ptr)
|
||||
+ (st.st_size - todo)), todo);
|
||||
size_t now = __read (fd, (((char *) &catalog->file_ptr)
|
||||
+ (st.st_size - todo)), todo);
|
||||
if (now == 0)
|
||||
{
|
||||
free ((void *) catalog->file_ptr);
|
||||
|
@ -216,7 +216,7 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
}
|
||||
|
||||
/* We don't need the file anymore. */
|
||||
close (fd);
|
||||
__close (fd);
|
||||
|
||||
/* Determine whether the file is a catalog file and if yes whether
|
||||
it is written using the correct byte order. Else we have to swap
|
||||
|
@ -230,7 +230,7 @@ __open_catalog (__nl_catd catalog, int with_path)
|
|||
/* Illegal file. Free he resources and mark catalog as not
|
||||
usable. */
|
||||
if (catalog->status == mmaped)
|
||||
munmap ((void *) catalog->file_ptr, catalog->file_size);
|
||||
__munmap ((void *) catalog->file_ptr, catalog->file_size);
|
||||
else
|
||||
free (catalog->file_ptr);
|
||||
catalog->status = nonexisting;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
# From configure.in CVSid
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated automatically using autoconf version 2.10
|
||||
# Generated automatically using autoconf version 2.99
|
||||
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
#
|
||||
# This configure script is free software; the Free Software Foundation
|
||||
|
@ -355,7 +355,7 @@ EOF
|
|||
verbose=yes ;;
|
||||
|
||||
-version | --version | --versio | --versi | --vers)
|
||||
echo "configure generated by autoconf version 2.10"
|
||||
echo "configure generated by autoconf version 2.99"
|
||||
exit 0 ;;
|
||||
|
||||
-with-* | --with-*)
|
||||
|
@ -682,6 +682,7 @@ done
|
|||
if test -z "$ac_aux_dir"; then
|
||||
{ echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
|
||||
fi
|
||||
ac_config_mkinstalldirs=$ac_aux_dir/mkinstalldirs
|
||||
ac_config_guess=$ac_aux_dir/config.guess
|
||||
ac_config_sub=$ac_aux_dir/config.sub
|
||||
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
|
||||
|
@ -745,7 +746,7 @@ case "$machine" in
|
|||
a29k | am29000) base_machine=a29k machine=a29k ;;
|
||||
alpha*) base_machine=alpha machine=alpha/$machine ;;
|
||||
hppa*) base_machine=hppa machine=hppa/$machine ;;
|
||||
i[345]86) base_machine=i386 machine=i386/$machine ;;
|
||||
i[3456]86) base_machine=i386 machine=i386/$machine ;;
|
||||
m680?0) base_machine=m68k machine=m68k/$machine ;;
|
||||
m68k) base_machine=m68k machine=m68k/m68020 ;;
|
||||
m88???) base_machine=m88k machine=m88k/$machine ;;
|
||||
|
@ -973,6 +974,10 @@ fi
|
|||
fi
|
||||
echo "$ac_t""$INSTALL" 1>&6
|
||||
|
||||
# The purpose of this command is only to make sure the auxiliary path
|
||||
# is set and that the symbol AC_REQUIRE_AC_PROG_MKINSTALLDIRS is set.
|
||||
|
||||
|
||||
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
|
||||
# It thinks the first close brace ends the variable substitution.
|
||||
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
|
||||
|
@ -1134,13 +1139,13 @@ else
|
|||
# On the NeXT, cc -E runs the code through the compiler's parser,
|
||||
# not just through cpp.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1138 "configure"
|
||||
#line 1143 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:1144: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:1149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
|
@ -1149,13 +1154,13 @@ else
|
|||
rm -rf conftest*
|
||||
CPP="${CC-cc} -E -traditional-cpp"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1153 "configure"
|
||||
#line 1158 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:1159: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:1164: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
|
@ -1297,7 +1302,7 @@ 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 1301 "configure"
|
||||
#line 1306 "configure"
|
||||
#include "confdefs.h"
|
||||
#define __need_size_t
|
||||
#define __need_wchar_t
|
||||
|
@ -1313,7 +1318,7 @@ size_t size; wchar_t wchar;
|
|||
if (&size == NULL || &wchar == NULL) abort ();
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:1322: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_friendly_stddef=yes
|
||||
else
|
||||
|
@ -1420,7 +1425,7 @@ 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 1424 "configure"
|
||||
#line 1429 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() { return 0; }
|
||||
|
@ -1430,7 +1435,7 @@ asm (".section .init");
|
|||
asm (".text");
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1434: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:1439: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_have_initfini=yes
|
||||
else
|
||||
|
@ -1458,7 +1463,7 @@ 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 1462 "configure"
|
||||
#line 1467 "configure"
|
||||
#include "confdefs.h"
|
||||
asm ("_glibc_foobar:");
|
||||
int main() { return 0; }
|
||||
|
@ -1466,7 +1471,7 @@ int t() {
|
|||
glibc_foobar ();
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
|
||||
if { (eval echo configure:1475: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_asm_underscores=yes
|
||||
else
|
||||
|
@ -1558,7 +1563,7 @@ _start () {}
|
|||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-nostdlib -nostartfiles -Wl,--no-whole-archive
|
||||
-o conftest conftest.c'; { (eval echo configure:1562: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
-o conftest conftest.c'; { (eval echo configure:1567: \"$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
|
||||
|
@ -1769,7 +1774,7 @@ do
|
|||
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
|
||||
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
|
||||
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.10"
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.99"
|
||||
exit 0 ;;
|
||||
-help | --help | --hel | --he | --h)
|
||||
echo "\$ac_cs_usage"; exit 0 ;;
|
||||
|
|
|
@ -69,8 +69,6 @@ $(objpfx)dl-allobjs.so: $(rtld-routines:%=$(objpfx)%.so)
|
|||
$(reloc-link) $^
|
||||
|
||||
# Link together the dynamic linker into a single relocatable object.
|
||||
# We use this to produce both the ABI-compliant and Linux-compatible
|
||||
# dynamic linker shared objects below.
|
||||
$(objpfx)librtld.so: $(objpfx)dl-allobjs.so $(common-objpfx)libc_pic.a
|
||||
$(reloc-link) '-Wl,-(' $^ -lgcc '-Wl,-)'
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ _dl_open (const char *file, int mode)
|
|||
else
|
||||
{
|
||||
if (_dl_global_scope_alloc <
|
||||
_dl_global_scope_end - _dl_global_scope + 2)
|
||||
(size_t) (_dl_global_scope_end - _dl_global_scope + 2))
|
||||
{
|
||||
/* Must extend the list. */
|
||||
struct link_map **new = realloc (_dl_global_scope,
|
||||
|
|
|
@ -20,6 +20,8 @@ Cambridge, MA 02139, USA. */
|
|||
#include <assert.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* This file defines some things that for the dynamic linker are defined in
|
||||
rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking. */
|
||||
|
@ -46,3 +48,38 @@ _dl_sysdep_fatal (void)
|
|||
{
|
||||
assert (! "_dl_sysdep_fatal called");
|
||||
}
|
||||
|
||||
/* Read the whole contents of FILE into new mmap'd space with given
|
||||
protections. *SIZEP gets the size of the file. */
|
||||
|
||||
void *
|
||||
_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
|
||||
{
|
||||
void *result;
|
||||
struct stat st;
|
||||
int fd = __open (file, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
if (__fstat (fd, &st) < 0)
|
||||
result = NULL;
|
||||
else
|
||||
{
|
||||
/* Map a copy of the file contents. */
|
||||
result = __mmap (0, st.st_size, prot,
|
||||
#ifdef MAP_COPY
|
||||
MAP_COPY
|
||||
#else
|
||||
MAP_PRIVATE
|
||||
#endif
|
||||
#ifdef MAP_FILE
|
||||
| MAP_FILE
|
||||
#endif
|
||||
, fd, 0);
|
||||
if (result == (void *) -1)
|
||||
result = NULL;
|
||||
else
|
||||
*sizep = st.st_size;
|
||||
}
|
||||
__close (fd);
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ const char _nl_C_LC_CTYPE_class[768] =
|
|||
/* 0xec */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
|
||||
/* 0xf2 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
|
||||
/* 0xf8 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
|
||||
/* 0xfe */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
|
||||
/* 0xfe */ "\002\000" "\000\000" "\002\000" "\002\000" "\002\000" "\002\000"
|
||||
/* 0x04 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\003\040"
|
||||
/* 0x0a */ "\002\040" "\002\040" "\002\040" "\002\040" "\002\000" "\002\000"
|
||||
/* 0x10 */ "\002\000" "\002\000" "\002\000" "\002\000" "\002\000" "\002\000"
|
||||
|
@ -342,11 +342,13 @@ const struct locale_data _nl_C_LC_CTYPE =
|
|||
#endif
|
||||
{ string: (const char *) _nl_C_LC_CTYPE_toupper },
|
||||
{ string: (const char *) _nl_C_LC_CTYPE_tolower },
|
||||
{ string: NULL },
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
{ string: NULL },
|
||||
{ string: NULL }, { string: NULL },
|
||||
#endif
|
||||
{ string: _nl_C_LC_CTYPE_class32 },
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
{ string: NULL },
|
||||
#endif
|
||||
{ string: (const char *) _nl_C_LC_CTYPE_names },
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
{ string: NULL },
|
||||
|
|
|
@ -79,8 +79,9 @@ DEFINE_CATEGORY
|
|||
DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EB, "ctype-tolower-eb", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_TOUPPER_EL, "ctype-toupper-el", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_TOLOWER_EL, "ctype-tolower-el", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_CLASS32, "ctype-class32", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_NAMES_EB, "ctype-names-eb", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL, "ctype-names-eb", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_NAMES_EL, "ctype-names-el", std, string)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_HASH_SIZE, "ctype-hash-size", std, word)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_HASH_LAYERS, "ctype-hash-layers", std, word)
|
||||
DEFINE_ELEMENT (_NL_CTYPE_CLASS_NAMES, "ctype-class-names", std, string)
|
||||
|
|
|
@ -19,6 +19,7 @@ Boston, MA 02111-1307, USA. */
|
|||
#include <alloca.h>
|
||||
#include <argz.h>
|
||||
#include <errno.h>
|
||||
#include <libc-lock.h>
|
||||
#include <locale.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -93,7 +94,7 @@ extern void postload (void);
|
|||
|
||||
/* Define an array indexed by category of postload functions to call after
|
||||
loading and installing that category's data. */
|
||||
void (*const _nl_category_postload[]) (void) =
|
||||
static void (*const _nl_category_postload[]) (void) =
|
||||
{
|
||||
#define DEFINE_CATEGORY(category, category_name, items, postload, b, c, d) \
|
||||
[category] = postload,
|
||||
|
@ -114,6 +115,9 @@ static const char *_nl_current_names[] =
|
|||
};
|
||||
|
||||
|
||||
/* Lock for protecting global data. */
|
||||
__libc_lock_define_initialized (static, lock)
|
||||
|
||||
|
||||
/* Use this when we come along an error. */
|
||||
#define ERROR_RETURN \
|
||||
|
@ -238,8 +242,8 @@ setlocale (int category, const char *locale)
|
|||
return (char *) _nl_current_names[category];
|
||||
|
||||
/* We perhaps really have to load some data. So we determine the
|
||||
path in which to look for the data now. But this environment
|
||||
variable must only be used when the binary has no SUID or SGID
|
||||
path in which to look for the data now. The environment variable
|
||||
`LOCPATH' must only be used when the binary has no SUID or SGID
|
||||
bit set. */
|
||||
locale_path = NULL;
|
||||
locale_path_len = 0;
|
||||
|
@ -309,6 +313,9 @@ setlocale (int category, const char *locale)
|
|||
ERROR_RETURN;
|
||||
}
|
||||
|
||||
/* Protect global data. */
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
/* Load the new data for each category. */
|
||||
while (category-- > 0)
|
||||
/* Only actually load the data if anything will use it. */
|
||||
|
@ -319,25 +326,7 @@ setlocale (int category, const char *locale)
|
|||
&newnames[category]);
|
||||
|
||||
if (newdata[category] == NULL)
|
||||
{
|
||||
/* Loading this part of the locale failed. Abort the
|
||||
composite load. */
|
||||
int save_errno;
|
||||
abort_composite:
|
||||
save_errno = errno;
|
||||
|
||||
while (++category < LC_ALL)
|
||||
if (_nl_current[category] != NULL
|
||||
&& newdata[category] != _nl_C[category])
|
||||
_nl_free_locale (newdata[category]);
|
||||
else
|
||||
if (_nl_current[category] == NULL
|
||||
&& newnames[category] != _nl_C_name)
|
||||
free (newnames[category]);
|
||||
|
||||
errno = save_errno;
|
||||
return NULL;
|
||||
}
|
||||
goto abort_composite;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -351,17 +340,39 @@ setlocale (int category, const char *locale)
|
|||
composite = new_composite_name (LC_ALL, newnames);
|
||||
if (composite == NULL)
|
||||
{
|
||||
/* Loading this part of the locale failed. Abort the
|
||||
composite load. */
|
||||
int save_errno;
|
||||
|
||||
category = -1;
|
||||
goto abort_composite;
|
||||
abort_composite:
|
||||
save_errno = errno;
|
||||
|
||||
while (++category < LC_ALL)
|
||||
if (_nl_current[category] != NULL
|
||||
&& newdata[category] != _nl_C[category])
|
||||
_nl_free_locale (newdata[category]);
|
||||
else
|
||||
if (_nl_current[category] == NULL
|
||||
&& newnames[category] != _nl_C_name)
|
||||
free (newnames[category]);
|
||||
|
||||
errno = save_errno;
|
||||
composite = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Now we have loaded all the new data. Put it in place. */
|
||||
for (category = 0; category < LC_ALL; ++category)
|
||||
{
|
||||
setdata (category, newdata[category]);
|
||||
setname (category, newnames[category]);
|
||||
}
|
||||
setname (LC_ALL, composite);
|
||||
}
|
||||
|
||||
/* Now we have loaded all the new data. Put it in place. */
|
||||
for (category = 0; category < LC_ALL; ++category)
|
||||
{
|
||||
setdata (category, newdata[category]);
|
||||
setname (category, newnames[category]);
|
||||
}
|
||||
setname (LC_ALL, composite);
|
||||
/* Critical section left. */
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
@ -370,6 +381,9 @@ setlocale (int category, const char *locale)
|
|||
const struct locale_data *newdata = NULL;
|
||||
char *newname = NULL;
|
||||
|
||||
/* Protect global data. */
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (_nl_current[category] != NULL)
|
||||
{
|
||||
/* Only actually load the data if anything will use it. */
|
||||
|
@ -377,7 +391,7 @@ setlocale (int category, const char *locale)
|
|||
newdata = _nl_find_locale (locale_path, locale_path_len, category,
|
||||
(char **) &newname);
|
||||
if (newdata == NULL)
|
||||
return NULL;
|
||||
goto abort_single;
|
||||
}
|
||||
|
||||
/* Create new composite name. */
|
||||
|
@ -392,14 +406,20 @@ setlocale (int category, const char *locale)
|
|||
_nl_free_locale (newdata);
|
||||
|
||||
errno = save_errno;
|
||||
return NULL;
|
||||
abort_single:
|
||||
newname = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_nl_current[category] != NULL)
|
||||
setdata (category, newdata);
|
||||
|
||||
setname (category, newname);
|
||||
setname (LC_ALL, composite);
|
||||
}
|
||||
|
||||
if (_nl_current[category] != NULL)
|
||||
setdata (category, newdata);
|
||||
|
||||
setname (category, newname);
|
||||
setname (LC_ALL, composite);
|
||||
/* Critical section left. */
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
return newname;
|
||||
}
|
||||
|
|
|
@ -223,8 +223,8 @@ following patterns:
|
|||
|
||||
@smallexample
|
||||
alpha-dec-osf1
|
||||
alpha-gnu-linux
|
||||
alpha-gnu-linuxecoff
|
||||
alpha-@var{anything}-linux
|
||||
alpha-@var{anything}-linuxecoff
|
||||
i@var{x}86-@var{anything}-bsd4.3
|
||||
i@var{x}86-@var{anything}-gnu
|
||||
i@var{x}86-@var{anything}-isc2.2
|
||||
|
|
|
@ -756,7 +756,7 @@ the padding needed to start each object on a suitable boundary.
|
|||
* Obstacks Data Alignment:: Controlling alignment of objects in obstacks.
|
||||
* Obstack Chunks:: How obstacks obtain and release chunks;
|
||||
efficiency considerations.
|
||||
* Summary of Obstacks::
|
||||
* Summary of Obstacks::
|
||||
@end menu
|
||||
|
||||
@node Creating Obstacks
|
||||
|
@ -1182,7 +1182,7 @@ When you check for space using @code{obstack_room} and there is not
|
|||
enough room for what you want to add, the fast growth functions
|
||||
are not safe. In this case, simply use the corresponding ordinary
|
||||
growth function instead. Very soon this will copy the object to a
|
||||
new chunk; then there will be lots of room available again.
|
||||
new chunk; then there will be lots of room available again.
|
||||
|
||||
So, each time you use an ordinary growth function, check afterward for
|
||||
sufficient space using @code{obstack_room}. Once the object is copied
|
||||
|
@ -1206,7 +1206,7 @@ add_string (struct obstack *obstack, const char *ptr, int len)
|
|||
obstack_1grow (obstack, *ptr++);
|
||||
len--;
|
||||
@}
|
||||
else
|
||||
else
|
||||
@{
|
||||
if (room > len)
|
||||
room = len;
|
||||
|
@ -1494,8 +1494,7 @@ int
|
|||
open2 (char *str1, char *str2, int flags, int mode)
|
||||
@{
|
||||
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
|
||||
strcpy (name, str1);
|
||||
strcat (name, str2);
|
||||
stpcpy (stpcpy (name, str1), str2);
|
||||
return open (name, flags, mode);
|
||||
@}
|
||||
@end smallexample
|
||||
|
@ -1512,8 +1511,7 @@ open2 (char *str1, char *str2, int flags, int mode)
|
|||
int desc;
|
||||
if (name == 0)
|
||||
fatal ("virtual memory exceeded");
|
||||
strcpy (name, str1);
|
||||
strcat (name, str2);
|
||||
stpcpy (stpcpy (name, str1), str2);
|
||||
desc = open (name, flags, mode);
|
||||
free (name);
|
||||
return desc;
|
||||
|
@ -1558,8 +1556,7 @@ int
|
|||
open2 (char *str1, char *str2, int flags, int mode)
|
||||
@{
|
||||
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
|
||||
strcpy (name, str1);
|
||||
strcat (name, str2);
|
||||
stpcpy (stpcpy (name, str1), str2);
|
||||
return open_or_report_error (name, flags, mode);
|
||||
@}
|
||||
@end smallexample
|
||||
|
@ -1606,8 +1603,7 @@ variable size. Here is how @code{open2} would look then:
|
|||
int open2 (char *str1, char *str2, int flags, int mode)
|
||||
@{
|
||||
char name[strlen (str1) + strlen (str2) + 1];
|
||||
strcpy (name, str1);
|
||||
strcat (name, str2);
|
||||
stpcpy (stpcpy (name, str1), str2);
|
||||
return open (name, flags, mode);
|
||||
@}
|
||||
@end smallexample
|
||||
|
@ -1748,4 +1744,3 @@ Normally it ought to display the string for the user to read.
|
|||
The warnings come when memory becomes 75% full, when it becomes 85%
|
||||
full, and when it becomes 95% full. Above 95% you get another warning
|
||||
each time memory usage increases.
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ many programs. The GNU C library provides an extensive set of string
|
|||
utility functions, including functions for copying, concatenating,
|
||||
comparing, and searching strings. Many of these functions can also
|
||||
operate on arbitrary regions of storage; for example, the @code{memcpy}
|
||||
function can be used to copy the contents of any kind of array.
|
||||
function can be used to copy the contents of any kind of array.
|
||||
|
||||
It's fairly common for beginning C programmers to ``reinvent the wheel''
|
||||
by duplicating this functionality in their own code, but it pays to
|
||||
|
@ -158,7 +158,7 @@ get the allocation size of the character array that holds a string using
|
|||
the @code{sizeof} operator:
|
||||
|
||||
@smallexample
|
||||
char string[32] = "hello, world";
|
||||
char string[32] = "hello, world";
|
||||
sizeof (string)
|
||||
@result{} 32
|
||||
strlen (string)
|
||||
|
@ -411,7 +411,7 @@ return a nonzero value if the strings are @emph{not} equivalent rather
|
|||
than if they are. The sign of the value indicates the relative ordering
|
||||
of the first characters in the strings that are not equivalent: a
|
||||
negative value indicates that the first string is ``less'' than the
|
||||
second, while a positive value indicates that the first string is
|
||||
second, while a positive value indicates that the first string is
|
||||
``greater''.
|
||||
|
||||
The most common use of these functions is to check only for equality.
|
||||
|
@ -623,10 +623,10 @@ overlap; see @ref{Copying and Concatenation}.
|
|||
|
||||
The return value is the length of the entire transformed string. This
|
||||
value is not affected by the value of @var{size}, but if it is greater
|
||||
than @var{size}, it means that the transformed string did not entirely
|
||||
fit in the array @var{to}. In this case, only as much of the string as
|
||||
actually fits was stored. To get the whole transformed string, call
|
||||
@code{strxfrm} again with a bigger output array.
|
||||
or equal than @var{size}, it means that the transformed string did not
|
||||
entirely fit in the array @var{to}. In this case, only as much of the
|
||||
string as actually fits was stored. To get the whole transformed
|
||||
string, call @code{strxfrm} again with a bigger output array.
|
||||
|
||||
The transformed string may be longer than the original string, and it
|
||||
may also be shorter.
|
||||
|
@ -671,23 +671,32 @@ sort_strings_fast (char **array, int nstrings)
|
|||
for (i = 0; i < nstrings; i++)
|
||||
@{
|
||||
size_t length = strlen (array[i]) * 2;
|
||||
char *transformed;
|
||||
size_t transformed_lenght;
|
||||
|
||||
temp_array[i].input = array[i];
|
||||
|
||||
/* @r{Transform @code{array[i]}.}
|
||||
@r{First try a buffer probably big enough.} */
|
||||
while (1)
|
||||
/* @r{First try a buffer perhaps big enough.} */
|
||||
transformed = (char *) xmalloc (length);
|
||||
|
||||
/* @r{Transform @code{array[i]}.} */
|
||||
transformed_length = strxfrm (transformed, array[i], length);
|
||||
|
||||
/* @r{If the buffer was not large enough, resize it}
|
||||
@r{and try again.} */
|
||||
if (transformed_length >= length)
|
||||
@{
|
||||
char *transformed = (char *) xmalloc (length);
|
||||
if (strxfrm (transformed, array[i], length) < length)
|
||||
@{
|
||||
temp_array[i].transformed = transformed;
|
||||
break;
|
||||
@}
|
||||
/* @r{Try again with a bigger buffer.} */
|
||||
free (transformed);
|
||||
length *= 2;
|
||||
/* @r{Allocate the needed space. +1 for terminating}
|
||||
@r{@code{NUL} character.} */
|
||||
transformed = (char *) xrealloc (transformed,
|
||||
transformed_length + 1);
|
||||
|
||||
/* @r{The return value is not interesting because we know}
|
||||
@r{how long the transformed string is.} */
|
||||
(void) strxfrm (transformed, array[i], transformed_length + 1);
|
||||
@}
|
||||
|
||||
temp_array[i].transformed = transformed;
|
||||
@}
|
||||
|
||||
/* @r{Sort @code{temp_array} by comparing transformed strings.} */
|
||||
|
@ -741,7 +750,7 @@ strchr ("hello, world", 'l')
|
|||
@result{} "llo, world"
|
||||
strchr ("hello, world", '?')
|
||||
@result{} NULL
|
||||
@end smallexample
|
||||
@end smallexample
|
||||
|
||||
The terminating null character is considered to be part of the string,
|
||||
so you can use this function get a pointer to the end of a string by
|
||||
|
@ -857,8 +866,6 @@ strpbrk ("hello, world", " \t\n,.;!?")
|
|||
@node Finding Tokens in a String, , Search Functions, String and Array Utilities
|
||||
@section Finding Tokens in a String
|
||||
|
||||
@c !!! Document strsep, which is a better thing to use than strtok.
|
||||
|
||||
@cindex tokenizing strings
|
||||
@cindex breaking a string into tokens
|
||||
@cindex parsing tokens from a string
|
||||
|
@ -945,3 +952,61 @@ token = strtok (NULL, delimiters); /* token => "and" */
|
|||
token = strtok (NULL, delimiters); /* token => "punctuation" */
|
||||
token = strtok (NULL, delimiters); /* token => NULL */
|
||||
@end smallexample
|
||||
|
||||
The GNU C library contains two more functions for tokenizing a string
|
||||
which overcome the limitation of non-reentrancy.
|
||||
|
||||
@comment string.h
|
||||
@comment POSIX
|
||||
@deftypefun {char *} strtok_r (char *@var{newstring}, const char *@var{delimiters}, char **@var{save_ptr})
|
||||
Just like @code{strtok} this function splits the string into several
|
||||
tokens which can be accessed be successive calls to @code{strtok_r}.
|
||||
The difference is that the information about the next token is not set
|
||||
up in some internal state information. Instead the caller has to
|
||||
provide another argument @var{save_ptr} which is a pointer to a string
|
||||
pointer. Calling @code{strtok_r} with a null pointer for
|
||||
@var{newstring} and leaving @var{save_ptr} between the calls unchanged
|
||||
does the job without limiting reentrancy.
|
||||
|
||||
This function was proposed for POSIX.1b and can be found on many systems
|
||||
which support multi-threading.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment BSD
|
||||
@deftypefun {char *} strsep (char **@var{string_ptr}, const char *@var{delimiter})
|
||||
A second reentrant approach is to avoid the additional first argument.
|
||||
The initialization of the moving pointer has to be done by the user.
|
||||
Successive calls of @code{strsep} move the pointer along the tokens
|
||||
separated by @var{delimiter}, returning the address of the next token
|
||||
and updating @var{string_ptr} to point to the beginning of the next
|
||||
token.
|
||||
|
||||
This function was introduced in 4.3BSD and therefore is widely available.
|
||||
@end deftypefun
|
||||
|
||||
Here is how the above example looks like when @code{strsep} is used.
|
||||
|
||||
@comment Yes, this example has been tested.
|
||||
@smallexample
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
|
||||
@dots{}
|
||||
|
||||
char string[] = "words separated by spaces -- and, punctuation!";
|
||||
const char delimiters[] = " .,;:!-";
|
||||
char *running;
|
||||
char *token;
|
||||
|
||||
@dots{}
|
||||
|
||||
running = string;
|
||||
token = strsep (&running, delimiters); /* token => "words" */
|
||||
token = strsep (&running, delimiters); /* token => "separated" */
|
||||
token = strsep (&running, delimiters); /* token => "by" */
|
||||
token = strsep (&running, delimiters); /* token => "spaces" */
|
||||
token = strsep (&running, delimiters); /* token => "and" */
|
||||
token = strsep (&running, delimiters); /* token => "punctuation" */
|
||||
token = strsep (&running, delimiters); /* token => NULL */
|
||||
@end smallexample
|
||||
|
|
|
@ -28,7 +28,7 @@ headers := sys/uio.h iovec.h sys/ioctl.h ioctls.h ioctl-types.h \
|
|||
ttyent.h syslog.h sys/syslog.h paths.h sys/reboot.h \
|
||||
sys/mman.h sys/param.h fstab.h mntent.h search.h err.h error.h\
|
||||
sys/queue.h sysexits.h syscall.h sys/syscall.h sys/swap.h \
|
||||
sys/select.h
|
||||
sys/select.h ustat.h sys/ustat.h ustatbits.h
|
||||
|
||||
routines := brk sbrk sstk ioctl \
|
||||
readv writev \
|
||||
|
@ -54,7 +54,7 @@ routines := brk sbrk sstk ioctl \
|
|||
mmap munmap mprotect msync madvise \
|
||||
efgcvt efgcvt_r qefgcvt qefgcvt_r \
|
||||
hsearch hsearch_r tsearch lsearch \
|
||||
err error
|
||||
err error ustat
|
||||
aux := init-misc
|
||||
distribute := bsd-compat.c
|
||||
extra-objs := bsd-compat.o
|
||||
|
|
|
@ -39,6 +39,8 @@ __BEGIN_DECLS
|
|||
of `struct timeval'. */
|
||||
struct timeval;
|
||||
|
||||
typedef __fd_mask fd_mask;
|
||||
|
||||
/* Representation of a set of file descriptors. */
|
||||
#define fd_set __fd_set
|
||||
|
||||
|
|
|
@ -20,15 +20,17 @@ Cambridge, MA 02139, USA. */
|
|||
/* This interface is obsolete. Use <sys/statfs.h> instead. */
|
||||
|
||||
#ifndef _SYS_USTAT_H
|
||||
#define _SYS_USTAT_H 1
|
||||
|
||||
#define _SYS_USTAT_H 1
|
||||
#include <features.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <ustatbits.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
extern int __ustat __P ((dev_t, struct ustat *));
|
||||
extern int ustat __P ((dev_t, struct ustat *));
|
||||
extern int __ustat __P ((__dev_t __dev, struct ustat *__ubuf));
|
||||
extern int ustat __P ((__dev_t __dev, struct ustat *__ubuf));
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@ static char sccsid[] = "@(#)syslog.c 8.4 (Berkeley) 3/18/94";
|
|||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
static int LogType = SOCK_DGRAM; /* type of socket connection */
|
||||
static int LogFile = -1; /* fd for log */
|
||||
static int connected; /* have done connect */
|
||||
static int LogStat = 0; /* status bits, set by openlog() */
|
||||
|
@ -163,8 +164,15 @@ vsyslog(pri, fmt, ap)
|
|||
/* Get connected, output the message to the local logger. */
|
||||
if (!connected)
|
||||
openlog(LogTag, LogStat | LOG_NDELAY, 0);
|
||||
|
||||
/* If we have a SOCK_STREAM connection, also send ASCII NUL as
|
||||
a record terminator. */
|
||||
if (LogType == SOCK_STREAM)
|
||||
++bufsize;
|
||||
|
||||
if (__send(LogFile, buf, bufsize, 0) < 0)
|
||||
{
|
||||
closelog (); /* attempt re-open next time */
|
||||
/*
|
||||
* Output the message to the console; don't worry about blocking,
|
||||
* if console blocks everything will. Make sure the error reported
|
||||
|
@ -194,23 +202,36 @@ openlog(ident, logstat, logfac)
|
|||
if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
|
||||
LogFacility = logfac;
|
||||
|
||||
if (LogFile == -1) {
|
||||
SyslogAddr.sa_family = AF_UNIX;
|
||||
(void)strncpy(SyslogAddr.sa_data, _PATH_LOG,
|
||||
sizeof(SyslogAddr.sa_data));
|
||||
if (LogStat & LOG_NDELAY) {
|
||||
if ((LogFile = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
|
||||
return;
|
||||
(void)fcntl(LogFile, F_SETFD, 1);
|
||||
while (1) {
|
||||
if (LogFile == -1) {
|
||||
SyslogAddr.sa_family = AF_UNIX;
|
||||
(void)strncpy(SyslogAddr.sa_data, _PATH_LOG,
|
||||
sizeof(SyslogAddr.sa_data));
|
||||
if (LogStat & LOG_NDELAY) {
|
||||
if ((LogFile = socket(AF_UNIX, LogType, 0))
|
||||
== -1)
|
||||
return;
|
||||
(void)fcntl(LogFile, F_SETFD, 1);
|
||||
}
|
||||
}
|
||||
if (LogFile != -1 && !connected)
|
||||
if (__connect(LogFile, &SyslogAddr, sizeof(SyslogAddr))
|
||||
== -1)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
(void)close(LogFile);
|
||||
LogFile = -1;
|
||||
if (LogType == SOCK_DGRAM
|
||||
&& saved_errno == EPROTOTYPE)
|
||||
{
|
||||
/* retry with next SOCK_STREAM: */
|
||||
LogType = SOCK_STREAM;
|
||||
continue;
|
||||
}
|
||||
} else
|
||||
connected = 1;
|
||||
break;
|
||||
}
|
||||
if (LogFile != -1 && !connected)
|
||||
if (__connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1)
|
||||
{
|
||||
(void)close(LogFile);
|
||||
LogFile = -1;
|
||||
} else
|
||||
connected = 1;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -42,10 +42,6 @@ static service_library *nss_new_service (name_database *database,
|
|||
__libc_lock_define_initialized (static, lock)
|
||||
|
||||
|
||||
/* Global variable. */
|
||||
struct __res_state _res;
|
||||
|
||||
|
||||
/* Nonzero if the sevices are already initialized. */
|
||||
static int nss_initialized;
|
||||
|
||||
|
|
|
@ -115,8 +115,10 @@ extern int getpeername __P ((int __fd, __SOCKADDR_ARG __addr,
|
|||
|
||||
|
||||
/* Send N bytes of BUF to socket FD. Returns the number sent or -1. */
|
||||
extern int __send __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
|
||||
extern int send __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
|
||||
extern int __send __P ((int __fd, __const __ptr_t __buf, size_t __n,
|
||||
int __flags));
|
||||
extern int send __P ((int __fd, __const __ptr_t __buf, size_t __n,
|
||||
int __flags));
|
||||
|
||||
/* Read N bytes into BUF from socket FD.
|
||||
Returns the number read or -1 for errors. */
|
||||
|
@ -124,8 +126,9 @@ extern int recv __P ((int __fd, __ptr_t __buf, size_t __n, int __flags));
|
|||
|
||||
/* Send N bytes of BUF on socket FD to peer at address ADDR (which is
|
||||
ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
|
||||
extern int sendto __P ((int __fd, __ptr_t __buf, size_t __n, int __flags,
|
||||
__CONST_SOCKADDR_ARG __addr, size_t __addr_len));
|
||||
extern int sendto __P ((int __fd, __const __ptr_t __buf, size_t __n,
|
||||
int __flags, __CONST_SOCKADDR_ARG __addr,
|
||||
size_t __addr_len));
|
||||
|
||||
/* Read N bytes into BUF through socket FD.
|
||||
If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of
|
||||
|
|
|
@ -71,6 +71,19 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
|
|||
(void) strcpy(one, "");
|
||||
equal(one, "", 7); /* Boundary condition. */
|
||||
|
||||
/* stpncpy. */
|
||||
it = "stpncpy";
|
||||
|
||||
memset(one, 'x', sizeof(one));
|
||||
check(stpncpy(one, "abc", 2) == one + 2, 1);
|
||||
check(stpncpy(one, "abc", 3) == one + 3, 2);
|
||||
check(stpncpy(one, "abc", 4) == one + 3, 3);
|
||||
check(one[3] == '\0' && one[4] == 'x', 4);
|
||||
check(stpncpy(one, "abcd", 5) == one + 4, 5);
|
||||
check(one[4] == '\0' && one[5] == 'x', 6);
|
||||
check(stpncpy(one, "abcd", 6) == one + 4, 7);
|
||||
check(one[4] == '\0' && one[5] == '\0' && one[6] == 'x', 8);
|
||||
|
||||
/* strcat. */
|
||||
it = "strcat";
|
||||
(void) strcpy(one, "ijk");
|
||||
|
|
|
@ -75,9 +75,12 @@ extra-objs = $(rpcgen-objs)
|
|||
|
||||
all: # Make this the default target; it will be defined in Rules.
|
||||
|
||||
# Sun's code is not too clean.
|
||||
override +gccwarn := -w
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
ifeq (no,$(cross-compile))
|
||||
ifeq (no,$(cross-compiling))
|
||||
# We can only build this library if we can run the rpcgen we build.
|
||||
extra-libs := librpcsvc
|
||||
extra-libs-others := librpcsvc # Make it in `others' pass, not `lib' pass.
|
||||
|
@ -86,9 +89,6 @@ librpcsvc-inhibit-o = .so # Build no shared rpcsvc library.
|
|||
omit-deps = $(librpcsvc-routines)
|
||||
endif
|
||||
|
||||
# Sun's code is not too clean.
|
||||
override +gccwarn := -w
|
||||
|
||||
include ../Rules
|
||||
|
||||
$(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) $(common-objpfx)libc.a
|
||||
|
|
|
@ -6,23 +6,23 @@
|
|||
* may copy or modify Sun RPC without charge, but are not authorized
|
||||
* to license or distribute it to anyone else except as part of a product or
|
||||
* program developed by the user.
|
||||
*
|
||||
*
|
||||
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
|
||||
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
|
||||
*
|
||||
*
|
||||
* Sun RPC is provided with no support and without any obligation on the
|
||||
* part of Sun Microsystems, Inc. to assist in its use, correction,
|
||||
* modification or enhancement.
|
||||
*
|
||||
*
|
||||
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
|
||||
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
|
||||
* OR ANY PART THEREOF.
|
||||
*
|
||||
*
|
||||
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
|
||||
* or profits or other special, indirect and consequential damages, even if
|
||||
* Sun has been advised of the possibility of such damages.
|
||||
*
|
||||
*
|
||||
* Sun Microsystems, Inc.
|
||||
* 2550 Garcia Avenue
|
||||
* Mountain View, California 94043
|
||||
|
@ -50,8 +50,6 @@ static char sccsid[] = "@(#)rpc_prot.c 1.36 87/08/11 Copyr 1984 Sun Micro";
|
|||
|
||||
/* * * * * * * * * * * * * * XDR Authentication * * * * * * * * * * * */
|
||||
|
||||
struct opaque_auth _null_auth;
|
||||
|
||||
/*
|
||||
* XDR an opaque authentication struct
|
||||
* (see auth.h)
|
||||
|
@ -84,9 +82,9 @@ xdr_des_block(xdrs, blkp)
|
|||
/*
|
||||
* XDR the MSG_ACCEPTED part of a reply message union
|
||||
*/
|
||||
bool_t
|
||||
bool_t
|
||||
xdr_accepted_reply(xdrs, ar)
|
||||
register XDR *xdrs;
|
||||
register XDR *xdrs;
|
||||
register struct accepted_reply *ar;
|
||||
{
|
||||
|
||||
|
@ -111,7 +109,7 @@ xdr_accepted_reply(xdrs, ar)
|
|||
/*
|
||||
* XDR the MSG_DENIED part of a reply message union
|
||||
*/
|
||||
bool_t
|
||||
bool_t
|
||||
xdr_rejected_reply(xdrs, rr)
|
||||
register XDR *xdrs;
|
||||
register struct rejected_reply *rr;
|
||||
|
@ -147,7 +145,7 @@ xdr_replymsg(xdrs, rmsg)
|
|||
register struct rpc_msg *rmsg;
|
||||
{
|
||||
if (
|
||||
xdr_u_long(xdrs, &(rmsg->rm_xid)) &&
|
||||
xdr_u_long(xdrs, &(rmsg->rm_xid)) &&
|
||||
xdr_enum(xdrs, (enum_t *)&(rmsg->rm_direction)) &&
|
||||
(rmsg->rm_direction == REPLY) )
|
||||
return (xdr_union(xdrs, (enum_t *)&(rmsg->rm_reply.rp_stat),
|
||||
|
@ -219,7 +217,7 @@ accepted(acpt_stat, error)
|
|||
error->re_lb.s2 = (long)acpt_stat;
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
rejected(rjct_stat, error)
|
||||
register enum reject_stat rjct_stat;
|
||||
register struct rpc_err *error;
|
||||
|
|
|
@ -28,20 +28,17 @@ compiler treats those calls as if they were instructions. In
|
|||
particular, it doesn't save any of the temporary registers (caller
|
||||
saved registers). It is therefore necessary to preserve all
|
||||
caller-saved registers as well
|
||||
|
||||
|
||||
Upon entering _mcount, register $at holds the return address and ra
|
||||
holds the return address of the function's caller (selfpc and frompc,
|
||||
respectively in gmon.c language...). */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#undef ret /* discard `ret' as defined in sysdep.h */
|
||||
|
||||
.set noat
|
||||
.set noreorder
|
||||
|
||||
LEAF(_mcount, 0xb0)
|
||||
weak_alias (_mcount, mcount)
|
||||
.prologue 0
|
||||
|
||||
subq sp, 0xb0, sp
|
||||
|
@ -69,8 +66,6 @@ weak_alias (_mcount, mcount)
|
|||
stq t5, 0x70(sp)
|
||||
stq t6, 0x78(sp)
|
||||
|
||||
lda pv, __mcount
|
||||
|
||||
stq t7, 0x80(sp)
|
||||
stq t8, 0x88(sp)
|
||||
stq t9, 0x90(sp)
|
||||
|
@ -78,7 +73,7 @@ weak_alias (_mcount, mcount)
|
|||
stq t11, 0xa0(sp)
|
||||
stq v0, 0xa8(sp)
|
||||
|
||||
jsr ra, (pv), __mcount
|
||||
jsr ra, __mcount
|
||||
|
||||
ldq a0, 0x00(sp)
|
||||
ldq a1, 0x08(sp)
|
||||
|
@ -108,3 +103,5 @@ weak_alias (_mcount, mcount)
|
|||
ret zero,($at),1
|
||||
|
||||
END(_mcount)
|
||||
|
||||
weak_alias (_mcount, mcount)
|
||||
|
|
|
@ -40,10 +40,10 @@ ENTRY(__bb_init_func)
|
|||
ldq t0, ZERO_WORD(a0) /* t0 <- blocks->zero_word */
|
||||
beq t0, init /* not initialized yet -> */
|
||||
ret
|
||||
|
||||
|
||||
END(__bb_init_func)
|
||||
|
||||
.ent init
|
||||
.ent init
|
||||
init:
|
||||
.frame sp, 0x38, ra, 0
|
||||
subq sp, 0x38, sp
|
||||
|
@ -61,8 +61,8 @@ init:
|
|||
stq t0, ZERO_WORD(a0) /* blocks->zero_word = 1 */
|
||||
stq t2, NEXT(a0) /* blocks->next = __bb_head */
|
||||
stq a0, 0(t1)
|
||||
bne t2, leave
|
||||
beq t3, leave /* t3 == GMON_PROF_ON? yes -> */
|
||||
bne t2, $leave
|
||||
beq t3, $leave /* t3 == GMON_PROF_ON? yes -> */
|
||||
|
||||
/* also need to initialize destructor: */
|
||||
stq ra, 0x00(sp)
|
||||
|
@ -81,8 +81,8 @@ init:
|
|||
ldq a4, 0x20(sp)
|
||||
ldq a5, 0x28(sp)
|
||||
|
||||
leave: ldq pv, 0x30(sp)
|
||||
$leave: ldq pv, 0x30(sp)
|
||||
addq sp, 0x38, sp
|
||||
ret
|
||||
|
||||
.end init
|
||||
.end init
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Alpha version.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1996 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
|
||||
|
@ -24,7 +24,8 @@ Cambridge, MA 02139, USA. */
|
|||
#include <sysdep.h>
|
||||
|
||||
ENTRY(_setjmp)
|
||||
lda $27, __sigsetjmp /* Load address to jump to. */
|
||||
ldgp $29,0($27)
|
||||
.prologue 1
|
||||
bis $31, $31, $17 /* Pass a second argument of zero. */
|
||||
jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp. */
|
||||
jmp $31, __sigsetjmp /* Call __sigsetjmp. */
|
||||
END(_setjmp)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Alpha version.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1996 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
|
||||
|
@ -24,7 +24,8 @@ Cambridge, MA 02139, USA. */
|
|||
#include <sysdep.h>
|
||||
|
||||
ENTRY(setjmp)
|
||||
lda $27, __sigsetjmp /* Load address to jump to. */
|
||||
ldgp $29, 0($27)
|
||||
.prologue 1
|
||||
bis $31, 1, $17 /* Pass a second argument of one. */
|
||||
jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp. */
|
||||
jmp $31, __sigsetjmp /* Call __sigsetjmp. */
|
||||
END(setjmp)
|
||||
|
|
|
@ -115,10 +115,9 @@ FUNC_NAME:
|
|||
|
||||
br AT, 1f
|
||||
1: ldgp gp, 0(AT)
|
||||
lda AT, _mcount
|
||||
|
||||
mov retaddr, ra
|
||||
jsr AT, (AT), _mcount
|
||||
jsr AT, _mcount
|
||||
|
||||
ldq ra, 0x00(sp)
|
||||
ldq pv, 0x08(sp)
|
||||
|
@ -137,7 +136,7 @@ FUNC_NAME:
|
|||
stq tmp0,0x18(sp)
|
||||
bis zero,zero,quotient
|
||||
stq tmp1,0x20(sp)
|
||||
beq divisor,divbyzero
|
||||
beq divisor,$divbyzero
|
||||
stq sign,0x28(sp)
|
||||
GETSIGN(dividend,divisor,sign)
|
||||
#if SIGNED
|
||||
|
@ -170,7 +169,7 @@ FUNC_NAME:
|
|||
|
||||
ldq arg1,0x00(sp)
|
||||
SETSIGN(sign,result,tmp0)
|
||||
done: ldq arg2,0x08(sp)
|
||||
$done: ldq arg2,0x08(sp)
|
||||
ldq mask,0x10(sp)
|
||||
ldq tmp0,0x18(sp)
|
||||
ldq tmp1,0x20(sp)
|
||||
|
@ -178,11 +177,11 @@ done: ldq arg2,0x08(sp)
|
|||
lda sp,FRAME_SIZE(sp)
|
||||
ret zero,(retaddr),0
|
||||
|
||||
divbyzero:
|
||||
$divbyzero:
|
||||
lda a0,GEN_INTDIV(zero)
|
||||
call_pal PAL_gentrap
|
||||
bis zero,zero,result /* if trap returns, return 0 */
|
||||
ldq arg1,0x00(sp)
|
||||
br done
|
||||
br $done
|
||||
|
||||
END(FUNC_NAME)
|
||||
|
|
|
@ -34,7 +34,7 @@ ENTRY(ffs)
|
|||
negq a0, t0 # due to the srl instruction
|
||||
and a0, t0, t0
|
||||
clr v0
|
||||
beq a0, done
|
||||
beq a0, $done
|
||||
|
||||
# now do binary search for first non-zero bit
|
||||
|
||||
|
@ -61,6 +61,6 @@ ENTRY(ffs)
|
|||
addq v0, 1, t3
|
||||
cmoveq t2, t3, v0
|
||||
|
||||
done: ret
|
||||
$done: ret
|
||||
|
||||
END(ffs)
|
||||
|
|
|
@ -42,7 +42,7 @@ For correctness consider that:
|
|||
ENTRY(memchr)
|
||||
.prologue 0
|
||||
|
||||
beq a2, not_found
|
||||
beq a2, $not_found
|
||||
ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
|
||||
addq a0, a2, t4
|
||||
and a1, 0xff, a1 # a1 = 00000000000000ch
|
||||
|
@ -57,7 +57,7 @@ ENTRY(memchr)
|
|||
extql t0, a0, t6
|
||||
or t1, a1, a1 # a1 = chchchchchchchch
|
||||
|
||||
beq t3, first_quad
|
||||
beq t3, $first_quad
|
||||
|
||||
extqh t5, a0, t5
|
||||
mov a0, v0
|
||||
|
@ -68,15 +68,15 @@ ENTRY(memchr)
|
|||
# in t0. E.g.:
|
||||
# a2 = 6
|
||||
# t0 = ????c6c5c4c3c2c1
|
||||
last_quad:
|
||||
$last_quad:
|
||||
negq a2, t5
|
||||
srl t2, t5, t5 # t5 = mask of a2 bits set
|
||||
xor a1, t0, t0
|
||||
cmpbge zero, t0, t1
|
||||
and t1, t5, t1
|
||||
beq t1, not_found
|
||||
beq t1, $not_found
|
||||
|
||||
found_it:
|
||||
$found_it:
|
||||
# now, determine which byte matched:
|
||||
negq t1, t2
|
||||
and t1, t2, t1
|
||||
|
@ -93,20 +93,20 @@ found_it:
|
|||
addq v0, 1, t2
|
||||
cmoveq t0, t2, v0
|
||||
|
||||
done: ret
|
||||
$done: ret
|
||||
|
||||
|
||||
#
|
||||
# Deal with the case where a2 > 8 bytes remain to be
|
||||
# searched. a0 may not be aligned.
|
||||
#
|
||||
first_quad:
|
||||
$first_quad:
|
||||
andnot a0, 0x7, v0
|
||||
insqh t2, a0, t1 # t1 = 0000ffffffffffff (a0<0:2> ff bytes)
|
||||
xor t0, a1, t0
|
||||
or t0, t1, t0 # t0 = ====ffffffffffff
|
||||
cmpbge zero, t0, t1
|
||||
bne t1, found_it
|
||||
bne t1, $found_it
|
||||
|
||||
/* at least one byte left to process */
|
||||
|
||||
|
@ -119,41 +119,41 @@ first_quad:
|
|||
subq t4, 1, a2
|
||||
andnot a2, 0x7, a2
|
||||
cmpult v0, a2, t1
|
||||
beq t1, final
|
||||
beq t1, $final
|
||||
|
||||
/* at least two quads remain to be accessed */
|
||||
|
||||
subq a2, v0, t3 # t3 <- number of quads to be processed in loop
|
||||
and t3, 8, t3 # odd number of quads?
|
||||
bne t3, odd_quad_count
|
||||
bne t3, $odd_quad_count
|
||||
|
||||
/* at least three quads remain to be accessed */
|
||||
|
||||
mov t0, t3 # move prefetched value into correct register
|
||||
|
||||
.align 3
|
||||
unrolled_loop:
|
||||
$unrolled_loop:
|
||||
ldq t0, 8(v0) # prefetch t0
|
||||
xor a1, t3, t1
|
||||
cmpbge zero, t1, t1
|
||||
bne t1, found_it
|
||||
bne t1, $found_it
|
||||
|
||||
addq v0, 8, v0
|
||||
odd_quad_count:
|
||||
$odd_quad_count:
|
||||
xor a1, t0, t1
|
||||
ldq t3, 8(v0) # prefetch t3
|
||||
cmpbge zero, t1, t1
|
||||
bne t1, found_it
|
||||
bne t1, $found_it
|
||||
|
||||
addq v0, 8, v0
|
||||
cmpult v0, a2, t5
|
||||
bne t5, unrolled_loop
|
||||
bne t5, $unrolled_loop
|
||||
|
||||
mov t3, t0 # move prefetched value into t0
|
||||
final: subq t4, v0, a2 # a2 <- number of bytes left to do
|
||||
bne a2, last_quad
|
||||
$final: subq t4, v0, a2 # a2 <- number of bytes left to do
|
||||
bne a2, $last_quad
|
||||
|
||||
not_found:
|
||||
$not_found:
|
||||
mov zero, v0
|
||||
ret
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1992, 1994, 1996 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
|
||||
|
@ -25,9 +25,8 @@ ENTRY (__sigsetjmp)
|
|||
ldgp $29, 0($27)
|
||||
.prologue 1
|
||||
|
||||
lda $27, __sigsetjmp_aux /* Load address to jump to. */
|
||||
bis $30, $30, $18 /* Pass SP as 3rd arg. */
|
||||
bis $15, $15, $19 /* Pass FP as 4th arg. */
|
||||
jmp $31, ($27), __sigsetjmp_aux /* Call __sigsetjmp_aux. */
|
||||
jmp $31, __sigsetjmp_aux /* Call __sigsetjmp_aux. */
|
||||
|
||||
END(__sigsetjmp)
|
||||
|
|
|
@ -19,52 +19,50 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
|||
Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Finds length of a 0-terminated string. Optimized for the Alpha
|
||||
architecture:
|
||||
architecture:
|
||||
|
||||
- memory accessed as aligned quadwords only
|
||||
- uses bcmpge to compare 8 bytes in parallel
|
||||
- does binary search to find 0 byte in last
|
||||
quadword (HAKMEM needed 12 instructions to
|
||||
do this instead of the 9 instructions that
|
||||
binary search needs). */
|
||||
- uses cmpbge to compare 8 bytes in parallel
|
||||
- does binary search to find 0 byte in last quadword (HAKMEM
|
||||
needed 12 instructions to do this instead of the 8 instructions
|
||||
that the binary search needs).
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.set noreorder
|
||||
.set noat
|
||||
|
||||
ENTRY(strlen)
|
||||
ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
|
||||
lda t1, -1(zero)
|
||||
insqh t1, a0, t1
|
||||
andnot a0, 7, v0
|
||||
or t1, t0, t0
|
||||
cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
|
||||
bne t1, found
|
||||
ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
|
||||
lda t1, -1(zero)
|
||||
insqh t1, a0, t1
|
||||
andnot a0, 7, v0
|
||||
or t1, t0, t0
|
||||
nop # dual issue the next two on ev5
|
||||
cmpbge zero, t0, t1 # t1 <- bitmask: bit i == 1 <==> i-th byte == 0
|
||||
bne t1, $found
|
||||
|
||||
loop: ldq t0, 8(v0)
|
||||
addq v0, 8, v0 # addr += 8
|
||||
nop # helps dual issue last two insns
|
||||
cmpbge zero, t0, t1
|
||||
beq t1, loop
|
||||
$loop: ldq t0, 8(v0)
|
||||
addq v0, 8, v0 # addr += 8
|
||||
cmpbge zero, t0, t1
|
||||
beq t1, $loop
|
||||
|
||||
found: blbs t1, done # make aligned case fast
|
||||
negq t1, t2
|
||||
and t1, t2, t1
|
||||
$found: negq t1, t2 # clear all but least set bit
|
||||
and t1, t2, t1
|
||||
|
||||
and t1, 0x0f, t0
|
||||
addq v0, 4, t2
|
||||
cmoveq t0, t2, v0
|
||||
and t1, 0xf0, t2 # binary search for that set bit
|
||||
and t1, 0xcc, t3
|
||||
and t1, 0xaa, t4
|
||||
cmovne t2, 4, t2
|
||||
cmovne t3, 2, t3
|
||||
cmovne t4, 1, t4
|
||||
addq t2, t3, t2
|
||||
addq v0, t4, v0
|
||||
addq v0, t2, v0
|
||||
nop # dual issue next two on ev4 and ev5
|
||||
|
||||
and t1, 0x33, t0
|
||||
addq v0, 2, t2
|
||||
cmoveq t0, t2, v0
|
||||
subq v0, a0, v0
|
||||
ret
|
||||
|
||||
and t1, 0x55, t0
|
||||
addq v0, 1, t2
|
||||
cmoveq t0, t2, v0
|
||||
|
||||
done: subq v0, a0, v0
|
||||
ret
|
||||
|
||||
END(strlen)
|
||||
END(strlen)
|
||||
|
|
|
@ -57,8 +57,6 @@ DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
|
|||
goto last_chars;
|
||||
}
|
||||
n -= dest - s;
|
||||
if (n == 0)
|
||||
return dest - 1;
|
||||
goto zero_fill;
|
||||
}
|
||||
|
||||
|
@ -70,16 +68,16 @@ DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
|
|||
for (;;)
|
||||
{
|
||||
c = *src++;
|
||||
--n;
|
||||
*dest++ = c;
|
||||
if (c == '\0')
|
||||
break;
|
||||
if (--n == 0)
|
||||
if (n == 0)
|
||||
return dest;
|
||||
}
|
||||
--n;
|
||||
|
||||
zero_fill:
|
||||
while (--n > 0)
|
||||
while (n-- > 0)
|
||||
dest[n] = '\0';
|
||||
|
||||
return dest - 1;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Generic declaration of ustat structure.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1996 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
|
||||
|
@ -17,10 +17,14 @@ License along with the GNU C Library; see the file COPYING.LIB. If
|
|||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
struct ustat
|
||||
{
|
||||
daddr_t f_tfree; /* total free */
|
||||
ino_t f_tinode; /* total inodes free */
|
||||
__daddr_t f_tfree; /* total free */
|
||||
__ino_t f_tinode; /* total inodes free */
|
||||
char f_fname[6]; /* filesystem name */
|
||||
char f_fpack[6]; /* filesystem pack name */
|
||||
};
|
||||
|
||||
__END_DECLS
|
||||
|
|
|
@ -19,7 +19,7 @@ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _FPU_CONTROL_H
|
||||
#define _FPU_CONTROL_H
|
||||
#define _FPU_CONTROL_H 1
|
||||
|
||||
/* Here is the dirty part. Settup up your 387 through the control word
|
||||
* (cw) register.
|
||||
|
@ -80,10 +80,10 @@ Boston, MA 02111-1307, USA. */
|
|||
/* The fdlibm code requires strict IEEE double precision arithmetic,
|
||||
and no interrupts for exceptions, rounding to nearest. */
|
||||
|
||||
#define _FPU_DEFAULT 0x127f
|
||||
#define _FPU_DEFAULT 0x137f
|
||||
|
||||
/* IEEE: same as above, but exceptions */
|
||||
#define _FPU_IEEE 0x127f
|
||||
#define _FPU_IEEE 0x137f
|
||||
|
||||
/* Type of the control word. */
|
||||
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
ifeq ($(subdir), misc)
|
||||
sysdep_routines += sysctl
|
||||
sysdep_routines += sysctl clone
|
||||
|
||||
sysdep_headers += sys/mount.h sys/sysinfo.h sys/acct.h sys/sysctl.h \
|
||||
sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
|
||||
Contributed by Brendan Kehoe (brendan@zen.org).
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
|
@ -23,7 +23,16 @@ break value (instead of the new, requested one). */
|
|||
#include <sysdep.h>
|
||||
#include <errnos.h>
|
||||
|
||||
#ifdef PIC
|
||||
.section .bss
|
||||
.align 3
|
||||
.globl __curbrk
|
||||
__curbrk: .skip 8
|
||||
.type __curbrk,@object
|
||||
.size __curbrk,8
|
||||
#else
|
||||
.comm __curbrk, 8
|
||||
#endif
|
||||
|
||||
.text
|
||||
LEAF(__brk, 0)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1992 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1992, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by David Mosberger.
|
||||
|
||||
|
@ -92,6 +92,7 @@ static struct platform {
|
|||
{"EB66", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
|
||||
{"EB66P", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
|
||||
{"Jensen", IOSYS_JENSEN, JENSEN_MEM},
|
||||
{"Mikasa", IOSYS_APECS, APECS_DENSE_MEM},
|
||||
{"Mustang", IOSYS_APECS, APECS_DENSE_MEM},
|
||||
{"Noname", IOSYS_APECS, APECS_DENSE_MEM}, /* LCA same as APECS */
|
||||
};
|
||||
|
|
|
@ -65,4 +65,8 @@ typedef long int __swblk_t; /* Type of a swap block maybe? */
|
|||
typedef __kernel_fd_set __fd_set;
|
||||
typedef __kernel_clock_t __clock_t;
|
||||
|
||||
/* Linus doesn't want __kernel_fd_mask in <linux/posix_types.h> since
|
||||
XPG4 seems to require `unsigned long'. */
|
||||
typedef unsigned long __fd_mask;
|
||||
|
||||
#endif /* gnu/types.h */
|
||||
|
|
|
@ -40,13 +40,13 @@ __localtime_r (timer, tp)
|
|||
/* This lock is defined in tzset.c and locks all the data defined there
|
||||
and in tzfile.c; the internal functions do no locking themselves.
|
||||
This lock is only taken here and in `tzset'. */
|
||||
__libc_lock_define (extern, __tzset_lock)
|
||||
extern int __tzset_run, __use_tzfile;
|
||||
extern int __tz_compute __P ((time_t timer, struct tm *tp));
|
||||
extern int __tzfile_compute __P ((time_t timer,
|
||||
long int *leap_correct, int *leap_hit));
|
||||
long int leap_correction;
|
||||
int leap_extra_secs;
|
||||
__libc_lock_define (extern, __tzset_lock);
|
||||
|
||||
if (timer == NULL)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue