update from main archive 961105

Wed Nov  6 04:30:26 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/syscalls.list: Add weak alias llseek for
	_llseek syscall.  Reported by Andy Sewell <puck@pookhill.demon.co.uk>.

	* string/argz.h: Don't protect by __USE_GNU.

Tue Nov  5 23:38:28 1996  Ulrich Drepper  <drepper@cygnus.com>

	* Lots of files: Update and reformat copyright.

	* Makefile (headers): Add xopen_lim.h.

	* catgets/nl_types.h: Move __BEGIN_DECLS before definition of nl_catd.

	* grp/grp.h: Define setgrent, getgrent, endgrent, and getgrent_r
	if __USE_XOPEN_EXTENDED is defined.
	* pwd/pwd.h: Define setpwent, getpwent, endpwent, and getpwent_r
	if __USE_XOPEN_EXTENDED is defined.

	* io/Makefile (routines): Add lchown.

	* io/sys/poll.h: Add definition of POLLWRNORM.

	* io/sys/stat.h: Declare lstat, fchmod, mknod when
	__USE_XOPEN_EXTENDED is defined.

	* libio/Makefile (routines): Add obprintf.
	* libio/obprintf.c: New file.
	* libio/iolibio.h: Add prototypes for _IO_obstack_vprintf and
	_IO_obstack_printf.
	* libio/libio.h: Fix typo.
	* libio/stdio.h: Declare tempnam if __USE_XOPEN_EXTENDED is defined.
	Add prototypes for obstack_vprintf and obstack_printf.

	* manual/creature.texi: Describe _XOPEN_SOURCE macro.
	* manual/intro.texi: Add reference to NSS chapter.
	* manual/libc.texinfo: Update UPDATED.
	Comment out `@printindex cp'.  It works again.
	* manual/memory.texi: Add description for obstack_ptr_grow,
	obstack_int_grow, obstack_ptr_grow_fast, and obstack_int_grow_fast.
	* manual/nss.texi: Add a few @cindex entries and change NSS_STATUS_*
	index entries to @vindex.
	* manual/users.texi: Correct @cindex entry for Netgroup.

	* math/mathcalls.h: Use __USE_XOPEN and __USE_XOPEN_EXTENDED to
	make declarations visible for X/Open sources.

	* misc/search.h: Declare insque/remque only is __USE_SVID or
	__USE_XOPEN_EXTENDED is defined.

	* misc/sys/uio.h (readv, writev): Change return value from int to
	ssize_t.

	* posix/Makefile (headers): Add re_comp.h.
	* posix/re_comp.h: New file.  XPG interface to regex functions.

	* posix/getconf.c: Add all names from XPG4.2.
	* posix/posix1_lim.h: Increase minimum values for _POSIX_CHILD_MAX
	and _POSIX_OPEN_MAX to minimums from XPG4.2.
	* sysdeps/generic/confname.h: Add all _SC_* names from XPG4.2.
	* sysdeps/posix/sysconf.c: Handle new _SC_* values.
	* sysdeps/stub/sysconf.c: Likewise.

	* posix/unistd.h: Add declaration of ualarm and lchown.  Declare
	usleep, fchown, fchdir, nice, getpgid, setsid, getsid, setreuid,
	setregid, vfork, ttyslot, symlink, readlink, gethostid, truncate,
	ftruncate, getdtablesize, brk, sbrk, lockf when
	__USE_XOPEN_EXTENDED is defined.

	* posix/sys/wait.h: Declare wait3 if __USE_XOPEN_EXTENDED is defined.

	* shadow/shadow.h: Define SHADOW using _PATH_SHADOW.
	* sysdeps/generic/paths.h: Define _PATH_SHADOW.
	* sysdeps/unix/sysv/linux/paths.h: Likewise.

	* signal/signal.h: Declare killpg, sigstack and sigaltstack when
	__USE_XOPEN_EXTENDED is defined.

	* stdio/stdio.h: Declare tempnam when __USE_XOPEN is defined.

	* stdlib/stdlib.h: Make rand48 functions available when __USE_XOPEN
	is defined.
	Likewise for valloc, putenv, realpath, [efg]cvt*, and getsubopt
	functions.

	* string/string.h: Make memccpy, strdup, bcmp, bcopy, bzero, index,
	and rindex available when __USE_XOPEN_EXTENDED is defined.

	* sysdeps/mach/getpagesize.c: De-ANSI-fy.  Change return type to int.
	* sysdeps/posix/getpagesize.c: Likewise.
	* sysdeps/stub/getpagesize.c: Likewise.
	* sysdeps/unix/getpagesize.c: Likewise.

	* time/africa: Update from tzdata1996l.
	* time/asia: Likewise.
	* time/australia: Likewise.
	* time/europe: Likewise.
	* time/northamerica: Likewise.
	* time/pacificnew: Likewise.
	* time/southamerica: Likewise.
	* time/tzfile.h: Update from tzcode1996m.

	* time/time.h: Declare strptime if __USE_XOPEN.
	Declare daylight and timezone also if __USE_XOPEN.

	* time/sys/time.h: Remove declaration of ualarm.

	* wctype/wctype.h: Just reference ISO C standard.

Tue Nov  5 01:26:32 1996  Richard Henderson  <rth@tamu.edu>

	* crypt/Makefile: Add crypt routines to libc as well iff
	$(crypt-in-libc) is set.  Do this for temporary binary compatibility
	on existing Linux/Alpha installations.

	* stdlib/div.c, sysdeps/generic/div.c: Move file to .../generic/.
	* stdlib/ldiv.c, sysdeps/generic/ldiv.c: Likewise.
	* stdlib/lldiv.c, sysdeps/generic/lldiv.c: Likewise.
	* sysdeps/alpha/Makefile (divrem): Add divlu, dviqu, remlu, and
	remqu.
	* sysdeps/alpha/div.S: New file.
	* sysdeps/alpha/ldiv.S: New file.
	* sysdeps/alpha/lldiv.S: New file.
	* sysdeps/alpha/divrem.h: Merge signed and unsigned division.
	Take pointers from Linus and tighten the inner loops a bit.
	* sysdeps/alpha/divl.S: Change defines for merged routines.
	* sysdeps/alpha/divq.S: Likewise.
	* sysdeps/alpha/reml.S: Likewise.
	* sysdeps/alpha/remq.S: Likewise.
	* sysdeps/alpha/divlu.S: Remove file.
	* sysdeps/alpha/divqu.S: Likewise.
	* sysdeps/alpha/remlu.S: Likewise.
	* sysdeps/alpha/remqu.S: Likewise.

	* sysdeps/alpha/bsd-_setjmp.S: If PROF, call _mcount.
	* sysdeps/alpha/bsd-setjmp.S: Likewise.
	* sysdeps/alpha/bzero.S: Likewise.
	* sysdeps/alpha/ffs.S: Likewise.
	* sysdeps/alpha/htonl.S: Likewise.
	* sysdeps/alpha/htons.S: Likewise.
	* sysdeps/alpha/memchr.S: Likewise.
	* sysdeps/alpha/memset.S: Likewise.
	* sysdeps/alpha/s_copysign.S: Likewise.
	* sysdeps/alpha/s_fabs.S: Likewise.
	* sysdeps/alpha/setjmp.S: Likewise.
	* sysdeps/alpha/stpcpy.S: Likewise.
	* sysdeps/alpha/stpncpy.S: Likewise.
	* sysdeps/alpha/strcat.S: Likewise.
	* sysdeps/alpha/strchr.S: Likewise.
	* sysdeps/alpha/strcpy.S: Likewise.
	* sysdeps/alpha/strlen.S: Likewise.
	* sysdeps/alpha/strncat.S: Likewise.
	* sysdeps/alpha/strncpy.S: Likewise.
	* sysdeps/alpha/strrchr.S: Likewise.
	* sysdeps/alpha/udiv_qrnnd.S: Likewise.  Fix private labels.
	Convert two small jumps to use conditional moves.
	* sysdeps/unix/alpha/sysdep.h: Compress all __STDC__ nastiness.
	(PSEUDO): If PROF, call _mcount.
	* sysdeps/unix/sysv/linux/alpha/brk.S: If PROF, call _mcount.
	* sysdeps/unix/sysv/linux/alpha/clone.S: Likewise.
	* sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S: Likewise.
	* sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S: Likewise.
	* sysdeps/unix/sysv/linux/alpha/llseek.S: Likewise.
	* sysdeps/unix/sysv/linux/alpha/sigsuspend.S: Likewise.
	* sysdeps/unix/sysv/linux/alpha/syscall.S: Likewise.

	* sysdeps/alpha/memcpy.S: New file.  Odd layout because it should
	eventually contain memmove as well.
	* sysdeps/alpha/strcmp.S: New file.
	* sysdeps/alpha/strncmp.S: New file.
	* sysdeps/alpha/w_sqrt.S: New file.

Tue Nov  5 18:06:06 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/mach/hurd/ttyname_r.c: Use `size_t' for len variable.

Tue Nov  5 12:09:29 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdep/generic/sysdep.h: Define END only if not yet defined.
	* sysdep/unix/sysdep.h: Define PSEUDO_END only if not yet defined.
	Reported by Thomas Bushnell, n/BSG.

Mon Nov  4 22:46:53 1996  Ulrich Drepper  <drepper@cygnus.com>

	* manual/users.texi (Netgroup Data): Remove { } around @cindex.

Mon Nov  4 19:07:05 1996  Ulrich Drepper  <drepper@cygnus.com>

	* malloc/calloc.c: Check for overflow before trying to allocate
	memory.  Proposed by Neil Matthews <nm@adv.sbc.sony.co.jp>.

Fri Nov  1 18:18:32 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* manual/llio.texi (Operating Modes): Add missing arguments to
	@deftypevr in O_NONBLOCK description.

	* manual/time.texi (Time Zone Functions): Enclose type name in
	braces in description of tzname.  FIXME: this does not yet work
	correctly in info.

Sun Nov  3 17:29:06 1996  Ulrich Drepper  <drepper@cygnus.com>

	* features.h: Add X/Open macros.
	* posix/unistd.h: Define X/Open macros.
	* sysdeps/generic/confname.h: Add _SC_XOPEN_XCU_VERSION,
	_SC_XOPEN_UNIX, _SC_XOPEN_CRYPT, _SC_XOPEN_ENH_I18N,
	_SC_XOPEN_SHM, _SC_2_CHAR_TERM, _SC_2_C_VERSION, and _SC_2_UPE.
	* sysdeps/posix/sysconf.c: Handle new constants.
	* sysdeps/stub/sysconf.c: Likewise.
	* sysdeps/unix/sysv/linux/posix_opt.h: Add definition of _XOPEN_SHM.

	* catgets/catgets.c (catopen): Set errno to ENOMEM when
	we run out of memory.
	(catgets): Set errno to EBADF when catalog handle is invalid.
	Set errno to ENOMSG when translation is not available.
	(catclose): Set errno to EBADF when catalog handle is invalid.

	* ctype/ctype.h: Declare isascii and toascii when __USE_XOPEN.
	Likewise for _toupper and _tolower.

	* manual/arith.texi: Document strtoq, strtoll, strtouq, strtoull,
	strtof, and strtold.
	* manual/math.texi: Document HUGE_VALf and HUGE_VALl.
	* manual/stdio.h: Document ' flag for numeric formats of scanf.
	* manual/users.texi: Document that cuserid shouldn't be used.

	* misc/Makefile (routines): Add dirname.
	(headers): Add libgen.h.
	(tests): Add tst-dirname.
	* misc/dirname.c: New file.
	* misc/libgen.h: New file.
	* misc/tst-dirname.c: New file.

	* misc/search.h: Parameter of hcreate must be of type size_t.
	* misc/hsearch.c: Likewise.
	* misc/hsearch_r.c: Likewise for hcreate_r.
	* misc/search.h: Parameters of insque and remque must be `void *'.
	* misc/insremque.c: Likewise.

	* posix/unistd.h: Move declarations of mktemp and mkstemp to...
	* stdlib/stdlib.h: ...here.
	* posix/unistd.h [__USE_XOPEN]: Add prototypes for crypt, setkey,
	encrypt, and swab.

	* stdio-common/printf-parse.h (struct printf_spec): Add pa_wchar
	and pa_wstring.
	(parse_one_spec): Remove Linux compatibility code.
	Recognize %C and %S formats.
	* stdio-common/printf.h: Add PA_WCHAR and PA_WSTRING.
	* stdio-common/vfprintf.c: Add implementation of %C and %S format.
	* stdio-common/vfscanf.c: Likewise for scanf.

	* stdlib/l64a.c: Return value for 0 must be the empty string.
	* stdlib/stdlib.h: Declare reentrant function from rand49 family
	only if __USE_REENTRANT.
	Declare rand48 functions also if __USE_XOPEN.

	* stdlib/strtol.c: Return 0 and set errno to EINVAL when BASE is
	not a legal value.
	Return 0 and set errno to EINVAL when strou* sees negativ number.
	* stdlib/tst-strtol.c: De-ANSI-fy.
	Change expected results for test of unsigned function and negative
	input.

	* string/stratcliff.c: Prevent warnings.
	* string.h: Move declaration of swab to <unistd.h>.
	* string/swab.c: De-ANSI-fy.

	* sysdeps/posix/cuserid.c: Implement using getpwuid_r.
	* sysdeps/posix/mkstemp.c: Include <stdlib.h> for prototype.
	* sysdeps/posix/mktemp.c: Likewise.
	* sysdeps/stub/mkstemp.c: Likewise.
	* sysdeps/stub/mktemp.c: Likewise.

	* sysvipc/sys/ipc.h: Prototypes of ftok have to be of types `const
 	char *' and `int'.
	* sysvipc/ftok.c: Likewise.  Make sure only lower 8 bits of
 	PROJ_ID are used.

Sun Nov  3 03:21:28 1996  Heiko Schroeder  <Heiko.Schroeder@post.rwth-aachen.de>

	* locale/programs/ld-numeric.c (numeric_output): Compute idx[0]
	correctly.

Sat Nov  2 17:44:32 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/posix/cuserid.c: Use reentrant functions.
	* manual/users.texi: Tell that cuserid is marked to be withdrawn in
	XPG4.2.

Sat Nov  2 14:26:37 1996  Ulrich Drepper  <drepper@cygnus.com>

	Linus said he will make sure no system call will return a value
	in -1 ... -4095 as a valid result.
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Correct test for error.
	* sysdeps/unix/sysv/linux/i386/syscall.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.

Sat Nov  2 16:54:49 1996  NIIBE Yutaka  <gniibe@mri.co.jp>

	* sysdeps/stub/lockfile.c [!USE_IN_LIBIO]: Define weak alias for
	__funlockfile, not a circular alias.
	Define __IO_ftrylockfile if USE_IN_LIBIO and __ftrylockfile if not,
	not vice versa.

	* sysdeps/unix/sysv/linux/i386/sysdep.S (__errno_location): Make
	it a weak symbol.
	* sysdeps/unix/sysv/linux/m68k/sysdep.S (__errno_location): Likewise.


	Likewise.

	* crypt/Makefile (rpath-link): Extend search path to current directory.
This commit is contained in:
Ulrich Drepper 1996-11-06 04:24:40 +00:00
parent f5311448f8
commit 2c6fe0bd3b
119 changed files with 4991 additions and 1294 deletions

313
ChangeLog
View File

@ -1,3 +1,314 @@
Wed Nov 6 04:30:26 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/syscalls.list: Add weak alias llseek for
_llseek syscall. Reported by Andy Sewell <puck@pookhill.demon.co.uk>.
* string/argz.h: Don't protect by __USE_GNU.
Tue Nov 5 23:38:28 1996 Ulrich Drepper <drepper@cygnus.com>
* Lots of files: Update and reformat copyright.
* Makefile (headers): Add xopen_lim.h.
* catgets/nl_types.h: Move __BEGIN_DECLS before definition of nl_catd.
* grp/grp.h: Define setgrent, getgrent, endgrent, and getgrent_r
if __USE_XOPEN_EXTENDED is defined.
* pwd/pwd.h: Define setpwent, getpwent, endpwent, and getpwent_r
if __USE_XOPEN_EXTENDED is defined.
* io/Makefile (routines): Add lchown.
* io/sys/poll.h: Add definition of POLLWRNORM.
* io/sys/stat.h: Declare lstat, fchmod, mknod when
__USE_XOPEN_EXTENDED is defined.
* libio/Makefile (routines): Add obprintf.
* libio/obprintf.c: New file.
* libio/iolibio.h: Add prototypes for _IO_obstack_vprintf and
_IO_obstack_printf.
* libio/libio.h: Fix typo.
* libio/stdio.h: Declare tempnam if __USE_XOPEN_EXTENDED is defined.
Add prototypes for obstack_vprintf and obstack_printf.
* manual/creature.texi: Describe _XOPEN_SOURCE macro.
* manual/intro.texi: Add reference to NSS chapter.
* manual/libc.texinfo: Update UPDATED.
Comment out `@printindex cp'. It works again.
* manual/memory.texi: Add description for obstack_ptr_grow,
obstack_int_grow, obstack_ptr_grow_fast, and obstack_int_grow_fast.
* manual/nss.texi: Add a few @cindex entries and change NSS_STATUS_*
index entries to @vindex.
* manual/users.texi: Correct @cindex entry for Netgroup.
* math/mathcalls.h: Use __USE_XOPEN and __USE_XOPEN_EXTENDED to
make declarations visible for X/Open sources.
* misc/search.h: Declare insque/remque only is __USE_SVID or
__USE_XOPEN_EXTENDED is defined.
* misc/sys/uio.h (readv, writev): Change return value from int to
ssize_t.
* posix/Makefile (headers): Add re_comp.h.
* posix/re_comp.h: New file. XPG interface to regex functions.
* posix/getconf.c: Add all names from XPG4.2.
* posix/posix1_lim.h: Increase minimum values for _POSIX_CHILD_MAX
and _POSIX_OPEN_MAX to minimums from XPG4.2.
* sysdeps/generic/confname.h: Add all _SC_* names from XPG4.2.
* sysdeps/posix/sysconf.c: Handle new _SC_* values.
* sysdeps/stub/sysconf.c: Likewise.
* posix/unistd.h: Add declaration of ualarm and lchown. Declare
usleep, fchown, fchdir, nice, getpgid, setsid, getsid, setreuid,
setregid, vfork, ttyslot, symlink, readlink, gethostid, truncate,
ftruncate, getdtablesize, brk, sbrk, lockf when
__USE_XOPEN_EXTENDED is defined.
* posix/sys/wait.h: Declare wait3 if __USE_XOPEN_EXTENDED is defined.
* shadow/shadow.h: Define SHADOW using _PATH_SHADOW.
* sysdeps/generic/paths.h: Define _PATH_SHADOW.
* sysdeps/unix/sysv/linux/paths.h: Likewise.
* signal/signal.h: Declare killpg, sigstack and sigaltstack when
__USE_XOPEN_EXTENDED is defined.
* stdio/stdio.h: Declare tempnam when __USE_XOPEN is defined.
* stdlib/stdlib.h: Make rand48 functions available when __USE_XOPEN
is defined.
Likewise for valloc, putenv, realpath, [efg]cvt*, and getsubopt
functions.
* string/string.h: Make memccpy, strdup, bcmp, bcopy, bzero, index,
and rindex available when __USE_XOPEN_EXTENDED is defined.
* sysdeps/mach/getpagesize.c: De-ANSI-fy. Change return type to int.
* sysdeps/posix/getpagesize.c: Likewise.
* sysdeps/stub/getpagesize.c: Likewise.
* sysdeps/unix/getpagesize.c: Likewise.
* time/africa: Update from tzdata1996l.
* time/asia: Likewise.
* time/australia: Likewise.
* time/europe: Likewise.
* time/northamerica: Likewise.
* time/pacificnew: Likewise.
* time/southamerica: Likewise.
* time/tzfile.h: Update from tzcode1996m.
* time/time.h: Declare strptime if __USE_XOPEN.
Declare daylight and timezone also if __USE_XOPEN.
* time/sys/time.h: Remove declaration of ualarm.
* wctype/wctype.h: Just reference ISO C standard.
Tue Nov 5 01:26:32 1996 Richard Henderson <rth@tamu.edu>
* crypt/Makefile: Add crypt routines to libc as well iff
$(crypt-in-libc) is set. Do this for temporary binary compatibility
on existing Linux/Alpha installations.
* stdlib/div.c, sysdeps/generic/div.c: Move file to .../generic/.
* stdlib/ldiv.c, sysdeps/generic/ldiv.c: Likewise.
* stdlib/lldiv.c, sysdeps/generic/lldiv.c: Likewise.
* sysdeps/alpha/Makefile (divrem): Add divlu, dviqu, remlu, and
remqu.
* sysdeps/alpha/div.S: New file.
* sysdeps/alpha/ldiv.S: New file.
* sysdeps/alpha/lldiv.S: New file.
* sysdeps/alpha/divrem.h: Merge signed and unsigned division.
Take pointers from Linus and tighten the inner loops a bit.
* sysdeps/alpha/divl.S: Change defines for merged routines.
* sysdeps/alpha/divq.S: Likewise.
* sysdeps/alpha/reml.S: Likewise.
* sysdeps/alpha/remq.S: Likewise.
* sysdeps/alpha/divlu.S: Remove file.
* sysdeps/alpha/divqu.S: Likewise.
* sysdeps/alpha/remlu.S: Likewise.
* sysdeps/alpha/remqu.S: Likewise.
* sysdeps/alpha/bsd-_setjmp.S: If PROF, call _mcount.
* sysdeps/alpha/bsd-setjmp.S: Likewise.
* sysdeps/alpha/bzero.S: Likewise.
* sysdeps/alpha/ffs.S: Likewise.
* sysdeps/alpha/htonl.S: Likewise.
* sysdeps/alpha/htons.S: Likewise.
* sysdeps/alpha/memchr.S: Likewise.
* sysdeps/alpha/memset.S: Likewise.
* sysdeps/alpha/s_copysign.S: Likewise.
* sysdeps/alpha/s_fabs.S: Likewise.
* sysdeps/alpha/setjmp.S: Likewise.
* sysdeps/alpha/stpcpy.S: Likewise.
* sysdeps/alpha/stpncpy.S: Likewise.
* sysdeps/alpha/strcat.S: Likewise.
* sysdeps/alpha/strchr.S: Likewise.
* sysdeps/alpha/strcpy.S: Likewise.
* sysdeps/alpha/strlen.S: Likewise.
* sysdeps/alpha/strncat.S: Likewise.
* sysdeps/alpha/strncpy.S: Likewise.
* sysdeps/alpha/strrchr.S: Likewise.
* sysdeps/alpha/udiv_qrnnd.S: Likewise. Fix private labels.
Convert two small jumps to use conditional moves.
* sysdeps/unix/alpha/sysdep.h: Compress all __STDC__ nastiness.
(PSEUDO): If PROF, call _mcount.
* sysdeps/unix/sysv/linux/alpha/brk.S: If PROF, call _mcount.
* sysdeps/unix/sysv/linux/alpha/clone.S: Likewise.
* sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S: Likewise.
* sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S: Likewise.
* sysdeps/unix/sysv/linux/alpha/llseek.S: Likewise.
* sysdeps/unix/sysv/linux/alpha/sigsuspend.S: Likewise.
* sysdeps/unix/sysv/linux/alpha/syscall.S: Likewise.
* sysdeps/alpha/memcpy.S: New file. Odd layout because it should
eventually contain memmove as well.
* sysdeps/alpha/strcmp.S: New file.
* sysdeps/alpha/strncmp.S: New file.
* sysdeps/alpha/w_sqrt.S: New file.
Tue Nov 5 18:06:06 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/mach/hurd/ttyname_r.c: Use `size_t' for len variable.
Tue Nov 5 12:09:29 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdep/generic/sysdep.h: Define END only if not yet defined.
* sysdep/unix/sysdep.h: Define PSEUDO_END only if not yet defined.
Reported by Thomas Bushnell, n/BSG.
Mon Nov 4 22:46:53 1996 Ulrich Drepper <drepper@cygnus.com>
* manual/users.texi (Netgroup Data): Remove { } around @cindex.
Mon Nov 4 19:07:05 1996 Ulrich Drepper <drepper@cygnus.com>
* malloc/calloc.c: Check for overflow before trying to allocate
memory. Proposed by Neil Matthews <nm@adv.sbc.sony.co.jp>.
Fri Nov 1 18:18:32 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* manual/llio.texi (Operating Modes): Add missing arguments to
@deftypevr in O_NONBLOCK description.
* manual/time.texi (Time Zone Functions): Enclose type name in
braces in description of tzname. FIXME: this does not yet work
correctly in info.
Sun Nov 3 17:29:06 1996 Ulrich Drepper <drepper@cygnus.com>
* features.h: Add X/Open macros.
* posix/unistd.h: Define X/Open macros.
* sysdeps/generic/confname.h: Add _SC_XOPEN_XCU_VERSION,
_SC_XOPEN_UNIX, _SC_XOPEN_CRYPT, _SC_XOPEN_ENH_I18N,
_SC_XOPEN_SHM, _SC_2_CHAR_TERM, _SC_2_C_VERSION, and _SC_2_UPE.
* sysdeps/posix/sysconf.c: Handle new constants.
* sysdeps/stub/sysconf.c: Likewise.
* sysdeps/unix/sysv/linux/posix_opt.h: Add definition of _XOPEN_SHM.
* catgets/catgets.c (catopen): Set errno to ENOMEM when
we run out of memory.
(catgets): Set errno to EBADF when catalog handle is invalid.
Set errno to ENOMSG when translation is not available.
(catclose): Set errno to EBADF when catalog handle is invalid.
* ctype/ctype.h: Declare isascii and toascii when __USE_XOPEN.
Likewise for _toupper and _tolower.
* manual/arith.texi: Document strtoq, strtoll, strtouq, strtoull,
strtof, and strtold.
* manual/math.texi: Document HUGE_VALf and HUGE_VALl.
* manual/stdio.h: Document ' flag for numeric formats of scanf.
* manual/users.texi: Document that cuserid shouldn't be used.
* misc/Makefile (routines): Add dirname.
(headers): Add libgen.h.
(tests): Add tst-dirname.
* misc/dirname.c: New file.
* misc/libgen.h: New file.
* misc/tst-dirname.c: New file.
* misc/search.h: Parameter of hcreate must be of type size_t.
* misc/hsearch.c: Likewise.
* misc/hsearch_r.c: Likewise for hcreate_r.
* misc/search.h: Parameters of insque and remque must be `void *'.
* misc/insremque.c: Likewise.
* posix/unistd.h: Move declarations of mktemp and mkstemp to...
* stdlib/stdlib.h: ...here.
* posix/unistd.h [__USE_XOPEN]: Add prototypes for crypt, setkey,
encrypt, and swab.
* stdio-common/printf-parse.h (struct printf_spec): Add pa_wchar
and pa_wstring.
(parse_one_spec): Remove Linux compatibility code.
Recognize %C and %S formats.
* stdio-common/printf.h: Add PA_WCHAR and PA_WSTRING.
* stdio-common/vfprintf.c: Add implementation of %C and %S format.
* stdio-common/vfscanf.c: Likewise for scanf.
* stdlib/l64a.c: Return value for 0 must be the empty string.
* stdlib/stdlib.h: Declare reentrant function from rand49 family
only if __USE_REENTRANT.
Declare rand48 functions also if __USE_XOPEN.
* stdlib/strtol.c: Return 0 and set errno to EINVAL when BASE is
not a legal value.
Return 0 and set errno to EINVAL when strou* sees negativ number.
* stdlib/tst-strtol.c: De-ANSI-fy.
Change expected results for test of unsigned function and negative
input.
* string/stratcliff.c: Prevent warnings.
* string.h: Move declaration of swab to <unistd.h>.
* string/swab.c: De-ANSI-fy.
* sysdeps/posix/cuserid.c: Implement using getpwuid_r.
* sysdeps/posix/mkstemp.c: Include <stdlib.h> for prototype.
* sysdeps/posix/mktemp.c: Likewise.
* sysdeps/stub/mkstemp.c: Likewise.
* sysdeps/stub/mktemp.c: Likewise.
* sysvipc/sys/ipc.h: Prototypes of ftok have to be of types `const
char *' and `int'.
* sysvipc/ftok.c: Likewise. Make sure only lower 8 bits of
PROJ_ID are used.
Sun Nov 3 03:21:28 1996 Heiko Schroeder <Heiko.Schroeder@post.rwth-aachen.de>
* locale/programs/ld-numeric.c (numeric_output): Compute idx[0]
correctly.
Sat Nov 2 17:44:32 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/posix/cuserid.c: Use reentrant functions.
* manual/users.texi: Tell that cuserid is marked to be withdrawn in
XPG4.2.
Sat Nov 2 14:26:37 1996 Ulrich Drepper <drepper@cygnus.com>
Linus said he will make sure no system call will return a value
in -1 ... -4095 as a valid result.
* sysdeps/unix/sysv/linux/i386/sysdep.h: Correct test for error.
* sysdeps/unix/sysv/linux/i386/syscall.S: Likewise.
* sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.
Sat Nov 2 16:54:49 1996 NIIBE Yutaka <gniibe@mri.co.jp>
* sysdeps/stub/lockfile.c [!USE_IN_LIBIO]: Define weak alias for
__funlockfile, not a circular alias.
Define __IO_ftrylockfile if USE_IN_LIBIO and __ftrylockfile if not,
not vice versa.
* sysdeps/unix/sysv/linux/i386/sysdep.S (__errno_location): Make
it a weak symbol.
* sysdeps/unix/sysv/linux/m68k/sysdep.S (__errno_location): Likewise.
Tue Nov 5 00:04:48 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* stdio-common/vfprintf.c: Include <libc-lock.h>.
@ -624,7 +935,7 @@ Tue Oct 15 22:41:27 1996 Ulrich Drepper <drepper@cygnus.com>
Tue Oct 15 08:06:02 1996 Andreas Jaeger <aj@arthur.pfalz.de>
* crypt/Makefiel (rpath-link): Extend search path to current directory.
* crypt/Makefile (rpath-link): Extend search path to current directory.
Fri Oct 11 09:18:06 1996 Sven Verdoolaege <skimo@breughel.ufsia.ac.be>

View File

@ -12,9 +12,9 @@
# 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., 675 Mass Ave,
# Cambridge, MA 02139, USA.
# 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.
#
# Master Makefile for the GNU C library
@ -82,7 +82,7 @@ subdirs := $(filter mach,$(subdirs)) $(filter hurd,$(subdirs)) \
$(addprefix install-, no-libc.a bin lib data headers others)
headers := errno.h sys/errno.h errnos.h limits.h values.h \
features.h gnu-versions.h libc-lock.h
features.h gnu-versions.h libc-lock.h xopen_lim.h
aux = sysdep $(libc-init) version
before-compile = $(objpfx)version-info.h

View File

@ -27,3 +27,830 @@ s_atanl.c
s_erfl.c
s_expm1l.c
s_log1pl.c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Methods
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arcsin
~~~~~~
* Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
* we approximate asin(x) on [0,0.5] by
* asin(x) = x + x*x^2*R(x^2)
* where
* R(x^2) is a rational approximation of (asin(x)-x)/x^3
* and its remez error is bounded by
* |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
*
* For x in [0.5,1]
* asin(x) = pi/2-2*asin(sqrt((1-x)/2))
* Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
* then for x>0.98
* asin(x) = pi/2 - 2*(s+s*z*R(z))
* = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
* For x<=0.98, let pio4_hi = pio2_hi/2, then
* f = hi part of s;
* c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z)
* and
* asin(x) = pi/2 - 2*(s+s*z*R(z))
* = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
* = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arccos
~~~~~~
* Method :
* acos(x) = pi/2 - asin(x)
* acos(-x) = pi/2 + asin(x)
* For |x|<=0.5
* acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
* For x>0.5
* acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
* = 2asin(sqrt((1-x)/2))
* = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
* = 2f + (2c + 2s*z*R(z))
* where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
* for f so that f+c ~ sqrt(z).
* For x<-0.5
* acos(x) = pi - 2asin(sqrt((1-|x|)/2))
* = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
atan2
~~~~~
* Method :
* 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
* 2. Reduce x to positive by (if x and y are unexceptional):
* ARG (x+iy) = arctan(y/x) ... if x > 0,
* ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
atan
~~~~
* Method
* 1. Reduce x to positive by atan(x) = -atan(-x).
* 2. According to the integer k=4t+0.25 chopped, t=x, the argument
* is further reduced to one of the following intervals and the
* arctangent of t is evaluated by the corresponding formula:
*
* [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
* [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
* [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
* [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
* [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
exp
~~~
* Method
* 1. Argument reduction:
* Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
* Given x, find r and integer k such that
*
* x = k*ln2 + r, |r| <= 0.5*ln2.
*
* Here r will be represented as r = hi-lo for better
* accuracy.
*
* 2. Approximation of exp(r) by a special rational function on
* the interval [0,0.34658]:
* Write
* R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
* We use a special Reme algorithm on [0,0.34658] to generate
* a polynomial of degree 5 to approximate R. The maximum error
* of this polynomial approximation is bounded by 2**-59. In
* other words,
* R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
* (where z=r*r, and the values of P1 to P5 are listed below)
* and
* | 5 | -59
* | 2.0+P1*z+...+P5*z - R(z) | <= 2
* | |
* The computation of exp(r) thus becomes
* 2*r
* exp(r) = 1 + -------
* R - r
* r*R1(r)
* = 1 + r + ----------- (for better accuracy)
* 2 - R1(r)
* where
* 2 4 10
* R1(r) = r - (P1*r + P2*r + ... + P5*r ).
*
* 3. Scale back to obtain exp(x):
* From step 1, we have
* exp(x) = 2^k * exp(r)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hypot
~~~~~
* If (assume round-to-nearest) z=x*x+y*y
* has error less than sqrt(2)/2 ulp, than
* sqrt(z) has error less than 1 ulp (exercise).
*
* So, compute sqrt(x*x+y*y) with some care as
* follows to get the error below 1 ulp:
*
* Assume x>y>0;
* (if possible, set rounding to round-to-nearest)
* 1. if x > 2y use
* x1*x1+(y*y+(x2*(x+x1))) for x*x+y*y
* where x1 = x with lower 32 bits cleared, x2 = x-x1; else
* 2. if x <= 2y use
* t1*y1+((x-y)*(x-y)+(t1*y2+t2*y))
* where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1,
* y1= y with lower 32 bits chopped, y2 = y-y1.
*
* NOTE: scaling may be necessary if some argument is too
* large or too tiny
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
j0/y0
~~~~~
* Method -- j0(x):
* 1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
* 2. Reduce x to |x| since j0(x)=j0(-x), and
* for x in (0,2)
* j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x;
* (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
* for x in (2,inf)
* j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
* where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
* as follow:
* cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
* = 1/sqrt(2) * (cos(x) + sin(x))
* sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* (To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.)
*
* Method -- y0(x):
* 1. For x<2.
* Since
* y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
* therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
* We use the following function to approximate y0,
* y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
* where
* U(z) = u00 + u01*z + ... + u06*z^6
* V(z) = 1 + v01*z + ... + v04*z^4
* with absolute approximation error bounded by 2**-72.
* Note: For tiny x, U/V = u0 and j0(x)~1, hence
* y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
* 2. For x>=2.
* y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
* where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
* by the method mentioned above.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
j1/y1
~~~~~
* Method -- j1(x):
* 1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
* 2. Reduce x to |x| since j1(x)=-j1(-x), and
* for x in (0,2)
* j1(x) = x/2 + x*z*R0/S0, where z = x*x;
* (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 )
* for x in (2,inf)
* j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
* where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
* as follow:
* cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = -1/sqrt(2) * (sin(x) + cos(x))
* (To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.)
*
* Method -- y1(x):
* 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
* 2. For x<2.
* Since
* y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
* therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
* We use the following function to approximate y1,
* y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
* where for x in [0,2] (abs err less than 2**-65.89)
* U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
* V(z) = 1 + v0[0]*z + ... + v0[4]*z^5
* Note: For tiny x, 1/x dominate y1 and hence
* y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
* 3. For x>=2.
* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
* where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
* by method mentioned above.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jn/yn
~~~~~
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
jn:
/* (x >> n**2)
* Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Let s=sin(x), c=cos(x),
* xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
*
* n sin(xn)*sqt2 cos(xn)*sqt2
* ----------------------------------
* 0 s-c c+s
* 1 -s-c -c+s
* 2 -s+c -c-s
* 3 s+c c-s
...
/* x is tiny, return the first Taylor expansion of J(n,x)
* J(n,x) = 1/n!*(x/2)^n - ...
...
/* use backward recurrence */
/* x x^2 x^2
* J(n,x)/J(n-1,x) = ---- ------ ------ .....
* 2n - 2(n+1) - 2(n+2)
*
* 1 1 1
* (for large x) = ---- ------ ------ .....
* 2n 2(n+1) 2(n+2)
* -- - ------ - ------ -
* x x x
*
* Let w = 2n/x and h=2/x, then the above quotient
* is equal to the continued fraction:
* 1
* = -----------------------
* 1
* w - -----------------
* 1
* w+h - ---------
* w+2h - ...
*
* To determine how many terms needed, let
* Q(0) = w, Q(1) = w(w+h) - 1,
* Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
* When Q(k) > 1e4 good for single
* When Q(k) > 1e9 good for double
* When Q(k) > 1e17 good for quadruple
...
/* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
* Hence, if n*(log(2n/x)) > ...
* single 8.8722839355e+01
* double 7.09782712893383973096e+02
* long double 1.1356523406294143949491931077970765006170e+04
* then recurrent value may overflow and the result is
* likely underflow to zero
yn:
/* (x >> n**2)
* Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Let s=sin(x), c=cos(x),
* xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
*
* n sin(xn)*sqt2 cos(xn)*sqt2
* ----------------------------------
* 0 s-c c+s
* 1 -s-c -c+s
* 2 -s+c -c-s
* 3 s+c c-s
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lgamma
~~~~~~
* Method:
* 1. Argument Reduction for 0 < x <= 8
* Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
* reduce x to a number in [1.5,2.5] by
* lgamma(1+s) = log(s) + lgamma(s)
* for example,
* lgamma(7.3) = log(6.3) + lgamma(6.3)
* = log(6.3*5.3) + lgamma(5.3)
* = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
* 2. Polynomial approximation of lgamma around its
* minimun ymin=1.461632144968362245 to maintain monotonicity.
* On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
* Let z = x-ymin;
* lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
* where
* poly(z) is a 14 degree polynomial.
* 2. Rational approximation in the primary interval [2,3]
* We use the following approximation:
* s = x-2.0;
* lgamma(x) = 0.5*s + s*P(s)/Q(s)
* with accuracy
* |P/Q - (lgamma(x)-0.5s)| < 2**-61.71
* Our algorithms are based on the following observation
*
* zeta(2)-1 2 zeta(3)-1 3
* lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ...
* 2 3
*
* where Euler = 0.5771... is the Euler constant, which is very
* close to 0.5.
*
* 3. For x>=8, we have
* lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
* (better formula:
* lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
* Let z = 1/x, then we approximation
* f(z) = lgamma(x) - (x-0.5)(log(x)-1)
* by
* 3 5 11
* w = w0 + w1*z + w2*z + w3*z + ... + w6*z
* where
* |w - f(z)| < 2**-58.74
*
* 4. For negative x, since (G is gamma function)
* -x*G(-x)*G(x) = pi/sin(pi*x),
* we have
* G(x) = pi/(sin(pi*x)*(-x)*G(-x))
* since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
* Hence, for x<0, signgam = sign(sin(pi*x)) and
* lgamma(x) = log(|Gamma(x)|)
* = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
* Note: one should avoid compute pi*(-x) directly in the
* computation of sin(pi*(-x)).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
log
~~~
* Method :
* 1. Argument Reduction: find k and f such that
* x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* 2. Approximation of log(1+f).
* Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
* = 2s + 2/3 s**3 + 2/5 s**5 + .....,
* = 2s + s*R
* We use a special Reme algorithm on [0,0.1716] to generate
* a polynomial of degree 14 to approximate R The maximum error
* of this polynomial approximation is bounded by 2**-58.45. In
* other words,
* 2 4 6 8 10 12 14
* R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s
* (the values of Lg1 to Lg7 are listed in the program)
* and
* | 2 14 | -58.45
* | Lg1*s +...+Lg7*s - R(z) | <= 2
* | |
* Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
* In order to guarantee error in log below 1ulp, we compute log
* by
* log(1+f) = f - s*(f - R) (if f is not too large)
* log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)
*
* 3. Finally, log(x) = k*ln2 + log(1+f).
* = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
* Here ln2 is split into two floating point number:
* ln2_hi + ln2_lo,
* where n*ln2_hi is always exact for |n| < 2000.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
log10
~~~~~
* Method :
* Let log10_2hi = leading 40 bits of log10(2) and
* log10_2lo = log10(2) - log10_2hi,
* ivln10 = 1/log(10) rounded.
* Then
* n = ilogb(x),
* if(n<0) n = n+1;
* x = scalbn(x,-n);
* log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x))
*
* Note 1:
* To guarantee log10(10**n)=n, where 10**n is normal, the rounding
* mode must set to Round-to-Nearest.
* Note 2:
* [1/log(10)] rounded to 53 bits has error .198 ulps;
* log10 is monotonic at all binary break points.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pow
~~~
* Method: Let x = 2 * (1+f)
* 1. Compute and return log2(x) in two pieces:
* log2(x) = w1 + w2,
* where w1 has 53-24 = 29 bit trailing zeros.
* 2. Perform y*log2(x) = n+y' by simulating muti-precision
* arithmetic, where |y'|<=0.5.
* 3. Return x**y = 2**n*exp(y'*log2)
*
* Special cases:
* 1. (anything) ** 0 is 1
* 2. (anything) ** 1 is itself
* 3. (anything) ** NAN is NAN
* 4. NAN ** (anything except 0) is NAN
* 5. +-(|x| > 1) ** +INF is +INF
* 6. +-(|x| > 1) ** -INF is +0
* 7. +-(|x| < 1) ** +INF is +0
* 8. +-(|x| < 1) ** -INF is +INF
* 9. +-1 ** +-INF is NAN
* 10. +0 ** (+anything except 0, NAN) is +0
* 11. -0 ** (+anything except 0, NAN, odd integer) is +0
* 12. +0 ** (-anything except 0, NAN) is +INF
* 13. -0 ** (-anything except 0, NAN, odd integer) is +INF
* 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
* 15. +INF ** (+anything except 0,NAN) is +INF
* 16. +INF ** (-anything except 0,NAN) is +0
* 17. -INF ** (anything) = -0 ** (-anything)
* 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
* 19. (-anything except 0 and inf) ** (non-integer) is NAN
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rem_pio2 return the remainder of x rem pi/2 in y[0]+y[1]
~~~~~~~~
This is one of the basic functions which is written with highest accuracy
in mind.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sinh
~~~~
* Method :
* mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2
* 1. Replace x by |x| (sinh(-x) = -sinh(x)).
* 2.
* E + E/(E+1)
* 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x)
* 2
*
* 22 <= x <= lnovft : sinh(x) := exp(x)/2
* lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2)
* ln2ovft < x : sinh(x) := x*shuge (overflow)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sqrt
~~~~
* Method:
* Bit by bit method using integer arithmetic. (Slow, but portable)
* 1. Normalization
* Scale x to y in [1,4) with even powers of 2:
* find an integer k such that 1 <= (y=x*2^(2k)) < 4, then
* sqrt(x) = 2^k * sqrt(y)
* 2. Bit by bit computation
* Let q = sqrt(y) truncated to i bit after binary point (q = 1),
* i 0
* i+1 2
* s = 2*q , and y = 2 * ( y - q ). (1)
* i i i i
*
* To compute q from q , one checks whether
* i+1 i
*
* -(i+1) 2
* (q + 2 ) <= y. (2)
* i
* -(i+1)
* If (2) is false, then q = q ; otherwise q = q + 2 .
* i+1 i i+1 i
*
* With some algebric manipulation, it is not difficult to see
* that (2) is equivalent to
* -(i+1)
* s + 2 <= y (3)
* i i
*
* The advantage of (3) is that s and y can be computed by
* i i
* the following recurrence formula:
* if (3) is false
*
* s = s , y = y ; (4)
* i+1 i i+1 i
*
* otherwise,
* -i -(i+1)
* s = s + 2 , y = y - s - 2 (5)
* i+1 i i+1 i i
*
* One may easily use induction to prove (4) and (5).
* Note. Since the left hand side of (3) contain only i+2 bits,
* it does not necessary to do a full (53-bit) comparison
* in (3).
* 3. Final rounding
* After generating the 53 bits result, we compute one more bit.
* Together with the remainder, we can decide whether the
* result is exact, bigger than 1/2ulp, or less than 1/2ulp
* (it will never equal to 1/2ulp).
* The rounding mode can be detected by checking whether
* huge + tiny is equal to huge, and whether huge - tiny is
* equal to huge for some floating point number "huge" and "tiny".
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cos
~~~
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
*
* Algorithm
* 1. Since cos(-x) = cos(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
* 3. cos(x) is approximated by a polynomial of degree 14 on
* [0,pi/4]
* 4 14
* cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
* where the remez error is
*
* | 2 4 6 8 10 12 14 | -58
* |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
* | |
*
* 4 6 8 10 12 14
* 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
* cos(x) = 1 - x*x/2 + r
* since cos(x+y) ~ cos(x) - sin(x)*y
* ~ cos(x) - x*y,
* a correction term is necessary in cos(x) and hence
* cos(x+y) = 1 - (x*x/2 - (r - x*y))
* For better accuracy when x > 0.3, let qx = |x|/4 with
* the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.
* Then
* cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).
* Note that 1-qx and (x*x/2-qx) is EXACT here, and the
* magnitude of the latter is at least a quarter of x*x/2,
* thus, reducing the rounding error in the subtraction.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sin
~~~
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13
* sin(x) ~ x + S1*x + ... + S6*x
* where
*
* |sin(x) 2 4 6 8 10 12 | -58
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
* | x |
*
* 4. sin(x+y) = sin(x) + sin'(x')*y
* ~ sin(x) + (1-x*x/2)*y
* For better accuracy, let
* 3 2 2 2 2
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
* then 3 2
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tan
~~~
* kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input k indicates whether tan (if k=1) or
* -1/tan (if k= -1) is returned.
*
* Algorithm
* 1. Since tan(-x) = -tan(x), we need only to consider positive x.
* 2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.
* 3. tan(x) is approximated by a odd polynomial of degree 27 on
* [0,0.67434]
* 3 27
* tan(x) ~ x + T1*x + ... + T13*x
* where
*
* |tan(x) 2 4 26 | -59.2
* |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2
* | x |
*
* Note: tan(x+y) = tan(x) + tan'(x)*y
* ~ tan(x) + (1+x*x)*y
* Therefore, for better accuracy in computing tan(x+y), let
* 3 2 2 2 2
* r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
* then
* 3 2
* tan(x+y) = x + (T1*x + (x *(r+y)+y))
*
* 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
* tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
* = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
atan
~~~~
* Method
* 1. Reduce x to positive by atan(x) = -atan(-x).
* 2. According to the integer k=4t+0.25 chopped, t=x, the argument
* is further reduced to one of the following intervals and the
* arctangent of t is evaluated by the corresponding formula:
*
* [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
* [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
* [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
* [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
* [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
erf
~~~
* x
* 2 |\
* erf(x) = --------- | exp(-t*t)dt
* sqrt(pi) \|
* 0
*
* erfc(x) = 1-erf(x)
* Note that
* erf(-x) = -erf(x)
* erfc(-x) = 2 - erfc(x)
*
* Method:
* 1. For |x| in [0, 0.84375]
* erf(x) = x + x*R(x^2)
* erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
* = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
* where R = P/Q where P is an odd poly of degree 8 and
* Q is an odd poly of degree 10.
* -57.90
* | R - (erf(x)-x)/x | <= 2
*
*
* Remark. The formula is derived by noting
* erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
* and that
* 2/sqrt(pi) = 1.128379167095512573896158903121545171688
* is close to one. The interval is chosen because the fix
* point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
* near 0.6174), and by some experiment, 0.84375 is chosen to
* guarantee the error is less than one ulp for erf.
*
* 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
* c = 0.84506291151 rounded to single (24 bits)
* erf(x) = sign(x) * (c + P1(s)/Q1(s))
* erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0
* 1+(c+P1(s)/Q1(s)) if x < 0
* |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
* Remark: here we use the taylor series expansion at x=1.
* erf(1+s) = erf(1) + s*Poly(s)
* = 0.845.. + P1(s)/Q1(s)
* That is, we use rational approximation to approximate
* erf(1+s) - (c = (single)0.84506291151)
* Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
* where
* P1(s) = degree 6 poly in s
* Q1(s) = degree 6 poly in s
*
* 3. For x in [1.25,1/0.35(~2.857143)],
* erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
* erf(x) = 1 - erfc(x)
* where
* R1(z) = degree 7 poly in z, (z=1/x^2)
* S1(z) = degree 8 poly in z
*
* 4. For x in [1/0.35,28]
* erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
* = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
* = 2.0 - tiny (if x <= -6)
* erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6, else
* erf(x) = sign(x)*(1.0 - tiny)
* where
* R2(z) = degree 6 poly in z, (z=1/x^2)
* S2(z) = degree 7 poly in z
*
* Note1:
* To compute exp(-x*x-0.5625+R/S), let s be a single
* precision number and s := x; then
* -x*x = -s*s + (s-x)*(s+x)
* exp(-x*x-0.5626+R/S) =
* exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
* Note2:
* Here 4 and 5 make use of the asymptotic series
* exp(-x*x)
* erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
* x*sqrt(pi)
* We use rational approximation to approximate
* g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
* Here is the error bound for R1/S1 and R2/S2
* |R1/S1 - f(x)| < 2**(-62.57)
* |R2/S2 - f(x)| < 2**(-61.52)
*
* 5. For inf > x >= 28
* erf(x) = sign(x) *(1 - tiny) (raise inexact)
* erfc(x) = tiny*tiny (raise underflow) if x > 0
* = 2 - tiny if x<0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
expm1 Returns exp(x)-1, the exponential of x minus 1
~~~~~
* Method
* 1. Argument reduction:
* Given x, find r and integer k such that
*
* x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658
*
* Here a correction term c will be computed to compensate
* the error in r when rounded to a floating-point number.
*
* 2. Approximating expm1(r) by a special rational function on
* the interval [0,0.34658]:
* Since
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
* we define R1(r*r) by
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
* That is,
* R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
* = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
* = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
* We use a special Reme algorithm on [0,0.347] to generate
* a polynomial of degree 5 in r*r to approximate R1. The
* maximum error of this polynomial approximation is bounded
* by 2**-61. In other words,
* R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
* where Q1 = -1.6666666666666567384E-2,
* Q2 = 3.9682539681370365873E-4,
* Q3 = -9.9206344733435987357E-6,
* Q4 = 2.5051361420808517002E-7,
* Q5 = -6.2843505682382617102E-9;
* (where z=r*r, and the values of Q1 to Q5 are listed below)
* with error bounded by
* | 5 | -61
* | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2
* | |
*
* expm1(r) = exp(r)-1 is then computed by the following
* specific way which minimize the accumulation rounding error:
* 2 3
* r r [ 3 - (R1 + R1*r/2) ]
* expm1(r) = r + --- + --- * [--------------------]
* 2 2 [ 6 - r*(3 - R1*r/2) ]
*
* To compensate the error in the argument reduction, we use
* expm1(r+c) = expm1(r) + c + expm1(r)*c
* ~ expm1(r) + c + r*c
* Thus c+r*c will be added in as the correction terms for
* expm1(r+c). Now rearrange the term to avoid optimization
* screw up:
* ( 2 2 )
* ({ ( r [ R1 - (3 - R1*r/2) ] ) } r )
* expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
* ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 )
* ( )
*
* = r - E
* 3. Scale back to obtain expm1(x):
* From step 1, we have
* expm1(x) = either 2^k*[expm1(r)+1] - 1
* = or 2^k*[expm1(r) + (1-2^-k)]
* 4. Implementation notes:
* (A). To save one multiplication, we scale the coefficient Qi
* to Qi*2^i, and replace z by (x^2)/2.
* (B). To achieve maximum accuracy, we compute expm1(x) by
* (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
* (ii) if k=0, return r-E
* (iii) if k=-1, return 0.5*(r-E)-0.5
* (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E)
* else return 1.0+2.0*(r-E);
* (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
* (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else
* (vii) return 2^k(1-((E+2^-k)-r))
*
* Special cases:
* expm1(INF) is INF, expm1(NaN) is NaN;
* expm1(-INF) is -1, and
* for finite argument, only expm1(0)=0 is exact.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
log1p
~~~~~
* Method :
* 1. Argument Reduction: find k and f such that
* 1+x = 2^k * (1+f),
* where sqrt(2)/2 < 1+f < sqrt(2) .
*
* Note. If k=0, then f=x is exact. However, if k!=0, then f
* may not be representable exactly. In that case, a correction
* term is need. Let u=1+x rounded. Let c = (1+x)-u, then
* log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
* and add back the correction term c/u.
* (Note: when x > 2**53, one can simply return log(x))
*
* 2. Approximation of log1p(f).
* Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
* = 2s + 2/3 s**3 + 2/5 s**5 + .....,
* = 2s + s*R
* We use a special Reme algorithm on [0,0.1716] to generate
* a polynomial of degree 14 to approximate R The maximum error
* of this polynomial approximation is bounded by 2**-58.45. In
* other words,
* 2 4 6 8 10 12 14
* R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s +Lp6*s +Lp7*s
* (the values of Lp1 to Lp7 are listed in the program)
* and
* | 2 14 | -58.45
* | Lp1*s +...+Lp7*s - R(z) | <= 2
* | |
* Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
* In order to guarantee error in log below 1ulp, we compute log
* by
* log1p(f) = f - (hfsq - s*(hfsq+R)).
*
* 3. Finally, log1p(x) = k*ln2 + log1p(f).
* = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
* Here ln2 is split into two floating point number:
* ln2_hi + ln2_lo,
* where n*ln2_hi is always exact for |n| < 2000.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -13,11 +13,12 @@ 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,
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <alloca.h>
#include <errno.h>
#include <nl_types.h>
#include <stdlib.h>
#include <string.h>
@ -45,6 +46,7 @@ catopen (const char *cat_name, int flag)
if (result->cat_name == NULL)
{
free (result);
__set_errno (ENOMEM);
return (nl_catd) -1;
}
@ -76,6 +78,7 @@ catopen (const char *cat_name, int flag)
{
free ((void *) result->cat_name);
free ((void *) result);
__set_errno (ENOMEM);
return (nl_catd) -1;
}
@ -89,6 +92,7 @@ catopen (const char *cat_name, int flag)
free ((void *) result->cat_name);
free ((void *) result->env_var);
free ((void *) result);
__set_errno (ENOMEM);
return (nl_catd) -1;
}
}
@ -120,7 +124,10 @@ catgets (nl_catd catalog_desc, int set, int message, const char *string)
__open_catalog (catalog, 1);
if (catalog->status == nonexisting)
{
__set_errno (EBADF);
return (char *) string;
}
idx = ((set * message) % catalog->plane_size) * 3;
cnt = 0;
@ -134,6 +141,7 @@ catgets (nl_catd catalog_desc, int set, int message, const char *string)
}
while (++cnt < catalog->plane_depth);
__set_errno (ENOMSG);
return (char *) string;
}
@ -151,7 +159,10 @@ catclose (nl_catd catalog_desc)
else if (catalog->status == malloced)
free ((void *) catalog->file_ptr);
else if (catalog->status != closed && catalog->status != nonexisting)
{
__set_errno (EBADF);
return -1;
}
if (catalog->nlspath)
free ((void *) catalog->nlspath);

View File

@ -12,8 +12,8 @@ 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,
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 _NL_TYPES_H
@ -26,12 +26,12 @@ Boston, MA 02111-1307, USA. */
/* Value for FLAG parameter of `catgets' to say we want XPG4 compliance. */
#define NL_CAT_LOCALE 1
/* Message catalog descriptor type. */
typedef void *nl_catd;
__BEGIN_DECLS
/* Message catalog descriptor type. */
typedef void *nl_catd;
/* Open message catalog for later use, returning descriptor. */
extern nl_catd catopen __P ((__const char *__cat_name, int __flag));

View File

@ -13,8 +13,8 @@ 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,
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <endian.h>

View File

@ -114,7 +114,7 @@ extern int tolower __P ((int __c));
extern int toupper __P ((int __c));
#if defined(__USE_SVID) || defined(__USE_MISC)
#if defined(__USE_SVID) || defined(__USE_MISC) || defined(__USE_XOPEN)
/* Return nonzero iff C is in the ASCII set
(i.e., is no more than 7 bits wide). */
@ -126,7 +126,7 @@ extern int toascii __P ((int __c));
#endif /* Use SVID or use misc. */
#ifdef __USE_SVID
#if defined(__USE_SVID) || defined(__USE_XOPEN)
/* These are the same as `toupper' and `tolower'. */
__exctype (_toupper);
__exctype (_tolower);

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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 _FEATURES_H
@ -26,6 +26,8 @@ Cambridge, MA 02139, USA. */
__STRICT_ANSI__ ANSI Standard C.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if ==2 add IEEE Std 1003.2.
_XOPEN_SOURCE Includes POSIX and XPG things.
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
_BSD_SOURCE ANSI, POSIX, and 4.3BSD things.
_SVID_SOURCE ANSI, POSIX, and SVID things.
_GNU_SOURCE All of the above, plus GNU extensions.
@ -43,6 +45,8 @@ Cambridge, MA 02139, USA. */
__USE_POSIX Define IEEE Std 1003.1 things.
__USE_POSIX2 Define IEEE Std 1003.2 things.
__USE_XOPEN Define XPG things.
__USE_XOPEN_EXTENDED Define X/Open Unix things.
__USE_BSD Define 4.3BSD things.
__USE_SVID Define SVID things.
__USE_MISC Define things common to BSD and System V Unix.
@ -62,6 +66,8 @@ Cambridge, MA 02139, USA. */
/* Undefine everything, so we get a clean slate. */
#undef __USE_POSIX
#undef __USE_POSIX2
#undef __USE_XOPEN
#undef __USE_XOPEN_EXTENDED
#undef __USE_BSD
#undef __USE_SVID
#undef __USE_MISC
@ -71,7 +77,7 @@ Cambridge, MA 02139, USA. */
#undef __KERNEL_STRICT_NAMES
/* Suppress kernel-name space pollution unless user expressedly asks
for it: */
for it. */
#ifndef _LOOSE_KERNEL_NAMES
# define __KERNEL_STRICT_NAMES
#endif
@ -83,6 +89,7 @@ Cambridge, MA 02139, USA. */
/* If _BSD_SOURCE was defined by the user, favor BSD over POSIX. */
#if defined (_BSD_SOURCE) && \
!(defined (_POSIX_SOURCE) || defined (_POSIX_C_SOURCE) || \
defined (_XOPEN_SOURCE) || defined (_XOPEN_SOURCE_DEFINED) || \
defined (_GNU_SOURCE) || defined (_SVID_SOURCE))
# define __FAVOR_BSD 1
#endif
@ -93,6 +100,10 @@ Cambridge, MA 02139, USA. */
#define _POSIX_SOURCE 1
#undef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 2
#undef _XOPEN_SOURCE
#define _XOPEN_SOURCE 1
#undef _XOPEN_SOURCE_EXTENDED
#define _XOPEN_SOURCE_EXTENDED 1
#undef _BSD_SOURCE
#define _BSD_SOURCE 1
#undef _SVID_SOURCE
@ -102,7 +113,8 @@ Cambridge, MA 02139, USA. */
/* If nothing (other than _GNU_SOURCE) is defined,
define _BSD_SOURCE and _SVID_SOURCE. */
#if (!defined (__STRICT_ANSI__) && !defined (_POSIX_SOURCE) && \
!defined (_POSIX_C_SOURCE) && !defined (_BSD_SOURCE) && \
!defined (_POSIX_C_SOURCE) && !defined (_XOPEN_SOURCE) && \
!defined (_XOPEN_SOURCE_EXTENDED) && !defined (_BSD_SOURCE) && \
!defined (_SVID_SOURCE))
#define _BSD_SOURCE 1
#define _SVID_SOURCE 1
@ -115,14 +127,23 @@ Cambridge, MA 02139, USA. */
#define _POSIX_C_SOURCE 2
#endif
#if defined (_POSIX_SOURCE) || _POSIX_C_SOURCE >= 1
#if (defined (_POSIX_SOURCE) || _POSIX_C_SOURCE >= 1 || \
defined (_XOPEN_SOURCE))
#define __USE_POSIX 1
#endif
#if defined (_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 2
#if (defined (_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 2 || \
defined (_XOPEN_SOURCE))
#define __USE_POSIX2 1
#endif
#ifdef _XOPEN_SOURCE
#define __USE_XOPEN 1
#ifdef _XOPEN_SOURCE_EXTENDED
#define __USE_XOPEN_EXTENDED 1
#endif
#endif
#if defined (_BSD_SOURCE) || defined (_SVID_SOURCE)
#define __USE_MISC 1
#endif

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* POSIX Standard: 9.2.1 Group Database Access <grp.h>
@ -32,6 +32,9 @@ __BEGIN_DECLS
#define __need_size_t
#include <stddef.h>
#define __need_size_t
#include <stddef.h>
/* The group structure. */
struct group
@ -66,7 +69,7 @@ extern struct group *__grpscan __P ((__ptr_t *__p,
#endif
#if defined(__USE_SVID) || defined(__USE_MISC) || defined (__USE_BSD)
#if defined(__USE_SVID) || defined (__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Rewind the group-file stream. */
extern void setgrent __P ((void));
@ -98,7 +101,7 @@ extern struct group *getgrnam __P ((__const char *__name));
PLEASE NOTE: these functions are not yet standardized. The interface
may change in later versions of this library. */
#if defined(__USE_SVID) || defined(__USE_MISC) || defined (__USE_BSD)
#if defined(__USE_SVID) || defined (__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int getgrent_r __P ((struct group *__resultbuf, char *buffer,
size_t __buflen, struct group **__result));
#endif

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include <stdio.h>

View File

@ -12,9 +12,9 @@
# 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., 675 Mass Ave,
# Cambridge, MA 02139, USA.
# 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.
#
# Sub-makefile for I/O portion of the library.
@ -39,7 +39,7 @@ routines := \
creat \
chdir fchdir \
getcwd getwd getdirname \
chown fchown \
chown fchown lchown \
ttyname ttyname_r isatty \
link symlink readlink \
unlink rmdir \

View File

@ -1,5 +1,5 @@
/* Compatibility definitions for System V `poll' interface.
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
@ -13,9 +13,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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 _SYS_POLL_H
#define _SYS_POLL_H
@ -37,6 +37,9 @@ struct pollfd
#define POLLPRI 02 /* There is urgent data to read. */
#define POLLOUT 04 /* Writing now will not block. */
/* Some aliases. */
#define POLLWRNORM POLLOUT
/* Event types always implicitly polled for. These bits need not be set in
`events', but they will appear in `revents' to indicate the status of
the file descriptor. */
@ -62,4 +65,3 @@ extern int poll __P ((struct pollfd *__fds, unsigned long int __nfds,
__END_DECLS
#endif /* sys/poll.h */

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* POSIX Standard: 5.6 File Characteristics <sys/stat.h>
@ -127,7 +127,7 @@ extern int fstat __P ((int __fd, struct stat *__buf));
/* Get file attributes about FILE and put them in BUF.
If FILE is a symbolic link, do not follow it. */
extern int __lstat __P ((__const char *__file, struct stat *__buf));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int lstat __P ((__const char *__file, struct stat *__buf));
#endif
@ -139,7 +139,7 @@ extern int chmod __P ((__const char *__file, __mode_t __mode));
/* Set file access permissions of the file FD is open on to MODE. */
extern int __fchmod __P ((int __fd, __mode_t __mode));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int fchmod __P ((int __fd, __mode_t __mode));
#endif
@ -164,7 +164,7 @@ extern int mkdir __P ((__const char *__path, __mode_t __mode));
device numbers with the `makedev' macro above). */
extern int __mknod __P ((__const char *__path,
__mode_t __mode, __dev_t __dev));
#if defined(__USE_MISC) || defined(__USE_BSD)
#if defined(__USE_MISC) || defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int mknod __P ((__const char *__path,
__mode_t __mode, __dev_t __dev));
#endif

View File

@ -32,7 +32,7 @@ routines := \
\
clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar \
memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \
vdprintf vscanf vsnprintf \
vdprintf vscanf vsnprintf obprintf \
\
libc_fatal

View File

@ -32,6 +32,11 @@ extern int _IO_sprintf __P((char *, const char*, ...));
extern int _IO_ungetc __P((int, _IO_FILE*));
extern int _IO_vsscanf __P((const char *, const char *, _IO_va_list));
extern int _IO_vsprintf __P((char*, const char*, _IO_va_list));
struct obstack;
extern int _IO_obstack_vprintf __P ((struct obstack *, const char *,
_IO_va_list));
extern int _IO_obstack_printf __P ((struct obstack *, const char *, ...));
#ifndef _IO_pos_BAD
#define _IO_pos_BAD ((_IO_fpos_t)(-1))
#endif

View File

@ -97,7 +97,7 @@ the executable file might be covered by the GNU General Public License. */
/* Magic numbers and bits for the _flags field.
The magic numbers use the high-order bits of _flags;
the remaining bits are abailable for variable flags.
the remaining bits are available for variable flags.
Note: The magic numbers must all be negative if stdio
emulation is desired. */

164
libio/obprintf.c Normal file
View File

@ -0,0 +1,164 @@
/* Print output of stream to given obstack.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
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. */
#ifdef __STDC__
#include <stdlib.h>
#endif
#include "libioP.h"
#include <string.h>
#include <errno.h>
#include <obstack.h>
#include <stdarg.h>
struct _IO_obstack_file
{
struct _IO_FILE file;
const void *vtable;
struct obstack *obstack;
};
static int
_IO_obstack_overflow (_IO_FILE *fp, int c)
{
struct obstack *obstack = ((struct _IO_obstack_file *) fp)->obstack;
/* Make room for another character. This might as well allocate a
new chunk a memory and moves the old contents over. */
if (c != EOF)
obstack_1grow (obstack, c);
/* Setup the buffer pointers again. */
fp->_IO_write_base = obstack_base (obstack);
fp->_IO_write_ptr = obstack_next_free (obstack);
fp->_IO_write_end = fp->_IO_write_base + obstack_room (obstack);
/* Now allocate the rest of the current chunk. */
obstack_blank_fast (obstack, fp->_IO_write_end - fp->_IO_write_ptr);
return c;
}
static _IO_size_t
_IO_obstack_xsputn (_IO_FILE *fp, const void *data, _IO_size_t n)
{
struct obstack *obstack = ((struct _IO_obstack_file *) fp)->obstack;
if (fp->_IO_write_ptr + n > fp->_IO_write_end)
{
/* We need some more memory. First shrink the buffer to the
space we really currently need. */
obstack_blank (obstack, fp->_IO_write_ptr - fp->_IO_write_end);
/* Now grow for N bytes. */
obstack_blank (obstack, n);
/* Setup the buffer pointers again. */
fp->_IO_write_base = obstack_base (obstack);
fp->_IO_write_ptr = obstack_next_free (obstack);
fp->_IO_write_end = (fp->_IO_write_base + obstack_room (obstack));
/* Now allocate the rest of the current chunk. */
obstack_blank_fast (obstack, fp->_IO_write_end - fp->_IO_write_ptr);
}
else
{
memcpy (fp->_IO_write_ptr, data, n);
fp->_IO_write_ptr += n;
}
return n;
}
/* the jump table. */
static struct _IO_jump_t _IO_obstack_jumps =
{
JUMP_INIT_DUMMY,
JUMP_INIT(finish, NULL),
JUMP_INIT(overflow, _IO_obstack_overflow),
JUMP_INIT(underflow, NULL),
JUMP_INIT(uflow, NULL),
JUMP_INIT(pbackfail, NULL),
JUMP_INIT(xsputn, _IO_obstack_xsputn),
JUMP_INIT(xsgetn, NULL),
JUMP_INIT(seekoff, NULL),
JUMP_INIT(seekpos, NULL),
JUMP_INIT(setbuf, NULL),
JUMP_INIT(sync, NULL),
JUMP_INIT(doallocate, NULL),
JUMP_INIT(read, NULL),
JUMP_INIT(write, NULL),
JUMP_INIT(seek, NULL),
JUMP_INIT(close, NULL),
JUMP_INIT(stat, NULL)
};
int
_IO_obstack_vprintf (struct obstack *obstack, const char *format, va_list args)
{
struct obstack_FILE
{
struct _IO_obstack_file ofile;
#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
#endif
} new_f;
int result;
#ifdef _IO_MTSAFE_IO
new_f.ofile.file._lock = &new_f.lock;
#endif
_IO_init ((_IO_FILE *) &new_f.ofile, 0);
_IO_JUMPS (&new_f.ofile.file) = &_IO_obstack_jumps;
_IO_str_init_static (&new_f.ofile.file, obstack_base (obstack),
(obstack_object_size (obstack) +
obstack_room (obstack)), obstack_next_free (obstack));
/* Now allocate the rest of the current chunk. */
obstack_blank_fast (obstack,
(new_f.ofile.file._IO_write_end
- new_f.ofile.file._IO_write_ptr));
new_f.ofile.obstack = obstack;
result = _IO_vfprintf ((_IO_FILE *) &new_f, format, args);
/* Shrink the buffer to the space we really currently need. */
obstack_blank (obstack, (new_f.ofile.file._IO_write_ptr
- new_f.ofile.file._IO_write_end));
return result;
}
weak_alias (_IO_obstack_vprintf, obstack_vprintf)
int
_IO_obstack_printf (struct obstack *obstack, const char *format, ...)
{
int result;
va_list ap;
va_start (ap, format);
result = _IO_obstack_vprintf (obstack, format, ap);
va_end (ap);
return result;
}
weak_alias (_IO_obstack_printf, obstack_printf)

View File

@ -138,7 +138,7 @@ extern char* tmpnam __P ((char*));
#ifdef __USE_REENTRANT
extern char* tmpnam_r __P ((char*));
#endif
#ifdef __USE_SVID
#if defined(__USE_SVID) || defined(__USE_XOPEN)
extern char *tempnam __P ((__const char *__dir, __const char *__pfx));
#endif
extern char *__stdio_gen_tempname __P ((char *__buf, size_t bufsize,
@ -162,6 +162,14 @@ extern int vsscanf __P ((__const char *, __const char *, _G_va_list));
extern int __vsscanf __P ((__const char *, __const char *, _G_va_list));
#endif
#ifdef __USE_GNU
struct obstack;
extern int obstack_vprintf __P ((struct obstack *__obstack,
__const char *__fmt, _G_va_list));
extern int obstack_printf __P ((struct obstack *__obstack, __const char *__fmt,
...));
#endif
#if !defined(__STRICT_ANSI__) || defined(_POSIX_SOURCE)
extern FILE *fdopen __P ((int, __const char *));
extern int fileno __P ((FILE*));

View File

@ -31,6 +31,10 @@
# include <posix2_lim.h>
#endif
#ifdef __USE_XOPEN
# include <xopen_lim.h>
#endif
#if __GNUC__ >= 2
@ -48,7 +52,7 @@
#include's protect themselves, and in GCC 2 we may #include_next through
multiple copies of this file before we get to GCC's. */
# ifndef _LIMITS_H
#define _LIMITS_H
# define _LIMITS_H 1
/* We don't have #include_next.
Define ANSI <limits.h> for standard 32-bit words. */
@ -67,11 +71,7 @@
# define SCHAR_MAX 127
/* Maximum value an `unsigned char' can hold. (Minimum is 0.) */
#ifdef __STDC__
#define UCHAR_MAX 255U
#else
# define UCHAR_MAX 255
#endif
/* Minimum and maximum values a `char' can hold. */
# ifdef __CHAR_UNSIGNED__
@ -100,26 +100,24 @@
# define UINT_MAX 4294967295
# endif
#ifdef __alpha__
/* Minimum and maximum values a `signed long int' can hold. */
# ifdef __alpha__
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (- LONG_MAX - 1L)
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */
#define ULONG_MAX 18446744073709551615L
# ifdef __alpha__
# define ULONG_MAX 18446744073709551615UL
# else
/* Minimum and maximum values a `signed long int' can hold. */
#define LONG_MAX INT_MAX
#define LONG_MIN INT_MIN
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */
#define ULONG_MAX UINT_MAX
# ifdef __STDC__
# define ULONG_MAX 4294967295UL
# else
# define ULONG_MAX 4294967295L
# endif
# endif
# endif /* limits.h */
#endif /* GCC 2. */

View File

@ -13,8 +13,8 @@ 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,
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. */
#ifdef HAVE_CONFIG_H
@ -126,7 +126,7 @@ numeric_output (struct localedef_t *locale, const char *output_path)
iov[cnt].iov_len = sizeof (idx);
++cnt;
idx[cnt - 2] = idx[cnt - 3] + iov[cnt - 1].iov_len;
idx[cnt - 2] = iov[0].iov_len + iov[1].iov_len;
iov[cnt].iov_base = (void *) (numeric->decimal_point ?: "");
iov[cnt].iov_len = strlen (iov[cnt].iov_base) + 1;
++cnt;

View File

@ -469,7 +469,8 @@ syntax used for integer constants in C.
Otherwise @var{base} must have a value between @code{2} and @code{35}.
If @var{base} is @code{16}, the digits may optionally be preceded by
@samp{0x} or @samp{0X}.
@samp{0x} or @samp{0X}. If base has no legal value the value returned
is @code{0l} and the global variable @code{errno} is set to @code{EINVAL}.
@item
Any remaining characters in the string. If @var{tailptr} is not a null
@ -492,6 +493,11 @@ representable because of overflow, @code{strtol} returns either
appropriate for the sign of the value. It also sets @code{errno}
to @code{ERANGE} to indicate there was overflow.
Because the value @code{0l} is a correct result for @code{strtol} the
user who is interested in handling errors should set the global variable
@code{errno} to @code{0} before calling this function. So it can be
tested whether an error occured or not.
There is an example at the end of this section.
@end deftypefun
@ -504,6 +510,51 @@ value with type @code{unsigned long int}. No @samp{+} or @samp{-} sign
may appear before the number, but the syntax is otherwise the same as
described above for @code{strtol}. The value returned in case of
overflow is @code{ULONG_MAX} (@pxref{Range of Type}).
Like @code{strtol} this function sets @code{errno} and returns the value
@code{0ul} in case the value for @var{base} is not in the legal range.
For @code{strtoul} this can happen in another situation. In case the
number to be converted is negative @code{strtoul} also sets @code{errno}
to @code{EINVAL} and returns @code{0ul}.
@end deftypefun
@comment stdlib.h
@comment BSD
@deftypefun {long long int} strtoq (const char *@var{string}, char **@var{tailptr}, int @var{base})
The @code{strtoq} (``string-to-quad-word'') function is like
@code{strtol} except that is deals with extra long numbers and it
returns its value with type @code{long long int}.
If the string has valid syntax for an integer but the value is not
representable because of overflow, @code{strtoq} returns either
@code{LONG_LONG_MAX} or @code{LONG_LONG_MIN} (@pxref{Range of Type}), as
appropriate for the sign of the value. It also sets @code{errno} to
@code{ERANGE} to indicate there was overflow.
@end deftypefun
@comment stdlib.h
@comment GNU
@deftypefun {long long int} strtoll (const char *@var{string}, char **@var{tailptr}, int @var{base})
@code{strtoll} is only an commonly used other name for the @code{strtoq}
function. Everything said for @code{strtoq} applies to @code{strtoll}
as well.
@end deftypefun
@comment stdlib.h
@comment BSD
@deftypefun {unsigned long long int} strtouq (const char *@var{string}, char **@var{tailptr}, int @var{base})
The @code{strtouq} (``string-to-unsigned-quad-word'') function is like
@code{strtoul} except that is deals with extra long numbers and it
returns its value with type @code{unsigned long long int}. The value
returned in case of overflow is @code{ULONG_LONG_MAX} (@pxref{Range of Type}).
@end deftypefun
@comment stdlib.h
@comment GNU
@deftypefun {unsigned long long int} strtoull (const char *@var{string}, char **@var{tailptr}, int @var{base})
@code{strtoull} is only an commonly used other name for the @code{strtouq}
function. Everything said for @code{strtouq} applies to @code{strtoull}
as well.
@end deftypefun
@comment stdlib.h
@ -523,6 +574,29 @@ value rather than @code{long int}. The @code{atoi} function is also
considered obsolete; use @code{strtol} instead.
@end deftypefun
The POSIX locales contain some information about how to format numbers
(@pxref{General Numeric}). This mainly deals with representing numbers
for better readability for humans. The functions present so far in this
section cannot handle numbers in this form.
If this functionality is needed in a program one can use the functions
from the @code{scanf} family which know about the flag @samp{'} for
parsing numeric input (@pxref{Numeric Input Conversions}). Sometimes it
is more desirable to have finer control.
In these situation one could use the function
@code{__strto@var{XXX}_internal}. @var{XXX} here stands for any of the
above forms. All numeric conversion functions (including the functions
to process floating-point numbers) have such a counterpart. The
difference to the normal for is the extra argument at the end of the
parameter list. If this value has an non-zero value the handling of
number grouping is enabled. The advantage from using these functions is
that the @var{tailptr} parameters allow to determine which part of the
input is processed. The @code{scanf} functions don't provide this
information. The drawback of using these functions is that they are not
portable. They only exist in the GNU C library.
Here is a function which parses a string as a sequence of integers and
returns the sum of them:
@ -604,8 +678,8 @@ number, no conversion is performed. In this case, @code{strtod} returns
a value of zero and the value returned in @code{*@var{tailptr}} is the
value of @var{string}.
In a locale other than the standard @code{"C"} locale, this function may
recognize additional locale-dependent syntax.
In a locale other than the standard @code{"C"} or @code{"POSIX"} locale,
this function may recognize additional locale-dependent syntax.
If the string has valid syntax for a floating-point number but the value
is not representable because of overflow, @code{strtod} returns either
@ -613,8 +687,54 @@ positive or negative @code{HUGE_VAL} (@pxref{Mathematics}), depending on
the sign of the value. Similarly, if the value is not representable
because of underflow, @code{strtod} returns zero. It also sets @code{errno}
to @code{ERANGE} if there was overflow or underflow.
Since the value zero which is returned in the error case is also a valid
result the user should set the global variable @code{errno} to null
before calling this function. So one can test for failures after the
call since all failures set @code{errno} to a non-zero value.
@end deftypefun
@comment stdlib.h
@comment GNU
@deftypefun float strtof (const char *@var{string}, char **@var{tailptr})
This function is similar to the @code{strtod} function but it returns a
@code{float} value instead of a @code{double} value. If the precision
of a @code{float} value is sufficent this function should be used since
it is much faster than @code{strtod} on some architectures. The reasons
are obvious: @w{IEEE 754} defines @code{float} to have a mantissa of 23
bits while @code{double} has 53 bits and every additional bit of
precision can require additional computation.
If the string has valid syntax for a floating-point number but the value
is not representable because of overflow, @code{strtof} returns either
positive or negative @code{HUGE_VALf} (@pxref{Mathematics}), depending on
the sign of the value.
This function is a GNU extension.
@end deftypefun
@comment stdlib.h
@comment GNU
@deftypefun {long double} strtold (const char *@var{string}, char **@var{tailptr})
This function is similar to the @code{strtod} function but it returns a
@code{long double} value instead of a @code{double} value. It should be
used when high presision is used. On systems which define a @code{long
double} type (i.e., on which it is not the same as @code{double})
running this function might take significently more time since more bits
of precision are required.
If the string has valid syntax for a floating-point number but the value
is not representable because of overflow, @code{strtold} returns either
positive or negative @code{HUGE_VALl} (@pxref{Mathematics}), depending on
the sign of the value.
This function is a GNU extension.
@end deftypefun
As for the integer parsing functions there are additional functions
which will handle numbers represented using the grouping scheme of the
current locale (@pxref{Parsing of Integers}).
@comment stdlib.h
@comment ANSI
@deftypefun double atof (const char *@var{string})

View File

@ -67,15 +67,31 @@ the normal C library.
@comment GNU
@defvr Macro _SVID_SOURCE
If you define this macro, functionality derived from SVID is
included as well as the ANSI C, POSIX.1, and POSIX.2 material.
included as well as the ANSI C, POSIX.1, POSIX.2, and X/Open material.
@end defvr
@comment (none)
@comment XOPEN
@defvr Macro _XOPEN_SOURCE
If you define these macro, functionality described in the X/Open
Portability Guide is included. This is an superset of the POSIX.1 and
POSIX.2 functionality and in fact @code{_POSIX_SOURCE} and
@code{_POSIX_C_SOURCE} get automatically be defined.
But as the great unifaction of all Unices there is also functionality
only available in BSD and SVID is included.
If the macro @code{_XOPEN_SOURCE_EXTENDED} is also defined, even more
functionality is available. The extra functions will make all functions
available which are necessary for the X/Open Unix brand.
@end defvr
@comment (none)
@comment GNU
@defvr Macro _GNU_SOURCE
If you define this macro, everything is included: ANSI C, POSIX.1,
POSIX.2, BSD, SVID, and GNU extensions. In the cases where POSIX.1
conflicts with BSD, the POSIX definitions take precedence.
POSIX.2, BSD, SVID, X/Open, and GNU extensions. In the cases where
POSIX.1 conflicts with BSD, the POSIX definitions take precedence.
If you want to get the full effect of @code{_GNU_SOURCE} but make the
BSD definitions take precedence over the POSIX definitions, use this
@ -96,8 +112,8 @@ get very strange errors at run time.
@comment (none)
@comment GNU
@defvr Macro _REENTRANT,_THREAD_SAFE
If you define this macro, reentrant versions of several functions get
declared. Some of the functions is specified in POSIX.1c but many others
If you define one this macro, reentrant versions of several functions get
declared. Some of the functions are specified in POSIX.1c but many others
are only available on a few other systems or are unique to GNU libc.
The problem is that the standardization of the thread safe C library
interface still is behind.

View File

@ -655,6 +655,12 @@ and the controlling terminal. This material is probably only of
interest if you are writing a shell or other program which handles job
control specially.
@item
@ref{Name Service Switch}, describes the services which are available
for looking up names in the system databases, how to determine which
service is used for which database, and how these services are
implemented so that contributors can design their own services.
@item
@ref{User Database}, and @ref{Group Database}, tell you how to access
the system user and group databases.

View File

@ -13,7 +13,7 @@
@c sold 0.06/1.09, print run out 21may96
@set EDITION 0.07 DRAFT
@set VERSION 2.00 Beta
@set UPDATED 16 Aug 1996
@set UPDATED 4 Oct 1996
@set ISBN 1-882114-53-1
@ifinfo
@ -988,12 +988,7 @@ Porting the GNU C Library
@node Concept Index, Type Index, Copying, Top
@unnumbered Concept Index
@comment Could somebody with better texinfo knowledge look into this?
@comment When I comment out the following line I get
@comment Misplaced `{'.
@comment Misplaced `}'.
@comment This happens even if the libc.cp file is empty.
@comment @printindex cp
@printindex cp
@node Type Index, Function Index, Concept Index, Top
@unnumbered Type Index

View File

@ -1523,7 +1523,7 @@ resulting in your data appearing someplace before the real end of file.
@comment fcntl.h
@comment POSIX.1
@deftypevr O_NONBLOCK
@deftypevr Macro int O_NONBLOCK
The bit that enables nonblocking mode for the file. If this bit is set,
@code{read} requests on the file can return immediately with a failure
status if there is no input immediately available, instead of blocking.

View File

@ -36,8 +36,8 @@ over a domain that is only a subset of real numbers. For example, the
@code{1}. If you pass an argument to one of these functions that is
outside the domain over which it is defined, the function sets
@code{errno} to @code{EDOM} to indicate a @dfn{domain error}. On
machines that support IEEE floating point, functions reporting error
@code{EDOM} also return a NaN.
machines that support @w{IEEE 754} floating point, functions reporting
error @code{EDOM} also return a NaN.
Some of these functions are defined mathematically to result in a
complex value over parts of their domains. The most familiar example of
@ -74,14 +74,37 @@ Handling}, for more information about signals.)
@comment ANSI
@deftypevr Macro double HUGE_VAL
An expression representing a particular very large number. On machines
that use IEEE floating point format, the value is ``infinity''. On
other machines, it's typically the largest positive number that can be
represented.
that use @w{IEEE 754} floating point format, the value is ``infinity''.
On other machines, it's typically the largest positive number that can
be represented.
The value of this macro is used as the return value from various
mathematical functions in overflow situations.
mathematical @code{double} returning functions in overflow situations.
@end deftypevr
@comment math.h
@comment GNU
@deftypevr Macro float HUGE_VALf
This macro is similar to the @code{HUGE_VAL} macro except that it is
used by functions returning @code{float} values.
This macro is a GNU extension.
@end deftypevr
@comment math.h
@comment GNU
@deftypevr Macro {long double} HUGE_VALl
This macro is similar to the @code{HUGE_VAL} macro except that it is
used by functions returning @code{long double} values. The value is
only different from @code{HUGE_VAL} if the architecture really supports
@code{long double} values.
This macro is a GNU extension.
@end deftypevr
@comment
For more information about floating-point representations and limits,
see @ref{Floating Point Parameters}. In particular, the macro
@code{DBL_MAX} might be more appropriate than @code{HUGE_VAL} for many

View File

@ -1091,6 +1091,22 @@ To add one character at a time, use the function @code{obstack_1grow}.
It adds a single byte containing @var{c} to the growing object.
@end deftypefun
@comment obstack.h
@comment GNU
@deftypefun void obstack_ptr_grow (struct obstack *@var{obstack-ptr}, void *@var{data})
Adding the value of a pointer one can use the function
@code{obstack_ptr_grow}. It adds @code{sizeof (void *)} bytes
containing the value of @var{data}.
@end deftypefun
@comment obstack.h
@comment GNU
@deftypefun void obstack_int_grow (struct obstack *@var{obstack-ptr}, int @var{data})
A single value of type @code{int} can be added by using the
@code{obstack_int_grow} function. It adds @code{sizeof (int)} bytes to
the growing object and initializes them with the value of @var{data}.
@end deftypefun
@comment obstack.h
@comment GNU
@deftypefun {void *} obstack_finish (struct obstack *@var{obstack-ptr})
@ -1171,6 +1187,22 @@ The function @code{obstack_1grow_fast} adds one byte containing the
character @var{c} to the growing object in obstack @var{obstack-ptr}.
@end deftypefun
@comment obstack.h
@comment GNU
@deftypefun void obstack_ptr_grow_fast (struct obstack *@var{obstack-ptr}, void *@var{data})
The function @code{obstack_ptr_grow_fast} adds @code{sizeof (void *)}
bytes containing the value of @var{data} to the growing object in
obstack @var{obstack-ptr}.
@end deftypefun
@comment obstack.h
@comment GNU
@deftypefun void obstack_int_grow_fast (struct obstack *@var{obstack-ptr}, int @var{data})
The function @code{obstack_int_grow_fast} adds @code{sizeof (int)} bytes
containing the value of @var{data} to the growing object in obstack
@var{obstack-ptr}.
@end deftypefun
@comment obstack.h
@comment GNU
@deftypefun void obstack_blank_fast (struct obstack *@var{obstack-ptr}, int @var{size})

View File

@ -3,6 +3,9 @@
@node Name Service Switch
@chapter System Databases and Name Service Switch
@cindex Name Service Switch
@cindex NSS
@cindex databses
Various functions in the C Library need to be configured to work
correctly in the local environment. Traditionally, this was done by
using files (e.g., @file{/etc/passwd}), but other nameservices (line the
@ -395,10 +398,10 @@ change of the return value. While the user-level function returns a
pointer to the result the reentrant function return an @code{enum
nss_status} value:
@cindex NSS_STATUS_TRYAGAIN
@cindex NSS_STATUS_UNAVAIL
@cindex NSS_STATUS_NOTFOUND
@cindex NSS_STATUS_SUCCESS
@vindex NSS_STATUS_TRYAGAIN
@vindex NSS_STATUS_UNAVAIL
@vindex NSS_STATUS_NOTFOUND
@vindex NSS_STATUS_SUCCESS
@ftable @code
@item NSS_STATUS_TRYAGAIN
numeric value @code{-2}

View File

@ -2438,6 +2438,17 @@ Specifies that the argument is of type @code{double *}.
Specifies that the argument is of type @code{long double *}.
@end table
For all the above number parsing formats there is an additional optional
flag @samp{'}. When this flag is given the @code{scanf} function
expects the number represented in the input string to be formatted
according to the grouping rules of the currently selected locale
(@pxref{General Numeric}).
If the @code{"C"} or @code{"POSIX"} locale is selected there is no
difference. But for a locale which specifies values for the appropriate
fields in the locale the input must have the correct form in the input.
Otherwise the longest prefix with a correct form is processed.
@node String Input Conversions
@subsection String Input Conversions

View File

@ -1024,7 +1024,7 @@ community of volunteers and put in the public domain.
@comment time.h
@comment POSIX.1
@deftypevar char * tzname [2]
@deftypevar {char *} tzname [2]
The array @code{tzname} contains two strings, which are the standard
names of the pair of time zones (standard and daylight
saving) that the user has selected. @code{tzname[0]} is the name of

View File

@ -685,6 +685,9 @@ at least @code{L_cuserid} characters; the string is returned in this
array. Otherwise, a pointer to a string in a static area is returned.
This string is statically allocated and might be overwritten on
subsequent calls to this function or to @code{getlogin}.
The use of this function is deprecated since it is marked to be
withdrawn in XPG4.2 and it is already removed in POSIX.1.
@end deftypefun
@comment stdio.h
@ -1158,7 +1161,7 @@ This function closes the internal stream used by @code{getgrent} or
@node Netgroup Data, Lookup Netgroup, Netgroup Database, Netgroup Database
@subsection Netgroup Data
@cindex{Netgroup}
@cindex Netgroup
Sometimes it is useful group users according to other criterias like the
ones used in the @xref{Group Database}. E.g., it is useful to associate
a certain group of users with a certain machine. On the other hand

View File

@ -13,9 +13,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/* NOTE: Because of the special way this file is used by <math.h>, this
file must NOT be protected from multiple inclusion as header files
@ -73,7 +73,7 @@ __MATHCALL (sinh,, (_Mdouble_ __x));
/* Hyperbolic tangent of X. */
__MATHCALL (tanh,, (_Mdouble_ __x));
#ifdef __USE_MISC
#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Hyperbolic arc cosine of X. */
__MATHCALL (acosh,, (_Mdouble_ __x));
/* Hyperbolic arc sine of X. */
@ -99,12 +99,15 @@ __MATHCALL (log,, (_Mdouble_ __x));
/* Base-ten logarithm of X. */
__MATHCALL (log10,, (_Mdouble_ __x));
#ifdef __USE_MISC
#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Return exp(X) - 1. */
__MATHCALL (expm1,, (_Mdouble_ __x));
/* Return log(1 + X). */
__MATHCALL (log1p,, (_Mdouble_ __x));
/* Return the base 2 signed integral exponent of X. */
__MATHCALL (logb,, (_Mdouble_ __x));
#endif
/* Break VALUE into integral and fractional parts. */
@ -119,7 +122,7 @@ __MATHCALL (pow,, (_Mdouble_ __x, _Mdouble_ __y));
/* Return the square root of X. */
__MATHCALL (sqrt,, (_Mdouble_ __x));
#ifdef __USE_MISC
#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Return the cube root of X. */
__MATHCALL (cbrt,, (_Mdouble_ __x));
#endif
@ -146,9 +149,6 @@ __MATHCALL (fmod,, (_Mdouble_ __x, _Mdouble_ __y));
is +Infinity, -1 if it is -Infinity. */
__MATHDECL (int, isinf,, (_Mdouble_ __value));
/* Return nonzero if VALUE is not a number. */
__MATHDECL (int, isnan,, (_Mdouble_ __value));
/* Return nonzero if VALUE is finite and not NaN. */
__MATHDECL (int, finite,, (_Mdouble_ __value));
@ -163,25 +163,12 @@ __MATHCALL (infnan,, (int __error));
/* Return X with its signed changed to Y's. */
__MATHCALL (copysign,, (_Mdouble_ __x, _Mdouble_ __y));
/* Return X times (2 to the Nth power). */
__MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n));
/* Return X times (2 to the Nth power). */
__MATHCALL (scalbn,, (_Mdouble_ __x, int __n));
/* Return the remainder of X/Y. */
__MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y));
/* Return the base 2 signed integral exponent of X. */
__MATHCALL (logb,, (_Mdouble_ __x));
/* Return the integer nearest X in the direction of the
prevailing rounding mode. */
__MATHCALL (rint,, (_Mdouble_ __x));
/* Return `sqrt(X*X + Y*Y)'. */
__MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y));
struct __MATH_PRECNAME(__cabs_complex,)
{
_Mdouble_ x, y;
@ -191,18 +178,21 @@ struct __MATH_PRECNAME(__cabs_complex,)
__MATHCALL (cabs,, (struct __MATH_PRECNAME(__cabs_complex,)));
/* Return X + epsilon if X < Y, X - epsilon if X > Y. */
__MATHCALL (nextafter,, (_Mdouble_ __x, _Mdouble_ __y));
/* Return the fractional part of X after dividing out `ilogb (X)'. */
__MATHCALL (significand,, (_Mdouble_ __x));
#endif /* Use misc. */
/* Return the remainder of integer divison X / Y with infinite precision. */
__MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y));
#if defined(__USE_MISC) || defined(__USE_XOPEN)
/* Return nonzero if VALUE is not a number. */
__MATHDECL (int, isnan,, (_Mdouble_ __value));
/* Return the binary exponent of X, which must be nonzero. */
__MATHDECL (int, ilogb,, (_Mdouble_ __x));
/* Return the fractional part of X after dividing out `ilogb (X)'. */
__MATHCALL (significand,, (_Mdouble_ __x));
/* Return `sqrt(X*X + Y*Y)'. */
__MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y));
/* Error, gamma, and Bessel functions. */
@ -229,4 +219,21 @@ __MATHCALL (gamma,_r, (_Mdouble_, int *));
__MATHCALL (lgamma,_r, (_Mdouble_, int *));
#endif
#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Return the integer nearest X in the direction of the
prevailing rounding mode. */
__MATHCALL (rint,, (_Mdouble_ __x));
/* Return X times (2 to the Nth power). */
__MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n));
/* Return X + epsilon if X < Y, X - epsilon if X > Y. */
__MATHCALL (nextafter,, (_Mdouble_ __x, _Mdouble_ __y));
/* Return the remainder of integer divison X / Y with infinite precision. */
__MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y));
#endif
#endif /* Use misc. */

View File

@ -24,7 +24,7 @@ subdir := misc
headers := sys/uio.h iovec.h sys/ioctl.h ioctls.h ioctl-types.h \
sys/ptrace.h sys/file.h sys/dir.h sys/cdefs.h \
ar.h a.out.h stab.h stab.def sgtty.h \
ar.h a.out.h libgen.h stab.h stab.def sgtty.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 \
@ -55,7 +55,7 @@ routines := brk sbrk sstk ioctl \
efgcvt efgcvt_r qefgcvt qefgcvt_r \
hsearch hsearch_r tsearch lsearch \
err error ustat \
getsysstats
getsysstats dirname
aux := init-misc
distribute := bsd-compat.c
extra-objs := bsd-compat.o
@ -63,6 +63,7 @@ install-lib := libbsd-compat.a libg.a
non-lib.a := libbsd-compat.a
gpl2lgpl := error.c error.h
tests := tst-dirname
include ../Rules

52
misc/dirname.c Normal file
View File

@ -0,0 +1,52 @@
/* dirname - return directory part of PATH.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <libgen.h>
#include <string.h>
char *
dirname (char *path)
{
static const char dot[] = ".";
char *last_slash;
/* Find last '/'. */
last_slash = path != NULL ? strrchr (path, '/') : NULL;
if (last_slash == path)
/* The last slash is the first character in the string. We have to
return "/". */
++last_slash;
else if (last_slash != NULL && last_slash[1] == '\0')
/* The '/' is the last character, we have to look further. */
last_slash = memchr (path, last_slash - path, '/');
if (last_slash != NULL)
/* Terminate the path. */
last_slash[0] = '\0';
else
/* This assignment is ill-designed but the XPG specs require to
return a string containing "." in any case no directory part is
found and so a static and constant string is required. */
path = (char *) dot;
return path;
}

View File

@ -13,8 +13,8 @@ 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,
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <search.h>
@ -39,7 +39,7 @@ hsearch (item, action)
int
hcreate (nel)
unsigned int nel;
size_t nel;
{
return hcreate_r (nel, &htab);
}

View File

@ -13,8 +13,8 @@ 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,
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
@ -64,7 +64,7 @@ isprime (unsigned int number)
becomes zero. */
int
hcreate_r (nel, htab)
unsigned int nel;
size_t nel;
struct hsearch_data *htab;
{
/* Test for correct arguments. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1992, 1995 Free Software Foundation, Inc.
/* Copyright (C) 1992, 1995, 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
@ -12,38 +12,35 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <search.h>
/* Insert ELEM into a doubly-linked list, after PREV. */
void
DEFUN(insque, (elem, prev) ,
struct qelem *elem AND struct qelem *prev)
insque (void *elem, void *prev)
{
struct qelem *next = prev->q_forw;
prev->q_forw = elem;
struct qelem *next = ((struct qelem *) prev)->q_forw;
((struct qelem *) prev)->q_forw = (struct qelem *) elem;
if (next != NULL)
next->q_back = elem;
elem->q_forw = next;
elem->q_back = prev;
next->q_back = (struct qelem *) elem;
((struct qelem *) elem)->q_forw = next;
((struct qelem *) elem)->q_back = (struct qelem *) prev;
}
/* Unlink ELEM from the doubly-linked list that it is in. */
void
DEFUN(remque, (elem),
struct qelem *elem)
remque (void *elem)
{
struct qelem *next = elem->q_forw;
struct qelem *prev = elem->q_back;
struct qelem *next = ((struct qelem *) elem)->q_forw;
struct qelem *prev = ((struct qelem *) elem)->q_back;
if (next != NULL)
next->q_back = prev;
if (prev != NULL)
prev->q_forw = next;
prev->q_forw = (struct qelem *) next;
}

30
misc/libgen.h Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 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
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 _LIBGEN_H
#define _LIBGEN_H 1
#include <sys/cdefs.h>
/* Return directory part of PATH or "." if none is available. */
extern char *dirname __P ((char *__path));
/* Return filename part of PATH. */
extern char *basename __P ((__const char *__path));
#endif /* libgen.h */

View File

@ -13,8 +13,8 @@ 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,
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 _SEARCH_H
@ -28,6 +28,7 @@ Boston, MA 02111-1307, USA. */
__BEGIN_DECLS
#if defined(__USE_SVID) || defined(__USE_XOPEN_EXTENDED)
/* Prototype structure for a linked-list data structure.
This is the type used by the `insque' and `remque' functions. */
@ -40,10 +41,11 @@ struct qelem
/* Insert ELEM into a doubly-linked list, after PREV. */
extern void insque __P ((struct qelem *__elem, struct qelem *__prev));
extern void insque __P ((void *__elem, void *__prev));
/* Unlink ELEM from the doubly-linked list that it is in. */
extern void remque __P ((struct qelem *__elem));
extern void remque __P ((void *__elem));
#endif
/* For use with hsearch(3). */
@ -81,7 +83,7 @@ struct hsearch_data
/* Family of hash table handling functions. The functions also have
reentrant counterparts ending with _r. */
extern ENTRY *hsearch __P ((ENTRY __item, ACTION __action));
extern int hcreate __P ((unsigned int __nel));
extern int hcreate __P ((size_t __nel));
extern void hdestroy __P ((void));
extern int hsearch_r __P ((ENTRY __item, ACTION __action, ENTRY **__retval,

View File

@ -13,8 +13,8 @@ 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,
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. */
/* POSIX 1003.1g: 6.2 Select from File Descriptor Sets <sys/select.h> */

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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 _SYS_UIO_H
@ -23,8 +23,7 @@ Cambridge, MA 02139, USA. */
__BEGIN_DECLS
#define __need_size_t
#include <stddef.h>
#include <sys/types.h>
/* This file defines `struct iovec'. */
#include <iovec.h>
@ -35,14 +34,16 @@ __BEGIN_DECLS
The buffers are filled in the order specified.
Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */
int readv __P ((int __fd, __const struct iovec * __vector, size_t __count));
extern ssize_t readv __P ((int __fd, __const struct iovec * __vector,
int __count));
/* Write data pointed by the buffers described by VECTOR, which
is a vector of COUNT `struct iovec's, to file descriptor FD.
The data is written in the order specified.
Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer. */
int writev __P ((int __fd, __const struct iovec * __vector, size_t __count));
extern ssize_t writev __P ((int __fd, __const struct iovec * __vector,
int __count));
__END_DECLS

59
misc/tst-dirname.c Normal file
View File

@ -0,0 +1,59 @@
/* Test program for dirname function a la XPG.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
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. */
#define _GNU_SOURCE 1
#include <libgen.h>
#include <stdio.h>
#include <string.h>
extern int test __P ((const char *input, const char *result));
int
test (input, result)
const char *input;
const char *result;
{
int retval;
char *cp;
cp = strdupa (input);
cp = dirname (cp);
retval = strcmp (cp, result);
if (retval)
printf ("dirname(\"%s\") should be \"%s\", but is \"%s\"\n",
input, result, cp);
return retval;
}
int
main ()
{
int result = 0;
/* These are the examples given in XPG4.2. */
result |= test ("/usr/lib", "/usr");
result |= test ("/usr", "/");
result |= test ("usr", ".");
result |= test ("/", "/");
result |= test (".", ".");
result |= test ("..", ".");
return result != 0;
}

View File

@ -25,7 +25,7 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
glob.h regex.h wordexp.h fnmatch.h gnu/types.h getopt.h \
posix1_lim.h posix2_lim.h posix_opt.h local_lim.h tar.h \
utsnamelen.h confname.h waitflags.h waitstatus.h sys/unistd.h \
sched.h schedbits.h
sched.h schedbits.h re_comp.h
distribute := confstr.h

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <unistd.h>
#include <errno.h>
@ -34,97 +34,159 @@ struct conf
static struct conf vars[] =
{
{ "LINK_MAX", _PC_LINK_MAX, PATHCONF },
{ "_POSIX_LINK_MAX", _PC_LINK_MAX, PATHCONF },
{ "MAX_CANON", _PC_MAX_CANON, PATHCONF },
{ "_POSIX_MAX_CANON", _PC_MAX_CANON, PATHCONF },
{ "MAX_INPUT", _PC_MAX_INPUT, PATHCONF },
{ "_POSIX_MAX_INPUT", _PC_MAX_INPUT, PATHCONF },
{ "NAME_MAX", _PC_NAME_MAX, PATHCONF },
{ "_POSIX_NAME_MAX", _PC_NAME_MAX, PATHCONF },
{ "PATH_MAX", _PC_PATH_MAX, PATHCONF },
{ "_POSIX_PATH_MAX", _PC_PATH_MAX, PATHCONF },
{ "PIPE_BUF", _PC_PIPE_BUF, PATHCONF },
{ "_POSIX_PIPE_BUF", _PC_PIPE_BUF, PATHCONF },
{ "SOCK_MAXBUF", _PC_SOCK_MAXBUF, PATHCONF },
{ "_POSIX_ASYNC_IO", _PC_ASYNC_IO, PATHCONF },
{ "_POSIX_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED, PATHCONF },
{ "_POSIX_NO_TRUNC", _PC_NO_TRUNC, PATHCONF },
{ "_POSIX_VDISABLE", _PC_VDISABLE, PATHCONF },
{ "_POSIX_SYNC_IO", _PC_SYNC_IO, PATHCONF },
{ "_POSIX_ASYNC_IO", _PC_ASYNC_IO, PATHCONF },
{ "_POSIX_PRIO_IO", _PC_PRIO_IO, PATHCONF },
{ "_POSIX_SYNC_IO", _PC_SYNC_IO, PATHCONF },
{ "_POSIX_VDISABLE", _PC_VDISABLE, PATHCONF },
{ "ARG_MAX", _SC_ARG_MAX, SYSCONF },
{ "ATEXIT_MAX", _SC_ATEXIT_MAX, SYSCONF },
{ "CHAR_BIT", _SC_CHAR_BIT, SYSCONF },
{ "CHAR_MAX", _SC_CHAR_MAX, SYSCONF },
{ "CHAR_MIN", _SC_CHAR_MIN, SYSCONF },
{ "CHILD_MAX", _SC_CHILD_MAX, SYSCONF },
{ "CLK_TCK", _SC_CLK_TCK, SYSCONF },
{ "INT_MAX", _SC_INT_MAX, SYSCONF },
{ "INT_MIN", _SC_INT_MIN, SYSCONF },
{ "IOV_MAX", _SC_UIO_MAXIOV, SYSCONF },
{ "LOGNAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF },
{ "LONG_BIT", _SC_LONG_BIT, SYSCONF },
{ "MB_LEN_MAX", _SC_MB_LEN_MAX, SYSCONF },
{ "NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF },
{ "NL_ARGMAX", _SC_NL_ARGMAX, SYSCONF },
{ "NL_LANGMAX", _SC_NL_LANGMAX, SYSCONF },
{ "NL_MSGMAX", _SC_NL_MSGMAX, SYSCONF },
{ "NL_NMAX", _SC_NL_NMAX, SYSCONF },
{ "NL_SETMAX", _SC_NL_SETMAX, SYSCONF },
{ "NL_TEXTMAX", _SC_NL_TEXTMAX, SYSCONF },
{ "NSS_BUFLEN_GROUP", _SC_GETGR_R_SIZE_MAX, SYSCONF },
{ "NSS_BUFLEN_PASSWD", _SC_GETPW_R_SIZE_MAX, SYSCONF },
{ "NZERO", _SC_NZERO, SYSCONF },
{ "OPEN_MAX", _SC_OPEN_MAX, SYSCONF },
{ "_POSIX_JOB_CONTROL", _SC_JOB_CONTROL, SYSCONF },
{ "_POSIX_SAVED_IDS", _SC_SAVED_IDS, SYSCONF },
{ "_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS, SYSCONF },
{ "_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING, SYSCONF },
{ "_POSIX_TIMERS", _SC_TIMERS, SYSCONF },
{ "PAGESIZE", _SC_PAGESIZE, SYSCONF },
{ "PAGE_SIZE", _SC_PAGESIZE, SYSCONF },
{ "PASS_MAX", _SC_PASS_MAX, SYSCONF },
{ "PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS, SYSCONF },
{ "PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX, SYSCONF },
{ "PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN, SYSCONF },
{ "PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX, SYSCONF },
{ "SCHAR_MAX", _SC_SCHAR_MAX, SYSCONF },
{ "SCHAR_MIN", _SC_SCHAR_MIN, SYSCONF },
{ "SHRT_MAX", _SC_SHRT_MAX, SYSCONF },
{ "SHRT_MIN", _SC_SHRT_MIN, SYSCONF },
{ "SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF },
{ "TTY_NAME_MAX", _SC_TTY_NAME_MAX, SYSCONF },
{ "TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF },
{ "UCHAR_MAX", _SC_UCHAR_MAX, SYSCONF },
{ "UINT_MAX", _SC_UINT_MAX, SYSCONF },
{ "UIO_MAXIOV", _SC_UIO_MAXIOV, SYSCONF },
{ "ULONG_MAX", _SC_ULONG_MAX, SYSCONF },
{ "USHRT_MAX", _SC_USHRT_MAX, SYSCONF },
{ "WORD_BIT", _SC_WORD_BIT, SYSCONF },
{ "_AVPHYS_PAGES", _SC_AVPHYS_PAGES, SYSCONF },
{ "_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF, SYSCONF },
{ "_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN, SYSCONF },
{ "_PHYS_PAGES", _SC_PHYS_PAGES, SYSCONF },
{ "_POSIX_ARG_MAX", _SC_ARG_MAX, SYSCONF },
{ "_POSIX_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO, SYSCONF },
{ "_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO, SYSCONF },
{ "_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO, SYSCONF },
{ "_POSIX_CHILD_MAX", _SC_CHILD_MAX, SYSCONF },
{ "_POSIX_FSYNC", _SC_FSYNC, SYSCONF },
{ "_POSIX_JOB_CONTROL", _SC_JOB_CONTROL, SYSCONF },
{ "_POSIX_MAPPED_FILES", _SC_MAPPED_FILES, SYSCONF },
{ "_POSIX_MEMLOCK", _SC_MEMLOCK, SYSCONF },
{ "_POSIX_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE, SYSCONF },
{ "_POSIX_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION, SYSCONF },
{ "_POSIX_MESSAGE_PASSING", _SC_MESSAGE_PASSING, SYSCONF },
{ "_POSIX_NGROUPS_MAX", _SC_NGROUPS_MAX, SYSCONF },
{ "_POSIX_OPEN_MAX", _SC_OPEN_MAX, SYSCONF },
{ "_POSIX_PII", _SC_PII, SYSCONF },
{ "_POSIX_PII_INTERNET", _SC_PII_INTERNET, SYSCONF },
{ "_POSIX_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM, SYSCONF },
{ "_POSIX_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM, SYSCONF },
{ "_POSIX_PII_OSI", _SC_PII_OSI, SYSCONF },
{ "_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF },
{ "_POSIX_PII_OSI_COTS", _SC_PII_OSI_COTS, SYSCONF },
{ "_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF },
{ "_POSIX_PII_SOCKET", _SC_PII_SOCKET, SYSCONF },
{ "_POSIX_PII_XTI", _SC_PII_XTI, SYSCONF },
{ "_POSIX_POLL", _SC_POLL, SYSCONF },
{ "_POSIX_PRIORITIZED_IO", _SC_PRIORITIZED_IO, SYSCONF },
{ "_POSIX_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING, SYSCONF },
{ "_POSIX_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS, SYSCONF },
{ "_POSIX_SAVED_IDS", _SC_SAVED_IDS, SYSCONF },
{ "_POSIX_SELECT", _SC_SELECT, SYSCONF },
{ "_POSIX_SEMAPHORES", _SC_SEMAPHORES, SYSCONF },
{ "_POSIX_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS, SYSCONF },
{ "_POSIX_VERSION", _SC_VERSION, SYSCONF },
{ "_POSIX_PII", _SC_PII, SYSCONF },
{ "_POSIX_PII_XTI", _SC_PII_XTI, SYSCONF },
{ "_POSIX_PII_SOCKET", _SC_PII_SOCKET, SYSCONF },
{ "_POSIX_PII_INTERNET", _SC_PII_INTERNET, SYSCONF },
{ "_POSIX_PII_OSI", _SC_PII_OSI, SYSCONF },
{ "_POSIX_POLL", _SC_POLL, SYSCONF },
{ "_POSIX_SELECT", _SC_SELECT, SYSCONF },
{ "UIO_MAXIOV", _SC_UIO_MAXIOV, SYSCONF },
{ "_POSIX_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM, SYSCONF },
{ "_POSIX_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM, SYSCONF },
{ "_POSIX_PII_OSI_COTS", _SC_PII_OSI_COTS, SYSCONF },
{ "_POSIX_PII_OSI_CLTS", _SC_PII_OSI_CLTS, SYSCONF },
{ "_POSIX_PII_OSI_M", _SC_PII_OSI_M, SYSCONF },
{ "_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF },
{ "_POSIX_SSIZE_MAX", _SC_SSIZE_MAX, SYSCONF },
{ "_POSIX_STREAM_MAX", _SC_STREAM_MAX, SYSCONF },
{ "_POSIX_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO, SYSCONF },
{ "_POSIX_THREADS", _SC_THREADS, SYSCONF },
{ "_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS, SYSCONF },
{ "NSS_BUFLEN_GROUP", _SC_GETGR_R_SIZE_MAX, SYSCONF },
{ "NSS_BUFLEN_PASSWD", _SC_GETPW_R_SIZE_MAX, SYSCONF },
{ "LOGNAME_MAX", _SC_LOGIN_NAME_MAX, SYSCONF },
{ "TTY_NAME_MAX", _SC_TTY_NAME_MAX, SYSCONF },
{ "PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS, SYSCONF },
{ "PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX, SYSCONF },
{ "PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN, SYSCONF },
{ "PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX, SYSCONF },
{ "_POSIX_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR, SYSCONF },
{ "_POSIX_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE, SYSCONF },
{ "_POSIX_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING, SYSCONF },
{ "_POSIX_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT, SYSCONF },
{ "_POSIX_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT, SYSCONF },
{ "_POSIX_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED, SYSCONF },
{ "_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF, SYSCONF },
{ "_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN, SYSCONF },
{ "ATEXIT_MAX", _SC_ATEXIT_MAX, SYSCONF },
{ "PASS_MAX", _SC_PASS_MAX, SYSCONF },
{ "_PHYS_PAGES", _SC_PHYS_PAGES, SYSCONF },
{ "_AVPHYS_PAGES", _SC_AVPHYS_PAGES, SYSCONF },
{ "_XOPEN_VERSION", _SC_XOPEN_VERSION },
{ "_POSIX_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS, SYSCONF },
{ "_POSIX_TIMERS", _SC_TIMERS, SYSCONF },
{ "_POSIX_TZNAME_MAX", _SC_TZNAME_MAX, SYSCONF },
{ "_POSIX_VERSION", _SC_VERSION, SYSCONF },
{ "_T_IOV_MAX", _SC_T_IOV_MAX, SYSCONF },
{ "_XOPEN_CRYPT", _SC_XOPEN_CRYPT, SYSCONF },
{ "_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N, SYSCONF },
{ "_XOPEN_SHM", _SC_XOPEN_SHM, SYSCONF },
{ "_XOPEN_UNIX", _SC_XOPEN_UNIX, SYSCONF },
{ "_XOPEN_VERSION", _SC_XOPEN_VERSION, SYSCONF },
{ "_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION, SYSCONF },
{ "_XOPEN_XPG2", _SC_XOPEN_XPG2, SYSCONF },
{ "_XOPEN_XPG3", _SC_XOPEN_XPG3, SYSCONF },
{ "_XOPEN_XPG4", _SC_XOPEN_XPG4, SYSCONF },
/* POSIX.2 */
{ "BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF },
{ "BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF },
{ "BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF },
{ "BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF },
{ "CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX },
{ "COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF },
{ "EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX, SYSCONF },
{ "EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF },
{ "LINE_MAX", _SC_LINE_MAX, SYSCONF },
{ "RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF },
{ "CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX },
{ "POSIX2_BC_BASE_MAX", _SC_BC_BASE_MAX, SYSCONF },
{ "POSIX2_BC_DIM_MAX", _SC_BC_DIM_MAX, SYSCONF },
{ "POSIX2_BC_SCALE_MAX", _SC_BC_SCALE_MAX, SYSCONF },
{ "POSIX2_BC_STRING_MAX", _SC_BC_STRING_MAX, SYSCONF },
{ "POSIX2_CHAR_TERM", _SC_2_CHAR_TERM, SYSCONF },
{ "POSIX2_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX, SYSCONF },
{ "POSIX2_C_BIND", _SC_2_C_BIND, SYSCONF },
{ "POSIX2_C_DEV", _SC_2_C_DEV, SYSCONF },
{ "POSIX2_C_VERSION", _SC_2_C_VERSION, SYSCONF },
{ "POSIX2_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX, SYSCONF },
{ "POSIX2_FORT_DEV", _SC_2_FORT_DEV, SYSCONF },
{ "POSIX2_FORT_RUN", _SC_2_FORT_RUN, SYSCONF },
{ "POSIX2_LINE_MAX", _SC_LINE_MAX, SYSCONF },
{ "POSIX2_LOCALEDEF", _SC_2_LOCALEDEF, SYSCONF },
{ "POSIX2_RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF },
{ "POSIX2_SW_DEV", _SC_2_SW_DEV, SYSCONF },
{ "POSIX2_UPE", _SC_2_UPE, SYSCONF },
{ "POSIX2_VERSION", _SC_2_VERSION, SYSCONF },
{ "RE_DUP_MAX", _SC_RE_DUP_MAX, SYSCONF },
{ "PATH", _CS_PATH, CONFSTR },
{ "CS_PATH", _CS_PATH, CONFSTR },
{ NULL, 0, SYSCONF }
};

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* POSIX Standard: 2.9.2 Minimum Values Added to <limits.h>
@ -31,7 +31,7 @@ Cambridge, MA 02139, USA. */
#define _POSIX_ARG_MAX 4096
/* Maximum simultaneous processes per real user ID. */
#define _POSIX_CHILD_MAX 6
#define _POSIX_CHILD_MAX 25
/* Maximum link count of a file. */
#define _POSIX_LINK_MAX 8
@ -47,7 +47,7 @@ Cambridge, MA 02139, USA. */
#define _POSIX_NGROUPS_MAX 0
/* Number of files one process can have open at once. */
#define _POSIX_OPEN_MAX 16
#define _POSIX_OPEN_MAX 20
/* Number of descriptors that a process may examine with `pselect' or
`select'. */

26
posix/re_comp.h Normal file
View File

@ -0,0 +1,26 @@
/* Copyright (C) 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
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 _RE_COMP_H
#define _RE_COMP_H 1
/* This is only a wrapper around the <regex.h> file. XPG4.2 mentions
this name. */
#include <regex.h>
#endif /* re_comp.h */

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* POSIX Standard: 3.2.1 Wait for Process Termination <sys/wait.h>
@ -123,7 +123,8 @@ extern __pid_t __waitpid __P ((__pid_t __pid, int *__stat_loc,
int __options));
extern __pid_t waitpid __P ((__pid_t __pid, int *__stat_loc,
int __options));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* This being here makes the prototypes valid whether or not
we have already included <sys/resource.h> to define `struct rusage'. */
struct rusage;
@ -137,6 +138,12 @@ extern __pid_t __wait3 __P ((__WAIT_STATUS __stat_loc,
int __options, struct rusage * __usage));
extern __pid_t wait3 __P ((__WAIT_STATUS __stat_loc,
int __options, struct rusage * __usage));
#endif
#ifdef __USE_BSD
/* This being here makes the prototypes valid whether or not
we have already included <sys/resource.h> to define `struct rusage'. */
struct rusage;
/* PID is like waitpid. Other args are like wait3. */
extern __pid_t __wait4 __P ((__pid_t __pid, __WAIT_STATUS __stat_loc,

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* POSIX Standard: 2.10 Symbolic Constants <unistd.h>
@ -28,7 +28,7 @@ Cambridge, MA 02139, USA. */
__BEGIN_DECLS
/* These may be used to determine what facilities are present at compile time.
Their values can be obtained at run time from sysconf. */
Their values can be obtained at run time from `sysconf'. */
/* POSIX Standard approved as IEEE Std 1003.1 as of August, 1988 and
extended by P1003.1b (aka POSIX.4). */
@ -58,6 +58,24 @@ __BEGIN_DECLS
/* Library is conformant to X/Open version 4. */
#define _XOPEN_VERSION 4
/* Commands and utilities from XPG4 are available. */
#define _XOPEN_XCU_VERSION 4
/* We are compatible with the old published standards as well. */
#define _XOPEN_XPG2 1
#define _XOPEN_XPG3 1
#define _XOPEN_XPG4 1
/* The X/Open Unix extensions are available. */
#define _XOPEN_UNIX 1
/* Encryption is present. */
#define _XOPEN_CRYPT 1
/* The enchanced internationalization capabilities accoring to XPG4.2
are present. */
#define _XOPEN_ENH_I18N 1
/* Get values of POSIX options:
@ -94,6 +112,8 @@ __BEGIN_DECLS
_POSIX_POLL Implementation supports `poll' function.
_POSIX_SELECT Implementation supports `select' and `pselect'.
_XOPEN_SHM Shared memory interface according to XPG4.2.
If any of these symbols is defined as -1, the corresponding option is not
true for any file. If any is defined as other than -1, the corresponding
option is true for all files. If a symbol is not defined at all, the value
@ -217,7 +237,14 @@ extern unsigned int alarm __P ((unsigned int __seconds));
error, but if `sleep' returns SECONDS, it probably didn't work. */
extern unsigned int sleep __P ((unsigned int __seconds));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Set an alarm to go off (generating a SIGALRM signal) in VALUE
microseconds. If INTERVAL is nonzero, when the alarm goes off, the
timer is reset to go off every INTERVAL microseconds thereafter.
Returns the number of microseconds remaining before the alarm. */
extern unsigned int ualarm __P ((unsigned int __value,
unsigned int __interval));
/* Sleep USECONDS microseconds, or until a signal arrives that is not blocked
or ignored. Return value is not necessarily useful. */
extern unsigned int usleep __P ((unsigned int __useconds));
@ -235,19 +262,28 @@ extern int __chown __P ((__const char *__file,
extern int chown __P ((__const char *__file,
__uid_t __owner, __gid_t __group));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Change the owner and group of the file that FD is open on. */
extern int __fchown __P ((int __fd,
__uid_t __owner, __gid_t __group));
extern int fchown __P ((int __fd,
__uid_t __owner, __gid_t __group));
#endif /* Use BSD. */
/* Change owner and group of FILE, if it is a symbolic
link the ownership of the symbolic link is changed. */
extern int __lchown __P ((__const char *__file, __uid_t __owner,
__gid_t __group));
extern int lchown __P ((__const char *__file, __uid_t __owner,
__gid_t __group));
#endif /* Use BSD || X/Open Unix. */
/* Change the process's working directory to PATH. */
extern int __chdir __P ((__const char *__path));
extern int chdir __P ((__const char *__path));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Change the process's working directory to the one FD is open on. */
extern int fchdir __P ((int __fd));
#endif
@ -279,7 +315,7 @@ char *__canonicalize_directory_name_internal __P ((__const char *__thisdir,
size_t __size));
#endif
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Put the absolute pathname of the current working directory in BUF.
If successful, return BUF. If not, put an error message in
BUF and return NULL. BUF should be at least PATH_MAX bytes long. */
@ -337,7 +373,7 @@ extern int execvp __P ((__const char *__file, char *__const __argv[]));
extern int execlp __P ((__const char *__file, __const char *__arg, ...));
#ifdef __USE_MISC
#if defined(__USE_MISC) || defined(__USE_XOPEN)
/* Add INC to priority of the current process. */
extern int nice __P ((int __inc));
#endif
@ -388,11 +424,11 @@ extern int setpgid __P ((__pid_t __pid, __pid_t __pgid));
/* Get the process group ID of process PID. */
extern __pid_t __getpgid __P ((__pid_t __pid));
#ifdef __USE_GNU
#ifdef __USE_XOPEN_EXTENDED
extern __pid_t getpgid __P ((__pid_t __pid));
#endif
#if defined (__USE_SVID) || defined (__USE_BSD)
#if defined(__USE_SVID) || defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Both System V and BSD have `setpgrp' functions, but with different
calling conventions. The BSD function is the same as POSIX.1 `setpgid'
(above). The System V function takes no arguments and puts the calling
@ -423,7 +459,7 @@ extern int setpgrp __P ((__pid_t __pid, __pid_t __pgrp));
extern __pid_t __setsid __P ((void));
extern __pid_t setsid __P ((void));
#ifdef __USE_GNU
#ifdef __USE_XOPEN_EXTENDED
/* Return the session ID of the given process. */
extern __pid_t getsid __P ((__pid_t __pid));
#endif
@ -463,12 +499,14 @@ extern int group_member __P ((__gid_t __gid));
extern int __setuid __P ((__uid_t __uid));
extern int setuid __P ((__uid_t __uid));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Set the real user ID of the calling process to RUID,
and the effective user ID of the calling process to EUID. */
extern int __setreuid __P ((__uid_t __ruid, __uid_t __euid));
extern int setreuid __P ((__uid_t __ruid, __uid_t __euid));
#endif
#ifdef __USE_BSD
/* Set the effective user ID of the calling process to UID. */
extern int seteuid __P ((__uid_t __uid));
#endif /* Use BSD. */
@ -480,12 +518,14 @@ extern int seteuid __P ((__uid_t __uid));
extern int __setgid __P ((__gid_t __gid));
extern int setgid __P ((__gid_t __gid));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Set the real group ID of the calling process to RGID,
and the effective group ID of the calling process to EGID. */
extern int __setregid __P ((__gid_t __rgid, __gid_t __egid));
extern int setregid __P ((__gid_t __rgid, __gid_t __egid));
#endif
#ifdef __USE_BSD
/* Set the effective group ID of the calling process to GID. */
extern int setegid __P ((__gid_t __gid));
#endif /* Use BSD. */
@ -497,7 +537,7 @@ extern int setegid __P ((__gid_t __gid));
extern __pid_t __fork __P ((void));
extern __pid_t fork __P ((void));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Clone the calling process, but without copying the whole address space.
The the calling process is suspended until the the new process exits or is
replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
@ -522,7 +562,7 @@ extern int ttyname_r __P ((int __fd, char *__buf, size_t __buflen));
extern int __isatty __P ((int __fd));
extern int isatty __P ((int __fd));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Return the index into the active-logins file (utmp) for
the controlling terminal. */
extern int ttyslot __P ((void));
@ -533,7 +573,7 @@ extern int ttyslot __P ((void));
extern int __link __P ((__const char *__from, __const char *__to));
extern int link __P ((__const char *__from, __const char *__to));
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Make a symbolic link to FROM named TO. */
extern int __symlink __P ((__const char *__from, __const char *__to));
extern int symlink __P ((__const char *__from, __const char *__to));
@ -611,7 +651,7 @@ extern char *optarg;
#endif
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined (__USE_XOPEN)
/* Put the name of the current host in no more than LEN bytes of NAME.
The result is null-terminated if LEN is large enough for the full
@ -623,9 +663,6 @@ extern int gethostname __P ((char *__name, size_t __len));
This call is restricted to the super-user. */
extern int sethostname __P ((__const char *__name, size_t __len));
/* Return the current machine's Internet number. */
extern long int gethostid __P ((void));
/* Set the current machine's Internet number to ID.
This call is restricted to the super-user. */
extern int sethostid __P ((long int __id));
@ -638,31 +675,9 @@ extern int getdomainname __P ((char *__name, size_t __len));
extern int setdomainname __P ((__const char *__name, size_t __len));
/* Return the number of bytes in a page. This is the system's page size,
which is not necessarily the same as the hardware page size. */
extern size_t __getpagesize __P ((void));
extern size_t getpagesize __P ((void));
/* Return the maximum number of file descriptors
the current process could possibly have. */
extern int __getdtablesize __P ((void));
extern int getdtablesize __P ((void));
/* Truncate FILE to LENGTH bytes. */
extern int truncate __P ((__const char *__file, __off_t __length));
/* Truncate the file FD is open on to LENGTH bytes. */
extern int ftruncate __P ((int __fd, __off_t __length));
/* Make all changes done to FD actually appear on disk. */
extern int fsync __P ((int __fd));
/* Make all changes done to all files actually appear on disk. */
extern int sync __P ((void));
/* Revoke access permissions to all processes currently communicating
with the control terminal, and then send a SIGHUP signal to the process
@ -707,25 +722,41 @@ extern char *getpass __P ((__const char *__prompt));
redirects stdin, stdout, and stderr to /dev/null. */
extern int daemon __P ((int __nochdir, int __noclose));
#endif /* Use BSD. */
#endif /* Use BSD || X/Open. */
#ifdef __USE_MISC
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Generate a unique temporary file name from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX";
they are replaced with a string that makes the file name unique.
Returns TEMPLATE, or a null pointer if it cannot get a unique file name. */
extern char *mktemp __P ((char *__template));
/* Return the current machine's Internet number. */
extern long int gethostid __P ((void));
/* Generate a unique temporary file name from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX";
they are replaced with a string that makes the filename unique.
Returns a file descriptor open on the file for reading and writing,
or -1 if it cannot create a uniquely-named file. */
extern int mkstemp __P ((char *__template));
/* Make all changes done to all files actually appear on disk. */
extern int sync __P ((void));
/* Return the number of bytes in a page. This is the system's page size,
which is not necessarily the same as the hardware page size. */
extern int __getpagesize __P ((void));
extern int getpagesize __P ((void));
/* Truncate FILE to LENGTH bytes. */
extern int truncate __P ((__const char *__file, __off_t __length));
/* Truncate the file FD is open on to LENGTH bytes. */
extern int ftruncate __P ((int __fd, __off_t __length));
/* Return the maximum number of file descriptors
the current process could possibly have. */
extern int __getdtablesize __P ((void));
extern int getdtablesize __P ((void));
#endif /* Use BSD || X/Open Unix. */
#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Set the end of accessible data space (aka "the break") to ADDR.
Returns zero on success and -1 for errors (with errno set). */
extern int __brk __P ((__ptr_t __addr));
@ -740,8 +771,10 @@ extern int brk __P ((__ptr_t __addr));
returns (void *) -1 for errors (with errno set). */
extern __ptr_t __sbrk __P ((ptrdiff_t __delta));
extern __ptr_t sbrk __P ((ptrdiff_t __delta));
#endif
#ifdef __USE_MISC
/* Invoke `system call' number SYSNO, passing it the remaining arguments.
This is completely system-dependent, and not often useful.
@ -757,7 +790,8 @@ extern long int syscall __P ((long int __sysno, ...));
#endif /* Use misc. */
#if defined (__USE_MISC) && !defined (F_LOCK)
#if (defined (__USE_MISC) || defined (__USE_XOPEN_EXTENDED)) \
&& !defined (F_LOCK)
/* NOTE: These declarations also appear in <fcntl.h>; be sure to keep both
files consistent. Some systems have them there and some here, and some
software depends on the macros being defined without including both. */
@ -792,7 +826,6 @@ extern int lockf __P ((int __fd, int __cmd, __off_t __len));
differ from its real IDs, or it is otherwise indicated that extra
security should be used. When this is set the dynamic linker ignores
the various environment variables that normally affect it. */
extern int __libc_enable_secure;
#endif
@ -803,6 +836,28 @@ extern int __libc_enable_secure;
extern int fdatasync __P ((int __fildes));
#endif /* Use POSIX */
/* XPG4.2 specifies that prototypes for the encryption functions must
be defined here. */
#ifdef __USE_XOPEN
/* Encrypt at most 8 characters from KEY using salt to perturb DES. */
extern char *crypt __P ((__const char *__key, __const char *__salt));
/* Setup DES tables according KEY. */
extern void setkey __P ((__const char *__key));
/* Encrypt data in BLOCK in place if EDFLAG is zero; otherwise decrypt
block in place. */
extern void encrypt __P ((char *__block, int __edflag));
/* Swab pairs bytes in the first N bytes of the area pointed to by
FROM and copy the result to TO. The value of TO must not be in the
range [FROM - N + 1, FROM - 1]. If N is odd the first byte in FROM
is without partner. */
extern void swab __P ((__const char *__from, char *__to, ssize_t __n));
#endif
__END_DECLS
#endif /* unistd.h */

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* POSIX Standard: 9.2.2 User Database Access <pwd.h>
@ -69,7 +69,7 @@ extern struct passwd *__pwdscan __P ((__ptr_t *__p,
#endif
#if defined(__USE_SVID) || defined(__USE_MISC)
#if defined(__USE_SVID) || defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Rewind the password-file stream. */
extern void setpwent __P ((void));
@ -104,7 +104,7 @@ extern struct passwd *getpwnam __P ((__const char *__name));
PLEASE NOTE: these functions are not yet standardized. The interface
may change in later versions of this library. */
#if defined(__USE_SVID) || defined(__USE_MISC)
#if defined(__USE_SVID) || defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
extern int __getpwent_r __P ((struct passwd *__resultbuf, char *__buffer,
size_t __buflen, struct passwd **__result));
extern int getpwent_r __P ((struct passwd *__resultbuf, char *__buffer,

View File

@ -12,8 +12,8 @@ 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,
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. */
/* Declaration of types and functions for shadow password suite. */
@ -23,14 +23,15 @@ Boston, MA 02111-1307, USA. */
#define _SHADOW_H 1
#include <features.h>
#include <paths.h>
#define __need_FILE
#include <stdio.h>
#define __need_size_t
#include <stddef.h>
/* Paths to the userd files. */
#define SHADOW "/etc/shadow"
/* Paths to the user database files. */
#define SHADOW _PATH_SHADOW
__BEGIN_DECLS

View File

@ -12,12 +12,12 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/*
* ANSI Standard: 4.7 SIGNAL HANDLING <signal.h>
* ISO C Standard: 4.7 SIGNAL HANDLING <signal.h>
*/
#ifndef _SIGNAL_H
@ -62,12 +62,12 @@ extern int __kill __P ((__pid_t __pid, int __sig));
extern int kill __P ((__pid_t __pid, int __sig));
#endif /* Use POSIX. */
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Send SIG to all processes in process group PGRP.
If PGRP is zero, send SIG to all processes in
the current process's process group. */
extern int killpg __P ((__pid_t __pgrp, int __sig));
#endif /* Use BSD. */
#endif /* Use BSD || X/Open Unix. */
/* Raise signal SIG, i.e., send SIG to yourself. */
extern int raise __P ((int __sig));
@ -220,6 +220,18 @@ extern int sigvec __P ((int __sig, __const struct sigvec *__vec,
struct sigvec *__ovec));
/* Get machine-dependent `struct sigcontext' and signal subcodes. */
#include <sigcontext.h>
/* Restore the state saved in SCP. */
extern int __sigreturn __P ((struct sigcontext *__scp));
extern int sigreturn __P ((struct sigcontext *__scp));
#endif /* signal.h included and use BSD. */
#if defined(_SIGNAL_H) && (defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED))
/* If INTERRUPT is nonzero, make signal SIG interrupt system calls
(causing them to fail with EINTR); if INTERRUPT is zero, make system
calls be restarted after signal SIG. */
@ -249,14 +261,7 @@ struct sigaltstack
extern int sigaltstack __P ((__const struct sigaltstack *__ss,
struct sigaltstack *__oss));
/* Get machine-dependent `struct sigcontext' and signal subcodes. */
#include <sigcontext.h>
/* Restore the state saved in SCP. */
extern int __sigreturn __P ((struct sigcontext *__scp));
extern int sigreturn __P ((struct sigcontext *__scp));
#endif /* signal.h included and use BSD. */
#endif /* signal.h included and use BSD or X/Open Unix. */
__END_DECLS

View File

@ -13,9 +13,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ctype.h>
#include <printf.h>
@ -54,6 +54,7 @@ struct printf_spec
union printf_arg
{
unsigned char pa_char;
wchar_t pa_wchar;
short int pa_short_int;
int pa_int;
long int pa_long_int;
@ -66,6 +67,7 @@ union printf_arg
double pa_double;
long double pa_long_double;
const char *pa_string;
const wchar_t *pa_wstring;
void *pa_pointer;
};
@ -300,11 +302,7 @@ parse_one_spec (const UCHAR_T *format, size_t posn, struct printf_spec *spec,
}
/* Get the format specification. */
#ifdef THIS_IS_INCOMPATIBLE_WITH_LINUX_LIBC
spec->info.spec = (wchar_t) *format++;
#else
spec->info.spec = (char) *format++;
#endif
if (__printf_arginfo_table != NULL &&
__printf_arginfo_table[spec->info.spec] != NULL)
/* We don't try to get the types for all arguments if the format
@ -346,9 +344,15 @@ parse_one_spec (const UCHAR_T *format, size_t posn, struct printf_spec *spec,
case L'c':
spec->data_arg_type = PA_CHAR;
break;
case L'C':
spec->data_arg_type = PA_WCHAR;
break;
case L's':
spec->data_arg_type = PA_STRING;
break;
case L'S':
spec->data_arg_type = PA_WSTRING;
break;
case L'p':
spec->data_arg_type = PA_POINTER;
break;

View File

@ -105,7 +105,9 @@ enum
{ /* C type: */
PA_INT, /* int */
PA_CHAR, /* int, cast to char */
PA_WCHAR, /* wide char */
PA_STRING, /* const char *, a '\0'-terminated string */
PA_WSTRING, /* const wchar_t *, wide character string */
PA_POINTER, /* void * */
PA_FLOAT, /* float */
PA_DOUBLE, /* double */

View File

@ -12,8 +12,8 @@ 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,
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ctype.h>
@ -222,11 +222,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* '4' */ 8, /* '5' */ 8, /* '6' */ 8, /* '7' */ 8,
/* '8' */ 8, /* '9' */ 8, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, /* 'C' */ 25,
0, /* 'E' */ 19, 0, /* 'G' */ 19,
0, 0, 0, 0,
/* 'L' */ 12, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, /* 'S' */ 21,
0, 0, 0, 0,
/* 'X' */ 18, 0, /* 'Z' */ 13, 0,
0, 0, 0, 0,
@ -254,7 +254,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
#define STEP0_3_TABLE \
/* Step 0: at the beginning. */ \
static const void *step0_jumps[25] = \
static const void *step0_jumps[26] = \
{ \
REF (form_unknown), \
REF (flag_space), /* for ' ' */ \
@ -277,13 +277,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_hexa), /* for 'X', 'x' */ \
REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \
REF (form_character), /* for 'c' */ \
REF (form_string), /* for 's' */ \
REF (form_string), /* for 's', 'S' */ \
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror) /* for 'm' */ \
REF (form_strerror), /* for 'm' */ \
REF (form_wcharacter) /* for 'C' */ \
}; \
/* Step 1: after processing width. */ \
static const void *step1_jumps[25] = \
static const void *step1_jumps[26] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@ -306,13 +307,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_hexa), /* for 'X', 'x' */ \
REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \
REF (form_character), /* for 'c' */ \
REF (form_string), /* for 's' */ \
REF (form_string), /* for 's', 'S' */ \
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror) /* for 'm' */ \
REF (form_strerror), /* for 'm' */ \
REF (form_wcharacter) /* for 'C' */ \
}; \
/* Step 2: after processing precision. */ \
static const void *step2_jumps[25] = \
static const void *step2_jumps[26] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@ -335,13 +337,14 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_hexa), /* for 'X', 'x' */ \
REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \
REF (form_character), /* for 'c' */ \
REF (form_string), /* for 's' */ \
REF (form_string), /* for 's', 'S' */ \
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror) /* for 'm' */ \
REF (form_strerror), /* for 'm' */ \
REF (form_wcharacter) /* for 'C' */ \
}; \
/* Step 3: after processing first 'l' modifier. */ \
static const void *step3_jumps[25] = \
static const void *step3_jumps[26] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@ -364,15 +367,16 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_hexa), /* for 'X', 'x' */ \
REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \
REF (form_character), /* for 'c' */ \
REF (form_string), /* for 's' */ \
REF (form_string), /* for 's', 'S' */ \
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror) /* for 'm' */ \
REF (form_strerror), /* for 'm' */ \
REF (form_wcharacter) /* for 'C' */ \
}
#define STEP4_TABLE \
/* Step 4: processing format specifier. */ \
static const void *step4_jumps[25] = \
static const void *step4_jumps[26] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@ -395,10 +399,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_hexa), /* for 'X', 'x' */ \
REF (form_float), /* for 'E', 'e', 'f', 'G', 'g' */ \
REF (form_character), /* for 'c' */ \
REF (form_string), /* for 's' */ \
REF (form_string), /* for 's', 'S' */ \
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror) /* for 'm' */ \
REF (form_strerror), /* for 'm' */ \
REF (form_wcharacter) /* for 'C' */ \
}
@ -683,6 +688,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
\
LABEL (form_character): \
/* Character. */ \
if (is_long) \
goto LABEL (form_wcharacter); \
--width; /* Account for the character itself. */ \
if (!left) \
PAD (' '); \
@ -694,6 +701,25 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
PAD (' '); \
break; \
\
LABEL (form_wcharacter): \
{ \
/* Wide character. */ \
char buf[MB_CUR_MAX]; \
mbstate_t mbstate; \
size_t len; \
\
len = __wcrtomb (buf, (fspec == NULL ? va_arg (ap, wint_t) \
: args_value[fspec->data_arg].pa_wchar), \
&mbstate); \
width -= len; \
if (!left) \
PAD (' '); \
outstring (buf, len); \
if (left) \
PAD (' '); \
} \
break; \
\
LABEL (form_string): \
{ \
size_t len; \
@ -722,18 +748,12 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
len = 0; \
} \
} \
else if (!is_long) \
else if (!is_long && spec != L_('S')) \
{ \
if (prec != -1) \
{ \
/* Search for the end of the string, but don't search past \
the length specified by the precision. */ \
const char *end = memchr (string, '\0', prec); \
if (end) \
len = end - string; \
else \
len = prec; \
} \
len = strnlen (string, prec); \
else \
len = strlen (string); \
} \
@ -1176,6 +1196,7 @@ do_positional:
break
T (PA_CHAR, pa_char, int); /* Promoted. */
T (PA_WCHAR, pa_wchar, wint_t);
T (PA_INT|PA_FLAG_SHORT, pa_short_int, int); /* Promoted. */
T (PA_INT, pa_int, int);
T (PA_INT|PA_FLAG_LONG, pa_long_int, long int);
@ -1184,6 +1205,7 @@ do_positional:
T (PA_DOUBLE, pa_double, double);
T (PA_DOUBLE|PA_FLAG_LONG_DOUBLE, pa_long_double, long double);
T (PA_STRING, pa_string, const char *);
T (PA_WSTRING, pa_wstring, const wchar_t *);
T (PA_POINTER, pa_pointer, void *);
#undef T
default:

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "../locale/localeinfo.h"
#include <errno.h>
@ -24,6 +24,7 @@ Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wctype.h>
#include <libc-lock.h>
#ifdef __GNUC__
@ -55,6 +56,12 @@ Cambridge, MA 02139, USA. */
# define va_list _IO_va_list
# define ungetc(c, s) (--read_in, _IO_ungetc (c, s))
# define inchar() ((c = _IO_getc_unlocked (s)), (void) ++read_in, c)
# define encode_error() do { \
if (errp != NULL) *errp |= 4; \
_IO_funlockfile (s); \
__set_errno (EILSEQ); \
return done; \
} while (0)
# define conv_error() do { \
if (errp != NULL) *errp |= 2; \
_IO_funlockfile (s); \
@ -88,6 +95,11 @@ Cambridge, MA 02139, USA. */
#else
# define ungetc(c, s) (--read_in, ungetc (c, s))
# define inchar() ((c = getc (s)), (void) ++read_in, c)
# define encode_error() do { \
_IO_funlockfile (s); \
__set_errno (EILSEQ); \
return done; \
} while (0)
# define conv_error() do { \
funlockfile (s); \
return done; \
@ -173,6 +185,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
} num;
/* Character-buffer pointer. */
char *str = NULL;
wchar_t *wstr = NULL;
char **strptr = NULL;
size_t strsize = 0;
/* We must not react on white spaces immediately because they can
@ -435,6 +448,8 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
break;
case 'c': /* Match characters. */
if ((flags & LONG) == 0)
{
if (!(flags & SUPPRESS))
{
str = ARG (char *);
@ -466,9 +481,105 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
++done;
break;
}
/* FALLTHROUGH */
case 'C':
/* Get UTF-8 encoded wide character. Here we assume (as in
other parts of the libc) that we only have to handle
UTF-8. */
{
wint_t val;
size_t cnt = 0;
int first = 1;
if (!(flags & SUPPRESS))
{
wstr = ARG (wchar_t *);
if (str == NULL)
conv_error ();
}
do
{
#define NEXT_WIDE_CHAR(First) \
c = inchar (); \
if (c == EOF) \
/* EOF is only an error for the first character. */ \
if (First) \
input_error (); \
else \
break; \
val = c; \
if (val >= 0x80) \
{ \
if ((c & 0xc0) == 0x80 || (c & 0xfe) == 0xfe) \
encode_error (); \
if ((c & 0xe0) == 0xc0) \
{ \
/* We expect two bytes. */ \
cnt = 1; \
val &= 0x1f; \
} \
else if ((c & 0xf0) == 0xe0) \
{ \
/* We expect three bytes. */ \
cnt = 2; \
val &= 0x0f; \
} \
else if ((c & 0xf8) == 0xf0) \
{ \
/* We expect four bytes. */ \
cnt = 3; \
val &= 0x07; \
} \
else if ((c & 0xfc) == 0xf8) \
{ \
/* We expect five bytes. */ \
cnt = 4; \
val &= 0x03; \
} \
else \
{ \
/* We expect six bytes. */ \
cnt = 5; \
val &= 0x01; \
} \
\
do \
{ \
c = inchar (); \
if (c == EOF \
|| (c & 0xc0) == 0x80 || (c & 0xfe) == 0xfe) \
encode_error (); \
val <<= 6; \
val |= c & 0x3f; \
} \
while (--cnt > 0); \
} \
\
if (!(flags & SUPPRESS)) \
*wstr++ = val; \
first = 0
NEXT_WIDE_CHAR (first);
}
while (--width > 0);
if (width > 0)
/* I.e., EOF was read. */
--read_in;
if (!(flags & SUPPRESS))
++done;
}
break;
case 's': /* Read a string. */
#define STRING_ARG \
if (flags & LONG)
/* We have to process a wide character string. */
goto wide_char_string;
#define STRING_ARG(Str, Type) \
if (!(flags & SUPPRESS)) \
{ \
if (flags & MALLOC) \
@ -479,14 +590,15 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
conv_error (); \
/* Allocate an initial buffer. */ \
strsize = 100; \
*strptr = str = malloc (strsize); \
*strptr = malloc (strsize * sizeof (Type)); \
Str = (Type *) *strptr; \
} \
else \
str = ARG (char *); \
if (str == NULL) \
Str = ARG (Type *); \
if (Str == NULL) \
conv_error (); \
}
STRING_ARG;
STRING_ARG (str, char);
c = inchar ();
if (c == EOF)
@ -499,43 +611,44 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
ungetc (c, s);
break;
}
#define STRING_ADD_CHAR(c) \
#define STRING_ADD_CHAR(Str, c, Type) \
if (!(flags & SUPPRESS)) \
{ \
*str++ = c; \
if ((flags & MALLOC) && str == *strptr + strsize) \
*Str++ = c; \
if ((flags & MALLOC) && (char *) Str == *strptr + strsize) \
{ \
/* Enlarge the buffer. */ \
str = realloc (*strptr, strsize * 2); \
if (str == NULL) \
Str = realloc (*strptr, strsize * 2 * sizeof (Type)); \
if (Str == NULL) \
{ \
/* Can't allocate that much. Last-ditch effort. */\
str = realloc (*strptr, strsize + 1); \
if (str == NULL) \
Str = realloc (*strptr, \
(strsize + 1) * sizeof (Type)); \
if (Str == NULL) \
{ \
/* We lose. Oh well. \
Terminate the string and stop converting, \
so at least we don't skip any input. */ \
(*strptr)[strsize] = '\0'; \
((Type *) (*strptr))[strsize] = '\0'; \
++done; \
conv_error (); \
} \
else \
{ \
*strptr = str; \
str += strsize; \
*strptr = (char *) Str; \
Str = ((Type *) *strptr) + strsize; \
++strsize; \
} \
} \
else \
{ \
*strptr = str; \
str += strsize; \
*strptr = (char *) Str; \
Str = ((Type *) *strptr) + strsize; \
strsize *= 2; \
} \
} \
}
STRING_ADD_CHAR (c);
STRING_ADD_CHAR (str, c, char);
} while ((width <= 0 || --width > 0) && inchar () != EOF);
if (!(flags & SUPPRESS))
@ -545,6 +658,43 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
}
break;
case 'S':
/* Wide character string. */
wide_char_string:
{
wint_t val;
int first = 1;
STRING_ARG (wstr, wchar_t);
do
{
size_t cnt = 0;
NEXT_WIDE_CHAR (first);
if (iswspace (val))
{
/* XXX We would have to push back the whole wide char
with possibly many bytes. But since scanf does
not make a difference for white space characters
we can simply push back a simple <SP> which is
guaranteed to be in the [:space:] class. */
ungetc (' ', s);
break;
}
STRING_ADD_CHAR (wstr, val, wchar_t);
first = 0;
}
while (width <= 0 || --width > 0);
if (!(flags & SUPPRESS))
{
*wstr = L'\0';
++done;
}
}
break;
case 'x': /* Hexadecimal integer. */
case 'X': /* Ditto. */
base = 16;
@ -765,11 +915,19 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
break;
case '[': /* Character class. */
STRING_ARG;
if (flags & LONG)
{
STRING_ARG (wstr, wchar_t);
c = '\0'; /* This is to keep gcc quiet. */
}
else
{
STRING_ARG (str, char);
c = inchar ();
if (c == EOF)
input_error ();
}
if (*f == '^')
{
@ -814,10 +972,50 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
}
if (fc == '\0')
{
if (!(flags & LONG))
ungetc (c, s);
conv_error();
}
if (flags & LONG)
{
wint_t val;
int first = 1;
do
{
size_t cnt = 0;
NEXT_WIDE_CHAR (first);
if (val > 255 || wp[val] == not_in)
{
/* XXX We have a problem here. We read a wide
character and this possibly took several
bytes. But we can only push back one single
character. To be sure we don't create wrong
input we push it back only in case it is
representable within one byte. */
if (val < 0x80)
ungetc (val, s);
break;
}
STRING_ADD_CHAR (wstr, val, wchar_t);
if (width > 0)
--width;
first = 0;
}
while (width != 0);
if (first)
conv_error ();
if (!(flags & SUPPRESS))
{
*wstr = L'\0';
++done;
}
}
else
{
num.ul = read_in - 1; /* -1 because we already read one char. */
do
{
@ -826,7 +1024,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
ungetc (c, s);
break;
}
STRING_ADD_CHAR (c);
STRING_ADD_CHAR (str, c, char);
if (width > 0)
--width;
}
@ -840,6 +1038,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
*str = '\0';
++done;
}
}
break;
case 'p': /* Generic pointer. */

View File

@ -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.
The GNU C Library is free software; you can redistribute it and/or
@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ansidecl.h>
#include <stdio.h>
@ -71,7 +71,7 @@ DEFUN(grow, (stream, c), FILE *stream AND int c)
else
{
/* Extend the buffer (and the object) to include
the rest of the obstack chunk (which is unitialized).
the rest of the obstack chunk (which is uninitialized).
Data past bufp is undefined. */
stream->__put_limit = stream->__buffer + stream->__bufsize;
obstack_blank_fast (obstack, stream->__put_limit - stream->__bufp);

View File

@ -302,7 +302,7 @@ extern char *tmpnam_r __P ((char *__s));
#endif
#ifdef __USE_SVID
#if def(__USE_SVID) || defined(__USE_XOPEN)
/* Generate a unique temporary filename using up to five characters of PFX
if it is not NULL. The directory to put this file in is searched for
as follows: First the environment variable "TMPDIR" is checked.

View File

@ -12,9 +12,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <libc-lock.h>
#include <stdlib.h>

View File

@ -13,8 +13,8 @@ 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,
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdlib.h>
@ -34,18 +34,24 @@ static const char conv_table[64] =
char *
l64a (n)
long n;
long int n;
{
static char result[7];
int cnt;
if (n <= 0l)
/* The value for N == 0 is defined to be the empty string. When a
negative value is given the result is undefined. We will
return the empty string. */
return (char *) "";
result[6] = '\0';
for (cnt = 5; cnt >= 0; --cnt)
for (cnt = 5; n > 0; --cnt)
{
result[cnt] = conv_table[n & 0x3f];
n >>= 6;
}
return result;
return &result[n + 1];
}

View File

@ -188,7 +188,7 @@ extern __inline long int atol (__const char *__nptr)
#endif /* Optimizing GCC >=2. */
#ifdef __USE_SVID
#if defined(__USE_SVID) || defined(__USE_XOPEN_EXTENDED)
/* Convert N to base 64 using the digits "./0-9A-Za-z", least-significant
digit first. Returns a pointer to static storage overwritten by the
next call. */
@ -196,16 +196,8 @@ extern char *l64a __P ((long int __n));
/* Read a number from a string S in base 64 as above. */
extern long int a64l __P ((__const char *__s));
#endif
/* Return a random integer between 0 and RAND_MAX inclusive. */
extern int rand __P ((void));
/* Seed the random number generator with the given number. */
extern void srand __P ((unsigned int __seed));
#ifdef __USE_BSD
#include <sys/types.h> /* we need int32_t... */
/* These are the functions that actually do things. The `random', `srandom',
@ -262,13 +254,36 @@ extern int srandom_r __P ((unsigned int __seed, struct random_data *__buf));
extern int initstate_r __P ((unsigned int __seed, __ptr_t __statebuf,
size_t __statelen, struct random_data *__buf));
extern int setstate_r __P ((__ptr_t __statebuf, struct random_data *__buf));
#endif /* __USE_REENTRANT. */
#endif /* Use reentrant. */
#endif /* Use BSD. */
#ifdef __USE_SVID
/* Return a random integer between 0 and RAND_MAX inclusive. */
extern int rand __P ((void));
/* Seed the random number generator with the given number. */
extern void srand __P ((unsigned int __seed));
#if defined(__USE_SVID) || defined(__USE_XOPEN)
/* System V style 48-bit random number generator functions. */
/* Return non-negative, double-precision floating-point value in [0.0,1.0). */
extern double drand48 __P ((void));
extern double erand48 __P ((unsigned short int __xsubi[3]));
/* Return non-negative, long integer in [0,2^31). */
extern long lrand48 __P ((void));
extern long nrand48 __P ((unsigned short int __xsubi[3]));
/* Return signed, long integers in [-2^31,2^31). */
extern long mrand48 __P ((void));
extern long jrand48 __P ((unsigned short int __xsubi[3]));
/* Seed random number generator. */
extern void srand48 __P ((long __seedval));
extern unsigned short int *seed48 __P ((unsigned short int __seed16v[3]));
extern void lcong48 __P ((unsigned short int __param[7]));
/* Data structure for communication with thread safe versions. */
struct drand48_data
{
@ -279,38 +294,34 @@ struct drand48_data
int init; /* Flag for initializing. */
};
#ifdef __USE_REENTRANT
/* Return non-negative, double-precision floating-point value in [0.0,1.0). */
extern double drand48 __P ((void));
extern int drand48_r __P ((struct drand48_data *__buffer, double *__result));
extern double erand48 __P ((unsigned short int __xsubi[3]));
extern int erand48_r __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer, double *__result));
/* Return non-negative, long integer in [0,2^31). */
extern long lrand48 __P ((void));
extern int lrand48_r __P ((struct drand48_data *__buffer, long *__result));
extern long nrand48 __P ((unsigned short int __xsubi[3]));
extern int nrand48_r __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer, long *__result));
/* Return signed, long integers in [-2^31,2^31). */
extern long mrand48 __P ((void));
extern int mrand48_r __P ((struct drand48_data *__buffer, long *__result));
extern long jrand48 __P ((unsigned short int __xsubi[3]));
extern int jrand48_r __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer, long *__result));
/* Seed random number generator. */
extern void srand48 __P ((long __seedval));
extern int srand48_r __P ((long __seedval, struct drand48_data *__buffer));
extern unsigned short int *seed48 __P ((unsigned short int __seed16v[3]));
extern int seed48_r __P ((unsigned short int __seed16v[3],
struct drand48_data *__buffer));
extern void lcong48 __P ((unsigned short int __param[7]));
extern int lcong48_r __P ((unsigned short int __param[7],
struct drand48_data *__buffer));
#endif /* Use reentrant. */
/* Internal function to compute next state of the generator. */
extern int __drand48_iterate __P ((unsigned short int __xsubi[3],
struct drand48_data *__buffer));
#endif /* __USE_SVID. */
#endif /* Use SVID or X/Open. */
/* Allocate SIZE bytes of memory. */
@ -332,7 +343,7 @@ extern void cfree __P ((__ptr_t __ptr));
#include <alloca.h>
#endif /* Use GNU, BSD, or misc. */
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Allocate SIZE bytes on a page boundary. The storage cannot be freed. */
extern __ptr_t valloc __P ((size_t __size));
#endif
@ -365,7 +376,7 @@ extern char *getenv __P ((__const char *__name));
programs is running with SUID or SGID enabled. */
extern char *__secure_getenv __P ((__const char *__name));
#ifdef __USE_SVID
#if defined(__USE_SVID) || defined(__USE_XOPEN)
/* The SVID says this is in <stdio.h>, but this seems a better place. */
/* Put STRING, which is of the form "NAME=VALUE", in the environment.
If there is no `=', remove NAME from the environment. */
@ -389,6 +400,23 @@ extern void unsetenv __P ((__const char *__name));
extern int clearenv __P ((void));
#endif
#if defined(__USE_MISC) || defined(__USE_XOPEN_EXTENDED)
/* Generate a unique temporary file name from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX";
they are replaced with a string that makes the file name unique.
Returns TEMPLATE, or a null pointer if it cannot get a unique file name. */
extern char *mktemp __P ((char *__template));
/* Generate a unique temporary file name from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX";
they are replaced with a string that makes the filename unique.
Returns a file descriptor open on the file for reading and writing,
or -1 if it cannot create a uniquely-named file. */
extern int mkstemp __P ((char *__template));
#endif
/* Execute the given line as a shell command. */
extern int system __P ((__const char *__command));
@ -400,7 +428,7 @@ extern int system __P ((__const char *__command));
extern char *canonicalize_file_name __P ((__const char *__name));
#endif
#ifdef __USE_BSD
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Return the canonical absolute name of file NAME. The last file name
component need not exist, and may be a symlink to a nonexistent file.
If RESOLVED is null, the result is malloc'd; otherwise, if the canonical
@ -451,47 +479,49 @@ extern lldiv_t lldiv __P ((long long int __numer, long long int __denom)) __attr
#endif
#ifdef __USE_SVID
#if defined(__USE_SVID) || defined(__USE_XOPEN_EXTENDED)
/* Convert floating point numbers to strings. The returned values are
valid only until another call to the same function. */
/* Convert VALUE to a string with NDIGIT digits and return a pointer to
this. Set *DECPT with the position of the decimal character and *SIGN
with the sign of the number. */
char *ecvt __P ((double __value, int __ndigit, int *__decpt, int *__sign));
extern char *ecvt __P ((double __value, int __ndigit, int *__decpt,
int *__sign));
/* Convert VALUE to a string rounded to NDIGIT decimal digits. Set *DECPT
with the position of the decimal character and *SIGN with the sign of
the number. */
char *fcvt __P ((double __value, int __ndigit, int *__decpt, int *__sign));
extern char *fcvt __P ((double __value, int __ndigit, int *__decpt,
int *__sign));
/* If possible convert VALUE to a string with NDIGIT significant digits.
Otherwise use exponential representation. The resulting string will
be written to BUF. */
char *gcvt __P ((double __value, int __ndigit, char *__buf));
extern char *gcvt __P ((double __value, int __ndigit, char *__buf));
/* Long double versions of above functions. */
char *qecvt __P ((__long_double_t __value, int __ndigit, int *__decpt,
extern char *qecvt __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *__sign));
char *qfcvt __P ((__long_double_t __value, int __ndigit, int *__decpt,
extern char *qfcvt __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *__sign));
char *qgcvt __P ((__long_double_t __value, int __ndigit, char *__buf));
extern char *qgcvt __P ((__long_double_t __value, int __ndigit, char *__buf));
#ifdef __USE_REENTRANT
/* Reentrant version of the functions above which provide their own
buffers. */
int ecvt_r __P ((double __value, int __ndigit, int *__decpt, int *__sign,
char *__buf, size_t __len));
int fcvt_r __P ((double __value, int __ndigit, int *__decpt, int *__sign,
char *__buf, size_t __len));
extern int ecvt_r __P ((double __value, int __ndigit, int *__decpt,
int *__sign, char *__buf, size_t __len));
extern int fcvt_r __P ((double __value, int __ndigit, int *__decpt,
int *__sign, char *__buf, size_t __len));
int qecvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
extern int qecvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *__sign, char *__buf, size_t __len));
int qfcvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
extern int qfcvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
int *__sign, char *__buf, size_t __len));
#endif
#endif
#endif /* reentrant */
#endif /* use MISC || use X/Open Unix */
/* Return the length of the multibyte character
@ -525,7 +555,7 @@ extern int rpmatch __P ((__const char *__response));
#endif
#ifdef __USE_MISC
#ifdef __USE_XOPEN_EXTENDED
/* Parse comma separated suboption from *OPTIONP and match against
strings in TOKENS. If found return index and set *VALUEP to
optional value introduced by an equal sign. If the suboption is
@ -537,6 +567,13 @@ extern int getsubopt __P ((char **__optionp, __const char *__const *__tokens,
#endif
#ifdef __USE_XOPEN
/* Setup DES tables according KEY. */
extern void setkey __P ((__const char *__key));
#endif
__END_DECLS
#endif /* stdlib.h */

View File

@ -201,7 +201,10 @@ INTERNAL (strtol) (nptr, endptr, base, group)
#endif
if (base < 0 || base == 1 || base > 36)
base = 10;
{
__set_errno (EINVAL);
return 0;
}
save = s = nptr;
@ -214,8 +217,13 @@ INTERNAL (strtol) (nptr, endptr, base, group)
/* Check for a sign. */
if (*s == L_('-'))
{
#if UNSIGNED
__set_errno (EINVAL);
return 0;
#else
negative = 1;
++s;
#endif
}
else if (*s == L_('+'))
{

View File

@ -1,7 +1,6 @@
/* My bet is this was written by Chris Torek.
I reformatted and ansidecl-ized it, and tweaked it a little. */
#include <ansidecl.h>
#include <ctype.h>
#include <stdio.h>
#include <errno.h>
@ -10,13 +9,13 @@
struct ltest
{
CONST char *str; /* Convert this. */
const char *str; /* Convert this. */
unsigned long int expect; /* To get this. */
int base; /* Use this base. */
char left; /* With this left over. */
int err; /* And this in errno. */
};
static CONST struct ltest tests[] =
static const struct ltest tests[] =
{
#if ~0UL == 0xffffffff
/* First, signed numbers. */
@ -38,8 +37,8 @@ static CONST struct ltest tests[] =
{ " 0", 0, 0, 0, 0 },
{ "0xffffffffg", 0xffffffff, 0, 'g', 0 },
{ "0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE },
{ "-0x123456789", 0xffffffff, 0, 0, ERANGE },
{ "-0xfedcba98", -0xfedcba98, 0, 0, 0 },
{ "-0x123456789", 0, 0, 0, EINVAL },
{ "-0xfedcba98", 0, 0, 0, EINVAL },
{ NULL, 0, 0, 0, 0 },
#else
/* assume 64 bit long... */
@ -66,18 +65,18 @@ static CONST struct ltest tests[] =
{ "0xffffffffg", 0xffffffff, 0, 'g', 0 },
{ "0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0 },
{ "0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE },
{ "-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE },
{ "-0xfedcba987654321", -0xfedcba987654321, 0, 0, 0 },
{ "-0x123456789abcdef01", 0, 0, 0, EINVA{ },
{ "-0xfedcba987654321", 0, 0, 0, EINVAL },
{ NULL, 0, 0, 0, 0 },
#endif
};
static void EXFUN(expand, (char *dst, int c));
static void expand __P ((char *dst, int c));
int
DEFUN_VOID(main)
main ()
{
register CONST struct ltest *lt;
register const struct ltest *lt;
char *ep;
int status = 0;
@ -145,7 +144,9 @@ DEFUN_VOID(main)
}
static void
DEFUN(expand, (dst, c), register char *dst AND register int c)
expand (dst, c)
char *dst;
int c;
{
if (isprint(c))
{

View File

@ -27,8 +27,6 @@
__BEGIN_DECLS
#ifdef __USE_GNU
/* Make a '\0' separated arg vector from a unix argv vector, returning it in
ARGZ, and the total length in LEN. If a memory allocation error occurs,
ENOMEM is returned, otherwise 0. The result can be destroyed using free. */
@ -129,6 +127,4 @@ argz_next (char *__argz, size_t __argz_len, __const char *__entry)
}
#endif /* optimizing GCC2 */
#endif /* use GNU */
#endif /* __ARGZ_H__ */
#endif /* argz.h */

View File

@ -1,3 +1,23 @@
/* Test for string function add boundaries of usable memory.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
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. */
#define _GNU_SOURCE 1
#include <errno.h>
#include <stdio.h>
@ -13,7 +33,7 @@
int
main (int argc, char *argv[])
{
size_t size = sysconf (_SC_PAGESIZE);
int size = sysconf (_SC_PAGESIZE);
char *adr, *dest;
int result = 0;
@ -52,7 +72,7 @@ main (int argc, char *argv[])
{
adr[inner] = '\0';
if (strlen (&adr[outer]) != inner - outer)
if (strlen (&adr[outer]) != (size_t) (inner - outer))
{
printf ("strlen flunked for outer = %d, inner = %d\n",
outer, inner);
@ -127,7 +147,7 @@ main (int argc, char *argv[])
adr[inner] = '\0';
if (strcpy (dest, &adr[outer]) != dest
|| strlen (dest) != inner - outer)
|| strlen (dest) != (size_t) (inner - outer))
{
printf ("strcpy flunked for outer = %d, inner = %d\n",
outer, inner);

View File

@ -46,7 +46,7 @@ extern __ptr_t memmove __P ((__ptr_t __dest, __const __ptr_t __src,
or NULL if C was not found in the first N bytes of SRC. */
extern __ptr_t __memccpy __P ((__ptr_t __dest, __const __ptr_t __src,
int __c, size_t __n));
#if defined (__USE_SVID) || defined (__USE_BSD)
#if defined (__USE_SVID) || defined (__USE_BSD) || defined (__USE_XOPEN)
extern __ptr_t memccpy __P ((__ptr_t __dest, __const __ptr_t __src,
int __c, size_t __n));
#endif /* SVID. */
@ -83,7 +83,7 @@ extern int strcoll __P ((__const char *__s1, __const char *__s2));
/* Put a transformation of SRC into no more than N bytes of DEST. */
extern size_t strxfrm __P ((char *__dest, __const char *__src, size_t __n));
#if defined (__USE_SVID) || defined (__USE_BSD)
#if defined(__USE_SVID) || defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Duplicate S, returning an identical malloc'd string. */
extern char *__strdup __P ((__const char *__s));
extern char *strdup __P ((__const char *__s));
@ -177,13 +177,7 @@ extern char *strerror __P ((int __errnum));
extern char *strerror_r __P ((int __errnum, char *__buf, size_t __buflen));
#endif
#ifdef __USE_BSD
/* Find the first occurrence of C in S (same as strchr). */
extern char *index __P ((__const char *__s, int __c));
/* Find the last occurrence of C in S (same as strrchr). */
extern char *rindex __P ((__const char *__s, int __c));
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
/* Copy N bytes of SRC to DEST (like memmove, but args reversed). */
extern void bcopy __P ((__const __ptr_t __src, __ptr_t __dest, size_t __n));
@ -193,6 +187,12 @@ extern void bzero __P ((__ptr_t __s, size_t __n));
/* Compare N bytes of S1 and S2 (same as memcmp). */
extern int bcmp __P ((__const __ptr_t __s1, __const __ptr_t __s2, size_t __n));
/* Find the first occurrence of C in S (same as strchr). */
extern char *index __P ((__const char *__s, int __c));
/* Find the last occurrence of C in S (same as strrchr). */
extern char *rindex __P ((__const char *__s, int __c));
/* Return the position of the first bit set in I, or 0 if none are set.
The least-significant bit is position 1, the most-significant 32. */
extern int ffs __P ((int __i));
@ -206,7 +206,9 @@ extern int __strncasecmp __P ((__const char *__s1, __const char *__s2,
size_t __n));
extern int strncasecmp __P ((__const char *__s1, __const char *__s2,
size_t __n));
#endif /* Use BSD or X/Open Unix. */
#ifdef __USE_BSD
/* Return the next DELIM-delimited token from *STRINGP,
terminating it with a '\0', and update *STRINGP to point past it. */
extern char *__strsep __P ((char **__stringp, __const char *__delim));
@ -238,14 +240,6 @@ extern __ptr_t memfrob __P ((__ptr_t __s, size_t __n));
extern char *basename __P ((__const char *__filename));
#endif
#ifdef __USE_SVID
/* Swab pairs bytes in the first N bytes of the area pointed to by
FROM and copy the result to TO. The value of TO must not be in the
range [FROM - N + 1, FROM - 1]. If N is odd the first byte in FROM
is without partner. */
extern void swab __P ((__const char *__from, __const char *__to, size_t __n));
#endif
__END_DECLS
#endif /* string.h */

View File

@ -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.
The GNU C Library is free software; you can redistribute it and/or
@ -12,20 +12,18 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <ansidecl.h>
#include <stddef.h>
#include <unistd.h>
void
DEFUN(swab, (from, to, n),
CONST char *from AND char *to AND size_t n)
swab (const char *from, char *to, ssize_t n)
{
while (n > 1)
{
CONST char b0 = from[--n], b1 = from[--n];
const char b0 = from[--n], b1 = from[--n];
to[n] = b0;
to[n + 1] = b1;
}

View File

@ -42,4 +42,4 @@ ifeq ($(subdir),elf)
sysdep-CFLAGS += -mno-fp-regs
endif
divrem := divl divlu divq divqu reml remlu remq remqu
divrem := divl divq reml remq

View File

@ -25,6 +25,10 @@ Cambridge, MA 02139, USA. */
ENTRY(_setjmp)
ldgp $29,0($27)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
bis $31, $31, $17 /* Pass a second argument of zero. */
jmp $31, __sigsetjmp /* Call __sigsetjmp. */

View File

@ -25,6 +25,10 @@ Cambridge, MA 02139, USA. */
ENTRY(setjmp)
ldgp $29, 0($27)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
bis $31, 1, $17 /* Pass a second argument of one. */
jmp $31, __sigsetjmp /* Call __sigsetjmp. */

View File

@ -80,7 +80,14 @@ $tail: bne t4, 1f # is there a tail to do?
.end bzero_loop
ENTRY(bzero)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
mov a0, v0 # e0 : move return value in place
beq a1, $done # .. e1 : early exit for zero-length store

110
sysdeps/alpha/div.S Normal file
View File

@ -0,0 +1,110 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
#ifdef __linux__
# include <asm/gentrap.h>
# include <asm/pal.h>
#else
# include <machine/pal.h>
#endif
.set noat
.align 4
.globl div
.ent div
div:
.frame sp, 0, ra
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
#define dividend t0
#define divisor t1
#define mask t2
#define quotient t3
#define modulus t4
#define tmp1 t5
#define tmp2 t6
#define compare t7
/* find correct sign for input to unsigned divide loop. */
sextl a1, a1 # e0 :
sextl a2, a2 # .. e1 :
negl a1, dividend # e0 :
negl a2, divisor # .. e1 :
cmovge a1, a1, dividend # e0 :
cmovge a2, a2, divisor # .. e1 :
beq a2, $divbyzero # e1 :
unop # :
/* shift divisor left, using 3-bit shifts for 32-bit divides as we
can't overflow. Three-bit shifts will result in looping three
times less here, but can result in two loops more later. Thus
using a large shift isn't worth it (and s8addq pairs better than
a shift). */
1: cmpult divisor, modulus, compare # e0 :
s8addq divisor, zero, divisor # .. e1 :
s8addq mask, zero, mask # e0 :
bne compare, 1b # .. e1 :
/* start to go right again. */
2: addq quotient, mask, tmp2 # e1 :
srl mask, 1, mask # .. e0 :
cmpule divisor, modulus, compare # e0 :
subq modulus, divisor, tmp1 # .. e1 :
cmovne compare, tmp2, quotient # e1 :
srl divisor, 1, divisor # .. e0 :
cmovne compare, tmp1, modulus # e0 :
bne mask, 2b # .. e1 :
/* find correct sign for result. */
xor a1, a2, compare # e0 :
negl quotient, tmp1 # .. e1 :
negl modulus, tmp2 # e0 :
cmovlt compare, tmp1, quotient # .. e1 :
cmovlt a1, tmp2, modulus # e1 :
/* and store it away in the structure. */
stl quotient, 0(a0) # .. e0 :
mov a0, v0 # e1 :
stl modulus, 4(a0) # .. e0 :
ret # e1 :
$divbyzero:
mov a0, v0
ldiq a0, GEN_INTDIV
call_pal PAL_gentrap
/* if trap returns, return zero. */
stl zero, 0(v0)
stl zero, 4(v0)
ret
.end div

View File

@ -1,6 +1,6 @@
#define IS_REM 0
#define SIZE 4
#define SIGNED 1
#define FUNC_NAME __divl
#define UFUNC_NAME __divlu
#define SFUNC_NAME __divl
#include "divrem.h"

View File

@ -1,6 +0,0 @@
#define IS_REM 0
#define SIZE 4
#define SIGNED 0
#define FUNC_NAME __divlu
#include "divrem.h"

View File

@ -1,6 +1,6 @@
#define IS_REM 0
#define SIZE 8
#define SIGNED 1
#define FUNC_NAME __divq
#define UFUNC_NAME __divqu
#define SFUNC_NAME __divq
#include "divrem.h"

View File

@ -1,6 +0,0 @@
#define IS_REM 0
#define SIZE 8
#define SIGNED 0
#define FUNC_NAME __divqu
#include "divrem.h"

View File

@ -41,77 +41,144 @@ return the result in t12 (aka pv). Register AT may be clobbered
# include <machine/pal.h>
#endif
#ifdef DEBUG
# define arg1 a0
# define arg2 a1
# define result v0
# define mask t0
# define tmp0 t1
#define mask v0
#define divisor t0
#define compare AT
#define tmp1 t2
# define sign t3
# define retaddr ra
#else
#define tmp2 t3
#define retaddr t9
#define arg1 t10
#define arg2 t11
#define result t12
# define mask v0
# define tmp0 t0
# define tmp1 t1
# define sign t2
# define retaddr t9
#endif
# define divisor arg2
#if IS_REM
# define dividend result
# define quotient arg1
# define GETDIVIDEND bis arg1,zero,dividend
# define DIV_ONLY(x,y...)
# define REM_ONLY(x,y...) x,##y
# define modulus result
# define quotient t1
# define GETSIGN(x) mov arg1, x
# define STACK 32
#else
# define dividend arg1
# define DIV_ONLY(x,y...) x,##y
# define REM_ONLY(x,y...)
# define modulus t1
# define quotient result
# define GETDIVIDEND
# define GETSIGN(x) xor arg1, arg2, x
# define STACK 48
#endif
#if SIZE == 8
# define LONGIFYarg1 GETDIVIDEND
# define LONGIFYarg2
# define LONGIFY(x,y) mov x,y
# define SLONGIFY(x,y) mov x,y
# define _SLONGIFY(x)
# define NEG(x,y) negq x,y
#else
# if SIGNED
# define LONGIFYarg1 addl arg1,zero,dividend
# define LONGIFYarg2 addl arg2,zero,divisor
# else
# define LONGIFYarg1 zapnot arg1,0x0f,dividend
# define LONGIFYarg2 zapnot arg2,0x0f,divisor
# endif
#endif
#if SIGNED
# define SETSIGN(sign,reg,tmp) subq zero,reg,tmp; cmovlt sign,tmp,reg
# if IS_REM
# define GETSIGN(x,y,s) bis x,zero,s
# else
# define GETSIGN(x,y,s) xor x,y,s
# endif
#else
# define SETSIGN(sign,reg,tmp)
# define GETSIGN(x,y,s)
# define LONGIFY(x,y) zapnot x,15,y
# define SLONGIFY(x,y) sextl x,y
# define _SLONGIFY(x) sextl x,x
# define NEG(x,y) negl x,y
#endif
.set noreorder
.set noat
.ent FUNC_NAME
.globl FUNC_NAME
.ent UFUNC_NAME
.globl UFUNC_NAME
#define FRAME_SIZE 0x30
.align 5
FUNC_NAME:
.align 3
UFUNC_NAME:
lda sp, -STACK(sp)
.frame sp, STACK, retaddr, 0
#ifdef PROF
lda sp, -0x18(sp)
stq ra, 0x00(sp)
stq pv, 0x08(sp)
stq gp, 0x10(sp)
stq ra, 0(sp)
stq pv, 8(sp)
stq gp, 16(sp)
br AT, 1f
1: ldgp gp, 0(AT)
mov retaddr, ra
lda AT, _mcount
jsr AT, (AT), _mcount
ldq ra, 0(sp)
ldq pv, 8(sp)
ldq gp, 16(sp)
#endif
.prologue 0
$udiv:
stq t0, 0(sp)
LONGIFY (arg2, divisor)
stq t1, 8(sp)
LONGIFY (arg1, modulus)
stq v0, 16(sp)
clr quotient
stq tmp1, 24(sp)
ldiq mask, 1
DIV_ONLY(stq tmp2,32(sp))
beq divisor, $divbyzero
.align 3
#if SIZE == 8
/* Shift divisor left. */
1: cmpult divisor, modulus, compare
blt divisor, 2f
addq divisor, divisor, divisor
addq mask, mask, mask
bne compare, 1b
unop
2:
#else
/* Shift divisor left using 3-bit shifts as we can't overflow.
This results in looping three times less here, but up to
two more times later. Thus using a large shift isn't worth it. */
1: cmpult divisor, modulus, compare
s8addq divisor, zero, divisor
s8addq mask, zero, mask
bne compare, 1b
#endif
/* Now go back to the right. */
3: DIV_ONLY(addq quotient, mask, tmp2)
srl mask, 1, mask
cmpule divisor, modulus, compare
subq modulus, divisor, tmp1
DIV_ONLY(cmovne compare, tmp2, quotient)
srl divisor, 1, divisor
cmovne compare, tmp1, modulus
bne mask, 3b
$done: ldq t0, 0(sp)
ldq t1, 8(sp)
ldq v0, 16(sp)
ldq tmp1, 24(sp)
DIV_ONLY(ldq tmp2, 32(sp))
lda sp, STACK(sp)
ret zero, (retaddr), 1
$divbyzero:
mov a0, tmp1
ldiq a0, GEN_INTDIV
call_pal PAL_gentrap
mov tmp1, a0
clr result /* If trap returns, return zero. */
br $done
.end UFUNC_NAME
.ent SFUNC_NAME
.globl SFUNC_NAME
.align 3
SFUNC_NAME:
lda sp, -STACK(sp)
.frame sp, STACK, retaddr, 0
#ifdef PROF
stq ra, 0(sp)
stq pv, 8(sp)
stq gp, 16(sp)
br AT, 1f
1: ldgp gp, 0(AT)
@ -119,69 +186,40 @@ FUNC_NAME:
mov retaddr, ra
jsr AT, _mcount
ldq ra, 0x00(sp)
ldq pv, 0x08(sp)
ldq gp, 0x10(sp)
lda sp, 0x18(sp)
ldq ra, 0(sp)
ldq pv, 8(sp)
ldq gp, 16(sp)
#endif
.frame sp, FRAME_SIZE, retaddr, 0
lda sp,-FRAME_SIZE(sp)
.prologue 1
stq arg1,0x00(sp)
LONGIFYarg1
stq arg2,0x08(sp)
LONGIFYarg2
stq mask,0x10(sp)
bis zero,1,mask
stq tmp0,0x18(sp)
bis zero,zero,quotient
stq tmp1,0x20(sp)
beq divisor,$divbyzero
stq sign,0x28(sp)
GETSIGN(dividend,divisor,sign)
#if SIGNED
subq zero,dividend,tmp0
subq zero,divisor,tmp1
cmovlt dividend,tmp0,dividend
cmovlt divisor,tmp1,divisor
#endif
/*
* Shift divisor left until either bit 63 is set or until it
* is at least as big as the dividend:
*/
.align 3
1: cmpule dividend,divisor,AT
blt divisor,2f
blbs AT,2f
addq mask,mask,mask
addq divisor,divisor,divisor
br 1b
.prologue 0
.align 3
2: addq mask,quotient,tmp0
cmpule divisor,dividend,AT
subq dividend,divisor,tmp1
srl divisor,1,divisor
srl mask,1,mask
cmovlbs AT,tmp0,quotient
cmovlbs AT,tmp1,dividend
bne mask,2b
or arg1, arg2, AT
_SLONGIFY(AT)
bge AT, $udiv /* don't need to mess with signs */
ldq arg1,0x00(sp)
SETSIGN(sign,result,tmp0)
$done: ldq arg2,0x08(sp)
ldq mask,0x10(sp)
ldq tmp0,0x18(sp)
ldq tmp1,0x20(sp)
ldq sign,0x28(sp)
lda sp,FRAME_SIZE(sp)
ret zero,(retaddr),0
/* Save originals and find absolute values. */
stq arg1, 0(sp)
NEG (arg1, AT)
stq arg2, 8(sp)
cmovge AT, AT, arg1
stq retaddr, 16(sp)
NEG (arg2, AT)
stq tmp1, 24(sp)
cmovge AT, AT, arg2
$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
/* Do the unsigned division. */
bsr retaddr, UFUNC_NAME
END(FUNC_NAME)
/* Restore originals and adjust the sign of the result. */
ldq arg1, 0(sp)
ldq arg2, 8(sp)
GETSIGN (AT)
NEG (result, tmp1)
_SLONGIFY(AT)
ldq retaddr, 16(sp)
cmovlt AT, tmp1, result
ldq tmp1, 24(sp)
lda sp, STACK(sp)
ret zero, (retaddr), 1
.end SFUNC_NAME

View File

@ -27,7 +27,14 @@ architecture. */
.set noat
ENTRY(ffs)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
ldq_u zero, 0(sp) # on the 21064, this helps dual-issuing
addl a0, zero, a0 # the last insn and reduces the stall

View File

@ -19,7 +19,15 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
ENTRY(__htonl)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
extlh a0, 5, t1 # t1 = dd000000
zap a0, 0xfd, t2 # t2 = 0000cc00
sll t2, 5, t2 # t2 = 00198000

View File

@ -19,7 +19,15 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
ENTRY(__htons)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
extwh a0, 7, t1 # t1 = bb00
extbl a0, 1, v0 # v0 = 00aa
bis v0, t1, v0 # v0 = bbaa

109
sysdeps/alpha/ldiv.S Normal file
View File

@ -0,0 +1,109 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
#ifdef __linux__
# include <asm/gentrap.h>
# include <asm/pal.h>
#else
# include <machine/pal.h>
#endif
.set noat
.align 4
.globl ldiv
.ent ldiv
ldiv:
.frame sp, 0, ra
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
#define dividend t0
#define divisor t1
#define mask t2
#define quotient t3
#define modulus t4
#define tmp1 t5
#define tmp2 t6
#define compare t7
/* find correct sign for input to unsigned divide loop. */
mov a1, dividend # e0 :
mov a2, divisor # .. e1 :
negq a1, tmp1 # e0 :
negq a2, tmp2 # .. e1 :
cmovlt a1, tmp1, dividend # e0 :
cmovlt a2, tmp2, divisor # .. e1 :
beq a2, $divbyzero # e1 :
unop # :
/* shift divisor left. */
1: cmpult divisor, modulus, compare # e0 :
blt divisor, 2f # .. e1 :
addq divisor, divisor, divisor # e0 :
addq mask, mask, mask # .. e1 :
bne compare, 1b # e1 :
unop # :
/* start to go right again. */
2: addq quotient, mask, tmp2 # e1 :
srl mask, 1, mask # .. e0 :
cmpule divisor, modulus, compare # e0 :
subq modulus, divisor, tmp1 # .. e1 :
cmovne compare, tmp2, quotient # e1 :
srl divisor, 1, divisor # .. e0 :
cmovne compare, tmp1, modulus # e0 :
bne mask, 2b # .. e1 :
/* find correct sign for result. */
xor a1, a2, compare # e0 :
negq quotient, tmp1 # .. e1 :
negq modulus, tmp2 # e0 :
cmovlt compare, tmp1, quotient # .. e1 :
cmovlt a1, tmp2, modulus # e1 :
/* and store it away in the structure. */
9: stq quotient, 0(a0) # .. e0 :
mov a0, v0 # e1 :
stq modulus, 8(a0) # .. e0 :
ret # e1 :
$divbyzero:
mov a0, v0
lda a0, GEN_INTDIV
call_pal PAL_gentrap
/* if trap returns, return zero. */
stq zero, 0(v0)
stq zero, 8(v0)
ret
.end ldiv
weak_alias(ldiv, lldiv)

1
sysdeps/alpha/lldiv.S Normal file
View File

@ -0,0 +1 @@
/* lldiv is the same as ldiv on the Alpha. */

View File

@ -40,7 +40,14 @@ For correctness consider that:
.set noat
ENTRY(memchr)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
beq a2, $not_found
ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)

276
sysdeps/alpha/memcpy.S Normal file
View File

@ -0,0 +1,276 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* This is the child of the C-with-inline-assembly memcpy posted by
Martin Ostermann (ost@comnets.rwth-aachen.de).
This is generally scheduled for the EV5, but whenever necessary and
possible, the autoswap slotting feature of the EV5 is used so that the
code lays out nicely for the EV4 as well. */
#include <alpha/regdef.h>
.set noreorder
.text
.ent copy_fwd_aligned
copy_fwd_aligned:
.frame sp, 0, ra, 0
.prologue 0
/* Aligned forward copy main loop. On entry to this basic block:
t0 == source word waiting to be stored
t2 == loop counter
a0 == destination pointer
a1 == source pointer
a2 mod 8 == byte count in final word */
.align 4
$fa_loop:
and t2, 7, t1 # e0 :
beq t1, 1f # .. e1 :
0: stq_u t0, 0(a0) # e0 :
subq t1, 1, t1 # .. e1 :
ldq_u t0, 8(a1) # e0 : copy up to seven words
addq a0, 8, a0 # .. e1 :
addq a1, 8, a1 # e0 :
bne t1, 0b # .. e1 :
1: bic t2, 7, t2 # e0 :
beq t2, $fa_tail # .. e1 :
2: stq_u t0, 0(a0) # e0 :
addq a0, 64, a0 # .. e1 :
ldq_u t3, 8(a1) # e0 : copy eight words as fast as we can
ldq_u t4, 16(a1) # .. e1 :
ldq_u t5, 24(a1) # e0 :
ldq_u t6, 32(a1) # .. e1 :
ldq_u t7, 40(a1) # e0 :
ldq_u t8, 48(a1) # .. e1 :
ldq_u t9, 56(a1) # e0 :
ldq_u t0, 64(a1) # .. e1 :
stq_u t3, -56(a0) # e0 :
subq t2, 8, t2 # .. e1 :
stq_u t4, -48(a0) # e0 :
addq a1, 64, a1 # .. e1 :
stq_u t5, -40(a0) # e0 :
stq_u t6, -32(a0) # e0 :
stq_u t7, -24(a0) # e0 :
stq_u t8, -16(a0) # e0 :
stq_u t9, -8(a0) # e0 :
bne t2, 2b # .. e1 :
/* Take care of a partial word tail. */
$fa_tail:
and a2, 7, t3 # e0 :
bne t3, 1f # .. e1 (zdb)
/* Aligned copy, aligned tail, final store. */
stq_u t0, 0(a0)
ret
1: ldq_u t1, 0(a0) # e1 :
mskql t0, a2, t0 # .. e1 :
mskqh t1, a2, t1 # e0 (stall)
bis t0, t1, t0 # e1 :
stq_u t0, 0(a0) # e0 :
ret # .. e1 :
/* This is the actual entry point to this function. */
.align 3
$fwd_aligned:
ldq_u t0, 0(a1) # e0 :
and a0, 7, t3 # .. e1 :
addq a2, t3, a2 # e0 :
subq a2, 1, t2 # e1 :
sra t2, 3, t2 # e0 :
beq t3, $fa_loop # .. e1 :
ldq_u t1, 0(a0) # e0 :
beq t2, $fa_small # .. e1 :
mskqh t0, a0, t0 # e0 :
mskql t1, a0, t3 # e0 :
bis t0, t3, t0 # e0 :
br $fa_loop # .. e1 :
/* The move affects exactly one destination word. */
$fa_small:
mskqh t0, a0, t0 # e0 :
and a2, 7, t4 # .. e1 :
mskql t1, a0, t3 # e0 :
bne t4, 1f # .. e1 :
or t0, t3, t0 # e0 :
unop # :
stq_u t0, 0(a0) # e0 :
ret # .. e1 :
1: mskql t0, a2, t0 # e0 :
mskqh t1, a2, t1 # e0 :
or t0, t3, t0 # e0 :
or t0, t1, t0 # e1 :
stq_u t0, 0(a0) # e0 :
ret # .. e1 :
.end copy_fwd_aligned
.ent memcpy
.globl memcpy
.align 3
memcpy:
.frame sp, 0, ra, 0
#ifdef PROF
ldgp gp, 0(ra)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
mov a0, v0
beq a2, $zero_length
/* Are source and destination co-aligned? */
xor a0, a1, t0
unop
and t0, 7, t0
beq t0, $fwd_aligned
br $fwd_unaligned
.end memcpy
.ent copy_fwd_unaligned
copy_fwd_unaligned:
.frame sp, 0, ra, 0
.prologue 0
/* Unaligned forward copy main loop. On entry to this basic block:
t0 == source low word, unshifted
t2 == loop counter
t7 == last source byte + 1
a0 == destination pointer
a1 == source pointer
a2 mod 8 == byte count in final word */
.align 4
$fu_loop:
beq t2, $fu_tail # e1 :
blbc t2, 0f # e1 :
ldq_u t1, 8(a1) # e1 : copy one unaligned word
extql t0, a1, t3 # .. e0 :
addq a1, 8, a1 # e0 :
addq a0, 8, a0 # .. e1 :
extqh t1, a1, t4 # e0 :
subq t2, 1, t2 # .. e1 :
mov t1, t0 # e0 :
or t3, t4, t3 # .. e1 :
stq_u t3, -8(a0) # e0 :
beq t2, $fu_tail # .. e1 :
0: ldq_u t1, 8(a1) # e1 : copy two unaligned words
extql t0, a1, t3 # .. e0 :
ldq_u t0, 16(a1) # e0 :
subq t2, 2, t2 # .. e1 :
extqh t1, a1, t4 # e0 :
addq a0, 16, a0 # .. e1 :
extql t1, a1, t5 # e0 :
or t3, t4, t3 # .. e1 :
extqh t0, a1, t6 # e0 :
addq a1, 16, a1 # .. e1 :
stq_u t3, -16(a0) # e0 :
or t5, t6, t5 # .. e1 :
stq_u t5, -8(a0) # e0 :
bne t2, 0b # .. e1 :
/* Take care of a partial words tail. */
$fu_tail:
ldq_u t4, -1(t7) # e1 :
extql t0, a1, t3 # .. e0 :
extqh t4, a1, t4 # e0 (stall)
and a2, 7, t5 # .. e1 :
or t3, t4, t3 # e0 :
beq t5, 1f # .. e1 :
ldq_u t1, 0(a0) # e1 :
mskql t3, a2, t3 # .. e0 :
mskqh t1, a2, t1 # e0 (stall)
or t1, t3, t3 # e1 :
1: stq_u t3, 0(a0) # e0 :
ret # .. e1 :
/* The entry point to the unaligned forward copy. */
.align 3
$fwd_unaligned:
ldq_u t0, 0(a1) # e0 : load initial bits of src
addq a1, a2, t7 # .. e1 : record last byte + 1 of src
and a0, 7, t3 # e0 : find dst misalignment
addq a2, t3, a2 # e1 : find number of words affected
subq a2, 1, t2 # e0 :
cmple a2, 8, t4 # .. e1 : are we dealing with a small block?
subq a1, t3, a1 # e0 :
bne t4, $fu_small # .. e1 :
srl t2, 3, t2 # e0 :
beq t3, $fu_loop # .. e1 :
/* Take care of an unaligned dst head. */
ldq_u t5, 0(a0) # e0 :
ldq_u t1, 8(a1) # .. e1 :
extql t0, a1, t3 # e0 :
addq a0, 8, a0 # .. e1 :
extqh t1, a1, t4 # e0 :
addq a1, 8, a1 # .. e1 :
mskql t5, a0, t5 # e0 :
or t3, t4, t3 # .. e1 :
mskqh t3, a0, t3 # e0 :
subq t2, 1, t2 # .. e1 :
or t3, t5, t3 # e0 :
mov t1, t0 # .. e1 :
stq_u t3, -8(a0) # e0 :
br $fu_loop # .. e1 :
/* The move affects exactly one destination word. */
.align 3
$fu_small:
ldq_u t2, 0(a0) # e1 :
extql t0, a1, t3 # .. e0 :
ldq_u t1, -1(t7) # e0 :
and a2, 7, t8 # .. e1 :
mskqh t2, a2, t6 # e0 :
mskql t2, a0, t5 # e0 :
extqh t1, a1, t4 # e0 :
cmovne t8, t6, t8 # .. e1 :
or t3, t4, t3 # e0 :
or t5, t8, t5 # .. e1 :
mskqh t3, a0, t3 # e0 :
and a2, 7, t8 # .. e1 :
mskql t3, a2, t6 # e0 :
cmovne t8, t6, t8 # e1 :
or t3, t5, t3 # e0 :
unop # :
stq_u t3, 0(a0) # e0 :
$zero_length:
ret # .. e1 :
.end copy_fwd_unaligned

View File

@ -85,7 +85,14 @@ $tail: bne t4, 1f # is there a tail to do?
.end memset_loop
ENTRY(memset)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
zapnot a1, 1, a1 # e0 : zero extend input character
mov a0, v0 # .. e1 : move return value in place

View File

@ -1,6 +1,6 @@
#define IS_REM 1
#define SIZE 4
#define SIGNED 1
#define FUNC_NAME __reml
#define UFUNC_NAME __remlu
#define SFUNC_NAME __reml
#include "divrem.h"

View File

@ -1,6 +0,0 @@
#define IS_REM 1
#define SIZE 4
#define SIGNED 0
#define FUNC_NAME __remlu
#include "divrem.h"

View File

@ -1,6 +1,6 @@
#define IS_REM 1
#define SIZE 8
#define SIGNED 1
#define FUNC_NAME __remq
#define UFUNC_NAME __remqu
#define SFUNC_NAME __remq
#include "divrem.h"

View File

@ -1,6 +0,0 @@
#define IS_REM 1
#define SIZE 8
#define SIGNED 0
#define FUNC_NAME __remqu
#include "divrem.h"

View File

@ -20,7 +20,15 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
ENTRY(__copysign)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
cpys $f17,$f16,$f0
ret

View File

@ -20,7 +20,15 @@ Cambridge, MA 02139, USA. */
#include <sysdep.h>
ENTRY(__fabs)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
cpys $f31,$f16,$f0
ret

View File

@ -23,6 +23,10 @@ Cambridge, MA 02139, USA. */
extra arguments. */
ENTRY (__sigsetjmp)
ldgp $29, 0($27)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
bis $30, $30, $18 /* Pass SP as 3rd arg. */

View File

@ -27,6 +27,10 @@ Cambridge, MA 02139, USA. */
ENTRY(__stpcpy)
ldgp gp, 0(pv)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
jsr t9, __stxcpy # do the work of the copy

View File

@ -1,7 +1,6 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
This file is part of the GNU C Library.
Contributed by Richard Henderson (rth@tamu.edu)
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
@ -14,9 +13,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/* Copy no more than COUNT bytes of the null-terminated string from
SRC to DST. If SRC does not cover all of COUNT, the balance is
@ -32,6 +31,10 @@ Cambridge, MA 02139, USA. */
ENTRY(__stpncpy)
ldgp gp, 0(pv)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
beq a2, $zerocount

View File

@ -1,7 +1,6 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
This file is part of the GNU C Library.
Contributed by Richard Henderson (rth@tamu.edu)
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
@ -14,9 +13,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/* Append a null-terminated string from SRC to DST. */
@ -26,6 +25,10 @@ Cambridge, MA 02139, USA. */
ENTRY(strcat)
ldgp gp, 0(pv)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
mov a0, v0 # set up return value

View File

@ -1,7 +1,6 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
This file is part of the GNU C Library.
Contributed by Richard Henderson (rth@tamu.edu)
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
@ -14,9 +13,9 @@ 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
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. */
/* Return the address of a given character within a null-terminated
string, or null if it is not found.
@ -32,7 +31,14 @@ Cambridge, MA 02139, USA. */
.set noat
ENTRY(strchr)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
zapnot a1, 1, a1 # e0 : zero extend the search character
ldq_u t0, 0(a0) # .. e1 : load first quadword

195
sysdeps/alpha/strcmp.S Normal file
View File

@ -0,0 +1,195 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* Bytewise compare two null-terminated strings. */
#include <sysdep.h>
.set noat
.set noreorder
.text
ENTRY(strcmp)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jmp AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
ldq_u t0, 0(a0) # e0 : give cache time to catch up
xor a0, a1, t2 # .. e1 : are s1 and s2 co-aligned?
ldq_u t1, 0(a1) # e0 :
and t2, 7, t2 # .. e1 :
lda t3, -1 # e0 :
bne t2, $unaligned # .. e1 :
/* On entry to this basic block:
t0 == the first destination word for masking back in
t1 == the first source word.
t3 == -1. */
$aligned:
mskqh t3, a0, t3 # e0 :
nop # .. e1 :
ornot t1, t3, t1 # e0 :
ornot t0, t3, t0 # .. e1 :
cmpbge zero, t1, t7 # e0 : bits set iff null found
bne t7, $eos # e1 (zdb)
/* Aligned compare main loop.
On entry to this basic block:
t0 == an s1 word.
t1 == an s2 word not containing a null. */
$a_loop:
xor t0, t1, t2 # e0 :
bne t2, $wordcmp # .. e1 (zdb)
ldq_u t1, 8(a1) # e0 :
ldq_u t0, 8(a0) # .. e1 :
addq a1, 8, a1 # e0 :
addq a0, 8, a0 # .. e1 :
cmpbge zero, t1, t7 # e0 :
beq t7, $a_loop # .. e1 (zdb)
br $eos # e1 :
/* The two strings are not co-aligned. Align s1 and cope. */
$unaligned:
and a0, 7, t4 # e0 : find s1 misalignment
and a1, 7, t5 # .. e1 : find s2 misalignment
subq a1, t4, a1 # e0 :
/* If s2 misalignment is larger than s2 misalignment, we need
extra startup checks to avoid SEGV. */
cmplt t4, t5, t8 # .. e1 :
beq t8, $u_head # e1 :
mskqh t3, t5, t3 # e0 :
ornot t1, t3, t3 # e0 :
cmpbge zero, t3, t7 # e1 : is there a zero?
beq t7, $u_head # e1 :
/* We've found a zero in the first partial word of s2. Align
our current s1 and s2 words and compare what we've got. */
extql t1, t5, t1 # e0 :
extql t0, a0, t0 # e0 :
cmpbge zero, t1, t7 # .. e1 : find that zero again
br $eos # e1 : and finish up
.align 3
$u_head:
/* We know just enough now to be able to assemble the first
full word of s2. We can still find a zero at the end of it.
On entry to this basic block:
t0 == first word of s1
t1 == first partial word of s2. */
ldq_u t2, 8(a1) # e0 : load second partial s2 word
lda t3, -1 # .. e1 : create leading garbage mask
extql t1, a1, t1 # e0 : create first s2 word
mskqh t3, a0, t3 # e0 :
extqh t2, a1, t4 # e0 :
ornot t0, t3, t0 # .. e1 : kill s1 garbage
or t1, t4, t1 # e0 : s2 word now complete
cmpbge zero, t0, t7 # .. e1 : find zero in first s1 word
ornot t1, t3, t1 # e0 : kill s2 garbage
lda t3, -1 # .. e1 :
mskql t3, a1, t3 # e0 : mask for s2[1] bits we have seen
bne t7, $eos # .. e1 :
xor t0, t1, t4 # e0 : compare aligned words
bne t4, $wordcmp # .. e1 (zdb)
or t2, t3, t3 # e0 :
cmpbge zero, t3, t7 # e1 :
bne t7, $u_final # e1 :
/* Unaligned copy main loop. In order to avoid reading too much,
the loop is structured to detect zeros in aligned words from s2.
This has, unfortunately, effectively pulled half of a loop
iteration out into the head and half into the tail, but it does
prevent nastiness from accumulating in the very thing we want
to run as fast as possible.
On entry to this basic block:
t2 == the unshifted low-bits from the next s2 word. */
.align 3
$u_loop:
extql t2, a1, t3 # e0 :
ldq_u t2, 16(a1) # .. e1 : load next s2 high bits
ldq_u t0, 8(a0) # e0 : load next s1 word
addq a1, 8, a1 # .. e1 :
addq a0, 8, a0 # e0 :
nop # .. e1 :
extqh t2, a1, t1 # e0 :
cmpbge zero, t0, t7 # .. e1 : find zero in current s1 word
or t1, t3, t1 # e0 :
bne t7, $eos # .. e1 :
xor t0, t1, t4 # e0 : compare the words
bne t4, $wordcmp # .. e1 (zdb)
cmpbge zero, t2, t4 # e0 : find zero in next low bits
beq t4, $u_loop # .. e1 (zdb)
/* We've found a zero in the low bits of the last s2 word. Get
the next s1 word and align them. */
$u_final:
ldq_u t0, 8(a0) # e1 :
extql t2, a1, t1 # .. e0 :
cmpbge zero, t1, t7 # e0 :
/* We've found a zero somewhere in a word we just read.
On entry to this basic block:
t0 == s1 word
t1 == s2 word
t7 == cmpbge mask containing the zero. */
.align 3
$eos:
negq t7, t6 # e0 : create bytemask of valid data
and t6, t7, t8 # e1 :
subq t8, 1, t6 # e0 :
or t6, t8, t7 # e1 :
zapnot t0, t7, t0 # e0 : kill the garbage
zapnot t1, t7, t1 # .. e1 :
xor t0, t1, v0 # e0 : and compare
beq v0, $done # .. e1 :
/* Here we have two differing co-aligned words in t0 & t1.
Bytewise compare them and return (t0 > t1 ? 1 : -1). */
$wordcmp:
cmpbge t0, t1, t2 # e0 : comparison yields bit mask of ge
cmpbge t1, t0, t3 # .. e1 :
xor t2, t3, t0 # e0 : bits set iff t0/t1 bytes differ
negq t0, t1 # e1 : clear all but least bit
and t0, t1, t0 # e0 :
lda v0, -1 # .. e1 :
and t0, t2, t1 # e0 : was bit set in t0 > t1?
cmovne t1, 1, v0 # .. e1 (zdb)
$done:
ret # e1 :
END(strcmp)

View File

@ -27,6 +27,10 @@ Cambridge, MA 02139, USA. */
ENTRY(strcpy)
ldgp gp, 0(pv)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
mov a0, v0 # set up return value

View File

@ -34,6 +34,15 @@ Cambridge, MA 02139, USA. */
.set noat
ENTRY(strlen)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
ldq_u t0, 0(a0) # load first quadword (a0 may be misaligned)
lda t1, -1(zero)
insqh t1, a0, t1

View File

@ -27,6 +27,10 @@ Cambridge, MA 02139, USA. */
ENTRY(strncat)
ldgp gp, 0(pv)
#ifdef PROF
lda AT, _mcount
jsr AT, (AT), _mcount
#endif
.prologue 1
mov a0, v0 # set up return value

224
sysdeps/alpha/strncmp.S Normal file
View File

@ -0,0 +1,224 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu)
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* Bytewise compare two null-terminated strings of length no longer than N. */
#include <sysdep.h>
.set noat
.set noreorder
.text
ENTRY(strncmp)
#ifdef PROF
ldgp gp, 0(pv)
lda AT, _mcount
jsr AT, (AT), _mcount
.prologue 1
#else
.prologue 0
#endif
xor a0, a1, t2 # e0 : are s1 and s2 co-aligned?
beq a2, $zerolength # .. e1 :
ldq_u t0, 0(a0) # e0 : give cache time to catch up
ldq_u t1, 0(a1) # .. e1 :
and t2, 7, t2 # e0 :
and a0, 7, t4 # .. e1 : find s1 misalignment
lda t3, -1 # e0 :
addq a2, t4, a2 # .. e1 : bias count by s1 misalignment
and a2, 7, t10 # e1 : ofs of last byte in last word
srl a2, 3, a2 # .. e0 : remaining full words in count
and a1, 7, t5 # e0 : find s2 misalignment
bne t2, $unaligned # .. e1 :
/* On entry to this basic block:
t0 == the first word of s1.
t1 == the first word of s2.
t3 == -1. */
$aligned:
mskqh t3, a1, t3 # e0 : mask off leading garbage
nop # .. e1 :
ornot t1, t3, t1 # e0 :
ornot t0, t3, t0 # .. e1 :
cmpbge zero, t1, t7 # e0 : bits set iff null found
beq a2, $eoc # .. e1 : check end of count
unop # :
bne t7, $eos # e1 :
/* Aligned compare main loop.
On entry to this basic block:
t0 == an s1 word.
t1 == an s2 word not containing a null. */
$a_loop:
xor t0, t1, t2 # e0 :
bne t2, $wordcmp # .. e1 (zdb)
ldq_u t1, 0(a1) # e0 :
ldq_u t0, 0(a0) # .. e1 :
addq a1, 8, a1 # e0 :
addq a0, 8, a0 # .. e1 :
cmpbge zero, t1, t7 # e0 :
beq a2, $eoc # .. e1 :
subq a2, 1, a2 # e0 :
beq t7, $a_loop # .. e1 :
br $eos # e1 :
/* The two strings are not co-aligned. Align s1 and cope. */
$unaligned:
subq a1, t4, a1 # e0 :
unop # :
/* If s2 misalignment is larger than s2 misalignment, we need
extra startup checks to avoid SEGV. */
cmplt t4, t5, t8 # .. e1 :
beq t8, $u_head # e1 :
mskqh t3, t5, t3 # e0 :
ornot t1, t3, t3 # e0 :
cmpbge zero, t3, t7 # e1 : is there a zero?
beq t7, $u_head # e1 :
/* We've found a zero in the first partial word of s2. Align
our current s1 and s2 words and compare what we've got. */
extql t1, t5, t1 # e0 :
lda t3, -1 # .. e1 :
insql t1, a0, t1 # e0 :
mskqh t3, a0, t3 # e0 :
ornot t1, t3, t1 # e0 :
ornot t0, t3, t0 # .. e1 :
cmpbge zero, t1, t7 # e0 : find that zero again
beq a2, $eoc # .. e1 : and finish up
br $eos # e1 :
.align 3
$u_head:
/* We know just enough now to be able to assemble the first
full word of s2. We can still find a zero at the end of it.
On entry to this basic block:
t0 == first word of s1
t1 == first partial word of s2. */
ldq_u t2, 8(a1) # e0 : load second partial s2 word
lda t3, -1 # .. e1 : create leading garbage mask
extql t1, a1, t1 # e0 : create first s2 word
mskqh t3, a0, t3 # e0 :
extqh t2, a1, t4 # e0 :
ornot t0, t3, t0 # .. e1 : kill s1 garbage
or t1, t4, t1 # e0 : s2 word now complete
ornot t1, t3, t1 # e1 : kill s2 garbage
cmpbge zero, t0, t7 # e0 : find zero in first s1 word
beq a2, $eoc # .. e1 :
lda t3, -1 # e0 :
bne t7, $eos # .. e1 :
subq a2, 1, a2 # e0 :
xor t0, t1, t4 # .. e1 : compare aligned words
mskql t3, a1, t3 # e0 : mask out s2[1] bits we have seen
bne t4, $wordcmp # .. e1 :
or t2, t3, t3 # e0 :
cmpbge zero, t3, t7 # e1 : find zero in high bits of s2[1]
bne t7, $u_final # e1 :
/* Unaligned copy main loop. In order to avoid reading too much,
the loop is structured to detect zeros in aligned words from s2.
This has, unfortunately, effectively pulled half of a loop
iteration out into the head and half into the tail, but it does
prevent nastiness from accumulating in the very thing we want
to run as fast as possible.
On entry to this basic block:
t2 == the unshifted low-bits from the next s2 word. */
.align 3
$u_loop:
extql t2, a1, t3 # e0 :
ldq_u t2, 16(a1) # .. e1 : load next s2 high bits
ldq_u t0, 8(a0) # e0 : load next s1 word
addq a1, 8, a1 # .. e1 :
addq a0, 8, a0 # e0 :
nop # .. e1 :
extqh t2, a1, t1 # e0 :
cmpbge zero, t0, t7 # .. e1 : find zero in current s1 word
or t1, t3, t1 # e0 :
beq a2, $eoc # .. e1 : check for end of count
subq a2, 1, a2 # e0 :
bne t7, $eos # .. e1 :
xor t0, t1, t4 # e0 : compare the words
bne t4, $wordcmp # .. e1 (zdb)
cmpbge zero, t2, t4 # e0 : find zero in next low bits
beq t4, $u_loop # .. e1 (zdb)
/* We've found a zero in the low bits of the last s2 word. Get
the next s1 word and align them. */
$u_final:
ldq_u t0, 8(a0) # e1 :
extql t2, a1, t1 # .. e0 :
cmpbge zero, t1, t7 # e0 :
bne a2, $eos # .. e1 :
/* We've hit end of count. Zero everything after the count
and compare whats left. */
.align 3
$eoc:
mskql t0, t10, t0
mskql t1, t10, t1
/* We've found a zero somewhere in a word we just read.
On entry to this basic block:
t0 == s1 word
t1 == s2 word
t7 == cmpbge mask containing the zero. */
$eos:
negq t7, t6 # e0 : create bytemask of valid data
and t6, t7, t8 # e1 :
subq t8, 1, t6 # e0 :
or t6, t8, t7 # e1 :
zapnot t0, t7, t0 # e0 : kill the garbage
zapnot t1, t7, t1 # .. e1 :
xor t0, t1, v0 # e0 : and compare
beq v0, $done # .. e1 :
/* Here we have two differing co-aligned words in t0 & t1.
Bytewise compare them and return (t0 > t1 ? 1 : -1). */
$wordcmp:
cmpbge t0, t1, t2 # e0 : comparison yields bit mask of ge
cmpbge t1, t0, t3 # .. e1 :
xor t2, t3, t0 # e0 : bits set iff t0/t1 bytes differ
negq t0, t1 # e1 : clear all but least bit
and t0, t1, t0 # e0 :
lda v0, -1 # .. e1 :
and t0, t2, t1 # e0 : was bit set in t0 > t1?
cmovne t1, 1, v0 # .. e1 (zdb)
$done:
ret # e1 :
$zerolength:
clr v0
ret
END(strncmp)

Some files were not shown because too many files have changed in this diff Show More