mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com> * gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Set to 2 since interface was changed with addition of _obstack_memory_used. Suggested by Ian Taylor <ian@cygnus.com>. * malloc/obstack.c: Include <config.h>. Include <stdlib.h> only if __GNU_LIBRARY__ or HAVE_STDLIB_H is defined. Reported by Ian Taylor <ian@cygnus.com>. * dirent/Makefile (routines): Add versionsort. * dirent/dirent.h: Add prototype for versionsort. * dirent/versionsort.c: New file. * manual/filesys.texi: Add documentation for versionsort. * manual/string.texi: Add documentation for strverscmp. * string/Makefile (routines): Add strverscmp. (tests): Add tst-svc. * string/string.h: Add prototype for strverscmp. * string/strverscmp.c: New file. * string/tst-svc.c: New file. Test for strverscmp. * string/tst-svc.input: New file. Input data for tst-svc. * string/tst-svc.expect: New file. Expected out from tst-svc. * math/Makefile (calls): Add s_signbit. * po/sv.po: Update. * resolv/nss_dns/dns-host.c: Add casts to prevent warnings. * sunrpc/pmap_rmt.c: Likewise. * string/basename.c: Don't use ISO C definition style. Include <config.h> is HAVE_CONFIG_H is defined. * sunrpc/proto.h: Add `const' wherever possible. * sunrpc/rpc_cout.c: Likewise. * sunrpc/rpc_svcout.c: Likewise. * sunrpc/xdr_mem.c: Likewise. * sunrpc/xdr_rec.c: Likewise. * sunrpc/xdr_stdio.c: Likewise. * sunrpc/rpc_parse.c: Delete comma from end of enum definition. * sunrpc/xdr.c: Little code cleanups. * sunrpc/xdr_flaot.c: Likewise. Patches by Matthew Wilcox <matthew.wilcox@chbs.mhs.ciba.com>. * sysdeps/i386/fpu/__math.h (__finite): Fix typo. * sysdeps/unix/sysv/linux/shmdt.c: Add cast to prevent warning. * time/europe: Update from tzdata1997f. * time/zic.c: Update from tzcode1997e. 1997-05-20 19:20 Miguel de Icaza <miguel@athena.nuclecu.unam.mx> * sysdeps/sparc/setjmp.S: Flush windows. Bug found by Richard Henderson. 1997-05-19 12:54 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * misc/efgcvt_r.c (fcvt_r, ecvt_r): Rewritten as to fit the specs. 1997-05-19 18:41 Thorsten Kukuk <kukuk@uni-paderborn.de> * nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent): Use atol instead of atoi. 1997-05-18 00:22 Philip Blundell <pjb27@cam.ac.uk> * inet/Makefile (routines): Add if_index. * sysdeps/unix/sysv/linux/if_index.c: New file. * sysdeps/stub/if_index.c: New file. * sysdeps/unix/sysv/linux/net/if.h: Add prototypes for routines in if_index.c (required by IPv6 basic API). * sysdeps/unix/sysv/linux/netinet/in.h: Add struct ipv6_pktinfo. 1997-05-17 23:29 Philip Blundell <pjb27@cam.ac.uk> * sysdeps/unix/sysv/linux/netinet/in.h: Update IPv6 definitions for new advanced API draft. 1997-05-13 21:33 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * stdio-common/printf_fp.c: Only use the field width for deciding on padding when printing special values. * stdio-common/printf_fphex.c: Likewise. 1997-05-15 13:14 Miles Bader <miles@gnu.ai.mit.edu> Changes by Thomas Bushnell <thomas@gnu.ai.mit.edu>: * hurd/hurdauth.c (_S_msg_add_auth): Implement correctly. 1997-05-12 14:50 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> * hurd/hurdsig.c (_hurdsig_init): Double size of sigthread stack; msg_add_auth was overflowing it. 1997-05-12 21:20 Richard Henderson <rth@tamu.edu> * elf/dl-lookup.c (_dl_lookup_symbol_skip): Call _dl_signal_error when we can't find the symbol. 1997-05-12 16:54 Ulrich Drepper <drepper@cygnus.com> * posix/regex.c: Fix handling of 32-bit Windog environments. Patch by Arnold Robbins <arnold@skeeve.atl.ga.us>. 1997-05-10 23:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/unix/sysv/linux/m68k/syscalls.list: Add cacheflush. 1997-05-10 11:40 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * elf/ldd.bash.in: Remove spurious quote character from version message. 1997-05-10 08:49 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * locale/programs/locale.c (write_charmaps): Don't get stuck in a loop if the file ends in a long line without newline. * locale/programs/charmap.c (charmap_read): Likewise. 1997-05-12 03:47 Ulrich Drepper <drepper@cygnus.com> * sunrpc/rpc/xdr.h: Include more headers to be self-contained. * sunrpc/rpc/svc_auth.h: Likewise. * sunrpc/rpc/svc.h: Likewise. * sunrpc/rpc/rpc_msg.h: Likewise. * sunrpc/rpc/pmap_rmt.h: Likewise. * sunrpc/rpc/pmap_clnt.h: Likewise. * sunrpc/rpc/clnt.h: Likewise. * sunrpc/rpc/auth_unix.h: Likewise. * sysdeps/generic/rpc/auth.h: Likewise. Patches by Michael Deutschmann <ldeutsch@mail.netshop.net>. 1997-05-11 15:29 Philip Blundell <pjb27@cam.ac.uk> * sysdeps/stub/sigaction.c (__sigaction): Correct typo. * sysdeps/standalone/arm/errnos.h: New file. * sysdeps/stub/sys/param.h: Add dummy definition of MAXSYMLINKS. * sysdeps/unix/arm/fork.S: New file. * sysdeps/unix/sysv/linux/arm/sysdep.h: New file. * sysdeps/stub/tempname.c (__stdio_gen_tempname): Add missing `streamptr' argument. * sysdeps/stub/vdprintf.c: Remove second copy of file (!), include <stdarg.h> to get va_list defined, return 0 not NULL. * sysdeps/unix/sysv/linux/statfsbuf.h: Include <gnu/types.h>. * sysdeps/unix/sysv/linux/arm/syscall.S: New file. * sysdeps/stub/direntry.h (struct dirent): Add missing ';'. * sysdeps/stub/seekdir.c (seekdir): Likewise. * sysdeps/stub/dirfd.c (dirfd): Argument dirp is DIR*, not FILE*. * sysdeps/standalone/dirstream.h: Define struct __dirstream not DIR; <dirent.h> provides typedef. * sysdeps/unix/sysv/linux/arm/clone.S: New file. * sysdeps/unix/sysv/linux/arm/socket.S: New file. * sysdeps/stub/sysconf.c (__sysconf): Fix typos. 1997-05-01 06:35 Geoff Keating <geoffk@ozemail.com.au> * sysdeps/powerpc/Dist: New file. * sysdeps/powerpc/Makefile: New file. * sysdeps/powerpc/fclrexcpt.c: New file. * sysdeps/powerpc/fegetenv.c: New file. * sysdeps/powerpc/fegetround.c: New file. * sysdeps/powerpc/feholdexcpt.c: New file. * sysdeps/powerpc/fenvbits.h: New file. * sysdeps/powerpc/fenv_const.c: New file. * sysdeps/powerpc/fenv_libc.h: New file. * sysdeps/powerpc/fesetenv.c: New file. * sysdeps/powerpc/fesetround.c: New file. * sysdeps/powerpc/feupdateenv.c: New file. * sysdeps/powerpc/fgetexcptflg.c: New file. * sysdeps/powerpc/fraiseexcpt.c: New file. * sysdeps/powerpc/fsetexcptflg.c: New file. * sysdeps/powerpc/ftestexcept.c: New file. * sysdeps/powerpc/mathbits.h: New file. * sysdeps/powerpc/dl-machine.h: Wrap in #ifndef dl_machine_h; define elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p, ELF_MACHINE_RELOC_NOPLT; consequent changes to elf_machine_rela. * sysdeps/powerpc/__math.h: Remove definition for hypot and __sgn. * sysdep/powerpc/fpu_control.h: Correct IEEE default mode. * sysdeps/unix/sysv/linux/powerpc/sysdep.h: Don't use .text, but instead .section ".text". 1997-04-25 05:06 Geoff Keating <geoffk@ozemail.com.au> * sysdeps/powerpc/__longjmp.S: Use symbolic register numbering. * sysdeps/powerpc/bsd-_setjmp.S: Likewise. * sysdeps/powerpc/bsd-setjmp.S: Likewise. * sysdeps/powerpc/setjmp.S: Likewise. * sysdeps/unix/sysv/linux/clone.S: Likewise. * sysdeps/unix/sysv/linux/socket.S: Likewise. * sysdeps/unix/sysv/linux/syscall.S: Likewise. 1997-04-20 04:37 Geoff Keating <geoffk@ozemail.com.au> * sysdeps/powerpc/strchr.s: New file. * sysdeps/powerpc/strcmp.s: New (ugly) file. * sysdeps/powerpc/memset.s: New file. * string/tester.c: Include prototype and _GNU_SOURCE to make standalone compilation possible. Give strcmp a better test. Give memset a better test. 1997-04-05 06:34 Geoff Keating <geoffk@ozemail.com.au> * sysdeps/powerpc/strlen.s: Fixed bugs (how did it ever pass its tests before?). Changed to symbolic register numbering as an experiment. * sysdeps/powerpc/ffs.c: Don't include bstring.h, it doesn't exist. * sysdeps/rs6000/ffs.c: Likewise. 1997-05-12 02:28 Ulrich Drepper <drepper@cygnus.com> * time/sys/time.h: Make second argument of setitimer const. Patch by Michael Deutschmann <ldeutsch@mail.netshop.net>. * sysdeps/stub/setitimer.c: Likewise. * sysdeps/mach/hurd/setitimer.c: Likewise.
This commit is contained in:
@ -21,3 +21,5 @@ crypt
|
|||||||
linuxthreads
|
linuxthreads
|
||||||
localedata
|
localedata
|
||||||
secure_rpc
|
secure_rpc
|
||||||
|
|
||||||
|
aio
|
||||||
|
5
BUGS
5
BUGS
@ -1,7 +1,7 @@
|
|||||||
List of known bugs (certainly very incomplete)
|
List of known bugs (certainly very incomplete)
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
Time-stamp: <1997-03-22T04:31:41+0100 drepper>
|
Time-stamp: <1997-05-12T02:39:19+0200 drepper>
|
||||||
|
|
||||||
This following list contains those bugs which I'm aware of. Please
|
This following list contains those bugs which I'm aware of. Please
|
||||||
make sure that bugs you report are not listed here. If you can fix one
|
make sure that bugs you report are not listed here. If you can fix one
|
||||||
@ -29,8 +29,7 @@ Severity: [ *] to [***]
|
|||||||
|
|
||||||
[ **] There are problems with signal handling when using LinuxThreads.
|
[ **] There are problems with signal handling when using LinuxThreads.
|
||||||
|
|
||||||
[ **] The `cbrtl' function is inaccurate. The algorithm used for `double'
|
[ **] The `cbrtl' function for ix86 does not work in the moment.
|
||||||
and `float' is not usable for `long double'.
|
|
||||||
|
|
||||||
[ **] Not really a bug, but it could lead to such:
|
[ **] Not really a bug, but it could lead to such:
|
||||||
The RPC code is ugly ugly ugly. It's more or less verbatim taken
|
The RPC code is ugly ugly ugly. It's more or less verbatim taken
|
||||||
|
222
ChangeLog
222
ChangeLog
@ -1,3 +1,225 @@
|
|||||||
|
1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Set to 2 since
|
||||||
|
interface was changed with addition of _obstack_memory_used.
|
||||||
|
Suggested by Ian Taylor <ian@cygnus.com>.
|
||||||
|
|
||||||
|
* malloc/obstack.c: Include <config.h>. Include <stdlib.h> only
|
||||||
|
if __GNU_LIBRARY__ or HAVE_STDLIB_H is defined.
|
||||||
|
Reported by Ian Taylor <ian@cygnus.com>.
|
||||||
|
|
||||||
|
* dirent/Makefile (routines): Add versionsort.
|
||||||
|
* dirent/dirent.h: Add prototype for versionsort.
|
||||||
|
* dirent/versionsort.c: New file.
|
||||||
|
* manual/filesys.texi: Add documentation for versionsort.
|
||||||
|
* manual/string.texi: Add documentation for strverscmp.
|
||||||
|
* string/Makefile (routines): Add strverscmp.
|
||||||
|
(tests): Add tst-svc.
|
||||||
|
* string/string.h: Add prototype for strverscmp.
|
||||||
|
* string/strverscmp.c: New file.
|
||||||
|
* string/tst-svc.c: New file. Test for strverscmp.
|
||||||
|
* string/tst-svc.input: New file. Input data for tst-svc.
|
||||||
|
* string/tst-svc.expect: New file. Expected out from tst-svc.
|
||||||
|
|
||||||
|
* math/Makefile (calls): Add s_signbit.
|
||||||
|
|
||||||
|
* po/sv.po: Update.
|
||||||
|
|
||||||
|
* resolv/nss_dns/dns-host.c: Add casts to prevent warnings.
|
||||||
|
* sunrpc/pmap_rmt.c: Likewise.
|
||||||
|
|
||||||
|
* string/basename.c: Don't use ISO C definition style.
|
||||||
|
Include <config.h> is HAVE_CONFIG_H is defined.
|
||||||
|
|
||||||
|
* sunrpc/proto.h: Add `const' wherever possible.
|
||||||
|
* sunrpc/rpc_cout.c: Likewise.
|
||||||
|
* sunrpc/rpc_svcout.c: Likewise.
|
||||||
|
* sunrpc/xdr_mem.c: Likewise.
|
||||||
|
* sunrpc/xdr_rec.c: Likewise.
|
||||||
|
* sunrpc/xdr_stdio.c: Likewise.
|
||||||
|
* sunrpc/rpc_parse.c: Delete comma from end of enum definition.
|
||||||
|
* sunrpc/xdr.c: Little code cleanups.
|
||||||
|
* sunrpc/xdr_flaot.c: Likewise.
|
||||||
|
Patches by Matthew Wilcox <matthew.wilcox@chbs.mhs.ciba.com>.
|
||||||
|
|
||||||
|
* sysdeps/i386/fpu/__math.h (__finite): Fix typo.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/shmdt.c: Add cast to prevent warning.
|
||||||
|
|
||||||
|
* time/europe: Update from tzdata1997f.
|
||||||
|
* time/zic.c: Update from tzcode1997e.
|
||||||
|
|
||||||
|
1997-05-20 19:20 Miguel de Icaza <miguel@athena.nuclecu.unam.mx>
|
||||||
|
|
||||||
|
* sysdeps/sparc/setjmp.S: Flush windows.
|
||||||
|
Bug found by Richard Henderson.
|
||||||
|
|
||||||
|
1997-05-19 12:54 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* misc/efgcvt_r.c (fcvt_r, ecvt_r): Rewritten as to fit the specs.
|
||||||
|
|
||||||
|
1997-05-19 18:41 Thorsten Kukuk <kukuk@uni-paderborn.de>
|
||||||
|
|
||||||
|
* nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent): Use
|
||||||
|
atol instead of atoi.
|
||||||
|
|
||||||
|
1997-05-18 00:22 Philip Blundell <pjb27@cam.ac.uk>
|
||||||
|
|
||||||
|
* inet/Makefile (routines): Add if_index.
|
||||||
|
* sysdeps/unix/sysv/linux/if_index.c: New file.
|
||||||
|
* sysdeps/stub/if_index.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/net/if.h: Add prototypes for routines in
|
||||||
|
if_index.c (required by IPv6 basic API).
|
||||||
|
* sysdeps/unix/sysv/linux/netinet/in.h: Add struct ipv6_pktinfo.
|
||||||
|
|
||||||
|
1997-05-17 23:29 Philip Blundell <pjb27@cam.ac.uk>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/netinet/in.h: Update IPv6 definitions
|
||||||
|
for new advanced API draft.
|
||||||
|
|
||||||
|
1997-05-13 21:33 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* stdio-common/printf_fp.c: Only use the field width for deciding
|
||||||
|
on padding when printing special values.
|
||||||
|
* stdio-common/printf_fphex.c: Likewise.
|
||||||
|
|
||||||
|
1997-05-15 13:14 Miles Bader <miles@gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
Changes by Thomas Bushnell <thomas@gnu.ai.mit.edu>:
|
||||||
|
* hurd/hurdauth.c (_S_msg_add_auth): Implement correctly.
|
||||||
|
|
||||||
|
1997-05-12 14:50 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* hurd/hurdsig.c (_hurdsig_init): Double size of sigthread stack;
|
||||||
|
msg_add_auth was overflowing it.
|
||||||
|
|
||||||
|
1997-05-12 21:20 Richard Henderson <rth@tamu.edu>
|
||||||
|
|
||||||
|
* elf/dl-lookup.c (_dl_lookup_symbol_skip): Call _dl_signal_error
|
||||||
|
when we can't find the symbol.
|
||||||
|
|
||||||
|
1997-05-12 16:54 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* posix/regex.c: Fix handling of 32-bit Windog environments.
|
||||||
|
Patch by Arnold Robbins <arnold@skeeve.atl.ga.us>.
|
||||||
|
|
||||||
|
1997-05-10 23:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/m68k/syscalls.list: Add cacheflush.
|
||||||
|
|
||||||
|
1997-05-10 11:40 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* elf/ldd.bash.in: Remove spurious quote character from version
|
||||||
|
message.
|
||||||
|
|
||||||
|
1997-05-10 08:49 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* locale/programs/locale.c (write_charmaps): Don't get stuck in a
|
||||||
|
loop if the file ends in a long line without newline.
|
||||||
|
* locale/programs/charmap.c (charmap_read): Likewise.
|
||||||
|
|
||||||
|
1997-05-12 03:47 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sunrpc/rpc/xdr.h: Include more headers to be self-contained.
|
||||||
|
* sunrpc/rpc/svc_auth.h: Likewise.
|
||||||
|
* sunrpc/rpc/svc.h: Likewise.
|
||||||
|
* sunrpc/rpc/rpc_msg.h: Likewise.
|
||||||
|
* sunrpc/rpc/pmap_rmt.h: Likewise.
|
||||||
|
* sunrpc/rpc/pmap_clnt.h: Likewise.
|
||||||
|
* sunrpc/rpc/clnt.h: Likewise.
|
||||||
|
* sunrpc/rpc/auth_unix.h: Likewise.
|
||||||
|
* sysdeps/generic/rpc/auth.h: Likewise.
|
||||||
|
Patches by Michael Deutschmann <ldeutsch@mail.netshop.net>.
|
||||||
|
|
||||||
|
1997-05-11 15:29 Philip Blundell <pjb27@cam.ac.uk>
|
||||||
|
|
||||||
|
* sysdeps/stub/sigaction.c (__sigaction): Correct typo.
|
||||||
|
* sysdeps/standalone/arm/errnos.h: New file.
|
||||||
|
* sysdeps/stub/sys/param.h: Add dummy definition of MAXSYMLINKS.
|
||||||
|
* sysdeps/unix/arm/fork.S: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/arm/sysdep.h: New file.
|
||||||
|
* sysdeps/stub/tempname.c (__stdio_gen_tempname): Add missing
|
||||||
|
`streamptr' argument.
|
||||||
|
* sysdeps/stub/vdprintf.c: Remove second copy of file (!), include
|
||||||
|
<stdarg.h> to get va_list defined, return 0 not NULL.
|
||||||
|
* sysdeps/unix/sysv/linux/statfsbuf.h: Include <gnu/types.h>.
|
||||||
|
* sysdeps/unix/sysv/linux/arm/syscall.S: New file.
|
||||||
|
* sysdeps/stub/direntry.h (struct dirent): Add missing ';'.
|
||||||
|
* sysdeps/stub/seekdir.c (seekdir): Likewise.
|
||||||
|
* sysdeps/stub/dirfd.c (dirfd): Argument dirp is DIR*, not FILE*.
|
||||||
|
* sysdeps/standalone/dirstream.h: Define struct __dirstream
|
||||||
|
not DIR; <dirent.h> provides typedef.
|
||||||
|
* sysdeps/unix/sysv/linux/arm/clone.S: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/arm/socket.S: New file.
|
||||||
|
* sysdeps/stub/sysconf.c (__sysconf): Fix typos.
|
||||||
|
|
||||||
|
1997-05-01 06:35 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* sysdeps/powerpc/Dist: New file.
|
||||||
|
* sysdeps/powerpc/Makefile: New file.
|
||||||
|
* sysdeps/powerpc/fclrexcpt.c: New file.
|
||||||
|
* sysdeps/powerpc/fegetenv.c: New file.
|
||||||
|
* sysdeps/powerpc/fegetround.c: New file.
|
||||||
|
* sysdeps/powerpc/feholdexcpt.c: New file.
|
||||||
|
* sysdeps/powerpc/fenvbits.h: New file.
|
||||||
|
* sysdeps/powerpc/fenv_const.c: New file.
|
||||||
|
* sysdeps/powerpc/fenv_libc.h: New file.
|
||||||
|
* sysdeps/powerpc/fesetenv.c: New file.
|
||||||
|
* sysdeps/powerpc/fesetround.c: New file.
|
||||||
|
* sysdeps/powerpc/feupdateenv.c: New file.
|
||||||
|
* sysdeps/powerpc/fgetexcptflg.c: New file.
|
||||||
|
* sysdeps/powerpc/fraiseexcpt.c: New file.
|
||||||
|
* sysdeps/powerpc/fsetexcptflg.c: New file.
|
||||||
|
* sysdeps/powerpc/ftestexcept.c: New file.
|
||||||
|
* sysdeps/powerpc/mathbits.h: New file.
|
||||||
|
|
||||||
|
* sysdeps/powerpc/dl-machine.h: Wrap in #ifndef dl_machine_h;
|
||||||
|
define elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p,
|
||||||
|
ELF_MACHINE_RELOC_NOPLT; consequent changes to elf_machine_rela.
|
||||||
|
|
||||||
|
* sysdeps/powerpc/__math.h: Remove definition for hypot and __sgn.
|
||||||
|
|
||||||
|
* sysdep/powerpc/fpu_control.h: Correct IEEE default mode.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/sysdep.h: Don't use .text, but
|
||||||
|
instead .section ".text".
|
||||||
|
|
||||||
|
1997-04-25 05:06 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* sysdeps/powerpc/__longjmp.S: Use symbolic register numbering.
|
||||||
|
* sysdeps/powerpc/bsd-_setjmp.S: Likewise.
|
||||||
|
* sysdeps/powerpc/bsd-setjmp.S: Likewise.
|
||||||
|
* sysdeps/powerpc/setjmp.S: Likewise.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/clone.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/socket.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/syscall.S: Likewise.
|
||||||
|
|
||||||
|
1997-04-20 04:37 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* sysdeps/powerpc/strchr.s: New file.
|
||||||
|
* sysdeps/powerpc/strcmp.s: New (ugly) file.
|
||||||
|
* sysdeps/powerpc/memset.s: New file.
|
||||||
|
* string/tester.c: Include prototype and _GNU_SOURCE to make
|
||||||
|
standalone compilation possible. Give strcmp a better
|
||||||
|
test. Give memset a better test.
|
||||||
|
|
||||||
|
1997-04-05 06:34 Geoff Keating <geoffk@ozemail.com.au>
|
||||||
|
|
||||||
|
* sysdeps/powerpc/strlen.s: Fixed bugs (how did it ever pass its
|
||||||
|
tests before?). Changed to symbolic register numbering as an
|
||||||
|
experiment.
|
||||||
|
* sysdeps/powerpc/ffs.c: Don't include bstring.h, it doesn't
|
||||||
|
exist.
|
||||||
|
* sysdeps/rs6000/ffs.c: Likewise.
|
||||||
|
|
||||||
|
1997-05-12 02:28 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* time/sys/time.h: Make second argument of setitimer const.
|
||||||
|
Patch by Michael Deutschmann <ldeutsch@mail.netshop.net>.
|
||||||
|
* sysdeps/stub/setitimer.c: Likewise.
|
||||||
|
* sysdeps/mach/hurd/setitimer.c: Likewise.
|
||||||
|
|
||||||
1997-05-10 11:46 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
|
1997-05-10 11:46 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
|
||||||
|
|
||||||
* nis/rpcsvc/nis_callback.x: New, from tirpcsrc-2.3.
|
* nis/rpcsvc/nis_callback.x: New, from tirpcsrc-2.3.
|
||||||
|
13
FAQ
13
FAQ
@ -183,7 +183,12 @@ Library.
|
|||||||
slow.
|
slow.
|
||||||
|
|
||||||
* plenty of time (approx 1h for i?86-linux on i586@133 or 2.5h on
|
* plenty of time (approx 1h for i?86-linux on i586@133 or 2.5h on
|
||||||
i486@66 or 4.5h on i486@33). For Hurd systems times are much higher.
|
i486@66 or 4.5h on i486@33), both for shared and static only).
|
||||||
|
For Hurd systems times are much higher.
|
||||||
|
|
||||||
|
For Atari Falcon (Motorola 68030 @ 16 Mhz, 14 Mb memory) James Troup
|
||||||
|
<J.J.Troup@comp.brad.ac.uk> reports for a full build (shared, static,
|
||||||
|
and profiled) a compile time of 45h34m.
|
||||||
|
|
||||||
If you have some more measurements let me know.
|
If you have some more measurements let me know.
|
||||||
|
|
||||||
@ -578,6 +583,10 @@ something like this:
|
|||||||
|
|
||||||
GROUP ( libc.so.6 ld.so.1 libc.a )
|
GROUP ( libc.so.6 ld.so.1 libc.a )
|
||||||
|
|
||||||
|
or in ix86/Linux and alpha/Linux:
|
||||||
|
|
||||||
|
GROUP ( libc.so.6 ld-linux.so.2 libc.a )
|
||||||
|
|
||||||
|
|
||||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||||
[Q18] ``The prototypes for `connect', `accept', `getsockopt',
|
[Q18] ``The prototypes for `connect', `accept', `getsockopt',
|
||||||
@ -699,7 +708,7 @@ Answers were given by:
|
|||||||
{DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
|
{DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
|
||||||
{RM} Roland McGrath, <roland@gnu.ai.mit.edu>
|
{RM} Roland McGrath, <roland@gnu.ai.mit.edu>
|
||||||
{HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
|
{HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
|
||||||
{AJ} Andreas Jaeger, <aj@arthur.pfalz.de>
|
{AJ} Andreas Jaeger, <aj@arthur.rhein-neckar.de>
|
||||||
{EY} Eric Youngdale, <eric@andante.jic.com>
|
{EY} Eric Youngdale, <eric@andante.jic.com>
|
||||||
|
|
||||||
Local Variables:
|
Local Variables:
|
||||||
|
@ -23,7 +23,7 @@ subdir := dirent
|
|||||||
|
|
||||||
headers := dirent.h direntry.h
|
headers := dirent.h direntry.h
|
||||||
routines := opendir closedir readdir readdir_r rewinddir \
|
routines := opendir closedir readdir readdir_r rewinddir \
|
||||||
seekdir telldir scandir alphasort \
|
seekdir telldir scandir alphasort versionsort \
|
||||||
getdents dirfd
|
getdents dirfd
|
||||||
distribute := dirstream.h
|
distribute := dirstream.h
|
||||||
|
|
||||||
|
@ -175,6 +175,10 @@ extern int scandir __P ((__const char *__dir,
|
|||||||
/* Function to compare two `struct dirent's alphabetically. */
|
/* Function to compare two `struct dirent's alphabetically. */
|
||||||
extern int alphasort __P ((__const __ptr_t, __const __ptr_t));
|
extern int alphasort __P ((__const __ptr_t, __const __ptr_t));
|
||||||
|
|
||||||
|
# ifdef __USE_GNU
|
||||||
|
/* Function to compare two `struct dirent's by name & version. */
|
||||||
|
extern int versionsort __P ((__const __ptr_t, __const __ptr_t));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Read directory entries from FD into BUF, reading at most NBYTES.
|
/* Read directory entries from FD into BUF, reading at most NBYTES.
|
||||||
Reading starts at offset *BASEP, and *BASEP is updated with the new
|
Reading starts at offset *BASEP, and *BASEP is updated with the new
|
||||||
|
27
dirent/versionsort.c
Normal file
27
dirent/versionsort.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/* Copyright (C) 1992, 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
versionsort (const void *a, const void *b)
|
||||||
|
{
|
||||||
|
return strverscmp ((*(const struct dirent **) a)->d_name,
|
||||||
|
(*(const struct dirent **) b)->d_name);
|
||||||
|
}
|
@ -332,6 +332,18 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
|
|||||||
reference_name, version, skip_map, 0))
|
reference_name, version, skip_map, 0))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (current_value.s == NULL &&
|
||||||
|
(*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
|
||||||
|
{
|
||||||
|
/* We could find no value for a strong reference. */
|
||||||
|
static const char msg[] = "undefined symbol: ";
|
||||||
|
const size_t len = strlen (undef_name);
|
||||||
|
char buf[sizeof msg + len];
|
||||||
|
memcpy (buf, msg, sizeof msg - 1);
|
||||||
|
memcpy (&buf[sizeof msg - 1], undef_name, len + 1);
|
||||||
|
_dl_signal_error (0, reference_name, buf);
|
||||||
|
}
|
||||||
|
|
||||||
*ref = current_value.s;
|
*ref = current_value.s;
|
||||||
return current_value.a;
|
return current_value.a;
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ bind_now=
|
|||||||
while test $# -gt 0; do
|
while test $# -gt 0; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--v | --ve | --ver | --vers | --versi | --versio | --version)
|
--v | --ve | --ver | --vers | --versi | --versio | --version)
|
||||||
echo '"ldd (GNU libc) @VERSION@'
|
echo 'ldd (GNU libc) @VERSION@'
|
||||||
echo $"Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
echo $"Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
remember, if any of these versions change, the libc.so major version
|
remember, if any of these versions change, the libc.so major version
|
||||||
number must change too (so avoid it)! */
|
number must change too (so avoid it)! */
|
||||||
|
|
||||||
#define _GNU_OBSTACK_INTERFACE_VERSION 1 /* vs malloc/obstack.c */
|
#define _GNU_OBSTACK_INTERFACE_VERSION 2 /* vs malloc/obstack.c */
|
||||||
#define _GNU_REGEX_INTERFACE_VERSION 1 /* vs posix/regex.c */
|
#define _GNU_REGEX_INTERFACE_VERSION 1 /* vs posix/regex.c */
|
||||||
#define _GNU_GLOB_INTERFACE_VERSION 1 /* vs posix/glob.c */
|
#define _GNU_GLOB_INTERFACE_VERSION 1 /* vs posix/glob.c */
|
||||||
#define _GNU_GETOPT_INTERFACE_VERSION 2 /* vs posix/getopt.c and
|
#define _GNU_GETOPT_INTERFACE_VERSION 2 /* vs posix/getopt.c and
|
||||||
|
123
hurd/hurdauth.c
123
hurd/hurdauth.c
@ -37,17 +37,124 @@ _S_msg_add_auth (mach_port_t me,
|
|||||||
{
|
{
|
||||||
error_t err;
|
error_t err;
|
||||||
auth_t newauth;
|
auth_t newauth;
|
||||||
|
uid_t *genuids, *gengids, *auxuids, *auxgids;
|
||||||
|
mach_msg_type_number_t ngenuids, ngengids, nauxuids, nauxgids;
|
||||||
|
uid_t *newgenuids, *newgengids, *newauxuids, *newauxgids;
|
||||||
|
mach_msg_type_number_t nnewgenuids, nnewgengids, nnewauxuids, nnewauxgids;
|
||||||
|
|
||||||
if (err = __USEPORT (AUTH,
|
/* Create a list of ids and store it in NEWLISTP, length NEWLISTLEN.
|
||||||
__auth_makeauth (port,
|
Keep all the ids in EXIST (len NEXIST), adding in those from NEW
|
||||||
&addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
|
(len NNEW) which are not already there. */
|
||||||
NULL, 0,
|
error_t make_list (uid_t **newlistp, mach_msg_type_number_t *newlistlen,
|
||||||
NULL, 0,
|
uid_t *exist, mach_msg_type_number_t nexist,
|
||||||
NULL, 0,
|
uid_t *new, mach_msg_type_number_t nnew)
|
||||||
NULL, 0,
|
{
|
||||||
&newauth)))
|
error_t urp;
|
||||||
|
int i, j, k;
|
||||||
|
vm_size_t offset;
|
||||||
|
|
||||||
|
urp = vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
|
||||||
|
nexist + nnew * sizeof (uid_t), 1);
|
||||||
|
if (urp)
|
||||||
|
return urp;
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
for (i = 0; i < nexist; i++)
|
||||||
|
(*newlistp)[j++] = exist[i];
|
||||||
|
|
||||||
|
for (i = 0; i < nnew; i++)
|
||||||
|
{
|
||||||
|
for (k = 0; k < nexist; k++)
|
||||||
|
if (exist[k] == new[i])
|
||||||
|
break;
|
||||||
|
if (k < nexist)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
(*newlistp)[j++] = new[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = (round_page (nexist + nnew * sizeof (uid_t))
|
||||||
|
- round_page (j * sizeof (uid_t)));
|
||||||
|
if (offset)
|
||||||
|
vm_deallocate (mach_task_self (),
|
||||||
|
(vm_address_t) (*newlistp
|
||||||
|
+ (nexist + nnew * sizeof (uid_t))),
|
||||||
|
offset);
|
||||||
|
*newlistlen = j;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find out what ids ADDAUTH refers to */
|
||||||
|
|
||||||
|
genuids = gengids = auxuids = auxgids = 0;
|
||||||
|
ngenuids = ngengids = nauxuids = nauxgids = 0;
|
||||||
|
err = __auth_getids (addauth,
|
||||||
|
&genuids, &ngenuids,
|
||||||
|
&auxuids, &nauxuids,
|
||||||
|
&gengids, &ngengids,
|
||||||
|
&auxgids, &nauxgids);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
/* OR in these ids to what we already have, creating a new list. */
|
||||||
|
|
||||||
|
HURD_CRITICAL_BEGIN;
|
||||||
|
__mutex_lock (&_hurd_id.lock);
|
||||||
|
_hurd_check_ids ();
|
||||||
|
|
||||||
|
#define MAKE(genaux,uidgid) \
|
||||||
|
make_list (&new ## genaux ## uidgid ## s, \
|
||||||
|
&nnew ## genaux ## uidgid ## s, \
|
||||||
|
_hurd_id.genaux.uidgid ## s, \
|
||||||
|
_hurd_id.genaux.n ## uidgid ## s, \
|
||||||
|
genaux ## uidgid ## s, \
|
||||||
|
n ## genaux ## uidgid ## s)
|
||||||
|
|
||||||
|
err = MAKE (gen, uid);
|
||||||
|
if (!err)
|
||||||
|
MAKE (aux, uid);
|
||||||
|
if (!err)
|
||||||
|
MAKE (gen, gid);
|
||||||
|
if (!err)
|
||||||
|
MAKE (aux, gid);
|
||||||
|
#undef MAKE
|
||||||
|
|
||||||
|
__mutex_unlock (&_hurd_id.lock);
|
||||||
|
HURD_CRITICAL_END;
|
||||||
|
|
||||||
|
|
||||||
|
/* Create the new auth port */
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
err = __USEPORT (AUTH,
|
||||||
|
__auth_makeauth (port,
|
||||||
|
&addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
|
||||||
|
newgenuids, nnewgenuids,
|
||||||
|
newauxuids, nnewauxuids,
|
||||||
|
newgengids, nnewgengids,
|
||||||
|
newauxgids, nnewauxgids,
|
||||||
|
&newauth));
|
||||||
|
|
||||||
|
#define freeup(array, len) \
|
||||||
|
if (array) \
|
||||||
|
vm_deallocate (mach_task_self (), (vm_address_t) array, \
|
||||||
|
len * sizeof (uid_t));
|
||||||
|
|
||||||
|
freeup (genuids, ngenuids);
|
||||||
|
freeup (auxuids, nauxuids);
|
||||||
|
freeup (gengids, ngengids);
|
||||||
|
freeup (auxgids, nauxgids);
|
||||||
|
freeup (newgenuids, nnewgenuids);
|
||||||
|
freeup (newauxuids, nnewauxuids);
|
||||||
|
freeup (newgengids, nnewgengids);
|
||||||
|
freeup (newauxgids, nnewauxgids);
|
||||||
|
#undef freeup
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* And install it. */
|
||||||
|
|
||||||
err = __setauth (newauth);
|
err = __setauth (newauth);
|
||||||
__mach_port_deallocate (__mach_task_self (), newauth);
|
__mach_port_deallocate (__mach_task_self (), newauth);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -1194,7 +1194,7 @@ _hurdsig_init (void)
|
|||||||
err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
|
err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
|
||||||
assert_perror (err);
|
assert_perror (err);
|
||||||
|
|
||||||
stacksize = __vm_page_size * 4; /* Small stack for signal thread. */
|
stacksize = __vm_page_size * 8; /* Small stack for signal thread. */
|
||||||
err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
|
err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
|
||||||
_hurd_msgport_receive,
|
_hurd_msgport_receive,
|
||||||
(vm_address_t *) &__hurd_sigthread_stack_base,
|
(vm_address_t *) &__hurd_sigthread_stack_base,
|
||||||
|
@ -44,7 +44,7 @@ routines := ntohl ntohs htonl htons \
|
|||||||
rcmd rexec ruserpass \
|
rcmd rexec ruserpass \
|
||||||
getnetgrent_r getnetgrent \
|
getnetgrent_r getnetgrent \
|
||||||
getaliasent_r getaliasent getaliasname getaliasname_r \
|
getaliasent_r getaliasent getaliasname getaliasname_r \
|
||||||
in6_addr getnameinfo
|
in6_addr getnameinfo if_index
|
||||||
|
|
||||||
# No warnings about losing BSD code.
|
# No warnings about losing BSD code.
|
||||||
CFLAGS-rcmd.c = -w
|
CFLAGS-rcmd.c = -w
|
||||||
|
@ -114,9 +114,9 @@ charmap_read (const char *filename)
|
|||||||
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
|
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
do
|
while (fgets (junk, sizeof junk, fp) != NULL
|
||||||
fgets (junk, sizeof junk, fp);
|
&& strchr (junk, '\n') == NULL)
|
||||||
while (strchr (junk, '\n') == NULL);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
|
@ -504,9 +504,9 @@ write_charmaps (void)
|
|||||||
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
|
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
do
|
while (fgets (junk, sizeof junk, fp) != NULL
|
||||||
fgets (junk, sizeof junk, fp);
|
&& strchr (junk, '\n') == NULL)
|
||||||
while (strchr (junk, '\n') == NULL);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* obstack.c - subroutines used implicitly by object stack macros
|
/* obstack.c - subroutines used implicitly by object stack macros
|
||||||
Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
|
Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU C Library. Its master source is NOT part of
|
This file is part of the GNU C Library. Its master source is NOT part of
|
||||||
the C library, however. The master source lives in /gd/gnu/lib.
|
the C library, however. The master source lives in /gd/gnu/lib.
|
||||||
@ -19,6 +19,10 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "obstack.h"
|
#include "obstack.h"
|
||||||
|
|
||||||
/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
|
/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
|
||||||
@ -85,7 +89,7 @@ void (*obstack_alloc_failed_handler) () = print_and_abort;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Exit value used when `print_and_abort' is used. */
|
/* Exit value used when `print_and_abort' is used. */
|
||||||
#if defined (__STDC__) && __STDC__
|
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
#ifndef EXIT_FAILURE
|
#ifndef EXIT_FAILURE
|
||||||
|
@ -455,8 +455,8 @@ value are selected.
|
|||||||
Finally the entries in the @var{namelist} are sorted using the user
|
Finally the entries in the @var{namelist} are sorted using the user
|
||||||
supplied function @var{cmp}. The arguments of the @var{cmp} function
|
supplied function @var{cmp}. The arguments of the @var{cmp} function
|
||||||
are of type @code{struct dirent **}. I.e., one cannot directly use the
|
are of type @code{struct dirent **}. I.e., one cannot directly use the
|
||||||
@code{strcmp} or @code{strcoll} function; see the function
|
@code{strcmp} or @code{strcoll} function; see the functions
|
||||||
@code{alphasort} below.
|
@code{alphasort} and @code{versionsort} below.
|
||||||
|
|
||||||
The return value of the function gives the number of entries placed in
|
The return value of the function gives the number of entries placed in
|
||||||
@var{namelist}. If it is @code{-1} an error occurred and the global
|
@var{namelist}. If it is @code{-1} an error occurred and the global
|
||||||
@ -465,7 +465,7 @@ variable @code{errno} contains more information on the error.
|
|||||||
|
|
||||||
As said above the fourth argument to the @code{scandir} function must be
|
As said above the fourth argument to the @code{scandir} function must be
|
||||||
a pointer to a sorting function. For the convenience of the programmer
|
a pointer to a sorting function. For the convenience of the programmer
|
||||||
the GNU C library contains an implementation of a function which is very
|
the GNU C library contains implementations of functions which are very
|
||||||
helpful for this purpose.
|
helpful for this purpose.
|
||||||
|
|
||||||
@deftypefun int alphasort (const void *@var{a}, const void *@var{b})
|
@deftypefun int alphasort (const void *@var{a}, const void *@var{b})
|
||||||
@ -478,6 +478,11 @@ Return value of is less than, equal to, or greater than zero depending
|
|||||||
on the order of the two entries @var{a} and @var{b}.
|
on the order of the two entries @var{a} and @var{b}.
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
|
@deftypefun int versionsort (const void *@var{a}, const void *@var{b})
|
||||||
|
The @code{versionsort} function is like @code{alphasort}, excepted that it
|
||||||
|
uses the @code{strverscmp} function internally.
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
@node Simple Directory Lister Mark II
|
@node Simple Directory Lister Mark II
|
||||||
@subsection Simple Program to List a Directory, Mark II
|
@subsection Simple Program to List a Directory, Mark II
|
||||||
|
|
||||||
|
@ -608,6 +608,56 @@ strncmp ("hello, world", "hello, stupid world!!!", 5)
|
|||||||
@result{} 0 /* @r{The initial 5 characters are the same.} */
|
@result{} 0 /* @r{The initial 5 characters are the same.} */
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
|
@comment string.h
|
||||||
|
@comment GNU
|
||||||
|
@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2})
|
||||||
|
The @code{strverscmp} function compares the string @var{s1} against
|
||||||
|
@var{s2}, considering them as holding indices/version numbers. Return
|
||||||
|
value follows the same conventions as found in the @code{strverscmp}
|
||||||
|
function. In fact, if @var{s1} and @var{s2} contain no digits,
|
||||||
|
@code{strverscmp} behaves like @code{strcmp}.
|
||||||
|
|
||||||
|
Basically, we compare strings normaly (character by character), until
|
||||||
|
we find a digit in each string - then we enter a special comparison
|
||||||
|
mode, where each sequence of digit is taken as a whole. If we reach the
|
||||||
|
end of these two parts without noticing a difference, we return to the
|
||||||
|
standard comparison mode. There are two types of numeric parts:
|
||||||
|
"integral" and "fractionnal" (these laters begins with a '0'). The types
|
||||||
|
of the numeric parts affect the way we sort them:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item
|
||||||
|
integral/integral: we compare values as you would expect.
|
||||||
|
|
||||||
|
@item
|
||||||
|
fractionnal/integral: the fractionnal part is less than the integral one.
|
||||||
|
Again, no surprise.
|
||||||
|
|
||||||
|
@item
|
||||||
|
fractionnal/fractionnal: the things become a bit more complex.
|
||||||
|
if the common prefix contains only leading zeroes, the longest part is less
|
||||||
|
than the other one; else the comparison behaves normaly.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
strverscmp ("no digit", "no digit")
|
||||||
|
@result{} 0 /* @r{same behaviour as strverscmp.} */
|
||||||
|
strverscmp ("item#99", "item#100")
|
||||||
|
@result{} <0 /* @r{same prefix, but 99 < 100.} */
|
||||||
|
strverscmp ("alpha1", "alpha001")
|
||||||
|
@result{} >0 /* @r{fractionnal part inferior to integral one.} */
|
||||||
|
strverscmp ("part1_f012", "part1_f01")
|
||||||
|
@result{} >0 /* @r{two fractionnal parts.} */
|
||||||
|
strverscmp ("foo.009", "foo.0")
|
||||||
|
@result{} <0 /* @r{idem, but with leading zeroes only.} */
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
This function is especially usefull when dealing with filename sorting,
|
||||||
|
because filenames frequently hold indices/version numbers.
|
||||||
|
|
||||||
|
@code{strverscmp} is a GNU extension.
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
@comment string.h
|
@comment string.h
|
||||||
@comment BSD
|
@comment BSD
|
||||||
@deftypefun int bcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size})
|
@deftypefun int bcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size})
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
%% TeX macros to handle Texinfo files.
|
%% TeX macros to handle Texinfo files.
|
||||||
%% $Id: texinfo.tex,v 2.198 1997/05/07 15:16:03 drepper Exp $
|
%% $Id: texinfo.tex,v 2.199 1997/05/20 11:11:48 drepper Exp $
|
||||||
|
|
||||||
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
|
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
|
||||||
% 94, 95, 96, 97 Free Software Foundation, Inc.
|
% 94, 95, 96, 97 Free Software Foundation, Inc.
|
||||||
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
% This automatically updates the version number based on RCS.
|
% This automatically updates the version number based on RCS.
|
||||||
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
|
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
|
||||||
\deftexinfoversion$Revision: 2.198 $
|
\deftexinfoversion$Revision: 2.199 $
|
||||||
\message{Loading texinfo package [Version \texinfoversion]:}
|
\message{Loading texinfo package [Version \texinfoversion]:}
|
||||||
|
|
||||||
% If in a .fmt file, print the version number
|
% If in a .fmt file, print the version number
|
||||||
@ -1271,8 +1271,6 @@ where each line of input produces a line of output.}
|
|||||||
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
|
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
|
||||||
|
|
||||||
\let\file=\samp
|
\let\file=\samp
|
||||||
\let\url=\samp % perhaps include a hypertex \special eventually
|
|
||||||
\def\email#1{$\langle${\tt #1}$\rangle$}
|
|
||||||
|
|
||||||
% @code is a modification of @t,
|
% @code is a modification of @t,
|
||||||
% which makes spaces the same size as normal in the surrounding text.
|
% which makes spaces the same size as normal in the surrounding text.
|
||||||
@ -1325,7 +1323,7 @@ where each line of input produces a line of output.}
|
|||||||
|
|
||||||
\def\realdash{-}
|
\def\realdash{-}
|
||||||
\def\codedash{-\discretionary{}{}{}}
|
\def\codedash{-\discretionary{}{}{}}
|
||||||
\def\codeunder{\normalunderscore\discretionary{}{}{}}
|
\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
|
||||||
\def\codex #1{\tclose{#1}\endgroup}
|
\def\codex #1{\tclose{#1}\endgroup}
|
||||||
|
|
||||||
%\let\exp=\tclose %Was temporary
|
%\let\exp=\tclose %Was temporary
|
||||||
@ -1339,6 +1337,12 @@ where each line of input produces a line of output.}
|
|||||||
\else{\tclose{\ttsl\look}}\fi
|
\else{\tclose{\ttsl\look}}\fi
|
||||||
\else{\tclose{\ttsl\look}}\fi}
|
\else{\tclose{\ttsl\look}}\fi}
|
||||||
|
|
||||||
|
% @url, @email. Quotes do not seem necessary.
|
||||||
|
\let\url=\code % perhaps include a hypertex \special eventually
|
||||||
|
% rms does not like the angle brackets --karl, 17may97.
|
||||||
|
%\def\email#1{$\langle${\tt #1}$\rangle$}
|
||||||
|
\let\email=\code
|
||||||
|
|
||||||
% Check if we are currently using a typewriter font. Since all the
|
% Check if we are currently using a typewriter font. Since all the
|
||||||
% Computer Modern typewriter fonts have zero interword stretch (and
|
% Computer Modern typewriter fonts have zero interword stretch (and
|
||||||
% shrink), and it is reasonable to expect all typewriter fonts to have
|
% shrink), and it is reasonable to expect all typewriter fonts to have
|
||||||
@ -3417,8 +3421,8 @@ width0pt\relax} \fi
|
|||||||
\let\.=\ptexdot
|
\let\.=\ptexdot
|
||||||
\let\*=\ptexstar
|
\let\*=\ptexstar
|
||||||
\let\dots=\ptexdots
|
\let\dots=\ptexdots
|
||||||
\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}
|
\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
|
||||||
\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
|
\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
|
||||||
\def\@{@}%
|
\def\@{@}%
|
||||||
\let\bullet=\ptexbullet
|
\let\bullet=\ptexbullet
|
||||||
\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
|
\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
|
||||||
|
@ -67,7 +67,8 @@ distribute += $(long-m-yes:=.c)
|
|||||||
# These functions are in libc instead of libm because __printf_fp
|
# These functions are in libc instead of libm because __printf_fp
|
||||||
# calls them, so any program using printf will need them linked in,
|
# calls them, so any program using printf will need them linked in,
|
||||||
# and we don't want to have to link every program with -lm.
|
# and we don't want to have to link every program with -lm.
|
||||||
calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp
|
calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp \
|
||||||
|
s_signbit
|
||||||
routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
|
routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
|
||||||
long-c-yes = $(calls:=l)
|
long-c-yes = $(calls:=l)
|
||||||
distribute += $(long-c-yes:=.c)
|
distribute += $(long-c-yes:=.c)
|
||||||
|
@ -71,7 +71,7 @@ extern void fegetexceptflag __P ((fexcept_t *__flagp, int __excepts));
|
|||||||
/* Raise the supported exceptions represented by EXCEPTS. */
|
/* Raise the supported exceptions represented by EXCEPTS. */
|
||||||
extern void feraiseexcept __P ((int __excepts));
|
extern void feraiseexcept __P ((int __excepts));
|
||||||
|
|
||||||
/* Set complete status for exceptions inidicated by EXCEPTS according to
|
/* Set complete status for exceptions indicated by EXCEPTS according to
|
||||||
the representation in the object pointed to by FLAGP. */
|
the representation in the object pointed to by FLAGP. */
|
||||||
extern void fesetexceptflag __P ((__const fexcept_t *__flagp, int __excepts));
|
extern void fesetexceptflag __P ((__const fexcept_t *__flagp, int __excepts));
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#define FLOOR APPEND(floor, FLOAT_NAME_EXT)
|
#define FLOOR APPEND(floor, FLOAT_NAME_EXT)
|
||||||
#define FABS APPEND(fabs, FLOAT_NAME_EXT)
|
#define FABS APPEND(fabs, FLOAT_NAME_EXT)
|
||||||
#define LOG10 APPEND(log10, FLOAT_NAME_EXT)
|
#define LOG10 APPEND(log10, FLOAT_NAME_EXT)
|
||||||
|
#define EXP APPEND(exp, FLOAT_NAME_EXT)
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -54,9 +55,12 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sign = value < 0.0;
|
if (isfinite (value))
|
||||||
if (*sign)
|
{
|
||||||
value = - value;
|
*sign = signbit (value) != 0;
|
||||||
|
if (*sign)
|
||||||
|
value = -value;
|
||||||
|
}
|
||||||
|
|
||||||
n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
|
n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
@ -66,16 +70,29 @@ APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len)
|
|||||||
while (i < n && isdigit (buf[i]))
|
while (i < n && isdigit (buf[i]))
|
||||||
++i;
|
++i;
|
||||||
*decpt = i;
|
*decpt = i;
|
||||||
do
|
|
||||||
++i;
|
if (i == 0)
|
||||||
while (! isdigit (buf[i]));
|
{
|
||||||
memmove (&buf[i - *decpt], buf, n - (i - *decpt));
|
/* Value is Inf or NaN. */
|
||||||
|
*sign = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < n)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
++i;
|
||||||
|
while (i < n && !isdigit (buf[i]));
|
||||||
|
memmove (&buf[*decpt], &buf[i], n - i);
|
||||||
|
buf[n - (i - *decpt)] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define weak_extern2(name) weak_extern (name)
|
#define weak_extern2(name) weak_extern (name)
|
||||||
weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
|
weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
|
||||||
|
weak_extern2 (EXP)
|
||||||
|
|
||||||
int
|
int
|
||||||
APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
|
APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
|
||||||
@ -84,24 +101,55 @@ APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
|
|||||||
char *buf;
|
char *buf;
|
||||||
size_t len;
|
size_t len;
|
||||||
{
|
{
|
||||||
FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
|
int exponent = 0;
|
||||||
|
|
||||||
if (log10_function)
|
if (isfinite (value) && value != 0.0)
|
||||||
{
|
{
|
||||||
/* Use the reasonable code if -lm is included. */
|
FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
|
||||||
ndigit -= (int) FLOOR (LOG10 (FABS (value)));
|
|
||||||
if (ndigit < 0)
|
if (log10_function)
|
||||||
ndigit = 0;
|
{
|
||||||
}
|
/* Use the reasonable code if -lm is included. */
|
||||||
else
|
FLOAT_TYPE dexponent;
|
||||||
{
|
dexponent = FLOOR (LOG10 (FABS (value)));
|
||||||
/* Slow code that doesn't require -lm functions. */
|
value *= EXP (dexponent * -M_LN10);
|
||||||
FLOAT_TYPE d;
|
exponent = (int) dexponent;
|
||||||
for (d = value < 0.0 ? - value : value;
|
}
|
||||||
ndigit > 0 && d >= 10.0;
|
else
|
||||||
d *= 0.1)
|
{
|
||||||
--ndigit;
|
/* Slow code that doesn't require -lm functions. */
|
||||||
|
FLOAT_TYPE d;
|
||||||
|
if (value < 0.0)
|
||||||
|
d = -value;
|
||||||
|
else
|
||||||
|
d = value;
|
||||||
|
if (d < 1.0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
d *= 10.0;
|
||||||
|
exponent--;
|
||||||
|
}
|
||||||
|
while (d < 1.0);
|
||||||
|
}
|
||||||
|
else if (d >= 10.0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
d *= 0.1;
|
||||||
|
exponent++;
|
||||||
|
}
|
||||||
|
while (d >= 10.0);
|
||||||
|
}
|
||||||
|
if (value < 0.0)
|
||||||
|
value = -d;
|
||||||
|
else
|
||||||
|
value = d;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len);
|
if (APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit - 1, decpt, sign, buf, len))
|
||||||
|
return -1;
|
||||||
|
*decpt += exponent;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -90,47 +90,47 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
|
|||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
sp->sp_lstchg = atoi (line);
|
sp->sp_lstchg = atol (line);
|
||||||
|
|
||||||
line = cp;
|
line = cp;
|
||||||
cp = strchr (line, ':');
|
cp = strchr (line, ':');
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
sp->sp_min = atoi(line);
|
sp->sp_min = atol(line);
|
||||||
|
|
||||||
line = cp;
|
line = cp;
|
||||||
cp = strchr (line, ':');
|
cp = strchr (line, ':');
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
sp->sp_max = atoi(line);
|
sp->sp_max = atol(line);
|
||||||
|
|
||||||
line = cp;
|
line = cp;
|
||||||
cp = strchr (line, ':');
|
cp = strchr (line, ':');
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
sp->sp_warn = atoi(line);
|
sp->sp_warn = atol(line);
|
||||||
|
|
||||||
line = cp;
|
line = cp;
|
||||||
cp = strchr (line, ':');
|
cp = strchr (line, ':');
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
sp->sp_inact = atoi(line);
|
sp->sp_inact = atol(line);
|
||||||
|
|
||||||
line = cp;
|
line = cp;
|
||||||
cp = strchr (line, ':');
|
cp = strchr (line, ':');
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
*cp++ = '\0';
|
*cp++ = '\0';
|
||||||
sp->sp_expire = atoi(line);
|
sp->sp_expire = atol(line);
|
||||||
|
|
||||||
line = cp;
|
line = cp;
|
||||||
if (line == NULL)
|
if (line == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
sp->sp_flag = atoi(line);
|
sp->sp_flag = atol(line);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1568,7 +1568,7 @@ static reg_errcode_t compile_range _RE_ARGS ((const char **p_ptr,
|
|||||||
MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up
|
MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up
|
||||||
reallocating to 0 bytes. Such thing is not going to work too well.
|
reallocating to 0 bytes. Such thing is not going to work too well.
|
||||||
You have been warned!! */
|
You have been warned!! */
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && !defined(WIN32)
|
||||||
/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
|
/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
|
||||||
The REALLOC define eliminates a flurry of conversion warnings,
|
The REALLOC define eliminates a flurry of conversion warnings,
|
||||||
but is not required. */
|
but is not required. */
|
||||||
|
@ -400,7 +400,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||||||
linebuflen -= n;
|
linebuflen -= n;
|
||||||
/* Get canonical name. */
|
/* Get canonical name. */
|
||||||
n = strlen (tbuf) + 1; /* For the \0. */
|
n = strlen (tbuf) + 1; /* For the \0. */
|
||||||
if (n > buflen)
|
if ((size_t) n > buflen)
|
||||||
{
|
{
|
||||||
++had_error;
|
++had_error;
|
||||||
continue;
|
continue;
|
||||||
@ -423,7 +423,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
|
|||||||
cp += n;
|
cp += n;
|
||||||
/* Get canonical name. */
|
/* Get canonical name. */
|
||||||
n = strlen (tbuf) + 1; /* For the \0. */
|
n = strlen (tbuf) + 1; /* For the \0. */
|
||||||
if (n > buflen)
|
if ((size_t) n > buflen)
|
||||||
{
|
{
|
||||||
++had_error;
|
++had_error;
|
||||||
continue;
|
continue;
|
||||||
|
@ -336,7 +336,7 @@ __printf_fp (FILE *fp,
|
|||||||
|
|
||||||
if (special)
|
if (special)
|
||||||
{
|
{
|
||||||
int width = info->prec > info->width ? info->prec : info->width;
|
int width = info->width;
|
||||||
|
|
||||||
if (is_neg || info->showsign || info->space)
|
if (is_neg || info->showsign || info->space)
|
||||||
--width;
|
--width;
|
||||||
|
@ -189,7 +189,7 @@ __printf_fphex (FILE *fp,
|
|||||||
|
|
||||||
if (special)
|
if (special)
|
||||||
{
|
{
|
||||||
int width = info->prec > info->width ? info->prec : info->width;
|
int width = info->width;
|
||||||
|
|
||||||
if (negative || info->showsign || info->space)
|
if (negative || info->showsign || info->space)
|
||||||
--width;
|
--width;
|
||||||
|
@ -24,7 +24,7 @@ subdir := string
|
|||||||
headers := string.h strings.h memory.h endian.h bytesex.h \
|
headers := string.h strings.h memory.h endian.h bytesex.h \
|
||||||
argz.h envz.h
|
argz.h envz.h
|
||||||
|
|
||||||
routines := strcat strchr strcmp strcoll strcpy strcspn \
|
routines := strcat strchr strcmp strcoll strcpy strcspn strverscmp \
|
||||||
strdup strndup \
|
strdup strndup \
|
||||||
strerror _strerror strerror_r strlen strnlen \
|
strerror _strerror strerror_r strlen strnlen \
|
||||||
strncat strncmp strncpy \
|
strncat strncmp strncpy \
|
||||||
@ -40,7 +40,8 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \
|
|||||||
envz basename \
|
envz basename \
|
||||||
strcoll_l strxfrm_l
|
strcoll_l strxfrm_l
|
||||||
|
|
||||||
tests := tester testcopy test-ffs tst-strlen stratcliff
|
tests := tester testcopy test-ffs tst-strlen stratcliff \
|
||||||
|
tst-svc
|
||||||
distribute := memcopy.h pagecopy.h
|
distribute := memcopy.h pagecopy.h
|
||||||
|
|
||||||
|
|
||||||
@ -50,3 +51,6 @@ tester-ENV = LANGUAGE=C
|
|||||||
CFLAGS-tester.c = -fno-builtin
|
CFLAGS-tester.c = -fno-builtin
|
||||||
CFLAGS-tst-strlen.c = -fno-builtin
|
CFLAGS-tst-strlen.c = -fno-builtin
|
||||||
CFLAGS-stratcliff.c = -fno-builtin
|
CFLAGS-stratcliff.c = -fno-builtin
|
||||||
|
|
||||||
|
tests: $(objpfx)tst-svc.out
|
||||||
|
cmp tst-svc.expect $(objpfx)tst-svc.out
|
||||||
|
@ -17,10 +17,15 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
char *
|
char *
|
||||||
basename (const char *filename)
|
basename (filename)
|
||||||
|
const char *filename;
|
||||||
{
|
{
|
||||||
char *p = strrchr (filename, '/');
|
char *p = strrchr (filename, '/');
|
||||||
return p ? p + 1 : (char *) filename;
|
return p ? p + 1 : (char *) filename;
|
||||||
|
@ -241,6 +241,9 @@ extern char *strsep __P ((char **__stringp, __const char *__delim));
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __USE_GNU
|
#ifdef __USE_GNU
|
||||||
|
/* Compare S1 and S2 as strings holding name & indices/version numbers. */
|
||||||
|
extern int strverscmp __P ((__const char *__s1, __const char *__s2));
|
||||||
|
|
||||||
/* Return a string describing the meaning of the signal number in SIG. */
|
/* Return a string describing the meaning of the signal number in SIG. */
|
||||||
extern char *strsignal __P ((int __sig));
|
extern char *strsignal __P ((int __sig));
|
||||||
|
|
||||||
|
111
string/strverscmp.c
Normal file
111
string/strverscmp.c
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/* Compare strings while treating digits characters numerically.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Jean-Fran<61>ois Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
|
||||||
|
Fractionnal parts, S_Z: idem but with leading Zeroes only */
|
||||||
|
#define S_N 0x0
|
||||||
|
#define S_I 0x4
|
||||||
|
#define S_F 0x8
|
||||||
|
#define S_Z 0xC
|
||||||
|
|
||||||
|
/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
|
||||||
|
#define CMP 2
|
||||||
|
#define LEN 3
|
||||||
|
|
||||||
|
|
||||||
|
/* Compare S1 and S2 as strings holding indices/version numbers,
|
||||||
|
returning less than, equal to or greater than zero if S1 is less than,
|
||||||
|
equal to or greater than S2 (for more info, see the texinfo doc).
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
strverscmp (s1, s2)
|
||||||
|
const char *s1;
|
||||||
|
const char *s2;
|
||||||
|
{
|
||||||
|
const unsigned char *p1 = (const unsigned char *) s1;
|
||||||
|
const unsigned char *p2 = (const unsigned char *) s2;
|
||||||
|
unsigned char c1, c2;
|
||||||
|
int state;
|
||||||
|
int diff;
|
||||||
|
|
||||||
|
/* Symbol(s) 0 [1-9] others (padding)
|
||||||
|
Transition (10) 0 (01) d (00) x (11) - */
|
||||||
|
static const unsigned int next_state[] =
|
||||||
|
{
|
||||||
|
/* state x d 0 - */
|
||||||
|
/* S_N */ S_N, S_I, S_Z, S_N,
|
||||||
|
/* S_I */ S_N, S_I, S_I, S_I,
|
||||||
|
/* S_F */ S_N, S_F, S_F, S_F,
|
||||||
|
/* S_Z */ S_N, S_F, S_Z, S_Z
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int result_type[] =
|
||||||
|
{
|
||||||
|
/* state x/x x/d x/0 x/- d/x d/d d/0 d/-
|
||||||
|
0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
|
||||||
|
|
||||||
|
/* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
|
||||||
|
CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
|
||||||
|
/* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP,
|
||||||
|
+1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
|
||||||
|
/* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
|
||||||
|
CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
|
||||||
|
/* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP,
|
||||||
|
-1, CMP, CMP, CMP
|
||||||
|
};
|
||||||
|
|
||||||
|
if (p1 == p2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
c1 = *p1++;
|
||||||
|
c2 = *p2++;
|
||||||
|
/* Hint: '0' is a digit too. */
|
||||||
|
state = S_N | (c1 == '0') + (isdigit (c1) != 0);
|
||||||
|
|
||||||
|
while ((diff = c1 - c2) == 0 && c1 != '\0')
|
||||||
|
{
|
||||||
|
state = next_state[state];
|
||||||
|
c1 = *p1++;
|
||||||
|
c2 = *p2++;
|
||||||
|
state |= (c1 == '0') + (isdigit (c1) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = result_type[state << 2 | ((c2 == '0') + (isdigit (c2) != 0))];
|
||||||
|
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case CMP:
|
||||||
|
return diff;
|
||||||
|
|
||||||
|
case LEN:
|
||||||
|
while (isdigit (*p1++))
|
||||||
|
if (!isdigit (*p2++))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return isdigit (*p2) ? -1 : diff;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,6 @@
|
|||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#endif
|
||||||
#include <ansidecl.h>
|
#include <ansidecl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -28,6 +31,7 @@ DEFUN(check, (thing, number), int thing AND int number)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Complain if first two args don't strcmp as equal. */
|
/* Complain if first two args don't strcmp as equal. */
|
||||||
|
void equal(CONST char *a, CONST char *b, int number);
|
||||||
void
|
void
|
||||||
DEFUN(equal, (a, b, number), CONST char *a AND CONST char *b AND int number)
|
DEFUN(equal, (a, b, number), CONST char *a AND CONST char *b AND int number)
|
||||||
{
|
{
|
||||||
@ -54,6 +58,41 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
|
|||||||
check(strcmp("a\203", "a") > 0, 8); /* Tricky if char signed. */
|
check(strcmp("a\203", "a") > 0, 8); /* Tricky if char signed. */
|
||||||
check(strcmp("a\203", "a\003") > 0, 9);
|
check(strcmp("a\203", "a\003") > 0, 9);
|
||||||
|
|
||||||
|
{
|
||||||
|
char buf1[0x40], buf2[0x40];
|
||||||
|
int i, j;
|
||||||
|
for (i=0; i < 0x10; i++)
|
||||||
|
for (j = 0; j < 0x10; j++)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
for (k = 0; k < 0x3f; k++)
|
||||||
|
{
|
||||||
|
buf1[j] = '0' ^ (k & 4);
|
||||||
|
buf2[j] = '4' ^ (k & 4);
|
||||||
|
}
|
||||||
|
buf1[i] = buf1[0x3f] = 0;
|
||||||
|
buf2[j] = buf2[0x3f] = 0;
|
||||||
|
for (k = 0; k < 0xf; k++)
|
||||||
|
{
|
||||||
|
int cnum = 0x10+0x10*k+0x100*j+0x1000*i;
|
||||||
|
check(strcmp(buf1+i,buf2+j) == 0, cnum);
|
||||||
|
buf1[i+k] = 'A' + i + k;
|
||||||
|
buf1[i+k+1] = 0;
|
||||||
|
check(strcmp(buf1+i,buf2+j) > 0, cnum+1);
|
||||||
|
check(strcmp(buf2+j,buf1+i) < 0, cnum+2);
|
||||||
|
buf2[j+k] = 'B' + i + k;
|
||||||
|
buf2[j+k+1] = 0;
|
||||||
|
check(strcmp(buf1+i,buf2+j) < 0, cnum+3);
|
||||||
|
check(strcmp(buf2+j,buf1+i) > 0, cnum+4);
|
||||||
|
buf2[j+k] = 'A' + i + k;
|
||||||
|
buf1[i] = 'A' + i + 0x80;
|
||||||
|
check(strcmp(buf1+i,buf2+j) > 0, cnum+5);
|
||||||
|
check(strcmp(buf2+j,buf1+i) < 0, cnum+6);
|
||||||
|
buf1[i] = 'A' + i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Test strcpy next because we need it to set up other tests. */
|
/* Test strcpy next because we need it to set up other tests. */
|
||||||
it = "strcpy";
|
it = "strcpy";
|
||||||
check(strcpy(one, "abcd") == one, 1); /* Returned value. */
|
check(strcpy(one, "abcd") == one, 1); /* Returned value. */
|
||||||
@ -672,6 +711,43 @@ DEFUN(main, (argc, argv), int argc AND char **argv)
|
|||||||
(void) memset(one+2, 010045, 1);
|
(void) memset(one+2, 010045, 1);
|
||||||
equal(one, "ax\045xe", 6); /* Unsigned char convert. */
|
equal(one, "ax\045xe", 6); /* Unsigned char convert. */
|
||||||
|
|
||||||
|
/* Test for more complex versions of memset, for all alignments and
|
||||||
|
lengths up to 256. This test takes a little while, perhaps it should
|
||||||
|
be made weaker? */
|
||||||
|
{
|
||||||
|
char data[512];
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
int k;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (i = 0; i < 512; i++)
|
||||||
|
data[i] = 'x';
|
||||||
|
for (c = 0; c <= 'y'; c += 'y') /* check for memset(,0,) and
|
||||||
|
memset(,'y',) */
|
||||||
|
for (j = 0; j < 256; j++)
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
memset(data+i,c,j);
|
||||||
|
for (k = 0; k < i; k++)
|
||||||
|
if (data[k] != 'x')
|
||||||
|
goto fail;
|
||||||
|
for (k = i; k < i+j; k++)
|
||||||
|
{
|
||||||
|
if (data[k] != c)
|
||||||
|
goto fail;
|
||||||
|
data[k] = 'x';
|
||||||
|
}
|
||||||
|
for (k = i+j; k < 512; k++)
|
||||||
|
if (data[k] != 'x')
|
||||||
|
goto fail;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
check(0,7+i+j*256+(c != 0)*256*256);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* bcopy - much like memcpy.
|
/* bcopy - much like memcpy.
|
||||||
Berklix manual is silent about overlap, so don't test it. */
|
Berklix manual is silent about overlap, so don't test it. */
|
||||||
it = "bcopy";
|
it = "bcopy";
|
||||||
|
@ -34,7 +34,7 @@ main(int argc, char *argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
45
string/tst-svc.c
Normal file
45
string/tst-svc.c
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* Test for strverscmp() */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define MAX_STRINGS 256
|
||||||
|
#define MAX_LINE_SIZE 32
|
||||||
|
|
||||||
|
int
|
||||||
|
compare (const void *p1, const void *p2)
|
||||||
|
{
|
||||||
|
return strverscmp (*((char **) p1), *((char **) p2));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char line[MAX_LINE_SIZE + 1];
|
||||||
|
char *str[MAX_STRINGS];
|
||||||
|
int count = 0;
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
while (count < MAX_STRINGS && fgets (line, MAX_LINE_SIZE, stdin) != NULL)
|
||||||
|
{
|
||||||
|
n = strlen (line) - 1;
|
||||||
|
|
||||||
|
if (line[n] == '\n')
|
||||||
|
line[n] = '\0';
|
||||||
|
|
||||||
|
str[count] = strdup (line);
|
||||||
|
|
||||||
|
if (str[count] == NULL)
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort (str, count, sizeof (char *), compare);
|
||||||
|
|
||||||
|
for (i = 0; i < count; ++i)
|
||||||
|
puts (str[i]);
|
||||||
|
|
||||||
|
exit (EXIT_SUCCESS);
|
||||||
|
}
|
26
string/tst-svc.expect
Normal file
26
string/tst-svc.expect
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
000
|
||||||
|
001
|
||||||
|
00
|
||||||
|
00a
|
||||||
|
01
|
||||||
|
01a
|
||||||
|
0
|
||||||
|
0a
|
||||||
|
20
|
||||||
|
21
|
||||||
|
22
|
||||||
|
212
|
||||||
|
foo
|
||||||
|
foo-0.4
|
||||||
|
foo-0.4a
|
||||||
|
foo-0.4b
|
||||||
|
foo-0.5
|
||||||
|
foo-0.10.5
|
||||||
|
foo-3.01
|
||||||
|
foo-3.0
|
||||||
|
foo-3.0.0
|
||||||
|
foo-3.0.1
|
||||||
|
foo-3.2
|
||||||
|
foo-3.10
|
||||||
|
foo00
|
||||||
|
foo0
|
26
string/tst-svc.input
Normal file
26
string/tst-svc.input
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
0a
|
||||||
|
00
|
||||||
|
0
|
||||||
|
01
|
||||||
|
001
|
||||||
|
01a
|
||||||
|
00a
|
||||||
|
000
|
||||||
|
20
|
||||||
|
212
|
||||||
|
21
|
||||||
|
22
|
||||||
|
foo0
|
||||||
|
foo00
|
||||||
|
foo-0.4
|
||||||
|
foo-3.0
|
||||||
|
foo
|
||||||
|
foo-3.0.0
|
||||||
|
foo-3.0.1
|
||||||
|
foo-0.5
|
||||||
|
foo-0.4b
|
||||||
|
foo-3.10
|
||||||
|
foo-3.2
|
||||||
|
foo-3.01
|
||||||
|
foo-0.4a
|
||||||
|
foo-0.10.5
|
@ -46,6 +46,7 @@ static char sccsid[] = "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro";
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* XDR for unix authentication parameters.
|
* XDR for unix authentication parameters.
|
||||||
|
* Unfortunately, none of these can be declared const.
|
||||||
*/
|
*/
|
||||||
bool_t
|
bool_t
|
||||||
xdr_authunix_parms (XDR * xdrs, struct authunix_parms *p)
|
xdr_authunix_parms (XDR * xdrs, struct authunix_parms *p)
|
||||||
|
@ -370,7 +370,7 @@ clnt_broadcast (prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult)
|
|||||||
stat = RPC_CANTRECV;
|
stat = RPC_CANTRECV;
|
||||||
goto done_broad;
|
goto done_broad;
|
||||||
}
|
}
|
||||||
if (inlen < sizeof (u_long))
|
if ((size_t) inlen < sizeof (u_long))
|
||||||
goto recv_again;
|
goto recv_again;
|
||||||
/*
|
/*
|
||||||
* see if reply transaction id matches sent id.
|
* see if reply transaction id matches sent id.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/****** rpc_clntout.c ******/
|
/****** rpc_clntout.c ******/
|
||||||
|
|
||||||
void write_stubs(void);
|
void write_stubs(void);
|
||||||
void printarglist(proc_list *proc,
|
void printarglist(proc_list *proc,
|
||||||
const char *addargname, const char *addargtype);
|
const char *addargname, const char *addargtype);
|
||||||
|
|
||||||
/****** rpc_cout.c ******/
|
/****** rpc_cout.c ******/
|
||||||
@ -15,9 +15,9 @@ void emit_single_in_line(declaration *decl, int flag, relation rel);
|
|||||||
void print_datadef(definition *def);
|
void print_datadef(definition *def);
|
||||||
void print_funcdef(definition *def);
|
void print_funcdef(definition *def);
|
||||||
void pxdrfuncdecl(const char *name, int pointerp);
|
void pxdrfuncdecl(const char *name, int pointerp);
|
||||||
void pprocdef(proc_list *proc, version_list *vp,
|
void pprocdef(proc_list *proc, version_list *vp,
|
||||||
const char *addargtype, int server_p, int mode);
|
const char *addargtype, int server_p, int mode);
|
||||||
void pdeclaration(const char *name, declaration *dec, int tab,
|
void pdeclaration(const char *name, declaration *dec, int tab,
|
||||||
const char *separator);
|
const char *separator);
|
||||||
|
|
||||||
/****** rpc_main.c ******/
|
/****** rpc_main.c ******/
|
||||||
@ -36,7 +36,7 @@ void write_sample_clnt_main(void);
|
|||||||
/* see rpc_scan.h */
|
/* see rpc_scan.h */
|
||||||
|
|
||||||
/****** rpc_svcout.c ******/
|
/****** rpc_svcout.c ******/
|
||||||
int nullproc(proc_list *proc);
|
int nullproc(const proc_list *proc);
|
||||||
void write_svc_aux(int nomain);
|
void write_svc_aux(int nomain);
|
||||||
void write_msg_out(void);
|
void write_msg_out(void);
|
||||||
|
|
||||||
|
@ -46,6 +46,10 @@
|
|||||||
|
|
||||||
#define _RPC_AUTH_UNIX_H 1
|
#define _RPC_AUTH_UNIX_H 1
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <rpc/types.h>
|
||||||
|
#include <rpc/auth.h>
|
||||||
|
#include <rpc/xdr.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -38,6 +38,9 @@
|
|||||||
|
|
||||||
#define _RPC_CLNT_H 1
|
#define _RPC_CLNT_H 1
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <rpc/types.h>
|
||||||
|
#include <rpc/auth.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
@ -130,13 +133,13 @@ struct CLIENT {
|
|||||||
AUTH *cl_auth; /* authenticator */
|
AUTH *cl_auth; /* authenticator */
|
||||||
struct clnt_ops {
|
struct clnt_ops {
|
||||||
enum clnt_stat (*cl_call) __P ((CLIENT *, u_long, xdrproc_t,
|
enum clnt_stat (*cl_call) __P ((CLIENT *, u_long, xdrproc_t,
|
||||||
caddr_t, xdrproc_t,
|
caddr_t, xdrproc_t,
|
||||||
caddr_t, struct timeval));
|
caddr_t, struct timeval));
|
||||||
/* call remote procedure */
|
/* call remote procedure */
|
||||||
void (*cl_abort) __P ((void)); /* abort a call */
|
void (*cl_abort) __P ((void)); /* abort a call */
|
||||||
void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
|
void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
|
||||||
/* get specific error code */
|
/* get specific error code */
|
||||||
bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
|
bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
|
||||||
/* frees results */
|
/* frees results */
|
||||||
void (*cl_destroy) __P ((CLIENT *)); /* destroy this structure */
|
void (*cl_destroy) __P ((CLIENT *)); /* destroy this structure */
|
||||||
bool_t (*cl_control) __P ((CLIENT *, int, char *));
|
bool_t (*cl_control) __P ((CLIENT *, int, char *));
|
||||||
@ -270,7 +273,7 @@ struct CLIENT {
|
|||||||
* u_long prog;
|
* u_long prog;
|
||||||
* u_long vers;
|
* u_long vers;
|
||||||
*/
|
*/
|
||||||
extern CLIENT *clntraw_create __P ((__const u_long __prog,
|
extern CLIENT *clntraw_create __P ((__const u_long __prog,
|
||||||
__const u_long __vers));
|
__const u_long __vers));
|
||||||
|
|
||||||
|
|
||||||
@ -283,7 +286,7 @@ extern CLIENT *clntraw_create __P ((__const u_long __prog,
|
|||||||
* u_ong vers; -- version number
|
* u_ong vers; -- version number
|
||||||
* char *prot; -- protocol
|
* char *prot; -- protocol
|
||||||
*/
|
*/
|
||||||
extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
|
extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
|
||||||
__const u_long __vers, __const char *__prot));
|
__const u_long __vers, __const char *__prot));
|
||||||
|
|
||||||
|
|
||||||
@ -334,7 +337,7 @@ extern CLIENT *clntudp_bufcreate __P ((struct sockaddr_in *__raddr,
|
|||||||
int *__sockp, u_int __sendsz,
|
int *__sockp, u_int __sendsz,
|
||||||
u_int __recvsz));
|
u_int __recvsz));
|
||||||
|
|
||||||
extern int callrpc __P ((__const char *__host, __const u_long __prognum,
|
extern int callrpc __P ((__const char *__host, __const u_long __prognum,
|
||||||
__const u_long __versnum, __const u_long __procnum,
|
__const u_long __versnum, __const u_long __procnum,
|
||||||
__const xdrproc_t __inproc, __const char *__in,
|
__const xdrproc_t __inproc, __const char *__in,
|
||||||
__const xdrproc_t __outproc, char *__out));
|
__const xdrproc_t __outproc, char *__out));
|
||||||
@ -354,9 +357,9 @@ extern void clnt_perrno __P ((enum clnt_stat __num)); /* stderr */
|
|||||||
/*
|
/*
|
||||||
* Print an English error message, given the client error code
|
* Print an English error message, given the client error code
|
||||||
*/
|
*/
|
||||||
extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
|
extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
|
||||||
/* stderr */
|
/* stderr */
|
||||||
extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
|
extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
|
||||||
/* string */
|
/* string */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -38,6 +38,8 @@
|
|||||||
#ifndef _RPC_PMAP_CLNT_H
|
#ifndef _RPC_PMAP_CLNT_H
|
||||||
#define _RPC_PMAP_CLNT_H 1
|
#define _RPC_PMAP_CLNT_H 1
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <rpc/types.h>
|
||||||
|
#include <rpc/xdr.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
@ -70,23 +72,23 @@ extern bool_t pmap_set __P ((__const u_long __program, __const u_long __vers,
|
|||||||
extern bool_t pmap_unset __P ((__const u_long __program, __const u_long __vers));
|
extern bool_t pmap_unset __P ((__const u_long __program, __const u_long __vers));
|
||||||
extern struct pmaplist *pmap_getmaps __P ((struct sockaddr_in *__address));
|
extern struct pmaplist *pmap_getmaps __P ((struct sockaddr_in *__address));
|
||||||
extern enum clnt_stat pmap_rmtcall __P ((struct sockaddr_in *__addr,
|
extern enum clnt_stat pmap_rmtcall __P ((struct sockaddr_in *__addr,
|
||||||
__const u_long __prog,
|
__const u_long __prog,
|
||||||
__const u_long __vers,
|
__const u_long __vers,
|
||||||
__const u_long __proc,
|
__const u_long __proc,
|
||||||
xdrproc_t __xdrargs,
|
xdrproc_t __xdrargs,
|
||||||
caddr_t __argsp, xdrproc_t __xdrres,
|
caddr_t __argsp, xdrproc_t __xdrres,
|
||||||
caddr_t __resp, struct timeval __tout,
|
caddr_t __resp, struct timeval __tout,
|
||||||
u_long *__port_ptr));
|
u_long *__port_ptr));
|
||||||
extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
|
extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
|
||||||
__const u_long __vers,
|
__const u_long __vers,
|
||||||
__const u_long __proc,
|
__const u_long __proc,
|
||||||
xdrproc_t __xargs,
|
xdrproc_t __xargs,
|
||||||
caddr_t __argsp,
|
caddr_t __argsp,
|
||||||
xdrproc_t __xresults,
|
xdrproc_t __xresults,
|
||||||
caddr_t __resultsp,
|
caddr_t __resultsp,
|
||||||
resultproc_t __eachresult));
|
resultproc_t __eachresult));
|
||||||
extern u_short pmap_getport __P ((struct sockaddr_in *__address,
|
extern u_short pmap_getport __P ((struct sockaddr_in *__address,
|
||||||
__const u_long __program,
|
__const u_long __program,
|
||||||
__const u_long __version,
|
__const u_long __version,
|
||||||
u_int __protocol));
|
u_int __protocol));
|
||||||
|
|
||||||
|
@ -39,7 +39,9 @@
|
|||||||
|
|
||||||
#define _RPC_PMAP_RMT_H 1
|
#define _RPC_PMAP_RMT_H 1
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <rpc/types.h>
|
||||||
|
#include <rpc/xdr.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#define _RPC_MSG_H 1
|
#define _RPC_MSG_H 1
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
#include <rpc/xdr.h>
|
||||||
#include <rpc/clnt.h>
|
#include <rpc/clnt.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
|
|
||||||
#define __XDR_HEADER__
|
#define __XDR_HEADER__
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <rpc/types.h>
|
||||||
|
|
||||||
/* We need FILE. */
|
/* We need FILE. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -91,8 +93,17 @@ enum xdr_op
|
|||||||
* This is the number of bytes per unit of external data.
|
* This is the number of bytes per unit of external data.
|
||||||
*/
|
*/
|
||||||
#define BYTES_PER_XDR_UNIT (4)
|
#define BYTES_PER_XDR_UNIT (4)
|
||||||
|
/*
|
||||||
|
* This only works if the above is a power of 2. But it's defined to be
|
||||||
|
* 4 by the appropriate RFCs. So it will work. And it's normally quicker
|
||||||
|
* than the old routine.
|
||||||
|
*/
|
||||||
|
#if 1
|
||||||
|
#define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1))
|
||||||
|
#else /* this is the old routine */
|
||||||
#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
|
#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
|
||||||
* BYTES_PER_XDR_UNIT)
|
* BYTES_PER_XDR_UNIT)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The XDR handle.
|
* The XDR handle.
|
||||||
@ -108,7 +119,7 @@ struct XDR
|
|||||||
{
|
{
|
||||||
bool_t (*x_getlong) __P ((XDR * __xdrs, long *__lp));
|
bool_t (*x_getlong) __P ((XDR * __xdrs, long *__lp));
|
||||||
/* get a long from underlying stream */
|
/* get a long from underlying stream */
|
||||||
bool_t (*x_putlong) __P ((XDR * __xdrs, long *__lp));
|
bool_t (*x_putlong) __P ((XDR * __xdrs, __const long *__lp));
|
||||||
/* put a long to " */
|
/* put a long to " */
|
||||||
bool_t (*x_getbytes) __P ((XDR * __xdrs, caddr_t __addr, u_int __len));
|
bool_t (*x_getbytes) __P ((XDR * __xdrs, caddr_t __addr, u_int __len));
|
||||||
/* get some bytes from " */
|
/* get some bytes from " */
|
||||||
@ -243,6 +254,9 @@ struct xdr_discrim
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* These are the "generic" xdr routines.
|
* These are the "generic" xdr routines.
|
||||||
|
* None of these can have const applied because it's not possible to
|
||||||
|
* know whether the call is a read or a write to the passed parameter
|
||||||
|
* also, the XDR structure is always updated by some of these calls.
|
||||||
*/
|
*/
|
||||||
extern bool_t xdr_void __P ((void));
|
extern bool_t xdr_void __P ((void));
|
||||||
extern bool_t xdr_int __P ((XDR * __xdrs, int *__ip));
|
extern bool_t xdr_int __P ((XDR * __xdrs, int *__ip));
|
||||||
@ -294,8 +308,8 @@ extern bool_t xdr_netobj __P ((XDR * __xdrs, struct netobj * __np));
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* XDR using memory buffers */
|
/* XDR using memory buffers */
|
||||||
extern void xdrmem_create __P ((XDR * __xdrs, caddr_t __addr, u_int __size,
|
extern void xdrmem_create __P ((XDR * __xdrs, __const caddr_t __addr,
|
||||||
enum xdr_op __op));
|
u_int __size, enum xdr_op __op));
|
||||||
|
|
||||||
/* XDR using stdio library */
|
/* XDR using stdio library */
|
||||||
extern void xdrstdio_create __P ((XDR * __xdrs, FILE * __file,
|
extern void xdrstdio_create __P ((XDR * __xdrs, FILE * __file,
|
||||||
|
@ -45,10 +45,10 @@ char cout_rcsid[] =
|
|||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
|
|
||||||
static void emit_enum(definition *def);
|
static void emit_enum(definition *def);
|
||||||
static void emit_program(definition *def);
|
static void emit_program(const definition *def);
|
||||||
static void emit_union(definition *def);
|
static void emit_union(const definition *def);
|
||||||
static void emit_struct(definition *def);
|
static void emit_struct(definition *def);
|
||||||
static void emit_typedef(definition *def);
|
static void emit_typedef(const definition *def);
|
||||||
static int findtype(const definition *def, const char *type);
|
static int findtype(const definition *def, const char *type);
|
||||||
static int undefined(const char *type);
|
static int undefined(const char *type);
|
||||||
static void print_generic_header(const char *procname, int pointerp);
|
static void print_generic_header(const char *procname, int pointerp);
|
||||||
@ -59,8 +59,8 @@ static void print_ifclose(int indent);
|
|||||||
static void print_ifstat(int indent, const char *prefix, const char *type,
|
static void print_ifstat(int indent, const char *prefix, const char *type,
|
||||||
relation rel, const char *amax,
|
relation rel, const char *amax,
|
||||||
const char *objname, const char *name);
|
const char *objname, const char *name);
|
||||||
static void print_stat(int indent, declaration *dec);
|
static void print_stat(int indent, const declaration *dec);
|
||||||
static void print_header(definition *def);
|
static void print_header(const definition *def);
|
||||||
static void print_trailer(void);
|
static void print_trailer(void);
|
||||||
static char *upcase(const char *str);
|
static char *upcase(const char *str);
|
||||||
|
|
||||||
@ -77,15 +77,16 @@ emit(definition *def)
|
|||||||
emit_program(def);
|
emit_program(def);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(def->def_kind == DEF_TYPEDEF)
|
if (def->def_kind == DEF_TYPEDEF)
|
||||||
{
|
{
|
||||||
/* now we need to handle declarations like
|
/* now we need to handle declarations like
|
||||||
struct typedef foo foo;
|
struct typedef foo foo;
|
||||||
since we don't want this to be expanded into 2 calls to xdr_foo */
|
since we don't want this to be expanded
|
||||||
|
into 2 calls to xdr_foo */
|
||||||
|
|
||||||
if(strcmp(def->def.ty.old_type,def->def_name)==0)
|
if (strcmp(def->def.ty.old_type,def->def_name)==0)
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
print_header(def);
|
print_header(def);
|
||||||
switch (def->def_kind) {
|
switch (def->def_kind) {
|
||||||
@ -102,7 +103,8 @@ emit(definition *def)
|
|||||||
emit_typedef(def);
|
emit_typedef(def);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* can't happen */
|
/* can't happen */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
print_trailer();
|
print_trailer();
|
||||||
}
|
}
|
||||||
@ -110,7 +112,6 @@ emit(definition *def)
|
|||||||
static int
|
static int
|
||||||
findtype(const definition *def, const char *type)
|
findtype(const definition *def, const char *type)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
|
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
|
||||||
return (0);
|
return (0);
|
||||||
} else {
|
} else {
|
||||||
@ -122,10 +123,7 @@ static int
|
|||||||
undefined(const char *type)
|
undefined(const char *type)
|
||||||
{
|
{
|
||||||
definition *def;
|
definition *def;
|
||||||
|
|
||||||
def = (definition *) FINDVAL(defined, type, findtype);
|
def = (definition *) FINDVAL(defined, type, findtype);
|
||||||
|
|
||||||
|
|
||||||
return (def == NULL);
|
return (def == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,33 +151,25 @@ print_generic_header(const char *procname, int pointerp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_header(definition *def)
|
print_header(const definition *def)
|
||||||
{
|
{
|
||||||
|
print_generic_header(def->def_name,
|
||||||
|
def->def_kind != DEF_TYPEDEF ||
|
||||||
|
!isvectordef(def->def.ty.old_type,
|
||||||
|
def->def.ty.rel));
|
||||||
|
|
||||||
/*
|
/* Now add Inline support */
|
||||||
decl_list *dl;
|
|
||||||
bas_type *ptr;
|
|
||||||
int i;
|
|
||||||
*/
|
|
||||||
|
|
||||||
print_generic_header( def->def_name,
|
|
||||||
def->def_kind != DEF_TYPEDEF ||
|
|
||||||
!isvectordef(def->def.ty.old_type, def->def.ty.rel));
|
|
||||||
|
|
||||||
/* Now add Inline support */
|
|
||||||
|
|
||||||
|
|
||||||
if(inlineflag == 0 )
|
|
||||||
return;
|
|
||||||
/*May cause lint to complain. but ... */
|
|
||||||
f_print(fout, "\t register long *buf;\n\n");
|
|
||||||
|
|
||||||
|
if(inlineflag == 0 )
|
||||||
|
return;
|
||||||
|
/*May cause lint to complain. but ... */
|
||||||
|
f_print(fout, "\t register long *buf;\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_prog_header(proc_list *plist)
|
print_prog_header(const proc_list *plist)
|
||||||
{
|
{
|
||||||
print_generic_header( plist->args.argname, 1 );
|
print_generic_header(plist->args.argname, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -308,7 +298,7 @@ emit_enum(definition *def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_program(definition *def)
|
emit_program(const definition *def)
|
||||||
{
|
{
|
||||||
decl_list *dl;
|
decl_list *dl;
|
||||||
version_list *vlist;
|
version_list *vlist;
|
||||||
@ -327,7 +317,7 @@ emit_program(definition *def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_union(definition *def)
|
emit_union(const definition *def)
|
||||||
{
|
{
|
||||||
declaration *dflt;
|
declaration *dflt;
|
||||||
case_list *cl;
|
case_list *cl;
|
||||||
@ -393,6 +383,8 @@ emit_union(definition *def)
|
|||||||
f_print(fout, "\t}\n");
|
f_print(fout, "\t}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this may be const. i haven't traced this one through yet. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_struct(definition *def)
|
emit_struct(definition *def)
|
||||||
{
|
{
|
||||||
@ -446,9 +438,6 @@ emit_struct(definition *def)
|
|||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
flag=PUT;
|
flag=PUT;
|
||||||
for(j=0; j<2; j++){
|
for(j=0; j<2; j++){
|
||||||
|
|
||||||
@ -605,7 +594,7 @@ emit_struct(definition *def)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_typedef(definition *def)
|
emit_typedef(const definition *def)
|
||||||
{
|
{
|
||||||
const char *prefix = def->def.ty.old_prefix;
|
const char *prefix = def->def.ty.old_prefix;
|
||||||
const char *type = def->def.ty.old_type;
|
const char *type = def->def.ty.old_type;
|
||||||
@ -617,7 +606,7 @@ emit_typedef(definition *def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_stat(int indent, declaration *dec)
|
print_stat(int indent, const declaration *dec)
|
||||||
{
|
{
|
||||||
const char *prefix = dec->prefix;
|
const char *prefix = dec->prefix;
|
||||||
const char *type = dec->type;
|
const char *type = dec->type;
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
|
/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rpc_parse.h, Definitions for the RPCL parser
|
* rpc_parse.h, Definitions for the RPCL parser
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum defkind {
|
enum defkind {
|
||||||
@ -50,7 +50,7 @@ enum relation {
|
|||||||
REL_VECTOR, /* fixed length array */
|
REL_VECTOR, /* fixed length array */
|
||||||
REL_ARRAY, /* variable length array */
|
REL_ARRAY, /* variable length array */
|
||||||
REL_POINTER, /* pointer */
|
REL_POINTER, /* pointer */
|
||||||
REL_ALIAS, /* simple */
|
REL_ALIAS /* simple */
|
||||||
};
|
};
|
||||||
typedef enum relation relation;
|
typedef enum relation relation;
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ struct arg_list {
|
|||||||
const char *argname; /* name of struct for arg*/
|
const char *argname; /* name of struct for arg*/
|
||||||
decl_list *decls;
|
decl_list *decls;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct arg_list arg_list;
|
typedef struct arg_list arg_list;
|
||||||
|
|
||||||
struct proc_list {
|
struct proc_list {
|
||||||
|
@ -51,10 +51,10 @@ static const char ROUTINE[] = "local";
|
|||||||
|
|
||||||
char _errbuf[256]; /* For all messages */
|
char _errbuf[256]; /* For all messages */
|
||||||
|
|
||||||
static void internal_proctype (proc_list * plist);
|
static void internal_proctype (const proc_list * plist);
|
||||||
static void p_xdrfunc (const char *rname, const char *typename);
|
static void p_xdrfunc (const char *rname, const char *typename);
|
||||||
static void write_real_program (definition * def);
|
static void write_real_program (const definition * def);
|
||||||
static void write_program (definition * def, const char *storage);
|
static void write_program (const definition * def, const char *storage);
|
||||||
static void printerr (const char *err, const char *transp);
|
static void printerr (const char *err, const char *transp);
|
||||||
static void printif (const char *proc, const char *transp,
|
static void printif (const char *proc, const char *transp,
|
||||||
const char *prefix, const char *arg);
|
const char *prefix, const char *arg);
|
||||||
@ -78,7 +78,7 @@ p_xdrfunc (const char *rname, const char *typename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
internal_proctype (proc_list * plist)
|
internal_proctype (const proc_list * plist)
|
||||||
{
|
{
|
||||||
f_print (fout, "static ");
|
f_print (fout, "static ");
|
||||||
ptype (plist->res_prefix, plist->res_type, 1);
|
ptype (plist->res_prefix, plist->res_type, 1);
|
||||||
@ -321,7 +321,7 @@ write_programs (const char *storage)
|
|||||||
Unpacks single user argument of printmsg_1 to call-by-value format
|
Unpacks single user argument of printmsg_1 to call-by-value format
|
||||||
expected by printmsg_1. */
|
expected by printmsg_1. */
|
||||||
static void
|
static void
|
||||||
write_real_program (definition * def)
|
write_real_program (const definition * def)
|
||||||
{
|
{
|
||||||
version_list *vp;
|
version_list *vp;
|
||||||
proc_list *proc;
|
proc_list *proc;
|
||||||
@ -388,7 +388,7 @@ write_real_program (definition * def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_program (definition * def, const char *storage)
|
write_program (const definition * def, const char *storage)
|
||||||
{
|
{
|
||||||
version_list *vp;
|
version_list *vp;
|
||||||
proc_list *proc;
|
proc_list *proc;
|
||||||
@ -566,7 +566,7 @@ printif (const char *proc, const char *transp, const char *prefix,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
nullproc (proc_list * proc)
|
nullproc (const proc_list * proc)
|
||||||
{
|
{
|
||||||
for (; proc != NULL; proc = proc->next)
|
for (; proc != NULL; proc = proc->next)
|
||||||
{
|
{
|
||||||
|
15
sunrpc/xdr.c
15
sunrpc/xdr.c
@ -93,10 +93,6 @@ xdr_int (xdrs, ip)
|
|||||||
int *ip;
|
int *ip;
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef lint
|
|
||||||
(void) (xdr_short (xdrs, (short *) ip));
|
|
||||||
return (xdr_long (xdrs, (long *) ip));
|
|
||||||
#else
|
|
||||||
#if INT_MAX < LONG_MAX
|
#if INT_MAX < LONG_MAX
|
||||||
long l;
|
long l;
|
||||||
|
|
||||||
@ -123,7 +119,6 @@ xdr_int (xdrs, ip)
|
|||||||
#else
|
#else
|
||||||
#error unexpected integer sizes in_xdr_int()
|
#error unexpected integer sizes in_xdr_int()
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -134,10 +129,6 @@ xdr_u_int (xdrs, up)
|
|||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
u_int *up;
|
u_int *up;
|
||||||
{
|
{
|
||||||
#ifdef lint
|
|
||||||
(void) (xdr_short (xdrs, (short *) up));
|
|
||||||
return (xdr_u_long (xdrs, (u_long *) up));
|
|
||||||
#else
|
|
||||||
#if UINT_MAX < ULONG_MAX
|
#if UINT_MAX < ULONG_MAX
|
||||||
u_long l;
|
u_long l;
|
||||||
|
|
||||||
@ -164,7 +155,6 @@ xdr_u_int (xdrs, up)
|
|||||||
#else
|
#else
|
||||||
#error unexpected integer sizes in_xdr_u_int()
|
#error unexpected integer sizes in_xdr_u_int()
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -349,7 +339,6 @@ xdr_enum (xdrs, ep)
|
|||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
enum_t *ep;
|
enum_t *ep;
|
||||||
{
|
{
|
||||||
#ifndef lint
|
|
||||||
enum sizecheck
|
enum sizecheck
|
||||||
{
|
{
|
||||||
SIZEVAL
|
SIZEVAL
|
||||||
@ -392,10 +381,6 @@ xdr_enum (xdrs, ep)
|
|||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#else /* lint */
|
|
||||||
(void) (xdr_short (xdrs, (short *) ep));
|
|
||||||
return xdr_long (xdrs, (long *) ep);
|
|
||||||
#endif /* lint */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -87,8 +87,8 @@ static struct sgl_limits {
|
|||||||
|
|
||||||
bool_t
|
bool_t
|
||||||
xdr_float(xdrs, fp)
|
xdr_float(xdrs, fp)
|
||||||
register XDR *xdrs;
|
XDR *xdrs;
|
||||||
register float *fp;
|
float *fp;
|
||||||
{
|
{
|
||||||
#ifdef vax
|
#ifdef vax
|
||||||
struct ieee_single is;
|
struct ieee_single is;
|
||||||
@ -207,8 +207,8 @@ static struct dbl_limits {
|
|||||||
|
|
||||||
bool_t
|
bool_t
|
||||||
xdr_double(xdrs, dp)
|
xdr_double(xdrs, dp)
|
||||||
register XDR *xdrs;
|
XDR *xdrs;
|
||||||
double *dp;
|
double *dp;
|
||||||
{
|
{
|
||||||
#ifdef vax
|
#ifdef vax
|
||||||
struct ieee_double id;
|
struct ieee_double id;
|
||||||
|
@ -47,13 +47,13 @@ static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
|
|||||||
#include <rpc/rpc.h>
|
#include <rpc/rpc.h>
|
||||||
|
|
||||||
static bool_t xdrmem_getlong (XDR *, long *);
|
static bool_t xdrmem_getlong (XDR *, long *);
|
||||||
static bool_t xdrmem_putlong (XDR *, long *);
|
static bool_t xdrmem_putlong (XDR *, const long *);
|
||||||
static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int);
|
static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int);
|
||||||
static bool_t xdrmem_putbytes (XDR *, caddr_t, u_int);
|
static bool_t xdrmem_putbytes (XDR *, const caddr_t, u_int);
|
||||||
static u_int xdrmem_getpos (XDR *);
|
static u_int xdrmem_getpos (const XDR *);
|
||||||
static bool_t xdrmem_setpos (XDR *, u_int);
|
static bool_t xdrmem_setpos (XDR *, u_int);
|
||||||
static long *xdrmem_inline (XDR *, int);
|
static long *xdrmem_inline (XDR *, int);
|
||||||
static void xdrmem_destroy (XDR *);
|
static void xdrmem_destroy (const XDR *);
|
||||||
|
|
||||||
static const struct xdr_ops xdrmem_ops =
|
static const struct xdr_ops xdrmem_ops =
|
||||||
{
|
{
|
||||||
@ -74,7 +74,7 @@ static const struct xdr_ops xdrmem_ops =
|
|||||||
void
|
void
|
||||||
xdrmem_create (xdrs, addr, size, op)
|
xdrmem_create (xdrs, addr, size, op)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
caddr_t addr;
|
const caddr_t addr;
|
||||||
u_int size;
|
u_int size;
|
||||||
enum xdr_op op;
|
enum xdr_op op;
|
||||||
{
|
{
|
||||||
@ -85,11 +85,21 @@ xdrmem_create (xdrs, addr, size, op)
|
|||||||
xdrs->x_handy = size;
|
xdrs->x_handy = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Nothing needs to be done for the memory case. The argument is clearly
|
||||||
|
* const.
|
||||||
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdrmem_destroy (XDR *xdrs)
|
xdrmem_destroy (const XDR *xdrs)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gets the next word from the memory referenced by xdrs and places it
|
||||||
|
* in the long pointed to by lp. It then increments the private word to
|
||||||
|
* point at the next element. Neither object pointed to is const
|
||||||
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_getlong (xdrs, lp)
|
xdrmem_getlong (xdrs, lp)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
@ -103,10 +113,15 @@ xdrmem_getlong (xdrs, lp)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Puts the long pointed to by lp in the memory referenced by xdrs. It
|
||||||
|
* then increments the private word to point at the next element. The
|
||||||
|
* long pointed at is const
|
||||||
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_putlong (xdrs, lp)
|
xdrmem_putlong (xdrs, lp)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
long *lp;
|
const long *lp;
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= 4) < 0)
|
if ((xdrs->x_handy -= 4) < 0)
|
||||||
@ -116,6 +131,12 @@ xdrmem_putlong (xdrs, lp)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gets an unaligned number of bytes from the xdrs structure and writes them
|
||||||
|
* to the address passed in addr. Be very careful when calling this routine
|
||||||
|
* as it could leave the xdrs pointing to an unaligned structure which is not
|
||||||
|
* a good idea. None of the things pointed to are const.
|
||||||
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_getbytes (xdrs, addr, len)
|
xdrmem_getbytes (xdrs, addr, len)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
@ -130,10 +151,14 @@ xdrmem_getbytes (xdrs, addr, len)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The complementary function to the above. The same warnings apply about
|
||||||
|
* unaligned data. The source address is const.
|
||||||
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_putbytes (xdrs, addr, len)
|
xdrmem_putbytes (xdrs, addr, len)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
caddr_t addr;
|
const caddr_t addr;
|
||||||
u_int len;
|
u_int len;
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -144,14 +169,21 @@ xdrmem_putbytes (xdrs, addr, len)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Not sure what this one does. But it clearly doesn't modify the contents
|
||||||
|
* of xdrs. **FIXME** does this not assume u_int == u_long?
|
||||||
|
*/
|
||||||
static u_int
|
static u_int
|
||||||
xdrmem_getpos (xdrs)
|
xdrmem_getpos (xdrs)
|
||||||
XDR *xdrs;
|
const XDR *xdrs;
|
||||||
{
|
{
|
||||||
|
|
||||||
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
|
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* xdrs modified
|
||||||
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_setpos (xdrs, pos)
|
xdrmem_setpos (xdrs, pos)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
@ -167,6 +199,9 @@ xdrmem_setpos (xdrs, pos)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* xdrs modified
|
||||||
|
*/
|
||||||
static long *
|
static long *
|
||||||
xdrmem_inline (xdrs, len)
|
xdrmem_inline (xdrs, len)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
|
@ -54,9 +54,9 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
|
|||||||
#include <rpc/rpc.h>
|
#include <rpc/rpc.h>
|
||||||
|
|
||||||
static bool_t xdrrec_getlong (XDR *, long *);
|
static bool_t xdrrec_getlong (XDR *, long *);
|
||||||
static bool_t xdrrec_putlong (XDR *, long *);
|
static bool_t xdrrec_putlong (XDR *, const long *);
|
||||||
static bool_t xdrrec_getbytes (XDR *, caddr_t, u_int);
|
static bool_t xdrrec_getbytes (XDR *, caddr_t, u_int);
|
||||||
static bool_t xdrrec_putbytes (XDR *, caddr_t, u_int);
|
static bool_t xdrrec_putbytes (XDR *, const caddr_t, u_int);
|
||||||
static u_int xdrrec_getpos (XDR *);
|
static u_int xdrrec_getpos (XDR *);
|
||||||
static bool_t xdrrec_setpos (XDR *, u_int);
|
static bool_t xdrrec_setpos (XDR *, u_int);
|
||||||
static long *xdrrec_inline (XDR *, int);
|
static long *xdrrec_inline (XDR *, int);
|
||||||
@ -221,7 +221,7 @@ xdrrec_getlong (xdrs, lp)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrrec_putlong (xdrs, lp)
|
xdrrec_putlong (xdrs, lp)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
long *lp;
|
const long *lp;
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
|
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
|
||||||
@ -276,7 +276,7 @@ xdrrec_getbytes (xdrs, addr, len)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrrec_putbytes (xdrs, addr, len)
|
xdrrec_putbytes (xdrs, addr, len)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
caddr_t addr;
|
const caddr_t addr;
|
||||||
u_int len;
|
u_int len;
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
|
@ -46,9 +46,9 @@ static char sccsid[] = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
|
|||||||
#include <rpc/xdr.h>
|
#include <rpc/xdr.h>
|
||||||
|
|
||||||
static bool_t xdrstdio_getlong (XDR *, long *);
|
static bool_t xdrstdio_getlong (XDR *, long *);
|
||||||
static bool_t xdrstdio_putlong (XDR *, long *);
|
static bool_t xdrstdio_putlong (XDR *, const long *);
|
||||||
static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
|
static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
|
||||||
static bool_t xdrstdio_putbytes (XDR *, caddr_t, u_int);
|
static bool_t xdrstdio_putbytes (XDR *, const caddr_t, u_int);
|
||||||
static u_int xdrstdio_getpos (XDR *);
|
static u_int xdrstdio_getpos (XDR *);
|
||||||
static bool_t xdrstdio_setpos (XDR *, u_int);
|
static bool_t xdrstdio_setpos (XDR *, u_int);
|
||||||
static long *xdrstdio_inline (XDR *, int);
|
static long *xdrstdio_inline (XDR *, int);
|
||||||
@ -114,7 +114,7 @@ xdrstdio_getlong (xdrs, lp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_putlong (XDR *xdrs, long *lp)
|
xdrstdio_putlong (XDR *xdrs, const long *lp)
|
||||||
{
|
{
|
||||||
|
|
||||||
long mycopy = htonl (*lp);
|
long mycopy = htonl (*lp);
|
||||||
@ -127,7 +127,7 @@ xdrstdio_putlong (XDR *xdrs, long *lp)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_getbytes (xdrs, addr, len)
|
xdrstdio_getbytes (xdrs, addr, len)
|
||||||
XDR *xdrs;
|
XDR *xdrs;
|
||||||
caddr_t addr;
|
const caddr_t addr;
|
||||||
u_int len;
|
u_int len;
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ xdrstdio_getbytes (xdrs, addr, len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_putbytes (XDR *xdrs, caddr_t addr, u_int len)
|
xdrstdio_putbytes (XDR *xdrs, const caddr_t addr, u_int len)
|
||||||
{
|
{
|
||||||
if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
|
if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
#define _RPC_AUTH_H 1
|
#define _RPC_AUTH_H 1
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <rpc/types.h>
|
||||||
#include <rpc/xdr.h>
|
#include <rpc/xdr.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
@ -99,7 +101,7 @@ struct AUTH {
|
|||||||
struct auth_ops {
|
struct auth_ops {
|
||||||
void (*ah_nextverf) __P ((AUTH *));
|
void (*ah_nextverf) __P ((AUTH *));
|
||||||
int (*ah_marshal) __P ((AUTH *, XDR *)); /* nextverf & serialize */
|
int (*ah_marshal) __P ((AUTH *, XDR *)); /* nextverf & serialize */
|
||||||
int (*ah_validate) __P ((AUTH *, struct opaque_auth *));
|
int (*ah_validate) __P ((AUTH *, struct opaque_auth *));
|
||||||
/* validate verifier */
|
/* validate verifier */
|
||||||
int (*ah_refresh) __P ((AUTH *)); /* refresh credentials */
|
int (*ah_refresh) __P ((AUTH *)); /* refresh credentials */
|
||||||
void (*ah_destroy) __P ((AUTH *)); /* destroy this structure */
|
void (*ah_destroy) __P ((AUTH *)); /* destroy this structure */
|
||||||
@ -163,7 +165,7 @@ extern AUTH *authunix_create __P ((char *__machname, __uid_t __uid,
|
|||||||
__gid_t *__aup_gids));
|
__gid_t *__aup_gids));
|
||||||
extern AUTH *authunix_create_default __P ((void));
|
extern AUTH *authunix_create_default __P ((void));
|
||||||
extern AUTH *authnone_create __P ((void));
|
extern AUTH *authnone_create __P ((void));
|
||||||
extern AUTH *authdes_create __P ((char *__servername, u_int __window,
|
extern AUTH *authdes_create __P ((char *__servername, u_int __window,
|
||||||
struct sockaddr *__syncaddr,
|
struct sockaddr *__syncaddr,
|
||||||
des_block *__ckey));
|
des_block *__ckey));
|
||||||
|
|
||||||
|
@ -460,7 +460,7 @@ __finite (double __x)
|
|||||||
{
|
{
|
||||||
register int __result;
|
register int __result;
|
||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
("orl $x0x800fffff, %0\n\t"
|
("orl $0x800fffff, %0\n\t"
|
||||||
"incl %0\n\t"
|
"incl %0\n\t"
|
||||||
"shrl $31, %0"
|
"shrl $31, %0"
|
||||||
: "=q" (__result) : "0" (((int *) &__x)[1]));
|
: "=q" (__result) : "0" (((int *) &__x)[1]));
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
|
/* Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,6 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
@ -310,9 +309,8 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old,
|
|||||||
set *OLD to the old value of timer WHICH.
|
set *OLD to the old value of timer WHICH.
|
||||||
Returns 0 on success, -1 on errors. */
|
Returns 0 on success, -1 on errors. */
|
||||||
int
|
int
|
||||||
DEFUN(__setitimer, (which, new, old),
|
__setitimer (enum __itimer_which which, const struct itimerval *new,
|
||||||
enum __itimer_which which AND
|
struct itimerval *old)
|
||||||
struct itimerval *new AND struct itimerval *old)
|
|
||||||
{
|
{
|
||||||
void *crit;
|
void *crit;
|
||||||
|
|
||||||
|
1
sysdeps/powerpc/Dist
Normal file
1
sysdeps/powerpc/Dist
Normal file
@ -0,0 +1 @@
|
|||||||
|
fenv_libc.h
|
3
sysdeps/powerpc/Makefile
Normal file
3
sysdeps/powerpc/Makefile
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(subdir),math)
|
||||||
|
libm-support += fenv_const
|
||||||
|
endif
|
@ -22,46 +22,46 @@
|
|||||||
#include <jmp_buf.h>
|
#include <jmp_buf.h>
|
||||||
|
|
||||||
ENTRY (__longjmp)
|
ENTRY (__longjmp)
|
||||||
lwz 1,(JB_GPR1*4)(3)
|
lwz %r1,(JB_GPR1*4)(%r3)
|
||||||
lwz 2,(JB_GPR2*4)(3)
|
lwz %r2,(JB_GPR2*4)(%r3)
|
||||||
lwz 0,(JB_LR*4)(3)
|
lwz %r0,(JB_LR*4)(%r3)
|
||||||
lwz 14,((JB_GPRS+0)*4)(3)
|
lwz %r14,((JB_GPRS+0)*4)(%r3)
|
||||||
lfd 14,((JB_FPRS+0*2)*4)(3)
|
lfd %f14,((JB_FPRS+0*2)*4)(%r3)
|
||||||
lwz 15,((JB_GPRS+1)*4)(3)
|
lwz %r15,((JB_GPRS+1)*4)(%r3)
|
||||||
lfd 15,((JB_FPRS+1*2)*4)(3)
|
lfd %f15,((JB_FPRS+1*2)*4)(%r3)
|
||||||
lwz 16,((JB_GPRS+2)*4)(3)
|
lwz %r16,((JB_GPRS+2)*4)(%r3)
|
||||||
lfd 16,((JB_FPRS+2*2)*4)(3)
|
lfd %f16,((JB_FPRS+2*2)*4)(%r3)
|
||||||
lwz 17,((JB_GPRS+3)*4)(3)
|
lwz %r17,((JB_GPRS+3)*4)(%r3)
|
||||||
lfd 17,((JB_FPRS+3*2)*4)(3)
|
lfd %f17,((JB_FPRS+3*2)*4)(%r3)
|
||||||
lwz 18,((JB_GPRS+4)*4)(3)
|
lwz %r18,((JB_GPRS+4)*4)(%r3)
|
||||||
lfd 18,((JB_FPRS+4*2)*4)(3)
|
lfd %f18,((JB_FPRS+4*2)*4)(%r3)
|
||||||
lwz 19,((JB_GPRS+5)*4)(3)
|
lwz %r19,((JB_GPRS+5)*4)(%r3)
|
||||||
lfd 19,((JB_FPRS+5*2)*4)(3)
|
lfd %f19,((JB_FPRS+5*2)*4)(%r3)
|
||||||
lwz 20,((JB_GPRS+6)*4)(3)
|
lwz %r20,((JB_GPRS+6)*4)(%r3)
|
||||||
lfd 20,((JB_FPRS+6*2)*4)(3)
|
lfd %f20,((JB_FPRS+6*2)*4)(%r3)
|
||||||
mtlr 0
|
mtlr %r0
|
||||||
lwz 21,((JB_GPRS+7)*4)(3)
|
lwz %r21,((JB_GPRS+7)*4)(%r3)
|
||||||
lfd 21,((JB_FPRS+7*2)*4)(3)
|
lfd %f21,((JB_FPRS+7*2)*4)(%r3)
|
||||||
lwz 22,((JB_GPRS+8)*4)(3)
|
lwz %r22,((JB_GPRS+8)*4)(%r3)
|
||||||
lfd 22,((JB_FPRS+8*2)*4)(3)
|
lfd %f22,((JB_FPRS+8*2)*4)(%r3)
|
||||||
lwz 23,((JB_GPRS+9)*4)(3)
|
lwz %r23,((JB_GPRS+9)*4)(%r3)
|
||||||
lfd 23,((JB_FPRS+9*2)*4)(3)
|
lfd %f23,((JB_FPRS+9*2)*4)(%r3)
|
||||||
lwz 24,((JB_GPRS+10)*4)(3)
|
lwz %r24,((JB_GPRS+10)*4)(%r3)
|
||||||
lfd 24,((JB_FPRS+10*2)*4)(3)
|
lfd %f24,((JB_FPRS+10*2)*4)(%r3)
|
||||||
lwz 25,((JB_GPRS+11)*4)(3)
|
lwz %r25,((JB_GPRS+11)*4)(%r3)
|
||||||
lfd 25,((JB_FPRS+11*2)*4)(3)
|
lfd %f25,((JB_FPRS+11*2)*4)(%r3)
|
||||||
lwz 26,((JB_GPRS+12)*4)(3)
|
lwz %r26,((JB_GPRS+12)*4)(%r3)
|
||||||
lfd 26,((JB_FPRS+12*2)*4)(3)
|
lfd %f26,((JB_FPRS+12*2)*4)(%r3)
|
||||||
lwz 27,((JB_GPRS+13)*4)(3)
|
lwz %r27,((JB_GPRS+13)*4)(%r3)
|
||||||
lfd 27,((JB_FPRS+13*2)*4)(3)
|
lfd %f27,((JB_FPRS+13*2)*4)(%r3)
|
||||||
lwz 28,((JB_GPRS+14)*4)(3)
|
lwz %r28,((JB_GPRS+14)*4)(%r3)
|
||||||
lfd 28,((JB_FPRS+14*2)*4)(3)
|
lfd %f28,((JB_FPRS+14*2)*4)(%r3)
|
||||||
lwz 29,((JB_GPRS+15)*4)(3)
|
lwz %r29,((JB_GPRS+15)*4)(%r3)
|
||||||
lfd 29,((JB_FPRS+15*2)*4)(3)
|
lfd %f29,((JB_FPRS+15*2)*4)(%r3)
|
||||||
lwz 30,((JB_GPRS+16)*4)(3)
|
lwz %r30,((JB_GPRS+16)*4)(%r3)
|
||||||
lfd 30,((JB_FPRS+16*2)*4)(3)
|
lfd %f30,((JB_FPRS+16*2)*4)(%r3)
|
||||||
lwz 31,((JB_GPRS+17)*4)(3)
|
lwz %r31,((JB_GPRS+17)*4)(%r3)
|
||||||
lfd 31,((JB_FPRS+17*2)*4)(3)
|
lfd %f31,((JB_FPRS+17*2)*4)(%r3)
|
||||||
mr 3,4
|
mr %r3,%r4
|
||||||
blr
|
blr
|
||||||
END (__longjmp)
|
END (__longjmp)
|
||||||
|
@ -64,25 +64,6 @@ fabs (double __x)
|
|||||||
return __value;
|
return __value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Optimized versions for some non-standardized functions. */
|
|
||||||
#ifdef __USE_MISC
|
|
||||||
|
|
||||||
__MATH_INLINE double hypot (double __x, double __y);
|
|
||||||
__MATH_INLINE double
|
|
||||||
hypot (double __x, double __y)
|
|
||||||
{
|
|
||||||
return sqrt (__x * __x + __y * __y);
|
|
||||||
}
|
|
||||||
|
|
||||||
__MATH_INLINE double __sgn (double __x);
|
|
||||||
__MATH_INLINE double
|
|
||||||
sgn (double __x)
|
|
||||||
{
|
|
||||||
return (__x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __USE_MISC */
|
|
||||||
|
|
||||||
#endif /* __NO_MATH_INLINES */
|
#endif /* __NO_MATH_INLINES */
|
||||||
#endif /* __GNUC__ */
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
ENTRY (_setjmp)
|
ENTRY (_setjmp)
|
||||||
li 4,0 /* Set second argument to 0. */
|
li %r4,0 /* Set second argument to 0. */
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
b __sigsetjmp@plt
|
b __sigsetjmp@plt
|
||||||
#else
|
#else
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
ENTRY (__setjmp)
|
ENTRY (__setjmp)
|
||||||
li 4,1 /* Set second argument to 1. */
|
li %r4,1 /* Set second argument to 1. */
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
b __sigsetjmp@plt
|
b __sigsetjmp@plt
|
||||||
#else
|
#else
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef dl_machine_h
|
||||||
|
#define dl_machine_h
|
||||||
|
|
||||||
#define ELF_MACHINE_NAME "powerpc"
|
#define ELF_MACHINE_NAME "powerpc"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -134,318 +137,13 @@ elf_machine_load_address (void)
|
|||||||
|
|
||||||
/* So now work out the difference between where the branch actually points,
|
/* So now work out the difference between where the branch actually points,
|
||||||
and the offset of that location in memory from the start of the file. */
|
and the offset of that location in memory from the start of the file. */
|
||||||
return (Elf32_Addr)branchaddr - *got +
|
return ((Elf32_Addr)branchaddr - *got
|
||||||
(*branchaddr & 0x3fffffc |
|
+ (*branchaddr & 0x3fffffc
|
||||||
(int)(*branchaddr << 6 & 0x80000000) >> 6);
|
| (int)(*branchaddr << 6 & 0x80000000) >> 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) /* nothing */
|
#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) /* nothing */
|
||||||
|
|
||||||
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
|
||||||
LOADADDR is the load address of the object; INFO is an array indexed
|
|
||||||
by DT_* of the .dynamic section info. */
|
|
||||||
|
|
||||||
#ifdef RESOLVE
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|
||||||
const Elf32_Sym *sym, const struct r_found_version *version)
|
|
||||||
{
|
|
||||||
const Elf32_Sym *const refsym = sym;
|
|
||||||
Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
|
|
||||||
Elf32_Word loadbase, finaladdr;
|
|
||||||
const int rinfo = ELF32_R_TYPE (reloc->r_info);
|
|
||||||
|
|
||||||
if (rinfo == R_PPC_NONE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
assert (sym != NULL);
|
|
||||||
if (ELF32_ST_TYPE (sym->st_info) == STT_SECTION ||
|
|
||||||
rinfo == R_PPC_RELATIVE)
|
|
||||||
{
|
|
||||||
/* Has already been relocated. */
|
|
||||||
loadbase = map->l_addr;
|
|
||||||
finaladdr = loadbase + reloc->r_addend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int flags;
|
|
||||||
|
|
||||||
/* We never want to use a PLT entry as the destination of a
|
|
||||||
reloc, when what is being relocated is a branch. This is
|
|
||||||
partly for efficiency, but mostly so we avoid loops. */
|
|
||||||
if (rinfo == R_PPC_REL24 ||
|
|
||||||
rinfo == R_PPC_ADDR24 ||
|
|
||||||
rinfo == R_PPC_JMP_SLOT)
|
|
||||||
flags = DL_LOOKUP_NOPLT;
|
|
||||||
else if (rinfo == R_PPC_COPY)
|
|
||||||
flags = DL_LOOKUP_NOEXEC;
|
|
||||||
else
|
|
||||||
flags = 0;
|
|
||||||
|
|
||||||
loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version, flags));
|
|
||||||
if (sym == NULL)
|
|
||||||
{
|
|
||||||
/* Weak symbol that wasn't actually defined anywhere. */
|
|
||||||
assert(loadbase == 0);
|
|
||||||
finaladdr = reloc->r_addend;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
|
|
||||||
+ reloc->r_addend);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is an if/else if chain because GCC 2.7.2.[012] turns case
|
|
||||||
statements into non-PIC table lookups. When a later version
|
|
||||||
comes out that fixes this, this should be changed. */
|
|
||||||
if (rinfo == R_PPC_UADDR32 ||
|
|
||||||
rinfo == R_PPC_GLOB_DAT ||
|
|
||||||
rinfo == R_PPC_ADDR32 ||
|
|
||||||
rinfo == R_PPC_RELATIVE)
|
|
||||||
{
|
|
||||||
*reloc_addr = finaladdr;
|
|
||||||
}
|
|
||||||
else if (rinfo == R_PPC_ADDR16_LO)
|
|
||||||
{
|
|
||||||
*(Elf32_Half*) reloc_addr = finaladdr;
|
|
||||||
}
|
|
||||||
else if (rinfo == R_PPC_ADDR16_HI)
|
|
||||||
{
|
|
||||||
*(Elf32_Half*) reloc_addr = finaladdr >> 16;
|
|
||||||
}
|
|
||||||
else if (rinfo == R_PPC_ADDR16_HA)
|
|
||||||
{
|
|
||||||
*(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
|
|
||||||
}
|
|
||||||
#ifndef RTLD_BOOTSTRAP
|
|
||||||
else if (rinfo == R_PPC_REL24)
|
|
||||||
{
|
|
||||||
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
|
|
||||||
if (delta << 6 >> 6 != delta)
|
|
||||||
_dl_signal_error (0, map->l_name,
|
|
||||||
"R_PPC_REL24 relocation out of range");
|
|
||||||
*reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
|
|
||||||
}
|
|
||||||
else if (rinfo == R_PPC_ADDR24)
|
|
||||||
{
|
|
||||||
if (finaladdr << 6 >> 6 != finaladdr)
|
|
||||||
_dl_signal_error (0, map->l_name,
|
|
||||||
"R_PPC_ADDR24 relocation out of range");
|
|
||||||
*reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
|
|
||||||
}
|
|
||||||
else if (rinfo == R_PPC_COPY)
|
|
||||||
{
|
|
||||||
if (sym->st_size != refsym->st_size)
|
|
||||||
{
|
|
||||||
const char *strtab;
|
|
||||||
|
|
||||||
strtab = ((void *) map->l_addr
|
|
||||||
+ map->l_info[DT_STRTAB]->d_un.d_ptr);
|
|
||||||
_dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
|
|
||||||
"' has different size in shared object, "
|
|
||||||
"consider re-linking\n", NULL);
|
|
||||||
}
|
|
||||||
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
|
|
||||||
refsym->st_size));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else if (rinfo == R_PPC_REL32)
|
|
||||||
{
|
|
||||||
*reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
|
|
||||||
}
|
|
||||||
else if (rinfo == R_PPC_JMP_SLOT)
|
|
||||||
{
|
|
||||||
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
|
|
||||||
if (delta << 6 >> 6 == delta)
|
|
||||||
*reloc_addr = OPCODE_B (delta);
|
|
||||||
else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
|
|
||||||
*reloc_addr = OPCODE_BA (finaladdr);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Elf32_Word *plt;
|
|
||||||
Elf32_Word index;
|
|
||||||
|
|
||||||
plt = (Elf32_Word *)((char *)map->l_addr
|
|
||||||
+ map->l_info[DT_PLTGOT]->d_un.d_val);
|
|
||||||
index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
|
|
||||||
|
|
||||||
if (index >= PLT_DOUBLE_SIZE)
|
|
||||||
{
|
|
||||||
/* Slots greater than or equal to 2^13 have 4 words available
|
|
||||||
instead of two. */
|
|
||||||
reloc_addr[0] = OPCODE_LI (11, finaladdr);
|
|
||||||
reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
|
|
||||||
reloc_addr[2] = OPCODE_MTCTR (11);
|
|
||||||
reloc_addr[3] = OPCODE_BCTR ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Elf32_Word num_plt_entries;
|
|
||||||
|
|
||||||
num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
|
|
||||||
/ sizeof(Elf32_Rela));
|
|
||||||
|
|
||||||
reloc_addr[0] = OPCODE_LI (11, index*4);
|
|
||||||
reloc_addr[1] =
|
|
||||||
OPCODE_B (-(4*(index*2
|
|
||||||
+ 1
|
|
||||||
- PLT_LONGBRANCH_ENTRY_WORDS
|
|
||||||
+ PLT_INITIAL_ENTRY_WORDS)));
|
|
||||||
plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MODIFIED_CODE (reloc_addr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
assert (! "unexpected dynamic reloc type");
|
|
||||||
|
|
||||||
if (rinfo == R_PPC_ADDR16_LO ||
|
|
||||||
rinfo == R_PPC_ADDR16_HI ||
|
|
||||||
rinfo == R_PPC_ADDR16_HA ||
|
|
||||||
rinfo == R_PPC_REL24 ||
|
|
||||||
rinfo == R_PPC_ADDR24)
|
|
||||||
MODIFIED_CODE_NOQUEUE (reloc_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ELF_MACHINE_NO_REL 1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
|
||||||
PLT entries should not be allowed to define the value. */
|
|
||||||
#define elf_machine_pltrel_p(type) ((type) == R_PPC_JMP_SLOT)
|
|
||||||
|
|
||||||
/* Set up the loaded object described by L so its unrelocated PLT
|
|
||||||
entries will jump to the on-demand fixup code in dl-runtime.c.
|
|
||||||
Also install a small trampoline to be used by entries that have
|
|
||||||
been relocated to an address too far away for a single branch. */
|
|
||||||
|
|
||||||
/* A PLT entry does one of three things:
|
|
||||||
(i) Jumps to the actual routine. Such entries are set up above, in
|
|
||||||
elf_machine_rela.
|
|
||||||
|
|
||||||
(ii) Jumps to the actual routine via glue at the start of the PLT.
|
|
||||||
We do this by putting the address of the routine in space
|
|
||||||
allocated at the end of the PLT, and when the PLT entry is
|
|
||||||
called we load the offset of that word (from the start of the
|
|
||||||
space) into r11, then call the glue, which loads the word and
|
|
||||||
branches to that address. These entries are set up in
|
|
||||||
elf_machine_rela, but the glue is set up here.
|
|
||||||
|
|
||||||
(iii) Loads the index of this PLT entry (we count the double-size
|
|
||||||
entries as one entry for this purpose) into r11, then
|
|
||||||
branches to code at the start of the PLT. This code then
|
|
||||||
calls `fixup', in dl-runtime.c, via the glue in the macro
|
|
||||||
ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
|
|
||||||
be one of the above two types. These entries are set up here. */
|
|
||||||
static inline void
|
|
||||||
elf_machine_runtime_setup (struct link_map *map, int lazy)
|
|
||||||
{
|
|
||||||
if (map->l_info[DT_JMPREL])
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
/* Fill in the PLT. Its initial contents are directed to a
|
|
||||||
function earlier in the PLT which arranges for the dynamic
|
|
||||||
linker to be called back. */
|
|
||||||
Elf32_Word *plt = (Elf32_Word *) ((char *) map->l_addr
|
|
||||||
+ map->l_info[DT_PLTGOT]->d_un.d_val);
|
|
||||||
Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
|
|
||||||
/ sizeof (Elf32_Rela));
|
|
||||||
Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
|
|
||||||
extern void _dl_runtime_resolve (void);
|
|
||||||
Elf32_Word size_modified;
|
|
||||||
|
|
||||||
if (lazy)
|
|
||||||
for (i = 0; i < num_plt_entries; i++)
|
|
||||||
{
|
|
||||||
Elf32_Word offset = PLT_ENTRY_START_WORDS (i);
|
|
||||||
|
|
||||||
if (i >= PLT_DOUBLE_SIZE)
|
|
||||||
{
|
|
||||||
plt[offset ] = OPCODE_LI (11, i * 4);
|
|
||||||
plt[offset+1] = OPCODE_ADDIS (11, 11, (i * 4 + 0x8000) >> 16);
|
|
||||||
plt[offset+2] = OPCODE_B (-(4 * (offset + 2)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
plt[offset ] = OPCODE_LI (11, i * 4);
|
|
||||||
plt[offset+1] = OPCODE_B (-(4 * (offset + 1)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Multiply index of entry by 3 (in r11). */
|
|
||||||
plt[0] = OPCODE_SLWI (12, 11, 1);
|
|
||||||
plt[1] = OPCODE_ADD (11, 12, 11);
|
|
||||||
if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
|
|
||||||
(Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
|
|
||||||
{
|
|
||||||
/* Load address of link map in r12. */
|
|
||||||
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
|
|
||||||
plt[3] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
|
|
||||||
+ 0x8000) >> 16));
|
|
||||||
|
|
||||||
/* Call _dl_runtime_resolve. */
|
|
||||||
plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Get address of _dl_runtime_resolve in CTR. */
|
|
||||||
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
|
|
||||||
plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
|
|
||||||
_dl_runtime_resolve)
|
|
||||||
+ 0x8000) >> 16));
|
|
||||||
plt[4] = OPCODE_MTCTR (12);
|
|
||||||
|
|
||||||
/* Load address of link map in r12. */
|
|
||||||
plt[5] = OPCODE_LI (12, (Elf32_Word) (char *) map);
|
|
||||||
plt[6] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
|
|
||||||
+ 0x8000) >> 16));
|
|
||||||
|
|
||||||
/* Call _dl_runtime_resolve. */
|
|
||||||
plt[7] = OPCODE_BCTR ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Convert the index in r11 into an actual address, and get the
|
|
||||||
word at that address. */
|
|
||||||
plt[PLT_LONGBRANCH_ENTRY_WORDS] =
|
|
||||||
OPCODE_ADDIS (11, 11, (((Elf32_Word) (char*) (plt + rel_offset_words)
|
|
||||||
+ 0x8000) >> 16));
|
|
||||||
plt[PLT_LONGBRANCH_ENTRY_WORDS+1] =
|
|
||||||
OPCODE_LWZ (11, (Elf32_Word) (char*) (plt+rel_offset_words), 11);
|
|
||||||
|
|
||||||
/* Call the procedure at that address. */
|
|
||||||
plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR (11);
|
|
||||||
plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR ();
|
|
||||||
|
|
||||||
|
|
||||||
/* Now, we've modified code (quite a lot of code, possibly). We
|
|
||||||
need to write the changes from the data cache to a
|
|
||||||
second-level unified cache, then make sure that stale data in
|
|
||||||
the instruction cache is removed. (In a multiprocessor
|
|
||||||
system, the effect is more complex.)
|
|
||||||
|
|
||||||
Assumes the cache line size is at least 32 bytes, or at least
|
|
||||||
that dcbst and icbi apply to 32-byte lines. At present, all
|
|
||||||
PowerPC processors have line sizes of exactly 32 bytes. */
|
|
||||||
|
|
||||||
size_modified = lazy ? rel_offset_words : PLT_INITIAL_ENTRY_WORDS;
|
|
||||||
for (i = 0; i < size_modified; i+=8)
|
|
||||||
PPC_DCBST (plt + i);
|
|
||||||
PPC_SYNC;
|
|
||||||
for (i = 0; i < size_modified; i+=8)
|
|
||||||
PPC_ICBI (plt + i);
|
|
||||||
PPC_ISYNC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
|
|
||||||
{
|
|
||||||
assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
|
|
||||||
/* elf_machine_runtime_setup handles this. */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The PLT uses Elf32_Rela relocs. */
|
/* The PLT uses Elf32_Rela relocs. */
|
||||||
#define elf_machine_relplt elf_machine_rela
|
#define elf_machine_relplt elf_machine_rela
|
||||||
|
|
||||||
@ -617,7 +315,7 @@ _start:
|
|||||||
information here about the way memory is mapped. */
|
information here about the way memory is mapped. */
|
||||||
|
|
||||||
#define ELF_PREFERRED_ADDRESS_DATA \
|
#define ELF_PREFERRED_ADDRESS_DATA \
|
||||||
static ElfW(Addr) _dl_preferred_address = 1;
|
static ElfW(Addr) _dl_preferred_address = 1
|
||||||
|
|
||||||
#define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) \
|
#define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) \
|
||||||
( { \
|
( { \
|
||||||
@ -645,4 +343,326 @@ static ElfW(Addr) _dl_preferred_address = 1;
|
|||||||
_dl_preferred_address = mapstart; \
|
_dl_preferred_address = mapstart; \
|
||||||
} )
|
} )
|
||||||
|
|
||||||
|
/* We require the address of the PLT entry returned from fixup, not
|
||||||
|
the first word of the PLT entry. */
|
||||||
#define ELF_FIXUP_RETURNS_ADDRESS 1
|
#define ELF_FIXUP_RETURNS_ADDRESS 1
|
||||||
|
|
||||||
|
/* Nonzero iff TYPE should not be allowed to resolve to one of
|
||||||
|
the main executable's symbols, as for a COPY reloc. */
|
||||||
|
#define elf_machine_lookup_noexec_p(type) ((type) == R_PPC_COPY)
|
||||||
|
|
||||||
|
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
||||||
|
PLT entries should not be allowed to define the value. */
|
||||||
|
/* We never want to use a PLT entry as the destination of a
|
||||||
|
reloc, when what is being relocated is a branch. This is
|
||||||
|
partly for efficiency, but mostly so we avoid loops. */
|
||||||
|
#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC_REL24 || \
|
||||||
|
(type) == R_PPC_ADDR24 || \
|
||||||
|
(type) == R_PPC_JMP_SLOT)
|
||||||
|
|
||||||
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
|
#define ELF_MACHINE_RELOC_NOPLT R_PPC_JMP_SLOT
|
||||||
|
|
||||||
|
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
||||||
|
PLT entries should not be allowed to define the value. */
|
||||||
|
#define elf_machine_pltrel_p(type) ((type) == R_PPC_JMP_SLOT)
|
||||||
|
|
||||||
|
/* Set up the loaded object described by L so its unrelocated PLT
|
||||||
|
entries will jump to the on-demand fixup code in dl-runtime.c.
|
||||||
|
Also install a small trampoline to be used by entries that have
|
||||||
|
been relocated to an address too far away for a single branch. */
|
||||||
|
|
||||||
|
/* A PLT entry does one of three things:
|
||||||
|
(i) Jumps to the actual routine. Such entries are set up above, in
|
||||||
|
elf_machine_rela.
|
||||||
|
|
||||||
|
(ii) Jumps to the actual routine via glue at the start of the PLT.
|
||||||
|
We do this by putting the address of the routine in space
|
||||||
|
allocated at the end of the PLT, and when the PLT entry is
|
||||||
|
called we load the offset of that word (from the start of the
|
||||||
|
space) into r11, then call the glue, which loads the word and
|
||||||
|
branches to that address. These entries are set up in
|
||||||
|
elf_machine_rela, but the glue is set up here.
|
||||||
|
|
||||||
|
(iii) Loads the index of this PLT entry (we count the double-size
|
||||||
|
entries as one entry for this purpose) into r11, then
|
||||||
|
branches to code at the start of the PLT. This code then
|
||||||
|
calls `fixup', in dl-runtime.c, via the glue in the macro
|
||||||
|
ELF_MACHINE_RUNTIME_TRAMPOLINE, which resets the PLT entry to
|
||||||
|
be one of the above two types. These entries are set up here. */
|
||||||
|
static inline void
|
||||||
|
elf_machine_runtime_setup (struct link_map *map, int lazy)
|
||||||
|
{
|
||||||
|
if (map->l_info[DT_JMPREL])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
/* Fill in the PLT. Its initial contents are directed to a
|
||||||
|
function earlier in the PLT which arranges for the dynamic
|
||||||
|
linker to be called back. */
|
||||||
|
Elf32_Word *plt = (Elf32_Word *) ((char *) map->l_addr
|
||||||
|
+ map->l_info[DT_PLTGOT]->d_un.d_val);
|
||||||
|
Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
|
||||||
|
/ sizeof (Elf32_Rela));
|
||||||
|
Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);
|
||||||
|
extern void _dl_runtime_resolve (void);
|
||||||
|
Elf32_Word size_modified;
|
||||||
|
|
||||||
|
if (lazy)
|
||||||
|
for (i = 0; i < num_plt_entries; i++)
|
||||||
|
{
|
||||||
|
Elf32_Word offset = PLT_ENTRY_START_WORDS (i);
|
||||||
|
|
||||||
|
if (i >= PLT_DOUBLE_SIZE)
|
||||||
|
{
|
||||||
|
plt[offset ] = OPCODE_LI (11, i * 4);
|
||||||
|
plt[offset+1] = OPCODE_ADDIS (11, 11, (i * 4 + 0x8000) >> 16);
|
||||||
|
plt[offset+2] = OPCODE_B (-(4 * (offset + 2)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plt[offset ] = OPCODE_LI (11, i * 4);
|
||||||
|
plt[offset+1] = OPCODE_B (-(4 * (offset + 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Multiply index of entry by 3 (in r11). */
|
||||||
|
plt[0] = OPCODE_SLWI (12, 11, 1);
|
||||||
|
plt[1] = OPCODE_ADD (11, 12, 11);
|
||||||
|
if ((Elf32_Word) (char *) _dl_runtime_resolve <= 0x01fffffc ||
|
||||||
|
(Elf32_Word) (char *) _dl_runtime_resolve >= 0xfe000000)
|
||||||
|
{
|
||||||
|
/* Load address of link map in r12. */
|
||||||
|
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) map);
|
||||||
|
plt[3] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
|
||||||
|
+ 0x8000) >> 16));
|
||||||
|
|
||||||
|
/* Call _dl_runtime_resolve. */
|
||||||
|
plt[4] = OPCODE_BA ((Elf32_Word) (char *) _dl_runtime_resolve);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get address of _dl_runtime_resolve in CTR. */
|
||||||
|
plt[2] = OPCODE_LI (12, (Elf32_Word) (char *) _dl_runtime_resolve);
|
||||||
|
plt[3] = OPCODE_ADDIS (12, 12, ((((Elf32_Word) (char *)
|
||||||
|
_dl_runtime_resolve)
|
||||||
|
+ 0x8000) >> 16));
|
||||||
|
plt[4] = OPCODE_MTCTR (12);
|
||||||
|
|
||||||
|
/* Load address of link map in r12. */
|
||||||
|
plt[5] = OPCODE_LI (12, (Elf32_Word) (char *) map);
|
||||||
|
plt[6] = OPCODE_ADDIS (12, 12, (((Elf32_Word) (char *) map
|
||||||
|
+ 0x8000) >> 16));
|
||||||
|
|
||||||
|
/* Call _dl_runtime_resolve. */
|
||||||
|
plt[7] = OPCODE_BCTR ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Convert the index in r11 into an actual address, and get the
|
||||||
|
word at that address. */
|
||||||
|
plt[PLT_LONGBRANCH_ENTRY_WORDS] =
|
||||||
|
OPCODE_ADDIS (11, 11, (((Elf32_Word) (char*) (plt + rel_offset_words)
|
||||||
|
+ 0x8000) >> 16));
|
||||||
|
plt[PLT_LONGBRANCH_ENTRY_WORDS+1] =
|
||||||
|
OPCODE_LWZ (11, (Elf32_Word) (char*) (plt+rel_offset_words), 11);
|
||||||
|
|
||||||
|
/* Call the procedure at that address. */
|
||||||
|
plt[PLT_LONGBRANCH_ENTRY_WORDS+2] = OPCODE_MTCTR (11);
|
||||||
|
plt[PLT_LONGBRANCH_ENTRY_WORDS+3] = OPCODE_BCTR ();
|
||||||
|
|
||||||
|
|
||||||
|
/* Now, we've modified code (quite a lot of code, possibly). We
|
||||||
|
need to write the changes from the data cache to a
|
||||||
|
second-level unified cache, then make sure that stale data in
|
||||||
|
the instruction cache is removed. (In a multiprocessor
|
||||||
|
system, the effect is more complex.)
|
||||||
|
|
||||||
|
Assumes the cache line size is at least 32 bytes, or at least
|
||||||
|
that dcbst and icbi apply to 32-byte lines. At present, all
|
||||||
|
PowerPC processors have line sizes of exactly 32 bytes. */
|
||||||
|
|
||||||
|
size_modified = lazy ? rel_offset_words : PLT_INITIAL_ENTRY_WORDS;
|
||||||
|
for (i = 0; i < size_modified; i+=8)
|
||||||
|
PPC_DCBST (plt + i);
|
||||||
|
PPC_SYNC;
|
||||||
|
for (i = 0; i < size_modified; i+=8)
|
||||||
|
PPC_ICBI (plt + i);
|
||||||
|
PPC_ISYNC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
|
||||||
|
{
|
||||||
|
assert (ELF32_R_TYPE (reloc->r_info) == R_PPC_JMP_SLOT);
|
||||||
|
/* elf_machine_runtime_setup handles this. */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* dl_machine_h */
|
||||||
|
|
||||||
|
#ifdef RESOLVE
|
||||||
|
|
||||||
|
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
||||||
|
LOADADDR is the load address of the object; INFO is an array indexed
|
||||||
|
by DT_* of the .dynamic section info. */
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||||
|
const Elf32_Sym *sym, const struct r_found_version *version)
|
||||||
|
{
|
||||||
|
const Elf32_Sym *const refsym = sym;
|
||||||
|
Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
|
||||||
|
Elf32_Word loadbase, finaladdr;
|
||||||
|
const int rinfo = ELF32_R_TYPE (reloc->r_info);
|
||||||
|
|
||||||
|
if (rinfo == R_PPC_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
assert (sym != NULL);
|
||||||
|
/* The condition on the next two lines is a hack around a bug in Solaris
|
||||||
|
tools on Sparc. It's not clear whether it should really be here at all,
|
||||||
|
but if not the binutils need to be changed. */
|
||||||
|
if ((sym->st_shndx != SHN_UNDEF
|
||||||
|
&& ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
|
||||||
|
|| rinfo == R_PPC_RELATIVE)
|
||||||
|
{
|
||||||
|
/* Has already been relocated. */
|
||||||
|
loadbase = map->l_addr;
|
||||||
|
finaladdr = loadbase + reloc->r_addend;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version,
|
||||||
|
ELF32_R_TYPE(reloc->r_info)));
|
||||||
|
if (sym == NULL)
|
||||||
|
{
|
||||||
|
/* Weak symbol that wasn't actually defined anywhere. */
|
||||||
|
assert(loadbase == 0);
|
||||||
|
finaladdr = reloc->r_addend;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
|
||||||
|
+ reloc->r_addend);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is an if/else if chain because GCC 2.7.2.[012] turns case
|
||||||
|
statements into non-PIC table lookups. When a later version
|
||||||
|
comes out that fixes this, this should be changed. */
|
||||||
|
if (rinfo == R_PPC_UADDR32 ||
|
||||||
|
rinfo == R_PPC_GLOB_DAT ||
|
||||||
|
rinfo == R_PPC_ADDR32 ||
|
||||||
|
rinfo == R_PPC_RELATIVE)
|
||||||
|
{
|
||||||
|
*reloc_addr = finaladdr;
|
||||||
|
}
|
||||||
|
else if (rinfo == R_PPC_ADDR16_LO)
|
||||||
|
{
|
||||||
|
*(Elf32_Half*) reloc_addr = finaladdr;
|
||||||
|
}
|
||||||
|
else if (rinfo == R_PPC_ADDR16_HI)
|
||||||
|
{
|
||||||
|
*(Elf32_Half*) reloc_addr = finaladdr >> 16;
|
||||||
|
}
|
||||||
|
else if (rinfo == R_PPC_ADDR16_HA)
|
||||||
|
{
|
||||||
|
*(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
|
||||||
|
}
|
||||||
|
#ifndef RTLD_BOOTSTRAP
|
||||||
|
else if (rinfo == R_PPC_REL24)
|
||||||
|
{
|
||||||
|
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
|
||||||
|
if (delta << 6 >> 6 != delta)
|
||||||
|
{
|
||||||
|
_dl_signal_error(0, map->l_name,
|
||||||
|
"R_PPC_REL24 relocation out of range");
|
||||||
|
}
|
||||||
|
*reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
|
||||||
|
}
|
||||||
|
else if (rinfo == R_PPC_ADDR24)
|
||||||
|
{
|
||||||
|
if (finaladdr << 6 >> 6 != finaladdr)
|
||||||
|
{
|
||||||
|
_dl_signal_error(0, map->l_name,
|
||||||
|
"R_PPC_ADDR24 relocation out of range");
|
||||||
|
}
|
||||||
|
*reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
|
||||||
|
}
|
||||||
|
else if (rinfo == R_PPC_COPY)
|
||||||
|
{
|
||||||
|
if (sym->st_size != refsym->st_size)
|
||||||
|
{
|
||||||
|
const char *strtab;
|
||||||
|
|
||||||
|
strtab = ((void *) map->l_addr
|
||||||
|
+ map->l_info[DT_STRTAB]->d_un.d_ptr);
|
||||||
|
_dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
|
||||||
|
"' has different size in shared object, "
|
||||||
|
"consider re-linking\n", NULL);
|
||||||
|
}
|
||||||
|
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
|
||||||
|
refsym->st_size));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (rinfo == R_PPC_REL32)
|
||||||
|
{
|
||||||
|
*reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
|
||||||
|
}
|
||||||
|
else if (rinfo == R_PPC_JMP_SLOT)
|
||||||
|
{
|
||||||
|
Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
|
||||||
|
if (delta << 6 >> 6 == delta)
|
||||||
|
*reloc_addr = OPCODE_B (delta);
|
||||||
|
else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
|
||||||
|
*reloc_addr = OPCODE_BA (finaladdr);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Elf32_Word *plt;
|
||||||
|
Elf32_Word index;
|
||||||
|
|
||||||
|
plt = (Elf32_Word *)((char *)map->l_addr
|
||||||
|
+ map->l_info[DT_PLTGOT]->d_un.d_val);
|
||||||
|
index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
|
||||||
|
|
||||||
|
if (index >= PLT_DOUBLE_SIZE)
|
||||||
|
{
|
||||||
|
/* Slots greater than or equal to 2^13 have 4 words available
|
||||||
|
instead of two. */
|
||||||
|
reloc_addr[0] = OPCODE_LI (11, finaladdr);
|
||||||
|
reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
|
||||||
|
reloc_addr[2] = OPCODE_MTCTR (11);
|
||||||
|
reloc_addr[3] = OPCODE_BCTR ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Elf32_Word num_plt_entries;
|
||||||
|
|
||||||
|
num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
|
||||||
|
/ sizeof(Elf32_Rela));
|
||||||
|
|
||||||
|
reloc_addr[0] = OPCODE_LI (11, index*4);
|
||||||
|
reloc_addr[1] =
|
||||||
|
OPCODE_B (-(4*(index*2
|
||||||
|
+ 1
|
||||||
|
- PLT_LONGBRANCH_ENTRY_WORDS
|
||||||
|
+ PLT_INITIAL_ENTRY_WORDS)));
|
||||||
|
plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MODIFIED_CODE (reloc_addr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
assert (! "unexpected dynamic reloc type");
|
||||||
|
|
||||||
|
if (rinfo == R_PPC_ADDR16_LO ||
|
||||||
|
rinfo == R_PPC_ADDR16_HI ||
|
||||||
|
rinfo == R_PPC_ADDR16_HA ||
|
||||||
|
rinfo == R_PPC_REL24 ||
|
||||||
|
rinfo == R_PPC_ADDR24)
|
||||||
|
MODIFIED_CODE_NOQUEUE (reloc_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ELF_MACHINE_NO_REL 1
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
35
sysdeps/powerpc/fclrexcpt.c
Normal file
35
sysdeps/powerpc/fclrexcpt.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* Clear given exceptions in current floating-point environment.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
feclearexcept (int excepts)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Clear the relevant bits. */
|
||||||
|
u.l[1] = u.l[1] & ~FE_to_sticky (excepts);
|
||||||
|
|
||||||
|
/* Put the new state in effect. */
|
||||||
|
fesetenv_register (u.fenv);
|
||||||
|
}
|
26
sysdeps/powerpc/fegetenv.c
Normal file
26
sysdeps/powerpc/fegetenv.c
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* Store current floating-point environment.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
fegetenv (fenv_t *envp)
|
||||||
|
{
|
||||||
|
*envp = fegetenv_register ();
|
||||||
|
}
|
31
sysdeps/powerpc/fegetround.c
Normal file
31
sysdeps/powerpc/fegetround.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* Return current rounding direction.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fegetround (void)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* The rounding mode is bits 30 and 31 of the FPSCR. */
|
||||||
|
return u.l[1] & 3;
|
||||||
|
}
|
38
sysdeps/powerpc/feholdexcpt.c
Normal file
38
sysdeps/powerpc/feholdexcpt.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* Store current floating-point environment and clear exceptions.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
feholdexcept (fenv_t *envp)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = *envp = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Clear everything except for the rounding mode and non-IEEE arithmetic
|
||||||
|
flag. */
|
||||||
|
u.l[1] = u.l[1] & 7;
|
||||||
|
|
||||||
|
/* Put the new state in effect. */
|
||||||
|
fesetenv_register (u.fenv);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
29
sysdeps/powerpc/fenv_const.c
Normal file
29
sysdeps/powerpc/fenv_const.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/* Constants for fenv_bits.h.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* We want to specify the bit pattern of the __fe_*_env constants, so
|
||||||
|
pretend they're really `long long' instead of `double'. */
|
||||||
|
|
||||||
|
/* If the default argument is used we use this value. */
|
||||||
|
const unsigned long long __fe_dfl_env __attribute__ ((aligned (8))) =
|
||||||
|
0xfff8000000000000ULL;
|
||||||
|
|
||||||
|
/* Floating-point environment where none of the exceptions are masked. */
|
||||||
|
const unsigned long long __fe_nomask_env __attribute__ ((aligned (8))) =
|
||||||
|
0xfff80000000000f8ULL;
|
57
sysdeps/powerpc/fenv_libc.h
Normal file
57
sysdeps/powerpc/fenv_libc.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* Internal libc stuff for floating point environment routines.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef _FENV_LIBC_H
|
||||||
|
#define _FENV_LIBC_H 1
|
||||||
|
|
||||||
|
#include <fenv.h>
|
||||||
|
|
||||||
|
/* Transform a logical or of the FE_* bits to a bit pattern for the
|
||||||
|
appropriate sticky bits in the FPSCR. */
|
||||||
|
#define FE_to_sticky(excepts) \
|
||||||
|
(-(excepts & FE_INVALID) & FE_ALL_INVALID \
|
||||||
|
| (excepts) & (FE_ALL_EXCEPT & ~FE_INVALID | FE_ALL_INVALID))
|
||||||
|
|
||||||
|
/* The sticky bits in the FPSCR indicating exceptions have occurred. */
|
||||||
|
#define FPSCR_STICKY_BITS ((FE_ALL_EXCEPT | FE_ALL_INVALID) & ~FE_INVALID)
|
||||||
|
|
||||||
|
/* Equivalent to fegetenv, but returns a fenv_t instead of taking a
|
||||||
|
pointer. */
|
||||||
|
#define fegetenv_register() \
|
||||||
|
({ fenv_t env; asm ("mffs %0" : "=f" (env)); env; })
|
||||||
|
|
||||||
|
/* Equivalent to fesetenv, but takes a fenv_t instead of a pointer. */
|
||||||
|
#define fesetenv_register(env) \
|
||||||
|
({ double d = (env); asm ("mtfsf 0xff,%0" : : "f" (d)); })
|
||||||
|
|
||||||
|
/* This very handy macro:
|
||||||
|
- Sets the rounding mode to 'round to nearest';
|
||||||
|
- Sets the processor into IEEE mode; and
|
||||||
|
- Prevents exceptions from being raised for inexact results.
|
||||||
|
These things happen to be exactly what you need for typical elementary
|
||||||
|
functions. */
|
||||||
|
#define relax_fenv_state() asm ("mtfsfi 7,0")
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
fenv_t fenv;
|
||||||
|
unsigned int l[2];
|
||||||
|
} fenv_union_t;
|
||||||
|
|
||||||
|
#endif /* fenv_libc.h */
|
130
sysdeps/powerpc/fenvbits.h
Normal file
130
sysdeps/powerpc/fenvbits.h
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* This file should never be included directly. */
|
||||||
|
|
||||||
|
#ifndef _FENVBITS_H
|
||||||
|
#define _FENVBITS_H 1
|
||||||
|
|
||||||
|
/* Define bits representing the exception. We use the bit positions of
|
||||||
|
the appropriate bits in the FPSCR... */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FE_INEXACT = 1 << 31-6,
|
||||||
|
#define FE_INEXACT FE_INEXACT
|
||||||
|
FE_DIVBYZERO = 1 << 31-5,
|
||||||
|
#define FE_DIVBYZERO FE_DIVBYZERO
|
||||||
|
FE_UNDERFLOW = 1 << 31-4,
|
||||||
|
#define FE_UNDERFLOW FE_UNDERFLOW
|
||||||
|
FE_OVERFLOW = 1 << 31-3,
|
||||||
|
#define FE_OVERFLOW FE_OVERFLOW
|
||||||
|
|
||||||
|
/* ... except for FE_INVALID, for which we use bit 31. FE_INVALID
|
||||||
|
actually corresponds to bits 7 through 12 and 21 through 23
|
||||||
|
in the FPSCR, but we can't use that because the current draft
|
||||||
|
says that it must be a power of 2. Instead we use bit 24 which
|
||||||
|
is the enable bit for all the FE_INVALID exceptions. */
|
||||||
|
FE_INVALID = 1 << 31-24,
|
||||||
|
#define FE_INVALID FE_INVALID
|
||||||
|
|
||||||
|
#ifdef __USE_GNU
|
||||||
|
/* Breakdown of the FE_INVALID bits. Setting FE_INVALID on an
|
||||||
|
input to a routine is equivalent to setting all of these bits;
|
||||||
|
FE_INVALID will be set on output from a routine iff one of
|
||||||
|
these bits is set. Note, though, that you can't disable or
|
||||||
|
enable these exceptions individually. */
|
||||||
|
|
||||||
|
/* Operation with SNaN. */
|
||||||
|
FE_INVALID_SNAN = 1 << 31-7,
|
||||||
|
#define FE_INVALID_SNAN FE_INVALID_SNAN
|
||||||
|
|
||||||
|
/* Inf - Inf */
|
||||||
|
FE_INVALID_ISI = 1 << 31-8,
|
||||||
|
#define FE_INVALID_ISI FE_INVALID_ISI
|
||||||
|
|
||||||
|
/* Inf / Inf */
|
||||||
|
FE_INVALID_IDI = 1 << 31-9,
|
||||||
|
#define FE_INVALID_IDI FE_INVALID_IDI
|
||||||
|
|
||||||
|
/* 0 / 0 */
|
||||||
|
FE_INVALID_ZDZ = 1 << 31-10,
|
||||||
|
#define FE_INVALID_ZDZ FE_INVALID_ZDZ
|
||||||
|
|
||||||
|
/* Inf * 0 */
|
||||||
|
FE_INVALID_IMZ = 1 << 31-11,
|
||||||
|
#define FE_INVALID_IMZ FE_INVALID_IMZ
|
||||||
|
|
||||||
|
/* Comparison with NaN or SNaN. */
|
||||||
|
FE_INVALID_COMPARE = 1 << 31-12,
|
||||||
|
#define FE_INVALID_COMPARE FE_INVALID_COMPARE
|
||||||
|
|
||||||
|
/* Invalid operation flag for software (not set by hardware). */
|
||||||
|
FE_INVALID_SOFTWARE = 1 << 31-21,
|
||||||
|
#define FE_INVALID_SOFTWARE FE_INVALID_SOFTWARE
|
||||||
|
|
||||||
|
/* Square root of negative number (including -Inf). */
|
||||||
|
FE_INVALID_SQRT = 1 << 31-22,
|
||||||
|
#define FE_INVALID_SQRT FE_INVALID_SQRT
|
||||||
|
|
||||||
|
/* Conversion-to-integer of a NaN or a number too large or too small. */
|
||||||
|
FE_INVALID_INTEGER_CONVERSION = 1 << 31-23,
|
||||||
|
#define FE_INVALID_INTEGER_CONVERSION FE_INVALID_INTEGER_CONVERSION
|
||||||
|
|
||||||
|
#define __FE_ALL_INVALID \
|
||||||
|
(FE_INVALID_SNAN | FE_INVALID_ISI | FE_INVALID_IDI | FE_INVALID_ZDZ \
|
||||||
|
| FE_INVALID_IMZ | FE_INVALID_COMPARE | FE_INVALID_SOFTWARE \
|
||||||
|
| FE_INVALID_SQRT | FE_INVALID_INTEGER_CONVERSION)
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FE_ALL_EXCEPT \
|
||||||
|
(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
|
||||||
|
|
||||||
|
/* PowerPC chips support all of the four defined rounding modes. We
|
||||||
|
use the bit pattern in the FPSCR as the values for the
|
||||||
|
appropriate macros. */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FE_TONEAREST = 0,
|
||||||
|
#define FE_TONEAREST FE_TONEAREST
|
||||||
|
FE_TOWARDSZERO = 1,
|
||||||
|
#define FE_TOWARDSZERO FE_TOWARDSZERO
|
||||||
|
FE_UPWARD = 2,
|
||||||
|
#define FE_UPWARD FE_UPWARD
|
||||||
|
FE_DOWNWARD = 3,
|
||||||
|
#define FE_DOWNWARD FE_DOWNWARD
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Type representing exception flags. */
|
||||||
|
typedef unsigned int fexcept_t;
|
||||||
|
|
||||||
|
/* Type representing floating-point environment. We leave it as 'double'
|
||||||
|
for efficiency reasons (rather than writing it to a 32-bit integer). */
|
||||||
|
typedef double fenv_t;
|
||||||
|
|
||||||
|
/* If the default argument is used we use this value. */
|
||||||
|
extern const fenv_t __fe_dfl_env;
|
||||||
|
#define FE_DFL_ENV (&__fe_dfl_env);
|
||||||
|
|
||||||
|
#ifdef __USE_GNU
|
||||||
|
/* Floating-point environment where none of the exceptions are masked. */
|
||||||
|
extern const fenv_t __fe_nomask_env;
|
||||||
|
# define FE_NOMASK_ENV (&__fe_nomask_env);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* fenvbits.h */
|
26
sysdeps/powerpc/fesetenv.c
Normal file
26
sysdeps/powerpc/fesetenv.c
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* Install given floating-point environment.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
fesetenv (const fenv_t *envp)
|
||||||
|
{
|
||||||
|
fesetenv_register (*envp);
|
||||||
|
}
|
41
sysdeps/powerpc/fesetround.c
Normal file
41
sysdeps/powerpc/fesetround.c
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* Set current rounding direction.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fesetround (int round)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
|
||||||
|
if ((unsigned int) round > 3)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Set the relevant bits. */
|
||||||
|
u.l[1] = u.l[1] & ~3 | round & 3;
|
||||||
|
|
||||||
|
/* Put the new state in effect. */
|
||||||
|
fesetenv_register (u.fenv);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
37
sysdeps/powerpc/feupdateenv.c
Normal file
37
sysdeps/powerpc/feupdateenv.c
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/* Install given floating-point environment and raise exceptions.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
feupdateenv (const fenv_t *envp)
|
||||||
|
{
|
||||||
|
fenv_union_t old, new;
|
||||||
|
|
||||||
|
/* Save the currently set exceptions. */
|
||||||
|
new.fenv = *envp;
|
||||||
|
old.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Copy the set exceptions from `old' to `new'. */
|
||||||
|
new.l[1] = new.l[1] & 0xE00000FF | old.l[1] & 0x1FFFFF00;
|
||||||
|
|
||||||
|
/* Atomically enable and raise (if appropriate) exceptions set in `new'. */
|
||||||
|
fesetenv_register (new.fenv);
|
||||||
|
}
|
@ -18,11 +18,7 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <bstring.h>
|
#include <string.h>
|
||||||
|
|
||||||
#undef ffs
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ffs (int x)
|
ffs (int x)
|
||||||
@ -32,7 +28,3 @@ ffs (int x)
|
|||||||
asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x));
|
asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x));
|
||||||
return 32 - cnt;
|
return 32 - cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
#include <sysdeps/generic/ffs.c>
|
|
||||||
#endif
|
|
||||||
|
33
sysdeps/powerpc/fgetexcptflg.c
Normal file
33
sysdeps/powerpc/fgetexcptflg.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Store current representation for exceptions.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
fegetexceptflag (fexcept_t *flagp, int excepts)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
unsigned int flag;
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Return that portion that corresponds to the requested exceptions. */
|
||||||
|
*flagp = flag = u.l[1] & FPSCR_STICKY_BITS & FE_to_sticky (excepts);
|
||||||
|
}
|
@ -34,20 +34,16 @@
|
|||||||
#define _FPU_MASK_UM 0x20 /* underflow */
|
#define _FPU_MASK_UM 0x20 /* underflow */
|
||||||
#define _FPU_MASK_XM 0x08 /* inexact */
|
#define _FPU_MASK_XM 0x08 /* inexact */
|
||||||
#define _FPU_MASK_IM 0x80 /* invalid operation */
|
#define _FPU_MASK_IM 0x80 /* invalid operation */
|
||||||
#define _FPU_MASK_VXCVI 0x100 /* invalid operation for integer convert */
|
|
||||||
#define _FPU_MASK_VXSQRT 0x200 /* invalid operation for square root */
|
|
||||||
#define _FPU_MASK_VXSOFT 0x400 /* invalid operation raised by software */
|
|
||||||
|
|
||||||
#define _FPU_RESERVED 0xfffff800 /* These bits are reserved are not changed. */
|
#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
|
||||||
|
|
||||||
/* The fdlibm code requires no interrupts for exceptions. Don't
|
/* The fdlibm code requires no interrupts for exceptions. */
|
||||||
change the rounding mode, it would break long double I/O! */
|
|
||||||
#define _FPU_DEFAULT 0x00000000 /* Default value. */
|
#define _FPU_DEFAULT 0x00000000 /* Default value. */
|
||||||
|
|
||||||
/* IEEE: same as above, but (some) exceptions;
|
/* IEEE: same as above, but (some) exceptions;
|
||||||
we leave the 'inexact' exception off.
|
we leave the 'inexact' exception off.
|
||||||
*/
|
*/
|
||||||
#define _FPU_IEEE 0x000003f0
|
#define _FPU_IEEE 0x000000f0
|
||||||
|
|
||||||
/* Type of the control word. */
|
/* Type of the control word. */
|
||||||
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
|
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
|
||||||
@ -59,7 +55,7 @@ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
|
|||||||
tmp[1]; } )
|
tmp[1]; } )
|
||||||
#define _FPU_SETCW(cw) { \
|
#define _FPU_SETCW(cw) { \
|
||||||
fpu_control_t tmp[2] __attribute__ ((__aligned__(8))); \
|
fpu_control_t tmp[2] __attribute__ ((__aligned__(8))); \
|
||||||
tmp[0] = 0xFFF80000; /* arbitrary, more-or-less */ \
|
tmp[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
|
||||||
tmp[1] = cw; \
|
tmp[1] = cw; \
|
||||||
__asm__ ("lfd 0,%0; mtfsf 255,0" : : "m" (*tmp) : "fr0"); \
|
__asm__ ("lfd 0,%0; mtfsf 255,0" : : "m" (*tmp) : "fr0"); \
|
||||||
}
|
}
|
||||||
|
44
sysdeps/powerpc/fraiseexcpt.c
Normal file
44
sysdeps/powerpc/fraiseexcpt.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/* Raise given exceptions.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
feraiseexcept (int excepts)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
|
||||||
|
/* Raise exceptions represented by EXCEPTS. It is the responsibility of
|
||||||
|
the OS to ensure that if multiple exceptions occur they are fed back
|
||||||
|
to this process in the proper way; this can happen in hardware,
|
||||||
|
anyway (in particular, inexact with overflow or underflow). */
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Add the exceptions */
|
||||||
|
u.l[1] = (u.l[1]
|
||||||
|
| excepts & __FPSCR_STICKY_BITS
|
||||||
|
/* Turn FE_INVALID into FE_INVALID_SOFTWARE. */
|
||||||
|
| excepts << (31 - 21) - (31 - 24) & __FE_INVALID_SOFTWARE);
|
||||||
|
|
||||||
|
/* Store the new status word (along with the rest of the environment),
|
||||||
|
triggering any appropriate exceptions. */
|
||||||
|
fesetenv_register (u.fenv);
|
||||||
|
}
|
37
sysdeps/powerpc/fsetexcptflg.c
Normal file
37
sysdeps/powerpc/fsetexcptflg.c
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/* Set floating-point environment exception handling.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
fesetexceptflag (const fexcept_t *flagp, int excepts)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Replace the exception status */
|
||||||
|
u.l[1] = u.l[1] & FPSCR_STICKY_BITS | *flagp & FE_to_sticky (excepts);
|
||||||
|
|
||||||
|
/* Store the new status word (along with the rest of the environment).
|
||||||
|
This may cause floating-point exceptions if the restored state
|
||||||
|
requests it. */
|
||||||
|
fesetenv_register (u.fenv);
|
||||||
|
}
|
38
sysdeps/powerpc/ftestexcept.c
Normal file
38
sysdeps/powerpc/ftestexcept.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* Test exception in current environment.
|
||||||
|
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <fenv_libc.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
fetestexcept (int excepts)
|
||||||
|
{
|
||||||
|
fenv_union_t u;
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
/* Get the current state. */
|
||||||
|
u.fenv = fegetenv_register ();
|
||||||
|
|
||||||
|
/* Find the bits that indicate exceptions have occurred. */
|
||||||
|
flags = u.l[1] & FPSCR_STICKY_BITS;
|
||||||
|
|
||||||
|
/* Set the FE_INVALID bit if any of the FE_INVALID_* bits are set. */
|
||||||
|
flags |= ((u.l[1] & FE_ALL_INVALID) != 0) << 31-24;
|
||||||
|
|
||||||
|
return flags & excepts;
|
||||||
|
}
|
72
sysdeps/powerpc/mathbits.h
Normal file
72
sysdeps/powerpc/mathbits.h
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef _MATHBITS_H
|
||||||
|
#define _MATHBITS_H 1
|
||||||
|
|
||||||
|
/* FIXME! This file describes properties of the compiler, not the machine;
|
||||||
|
it should not be part of libc!
|
||||||
|
|
||||||
|
FIXME! This file does not deal with the -fshort-double option of
|
||||||
|
gcc! */
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#if __STDC__ == 1
|
||||||
|
|
||||||
|
/* In GNU or ANSI mode, gcc leaves `float' expressions as-is, I think. */
|
||||||
|
typedef float float_t; /* `float' expressions are evaluated as
|
||||||
|
`float'. */
|
||||||
|
typedef double double_t; /* `double' expressions are evaluated as
|
||||||
|
`double'. */
|
||||||
|
|
||||||
|
/* Signal that types stay as they were declared. */
|
||||||
|
#define FLT_EVAL_METHOD 0
|
||||||
|
|
||||||
|
/* Define `INFINITY' as value of type `float_t'. */
|
||||||
|
#define INFINITY HUGE_VALF
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* For `gcc -traditional', `float' expressions are evaluated as `double'. */
|
||||||
|
typedef double float_t; /* `float' expressions are evaluated as
|
||||||
|
`double'. */
|
||||||
|
typedef double double_t; /* `double' expressions are evaluated as
|
||||||
|
`double'. */
|
||||||
|
|
||||||
|
/* Signal that both types are `double'. */
|
||||||
|
#define FLT_EVAL_METHOD 1
|
||||||
|
|
||||||
|
/* Define `INFINITY' as value of type `float_t'. */
|
||||||
|
#define INFINITY HUGE_VAL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Wild guess at types for float_t and double_t. */
|
||||||
|
typedef double float_t;
|
||||||
|
typedef double double_t;
|
||||||
|
|
||||||
|
/* Strange compiler, we don't know how it works. */
|
||||||
|
#define FLT_EVAL_METHOD -1
|
||||||
|
|
||||||
|
/* Define `INFINITY' as value of type `float_t'. */
|
||||||
|
#define INFINITY HUGE_VAL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* mathbits.h */
|
@ -22,46 +22,46 @@
|
|||||||
#include <jmp_buf.h>
|
#include <jmp_buf.h>
|
||||||
|
|
||||||
ENTRY (__sigsetjmp)
|
ENTRY (__sigsetjmp)
|
||||||
stw 1,(JB_GPR1*4)(3)
|
stw %r1,(JB_GPR1*4)(3)
|
||||||
mflr 0
|
mflr %r0
|
||||||
stw 2,(JB_GPR2*4)(3)
|
stw %r2,(JB_GPR2*4)(3)
|
||||||
stw 14,((JB_GPRS+0)*4)(3)
|
stw %r14,((JB_GPRS+0)*4)(3)
|
||||||
stfd 14,((JB_FPRS+0*2)*4)(3)
|
stfd %f14,((JB_FPRS+0*2)*4)(3)
|
||||||
stw 0,(JB_LR*4)(3)
|
stw %r0,(JB_LR*4)(3)
|
||||||
stw 15,((JB_GPRS+1)*4)(3)
|
stw %r15,((JB_GPRS+1)*4)(3)
|
||||||
stfd 15,((JB_FPRS+1*2)*4)(3)
|
stfd %f15,((JB_FPRS+1*2)*4)(3)
|
||||||
stw 16,((JB_GPRS+2)*4)(3)
|
stw %r16,((JB_GPRS+2)*4)(3)
|
||||||
stfd 16,((JB_FPRS+2*2)*4)(3)
|
stfd %f16,((JB_FPRS+2*2)*4)(3)
|
||||||
stw 17,((JB_GPRS+3)*4)(3)
|
stw %r17,((JB_GPRS+3)*4)(3)
|
||||||
stfd 17,((JB_FPRS+3*2)*4)(3)
|
stfd %f17,((JB_FPRS+3*2)*4)(3)
|
||||||
stw 18,((JB_GPRS+4)*4)(3)
|
stw %r18,((JB_GPRS+4)*4)(3)
|
||||||
stfd 18,((JB_FPRS+4*2)*4)(3)
|
stfd %f18,((JB_FPRS+4*2)*4)(3)
|
||||||
stw 19,((JB_GPRS+5)*4)(3)
|
stw %r19,((JB_GPRS+5)*4)(3)
|
||||||
stfd 19,((JB_FPRS+5*2)*4)(3)
|
stfd %f19,((JB_FPRS+5*2)*4)(3)
|
||||||
stw 20,((JB_GPRS+6)*4)(3)
|
stw %r20,((JB_GPRS+6)*4)(3)
|
||||||
stfd 20,((JB_FPRS+6*2)*4)(3)
|
stfd %f20,((JB_FPRS+6*2)*4)(3)
|
||||||
stw 21,((JB_GPRS+7)*4)(3)
|
stw %r21,((JB_GPRS+7)*4)(3)
|
||||||
stfd 21,((JB_FPRS+7*2)*4)(3)
|
stfd %f21,((JB_FPRS+7*2)*4)(3)
|
||||||
stw 22,((JB_GPRS+8)*4)(3)
|
stw %r22,((JB_GPRS+8)*4)(3)
|
||||||
stfd 22,((JB_FPRS+8*2)*4)(3)
|
stfd %f22,((JB_FPRS+8*2)*4)(3)
|
||||||
stw 23,((JB_GPRS+9)*4)(3)
|
stw %r23,((JB_GPRS+9)*4)(3)
|
||||||
stfd 23,((JB_FPRS+9*2)*4)(3)
|
stfd %f23,((JB_FPRS+9*2)*4)(3)
|
||||||
stw 24,((JB_GPRS+10)*4)(3)
|
stw %r24,((JB_GPRS+10)*4)(3)
|
||||||
stfd 24,((JB_FPRS+10*2)*4)(3)
|
stfd %f24,((JB_FPRS+10*2)*4)(3)
|
||||||
stw 25,((JB_GPRS+11)*4)(3)
|
stw %r25,((JB_GPRS+11)*4)(3)
|
||||||
stfd 25,((JB_FPRS+11*2)*4)(3)
|
stfd %f25,((JB_FPRS+11*2)*4)(3)
|
||||||
stw 26,((JB_GPRS+12)*4)(3)
|
stw %r26,((JB_GPRS+12)*4)(3)
|
||||||
stfd 26,((JB_FPRS+12*2)*4)(3)
|
stfd %f26,((JB_FPRS+12*2)*4)(3)
|
||||||
stw 27,((JB_GPRS+13)*4)(3)
|
stw %r27,((JB_GPRS+13)*4)(3)
|
||||||
stfd 27,((JB_FPRS+13*2)*4)(3)
|
stfd %f27,((JB_FPRS+13*2)*4)(3)
|
||||||
stw 28,((JB_GPRS+14)*4)(3)
|
stw %r28,((JB_GPRS+14)*4)(3)
|
||||||
stfd 28,((JB_FPRS+14*2)*4)(3)
|
stfd %f28,((JB_FPRS+14*2)*4)(3)
|
||||||
stw 29,((JB_GPRS+15)*4)(3)
|
stw %r29,((JB_GPRS+15)*4)(3)
|
||||||
stfd 29,((JB_FPRS+15*2)*4)(3)
|
stfd %f29,((JB_FPRS+15*2)*4)(3)
|
||||||
stw 30,((JB_GPRS+16)*4)(3)
|
stw %r30,((JB_GPRS+16)*4)(3)
|
||||||
stfd 30,((JB_FPRS+16*2)*4)(3)
|
stfd %f30,((JB_FPRS+16*2)*4)(3)
|
||||||
stw 31,((JB_GPRS+17)*4)(3)
|
stw %r31,((JB_GPRS+17)*4)(3)
|
||||||
stfd 31,((JB_FPRS+17*2)*4)(3)
|
stfd %f31,((JB_FPRS+17*2)*4)(3)
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
b __sigjmp_save@plt
|
b __sigjmp_save@plt
|
||||||
#else
|
#else
|
||||||
|
@ -68,78 +68,78 @@
|
|||||||
# them, the others we must save.
|
# them, the others we must save.
|
||||||
|
|
||||||
.section ".text"
|
.section ".text"
|
||||||
.align 3
|
.align 2
|
||||||
.globl strlen
|
.globl strlen
|
||||||
.type strlen,@function
|
.type strlen,@function
|
||||||
strlen:
|
strlen:
|
||||||
# On entry, r3 points to the string, and it's left that way.
|
# On entry, r3 points to the string, and it's left that way.
|
||||||
# We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f.
|
# We use r6 to store 0xfefefeff, and r7 to store 0x7f7f7f7f.
|
||||||
# r4 is used to keep the current index into the string; r5 holds
|
# r4 is used to keep the current index into the string; r5 holds
|
||||||
# the number of padding bits we prepend to the string to make it
|
# the number of padding bits we prepend to the string to make it
|
||||||
# start at a word boundary. r8 holds the 'current' word.
|
# start at a word boundary. r8 holds the 'current' word.
|
||||||
# r9-12 are temporaries. r0 is used as a temporary and for discarded
|
# r9-12 are temporaries. r0 is used as a temporary and for discarded
|
||||||
# results.
|
# results.
|
||||||
clrrwi 4,3,2
|
clrrwi %r4,%r3,2
|
||||||
lis 6,0xfeff
|
lis %r6,0xfeff
|
||||||
lis 7,0x7f7f
|
lis %r7,0x7f7f
|
||||||
rlwinm 10,3,0,29,29
|
rlwinm %r10,%r3,0,29,29
|
||||||
lwz 8,0(4)
|
lwz %r8,0(%r4)
|
||||||
addi 7,7,0x7f7f
|
addi %r7,%r7,0x7f7f
|
||||||
rlwinm 5,3,3,27,28
|
rlwinm %r5,%r3,3,27,28
|
||||||
cmpwi 1,10,0
|
cmpwi %cr1,%r10,0
|
||||||
li 9,-1
|
li %r9,-1
|
||||||
# That's the setup done, now do the first pair of words.
|
# That's the setup done, now do the first pair of words.
|
||||||
# We make an exception and use method (2) on the first two words, to reduce
|
# We make an exception and use method (2) on the first two words, to reduce
|
||||||
# overhead.
|
# overhead.
|
||||||
srw 9,9,5
|
srw %r9,%r9,%r5
|
||||||
and 0,7,8
|
and %r0,%r7,%r8
|
||||||
or 10,7,8
|
or %r10,%r7,%r8
|
||||||
add 0,0,7
|
add %r0,%r0,%r7
|
||||||
nor 0,10,0
|
nor %r0,%r10,%r0
|
||||||
and. 8,0,9
|
and. %r8,%r0,%r9
|
||||||
bne done0
|
bne done0
|
||||||
# Handle second word of pair. Put addi between branches to avoid hurting
|
# Handle second word of pair. Put addi between branches to avoid hurting
|
||||||
# branch prediction.
|
# branch prediction.
|
||||||
addi 6,6,0xfffffeff
|
addi %r6,%r6,0xfffffeff
|
||||||
|
|
||||||
bne 1,loop
|
bne %cr1,loop
|
||||||
lwzu 8,4(4)
|
lwzu %r8,4(%r4)
|
||||||
and 0,7,8
|
and %r0,%r7,%r8
|
||||||
or 10,7,8
|
or %r10,%r7,%r8
|
||||||
add 0,0,7
|
add %r0,%r0,%r7
|
||||||
nor. 0,10,0
|
nor. %r8,%r10,%r0
|
||||||
bne done0
|
bne done0
|
||||||
|
|
||||||
# The loop.
|
# The loop.
|
||||||
|
|
||||||
|
loop: lwz %r8,4(%r4)
|
||||||
|
lwzu %r9,8(%r4)
|
||||||
|
add %r0,%r6,%r8
|
||||||
|
nor %r10,%r7,%r8
|
||||||
|
and. %r0,%r0,%r10
|
||||||
|
add %r11,%r6,%r9
|
||||||
|
nor %r12,%r7,%r9
|
||||||
|
bne done1
|
||||||
|
and. %r0,%r11,%r12
|
||||||
|
beq loop
|
||||||
|
|
||||||
loop: lwz 8,4(4)
|
and %r0,%r7,%r9
|
||||||
lwzu 9,8(4)
|
add %r0,%r0,%r7
|
||||||
add 0,6,8
|
andc %r8,%r12,%r0
|
||||||
nor 10,7,8
|
b done0
|
||||||
and. 0,0,10
|
|
||||||
add 11,6,9
|
done1: and %r0,%r7,%r8
|
||||||
nor 12,7,9
|
subi %r4,%r4,4
|
||||||
bne done1
|
add %r0,%r0,%r7
|
||||||
and. 0,11,12
|
andc %r8,%r10,%r0
|
||||||
beq loop
|
|
||||||
|
|
||||||
and 0,7,9
|
|
||||||
or 10,7,9
|
|
||||||
b done2
|
|
||||||
|
|
||||||
done1: addi 4,4,-4
|
|
||||||
and 0,7,9
|
|
||||||
or 10,7,9
|
|
||||||
done2: add 0,0,7
|
|
||||||
nor 0,10,0
|
|
||||||
|
|
||||||
# When we get to here, r4 points to the first word in the string that
|
# When we get to here, r4 points to the first word in the string that
|
||||||
# contains a zero byte, and the most significant set bit in r8 is in that
|
# contains a zero byte, and the most significant set bit in r8 is in that
|
||||||
# byte.
|
# byte.
|
||||||
done0: cntlzw 11,8
|
done0: cntlzw %r11,%r8
|
||||||
subf 0,3,4
|
subf %r0,%r3,%r4
|
||||||
srwi 11,11,3
|
srwi %r11,%r11,3
|
||||||
add 3,0,11
|
add %r3,%r0,%r11
|
||||||
blr
|
blr
|
||||||
0:
|
0:
|
||||||
.size strlen,0b-strlen
|
.size strlen,0b-strlen
|
||||||
|
@ -19,7 +19,7 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
|||||||
Cambridge, MA 02139, USA. */
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
#include <ansidecl.h>
|
||||||
#include <bstring.h>
|
#include <string.h>
|
||||||
|
|
||||||
#undef ffs
|
#undef ffs
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ ENTRY (__sigsetjmp)
|
|||||||
/* Save our SP and FP; in the delay slot of the jump, save our
|
/* Save our SP and FP; in the delay slot of the jump, save our
|
||||||
return PC. Save the signal mask if requested with a tail-call
|
return PC. Save the signal mask if requested with a tail-call
|
||||||
for simplicity; it always returns zero. */
|
for simplicity; it always returns zero. */
|
||||||
|
ta ST_FLUSH_WINDOWS
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
mov %o7,%g1
|
mov %o7,%g1
|
||||||
2:
|
2:
|
||||||
|
49
sysdeps/standalone/arm/errnos.h
Normal file
49
sysdeps/standalone/arm/errnos.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/* Copyright (C) 1991, 1994, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||||
|
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||||
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
/* This file defines the `errno' constants for standalone ARM machines.
|
||||||
|
These constants are essentially arbitrary. */
|
||||||
|
|
||||||
|
#if !defined(__Emath_defined) && (defined(_ERRNO_H) || defined(__need_Emath))
|
||||||
|
#undef __need_Emath
|
||||||
|
#define __Emath_defined 1
|
||||||
|
|
||||||
|
#define EDOM 1
|
||||||
|
#define ERANGE 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _ERRNO_H
|
||||||
|
#define ENOSYS 3
|
||||||
|
#define EINVAL 4
|
||||||
|
#define ESPIPE 5
|
||||||
|
#define EBADF 6
|
||||||
|
#define ENOMEM 7
|
||||||
|
#define EACCES 8
|
||||||
|
#define ENFILE 9
|
||||||
|
#define EMFILE 10
|
||||||
|
#define ENAMETOOLONG 11 /* File name too long */
|
||||||
|
#define ELOOP 12 /* Too many symbolic links encountered */
|
||||||
|
#define ENOMSG 13 /* No message of desired type */
|
||||||
|
#define E2BIG 14 /* Arg list too long */
|
||||||
|
#define EINTR 15
|
||||||
|
#define EILSEQ 16
|
||||||
|
#define ENOEXEC 17
|
||||||
|
#define ENOENT 18
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __set_errno(val) errno = (val)
|
@ -28,7 +28,7 @@ Cambridge, MA 02139, USA. */
|
|||||||
The miscellaneous Unix `readdir' implementations read directory data
|
The miscellaneous Unix `readdir' implementations read directory data
|
||||||
into a buffer and fill in a `struct dirent' copy in the `DIR' object. */
|
into a buffer and fill in a `struct dirent' copy in the `DIR' object. */
|
||||||
|
|
||||||
typedef struct
|
struct __dirstream
|
||||||
{
|
{
|
||||||
int __fd; /* File descriptor. */
|
int __fd; /* File descriptor. */
|
||||||
|
|
||||||
@ -38,6 +38,6 @@ typedef struct
|
|||||||
size_t __size; /* Total valid data in the block. */
|
size_t __size; /* Total valid data in the block. */
|
||||||
|
|
||||||
struct dirent __entry; /* Returned by `readdir'. */
|
struct dirent __entry; /* Returned by `readdir'. */
|
||||||
} DIR;
|
};
|
||||||
|
|
||||||
#endif /* dirstream.h */
|
#endif /* dirstream.h */
|
||||||
|
@ -20,4 +20,4 @@
|
|||||||
struct dirent
|
struct dirent
|
||||||
{
|
{
|
||||||
char d_name[1]; /* Variable length. */
|
char d_name[1]; /* Variable length. */
|
||||||
}
|
};
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
int
|
int
|
||||||
dirfd (dirp)
|
dirfd (dirp)
|
||||||
FILE *dirp;
|
DIR *dirp;
|
||||||
{
|
{
|
||||||
__set_errno (ENOSYS);
|
__set_errno (ENOSYS);
|
||||||
return -1;
|
return -1;
|
||||||
|
36
sysdeps/stub/if_index.c
Normal file
36
sysdeps/stub/if_index.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||||
|
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||||
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
unsigned int if_nametoindex(const char *ifname)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *if_indextoname(unsigned int ifindex, char *ifname)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void if_freenameindex(struct if_nameindex *ifn)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
struct if_nameindex *if_nameindex(void)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -24,7 +24,7 @@ Cambridge, MA 02139, USA. */
|
|||||||
/* Seek to position POS in DIRP. */
|
/* Seek to position POS in DIRP. */
|
||||||
void
|
void
|
||||||
seekdir (dirp, pos)
|
seekdir (dirp, pos)
|
||||||
DIR *dirp
|
DIR *dirp;
|
||||||
off_t pos;
|
off_t pos;
|
||||||
{
|
{
|
||||||
if (dirp == NULL)
|
if (dirp == NULL)
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
/* Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
|
/* Copyright (C) 1991, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
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
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -26,7 +26,7 @@ Cambridge, MA 02139, USA. */
|
|||||||
int
|
int
|
||||||
__setitimer (which, new, old)
|
__setitimer (which, new, old)
|
||||||
enum __itimer_which which;
|
enum __itimer_which which;
|
||||||
struct itimerval *new;
|
const struct itimerval *new;
|
||||||
struct itimerval *old;
|
struct itimerval *old;
|
||||||
{
|
{
|
||||||
if (new == NULL)
|
if (new == NULL)
|
||||||
|
@ -26,7 +26,7 @@ int
|
|||||||
__sigaction (sig, act, oact)
|
__sigaction (sig, act, oact)
|
||||||
int sig;
|
int sig;
|
||||||
const struct sigaction *act;
|
const struct sigaction *act;
|
||||||
struct sigaction *OACT;
|
struct sigaction *oact;
|
||||||
{
|
{
|
||||||
if (sig <= 0 || sig >= NSIG)
|
if (sig <= 0 || sig >= NSIG)
|
||||||
{
|
{
|
||||||
|
@ -6,3 +6,5 @@
|
|||||||
the installed headers on the system. */
|
the installed headers on the system. */
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define MAXSYMLINKS 1
|
||||||
|
@ -164,10 +164,10 @@ __sysconf (name)
|
|||||||
case _SC_SEMAPHORES:
|
case _SC_SEMAPHORES:
|
||||||
case _SC_SHARED_MEMORY_OBJECTS:
|
case _SC_SHARED_MEMORY_OBJECTS:
|
||||||
|
|
||||||
case _SC_AIO_LIST_MAX:
|
case _SC_AIO_LISTIO_MAX:
|
||||||
case _SC_AIO_MAX:
|
case _SC_AIO_MAX:
|
||||||
case _SC_AIO_PRIO_DELTA_MAX:
|
case _SC_AIO_PRIO_DELTA_MAX:
|
||||||
case _SC_DELAYTIME_MAX:
|
case _SC_DELAYTIMER_MAX:
|
||||||
case _SC_MQ_OPEN_MAX:
|
case _SC_MQ_OPEN_MAX:
|
||||||
case _SC_MQ_PRIO_MAX:
|
case _SC_MQ_PRIO_MAX:
|
||||||
case _SC_VERSION:
|
case _SC_VERSION:
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
Return the generated filename or NULL if one could not
|
Return the generated filename or NULL if one could not
|
||||||
be generated, putting the length of the string in *LENPTR. */
|
be generated, putting the length of the string in *LENPTR. */
|
||||||
char *
|
char *
|
||||||
__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr)
|
__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr, streamptr)
|
||||||
char *buf;
|
char *buf;
|
||||||
size_t bufsize;
|
size_t bufsize;
|
||||||
const char *dir;
|
const char *dir;
|
||||||
|
@ -18,6 +18,7 @@ Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
/* Write formatted output to file descriptor D according to the format string
|
/* Write formatted output to file descriptor D according to the format string
|
||||||
FORMAT, using the argument list in ARG. */
|
FORMAT, using the argument list in ARG. */
|
||||||
@ -25,38 +26,7 @@ int
|
|||||||
vdprintf (int d, const char *format, va_list arg)
|
vdprintf (int d, const char *format, va_list arg)
|
||||||
{
|
{
|
||||||
__set_errno (ENOSYS);
|
__set_errno (ENOSYS);
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
stub_warning (vdprintf)
|
|
||||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
|
||||||
Cambridge, MA 02139, USA. */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* Write formatted output to file descriptor D according to the format string
|
|
||||||
FORMAT, using the argument list in ARG. */
|
|
||||||
int
|
|
||||||
vdprintf (int d, const char *format, va_list arg)
|
|
||||||
{
|
|
||||||
__set_errno (ENOSYS);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stub_warning (vdprintf)
|
stub_warning (vdprintf)
|
||||||
|
33
sysdeps/unix/arm/fork.S
Normal file
33
sysdeps/unix/arm/fork.S
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||||
|
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||||
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
#include <sysdep.h>
|
||||||
|
|
||||||
|
/* ARM version. */
|
||||||
|
|
||||||
|
SYSCALL__ (fork, 0)
|
||||||
|
/* R1 is now 0 for the parent and 1 for the child. Decrement it to
|
||||||
|
make it -1 (all bits set) for the parent, and 0 (no bits set)
|
||||||
|
for the child. Then AND it with R0, so the parent gets
|
||||||
|
R0&-1==R0, and the child gets R0&0==0. */
|
||||||
|
sub r1, r1, $1
|
||||||
|
and r0, r0, r1
|
||||||
|
RETINSTR(mov, pc, r14)
|
||||||
|
PSEUDO_END(fork)
|
||||||
|
|
||||||
|
weak_alias (__fork, fork)
|
@ -19,3 +19,8 @@ Cambridge, MA 02139, USA. */
|
|||||||
#include <sysdeps/unix/sysdep.h>
|
#include <sysdeps/unix/sysdep.h>
|
||||||
#include <sysdeps/arm/sysdep.h>
|
#include <sysdeps/arm/sysdep.h>
|
||||||
|
|
||||||
|
/* Some definitions to allow the assembler in sysdeps/unix/*.S to build
|
||||||
|
without needing ARM-specific versions of all the files. */
|
||||||
|
|
||||||
|
#define ret RETINSTR(mov, pc, r14)
|
||||||
|
#define MOVE(a,b) mov b,a
|
||||||
|
33
sysdeps/unix/sysv/linux/arm/clone.S
Normal file
33
sysdeps/unix/sysv/linux/arm/clone.S
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* clone() is even more special than fork() as it mucks with stacks
|
||||||
|
and invokes a function in the right context after its all over. */
|
||||||
|
|
||||||
|
#include <sysdep.h>
|
||||||
|
#define _ERRNO_H 1
|
||||||
|
#include <errnos.h>
|
||||||
|
|
||||||
|
/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
|
||||||
|
|
||||||
|
.text
|
||||||
|
ENTRY(__clone)
|
||||||
|
/* Somebody needs to write this. */
|
||||||
|
PSEUDO_END (__clone)
|
||||||
|
|
||||||
|
weak_alias (__clone, clone)
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user