]> git.saurik.com Git - apple/libc.git/commitdiff
Libc-166.tar.gz mac-os-x-100 v166
authorApple <opensource@apple.com>
Wed, 11 Apr 2001 00:23:59 +0000 (00:23 +0000)
committerApple <opensource@apple.com>
Wed, 11 Apr 2001 00:23:59 +0000 (00:23 +0000)
960 files changed:
Makefile [new file with mode: 0644]
Makefile.postamble [new file with mode: 0644]
Makefile.preamble [new file with mode: 0644]
PB.project [new file with mode: 0644]
compat43.subproj/Makefile [new file with mode: 0644]
compat43.subproj/Makefile.postamble [new file with mode: 0644]
compat43.subproj/Makefile.preamble [new file with mode: 0644]
compat43.subproj/PB.project [new file with mode: 0644]
compat43.subproj/creat.c [new file with mode: 0644]
compat43.subproj/gethostid.c [new file with mode: 0644]
compat43.subproj/getwd.c [new file with mode: 0644]
compat43.subproj/killpg.c [new file with mode: 0644]
compat43.subproj/send.c [new file with mode: 0644]
compat43.subproj/sethostid.c [new file with mode: 0644]
compat43.subproj/setpgrp.c [new file with mode: 0644]
compat43.subproj/setregid.c [new file with mode: 0644]
compat43.subproj/setreuid.c [new file with mode: 0644]
compat43.subproj/setrgid.c [new file with mode: 0644]
compat43.subproj/setruid.c [new file with mode: 0644]
compat43.subproj/sigcompat.c [new file with mode: 0644]
crt_externs.c [new file with mode: 0644]
db.subproj/Makefile [new file with mode: 0644]
db.subproj/Makefile.postamble [new file with mode: 0644]
db.subproj/Makefile.preamble [new file with mode: 0644]
db.subproj/PB.project [new file with mode: 0644]
db.subproj/btree.subproj/Makefile [new file with mode: 0644]
db.subproj/btree.subproj/Makefile.postamble [new file with mode: 0644]
db.subproj/btree.subproj/Makefile.preamble [new file with mode: 0644]
db.subproj/btree.subproj/PB.project [new file with mode: 0644]
db.subproj/btree.subproj/bt_close.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_conv.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_debug.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_delete.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_extern.h [new file with mode: 0644]
db.subproj/btree.subproj/bt_get.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_open.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_overflow.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_page.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_put.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_search.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_seq.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_split.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_stack.c [new file with mode: 0644]
db.subproj/btree.subproj/bt_utils.c [new file with mode: 0644]
db.subproj/btree.subproj/btree.h [new file with mode: 0644]
db.subproj/db.subproj/Makefile [new file with mode: 0644]
db.subproj/db.subproj/Makefile.postamble [new file with mode: 0644]
db.subproj/db.subproj/Makefile.preamble [new file with mode: 0644]
db.subproj/db.subproj/PB.project [new file with mode: 0644]
db.subproj/db.subproj/db.c [new file with mode: 0644]
db.subproj/hash.subproj/Makefile [new file with mode: 0644]
db.subproj/hash.subproj/Makefile.postamble [new file with mode: 0644]
db.subproj/hash.subproj/Makefile.preamble [new file with mode: 0644]
db.subproj/hash.subproj/PB.project [new file with mode: 0644]
db.subproj/hash.subproj/extern.h [new file with mode: 0644]
db.subproj/hash.subproj/hash.c [new file with mode: 0644]
db.subproj/hash.subproj/hash.h [new file with mode: 0644]
db.subproj/hash.subproj/hash_bigkey.c [new file with mode: 0644]
db.subproj/hash.subproj/hash_buf.c [new file with mode: 0644]
db.subproj/hash.subproj/hash_func.c [new file with mode: 0644]
db.subproj/hash.subproj/hash_log2.c [new file with mode: 0644]
db.subproj/hash.subproj/hash_page.c [new file with mode: 0644]
db.subproj/hash.subproj/hsearch.c [new file with mode: 0644]
db.subproj/hash.subproj/ndbm.c [new file with mode: 0644]
db.subproj/hash.subproj/page.h [new file with mode: 0644]
db.subproj/hash.subproj/search.h [new file with mode: 0644]
db.subproj/mpool.subproj/Makefile [new file with mode: 0644]
db.subproj/mpool.subproj/Makefile.postamble [new file with mode: 0644]
db.subproj/mpool.subproj/Makefile.preamble [new file with mode: 0644]
db.subproj/mpool.subproj/PB.project [new file with mode: 0644]
db.subproj/mpool.subproj/mpool.c [new file with mode: 0644]
db.subproj/recno.subproj/Makefile [new file with mode: 0644]
db.subproj/recno.subproj/Makefile.postamble [new file with mode: 0644]
db.subproj/recno.subproj/Makefile.preamble [new file with mode: 0644]
db.subproj/recno.subproj/PB.project [new file with mode: 0644]
db.subproj/recno.subproj/extern.h [new file with mode: 0644]
db.subproj/recno.subproj/rec_close.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_delete.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_get.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_open.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_put.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_search.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_seq.c [new file with mode: 0644]
db.subproj/recno.subproj/rec_utils.c [new file with mode: 0644]
db.subproj/recno.subproj/recno.h [new file with mode: 0644]
gen.subproj/Makefile [new file with mode: 0644]
gen.subproj/Makefile.postamble [new file with mode: 0644]
gen.subproj/Makefile.preamble [new file with mode: 0644]
gen.subproj/NSSystemDirectories.c [new file with mode: 0644]
gen.subproj/PB.project [new file with mode: 0644]
gen.subproj/alarm.c [new file with mode: 0644]
gen.subproj/assert.c [new file with mode: 0644]
gen.subproj/clock.c [new file with mode: 0644]
gen.subproj/closedir.c [new file with mode: 0644]
gen.subproj/confstr.c [new file with mode: 0644]
gen.subproj/crypt.c [new file with mode: 0644]
gen.subproj/ctermid.c [new file with mode: 0644]
gen.subproj/ctime.c [new file with mode: 0644]
gen.subproj/daemon.c [new file with mode: 0644]
gen.subproj/devname.c [new file with mode: 0644]
gen.subproj/difftime.c [new file with mode: 0644]
gen.subproj/disklabel.c [new file with mode: 0644]
gen.subproj/err.c [new file with mode: 0644]
gen.subproj/errlst.c [new file with mode: 0644]
gen.subproj/exec.c [new file with mode: 0644]
gen.subproj/fnmatch.c [new file with mode: 0644]
gen.subproj/ftok.3 [new file with mode: 0644]
gen.subproj/ftok.c [new file with mode: 0644]
gen.subproj/fts.c [new file with mode: 0644]
gen.subproj/getbsize.c [new file with mode: 0644]
gen.subproj/getcap.c [new file with mode: 0644]
gen.subproj/getcwd.c [new file with mode: 0644]
gen.subproj/gethostname.c [new file with mode: 0644]
gen.subproj/getloadavg.c [new file with mode: 0644]
gen.subproj/getlogin.c [new file with mode: 0644]
gen.subproj/getmntinfo.c [new file with mode: 0644]
gen.subproj/getpagesize.c [new file with mode: 0644]
gen.subproj/getpass.c [new file with mode: 0644]
gen.subproj/getttyent.c [new file with mode: 0644]
gen.subproj/getusershell.c [new file with mode: 0644]
gen.subproj/getvfsbyname.c [new file with mode: 0644]
gen.subproj/gmon.c [new file with mode: 0644]
gen.subproj/i386.subproj/Makefile [new file with mode: 0644]
gen.subproj/i386.subproj/Makefile.postamble [new file with mode: 0644]
gen.subproj/i386.subproj/Makefile.preamble [new file with mode: 0644]
gen.subproj/i386.subproj/PB.project [new file with mode: 0644]
gen.subproj/i386.subproj/abs.c [new file with mode: 0644]
gen.subproj/i386.subproj/bcmp.c [new file with mode: 0644]
gen.subproj/i386.subproj/bcopy.c [new file with mode: 0644]
gen.subproj/i386.subproj/bzero.c [new file with mode: 0644]
gen.subproj/i386.subproj/ecvt.c [new file with mode: 0644]
gen.subproj/i386.subproj/ffs.c [new file with mode: 0644]
gen.subproj/i386.subproj/insque.c [new file with mode: 0644]
gen.subproj/i386.subproj/isinf.c [new file with mode: 0644]
gen.subproj/i386.subproj/mcount.s [new file with mode: 0644]
gen.subproj/i386.subproj/memcpy.c [new file with mode: 0644]
gen.subproj/i386.subproj/memmove.c [new file with mode: 0644]
gen.subproj/i386.subproj/remque.c [new file with mode: 0644]
gen.subproj/i386.subproj/setjmperr.c [new file with mode: 0644]
gen.subproj/i386.subproj/strcat.c [new file with mode: 0644]
gen.subproj/i386.subproj/strcpy.c [new file with mode: 0644]
gen.subproj/i386.subproj/strlen.c [new file with mode: 0644]
gen.subproj/i386.subproj/strncat.c [new file with mode: 0644]
gen.subproj/i386.subproj/strncmp.c [new file with mode: 0644]
gen.subproj/i386.subproj/strncpy.c [new file with mode: 0644]
gen.subproj/isatty.c [new file with mode: 0644]
gen.subproj/isnan.c [new file with mode: 0644]
gen.subproj/malloc.c [new file with mode: 0644]
gen.subproj/malloc.h [new file with mode: 0644]
gen.subproj/nanosleep.c [new file with mode: 0644]
gen.subproj/nice.c [new file with mode: 0644]
gen.subproj/nlist.c [new file with mode: 0644]
gen.subproj/opendir.c [new file with mode: 0644]
gen.subproj/pause.c [new file with mode: 0644]
gen.subproj/popen.c [new file with mode: 0644]
gen.subproj/ppc.subproj/Makefile [new file with mode: 0644]
gen.subproj/ppc.subproj/Makefile.postamble [new file with mode: 0644]
gen.subproj/ppc.subproj/Makefile.preamble [new file with mode: 0644]
gen.subproj/ppc.subproj/PB.project [new file with mode: 0644]
gen.subproj/ppc.subproj/abs.s [new file with mode: 0644]
gen.subproj/ppc.subproj/bcmp.c [new file with mode: 0644]
gen.subproj/ppc.subproj/bcopy.s [new file with mode: 0644]
gen.subproj/ppc.subproj/bzero.s [new file with mode: 0644]
gen.subproj/ppc.subproj/ecvt.c [new file with mode: 0755]
gen.subproj/ppc.subproj/ffs.s [new file with mode: 0644]
gen.subproj/ppc.subproj/fp.h [new file with mode: 0755]
gen.subproj/ppc.subproj/genassym.h [new file with mode: 0644]
gen.subproj/ppc.subproj/insque.c [new file with mode: 0644]
gen.subproj/ppc.subproj/isinf.c [new file with mode: 0644]
gen.subproj/ppc.subproj/mcount.s [new file with mode: 0644]
gen.subproj/ppc.subproj/memcpy.s [new file with mode: 0644]
gen.subproj/ppc.subproj/memmove.s [new file with mode: 0644]
gen.subproj/ppc.subproj/remque.c [new file with mode: 0644]
gen.subproj/ppc.subproj/setjmperr.c [new file with mode: 0755]
gen.subproj/ppc.subproj/strcat.c [new file with mode: 0644]
gen.subproj/ppc.subproj/strcpy.c [new file with mode: 0644]
gen.subproj/ppc.subproj/strlen.s [new file with mode: 0644]
gen.subproj/ppc.subproj/strncat.c [new file with mode: 0644]
gen.subproj/ppc.subproj/strncmp.c [new file with mode: 0644]
gen.subproj/ppc.subproj/strncpy.c [new file with mode: 0644]
gen.subproj/psignal.c [new file with mode: 0644]
gen.subproj/raise.c [new file with mode: 0644]
gen.subproj/readdir.c [new file with mode: 0644]
gen.subproj/rewinddir.c [new file with mode: 0644]
gen.subproj/scalable_malloc.c [new file with mode: 0644]
gen.subproj/scalable_malloc.h [new file with mode: 0644]
gen.subproj/scandir.c [new file with mode: 0644]
gen.subproj/seekdir.c [new file with mode: 0644]
gen.subproj/sethostname.c [new file with mode: 0644]
gen.subproj/setlogin.c [new file with mode: 0644]
gen.subproj/setmode.c [new file with mode: 0644]
gen.subproj/siginterrupt.c [new file with mode: 0644]
gen.subproj/siglist.c [new file with mode: 0644]
gen.subproj/signal.c [new file with mode: 0644]
gen.subproj/sigsetops.c [new file with mode: 0644]
gen.subproj/sleep.c [new file with mode: 0644]
gen.subproj/stack_logging.c [new file with mode: 0644]
gen.subproj/stack_logging.h [new file with mode: 0644]
gen.subproj/sysconf.c [new file with mode: 0644]
gen.subproj/sysctl.c [new file with mode: 0644]
gen.subproj/sysctlbyname.c [new file with mode: 0644]
gen.subproj/syslog.c [new file with mode: 0644]
gen.subproj/telldir.c [new file with mode: 0644]
gen.subproj/termios.c [new file with mode: 0644]
gen.subproj/time.c [new file with mode: 0644]
gen.subproj/times.c [new file with mode: 0644]
gen.subproj/timezone.c [new file with mode: 0644]
gen.subproj/ttyname.c [new file with mode: 0644]
gen.subproj/ttyslot.c [new file with mode: 0644]
gen.subproj/ualarm.c [new file with mode: 0644]
gen.subproj/uname.c [new file with mode: 0644]
gen.subproj/unvis.c [new file with mode: 0644]
gen.subproj/usleep.c [new file with mode: 0644]
gen.subproj/utime.c [new file with mode: 0644]
gen.subproj/vis.c [new file with mode: 0644]
gen.subproj/wait.c [new file with mode: 0644]
gen.subproj/wait3.c [new file with mode: 0644]
gen.subproj/waitpid.c [new file with mode: 0644]
gen.subproj/zone.c [new file with mode: 0644]
gen.subproj/zone.h [new file with mode: 0644]
headers.subproj/Makefile [new file with mode: 0644]
headers.subproj/Makefile.postamble [new file with mode: 0644]
headers.subproj/Makefile.preamble [new file with mode: 0644]
headers.subproj/NSSystemDirectories.h [new file with mode: 0644]
headers.subproj/PB.project [new file with mode: 0644]
headers.subproj/asm.h [new file with mode: 0644]
headers.subproj/crt_externs.h [new file with mode: 0644]
headers.subproj/libc.h [new file with mode: 0644]
headers.subproj/monitor.h [new file with mode: 0644]
headers.subproj/standards.h [new file with mode: 0644]
internat.subproj/Makefile [new file with mode: 0644]
internat.subproj/Makefile.postamble [new file with mode: 0644]
internat.subproj/Makefile.preamble [new file with mode: 0644]
internat.subproj/NXCType.c [new file with mode: 0644]
internat.subproj/NXCType.h [new file with mode: 0644]
internat.subproj/NXIsAlNum.c [new file with mode: 0644]
internat.subproj/NXIsAlpha.c [new file with mode: 0644]
internat.subproj/NXIsAscii.c [new file with mode: 0644]
internat.subproj/NXIsCntrl.c [new file with mode: 0644]
internat.subproj/NXIsDigit.c [new file with mode: 0644]
internat.subproj/NXIsGraph.c [new file with mode: 0644]
internat.subproj/NXIsLower.c [new file with mode: 0644]
internat.subproj/NXIsPrint.c [new file with mode: 0644]
internat.subproj/NXIsPunct.c [new file with mode: 0644]
internat.subproj/NXIsSpace.c [new file with mode: 0644]
internat.subproj/NXIsUpper.c [new file with mode: 0644]
internat.subproj/NXIsXDigit.c [new file with mode: 0644]
internat.subproj/NXToAscii.c [new file with mode: 0644]
internat.subproj/NXToLower.c [new file with mode: 0644]
internat.subproj/NXToUpper.c [new file with mode: 0644]
internat.subproj/PB.project [new file with mode: 0644]
internat.subproj/_NXToLower.c [new file with mode: 0644]
internat.subproj/_NXToUpper.c [new file with mode: 0644]
locale.subproj/Makefile [new file with mode: 0644]
locale.subproj/Makefile.postamble [new file with mode: 0644]
locale.subproj/Makefile.preamble [new file with mode: 0644]
locale.subproj/PB.project [new file with mode: 0644]
locale.subproj/ansi.c [new file with mode: 0644]
locale.subproj/ctype.c [new file with mode: 0644]
locale.subproj/euc.c [new file with mode: 0644]
locale.subproj/frune.c [new file with mode: 0644]
locale.subproj/isctype.c [new file with mode: 0644]
locale.subproj/lconv.c [new file with mode: 0644]
locale.subproj/localeconv.c [new file with mode: 0644]
locale.subproj/mbrune.c [new file with mode: 0644]
locale.subproj/none.c [new file with mode: 0644]
locale.subproj/rune.c [new file with mode: 0644]
locale.subproj/runetable.c [new file with mode: 0644]
locale.subproj/setlocale.c [new file with mode: 0644]
locale.subproj/utf2.c [new file with mode: 0644]
mach.subproj/Makefile [new file with mode: 0644]
mach.subproj/Makefile.postamble [new file with mode: 0644]
mach.subproj/Makefile.preamble [new file with mode: 0644]
mach.subproj/PB.project [new file with mode: 0644]
mach.subproj/bootstrap.defs [new file with mode: 0644]
mach.subproj/clock.defs [new file with mode: 0644]
mach.subproj/clock_priv.defs [new file with mode: 0644]
mach.subproj/clock_reply.defs [new file with mode: 0644]
mach.subproj/clock_sleep.c [new file with mode: 0644]
mach.subproj/err_ipc.sub [new file with mode: 0644]
mach.subproj/err_kern.sub [new file with mode: 0644]
mach.subproj/err_mach_ipc.sub [new file with mode: 0644]
mach.subproj/err_server.sub [new file with mode: 0644]
mach.subproj/err_us.sub [new file with mode: 0644]
mach.subproj/error_codes.c [new file with mode: 0644]
mach.subproj/exc.defs [new file with mode: 0644]
mach.subproj/exc_catcher.c [new file with mode: 0644]
mach.subproj/exc_catcher_state.c [new file with mode: 0644]
mach.subproj/exc_catcher_state_identity.c [new file with mode: 0644]
mach.subproj/externs.h [new file with mode: 0644]
mach.subproj/fprintf_stderr.c [new file with mode: 0644]
mach.subproj/headers.subproj/Makefile [new file with mode: 0644]
mach.subproj/headers.subproj/Makefile.postamble [new file with mode: 0644]
mach.subproj/headers.subproj/Makefile.preamble [new file with mode: 0644]
mach.subproj/headers.subproj/PB.project [new file with mode: 0644]
mach.subproj/headers.subproj/errorlib.h [new file with mode: 0644]
mach.subproj/headers.subproj/mach.h [new file with mode: 0644]
mach.subproj/headers.subproj/mach_error.h [new file with mode: 0644]
mach.subproj/headers.subproj/mach_init.h [new file with mode: 0644]
mach.subproj/headers.subproj/mach_interface.h [new file with mode: 0644]
mach.subproj/headers.subproj/mig_errors.h [new file with mode: 0644]
mach.subproj/headers.subproj/port_obj.h [new file with mode: 0644]
mach.subproj/headers.subproj/sync.h [new file with mode: 0644]
mach.subproj/headers.subproj/vm_task.h [new file with mode: 0644]
mach.subproj/host_priv.defs [new file with mode: 0644]
mach.subproj/host_security.defs [new file with mode: 0644]
mach.subproj/ledger.defs [new file with mode: 0644]
mach.subproj/lock_set.defs [new file with mode: 0644]
mach.subproj/mach_absolute_time.c [new file with mode: 0644]
mach.subproj/mach_error.c [new file with mode: 0644]
mach.subproj/mach_error_string.c [new file with mode: 0644]
mach.subproj/mach_host.defs [new file with mode: 0644]
mach.subproj/mach_init.c [new file with mode: 0644]
mach.subproj/mach_init_ports.c [new file with mode: 0644]
mach.subproj/mach_msg.c [new file with mode: 0644]
mach.subproj/mach_msg_destroy.c [new file with mode: 0644]
mach.subproj/mach_msg_receive.c [new file with mode: 0644]
mach.subproj/mach_msg_send.c [new file with mode: 0644]
mach.subproj/mach_msg_server.c [new file with mode: 0644]
mach.subproj/mach_port.defs [new file with mode: 0644]
mach.subproj/mach_subsystem_join.c [new file with mode: 0644]
mach.subproj/mach_traps.s [new file with mode: 0644]
mach.subproj/mig_allocate.c [new file with mode: 0644]
mach.subproj/mig_deallocate.c [new file with mode: 0644]
mach.subproj/mig_reply_setup.c [new file with mode: 0644]
mach.subproj/mig_strncpy.c [new file with mode: 0644]
mach.subproj/ms_thread_switch.c [new file with mode: 0644]
mach.subproj/notify.defs [new file with mode: 0644]
mach.subproj/panic.c [new file with mode: 0644]
mach.subproj/port_obj.c [new file with mode: 0644]
mach.subproj/processor.defs [new file with mode: 0644]
mach.subproj/processor_set.defs [new file with mode: 0644]
mach.subproj/sbrk.c [new file with mode: 0644]
mach.subproj/semaphore.c [new file with mode: 0644]
mach.subproj/servers.subproj/Makefile [new file with mode: 0644]
mach.subproj/servers.subproj/Makefile.postamble [new file with mode: 0644]
mach.subproj/servers.subproj/Makefile.preamble [new file with mode: 0644]
mach.subproj/servers.subproj/PB.project [new file with mode: 0644]
mach.subproj/servers.subproj/bootstrap.defs [new file with mode: 0644]
mach.subproj/servers.subproj/bootstrap_defs.h [new file with mode: 0644]
mach.subproj/servers.subproj/key_defs.h [new file with mode: 0644]
mach.subproj/servers.subproj/ls_defs.h [new file with mode: 0644]
mach.subproj/servers.subproj/netname.defs [new file with mode: 0644]
mach.subproj/servers.subproj/netname_defs.h [new file with mode: 0644]
mach.subproj/servers.subproj/nm_defs.h [new file with mode: 0644]
mach.subproj/slot_name.c [new file with mode: 0644]
mach.subproj/task.defs [new file with mode: 0644]
mach.subproj/thread_act.defs [new file with mode: 0644]
mach.subproj/vm_map.defs [new file with mode: 0644]
net.subproj/Makefile [new file with mode: 0644]
net.subproj/Makefile.postamble [new file with mode: 0644]
net.subproj/Makefile.preamble [new file with mode: 0644]
net.subproj/PB.project [new file with mode: 0644]
net.subproj/inet_addr.c [new file with mode: 0644]
net.subproj/inet_lnaof.c [new file with mode: 0644]
net.subproj/inet_makeaddr.c [new file with mode: 0644]
net.subproj/inet_netof.c [new file with mode: 0644]
net.subproj/inet_network.c [new file with mode: 0644]
net.subproj/inet_ntoa.c [new file with mode: 0644]
net.subproj/iso_addr.c [new file with mode: 0644]
net.subproj/linkaddr.c [new file with mode: 0644]
net.subproj/ns_addr.c [new file with mode: 0644]
net.subproj/ns_ntoa.c [new file with mode: 0644]
net.subproj/nsap_addr.c [new file with mode: 0644]
net.subproj/recv.c [new file with mode: 0644]
pthreads.subproj/Makefile [new file with mode: 0644]
pthreads.subproj/Makefile.postamble [new file with mode: 0644]
pthreads.subproj/Makefile.preamble [new file with mode: 0644]
pthreads.subproj/PB.project [new file with mode: 0644]
pthreads.subproj/lock.s [new file with mode: 0644]
pthreads.subproj/mk_pthread_impl.c [new file with mode: 0644]
pthreads.subproj/posix_sched.h [new file with mode: 0644]
pthreads.subproj/pthread.c [new file with mode: 0644]
pthreads.subproj/pthread.h [new file with mode: 0644]
pthreads.subproj/pthread_cond.c [new file with mode: 0644]
pthreads.subproj/pthread_impl.h [new file with mode: 0644]
pthreads.subproj/pthread_internals.h [new file with mode: 0644]
pthreads.subproj/pthread_machdep.h [new file with mode: 0644]
pthreads.subproj/pthread_mutex.c [new file with mode: 0644]
pthreads.subproj/pthread_tsd.c [new file with mode: 0644]
pthreads.subproj/sched.h [new file with mode: 0644]
pthreads.subproj/stack.s [new file with mode: 0644]
pthreads.subproj/thread_setup.c [new file with mode: 0644]
regex.subproj/Makefile [new file with mode: 0644]
regex.subproj/Makefile.postamble [new file with mode: 0644]
regex.subproj/Makefile.preamble [new file with mode: 0644]
regex.subproj/PB.project [new file with mode: 0644]
regex.subproj/cclass.h [new file with mode: 0644]
regex.subproj/cname.h [new file with mode: 0644]
regex.subproj/engine.c [new file with mode: 0644]
regex.subproj/regcomp.c [new file with mode: 0644]
regex.subproj/regerror.c [new file with mode: 0644]
regex.subproj/regex2.h [new file with mode: 0644]
regex.subproj/regexec.c [new file with mode: 0644]
regex.subproj/regfree.c [new file with mode: 0644]
regex.subproj/utils.h [new file with mode: 0644]
stdio.subproj/Makefile [new file with mode: 0644]
stdio.subproj/Makefile.postamble [new file with mode: 0644]
stdio.subproj/Makefile.preamble [new file with mode: 0644]
stdio.subproj/PB.project [new file with mode: 0644]
stdio.subproj/clrerr.c [new file with mode: 0644]
stdio.subproj/fclose.c [new file with mode: 0644]
stdio.subproj/fdopen.c [new file with mode: 0644]
stdio.subproj/feof.c [new file with mode: 0644]
stdio.subproj/ferror.c [new file with mode: 0644]
stdio.subproj/fflush.c [new file with mode: 0644]
stdio.subproj/fgetc.c [new file with mode: 0644]
stdio.subproj/fgetln.c [new file with mode: 0644]
stdio.subproj/fgetpos.c [new file with mode: 0644]
stdio.subproj/fgets.c [new file with mode: 0644]
stdio.subproj/fileno.c [new file with mode: 0644]
stdio.subproj/findfp.c [new file with mode: 0644]
stdio.subproj/flags.c [new file with mode: 0644]
stdio.subproj/floatio.h [new file with mode: 0644]
stdio.subproj/fopen.c [new file with mode: 0644]
stdio.subproj/fprintf.c [new file with mode: 0644]
stdio.subproj/fpurge.c [new file with mode: 0644]
stdio.subproj/fputc.c [new file with mode: 0644]
stdio.subproj/fputs.c [new file with mode: 0644]
stdio.subproj/fread.c [new file with mode: 0644]
stdio.subproj/freopen.c [new file with mode: 0644]
stdio.subproj/fscanf.c [new file with mode: 0644]
stdio.subproj/fseek.c [new file with mode: 0644]
stdio.subproj/fsetpos.c [new file with mode: 0644]
stdio.subproj/ftell.c [new file with mode: 0644]
stdio.subproj/funopen.c [new file with mode: 0644]
stdio.subproj/fvwrite.c [new file with mode: 0644]
stdio.subproj/fvwrite.h [new file with mode: 0644]
stdio.subproj/fwalk.c [new file with mode: 0644]
stdio.subproj/fwrite.c [new file with mode: 0644]
stdio.subproj/getc.c [new file with mode: 0644]
stdio.subproj/getchar.c [new file with mode: 0644]
stdio.subproj/gets.c [new file with mode: 0644]
stdio.subproj/getw.c [new file with mode: 0644]
stdio.subproj/glue.h [new file with mode: 0644]
stdio.subproj/local.h [new file with mode: 0644]
stdio.subproj/makebuf.c [new file with mode: 0644]
stdio.subproj/mktemp.c [new file with mode: 0644]
stdio.subproj/perror.c [new file with mode: 0644]
stdio.subproj/printf.c [new file with mode: 0644]
stdio.subproj/putc.c [new file with mode: 0644]
stdio.subproj/putchar.c [new file with mode: 0644]
stdio.subproj/puts.c [new file with mode: 0644]
stdio.subproj/putw.c [new file with mode: 0644]
stdio.subproj/refill.c [new file with mode: 0644]
stdio.subproj/remove.c [new file with mode: 0644]
stdio.subproj/rewind.c [new file with mode: 0644]
stdio.subproj/rget.c [new file with mode: 0644]
stdio.subproj/scanf.c [new file with mode: 0644]
stdio.subproj/setbuf.c [new file with mode: 0644]
stdio.subproj/setbuffer.c [new file with mode: 0644]
stdio.subproj/setvbuf.c [new file with mode: 0644]
stdio.subproj/snprintf.c [new file with mode: 0644]
stdio.subproj/sprintf.c [new file with mode: 0644]
stdio.subproj/sscanf.c [new file with mode: 0644]
stdio.subproj/stdio.c [new file with mode: 0644]
stdio.subproj/tempnam.c [new file with mode: 0644]
stdio.subproj/tmpfile.c [new file with mode: 0644]
stdio.subproj/tmpnam.c [new file with mode: 0644]
stdio.subproj/ungetc.c [new file with mode: 0644]
stdio.subproj/vfprintf.c [new file with mode: 0644]
stdio.subproj/vfscanf.c [new file with mode: 0644]
stdio.subproj/vprintf.c [new file with mode: 0644]
stdio.subproj/vscanf.c [new file with mode: 0644]
stdio.subproj/vsnprintf.c [new file with mode: 0644]
stdio.subproj/vsprintf.c [new file with mode: 0644]
stdio.subproj/vsscanf.c [new file with mode: 0644]
stdio.subproj/wbuf.c [new file with mode: 0644]
stdio.subproj/wsetup.c [new file with mode: 0644]
stdlib.subproj/Makefile [new file with mode: 0644]
stdlib.subproj/Makefile.postamble [new file with mode: 0644]
stdlib.subproj/Makefile.preamble [new file with mode: 0644]
stdlib.subproj/PB.project [new file with mode: 0644]
stdlib.subproj/abort.c [new file with mode: 0644]
stdlib.subproj/atexit.c [new file with mode: 0644]
stdlib.subproj/atexit.h [new file with mode: 0644]
stdlib.subproj/atof.c [new file with mode: 0644]
stdlib.subproj/atoi.c [new file with mode: 0644]
stdlib.subproj/atol.c [new file with mode: 0644]
stdlib.subproj/bsearch.c [new file with mode: 0644]
stdlib.subproj/div.c [new file with mode: 0644]
stdlib.subproj/exit.c [new file with mode: 0644]
stdlib.subproj/getenv.c [new file with mode: 0644]
stdlib.subproj/getopt.c [new file with mode: 0644]
stdlib.subproj/getsubopt.c [new file with mode: 0644]
stdlib.subproj/heapsort.c [new file with mode: 0644]
stdlib.subproj/labs.c [new file with mode: 0644]
stdlib.subproj/ldiv.c [new file with mode: 0644]
stdlib.subproj/merge.c [new file with mode: 0644]
stdlib.subproj/putenv.c [new file with mode: 0644]
stdlib.subproj/qsort.c [new file with mode: 0644]
stdlib.subproj/radixsort.c [new file with mode: 0644]
stdlib.subproj/rand.c [new file with mode: 0644]
stdlib.subproj/random.c [new file with mode: 0644]
stdlib.subproj/setenv.c [new file with mode: 0644]
stdlib.subproj/strtod.c [new file with mode: 0644]
stdlib.subproj/strtol.c [new file with mode: 0644]
stdlib.subproj/strtoq.c [new file with mode: 0644]
stdlib.subproj/strtoul.c [new file with mode: 0644]
stdlib.subproj/strtouq.c [new file with mode: 0644]
stdlib.subproj/system.c [new file with mode: 0644]
string.subproj/Makefile [new file with mode: 0644]
string.subproj/Makefile.postamble [new file with mode: 0644]
string.subproj/Makefile.preamble [new file with mode: 0644]
string.subproj/PB.project [new file with mode: 0644]
string.subproj/index.c [new file with mode: 0644]
string.subproj/memccpy.c [new file with mode: 0644]
string.subproj/memchr.c [new file with mode: 0644]
string.subproj/memcmp.c [new file with mode: 0644]
string.subproj/memset.c [new file with mode: 0644]
string.subproj/rindex.c [new file with mode: 0644]
string.subproj/rindix.c [new file with mode: 0644]
string.subproj/strcasecmp.c [new file with mode: 0644]
string.subproj/strchr.c [new file with mode: 0644]
string.subproj/strcmp.s [new file with mode: 0644]
string.subproj/strcoll.c [new file with mode: 0644]
string.subproj/strcspn.c [new file with mode: 0644]
string.subproj/strdup.c [new file with mode: 0644]
string.subproj/strerror.c [new file with mode: 0644]
string.subproj/strftime.c [new file with mode: 0644]
string.subproj/strmode.c [new file with mode: 0644]
string.subproj/strpbrk.c [new file with mode: 0644]
string.subproj/strsep.c [new file with mode: 0644]
string.subproj/strspn.c [new file with mode: 0644]
string.subproj/strstr.c [new file with mode: 0644]
string.subproj/strtok.c [new file with mode: 0644]
string.subproj/strxfrm.c [new file with mode: 0644]
string.subproj/swab.c [new file with mode: 0644]
sys.subproj/Makefile [new file with mode: 0644]
sys.subproj/Makefile.postamble [new file with mode: 0644]
sys.subproj/Makefile.preamble [new file with mode: 0644]
sys.subproj/PB.project [new file with mode: 0644]
sys.subproj/errno.c [new file with mode: 0644]
sys.subproj/getdtablesize.c [new file with mode: 0644]
sys.subproj/gettimeofday.c [new file with mode: 0644]
sys.subproj/i386.subproj/ATPgetreq.s [new file with mode: 0644]
sys.subproj/i386.subproj/ATPgetrsp.s [new file with mode: 0644]
sys.subproj/i386.subproj/ATPsndreq.s [new file with mode: 0644]
sys.subproj/i386.subproj/ATPsndrsp.s [new file with mode: 0644]
sys.subproj/i386.subproj/ATgetmsg.s [new file with mode: 0644]
sys.subproj/i386.subproj/ATputmsg.s [new file with mode: 0644]
sys.subproj/i386.subproj/ATsocket.s [new file with mode: 0644]
sys.subproj/i386.subproj/Makefile [new file with mode: 0644]
sys.subproj/i386.subproj/Makefile.postamble [new file with mode: 0644]
sys.subproj/i386.subproj/Makefile.preamble [new file with mode: 0644]
sys.subproj/i386.subproj/PB.project [new file with mode: 0644]
sys.subproj/i386.subproj/SYS.h [new file with mode: 0644]
sys.subproj/i386.subproj/_exit.s [new file with mode: 0644]
sys.subproj/i386.subproj/_getlogin.s [new file with mode: 0644]
sys.subproj/i386.subproj/_setjmp.s [new file with mode: 0644]
sys.subproj/i386.subproj/_setlogin.s [new file with mode: 0644]
sys.subproj/i386.subproj/_sysctl.s [new file with mode: 0644]
sys.subproj/i386.subproj/accept.s [new file with mode: 0644]
sys.subproj/i386.subproj/access.s [new file with mode: 0644]
sys.subproj/i386.subproj/acct.s [new file with mode: 0644]
sys.subproj/i386.subproj/add_profil.s [new file with mode: 0644]
sys.subproj/i386.subproj/adjtime.s [new file with mode: 0644]
sys.subproj/i386.subproj/bind.s [new file with mode: 0644]
sys.subproj/i386.subproj/cerror.s [new file with mode: 0644]
sys.subproj/i386.subproj/chdir.s [new file with mode: 0644]
sys.subproj/i386.subproj/checkuseraccess.s [new file with mode: 0644]
sys.subproj/i386.subproj/chflags.s [new file with mode: 0644]
sys.subproj/i386.subproj/chmod.s [new file with mode: 0644]
sys.subproj/i386.subproj/chown.s [new file with mode: 0644]
sys.subproj/i386.subproj/chroot.s [new file with mode: 0644]
sys.subproj/i386.subproj/close.s [new file with mode: 0644]
sys.subproj/i386.subproj/connect.s [new file with mode: 0644]
sys.subproj/i386.subproj/dup.s [new file with mode: 0644]
sys.subproj/i386.subproj/dup2.s [new file with mode: 0644]
sys.subproj/i386.subproj/exchangedata.s [new file with mode: 0644]
sys.subproj/i386.subproj/execve.s [new file with mode: 0644]
sys.subproj/i386.subproj/fchdir.s [new file with mode: 0644]
sys.subproj/i386.subproj/fchflags.s [new file with mode: 0644]
sys.subproj/i386.subproj/fchmod.s [new file with mode: 0644]
sys.subproj/i386.subproj/fchown.s [new file with mode: 0644]
sys.subproj/i386.subproj/fcntl.s [new file with mode: 0644]
sys.subproj/i386.subproj/flock.s [new file with mode: 0644]
sys.subproj/i386.subproj/fork.s [new file with mode: 0644]
sys.subproj/i386.subproj/fpathconf.s [new file with mode: 0644]
sys.subproj/i386.subproj/fstat.s [new file with mode: 0644]
sys.subproj/i386.subproj/fstatfs.s [new file with mode: 0644]
sys.subproj/i386.subproj/fstatv.s [new file with mode: 0644]
sys.subproj/i386.subproj/fsync.s [new file with mode: 0644]
sys.subproj/i386.subproj/ftruncate.s [new file with mode: 0644]
sys.subproj/i386.subproj/getattrlist.s [new file with mode: 0644]
sys.subproj/i386.subproj/getdirentries.s [new file with mode: 0644]
sys.subproj/i386.subproj/getdirentriesattr.s [new file with mode: 0644]
sys.subproj/i386.subproj/getegid.s [new file with mode: 0644]
sys.subproj/i386.subproj/geteuid.s [new file with mode: 0644]
sys.subproj/i386.subproj/getfh.s [new file with mode: 0644]
sys.subproj/i386.subproj/getfsstat.s [new file with mode: 0644]
sys.subproj/i386.subproj/getgid.s [new file with mode: 0644]
sys.subproj/i386.subproj/getgroups.s [new file with mode: 0644]
sys.subproj/i386.subproj/getitimer.s [new file with mode: 0644]
sys.subproj/i386.subproj/getpeername.s [new file with mode: 0644]
sys.subproj/i386.subproj/getpgrp.s [new file with mode: 0644]
sys.subproj/i386.subproj/getpid.s [new file with mode: 0644]
sys.subproj/i386.subproj/getppid.s [new file with mode: 0644]
sys.subproj/i386.subproj/getpriority.s [new file with mode: 0644]
sys.subproj/i386.subproj/getrlimit.s [new file with mode: 0644]
sys.subproj/i386.subproj/getrusage.s [new file with mode: 0644]
sys.subproj/i386.subproj/getsockname.s [new file with mode: 0644]
sys.subproj/i386.subproj/getsockopt.s [new file with mode: 0644]
sys.subproj/i386.subproj/getuid.s [new file with mode: 0644]
sys.subproj/i386.subproj/ioctl.s [new file with mode: 0644]
sys.subproj/i386.subproj/kill.s [new file with mode: 0644]
sys.subproj/i386.subproj/ktrace.s [new file with mode: 0644]
sys.subproj/i386.subproj/lfs_bmapv.s [new file with mode: 0644]
sys.subproj/i386.subproj/lfs_markv.s [new file with mode: 0644]
sys.subproj/i386.subproj/lfs_segclean.s [new file with mode: 0644]
sys.subproj/i386.subproj/lfs_segwait.s [new file with mode: 0644]
sys.subproj/i386.subproj/link.s [new file with mode: 0644]
sys.subproj/i386.subproj/listen.s [new file with mode: 0644]
sys.subproj/i386.subproj/load_shared_file.s [new file with mode: 0644]
sys.subproj/i386.subproj/lseek.s [new file with mode: 0644]
sys.subproj/i386.subproj/lstat.s [new file with mode: 0644]
sys.subproj/i386.subproj/lstatv.s [new file with mode: 0644]
sys.subproj/i386.subproj/madvise.s [new file with mode: 0644]
sys.subproj/i386.subproj/mincore.s [new file with mode: 0644]
sys.subproj/i386.subproj/minherit.s [new file with mode: 0644]
sys.subproj/i386.subproj/mkcomplex.s [new file with mode: 0644]
sys.subproj/i386.subproj/mkdir.s [new file with mode: 0644]
sys.subproj/i386.subproj/mkfifo.s [new file with mode: 0644]
sys.subproj/i386.subproj/mknod.s [new file with mode: 0644]
sys.subproj/i386.subproj/mlock.s [new file with mode: 0644]
sys.subproj/i386.subproj/mlockall.s [new file with mode: 0644]
sys.subproj/i386.subproj/mmap.s [new file with mode: 0644]
sys.subproj/i386.subproj/mount.s [new file with mode: 0644]
sys.subproj/i386.subproj/mprotect.s [new file with mode: 0644]
sys.subproj/i386.subproj/msgctl.s [new file with mode: 0644]
sys.subproj/i386.subproj/msgget.s [new file with mode: 0644]
sys.subproj/i386.subproj/msgrcv.s [new file with mode: 0644]
sys.subproj/i386.subproj/msgsnd.s [new file with mode: 0644]
sys.subproj/i386.subproj/msgsys.s [new file with mode: 0644]
sys.subproj/i386.subproj/msync.s [new file with mode: 0644]
sys.subproj/i386.subproj/munlock.s [new file with mode: 0644]
sys.subproj/i386.subproj/munlockall.s [new file with mode: 0644]
sys.subproj/i386.subproj/munmap.s [new file with mode: 0644]
sys.subproj/i386.subproj/nfssvc.s [new file with mode: 0644]
sys.subproj/i386.subproj/open.s [new file with mode: 0644]
sys.subproj/i386.subproj/pathconf.s [new file with mode: 0644]
sys.subproj/i386.subproj/pipe.s [new file with mode: 0644]
sys.subproj/i386.subproj/profil.s [new file with mode: 0644]
sys.subproj/i386.subproj/ptrace.s [new file with mode: 0644]
sys.subproj/i386.subproj/quota.s [new file with mode: 0644]
sys.subproj/i386.subproj/quotactl.s [new file with mode: 0644]
sys.subproj/i386.subproj/read.s [new file with mode: 0644]
sys.subproj/i386.subproj/readlink.s [new file with mode: 0644]
sys.subproj/i386.subproj/readv.s [new file with mode: 0644]
sys.subproj/i386.subproj/reboot.s [new file with mode: 0644]
sys.subproj/i386.subproj/recvfrom.s [new file with mode: 0644]
sys.subproj/i386.subproj/recvmsg.s [new file with mode: 0644]
sys.subproj/i386.subproj/rename.s [new file with mode: 0644]
sys.subproj/i386.subproj/reset_shared_file.s [new file with mode: 0644]
sys.subproj/i386.subproj/revoke.s [new file with mode: 0644]
sys.subproj/i386.subproj/rmdir.s [new file with mode: 0644]
sys.subproj/i386.subproj/searchfs.s [new file with mode: 0644]
sys.subproj/i386.subproj/select.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_close.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_destroy.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_getvalue.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_init.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_open.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_post.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_trywait.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_unlink.s [new file with mode: 0644]
sys.subproj/i386.subproj/sem_wait.s [new file with mode: 0644]
sys.subproj/i386.subproj/semconfig.s [new file with mode: 0644]
sys.subproj/i386.subproj/semctl.s [new file with mode: 0644]
sys.subproj/i386.subproj/semget.s [new file with mode: 0644]
sys.subproj/i386.subproj/semop.s [new file with mode: 0644]
sys.subproj/i386.subproj/semsys.s [new file with mode: 0644]
sys.subproj/i386.subproj/sendmsg.s [new file with mode: 0644]
sys.subproj/i386.subproj/sendto.s [new file with mode: 0644]
sys.subproj/i386.subproj/setattrlist.s [new file with mode: 0644]
sys.subproj/i386.subproj/setegid.s [new file with mode: 0644]
sys.subproj/i386.subproj/seteuid.s [new file with mode: 0644]
sys.subproj/i386.subproj/setgid.s [new file with mode: 0644]
sys.subproj/i386.subproj/setgroups.s [new file with mode: 0644]
sys.subproj/i386.subproj/setitimer.s [new file with mode: 0644]
sys.subproj/i386.subproj/setjmp.s [new file with mode: 0644]
sys.subproj/i386.subproj/setpgid.s [new file with mode: 0644]
sys.subproj/i386.subproj/setpriority.s [new file with mode: 0644]
sys.subproj/i386.subproj/setprivexec.s [new file with mode: 0644]
sys.subproj/i386.subproj/setquota.s [new file with mode: 0644]
sys.subproj/i386.subproj/setrlimit.s [new file with mode: 0644]
sys.subproj/i386.subproj/setsid.s [new file with mode: 0644]
sys.subproj/i386.subproj/setsockopt.s [new file with mode: 0644]
sys.subproj/i386.subproj/settimeofday.s [new file with mode: 0644]
sys.subproj/i386.subproj/setuid.s [new file with mode: 0644]
sys.subproj/i386.subproj/shm_open.s [new file with mode: 0644]
sys.subproj/i386.subproj/shm_unlink.s [new file with mode: 0644]
sys.subproj/i386.subproj/shmat.s [new file with mode: 0644]
sys.subproj/i386.subproj/shmctl.s [new file with mode: 0644]
sys.subproj/i386.subproj/shmdt.s [new file with mode: 0644]
sys.subproj/i386.subproj/shmget.s [new file with mode: 0644]
sys.subproj/i386.subproj/shmsys.s [new file with mode: 0644]
sys.subproj/i386.subproj/shutdown.s [new file with mode: 0644]
sys.subproj/i386.subproj/sigaltstack.s [new file with mode: 0644]
sys.subproj/i386.subproj/sigpending.s [new file with mode: 0644]
sys.subproj/i386.subproj/sigreturn.s [new file with mode: 0644]
sys.subproj/i386.subproj/socket.s [new file with mode: 0644]
sys.subproj/i386.subproj/socketpair.s [new file with mode: 0644]
sys.subproj/i386.subproj/stat.s [new file with mode: 0644]
sys.subproj/i386.subproj/statfs.s [new file with mode: 0644]
sys.subproj/i386.subproj/statv.s [new file with mode: 0644]
sys.subproj/i386.subproj/swapon.s [new file with mode: 0644]
sys.subproj/i386.subproj/symlink.s [new file with mode: 0644]
sys.subproj/i386.subproj/sync.s [new file with mode: 0644]
sys.subproj/i386.subproj/syscall.s [new file with mode: 0644]
sys.subproj/i386.subproj/table.s [new file with mode: 0644]
sys.subproj/i386.subproj/truncate.s [new file with mode: 0644]
sys.subproj/i386.subproj/umask.s [new file with mode: 0644]
sys.subproj/i386.subproj/undelete.s [new file with mode: 0644]
sys.subproj/i386.subproj/unlink.s [new file with mode: 0644]
sys.subproj/i386.subproj/unmount.s [new file with mode: 0644]
sys.subproj/i386.subproj/utimes.s [new file with mode: 0644]
sys.subproj/i386.subproj/vfork.s [new file with mode: 0644]
sys.subproj/i386.subproj/wait4.s [new file with mode: 0644]
sys.subproj/i386.subproj/write.s [new file with mode: 0644]
sys.subproj/i386.subproj/writev.s [new file with mode: 0644]
sys.subproj/msync.2 [new file with mode: 0644]
sys.subproj/ppc.subproj/ATPgetreq.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ATPgetrsp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ATPsndreq.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ATPsndrsp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ATgetmsg.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ATputmsg.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ATsocket.s [new file with mode: 0644]
sys.subproj/ppc.subproj/Makefile [new file with mode: 0644]
sys.subproj/ppc.subproj/Makefile.postamble [new file with mode: 0644]
sys.subproj/ppc.subproj/Makefile.preamble [new file with mode: 0644]
sys.subproj/ppc.subproj/PB.project [new file with mode: 0644]
sys.subproj/ppc.subproj/SYS.h [new file with mode: 0644]
sys.subproj/ppc.subproj/_exit.s [new file with mode: 0644]
sys.subproj/ppc.subproj/_getlogin.s [new file with mode: 0644]
sys.subproj/ppc.subproj/_longjmp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/_setjmp.h [new file with mode: 0644]
sys.subproj/ppc.subproj/_setjmp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/_setlogin.s [new file with mode: 0644]
sys.subproj/ppc.subproj/_sysctl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/accept.s [new file with mode: 0644]
sys.subproj/ppc.subproj/access.s [new file with mode: 0644]
sys.subproj/ppc.subproj/acct.s [new file with mode: 0644]
sys.subproj/ppc.subproj/add_profil.s [new file with mode: 0644]
sys.subproj/ppc.subproj/adjtime.s [new file with mode: 0644]
sys.subproj/ppc.subproj/assym.h [new file with mode: 0644]
sys.subproj/ppc.subproj/bind.s [new file with mode: 0644]
sys.subproj/ppc.subproj/cerror.s [new file with mode: 0644]
sys.subproj/ppc.subproj/chdir.s [new file with mode: 0644]
sys.subproj/ppc.subproj/checkuseraccess.s [new file with mode: 0644]
sys.subproj/ppc.subproj/chflags.s [new file with mode: 0644]
sys.subproj/ppc.subproj/chmod.s [new file with mode: 0644]
sys.subproj/ppc.subproj/chown.s [new file with mode: 0644]
sys.subproj/ppc.subproj/chroot.s [new file with mode: 0644]
sys.subproj/ppc.subproj/close.s [new file with mode: 0644]
sys.subproj/ppc.subproj/connect.s [new file with mode: 0644]
sys.subproj/ppc.subproj/cthread.s [new file with mode: 0644]
sys.subproj/ppc.subproj/dup.s [new file with mode: 0644]
sys.subproj/ppc.subproj/dup2.s [new file with mode: 0644]
sys.subproj/ppc.subproj/exchangedata.s [new file with mode: 0644]
sys.subproj/ppc.subproj/execve.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fchdir.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fchflags.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fchmod.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fchown.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fcntl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/flock.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fork.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fpathconf.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fstat.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fstatfs.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fstatv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/fsync.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ftruncate.s [new file with mode: 0644]
sys.subproj/ppc.subproj/genassym.h [new file with mode: 0644]
sys.subproj/ppc.subproj/getattrlist.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getdirentries.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getdirentriesattr.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getegid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/geteuid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getfh.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getfsstat.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getgid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getgroups.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getitimer.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getpeername.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getpgrp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getpid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getppid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getpriority.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getrlimit.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getrusage.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getsockname.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getsockopt.s [new file with mode: 0644]
sys.subproj/ppc.subproj/getuid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ioctl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/kill.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ktrace.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lfs_bmapv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lfs_markv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lfs_segclean.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lfs_segwait.s [new file with mode: 0644]
sys.subproj/ppc.subproj/link.s [new file with mode: 0644]
sys.subproj/ppc.subproj/listen.s [new file with mode: 0644]
sys.subproj/ppc.subproj/load_shared_file.s [new file with mode: 0644]
sys.subproj/ppc.subproj/longjmp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lseek.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lstat.s [new file with mode: 0644]
sys.subproj/ppc.subproj/lstatv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/madvise.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mincore.s [new file with mode: 0644]
sys.subproj/ppc.subproj/minherit.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mkcomplex.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mkdir.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mkfifo.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mknod.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mlock.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mlockall.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mmap.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mount.s [new file with mode: 0644]
sys.subproj/ppc.subproj/mprotect.s [new file with mode: 0644]
sys.subproj/ppc.subproj/msgctl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/msgget.s [new file with mode: 0644]
sys.subproj/ppc.subproj/msgrcv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/msgsnd.s [new file with mode: 0644]
sys.subproj/ppc.subproj/msgsys.s [new file with mode: 0644]
sys.subproj/ppc.subproj/msync.s [new file with mode: 0644]
sys.subproj/ppc.subproj/munlock.s [new file with mode: 0644]
sys.subproj/ppc.subproj/munlockall.s [new file with mode: 0644]
sys.subproj/ppc.subproj/munmap.s [new file with mode: 0644]
sys.subproj/ppc.subproj/nfssvc.s [new file with mode: 0644]
sys.subproj/ppc.subproj/open.s [new file with mode: 0644]
sys.subproj/ppc.subproj/pathconf.s [new file with mode: 0644]
sys.subproj/ppc.subproj/pipe.s [new file with mode: 0644]
sys.subproj/ppc.subproj/processor_facilities.h [new file with mode: 0644]
sys.subproj/ppc.subproj/processor_facilities.s [new file with mode: 0644]
sys.subproj/ppc.subproj/profil.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ptrace.s [new file with mode: 0644]
sys.subproj/ppc.subproj/quota.s [new file with mode: 0644]
sys.subproj/ppc.subproj/quotactl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/read.s [new file with mode: 0644]
sys.subproj/ppc.subproj/readlink.s [new file with mode: 0644]
sys.subproj/ppc.subproj/readv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/reboot.s [new file with mode: 0644]
sys.subproj/ppc.subproj/recvfrom.s [new file with mode: 0644]
sys.subproj/ppc.subproj/recvmsg.s [new file with mode: 0644]
sys.subproj/ppc.subproj/rename.s [new file with mode: 0644]
sys.subproj/ppc.subproj/reset_shared_file.s [new file with mode: 0644]
sys.subproj/ppc.subproj/revoke.s [new file with mode: 0644]
sys.subproj/ppc.subproj/rmdir.s [new file with mode: 0644]
sys.subproj/ppc.subproj/searchfs.s [new file with mode: 0644]
sys.subproj/ppc.subproj/select.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_close.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_destroy.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_getvalue.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_init.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_open.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_post.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_trywait.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_unlink.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sem_wait.s [new file with mode: 0644]
sys.subproj/ppc.subproj/semconfig.s [new file with mode: 0644]
sys.subproj/ppc.subproj/semctl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/semget.s [new file with mode: 0644]
sys.subproj/ppc.subproj/semop.s [new file with mode: 0644]
sys.subproj/ppc.subproj/semsys.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sendmsg.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sendto.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setattrlist.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setegid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/seteuid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setgid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setgroups.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setitimer.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setjmp.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setpgid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setpriority.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setprivexec.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setquota.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setrlimit.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setsid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setsockopt.s [new file with mode: 0644]
sys.subproj/ppc.subproj/settimeofday.s [new file with mode: 0644]
sys.subproj/ppc.subproj/setuid.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shm_open.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shm_unlink.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shmat.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shmctl.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shmdt.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shmget.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shmsys.s [new file with mode: 0644]
sys.subproj/ppc.subproj/shutdown.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sigaltstack.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sigpending.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sigreturn.s [new file with mode: 0644]
sys.subproj/ppc.subproj/socket.s [new file with mode: 0644]
sys.subproj/ppc.subproj/socketpair.s [new file with mode: 0644]
sys.subproj/ppc.subproj/stat.s [new file with mode: 0644]
sys.subproj/ppc.subproj/statfs.s [new file with mode: 0644]
sys.subproj/ppc.subproj/statv.s [new file with mode: 0644]
sys.subproj/ppc.subproj/swapon.s [new file with mode: 0644]
sys.subproj/ppc.subproj/symlink.s [new file with mode: 0644]
sys.subproj/ppc.subproj/sync.s [new file with mode: 0644]
sys.subproj/ppc.subproj/syscall.s [new file with mode: 0644]
sys.subproj/ppc.subproj/table.s [new file with mode: 0644]
sys.subproj/ppc.subproj/truncate.s [new file with mode: 0644]
sys.subproj/ppc.subproj/umask.s [new file with mode: 0644]
sys.subproj/ppc.subproj/undelete.s [new file with mode: 0644]
sys.subproj/ppc.subproj/unlink.s [new file with mode: 0644]
sys.subproj/ppc.subproj/unmount.s [new file with mode: 0644]
sys.subproj/ppc.subproj/ur_cthread.s [new file with mode: 0644]
sys.subproj/ppc.subproj/utimes.s [new file with mode: 0644]
sys.subproj/ppc.subproj/vfork.s [new file with mode: 0644]
sys.subproj/ppc.subproj/wait4.s [new file with mode: 0644]
sys.subproj/ppc.subproj/write.s [new file with mode: 0644]
sys.subproj/ppc.subproj/writev.s [new file with mode: 0644]
sys.subproj/sem_close.2 [new file with mode: 0644]
sys.subproj/sem_open.2 [new file with mode: 0644]
sys.subproj/sem_post.2 [new file with mode: 0644]
sys.subproj/sem_trywait.2 [new file with mode: 0644]
sys.subproj/sem_unlink.2 [new file with mode: 0644]
sys.subproj/sem_wait.2 [new file with mode: 0644]
sys.subproj/shm_open.2 [new file with mode: 0644]
sys.subproj/shm_unlink.2 [new file with mode: 0644]
sys.subproj/sigaction.c [new file with mode: 0644]
sys.subproj/sigcatch.c [new file with mode: 0644]
sys.subproj/sigcatch.h [new file with mode: 0644]
sys.subproj/sigprocmask.c [new file with mode: 0644]
sys.subproj/sigsuspend.c [new file with mode: 0644]
sys.subproj/sigtramp.c [new file with mode: 0644]
threads.subproj/Makefile [new file with mode: 0644]
threads.subproj/Makefile.postamble [new file with mode: 0644]
threads.subproj/Makefile.preamble [new file with mode: 0644]
threads.subproj/PB.project [new file with mode: 0644]
threads.subproj/cprocs.c [new file with mode: 0644]
threads.subproj/cthread_internals.h [new file with mode: 0644]
threads.subproj/cthreads.c [new file with mode: 0644]
threads.subproj/cthreads.h [new file with mode: 0644]
threads.subproj/i386.subproj/Makefile [new file with mode: 0644]
threads.subproj/i386.subproj/Makefile.postamble [new file with mode: 0644]
threads.subproj/i386.subproj/Makefile.preamble [new file with mode: 0644]
threads.subproj/i386.subproj/PB.project [new file with mode: 0644]
threads.subproj/i386.subproj/thread.c [new file with mode: 0644]
threads.subproj/lu_utils.c [new file with mode: 0644]
threads.subproj/mig_support.c [new file with mode: 0644]
threads.subproj/ppc.subproj/Makefile [new file with mode: 0644]
threads.subproj/ppc.subproj/Makefile.postamble [new file with mode: 0644]
threads.subproj/ppc.subproj/Makefile.preamble [new file with mode: 0644]
threads.subproj/ppc.subproj/PB.project [new file with mode: 0644]
threads.subproj/threads_data.c [new file with mode: 0644]
util.subproj/Makefile [new file with mode: 0644]
util.subproj/Makefile.postamble [new file with mode: 0644]
util.subproj/Makefile.preamble [new file with mode: 0644]
util.subproj/PB.project [new file with mode: 0644]
util.subproj/login.c [new file with mode: 0644]
util.subproj/login_tty.c [new file with mode: 0644]
util.subproj/logout.c [new file with mode: 0644]
util.subproj/logwtmp.c [new file with mode: 0644]
util.subproj/pty.c [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..8e603be
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,65 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = c
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Library
+
+CFILES = crt_externs.c
+HFILES =
+
+SUBPROJECTS = compat43.subproj db.subproj gen.subproj headers.subproj\
+              internat.subproj locale.subproj mach.subproj net.subproj\
+              pthreads.subproj regex.subproj stdio.subproj\
+              stdlib.subproj string.subproj sys.subproj threads.subproj\
+              util.subproj
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CURRENTLY_ACTIVE_VERSION = YES
+DEPLOY_WITH_VERSION_NAME = A
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = library.make
+NEXTSTEP_INSTALLDIR = /usr/local/lib/system
+WINDOWS_INSTALLDIR = /Developer/Libraries
+PDO_UNIX_INSTALLDIR = /lib
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Users/Shared/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+WINDOWS_PUBLIC_HEADERS_DIR = $(HOMEDRIVE)$(LOCAL_DEVELOPER_DIR)/Headers/$(NAME)
+
+PDO_UNIX_PUBLIC_HEADERS_DIR = $(LOCAL_DEVELOPER_DIR)/Headers/$(NAME)
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/Makefile.postamble b/Makefile.postamble
new file mode 100644 (file)
index 0000000..e702b54
--- /dev/null
@@ -0,0 +1,11 @@
+override DEBUG_SUFFIX = _debug
+override OPTIMIZE_BUILD_CFLAGS = -O3
+STATIC_SUFFIX = _static
+PRODUCTS += $(LIBRARY_PREFIX)$(NAME)$(DEBUG_SUFFIX)$(LIBRARY_EXT)
+PRODUCTS += $(LIBRARY_PREFIX)$(NAME)$(PROFILE_SUFFIX)$(LIBRARY_EXT)
+PRODUCTS += $(LIBRARY_PREFIX)$(NAME)$(STATIC_SUFFIX)$(LIBRARY_EXT)
+RECURSIVE_FLAGS += "LINK_SUBPROJECTS = NO"
+
+static:
+       $(SILENT) unset $(CUMULATIVE_VARIABLES) ||: ; \
+       $(MAKE) BUILD_TYPE=$@ BUILD_TYPE_SUFFIX=$(STATIC_SUFFIX)
diff --git a/Makefile.preamble b/Makefile.preamble
new file mode 100644 (file)
index 0000000..438e0bb
--- /dev/null
@@ -0,0 +1,12 @@
+LIBRARY_STYLE = STATIC
+STRIP_ON_INSTALL = NO
+BEFORE_INSTALL += static debug profile
+ifeq "$(BUILD_TYPE)" "static"
+RECURSIVE_CFLAGS += -static
+OFILE_DIR_SUFFIX := $(OFILE_DIR_SUFFIX)-static
+#OTHER_LIBS = $(NEXT_ROOT)/usr/local/lib/libcc.a
+else
+#OTHER_LIBS = $(NEXT_ROOT)/usr/local/lib/libcc_noc++.a
+endif
+PRIVATE_HDR_INSTALLDIR = $(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/Versions/B/PrivateHeaders
+override LINK_SUBPROJECTS = NO
diff --git a/PB.project b/PB.project
new file mode 100644 (file)
index 0000000..ef095b6
--- /dev/null
@@ -0,0 +1,50 @@
+{
+    CURRENTLY_ACTIVE_VERSION = YES; 
+    DEPLOY_WITH_VERSION_NAME = A; 
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (crt_externs.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (
+            compat43.subproj, 
+            db.subproj, 
+            gen.subproj, 
+            headers.subproj, 
+            internat.subproj, 
+            locale.subproj, 
+            mach.subproj, 
+            net.subproj, 
+            pthreads.subproj, 
+            regex.subproj, 
+            stdio.subproj, 
+            stdlib.subproj, 
+            string.subproj, 
+            sys.subproj, 
+            threads.subproj, 
+            util.subproj
+        ); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Users/Shared/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/local/lib/system; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_INSTALLDIR = /lib; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PDO_UNIX_PUBLICHEADERSDIR = "$(LOCAL_DEVELOPER_DIR)/Headers/$(NAME)"; 
+    PROJECTNAME = c; 
+    PROJECTTYPE = Library; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_INSTALLDIR = /Developer/Libraries; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+    WINDOWS_PUBLICHEADERSDIR = "$(HOMEDRIVE)$(LOCAL_DEVELOPER_DIR)/Headers/$(NAME)"; 
+}
diff --git a/compat43.subproj/Makefile b/compat43.subproj/Makefile
new file mode 100644 (file)
index 0000000..5e7d581
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = compat43
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = creat.c gethostid.c getwd.c killpg.c send.c sethostid.c\
+         setpgrp.c setregid.c setreuid.c setrgid.c setruid.c\
+         sigcompat.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/compat43.subproj/Makefile.postamble b/compat43.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/compat43.subproj/Makefile.preamble b/compat43.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/compat43.subproj/PB.project b/compat43.subproj/PB.project
new file mode 100644 (file)
index 0000000..846afeb
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (
+            creat.c, 
+            gethostid.c, 
+            getwd.c, 
+            killpg.c, 
+            send.c, 
+            sethostid.c, 
+            setpgrp.c, 
+            setregid.c, 
+            setreuid.c, 
+            setrgid.c, 
+            setruid.c, 
+            sigcompat.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = compat43; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/compat43.subproj/creat.c b/compat43.subproj/creat.c
new file mode 100644 (file)
index 0000000..03a1b34
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <fcntl.h>
+
+#if __STDC__
+int creat(const char *path, mode_t mode)
+#else
+int creat(path, mode)
+       char *path;
+       mode_t mode;
+#endif
+{
+       return(open(path, O_WRONLY|O_CREAT|O_TRUNC, mode));
+}
diff --git a/compat43.subproj/gethostid.c b/compat43.subproj/gethostid.c
new file mode 100644 (file)
index 0000000..cb5c5f4
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+#if __STDC__
+long
+gethostid(void)
+#else
+long
+gethostid()
+#endif
+{
+       int mib[2];
+       size_t size;
+       long value;
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_HOSTID;
+       size = sizeof value;
+       if (sysctl(mib, 2, &value, &size, NULL, 0) == -1)
+               return (-1);
+       return (value);
+}
diff --git a/compat43.subproj/getwd.c b/compat43.subproj/getwd.c
new file mode 100644 (file)
index 0000000..9369837
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+char *
+getwd(buf)
+       char *buf;
+{
+       char *p;
+       char buf2[MAXPATHLEN];
+       if (p = getcwd(buf2, MAXPATHLEN)) {
+               (void)strcpy(buf, buf2);
+               return(buf);
+       }       
+       (void)strcpy(buf, strerror(errno));
+       return((char *)NULL);
+}
diff --git a/compat43.subproj/killpg.c b/compat43.subproj/killpg.c
new file mode 100644 (file)
index 0000000..b57e9f8
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <errno.h>
+
+/*
+ * Backwards-compatible killpg().
+ */
+#if __STDC__
+int killpg(pid_t pgid, int sig)
+#else
+int killpg(pgid, sig)
+       pid_t pgid;
+       int sig;
+#endif
+{
+       if (pgid == 1) {
+               errno = ESRCH;
+               return (-1);
+       }
+       return (kill(-pgid, sig));
+}
diff --git a/compat43.subproj/send.c b/compat43.subproj/send.c
new file mode 100644 (file)
index 0000000..410dee5
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stddef.h>
+
+ssize_t
+send(s, msg, len, flags)
+       int s, flags;
+       size_t len;
+       const void *msg;
+{
+       return (sendto(s, msg, len, flags, NULL, 0));
+}
diff --git a/compat43.subproj/sethostid.c b/compat43.subproj/sethostid.c
new file mode 100644 (file)
index 0000000..841607a
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+#if __STDC__
+long
+sethostid(long hostid)
+#else
+long
+sethostid(hostid)
+       long hostid;
+#endif
+{
+       int mib[2];
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_HOSTID;
+       if (sysctl(mib, 2, NULL, NULL, &hostid, sizeof hostid) == -1)
+               return (-1);
+       return (0);
+}
diff --git a/compat43.subproj/setpgrp.c b/compat43.subproj/setpgrp.c
new file mode 100644 (file)
index 0000000..197340b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#if __STDC__
+int setpgrp(pid_t pid, pid_t pgid)
+#else
+int setpgrp(pid, pgid)
+       pid_t pid, pgid;
+#endif
+{
+       return(setpgid(pid, pgid));
+}
diff --git a/compat43.subproj/setregid.c b/compat43.subproj/setregid.c
new file mode 100644 (file)
index 0000000..7a01282
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+
+int
+setregid(rgid, egid)
+       gid_t rgid, egid;
+{
+       static gid_t savedgid = -1;
+       
+       if (savedgid == -1)
+               savedgid = getegid();
+       /*
+        * we assume that the intent here is to be able to
+        * get back rgid priviledge. So we make sure that
+        * we will be able to do so, but do not actually
+        * set the rgid.
+        */
+       if (rgid != -1 && rgid != getgid() && rgid != savedgid) {
+               errno = EPERM;
+               return (-1);
+       }
+       if (egid != -1 && setegid(egid) < 0)
+               return (-1);
+       return (0);
+}
diff --git a/compat43.subproj/setreuid.c b/compat43.subproj/setreuid.c
new file mode 100644 (file)
index 0000000..db0d515
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+
+int
+setreuid(ruid, euid)
+       uid_t ruid, euid;
+{
+       static uid_t saveduid = -1;
+       
+       if (saveduid == -1)
+               saveduid = geteuid();
+       /*
+        * we assume that the intent here is to be able to
+        * get back ruid priviledge. So we make sure that
+        * we will be able to do so, but do not actually
+        * set the ruid.
+        */
+       if (ruid != -1 && ruid != getuid() && ruid != saveduid) {
+               errno = EPERM;
+               return (-1);
+       }
+       if (euid != -1 && seteuid(euid) < 0)
+               return (-1);
+       return (0);
+}
diff --git a/compat43.subproj/setrgid.c b/compat43.subproj/setrgid.c
new file mode 100644 (file)
index 0000000..a6dee28
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <unistd.h>
+
+int
+#ifdef __STDC__
+setrgid(gid_t rgid)
+#else
+setrgid(rgid)
+       int rgid;
+#endif
+{
+
+       return (setregid(rgid, -1));
+}
diff --git a/compat43.subproj/setruid.c b/compat43.subproj/setruid.c
new file mode 100644 (file)
index 0000000..70775bf
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <unistd.h>
+
+int
+#ifdef __STDC__
+setruid(uid_t ruid)
+#else
+setruid(ruid)
+       int ruid;
+#endif
+{
+
+       return (setreuid(ruid, -1));
+}
diff --git a/compat43.subproj/sigcompat.c b/compat43.subproj/sigcompat.c
new file mode 100644 (file)
index 0000000..827075b
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <signal.h>
+
+static int sigvec__(signo, sv, osv, bind)
+       int signo;
+       struct sigvec *sv, *osv;
+       int bind;
+{
+       int ret;
+
+       if (sv)
+               sv->sv_flags ^= SV_INTERRUPT;   /* !SA_INTERRUPT */
+#if defined(__DYNAMIC__)
+        if (bind) {
+#endif
+            ret = sigaction(signo, (struct sigaction *)sv, (struct sigaction *)osv);
+#if defined(__DYNAMIC__)
+       } else {
+            ret = _sigaction_nobind(signo, (struct sigaction *)sv, (struct sigaction *)osv);
+        }
+#endif
+        if (ret == 0 && osv)
+               osv->sv_flags ^= SV_INTERRUPT;  /* !SA_INTERRUPT */
+       return (ret);
+}
+
+int sigvec(signo, sv, osv)
+        int signo;
+        struct sigvec *sv, *osv;
+{
+    return sigvec__(signo, sv, osv, 1);
+}
+
+#if defined(__DYNAMIC__)
+int _sigvec_nobind(signo, sv, osv)
+        int signo;
+        struct sigvec *sv, *osv;
+{
+    return sigvec__(signo, sv, osv, 0);
+}
+#endif
+
+int sigsetmask(mask)
+       int mask;
+{
+       int omask, n;
+
+       n = sigprocmask(SIG_SETMASK, (sigset_t *) &mask, (sigset_t *) &omask);
+       if (n)
+               return (n);
+       return (omask);
+}
+
+int sigblock(mask)
+       int mask;
+{
+       int omask, n;
+
+       n = sigprocmask(SIG_BLOCK, (sigset_t *) &mask, (sigset_t *) &omask);
+       if (n)
+               return (n);
+       return (omask);
+}
+
+int sigpause(mask)
+       int mask;
+{
+       return (sigsuspend((sigset_t *)&mask));
+}
diff --git a/crt_externs.c b/crt_externs.c
new file mode 100644 (file)
index 0000000..04ec529
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+** This file contains interfaces to the symbols defined int the crt modules.
+** 3 April 1995
+** Matt Watson (mwatson@next.com)
+**
+*/
+
+#if defined(__DYNAMIC__)
+#include "mach-o/dyld.h" /* defines _dyld_lookup_and_bind() */
+#define STRINGIFY(a) # a
+#define DECLARE_VAR(var, type) \
+        static type * var ## _pointer = 0
+#define SETUP_VAR(var)                                         \
+    if ( var ## _pointer == 0) {                               \
+        _dyld_lookup_and_bind( STRINGIFY(_ ## var),            \
+                (unsigned long *) & var ## _pointer, 0);       \
+    }
+#define USE_VAR(var) (var ## _pointer)
+#else
+#define DECLARE_VAR(var, type) extern type var
+#define SETUP_VAR(var)
+#define USE_VAR(var) (& var)
+#endif
+
+char ***_NSGetArgv(void) {
+    DECLARE_VAR(NXArgv, char **);
+    SETUP_VAR(NXArgv);
+    return(USE_VAR(NXArgv));
+}
+
+int *_NSGetArgc(void) {
+    DECLARE_VAR(NXArgc, int);
+    SETUP_VAR(NXArgc);
+    return(USE_VAR(NXArgc));
+}
+
+char ***_NSGetEnviron(void) {
+    DECLARE_VAR(environ, char **);
+    SETUP_VAR(environ);
+    return(USE_VAR(environ));
+}
+
+struct mach_header *_NSGetMachExecuteHeader(void) {
+    DECLARE_VAR(_mh_execute_header, struct mach_header);
+    SETUP_VAR(_mh_execute_header);
+    return(USE_VAR(_mh_execute_header));
+}
+
+/*
+ * Fix for Radar bug 2200596 --
+ * EH symbol definitions for gcc 2.7.2.x implementation of
+ * C++ exception handling.  The problem:  the EH implementation
+ * has "throw" store stuff into these pointers, and then as the
+ * stack is unwound, the code generated into each function (for
+ * checking whether this function contains a relevant "catch"
+ * clause and for calling destructors for local variables) looks
+ * at these globals to find the type and value thrown.
+ *
+ * The problem was that the compiler generated the symbols as
+ * "common" symbols, and common symbols cannot be placed in
+ * dynamic shared libraries.  So we must put these guys as
+ * "data" symbols into crt0.o or the System Framework (library),
+ * and the compiler must generate code that defines the symbols
+ * as external references instead of common.
+ *
+ * I changed the symbol names (added the "_272") to be utterly
+ * paranoid about any possible future use of similar names by
+ * any future versions of gcc.
+ *                      -- D. Landauer, Jan. 1998
+ */
+
+void *__eh_pc_gcc_272 = (void *)0;
+void *__eh_type_gcc_272 = (void *)0;
+void *__eh_value_gcc_272 = (void *)0;
+
+/* This is what egcs uses for its global data pointer */
+void *__eh_global_dataptr = (void *)0;
+
+void *__keymgr_global[3] = { (void *)0 };
diff --git a/db.subproj/Makefile b/db.subproj/Makefile
new file mode 100644 (file)
index 0000000..7ce1eb5
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = db
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+SUBPROJECTS = btree.subproj db.subproj hash.subproj mpool.subproj\
+              recno.subproj
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -D__DBINTERFACE_PRIVATE
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/Sandbox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/db.subproj/Makefile.postamble b/db.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/db.subproj/Makefile.preamble b/db.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/db.subproj/PB.project b/db.subproj/PB.project
new file mode 100644 (file)
index 0000000..3a69a6c
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (btree.subproj, db.subproj, hash.subproj, mpool.subproj, recno.subproj); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/Sandbox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-D__DBINTERFACE_PRIVATE"; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = db; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/db.subproj/btree.subproj/Makefile b/db.subproj/btree.subproj/Makefile
new file mode 100644 (file)
index 0000000..c185508
--- /dev/null
@@ -0,0 +1,56 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = btree
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = bt_extern.h btree.h
+
+CFILES = bt_close.c bt_conv.c bt_debug.c bt_delete.c bt_get.c\
+         bt_open.c bt_overflow.c bt_page.c bt_put.c bt_search.c\
+         bt_seq.c bt_split.c bt_stack.c bt_utils.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+PROJECT_HEADERS = btree.h bt_extern.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/Sandbox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/db.subproj/btree.subproj/Makefile.postamble b/db.subproj/btree.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/db.subproj/btree.subproj/Makefile.preamble b/db.subproj/btree.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c9fa330
--- /dev/null
@@ -0,0 +1,3 @@
+OTHER_PRIVATE_HEADERS = btree.h bt_extern.h
+PUBLIC_HEADER_DIR_SUFFIX = /btree
+PRIVATE_HEADER_DIR_SUFFIX = /btree
diff --git a/db.subproj/btree.subproj/PB.project b/db.subproj/btree.subproj/PB.project
new file mode 100644 (file)
index 0000000..8de9a71
--- /dev/null
@@ -0,0 +1,42 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (bt_extern.h, btree.h); 
+        OTHER_LINKED = (
+            bt_close.c, 
+            bt_conv.c, 
+            bt_debug.c, 
+            bt_delete.c, 
+            bt_get.c, 
+            bt_open.c, 
+            bt_overflow.c, 
+            bt_page.c, 
+            bt_put.c, 
+            bt_search.c, 
+            bt_seq.c, 
+            bt_split.c, 
+            bt_stack.c, 
+            bt_utils.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        PROJECT_HEADERS = (btree.h, bt_extern.h); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/Sandbox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = btree; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/db.subproj/btree.subproj/bt_close.c b/db.subproj/btree.subproj/bt_close.c
new file mode 100644 (file)
index 0000000..9cbbf8a
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <db.h>
+#include "btree.h"
+
+static int bt_meta __P((BTREE *));
+
+/*
+ * BT_CLOSE -- Close a btree.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__bt_close(dbp)
+       DB *dbp;
+{
+       BTREE *t;
+       int fd;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /*
+        * Delete any already deleted record that we've been saving
+        * because the cursor pointed to it.
+        */
+       if (ISSET(t, B_DELCRSR) && __bt_crsrdel(t, &t->bt_bcursor))
+               return (RET_ERROR);
+
+       if (__bt_sync(dbp, 0) == RET_ERROR)
+               return (RET_ERROR);
+
+       if (mpool_close(t->bt_mp) == RET_ERROR)
+               return (RET_ERROR);
+
+       if (t->bt_stack)
+               free(t->bt_stack);
+       if (t->bt_kbuf)
+               free(t->bt_kbuf);
+       if (t->bt_dbuf)
+               free(t->bt_dbuf);
+
+       fd = t->bt_fd;
+       free(t);
+       free(dbp);
+       return (close(fd) ? RET_ERROR : RET_SUCCESS);
+}
+
+/*
+ * BT_SYNC -- sync the btree to disk.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+int
+__bt_sync(dbp, flags)
+       const DB *dbp;
+       u_int flags;
+{
+       BTREE *t;
+       int status;
+       PAGE *h;
+       void *p;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /* Sync doesn't currently take any flags. */
+       if (flags != 0) {
+               errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       if (ISSET(t, B_INMEM | B_RDONLY) || !ISSET(t, B_MODIFIED))
+               return (RET_SUCCESS);
+
+       if (ISSET(t, B_METADIRTY) && bt_meta(t) == RET_ERROR)
+               return (RET_ERROR);
+
+       /*
+        * Nastiness.  If the cursor has been marked for deletion, but not
+        * actually deleted, we have to make a copy of the page, delete the
+        * key/data item, sync the file, and then restore the original page
+        * contents.
+        */
+       if (ISSET(t, B_DELCRSR)) {
+               if ((p = (void *)malloc(t->bt_psize)) == NULL)
+                       return (RET_ERROR);
+               if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
+                       return (RET_ERROR);
+               memmove(p, h, t->bt_psize);
+               if ((status =
+                   __bt_dleaf(t, h, t->bt_bcursor.index)) == RET_ERROR)
+                       goto ecrsr;
+               mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+       }
+               
+       if ((status = mpool_sync(t->bt_mp)) == RET_SUCCESS)
+               CLR(t, B_MODIFIED);
+
+ecrsr: if (ISSET(t, B_DELCRSR)) {
+               if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
+                       return (RET_ERROR);
+               memmove(h, p, t->bt_psize);
+               free(p);
+               mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+       }
+       return (status);
+}
+
+/*
+ * BT_META -- write the tree meta data to disk.
+ *
+ * Parameters:
+ *     t:      tree
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+static int
+bt_meta(t)
+       BTREE *t;
+{
+       BTMETA m;
+       void *p;
+
+       if ((p = mpool_get(t->bt_mp, P_META, 0)) == NULL)
+               return (RET_ERROR);
+
+       /* Fill in metadata. */
+       m.m_magic = BTREEMAGIC;
+       m.m_version = BTREEVERSION;
+       m.m_psize = t->bt_psize;
+       m.m_free = t->bt_free;
+       m.m_nrecs = t->bt_nrecs;
+       m.m_flags = t->bt_flags & SAVEMETA;
+
+       memmove(p, &m, sizeof(BTMETA));
+       mpool_put(t->bt_mp, p, MPOOL_DIRTY);
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/btree.subproj/bt_conv.c b/db.subproj/btree.subproj/bt_conv.c
new file mode 100644 (file)
index 0000000..41d9530
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+
+#include <stdio.h>
+
+#include <db.h>
+#include "btree.h"
+
+static void mswap __P((PAGE *));
+
+/*
+ * __BT_BPGIN, __BT_BPGOUT --
+ *     Convert host-specific number layout to/from the host-independent
+ *     format stored on disk.
+ *
+ * Parameters:
+ *     t:      tree
+ *     pg:     page number
+ *     h:      page to convert
+ */
+void
+__bt_pgin(t, pg, pp)
+       void *t;
+       pgno_t pg;
+       void *pp;
+{
+       PAGE *h;
+       indx_t i, top;
+       u_char flags;
+       char *p;
+
+       if (!ISSET(((BTREE *)t), B_NEEDSWAP))
+               return;
+       if (pg == P_META) {
+               mswap(pp);
+               return;
+       }
+
+       h = pp;
+       M_32_SWAP(h->pgno);
+       M_32_SWAP(h->prevpg);
+       M_32_SWAP(h->nextpg);
+       M_32_SWAP(h->flags);
+       M_16_SWAP(h->lower);
+       M_16_SWAP(h->upper);
+
+       top = NEXTINDEX(h);
+       if ((h->flags & P_TYPE) == P_BINTERNAL)
+               for (i = 0; i < top; i++) {
+                       M_16_SWAP(h->linp[i]);
+                       p = (char *)GETBINTERNAL(h, i);
+                       P_32_SWAP(p);
+                       p += sizeof(size_t);
+                       P_32_SWAP(p);
+                       p += sizeof(pgno_t);
+                       if (*(u_char *)p & P_BIGKEY) {
+                               p += sizeof(u_char);
+                               P_32_SWAP(p);
+                               p += sizeof(pgno_t);
+                               P_32_SWAP(p);
+                       }
+               }
+       else if ((h->flags & P_TYPE) == P_BLEAF)
+               for (i = 0; i < top; i++) {
+                       M_16_SWAP(h->linp[i]);
+                       p = (char *)GETBLEAF(h, i);
+                       P_32_SWAP(p);
+                       p += sizeof(size_t);
+                       P_32_SWAP(p);
+                       p += sizeof(size_t);
+                       flags = *(u_char *)p;
+                       if (flags & (P_BIGKEY | P_BIGDATA)) {
+                               p += sizeof(u_char);
+                               if (flags & P_BIGKEY) {
+                                       P_32_SWAP(p);
+                                       p += sizeof(pgno_t);
+                                       P_32_SWAP(p);
+                               }
+                               if (flags & P_BIGDATA) {
+                                       p += sizeof(size_t);
+                                       P_32_SWAP(p);
+                                       p += sizeof(pgno_t);
+                                       P_32_SWAP(p);
+                               }
+                       }
+               }
+}
+
+void
+__bt_pgout(t, pg, pp)
+       void *t;
+       pgno_t pg;
+       void *pp;
+{
+       PAGE *h;
+       indx_t i, top;
+       u_char flags;
+       char *p;
+
+       if (!ISSET(((BTREE *)t), B_NEEDSWAP))
+               return;
+       if (pg == P_META) {
+               mswap(pp);
+               return;
+       }
+
+       h = pp;
+       top = NEXTINDEX(h);
+       if ((h->flags & P_TYPE) == P_BINTERNAL)
+               for (i = 0; i < top; i++) {
+                       p = (char *)GETBINTERNAL(h, i);
+                       P_32_SWAP(p);
+                       p += sizeof(size_t);
+                       P_32_SWAP(p);
+                       p += sizeof(pgno_t);
+                       if (*(u_char *)p & P_BIGKEY) {
+                               p += sizeof(u_char);
+                               P_32_SWAP(p);
+                               p += sizeof(pgno_t);
+                               P_32_SWAP(p);
+                       }
+                       M_16_SWAP(h->linp[i]);
+               }
+       else if ((h->flags & P_TYPE) == P_BLEAF)
+               for (i = 0; i < top; i++) {
+                       p = (char *)GETBLEAF(h, i);
+                       P_32_SWAP(p);
+                       p += sizeof(size_t);
+                       P_32_SWAP(p);
+                       p += sizeof(size_t);
+                       flags = *(u_char *)p;
+                       if (flags & (P_BIGKEY | P_BIGDATA)) {
+                               p += sizeof(u_char);
+                               if (flags & P_BIGKEY) {
+                                       P_32_SWAP(p);
+                                       p += sizeof(pgno_t);
+                                       P_32_SWAP(p);
+                               }
+                               if (flags & P_BIGDATA) {
+                                       p += sizeof(size_t);
+                                       P_32_SWAP(p);
+                                       p += sizeof(pgno_t);
+                                       P_32_SWAP(p);
+                               }
+                       }
+                       M_16_SWAP(h->linp[i]);
+               }
+
+       M_32_SWAP(h->pgno);
+       M_32_SWAP(h->prevpg);
+       M_32_SWAP(h->nextpg);
+       M_32_SWAP(h->flags);
+       M_16_SWAP(h->lower);
+       M_16_SWAP(h->upper);
+}
+
+/*
+ * MSWAP -- Actually swap the bytes on the meta page.
+ *
+ * Parameters:
+ *     p:      page to convert
+ */
+static void
+mswap(pg)
+       PAGE *pg;
+{
+       char *p;
+
+       p = (char *)pg;
+       P_32_SWAP(p);           /* m_magic */
+       p += sizeof(u_int32_t);
+       P_32_SWAP(p);           /* m_version */
+       p += sizeof(u_int32_t);
+       P_32_SWAP(p);           /* m_psize */
+       p += sizeof(u_int32_t);
+       P_32_SWAP(p);           /* m_free */
+       p += sizeof(u_int32_t);
+       P_32_SWAP(p);           /* m_nrecs */
+       p += sizeof(u_int32_t);
+       P_32_SWAP(p);           /* m_flags */
+       p += sizeof(u_int32_t);
+}
diff --git a/db.subproj/btree.subproj/bt_debug.c b/db.subproj/btree.subproj/bt_debug.c
new file mode 100644 (file)
index 0000000..e64187c
--- /dev/null
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "btree.h"
+
+#ifdef DEBUG
+/*
+ * BT_DUMP -- Dump the tree
+ *
+ * Parameters:
+ *     dbp:    pointer to the DB
+ */
+void
+__bt_dump(dbp)
+       DB *dbp;
+{
+       BTREE *t;
+       PAGE *h;
+       pgno_t i;
+       char *sep;
+
+       t = dbp->internal;
+       (void)fprintf(stderr, "%s: pgsz %d",
+           ISSET(t, B_INMEM) ? "memory" : "disk", t->bt_psize);
+       if (ISSET(t, R_RECNO))
+               (void)fprintf(stderr, " keys %lu", t->bt_nrecs);
+#undef X
+#define        X(flag, name) \
+       if (ISSET(t, flag)) { \
+               (void)fprintf(stderr, "%s%s", sep, name); \
+               sep = ", "; \
+       }
+       if (t->bt_flags) {
+               sep = " flags (";
+               X(B_DELCRSR,    "DELCRSR");
+               X(R_FIXLEN,     "FIXLEN");
+               X(B_INMEM,      "INMEM");
+               X(B_NODUPS,     "NODUPS");
+               X(B_RDONLY,     "RDONLY");
+               X(R_RECNO,      "RECNO");
+               X(B_SEQINIT,    "SEQINIT");
+               X(B_METADIRTY,"METADIRTY");
+               (void)fprintf(stderr, ")\n");
+       }
+#undef X
+
+       for (i = P_ROOT; (h = mpool_get(t->bt_mp, i, 0)) != NULL; ++i) {
+               __bt_dpage(h);
+               (void)mpool_put(t->bt_mp, h, 0);
+       }
+}
+
+/*
+ * BT_DMPAGE -- Dump the meta page
+ *
+ * Parameters:
+ *     h:      pointer to the PAGE
+ */
+void
+__bt_dmpage(h)
+       PAGE *h;
+{
+       BTMETA *m;
+       char *sep;
+
+       m = (BTMETA *)h;
+       (void)fprintf(stderr, "magic %lx\n", m->m_magic);
+       (void)fprintf(stderr, "version %lu\n", m->m_version);
+       (void)fprintf(stderr, "psize %lu\n", m->m_psize);
+       (void)fprintf(stderr, "free %lu\n", m->m_free);
+       (void)fprintf(stderr, "nrecs %lu\n", m->m_nrecs);
+       (void)fprintf(stderr, "flags %lu", m->m_flags);
+#undef X
+#define        X(flag, name) \
+       if (m->m_flags & flag) { \
+               (void)fprintf(stderr, "%s%s", sep, name); \
+               sep = ", "; \
+       }
+       if (m->m_flags) {
+               sep = " (";
+               X(B_NODUPS,     "NODUPS");
+               X(R_RECNO,      "RECNO");
+               (void)fprintf(stderr, ")");
+       }
+}
+
+/*
+ * BT_DNPAGE -- Dump the page
+ *
+ * Parameters:
+ *     n:      page number to dump.
+ */
+void
+__bt_dnpage(dbp, pgno)
+       DB *dbp;
+       pgno_t pgno;
+{
+       BTREE *t;
+       PAGE *h;
+
+       t = dbp->internal;
+       if ((h = mpool_get(t->bt_mp, pgno, 0)) != NULL) {
+               __bt_dpage(h);
+               (void)mpool_put(t->bt_mp, h, 0);
+       }
+}
+
+/*
+ * BT_DPAGE -- Dump the page
+ *
+ * Parameters:
+ *     h:      pointer to the PAGE
+ */
+void
+__bt_dpage(h)
+       PAGE *h;
+{
+       BINTERNAL *bi;
+       BLEAF *bl;
+       RINTERNAL *ri;
+       RLEAF *rl;
+       indx_t cur, top;
+       char *sep;
+
+       (void)fprintf(stderr, "    page %d: (", h->pgno);
+#undef X
+#define        X(flag, name) \
+       if (h->flags & flag) { \
+               (void)fprintf(stderr, "%s%s", sep, name); \
+               sep = ", "; \
+       }
+       sep = "";
+       X(P_BINTERNAL,  "BINTERNAL")            /* types */
+       X(P_BLEAF,      "BLEAF")
+       X(P_RINTERNAL,  "RINTERNAL")            /* types */
+       X(P_RLEAF,      "RLEAF")
+       X(P_OVERFLOW,   "OVERFLOW")
+       X(P_PRESERVE,   "PRESERVE");
+       (void)fprintf(stderr, ")\n");
+#undef X
+
+       (void)fprintf(stderr, "\tprev %2d next %2d", h->prevpg, h->nextpg);
+       if (h->flags & P_OVERFLOW)
+               return;
+
+       top = NEXTINDEX(h);
+       (void)fprintf(stderr, " lower %3d upper %3d nextind %d\n",
+           h->lower, h->upper, top);
+       for (cur = 0; cur < top; cur++) {
+               (void)fprintf(stderr, "\t[%03d] %4d ", cur, h->linp[cur]);
+               switch(h->flags & P_TYPE) {
+               case P_BINTERNAL:
+                       bi = GETBINTERNAL(h, cur);
+                       (void)fprintf(stderr,
+                           "size %03d pgno %03d", bi->ksize, bi->pgno);
+                       if (bi->flags & P_BIGKEY)
+                               (void)fprintf(stderr, " (indirect)");
+                       else if (bi->ksize)
+                               (void)fprintf(stderr,
+                                   " {%.*s}", (int)bi->ksize, bi->bytes);
+                       break;
+               case P_RINTERNAL:
+                       ri = GETRINTERNAL(h, cur);
+                       (void)fprintf(stderr, "entries %03d pgno %03d",
+                               ri->nrecs, ri->pgno);
+                       break;
+               case P_BLEAF:
+                       bl = GETBLEAF(h, cur);
+                       if (bl->flags & P_BIGKEY)
+                               (void)fprintf(stderr,
+                                   "big key page %lu size %u/",
+                                   *(pgno_t *)bl->bytes,
+                                   *(size_t *)(bl->bytes + sizeof(pgno_t)));
+                       else if (bl->ksize)
+                               (void)fprintf(stderr, "%s/", bl->bytes);
+                       if (bl->flags & P_BIGDATA)
+                               (void)fprintf(stderr,
+                                   "big data page %lu size %u",
+                                   *(pgno_t *)(bl->bytes + bl->ksize),
+                                   *(size_t *)(bl->bytes + bl->ksize +
+                                   sizeof(pgno_t)));
+                       else if (bl->dsize)
+                               (void)fprintf(stderr, "%.*s",
+                                   (int)bl->dsize, bl->bytes + bl->ksize);
+                       break;
+               case P_RLEAF:
+                       rl = GETRLEAF(h, cur);
+                       if (rl->flags & P_BIGDATA)
+                               (void)fprintf(stderr,
+                                   "big data page %lu size %u",
+                                   *(pgno_t *)rl->bytes,
+                                   *(size_t *)(rl->bytes + sizeof(pgno_t)));
+                       else if (rl->dsize)
+                               (void)fprintf(stderr,
+                                   "%.*s", (int)rl->dsize, rl->bytes);
+                       break;
+               }
+               (void)fprintf(stderr, "\n");
+       }
+}
+#endif
+
+#ifdef STATISTICS
+/*
+ * BT_STAT -- Gather/print the tree statistics
+ *
+ * Parameters:
+ *     dbp:    pointer to the DB
+ */
+void
+__bt_stat(dbp)
+       DB *dbp;
+{
+       extern u_long bt_cache_hit, bt_cache_miss, bt_pfxsaved, bt_rootsplit;
+       extern u_long bt_sortsplit, bt_split;
+       BTREE *t;
+       PAGE *h;
+       pgno_t i, pcont, pinternal, pleaf;
+       u_long ifree, lfree, nkeys;
+       int levels;
+
+       t = dbp->internal;
+       pcont = pinternal = pleaf = 0;
+       nkeys = ifree = lfree = 0;
+       for (i = P_ROOT; (h = mpool_get(t->bt_mp, i, 0)) != NULL; ++i) {
+               switch(h->flags & P_TYPE) {
+               case P_BINTERNAL:
+               case P_RINTERNAL:
+                       ++pinternal;
+                       ifree += h->upper - h->lower;
+                       break;
+               case P_BLEAF:
+               case P_RLEAF:
+                       ++pleaf;
+                       lfree += h->upper - h->lower;
+                       nkeys += NEXTINDEX(h);
+                       break;
+               case P_OVERFLOW:
+                       ++pcont;
+                       break;
+               }
+               (void)mpool_put(t->bt_mp, h, 0);
+       }
+
+       /* Count the levels of the tree. */
+       for (i = P_ROOT, levels = 0 ;; ++levels) {
+               h = mpool_get(t->bt_mp, i, 0);
+               if (h->flags & (P_BLEAF|P_RLEAF)) {
+                       if (levels == 0)
+                               levels = 1;
+                       (void)mpool_put(t->bt_mp, h, 0);
+                       break;
+               }
+               i = ISSET(t, R_RECNO) ?
+                   GETRINTERNAL(h, 0)->pgno :
+                   GETBINTERNAL(h, 0)->pgno;
+               (void)mpool_put(t->bt_mp, h, 0);
+       }
+
+       (void)fprintf(stderr, "%d level%s with %ld keys",
+           levels, levels == 1 ? "" : "s", nkeys);
+       if (ISSET(t, R_RECNO))
+               (void)fprintf(stderr, " (%ld header count)", t->bt_nrecs);
+       (void)fprintf(stderr,
+           "\n%lu pages (leaf %ld, internal %ld, overflow %ld)\n",
+           pinternal + pleaf + pcont, pleaf, pinternal, pcont);
+       (void)fprintf(stderr, "%ld cache hits, %ld cache misses\n",
+           bt_cache_hit, bt_cache_miss);
+       (void)fprintf(stderr, "%ld splits (%ld root splits, %ld sort splits)\n",
+           bt_split, bt_rootsplit, bt_sortsplit);
+       pleaf *= t->bt_psize - BTDATAOFF;
+       if (pleaf)
+               (void)fprintf(stderr,
+                   "%.0f%% leaf fill (%ld bytes used, %ld bytes free)\n",
+                   ((double)(pleaf - lfree) / pleaf) * 100,
+                   pleaf - lfree, lfree);
+       pinternal *= t->bt_psize - BTDATAOFF;
+       if (pinternal)
+               (void)fprintf(stderr,
+                   "%.0f%% internal fill (%ld bytes used, %ld bytes free\n",
+                   ((double)(pinternal - ifree) / pinternal) * 100,
+                   pinternal - ifree, ifree);
+       if (bt_pfxsaved)
+               (void)fprintf(stderr, "prefix checking removed %lu bytes.\n",
+                   bt_pfxsaved);
+}
+#endif
diff --git a/db.subproj/btree.subproj/bt_delete.c b/db.subproj/btree.subproj/bt_delete.c
new file mode 100644 (file)
index 0000000..90f049d
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <db.h>
+#include "btree.h"
+
+static int bt_bdelete __P((BTREE *, const DBT *));
+
+/*
+ * __BT_DELETE -- Delete the item(s) referenced by a key.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key to delete
+ *     flags:  R_CURSOR if deleting what the cursor references
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
+ */
+int
+__bt_delete(dbp, key, flags)
+       const DB *dbp;
+       const DBT *key;
+       u_int flags;
+{
+       BTREE *t;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       if (ISSET(t, B_RDONLY)) {
+               errno = EPERM;
+               return (RET_ERROR);
+       }
+
+       switch(flags) {
+       case 0:
+               status = bt_bdelete(t, key);
+               break;
+       case R_CURSOR:
+               /*
+                * If flags is R_CURSOR, delete the cursor; must already have
+                * started a scan and not have already deleted the record.  For
+                * the delete cursor bit to have been set requires that the
+                * scan be initialized, so no reason to check.
+                */
+               if (!ISSET(t, B_SEQINIT))
+                        goto einval;
+               status = ISSET(t, B_DELCRSR) ?
+                   RET_SPECIAL : __bt_crsrdel(t, &t->bt_bcursor);
+               break;
+       default:
+einval:                errno = EINVAL;
+               return (RET_ERROR);
+       }
+       if (status == RET_SUCCESS)
+               SET(t, B_MODIFIED);
+       return (status);
+}
+
+/*
+ * BT_BDELETE -- Delete all key/data pairs matching the specified key.
+ *
+ * Parameters:
+ *     tree:   tree
+ *     key:    key to delete
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
+ */
+static int
+bt_bdelete(t, key)
+       BTREE *t;
+       const DBT *key;
+{
+       EPG *e, save;
+       PAGE *h;
+       pgno_t cpgno, pg;
+       indx_t cindex;
+       int deleted, dirty1, dirty2, exact;
+
+       /* Find any matching record; __bt_search pins the page. */
+       if ((e = __bt_search(t, key, &exact)) == NULL)
+               return (RET_ERROR);
+       if (!exact) {
+               mpool_put(t->bt_mp, e->page, 0);
+               return (RET_SPECIAL);
+       }
+
+       /*
+        * Delete forward, then delete backward, from the found key.  The
+        * ordering is so that the deletions don't mess up the page refs.
+        * The first loop deletes the key from the original page, the second
+        * unpins the original page.  In the first loop, dirty1 is set if
+        * the original page is modified, and dirty2 is set if any subsequent
+        * pages are modified.  In the second loop, dirty1 starts off set if
+        * the original page has been modified, and is set if any subsequent
+        * pages are modified.
+        *
+        * If find the key referenced by the cursor, don't delete it, just
+        * flag it for future deletion.  The cursor page number is P_INVALID
+        * unless the sequential scan is initialized, so no reason to check.
+        * A special case is when the already deleted cursor record was the
+        * only record found.  If so, then the delete opertion fails as no
+        * records were deleted.
+        *
+        * Cycle in place in the current page until the current record doesn't
+        * match the key or the page is empty.  If the latter, walk forward,
+        * skipping empty pages and repeating until a record doesn't match
+        * the key or the end of the tree is reached.
+        */
+       cpgno = t->bt_bcursor.pgno;
+       cindex = t->bt_bcursor.index;
+       save = *e;
+       dirty1 = 0;
+       for (h = e->page, deleted = 0;;) {
+               dirty2 = 0;
+               do {
+                       if (h->pgno == cpgno && e->index == cindex) {
+                               if (!ISSET(t, B_DELCRSR)) {
+                                       SET(t, B_DELCRSR);
+                                       deleted = 1;
+                               }
+                               ++e->index;
+                       } else {
+                               if (__bt_dleaf(t, h, e->index)) {
+                                       if (h->pgno != save.page->pgno)
+                                               mpool_put(t->bt_mp, h, dirty2);
+                                       mpool_put(t->bt_mp, save.page, dirty1);
+                                       return (RET_ERROR);
+                               }
+                               if (h->pgno == save.page->pgno)
+                                       dirty1 = MPOOL_DIRTY;
+                               else
+                                       dirty2 = MPOOL_DIRTY;
+                               deleted = 1;
+                       }
+               } while (e->index < NEXTINDEX(h) && __bt_cmp(t, key, e) == 0);
+
+               /*
+                * Quit if didn't find a match, no next page, or first key on
+                * the next page doesn't match.  Don't unpin the original page
+                * unless an error occurs.
+                */
+               if (e->index < NEXTINDEX(h))
+                       break;
+               for (;;) {
+                       if ((pg = h->nextpg) == P_INVALID)
+                               goto done1;
+                       if (h->pgno != save.page->pgno)
+                               mpool_put(t->bt_mp, h, dirty2);
+                       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) {
+                               mpool_put(t->bt_mp, save.page, dirty1);
+                               return (RET_ERROR);
+                       }
+                       if (NEXTINDEX(h) != 0) {
+                               e->page = h;
+                               e->index = 0;
+                               break;
+                       }
+               }
+
+               if (__bt_cmp(t, key, e) != 0)
+                       break;
+       }
+
+       /*
+        * Reach here with the original page and the last page referenced
+        * pinned (they may be the same).  Release it if not the original.
+        */
+done1: if (h->pgno != save.page->pgno)
+               mpool_put(t->bt_mp, h, dirty2);
+
+       /*
+        * Walk backwards from the record previous to the record returned by
+        * __bt_search, skipping empty pages, until a record doesn't match
+        * the key or reach the beginning of the tree.
+        */
+       *e = save;
+       for (;;) {
+               if (e->index)
+                       --e->index;
+               for (h = e->page; e->index; --e->index) {
+                       if (__bt_cmp(t, key, e) != 0)
+                               goto done2;
+                       if (h->pgno == cpgno && e->index == cindex) {
+                               if (!ISSET(t, B_DELCRSR)) {
+                                       SET(t, B_DELCRSR);
+                                       deleted = 1;
+                               }
+                       } else {
+                               if (__bt_dleaf(t, h, e->index) == RET_ERROR) {
+                                       mpool_put(t->bt_mp, h, dirty1);
+                                       return (RET_ERROR);
+                               }
+                               if (h->pgno == save.page->pgno)
+                                       dirty1 = MPOOL_DIRTY;
+                               deleted = 1;
+                       }
+               }
+
+               if ((pg = h->prevpg) == P_INVALID)
+                       goto done2;
+               mpool_put(t->bt_mp, h, dirty1);
+               dirty1 = 0;
+               if ((e->page = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                       return (RET_ERROR);
+               e->index = NEXTINDEX(e->page);
+       }
+
+       /*
+        * Reach here with the last page that was looked at pinned.  Release
+        * it.
+        */
+done2: mpool_put(t->bt_mp, h, dirty1);
+       return (deleted ? RET_SUCCESS : RET_SPECIAL);
+}
+
+/*
+ * __BT_DLEAF -- Delete a single record from a leaf page.
+ *
+ * Parameters:
+ *     t:      tree
+ *     index:  index on current page to delete
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+int
+__bt_dleaf(t, h, index)
+       BTREE *t;
+       PAGE *h;
+       indx_t index;
+{
+       register BLEAF *bl;
+       register indx_t cnt, *ip, offset;
+       register size_t nbytes;
+       char *from;
+       void *to;
+
+       /*
+        * Delete a record from a btree leaf page.  Internal records are never
+        * deleted from internal pages, regardless of the records that caused
+        * them to be added being deleted.  Pages made empty by deletion are
+        * not reclaimed.  They are, however, made available for reuse.
+        *
+        * Pack the remaining entries at the end of the page, shift the indices
+        * down, overwriting the deleted record and its index.  If the record
+        * uses overflow pages, make them available for reuse.
+        */
+       to = bl = GETBLEAF(h, index);
+       if (bl->flags & P_BIGKEY && __ovfl_delete(t, bl->bytes) == RET_ERROR)
+               return (RET_ERROR);
+       if (bl->flags & P_BIGDATA &&
+           __ovfl_delete(t, bl->bytes + bl->ksize) == RET_ERROR)
+               return (RET_ERROR);
+       nbytes = NBLEAF(bl);
+
+       /*
+        * Compress the key/data pairs.  Compress and adjust the [BR]LEAF
+        * offsets.  Reset the headers.
+        */
+       from = (char *)h + h->upper;
+       memmove(from + nbytes, from, (char *)to - from);
+       h->upper += nbytes;
+
+       offset = h->linp[index];
+       for (cnt = index, ip = &h->linp[0]; cnt--; ++ip)
+               if (ip[0] < offset)
+                       ip[0] += nbytes;
+       for (cnt = NEXTINDEX(h) - index; --cnt; ++ip)
+               ip[0] = ip[1] < offset ? ip[1] + nbytes : ip[1];
+       h->lower -= sizeof(indx_t);
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/btree.subproj/bt_extern.h b/db.subproj/btree.subproj/bt_extern.h
new file mode 100644 (file)
index 0000000..9a3839b
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+int     __bt_close __P((DB *));
+int     __bt_cmp __P((BTREE *, const DBT *, EPG *));
+int     __bt_crsrdel __P((BTREE *, EPGNO *));
+int     __bt_defcmp __P((const DBT *, const DBT *));
+size_t  __bt_defpfx __P((const DBT *, const DBT *));
+int     __bt_delete __P((const DB *, const DBT *, u_int));
+int     __bt_dleaf __P((BTREE *, PAGE *, int));
+int     __bt_fd __P((const DB *));
+EPG    *__bt_first __P((BTREE *, const DBT *, int *));
+int     __bt_free __P((BTREE *, PAGE *));
+int     __bt_get __P((const DB *, const DBT *, DBT *, u_int));
+PAGE   *__bt_new __P((BTREE *, pgno_t *));
+void    __bt_pgin __P((void *, pgno_t, void *));
+void    __bt_pgout __P((void *, pgno_t, void *));
+int     __bt_push __P((BTREE *, pgno_t, int));
+int     __bt_put __P((const DB *dbp, DBT *, const DBT *, u_int));
+int     __bt_ret __P((BTREE *, EPG *, DBT *, DBT *));
+EPG    *__bt_search __P((BTREE *, const DBT *, int *));
+int     __bt_seq __P((const DB *, DBT *, DBT *, u_int));
+int     __bt_split __P((BTREE *, PAGE *,
+           const DBT *, const DBT *, int, size_t, indx_t));
+int     __bt_sync __P((const DB *, u_int));
+
+int     __ovfl_delete __P((BTREE *, void *));
+int     __ovfl_get __P((BTREE *, void *, size_t *, char **, size_t *));
+int     __ovfl_put __P((BTREE *, const DBT *, pgno_t *));
+
+#ifdef DEBUG
+void    __bt_dnpage __P((DB *, pgno_t));
+void    __bt_dpage __P((PAGE *));
+void    __bt_dump __P((DB *));
+#endif
+#ifdef STATISTICS
+void    __bt_stat __P((DB *));
+#endif
diff --git a/db.subproj/btree.subproj/bt_get.c b/db.subproj/btree.subproj/bt_get.c
new file mode 100644 (file)
index 0000000..e62c7ac
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include <db.h>
+#include "btree.h"
+
+/*
+ * __BT_GET -- Get a record from the btree.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key to find
+ *     data:   data to return
+ *     flag:   currently unused
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
+ */
+int
+__bt_get(dbp, key, data, flags)
+       const DB *dbp;
+       const DBT *key;
+       DBT *data;
+       u_int flags;
+{
+       BTREE *t;
+       EPG *e;
+       int exact, status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /* Get currently doesn't take any flags. */
+       if (flags) {
+               errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       if ((e = __bt_search(t, key, &exact)) == NULL)
+               return (RET_ERROR);
+       if (!exact) {
+               mpool_put(t->bt_mp, e->page, 0);
+               return (RET_SPECIAL);
+       }
+
+       /*
+        * A special case is if we found the record but it's flagged for
+        * deletion.  In this case, we want to find another record with the
+        * same key, if it exists.  Rather than look around the tree we call
+        * __bt_first and have it redo the search, as __bt_first will not
+        * return keys marked for deletion.  Slow, but should never happen.
+        */
+       if (ISSET(t, B_DELCRSR) && e->page->pgno == t->bt_bcursor.pgno &&
+           e->index == t->bt_bcursor.index) {
+               mpool_put(t->bt_mp, e->page, 0);
+               if ((e = __bt_first(t, key, &exact)) == NULL)
+                       return (RET_ERROR);
+               if (!exact)
+                       return (RET_SPECIAL);
+       }
+
+       status = __bt_ret(t, e, NULL, data);
+       /*
+        * If the user is doing concurrent access, we copied the
+        * key/data, toss the page.
+        */
+       if (ISSET(t, B_DB_LOCK))
+               mpool_put(t->bt_mp, e->page, 0);
+       else
+               t->bt_pinned = e->page;
+       return (status);
+}
+
+/*
+ * __BT_FIRST -- Find the first entry.
+ *
+ * Parameters:
+ *     t:      the tree
+ *     key:    the key
+ *
+ * Returns:
+ *     The first entry in the tree greater than or equal to key.
+ */
+EPG *
+__bt_first(t, key, exactp)
+       BTREE *t;
+       const DBT *key;
+       int *exactp;
+{
+       register PAGE *h;
+       register EPG *e;
+       EPG save;
+       pgno_t cpgno, pg;
+       indx_t cindex;
+       int found;
+
+       /*
+        * Find any matching record; __bt_search pins the page.  Only exact
+        * matches are tricky, otherwise just return the location of the key
+        * if it were to be inserted into the tree.
+        */
+       if ((e = __bt_search(t, key, exactp)) == NULL)
+               return (NULL);
+       if (!*exactp)
+               return (e);
+
+       if (ISSET(t, B_DELCRSR)) {
+               cpgno = t->bt_bcursor.pgno;
+               cindex = t->bt_bcursor.index;
+       } else {
+               cpgno = P_INVALID;
+               cindex = 0;             /* GCC thinks it's uninitialized. */
+       }
+
+       /*
+        * Walk backwards, skipping empty pages, as long as the entry matches
+        * and there are keys left in the tree.  Save a copy of each match in
+        * case we go too far.  A special case is that we don't return a match
+        * on records that the cursor references that have already been flagged
+        * for deletion.
+        */
+       save = *e;
+       h = e->page;
+       found = 0;
+       do {
+               if (cpgno != h->pgno || cindex != e->index) {
+                       if (save.page->pgno != e->page->pgno) {
+                               mpool_put(t->bt_mp, save.page, 0);
+                               save = *e;
+                       } else
+                               save.index = e->index;
+                       found = 1;
+               }
+               /*
+                * Make a special effort not to unpin the page the last (or
+                * original) match was on, but also make sure it's unpinned
+                * if an error occurs.
+                */
+               while (e->index == 0) {
+                       if (h->prevpg == P_INVALID)
+                               goto done1;
+                       if (h->pgno != save.page->pgno)
+                               mpool_put(t->bt_mp, h, 0);
+                       if ((h = mpool_get(t->bt_mp, h->prevpg, 0)) == NULL) {
+                               if (h->pgno == save.page->pgno)
+                                       mpool_put(t->bt_mp, save.page, 0);
+                               return (NULL);
+                       }
+                       e->page = h;
+                       e->index = NEXTINDEX(h);
+               }
+               --e->index;
+       } while (__bt_cmp(t, key, e) == 0);
+
+       /*
+        * Reach here with the last page that was looked at pinned, which may
+        * or may not be the same as the last (or original) match page.  If
+        * it's not useful, release it.
+        */
+done1: if (h->pgno != save.page->pgno)
+               mpool_put(t->bt_mp, h, 0);
+
+       /*
+        * If still haven't found a record, the only possibility left is the
+        * next one.  Move forward one slot, skipping empty pages and check.
+        */
+       if (!found) {
+               h = save.page;
+               if (++save.index == NEXTINDEX(h)) {
+                       do {
+                               pg = h->nextpg;
+                               mpool_put(t->bt_mp, h, 0);
+                               if (pg == P_INVALID) {
+                                       *exactp = 0;
+                                       return (e);
+                               }
+                               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                                       return (NULL);
+                       } while ((save.index = NEXTINDEX(h)) == 0);
+                       save.page = h;
+               }
+               if (__bt_cmp(t, key, &save) != 0) {
+                       *exactp = 0;
+                       return (e);
+               }
+       }
+       *e = save;
+       *exactp = 1;
+       return (e);
+}
diff --git a/db.subproj/btree.subproj/bt_open.c b/db.subproj/btree.subproj/bt_open.c
new file mode 100644 (file)
index 0000000..0eb86d3
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Implementation of btree access method for 4.4BSD.
+ *
+ * The design here was originally based on that of the btree access method
+ * used in the Postgres database system at UC Berkeley.  This implementation
+ * is wholly independent of the Postgres code.
+ */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <db.h>
+#include "btree.h"
+
+static int byteorder __P((void));
+static int nroot __P((BTREE *));
+static int tmp __P((void));
+
+/*
+ * __BT_OPEN -- Open a btree.
+ *
+ * Creates and fills a DB struct, and calls the routine that actually
+ * opens the btree.
+ *
+ * Parameters:
+ *     fname:  filename (NULL for in-memory trees)
+ *     flags:  open flag bits
+ *     mode:   open permission bits
+ *     b:      BTREEINFO pointer
+ *
+ * Returns:
+ *     NULL on failure, pointer to DB on success.
+ *
+ */
+DB *
+__bt_open(fname, flags, mode, openinfo, dflags)
+       const char *fname;
+       int flags, mode, dflags;
+       const BTREEINFO *openinfo;
+{
+       struct stat sb;
+       BTMETA m;
+       BTREE *t;
+       BTREEINFO b;
+       DB *dbp;
+       pgno_t ncache;
+       ssize_t nr;
+       int machine_lorder;
+
+       t = NULL;
+
+       /*
+        * Intention is to make sure all of the user's selections are okay
+        * here and then use them without checking.  Can't be complete, since
+        * we don't know the right page size, lorder or flags until the backing
+        * file is opened.  Also, the file's page size can cause the cachesize
+        * to change.
+        */
+       machine_lorder = byteorder();
+       if (openinfo) {
+               b = *openinfo;
+
+               /* Flags: R_DUP. */
+               if (b.flags & ~(R_DUP))
+                       goto einval;
+
+               /*
+                * Page size must be indx_t aligned and >= MINPSIZE.  Default
+                * page size is set farther on, based on the underlying file
+                * transfer size.
+                */
+               if (b.psize &&
+                   (b.psize < MINPSIZE || b.psize > MAX_PAGE_OFFSET + 1 ||
+                   b.psize & sizeof(indx_t) - 1))
+                       goto einval;
+
+               /* Minimum number of keys per page; absolute minimum is 2. */
+               if (b.minkeypage) {
+                       if (b.minkeypage < 2)
+                               goto einval;
+               } else
+                       b.minkeypage = DEFMINKEYPAGE;
+
+               /* If no comparison, use default comparison and prefix. */
+               if (b.compare == NULL) {
+                       b.compare = __bt_defcmp;
+                       if (b.prefix == NULL)
+                               b.prefix = __bt_defpfx;
+               }
+
+               if (b.lorder == 0)
+                       b.lorder = machine_lorder;
+       } else {
+               b.compare = __bt_defcmp;
+               b.cachesize = 0;
+               b.flags = 0;
+               b.lorder = machine_lorder;
+               b.minkeypage = DEFMINKEYPAGE;
+               b.prefix = __bt_defpfx;
+               b.psize = 0;
+       }
+
+       /* Check for the ubiquitous PDP-11. */
+       if (b.lorder != BIG_ENDIAN && b.lorder != LITTLE_ENDIAN)
+               goto einval;
+
+       /* Allocate and initialize DB and BTREE structures. */
+       if ((t = (BTREE *)malloc(sizeof(BTREE))) == NULL)
+               goto err;
+       memset(t, 0, sizeof(BTREE));
+       t->bt_bcursor.pgno = P_INVALID;
+       t->bt_fd = -1;                  /* Don't close unopened fd on error. */
+       t->bt_lorder = b.lorder;
+       t->bt_order = NOT;
+       t->bt_cmp = b.compare;
+       t->bt_pfx = b.prefix;
+       t->bt_rfd = -1;
+
+       if ((t->bt_dbp = dbp = (DB *)malloc(sizeof(DB))) == NULL)
+               goto err;
+       t->bt_flags = 0;
+       if (t->bt_lorder != machine_lorder)
+               SET(t, B_NEEDSWAP);
+
+       dbp->type = DB_BTREE;
+       dbp->internal = t;
+       dbp->close = __bt_close;
+       dbp->del = __bt_delete;
+       dbp->fd = __bt_fd;
+       dbp->get = __bt_get;
+       dbp->put = __bt_put;
+       dbp->seq = __bt_seq;
+       dbp->sync = __bt_sync;
+
+       /*
+        * If no file name was supplied, this is an in-memory btree and we
+        * open a backing temporary file.  Otherwise, it's a disk-based tree.
+        */
+       if (fname) {
+               switch(flags & O_ACCMODE) {
+               case O_RDONLY:
+                       SET(t, B_RDONLY);
+                       break;
+               case O_RDWR:
+                       break;
+               case O_WRONLY:
+               default:
+                       goto einval;
+               }
+               
+               if ((t->bt_fd = open(fname, flags, mode)) < 0)
+                       goto err;
+
+       } else {
+               if ((flags & O_ACCMODE) != O_RDWR)
+                       goto einval;
+               if ((t->bt_fd = tmp()) == -1)
+                       goto err;
+               SET(t, B_INMEM);
+       }
+
+       if (fcntl(t->bt_fd, F_SETFD, 1) == -1)
+               goto err;
+
+       if (fstat(t->bt_fd, &sb))
+               goto err;
+       if (sb.st_size) {
+               nr = read(t->bt_fd, &m, sizeof(BTMETA));
+               if (nr < 0)
+                       goto err;
+               if (nr != sizeof(BTMETA))
+                       goto eftype;
+
+               /*
+                * Read in the meta-data.  This can change the notion of what
+                * the lorder, page size and flags are, and, when the page size
+                * changes, the cachesize value can change too.  If the user
+                * specified the wrong byte order for an existing database, we
+                * don't bother to return an error, we just clear the NEEDSWAP
+                * bit.
+                */
+               if (m.m_magic == BTREEMAGIC)
+                       CLR(t, B_NEEDSWAP);
+               else {
+                       SET(t, B_NEEDSWAP);
+                       M_32_SWAP(m.m_magic);
+                       M_32_SWAP(m.m_version);
+                       M_32_SWAP(m.m_psize);
+                       M_32_SWAP(m.m_free);
+                       M_32_SWAP(m.m_nrecs);
+                       M_32_SWAP(m.m_flags);
+               }
+               if (m.m_magic != BTREEMAGIC || m.m_version != BTREEVERSION)
+                       goto eftype;
+               if (m.m_psize < MINPSIZE || m.m_psize > MAX_PAGE_OFFSET + 1 ||
+                   m.m_psize & sizeof(indx_t) - 1)
+                       goto eftype;
+               if (m.m_flags & ~SAVEMETA)
+                       goto eftype;
+               b.psize = m.m_psize;
+               t->bt_flags |= m.m_flags;
+               t->bt_free = m.m_free;
+               t->bt_nrecs = m.m_nrecs;
+       } else {
+               /*
+                * Set the page size to the best value for I/O to this file.
+                * Don't overflow the page offset type.
+                */
+               if (b.psize == 0) {
+                       b.psize = sb.st_blksize;
+                       if (b.psize < MINPSIZE)
+                               b.psize = MINPSIZE;
+                       if (b.psize > MAX_PAGE_OFFSET + 1)
+                               b.psize = MAX_PAGE_OFFSET + 1;
+               }
+
+               /* Set flag if duplicates permitted. */
+               if (!(b.flags & R_DUP))
+                       SET(t, B_NODUPS);
+
+               t->bt_free = P_INVALID;
+               t->bt_nrecs = 0;
+               SET(t, B_METADIRTY);
+       }
+
+       t->bt_psize = b.psize;
+
+       /* Set the cache size; must be a multiple of the page size. */
+       if (b.cachesize && b.cachesize & b.psize - 1)
+               b.cachesize += (~b.cachesize & b.psize - 1) + 1;
+       if (b.cachesize < b.psize * MINCACHE)
+               b.cachesize = b.psize * MINCACHE;
+
+       /* Calculate number of pages to cache. */
+       ncache = (b.cachesize + t->bt_psize - 1) / t->bt_psize;
+
+       /*
+        * The btree data structure requires that at least two keys can fit on
+        * a page, but other than that there's no fixed requirement.  The user
+        * specified a minimum number per page, and we translated that into the
+        * number of bytes a key/data pair can use before being placed on an
+        * overflow page.  This calculation includes the page header, the size
+        * of the index referencing the leaf item and the size of the leaf item
+        * structure.  Also, don't let the user specify a minkeypage such that
+        * a key/data pair won't fit even if both key and data are on overflow
+        * pages.
+        */
+       t->bt_ovflsize = (t->bt_psize - BTDATAOFF) / b.minkeypage -
+           (sizeof(indx_t) + NBLEAFDBT(0, 0));
+       if (t->bt_ovflsize < NBLEAFDBT(NOVFLSIZE, NOVFLSIZE) + sizeof(indx_t))
+               t->bt_ovflsize =
+                   NBLEAFDBT(NOVFLSIZE, NOVFLSIZE) + sizeof(indx_t);
+
+       /* Initialize the buffer pool. */
+       if ((t->bt_mp =
+           mpool_open(NULL, t->bt_fd, t->bt_psize, ncache)) == NULL)
+               goto err;
+       if (!ISSET(t, B_INMEM))
+               mpool_filter(t->bt_mp, __bt_pgin, __bt_pgout, t);
+
+       /* Create a root page if new tree. */
+       if (nroot(t) == RET_ERROR)
+               goto err;
+
+       /* Global flags. */
+       if (dflags & DB_LOCK)
+               SET(t, B_DB_LOCK);
+       if (dflags & DB_SHMEM)
+               SET(t, B_DB_SHMEM);
+       if (dflags & DB_TXN)
+               SET(t, B_DB_TXN);
+
+       return (dbp);
+
+einval:        errno = EINVAL;
+       goto err;
+
+eftype:        errno = EFTYPE;
+       goto err;
+
+err:   if (t) {
+               if (t->bt_dbp)
+                       free(t->bt_dbp);
+               if (t->bt_fd != -1)
+                       (void)close(t->bt_fd);
+               free(t);
+       }
+       return (NULL);
+}
+
+/*
+ * NROOT -- Create the root of a new tree.
+ *
+ * Parameters:
+ *     t:      tree
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+static int
+nroot(t)
+       BTREE *t;
+{
+       PAGE *meta, *root;
+       pgno_t npg;
+
+       if ((meta = mpool_get(t->bt_mp, 0, 0)) != NULL) {
+               mpool_put(t->bt_mp, meta, 0);
+               return (RET_SUCCESS);
+       }
+       if (errno != EINVAL)
+               return (RET_ERROR);
+
+       if ((meta = mpool_new(t->bt_mp, &npg)) == NULL)
+               return (RET_ERROR);
+
+       if ((root = mpool_new(t->bt_mp, &npg)) == NULL)
+               return (RET_ERROR);
+
+       if (npg != P_ROOT)
+               return (RET_ERROR);
+       root->pgno = npg;
+       root->prevpg = root->nextpg = P_INVALID;
+       root->lower = BTDATAOFF;
+       root->upper = t->bt_psize;
+       root->flags = P_BLEAF;
+       memset(meta, 0, t->bt_psize);
+       mpool_put(t->bt_mp, meta, MPOOL_DIRTY);
+       mpool_put(t->bt_mp, root, MPOOL_DIRTY);
+       return (RET_SUCCESS);
+}
+
+static int
+tmp()
+{
+       sigset_t set, oset;
+       int fd;
+       char *envtmp;
+       char path[MAXPATHLEN];
+
+       envtmp = getenv("TMPDIR");
+       (void)snprintf(path,
+           sizeof(path), "%s/bt.XXXXXX", envtmp ? envtmp : "/tmp");
+
+       (void)sigfillset(&set);
+       (void)sigprocmask(SIG_BLOCK, &set, &oset);
+       if ((fd = mkstemp(path)) != -1)
+               (void)unlink(path);
+       (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+       return(fd);
+}
+
+static int
+byteorder()
+{
+       u_int32_t x;
+       u_char *p;
+
+       x = 0x01020304;
+       p = (u_char *)&x;
+       switch (*p) {
+       case 1:
+               return (BIG_ENDIAN);
+       case 4:
+               return (LITTLE_ENDIAN);
+       default:
+               return (0);
+       }
+}
+
+int
+__bt_fd(dbp)
+        const DB *dbp;
+{
+       BTREE *t;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /* In-memory database can't have a file descriptor. */
+       if (ISSET(t, B_INMEM)) {
+               errno = ENOENT;
+               return (-1);
+       }
+       return (t->bt_fd);
+}
diff --git a/db.subproj/btree.subproj/bt_overflow.c b/db.subproj/btree.subproj/bt_overflow.c
new file mode 100644 (file)
index 0000000..dc73942
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "btree.h"
+
+/*
+ * Big key/data code.
+ *
+ * Big key and data entries are stored on linked lists of pages.  The initial
+ * reference is byte string stored with the key or data and is the page number
+ * and size.  The actual record is stored in a chain of pages linked by the
+ * nextpg field of the PAGE header.
+ *
+ * The first page of the chain has a special property.  If the record is used
+ * by an internal page, it cannot be deleted and the P_PRESERVE bit will be set
+ * in the header.
+ *
+ * XXX
+ * A single DBT is written to each chain, so a lot of space on the last page
+ * is wasted.  This is a fairly major bug for some data sets.
+ */
+
+/*
+ * __OVFL_GET -- Get an overflow key/data item.
+ *
+ * Parameters:
+ *     t:      tree
+ *     p:      pointer to { pgno_t, size_t }
+ *     buf:    storage address
+ *     bufsz:  storage size
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__ovfl_get(t, p, ssz, buf, bufsz)
+       BTREE *t;
+       void *p;
+       size_t *ssz;
+       char **buf;
+       size_t *bufsz;
+{
+       PAGE *h;
+       pgno_t pg;
+       size_t nb, plen, sz;
+
+       memmove(&pg, p, sizeof(pgno_t));
+       memmove(&sz, (char *)p + sizeof(pgno_t), sizeof(size_t));
+       *ssz = sz;
+
+#ifdef DEBUG
+       if (pg == P_INVALID || sz == 0)
+               abort();
+#endif
+       /* Make the buffer bigger as necessary. */
+       if (*bufsz < sz) {
+               if ((*buf = (char *)realloc(*buf, sz)) == NULL)
+                       return (RET_ERROR);
+               *bufsz = sz;
+       }
+
+       /*
+        * Step through the linked list of pages, copying the data on each one
+        * into the buffer.  Never copy more than the data's length.
+        */
+       plen = t->bt_psize - BTDATAOFF;
+       for (p = *buf;; p = (char *)p + nb, pg = h->nextpg) {
+               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                       return (RET_ERROR);
+
+               nb = MIN(sz, plen);
+               memmove(p, (char *)h + BTDATAOFF, nb);
+               mpool_put(t->bt_mp, h, 0);
+
+               if ((sz -= nb) == 0)
+                       break;
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * __OVFL_PUT -- Store an overflow key/data item.
+ *
+ * Parameters:
+ *     t:      tree
+ *     data:   DBT to store
+ *     pgno:   storage page number
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__ovfl_put(t, dbt, pg)
+       BTREE *t;
+       const DBT *dbt;
+       pgno_t *pg;
+{
+       PAGE *h, *last;
+       void *p;
+       pgno_t npg;
+       size_t nb, plen, sz;
+
+       /*
+        * Allocate pages and copy the key/data record into them.  Store the
+        * number of the first page in the chain.
+        */
+       plen = t->bt_psize - BTDATAOFF;
+       for (last = NULL, p = dbt->data, sz = dbt->size;;
+           p = (char *)p + plen, last = h) {
+               if ((h = __bt_new(t, &npg)) == NULL)
+                       return (RET_ERROR);
+
+               h->pgno = npg;
+               h->nextpg = h->prevpg = P_INVALID;
+               h->flags = P_OVERFLOW;
+               h->lower = h->upper = 0;
+
+               nb = MIN(sz, plen);
+               memmove((char *)h + BTDATAOFF, p, nb);
+
+               if (last) {
+                       last->nextpg = h->pgno;
+                       mpool_put(t->bt_mp, last, MPOOL_DIRTY);
+               } else
+                       *pg = h->pgno;
+
+               if ((sz -= nb) == 0) {
+                       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+                       break;
+               }
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * __OVFL_DELETE -- Delete an overflow chain.
+ *
+ * Parameters:
+ *     t:      tree
+ *     p:      pointer to { pgno_t, size_t }
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__ovfl_delete(t, p)
+       BTREE *t;
+       void *p;
+{
+       PAGE *h;
+       pgno_t pg;
+       size_t plen, sz;
+
+       memmove(&pg, p, sizeof(pgno_t));
+       memmove(&sz, (char *)p + sizeof(pgno_t), sizeof(size_t));
+
+#ifdef DEBUG
+       if (pg == P_INVALID || sz == 0)
+               abort();
+#endif
+       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+               return (RET_ERROR);
+
+       /* Don't delete chains used by internal pages. */
+       if (h->flags & P_PRESERVE) {
+               mpool_put(t->bt_mp, h, 0);
+               return (RET_SUCCESS);
+       }
+
+       /* Step through the chain, calling the free routine for each page. */
+       for (plen = t->bt_psize - BTDATAOFF;; sz -= plen) {
+               pg = h->nextpg;
+               __bt_free(t, h);
+               if (sz <= plen)
+                       break;
+               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                       return (RET_ERROR);
+       }
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/btree.subproj/bt_page.c b/db.subproj/btree.subproj/bt_page.c
new file mode 100644 (file)
index 0000000..c9c1b44
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <stdio.h>
+
+#include <db.h>
+#include "btree.h"
+
+/*
+ * __BT_FREE -- Put a page on the freelist.
+ *
+ * Parameters:
+ *     t:      tree
+ *     h:      page to free
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__bt_free(t, h)
+       BTREE *t;
+       PAGE *h;
+{
+       /* Insert the page at the start of the free list. */
+       h->prevpg = P_INVALID;
+       h->nextpg = t->bt_free;
+       t->bt_free = h->pgno;
+
+       /* Make sure the page gets written back. */
+       return (mpool_put(t->bt_mp, h, MPOOL_DIRTY));
+}
+
+/*
+ * __BT_NEW -- Get a new page, preferably from the freelist.
+ *
+ * Parameters:
+ *     t:      tree
+ *     npg:    storage for page number.
+ *
+ * Returns:
+ *     Pointer to a page, NULL on error.
+ */
+PAGE *
+__bt_new(t, npg)
+       BTREE *t;
+       pgno_t *npg;
+{
+       PAGE *h;
+
+       if (t->bt_free != P_INVALID &&
+           (h = mpool_get(t->bt_mp, t->bt_free, 0)) != NULL) {
+                       *npg = t->bt_free;
+                       t->bt_free = h->nextpg;
+                       return (h);
+       }
+       return (mpool_new(t->bt_mp, npg));
+}
diff --git a/db.subproj/btree.subproj/bt_put.c b/db.subproj/btree.subproj/bt_put.c
new file mode 100644 (file)
index 0000000..403d16b
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "btree.h"
+
+static EPG *bt_fast __P((BTREE *, const DBT *, const DBT *, int *));
+
+/*
+ * __BT_PUT -- Add a btree item to the tree.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key
+ *     data:   data
+ *     flag:   R_NOOVERWRITE
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key is already in the
+ *     tree and R_NOOVERWRITE specified.
+ */
+int
+__bt_put(dbp, key, data, flags)
+       const DB *dbp;
+       DBT *key;
+       const DBT *data;
+       u_int flags;
+{
+       BTREE *t;
+       DBT tkey, tdata;
+       EPG *e;
+       PAGE *h;
+       indx_t index, nxtindex;
+       pgno_t pg;
+       size_t nbytes;
+       int dflags, exact, status;
+       char *dest, db[NOVFLSIZE], kb[NOVFLSIZE];
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       switch (flags) {
+       case R_CURSOR:
+               if (!ISSET(t, B_SEQINIT))
+                       goto einval;
+               if (ISSET(t, B_DELCRSR))
+                       goto einval;
+               break;
+       case 0:
+       case R_NOOVERWRITE:
+               break;
+       default:
+einval:                errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       if (ISSET(t, B_RDONLY)) {
+               errno = EPERM;
+               return (RET_ERROR);
+       }
+
+       /*
+        * If the key/data won't fit on a page, store it on indirect pages.
+        * Only store the key on the overflow page if it's too big after the
+        * data is on an overflow page.
+        *
+        * XXX
+        * If the insert fails later on, these pages aren't recovered.
+        */
+       dflags = 0;
+       if (key->size + data->size > t->bt_ovflsize) {
+               if (key->size > t->bt_ovflsize) {
+storekey:              if (__ovfl_put(t, key, &pg) == RET_ERROR)
+                               return (RET_ERROR);
+                       tkey.data = kb;
+                       tkey.size = NOVFLSIZE;
+                       memmove(kb, &pg, sizeof(pgno_t));
+                       memmove(kb + sizeof(pgno_t),
+                           &key->size, sizeof(size_t));
+                       dflags |= P_BIGKEY;
+                       key = &tkey;
+               }
+               if (key->size + data->size > t->bt_ovflsize) {
+                       if (__ovfl_put(t, data, &pg) == RET_ERROR)
+                               return (RET_ERROR);
+                       tdata.data = db;
+                       tdata.size = NOVFLSIZE;
+                       memmove(db, &pg, sizeof(pgno_t));
+                       memmove(db + sizeof(pgno_t),
+                           &data->size, sizeof(size_t));
+                       dflags |= P_BIGDATA;
+                       data = &tdata;
+               }
+               if (key->size + data->size > t->bt_ovflsize)
+                       goto storekey;
+       }
+
+       /* Replace the cursor. */
+       if (flags == R_CURSOR) {
+               if ((h = mpool_get(t->bt_mp, t->bt_bcursor.pgno, 0)) == NULL)
+                       return (RET_ERROR);
+               index = t->bt_bcursor.index;
+               goto delete;
+       }
+
+       /*
+        * Find the key to delete, or, the location at which to insert.  Bt_fast
+        * and __bt_search pin the returned page.
+        */
+       if (t->bt_order == NOT || (e = bt_fast(t, key, data, &exact)) == NULL)
+               if ((e = __bt_search(t, key, &exact)) == NULL)
+                       return (RET_ERROR);
+       h = e->page;
+       index = e->index;
+
+       /*
+        * Add the specified key/data pair to the tree.  If an identical key
+        * is already in the tree, and R_NOOVERWRITE is set, an error is
+        * returned.  If R_NOOVERWRITE is not set, the key is either added (if
+        * duplicates are permitted) or an error is returned.
+        *
+        * Pages are split as required.
+        */
+       switch (flags) {
+       case R_NOOVERWRITE:
+               if (!exact)
+                       break;
+               /*
+                * One special case is if the cursor references the record and
+                * it's been flagged for deletion.  Then, we delete the record,
+                * leaving the cursor there -- this means that the inserted
+                * record will not be seen in a cursor scan.
+                */
+               if (ISSET(t, B_DELCRSR) && t->bt_bcursor.pgno == h->pgno &&
+                   t->bt_bcursor.index == index) {
+                       CLR(t, B_DELCRSR);
+                       goto delete;
+               }
+               mpool_put(t->bt_mp, h, 0);
+               return (RET_SPECIAL);
+       default:
+               if (!exact || !ISSET(t, B_NODUPS))
+                       break;
+delete:                if (__bt_dleaf(t, h, index) == RET_ERROR) {
+                       mpool_put(t->bt_mp, h, 0);
+                       return (RET_ERROR);
+               }
+               break;
+       }
+
+       /*
+        * If not enough room, or the user has put a ceiling on the number of
+        * keys permitted in the page, split the page.  The split code will
+        * insert the key and data and unpin the current page.  If inserting
+        * into the offset array, shift the pointers up.
+        */
+       nbytes = NBLEAFDBT(key->size, data->size);
+       if (h->upper - h->lower < nbytes + sizeof(indx_t)) {
+               if ((status = __bt_split(t, h, key,
+                   data, dflags, nbytes, index)) != RET_SUCCESS)
+                       return (status);
+               goto success;
+       }
+
+       if (index < (nxtindex = NEXTINDEX(h)))
+               memmove(h->linp + index + 1, h->linp + index,
+                   (nxtindex - index) * sizeof(indx_t));
+       h->lower += sizeof(indx_t);
+
+       h->linp[index] = h->upper -= nbytes;
+       dest = (char *)h + h->upper;
+       WR_BLEAF(dest, key, data, dflags);
+
+       if (t->bt_order == NOT)
+               if (h->nextpg == P_INVALID) {
+                       if (index == NEXTINDEX(h) - 1) {
+                               t->bt_order = FORWARD;
+                               t->bt_last.index = index;
+                               t->bt_last.pgno = h->pgno;
+                       }
+               } else if (h->prevpg == P_INVALID) {
+                       if (index == 0) {
+                               t->bt_order = BACK;
+                               t->bt_last.index = 0;
+                               t->bt_last.pgno = h->pgno;
+                       }
+               }
+
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+
+success:
+       if (flags == R_SETCURSOR) {
+               t->bt_bcursor.pgno = e->page->pgno;
+               t->bt_bcursor.index = e->index;
+       }
+       SET(t, B_MODIFIED);
+       return (RET_SUCCESS);
+}
+
+#ifdef STATISTICS
+u_long bt_cache_hit, bt_cache_miss;
+#endif
+
+/*
+ * BT_FAST -- Do a quick check for sorted data.
+ *
+ * Parameters:
+ *     t:      tree
+ *     key:    key to insert
+ *
+ * Returns:
+ *     EPG for new record or NULL if not found.
+ */
+static EPG *
+bt_fast(t, key, data, exactp)
+       BTREE *t;
+       const DBT *key, *data;
+       int *exactp;
+{
+       PAGE *h;
+       size_t nbytes;
+       int cmp;
+
+       if ((h = mpool_get(t->bt_mp, t->bt_last.pgno, 0)) == NULL) {
+               t->bt_order = NOT;
+               return (NULL);
+       }
+       t->bt_cur.page = h;
+       t->bt_cur.index = t->bt_last.index;
+
+       /*
+        * If won't fit in this page or have too many keys in this page, have
+        * to search to get split stack.
+        */
+       nbytes = NBLEAFDBT(key->size, data->size);
+       if (h->upper - h->lower < nbytes + sizeof(indx_t))
+               goto miss;
+
+       if (t->bt_order == FORWARD) {
+               if (t->bt_cur.page->nextpg != P_INVALID)
+                       goto miss;
+               if (t->bt_cur.index != NEXTINDEX(h) - 1)
+                       goto miss;
+               if ((cmp = __bt_cmp(t, key, &t->bt_cur)) < 0)
+                       goto miss;
+               t->bt_last.index = cmp ? ++t->bt_cur.index : t->bt_cur.index;
+       } else {
+               if (t->bt_cur.page->prevpg != P_INVALID)
+                       goto miss;
+               if (t->bt_cur.index != 0)
+                       goto miss;
+               if ((cmp = __bt_cmp(t, key, &t->bt_cur)) > 0)
+                       goto miss;
+               t->bt_last.index = 0;
+       }
+       *exactp = cmp == 0;
+#ifdef STATISTICS
+       ++bt_cache_hit;
+#endif
+       return (&t->bt_cur);
+
+miss:
+#ifdef STATISTICS
+       ++bt_cache_miss;
+#endif
+       t->bt_order = NOT;
+       mpool_put(t->bt_mp, h, 0);
+       return (NULL);
+}
diff --git a/db.subproj/btree.subproj/bt_search.c b/db.subproj/btree.subproj/bt_search.c
new file mode 100644 (file)
index 0000000..aa1151a
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <stdio.h>
+
+#include <db.h>
+#include "btree.h"
+
+static int bt_snext __P((BTREE *, PAGE *, const DBT *, int *));
+static int bt_sprev __P((BTREE *, PAGE *, const DBT *, int *));
+
+/*
+ * __BT_SEARCH -- Search a btree for a key.
+ *
+ * Parameters:
+ *     t:      tree to search
+ *     key:    key to find
+ *     exactp: pointer to exact match flag
+ *
+ * Returns:
+ *     The EPG for matching record, if any, or the EPG for the location
+ *     of the key, if it were inserted into the tree, is entered into
+ *     the bt_cur field of the tree.  A pointer to the field is returned.
+ */
+EPG *
+__bt_search(t, key, exactp)
+       BTREE *t;
+       const DBT *key;
+       int *exactp;
+{
+       PAGE *h;
+       indx_t base, index, lim;
+       pgno_t pg;
+       int cmp;
+
+       BT_CLR(t);
+       for (pg = P_ROOT;;) {
+               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                       return (NULL);
+
+               /* Do a binary search on the current page. */
+               t->bt_cur.page = h;
+               for (base = 0, lim = NEXTINDEX(h); lim; lim >>= 1) {
+                       t->bt_cur.index = index = base + (lim >> 1);
+                       if ((cmp = __bt_cmp(t, key, &t->bt_cur)) == 0) {
+                               if (h->flags & P_BLEAF) {
+                                       *exactp = 1;
+                                       return (&t->bt_cur);
+                               }
+                               goto next;
+                       }
+                       if (cmp > 0) {
+                               base = index + 1;
+                               --lim;
+                       }
+               }
+
+               /*
+                * If it's a leaf page, and duplicates aren't allowed, we're
+                * done.  If duplicates are allowed, it's possible that there
+                * were duplicate keys on duplicate pages, and they were later
+                * deleted, so we could be on a page with no matches while
+                * there are matches on other pages.  If we're at the start or
+                * end of a page, check on both sides.
+                */
+               if (h->flags & P_BLEAF) {
+                       t->bt_cur.index = base;
+                       *exactp = 0;
+                       if (!ISSET(t, B_NODUPS)) {
+                               if (base == 0 &&
+                                   bt_sprev(t, h, key, exactp))
+                                       return (&t->bt_cur);
+                               if (base == NEXTINDEX(h) &&
+                                   bt_snext(t, h, key, exactp))
+                                       return (&t->bt_cur);
+                       }
+                       return (&t->bt_cur);
+               }
+
+               /*
+                * No match found.  Base is the smallest index greater than
+                * key and may be zero or a last + 1 index.  If it's non-zero,
+                * decrement by one, and record the internal page which should
+                * be a parent page for the key.  If a split later occurs, the
+                * inserted page will be to the right of the saved page.
+                */
+               index = base ? base - 1 : base;
+
+next:          if (__bt_push(t, h->pgno, index) == RET_ERROR)
+                       return (NULL);
+               pg = GETBINTERNAL(h, index)->pgno;
+               mpool_put(t->bt_mp, h, 0);
+       }
+}
+
+/*
+ * BT_SNEXT -- Check for an exact match after the key.
+ *
+ * Parameters:
+ *     t:      tree to search
+ *     h:      current page.
+ *     key:    key to find
+ *     exactp: pointer to exact match flag
+ *
+ * Returns:
+ *     If an exact match found.
+ */
+static int
+bt_snext(t, h, key, exactp)
+       BTREE *t;
+       PAGE *h;
+       const DBT *key;
+       int *exactp;
+{
+       EPG e;
+       PAGE *tp;
+       pgno_t pg;
+
+       /* Skip until reach the end of the tree or a key. */
+       for (pg = h->nextpg; pg != P_INVALID;) {
+               if ((tp = mpool_get(t->bt_mp, pg, 0)) == NULL) {
+                       mpool_put(t->bt_mp, h, 0);
+                       return (NULL);
+               }
+               if (NEXTINDEX(tp) != 0)
+                       break;
+               pg = tp->prevpg;
+               mpool_put(t->bt_mp, tp, 0);
+       }
+       /*
+        * The key is either an exact match, or not as good as
+        * the one we already have.
+        */
+       if (pg != P_INVALID) {
+               e.page = tp;
+               e.index = NEXTINDEX(tp) - 1;
+               if (__bt_cmp(t, key, &e) == 0) {
+                       mpool_put(t->bt_mp, h, 0);
+                       t->bt_cur = e;
+                       *exactp = 1;
+                       return (1);
+               }
+       }
+       return (0);
+}
+
+/*
+ * BT_SPREV -- Check for an exact match before the key.
+ *
+ * Parameters:
+ *     t:      tree to search
+ *     h:      current page.
+ *     key:    key to find
+ *     exactp: pointer to exact match flag
+ *
+ * Returns:
+ *     If an exact match found.
+ */
+static int
+bt_sprev(t, h, key, exactp)
+       BTREE *t;
+       PAGE *h;
+       const DBT *key;
+       int *exactp;
+{
+       EPG e;
+       PAGE *tp;
+       pgno_t pg;
+
+       /* Skip until reach the beginning of the tree or a key. */
+       for (pg = h->prevpg; pg != P_INVALID;) {
+               if ((tp = mpool_get(t->bt_mp, pg, 0)) == NULL) {
+                       mpool_put(t->bt_mp, h, 0);
+                       return (NULL);
+               }
+               if (NEXTINDEX(tp) != 0)
+                       break;
+               pg = tp->prevpg;
+               mpool_put(t->bt_mp, tp, 0);
+       }
+       /*
+        * The key is either an exact match, or not as good as
+        * the one we already have.
+        */
+       if (pg != P_INVALID) {
+               e.page = tp;
+               e.index = NEXTINDEX(tp) - 1;
+               if (__bt_cmp(t, key, &e) == 0) {
+                       mpool_put(t->bt_mp, h, 0);
+                       t->bt_cur = e;
+                       *exactp = 1;
+                       return (1);
+               }
+       }
+       return (0);
+}
diff --git a/db.subproj/btree.subproj/bt_seq.c b/db.subproj/btree.subproj/bt_seq.c
new file mode 100644 (file)
index 0000000..fcbfd2c
--- /dev/null
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <db.h>
+#include "btree.h"
+
+static int      bt_seqadv __P((BTREE *, EPG *, int));
+static int      bt_seqset __P((BTREE *, EPG *, DBT *, int));
+
+/*
+ * Sequential scan support.
+ *
+ * The tree can be scanned sequentially, starting from either end of the tree
+ * or from any specific key.  A scan request before any scanning is done is
+ * initialized as starting from the least node.
+ *
+ * Each tree has an EPGNO which has the current position of the cursor.  The
+ * cursor has to survive deletions/insertions in the tree without losing its
+ * position.  This is done by noting deletions without doing them, and then
+ * doing them when the cursor moves (or the tree is closed).
+ */
+
+/*
+ * __BT_SEQ -- Btree sequential scan interface.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key for positioning and return value
+ *     data:   data return value
+ *     flags:  R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV.
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
+ */
+int
+__bt_seq(dbp, key, data, flags)
+       const DB *dbp;
+       DBT *key, *data;
+       u_int flags;
+{
+       BTREE *t;
+       EPG e;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /*
+        * If scan unitialized as yet, or starting at a specific record, set
+        * the scan to a specific key.  Both bt_seqset and bt_seqadv pin the
+        * page the cursor references if they're successful.
+        */
+       switch(flags) {
+       case R_NEXT:
+       case R_PREV:
+               if (ISSET(t, B_SEQINIT)) {
+                       status = bt_seqadv(t, &e, flags);
+                       break;
+               }
+               /* FALLTHROUGH */
+       case R_CURSOR:
+       case R_FIRST:
+       case R_LAST:
+               status = bt_seqset(t, &e, key, flags);
+               break;
+       default:
+               errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       if (status == RET_SUCCESS) {
+               status = __bt_ret(t, &e, key, data);
+
+               /* Update the actual cursor. */
+               t->bt_bcursor.pgno = e.page->pgno;
+               t->bt_bcursor.index = e.index;
+
+               /*
+                * If the user is doing concurrent access, we copied the
+                * key/data, toss the page.
+                */
+               if (ISSET(t, B_DB_LOCK))
+                       mpool_put(t->bt_mp, e.page, 0);
+               else
+                       t->bt_pinned = e.page;
+               SET(t, B_SEQINIT);
+       }
+       return (status);
+}
+
+/*
+ * BT_SEQSET -- Set the sequential scan to a specific key.
+ *
+ * Parameters:
+ *     t:      tree
+ *     ep:     storage for returned key
+ *     key:    key for initial scan position
+ *     flags:  R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV
+ *
+ * Side effects:
+ *     Pins the page the cursor references.
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
+ */
+static int
+bt_seqset(t, ep, key, flags)
+       BTREE *t;
+       EPG *ep;
+       DBT *key;
+       int flags;
+{
+       EPG *e;
+       PAGE *h;
+       pgno_t pg;
+       int exact;
+
+       /*
+        * Delete any already deleted record that we've been saving because
+        * the cursor pointed to it.  Since going to a specific key, should
+        * delete any logically deleted records so they aren't found.
+        */
+       if (ISSET(t, B_DELCRSR) && __bt_crsrdel(t, &t->bt_bcursor))
+               return (RET_ERROR);
+
+       /*
+        * Find the first, last or specific key in the tree and point the cursor
+        * at it.  The cursor may not be moved until a new key has been found.
+        */
+       switch(flags) {
+       case R_CURSOR:                          /* Keyed scan. */
+               /*
+                * Find the first instance of the key or the smallest key which
+                * is greater than or equal to the specified key.  If run out
+                * of keys, return RET_SPECIAL.
+                */
+               if (key->data == NULL || key->size == 0) {
+                       errno = EINVAL;
+                       return (RET_ERROR);
+               }
+               e = __bt_first(t, key, &exact); /* Returns pinned page. */
+               if (e == NULL)
+                       return (RET_ERROR);
+               /*
+                * If at the end of a page, skip any empty pages and find the
+                * next entry.
+                */
+               if (e->index == NEXTINDEX(e->page)) {
+                       h = e->page;
+                       do {
+                               pg = h->nextpg;
+                               mpool_put(t->bt_mp, h, 0);
+                               if (pg == P_INVALID)
+                                       return (RET_SPECIAL);
+                               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                                       return (RET_ERROR);
+                       } while (NEXTINDEX(h) == 0);
+                       e->index = 0;
+                       e->page = h;
+               }
+               *ep = *e;
+               break;
+       case R_FIRST:                           /* First record. */
+       case R_NEXT:
+               /* Walk down the left-hand side of the tree. */
+               for (pg = P_ROOT;;) {
+                       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                               return (RET_ERROR);
+                       if (h->flags & (P_BLEAF | P_RLEAF))
+                               break;
+                       pg = GETBINTERNAL(h, 0)->pgno;
+                       mpool_put(t->bt_mp, h, 0);
+               }
+
+               /* Skip any empty pages. */
+               while (NEXTINDEX(h) == 0 && h->nextpg != P_INVALID) {
+                       pg = h->nextpg;
+                       mpool_put(t->bt_mp, h, 0);
+                       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                               return (RET_ERROR);
+               }
+
+               if (NEXTINDEX(h) == 0) {
+                       mpool_put(t->bt_mp, h, 0);
+                       return (RET_SPECIAL);
+               }
+
+               ep->page = h;
+               ep->index = 0;
+               break;
+       case R_LAST:                            /* Last record. */
+       case R_PREV:
+               /* Walk down the right-hand side of the tree. */
+               for (pg = P_ROOT;;) {
+                       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                               return (RET_ERROR);
+                       if (h->flags & (P_BLEAF | P_RLEAF))
+                               break;
+                       pg = GETBINTERNAL(h, NEXTINDEX(h) - 1)->pgno;
+                       mpool_put(t->bt_mp, h, 0);
+               }
+
+               /* Skip any empty pages. */
+               while (NEXTINDEX(h) == 0 && h->prevpg != P_INVALID) {
+                       pg = h->prevpg;
+                       mpool_put(t->bt_mp, h, 0);
+                       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                               return (RET_ERROR);
+               }
+
+               if (NEXTINDEX(h) == 0) {
+                       mpool_put(t->bt_mp, h, 0);
+                       return (RET_SPECIAL);
+               }
+
+               ep->page = h;
+               ep->index = NEXTINDEX(h) - 1;
+               break;
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * BT_SEQADVANCE -- Advance the sequential scan.
+ *
+ * Parameters:
+ *     t:      tree
+ *     flags:  R_NEXT, R_PREV
+ *
+ * Side effects:
+ *     Pins the page the new key/data record is on.
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
+ */
+static int
+bt_seqadv(t, e, flags)
+       BTREE *t;
+       EPG *e;
+       int flags;
+{
+       EPGNO *c, delc;
+       PAGE *h;
+       indx_t index;
+       pgno_t pg;
+
+       /* Save the current cursor if going to delete it. */
+       c = &t->bt_bcursor;
+       if (ISSET(t, B_DELCRSR))
+               delc = *c;
+
+       if ((h = mpool_get(t->bt_mp, c->pgno, 0)) == NULL)
+               return (RET_ERROR);
+
+       /*
+        * Find the next/previous record in the tree and point the cursor at it.
+        * The cursor may not be moved until a new key has been found.
+        */
+       index = c->index;
+       switch(flags) {
+       case R_NEXT:                    /* Next record. */
+               if (++index == NEXTINDEX(h)) {
+                       do {
+                               pg = h->nextpg;
+                               mpool_put(t->bt_mp, h, 0);
+                               if (pg == P_INVALID)
+                                       return (RET_SPECIAL);
+                               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                                       return (RET_ERROR);
+                       } while (NEXTINDEX(h) == 0);
+                       index = 0;
+               }
+               break;
+       case R_PREV:                    /* Previous record. */
+               if (index-- == 0) {
+                       do {
+                               pg = h->prevpg;
+                               mpool_put(t->bt_mp, h, 0);
+                               if (pg == P_INVALID)
+                                       return (RET_SPECIAL);
+                               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                                       return (RET_ERROR);
+                       } while (NEXTINDEX(h) == 0);
+                       index = NEXTINDEX(h) - 1;
+               }
+               break;
+       }
+
+       e->page = h;
+       e->index = index;
+
+       /*
+        * Delete any already deleted record that we've been saving because the
+        * cursor pointed to it.  This could cause the new index to be shifted
+        * down by one if the record we're deleting is on the same page and has
+        * a larger index.
+        */
+       if (ISSET(t, B_DELCRSR)) {
+               CLR(t, B_DELCRSR);                      /* Don't try twice. */
+               if (c->pgno == delc.pgno && c->index > delc.index)
+                       --c->index;
+               if (__bt_crsrdel(t, &delc))
+                       return (RET_ERROR);
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * __BT_CRSRDEL -- Delete the record referenced by the cursor.
+ *
+ * Parameters:
+ *     t:      tree
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__bt_crsrdel(t, c)
+       BTREE *t;
+       EPGNO *c;
+{
+       PAGE *h;
+       int status;
+
+       CLR(t, B_DELCRSR);                      /* Don't try twice. */
+       if ((h = mpool_get(t->bt_mp, c->pgno, 0)) == NULL)
+               return (RET_ERROR);
+       status = __bt_dleaf(t, h, c->index);
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+       return (status);
+}
diff --git a/db.subproj/btree.subproj/bt_split.c b/db.subproj/btree.subproj/bt_split.c
new file mode 100644 (file)
index 0000000..d11c37f
--- /dev/null
@@ -0,0 +1,843 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "btree.h"
+
+static int      bt_broot __P((BTREE *, PAGE *, PAGE *, PAGE *));
+static PAGE    *bt_page
+                   __P((BTREE *, PAGE *, PAGE **, PAGE **, indx_t *, size_t));
+static int      bt_preserve __P((BTREE *, pgno_t));
+static PAGE    *bt_psplit
+                   __P((BTREE *, PAGE *, PAGE *, PAGE *, indx_t *, size_t));
+static PAGE    *bt_root
+                   __P((BTREE *, PAGE *, PAGE **, PAGE **, indx_t *, size_t));
+static int      bt_rroot __P((BTREE *, PAGE *, PAGE *, PAGE *));
+static recno_t  rec_total __P((PAGE *));
+
+#ifdef STATISTICS
+u_long bt_rootsplit, bt_split, bt_sortsplit, bt_pfxsaved;
+#endif
+
+/*
+ * __BT_SPLIT -- Split the tree.
+ *
+ * Parameters:
+ *     t:      tree
+ *     sp:     page to split
+ *     key:    key to insert
+ *     data:   data to insert
+ *     flags:  BIGKEY/BIGDATA flags
+ *     ilen:   insert length
+ *     skip:   index to leave open
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__bt_split(t, sp, key, data, flags, ilen, skip)
+       BTREE *t;
+       PAGE *sp;
+       const DBT *key, *data;
+       int flags;
+       size_t ilen;
+       indx_t skip;
+{
+       BINTERNAL *bi;
+       BLEAF *bl, *tbl;
+       DBT a, b;
+       EPGNO *parent;
+       PAGE *h, *l, *r, *lchild, *rchild;
+       indx_t nxtindex;
+       size_t n, nbytes, nksize;
+       int parentsplit;
+       char *dest;
+
+       /*
+        * Split the page into two pages, l and r.  The split routines return
+        * a pointer to the page into which the key should be inserted and with
+        * skip set to the offset which should be used.  Additionally, l and r
+        * are pinned.
+        */
+       h = sp->pgno == P_ROOT ?
+           bt_root(t, sp, &l, &r, &skip, ilen) :
+           bt_page(t, sp, &l, &r, &skip, ilen);
+       if (h == NULL)
+               return (RET_ERROR);
+
+       /*
+        * Insert the new key/data pair into the leaf page.  (Key inserts
+        * always cause a leaf page to split first.)
+        */
+       h->linp[skip] = h->upper -= ilen;
+       dest = (char *)h + h->upper;
+       if (ISSET(t, R_RECNO))
+               WR_RLEAF(dest, data, flags)
+       else
+               WR_BLEAF(dest, key, data, flags)
+
+       /* If the root page was split, make it look right. */
+       if (sp->pgno == P_ROOT &&
+           (ISSET(t, R_RECNO) ?
+           bt_rroot(t, sp, l, r) : bt_broot(t, sp, l, r)) == RET_ERROR)
+               goto err2;
+
+       /*
+        * Now we walk the parent page stack -- a LIFO stack of the pages that
+        * were traversed when we searched for the page that split.  Each stack
+        * entry is a page number and a page index offset.  The offset is for
+        * the page traversed on the search.  We've just split a page, so we
+        * have to insert a new key into the parent page.
+        *
+        * If the insert into the parent page causes it to split, may have to
+        * continue splitting all the way up the tree.  We stop if the root
+        * splits or the page inserted into didn't have to split to hold the
+        * new key.  Some algorithms replace the key for the old page as well
+        * as the new page.  We don't, as there's no reason to believe that the
+        * first key on the old page is any better than the key we have, and,
+        * in the case of a key being placed at index 0 causing the split, the
+        * key is unavailable.
+        *
+        * There are a maximum of 5 pages pinned at any time.  We keep the left
+        * and right pages pinned while working on the parent.   The 5 are the
+        * two children, left parent and right parent (when the parent splits)
+        * and the root page or the overflow key page when calling bt_preserve.
+        * This code must make sure that all pins are released other than the
+        * root page or overflow page which is unlocked elsewhere.
+        */
+       while ((parent = BT_POP(t)) != NULL) {
+               lchild = l;
+               rchild = r;
+
+               /* Get the parent page. */
+               if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
+                       goto err2;
+
+               /*
+                * The new key goes ONE AFTER the index, because the split
+                * was to the right.
+                */
+               skip = parent->index + 1;
+
+               /*
+                * Calculate the space needed on the parent page.
+                *
+                * Prefix trees: space hack when inserting into BINTERNAL
+                * pages.  Retain only what's needed to distinguish between
+                * the new entry and the LAST entry on the page to its left.
+                * If the keys compare equal, retain the entire key.  Note,
+                * we don't touch overflow keys, and the entire key must be
+                * retained for the next-to-left most key on the leftmost
+                * page of each level, or the search will fail.  Applicable
+                * ONLY to internal pages that have leaf pages as children.
+                * Further reduction of the key between pairs of internal
+                * pages loses too much information.
+                */
+               switch (rchild->flags & P_TYPE) {
+               case P_BINTERNAL:
+                       bi = GETBINTERNAL(rchild, 0);
+                       nbytes = NBINTERNAL(bi->ksize);
+                       break;
+               case P_BLEAF:
+                       bl = GETBLEAF(rchild, 0);
+                       nbytes = NBINTERNAL(bl->ksize);
+                       if (t->bt_pfx && !(bl->flags & P_BIGKEY) &&
+                           (h->prevpg != P_INVALID || skip > 1)) {
+                               tbl = GETBLEAF(lchild, NEXTINDEX(lchild) - 1);
+                               a.size = tbl->ksize;
+                               a.data = tbl->bytes;
+                               b.size = bl->ksize;
+                               b.data = bl->bytes;
+                               nksize = t->bt_pfx(&a, &b);
+                               n = NBINTERNAL(nksize);
+                               if (n < nbytes) {
+#ifdef STATISTICS
+                                       bt_pfxsaved += nbytes - n;
+#endif
+                                       nbytes = n;
+                               } else
+                                       nksize = 0;
+                       } else
+                               nksize = 0;
+                       break;
+               case P_RINTERNAL:
+               case P_RLEAF:
+                       nbytes = NRINTERNAL;
+                       break;
+               default:
+                       abort();
+               }
+
+               /* Split the parent page if necessary or shift the indices. */
+               if (h->upper - h->lower < nbytes + sizeof(indx_t)) {
+                       sp = h;
+                       h = h->pgno == P_ROOT ?
+                           bt_root(t, h, &l, &r, &skip, nbytes) :
+                           bt_page(t, h, &l, &r, &skip, nbytes);
+                       if (h == NULL)
+                               goto err1;
+                       parentsplit = 1;
+               } else {
+                       if (skip < (nxtindex = NEXTINDEX(h)))
+                               memmove(h->linp + skip + 1, h->linp + skip,
+                                   (nxtindex - skip) * sizeof(indx_t));
+                       h->lower += sizeof(indx_t);
+                       parentsplit = 0;
+               }
+
+               /* Insert the key into the parent page. */
+               switch(rchild->flags & P_TYPE) {
+               case P_BINTERNAL:
+                       h->linp[skip] = h->upper -= nbytes;
+                       dest = (char *)h + h->linp[skip];
+                       memmove(dest, bi, nbytes);
+                       ((BINTERNAL *)dest)->pgno = rchild->pgno;
+                       break;
+               case P_BLEAF:
+                       h->linp[skip] = h->upper -= nbytes;
+                       dest = (char *)h + h->linp[skip];
+                       WR_BINTERNAL(dest, nksize ? nksize : bl->ksize,
+                           rchild->pgno, bl->flags & P_BIGKEY);
+                       memmove(dest, bl->bytes, nksize ? nksize : bl->ksize);
+                       if (bl->flags & P_BIGKEY &&
+                           bt_preserve(t, *(pgno_t *)bl->bytes) == RET_ERROR)
+                               goto err1;
+                       break;
+               case P_RINTERNAL:
+                       /*
+                        * Update the left page count.  If split
+                        * added at index 0, fix the correct page.
+                        */
+                       if (skip > 0)
+                               dest = (char *)h + h->linp[skip - 1];
+                       else
+                               dest = (char *)l + l->linp[NEXTINDEX(l) - 1];
+                       ((RINTERNAL *)dest)->nrecs = rec_total(lchild);
+                       ((RINTERNAL *)dest)->pgno = lchild->pgno;
+
+                       /* Update the right page count. */
+                       h->linp[skip] = h->upper -= nbytes;
+                       dest = (char *)h + h->linp[skip];
+                       ((RINTERNAL *)dest)->nrecs = rec_total(rchild);
+                       ((RINTERNAL *)dest)->pgno = rchild->pgno;
+                       break;
+               case P_RLEAF:
+                       /*
+                        * Update the left page count.  If split
+                        * added at index 0, fix the correct page.
+                        */
+                       if (skip > 0)
+                               dest = (char *)h + h->linp[skip - 1];
+                       else
+                               dest = (char *)l + l->linp[NEXTINDEX(l) - 1];
+                       ((RINTERNAL *)dest)->nrecs = NEXTINDEX(lchild);
+                       ((RINTERNAL *)dest)->pgno = lchild->pgno;
+
+                       /* Update the right page count. */
+                       h->linp[skip] = h->upper -= nbytes;
+                       dest = (char *)h + h->linp[skip];
+                       ((RINTERNAL *)dest)->nrecs = NEXTINDEX(rchild);
+                       ((RINTERNAL *)dest)->pgno = rchild->pgno;
+                       break;
+               default:
+                       abort();
+               }
+
+               /* Unpin the held pages. */
+               if (!parentsplit) {
+                       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+                       break;
+               }
+
+               /* If the root page was split, make it look right. */
+               if (sp->pgno == P_ROOT &&
+                   (ISSET(t, R_RECNO) ?
+                   bt_rroot(t, sp, l, r) : bt_broot(t, sp, l, r)) == RET_ERROR)
+                       goto err1;
+
+               mpool_put(t->bt_mp, lchild, MPOOL_DIRTY);
+               mpool_put(t->bt_mp, rchild, MPOOL_DIRTY);
+       }
+
+       /* Unpin the held pages. */
+       mpool_put(t->bt_mp, l, MPOOL_DIRTY);
+       mpool_put(t->bt_mp, r, MPOOL_DIRTY);
+
+       /* Clear any pages left on the stack. */
+       return (RET_SUCCESS);
+
+       /*
+        * If something fails in the above loop we were already walking back
+        * up the tree and the tree is now inconsistent.  Nothing much we can
+        * do about it but release any memory we're holding.
+        */
+err1:  mpool_put(t->bt_mp, lchild, MPOOL_DIRTY);
+       mpool_put(t->bt_mp, rchild, MPOOL_DIRTY);
+
+err2:  mpool_put(t->bt_mp, l, 0);
+       mpool_put(t->bt_mp, r, 0);
+       __dbpanic(t->bt_dbp);
+       return (RET_ERROR);
+}
+
+/*
+ * BT_PAGE -- Split a non-root page of a btree.
+ *
+ * Parameters:
+ *     t:      tree
+ *     h:      root page
+ *     lp:     pointer to left page pointer
+ *     rp:     pointer to right page pointer
+ *     skip:   pointer to index to leave open
+ *     ilen:   insert length
+ *
+ * Returns:
+ *     Pointer to page in which to insert or NULL on error.
+ */
+static PAGE *
+bt_page(t, h, lp, rp, skip, ilen)
+       BTREE *t;
+       PAGE *h, **lp, **rp;
+       indx_t *skip;
+       size_t ilen;
+{
+       PAGE *l, *r, *tp;
+       pgno_t npg;
+
+#ifdef STATISTICS
+       ++bt_split;
+#endif
+       /* Put the new right page for the split into place. */
+       if ((r = __bt_new(t, &npg)) == NULL)
+               return (NULL);
+       r->pgno = npg;
+       r->lower = BTDATAOFF;
+       r->upper = t->bt_psize;
+       r->nextpg = h->nextpg;
+       r->prevpg = h->pgno;
+       r->flags = h->flags & P_TYPE;
+
+       /*
+        * If we're splitting the last page on a level because we're appending
+        * a key to it (skip is NEXTINDEX()), it's likely that the data is
+        * sorted.  Adding an empty page on the side of the level is less work
+        * and can push the fill factor much higher than normal.  If we're
+        * wrong it's no big deal, we'll just do the split the right way next
+        * time.  It may look like it's equally easy to do a similar hack for
+        * reverse sorted data, that is, split the tree left, but it's not.
+        * Don't even try.
+        */
+       if (h->nextpg == P_INVALID && *skip == NEXTINDEX(h)) {
+#ifdef STATISTICS
+               ++bt_sortsplit;
+#endif
+               h->nextpg = r->pgno;
+               r->lower = BTDATAOFF + sizeof(indx_t);
+               *skip = 0;
+               *lp = h;
+               *rp = r;
+               return (r);
+       }
+
+       /* Put the new left page for the split into place. */
+       if ((l = (PAGE *)malloc(t->bt_psize)) == NULL) {
+               mpool_put(t->bt_mp, r, 0);
+               return (NULL);
+       }
+       l->pgno = h->pgno;
+       l->nextpg = r->pgno;
+       l->prevpg = h->prevpg;
+       l->lower = BTDATAOFF;
+       l->upper = t->bt_psize;
+       l->flags = h->flags & P_TYPE;
+
+       /* Fix up the previous pointer of the page after the split page. */
+       if (h->nextpg != P_INVALID) {
+               if ((tp = mpool_get(t->bt_mp, h->nextpg, 0)) == NULL) {
+                       free(l);
+                       /* XXX mpool_free(t->bt_mp, r->pgno); */
+                       return (NULL);
+               }
+               tp->prevpg = r->pgno;
+               mpool_put(t->bt_mp, tp, 0);
+       }
+
+       /*
+        * Split right.  The key/data pairs aren't sorted in the btree page so
+        * it's simpler to copy the data from the split page onto two new pages
+        * instead of copying half the data to the right page and compacting
+        * the left page in place.  Since the left page can't change, we have
+        * to swap the original and the allocated left page after the split.
+        */
+       tp = bt_psplit(t, h, l, r, skip, ilen);
+
+       /* Move the new left page onto the old left page. */
+       memmove(h, l, t->bt_psize);
+       if (tp == l)
+               tp = h;
+       free(l);
+
+       *lp = h;
+       *rp = r;
+       return (tp);
+}
+
+/*
+ * BT_ROOT -- Split the root page of a btree.
+ *
+ * Parameters:
+ *     t:      tree
+ *     h:      root page
+ *     lp:     pointer to left page pointer
+ *     rp:     pointer to right page pointer
+ *     skip:   pointer to index to leave open
+ *     ilen:   insert length
+ *
+ * Returns:
+ *     Pointer to page in which to insert or NULL on error.
+ */
+static PAGE *
+bt_root(t, h, lp, rp, skip, ilen)
+       BTREE *t;
+       PAGE *h, **lp, **rp;
+       indx_t *skip;
+       size_t ilen;
+{
+       PAGE *l, *r, *tp;
+       pgno_t lnpg, rnpg;
+
+#ifdef STATISTICS
+       ++bt_split;
+       ++bt_rootsplit;
+#endif
+       /* Put the new left and right pages for the split into place. */
+       if ((l = __bt_new(t, &lnpg)) == NULL ||
+           (r = __bt_new(t, &rnpg)) == NULL)
+               return (NULL);
+       l->pgno = lnpg;
+       r->pgno = rnpg;
+       l->nextpg = r->pgno;
+       r->prevpg = l->pgno;
+       l->prevpg = r->nextpg = P_INVALID;
+       l->lower = r->lower = BTDATAOFF;
+       l->upper = r->upper = t->bt_psize;
+       l->flags = r->flags = h->flags & P_TYPE;
+
+       /* Split the root page. */
+       tp = bt_psplit(t, h, l, r, skip, ilen);
+
+       *lp = l;
+       *rp = r;
+       return (tp);
+}
+
+/*
+ * BT_RROOT -- Fix up the recno root page after it has been split.
+ *
+ * Parameters:
+ *     t:      tree
+ *     h:      root page
+ *     l:      left page
+ *     r:      right page
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+static int
+bt_rroot(t, h, l, r)
+       BTREE *t;
+       PAGE *h, *l, *r;
+{
+       char *dest;
+
+       /* Insert the left and right keys, set the header information. */
+       h->linp[0] = h->upper = t->bt_psize - NRINTERNAL;
+       dest = (char *)h + h->upper;
+       WR_RINTERNAL(dest,
+           l->flags & P_RLEAF ? NEXTINDEX(l) : rec_total(l), l->pgno);
+
+       h->linp[1] = h->upper -= NRINTERNAL;
+       dest = (char *)h + h->upper;
+       WR_RINTERNAL(dest,
+           r->flags & P_RLEAF ? NEXTINDEX(r) : rec_total(r), r->pgno);
+
+       h->lower = BTDATAOFF + 2 * sizeof(indx_t);
+
+       /* Unpin the root page, set to recno internal page. */
+       h->flags &= ~P_TYPE;
+       h->flags |= P_RINTERNAL;
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+
+       return (RET_SUCCESS);
+}
+
+/*
+ * BT_BROOT -- Fix up the btree root page after it has been split.
+ *
+ * Parameters:
+ *     t:      tree
+ *     h:      root page
+ *     l:      left page
+ *     r:      right page
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+static int
+bt_broot(t, h, l, r)
+       BTREE *t;
+       PAGE *h, *l, *r;
+{
+       BINTERNAL *bi;
+       BLEAF *bl;
+       size_t nbytes;
+       char *dest;
+
+       /*
+        * If the root page was a leaf page, change it into an internal page.
+        * We copy the key we split on (but not the key's data, in the case of
+        * a leaf page) to the new root page.
+        *
+        * The btree comparison code guarantees that the left-most key on any
+        * level of the tree is never used, so it doesn't need to be filled in.
+        */
+       nbytes = NBINTERNAL(0);
+       h->linp[0] = h->upper = t->bt_psize - nbytes;
+       dest = (char *)h + h->upper;
+       WR_BINTERNAL(dest, 0, l->pgno, 0);
+
+       switch(h->flags & P_TYPE) {
+       case P_BLEAF:
+               bl = GETBLEAF(r, 0);
+               nbytes = NBINTERNAL(bl->ksize);
+               h->linp[1] = h->upper -= nbytes;
+               dest = (char *)h + h->upper;
+               WR_BINTERNAL(dest, bl->ksize, r->pgno, 0);
+               memmove(dest, bl->bytes, bl->ksize);
+
+               /*
+                * If the key is on an overflow page, mark the overflow chain
+                * so it isn't deleted when the leaf copy of the key is deleted.
+                */
+               if (bl->flags & P_BIGKEY &&
+                   bt_preserve(t, *(pgno_t *)bl->bytes) == RET_ERROR)
+                       return (RET_ERROR);
+               break;
+       case P_BINTERNAL:
+               bi = GETBINTERNAL(r, 0);
+               nbytes = NBINTERNAL(bi->ksize);
+               h->linp[1] = h->upper -= nbytes;
+               dest = (char *)h + h->upper;
+               memmove(dest, bi, nbytes);
+               ((BINTERNAL *)dest)->pgno = r->pgno;
+               break;
+       default:
+               abort();
+       }
+
+       /* There are two keys on the page. */
+       h->lower = BTDATAOFF + 2 * sizeof(indx_t);
+
+       /* Unpin the root page, set to btree internal page. */
+       h->flags &= ~P_TYPE;
+       h->flags |= P_BINTERNAL;
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+
+       return (RET_SUCCESS);
+}
+
+/*
+ * BT_PSPLIT -- Do the real work of splitting the page.
+ *
+ * Parameters:
+ *     t:      tree
+ *     h:      page to be split
+ *     l:      page to put lower half of data
+ *     r:      page to put upper half of data
+ *     pskip:  pointer to index to leave open
+ *     ilen:   insert length
+ *
+ * Returns:
+ *     Pointer to page in which to insert.
+ */
+static PAGE *
+bt_psplit(t, h, l, r, pskip, ilen)
+       BTREE *t;
+       PAGE *h, *l, *r;
+       indx_t *pskip;
+       size_t ilen;
+{
+       BINTERNAL *bi;
+       BLEAF *bl;
+       RLEAF *rl;
+       EPGNO *c;
+       PAGE *rval;
+       void *src;
+       indx_t full, half, nxt, off, skip, top, used;
+       size_t nbytes;
+       int bigkeycnt, isbigkey;
+
+       /*
+        * Split the data to the left and right pages.  Leave the skip index
+        * open.  Additionally, make some effort not to split on an overflow
+        * key.  This makes internal page processing faster and can save
+        * space as overflow keys used by internal pages are never deleted.
+        */
+       bigkeycnt = 0;
+       skip = *pskip;
+       full = t->bt_psize - BTDATAOFF;
+       half = full / 2;
+       used = 0;
+       for (nxt = off = 0, top = NEXTINDEX(h); nxt < top; ++off) {
+               if (skip == off) {
+                       nbytes = ilen;
+                       isbigkey = 0;           /* XXX: not really known. */
+               } else
+                       switch (h->flags & P_TYPE) {
+                       case P_BINTERNAL:
+                               src = bi = GETBINTERNAL(h, nxt);
+                               nbytes = NBINTERNAL(bi->ksize);
+                               isbigkey = bi->flags & P_BIGKEY;
+                               break;
+                       case P_BLEAF:
+                               src = bl = GETBLEAF(h, nxt);
+                               nbytes = NBLEAF(bl);
+                               isbigkey = bl->flags & P_BIGKEY;
+                               break;
+                       case P_RINTERNAL:
+                               src = GETRINTERNAL(h, nxt);
+                               nbytes = NRINTERNAL;
+                               isbigkey = 0;
+                               break;
+                       case P_RLEAF:
+                               src = rl = GETRLEAF(h, nxt);
+                               nbytes = NRLEAF(rl);
+                               isbigkey = 0;
+                               break;
+                       default:
+                               abort();
+                       }
+
+               /*
+                * If the key/data pairs are substantial fractions of the max
+                * possible size for the page, it's possible to get situations
+                * where we decide to try and copy too much onto the left page.
+                * Make sure that doesn't happen.
+                */
+               if (skip <= off && used + nbytes >= full) {
+                       --off;
+                       break;
+               }
+
+               /* Copy the key/data pair, if not the skipped index. */
+               if (skip != off) {
+                       ++nxt;
+
+                       l->linp[off] = l->upper -= nbytes;
+                       memmove((char *)l + l->upper, src, nbytes);
+               }
+
+               used += nbytes;
+               if (used >= half) {
+                       if (!isbigkey || bigkeycnt == 3)
+                               break;
+                       else
+                               ++bigkeycnt;
+               }
+       }
+
+       /*
+        * Off is the last offset that's valid for the left page.
+        * Nxt is the first offset to be placed on the right page.
+        */
+       l->lower += (off + 1) * sizeof(indx_t);
+
+       /*
+        * If splitting the page that the cursor was on, the cursor has to be
+        * adjusted to point to the same record as before the split.  If the
+        * cursor is at or past the skipped slot, the cursor is incremented by
+        * one.  If the cursor is on the right page, it is decremented by the
+        * number of records split to the left page.
+        *
+        * Don't bother checking for the B_SEQINIT flag, the page number will
+        * be P_INVALID.
+        */
+       c = &t->bt_bcursor;
+       if (c->pgno == h->pgno) {
+               if (c->index >= skip)
+                       ++c->index;
+               if (c->index < nxt)                     /* Left page. */
+                       c->pgno = l->pgno;
+               else {                                  /* Right page. */
+                       c->pgno = r->pgno;
+                       c->index -= nxt;
+               }
+       }
+
+       /*
+        * If the skipped index was on the left page, just return that page.
+        * Otherwise, adjust the skip index to reflect the new position on
+        * the right page.
+        */
+       if (skip <= off) {
+               skip = 0;
+               rval = l;
+       } else {
+               rval = r;
+               *pskip -= nxt;
+       }
+
+       for (off = 0; nxt < top; ++off) {
+               if (skip == nxt) {
+                       ++off;
+                       skip = 0;
+               }
+               switch (h->flags & P_TYPE) {
+               case P_BINTERNAL:
+                       src = bi = GETBINTERNAL(h, nxt);
+                       nbytes = NBINTERNAL(bi->ksize);
+                       break;
+               case P_BLEAF:
+                       src = bl = GETBLEAF(h, nxt);
+                       nbytes = NBLEAF(bl);
+                       break;
+               case P_RINTERNAL:
+                       src = GETRINTERNAL(h, nxt);
+                       nbytes = NRINTERNAL;
+                       break;
+               case P_RLEAF:
+                       src = rl = GETRLEAF(h, nxt);
+                       nbytes = NRLEAF(rl);
+                       break;
+               default:
+                       abort();
+               }
+               ++nxt;
+               r->linp[off] = r->upper -= nbytes;
+               memmove((char *)r + r->upper, src, nbytes);
+       }
+       r->lower += off * sizeof(indx_t);
+
+       /* If the key is being appended to the page, adjust the index. */
+       if (skip == top)
+               r->lower += sizeof(indx_t);
+
+       return (rval);
+}
+
+/*
+ * BT_PRESERVE -- Mark a chain of pages as used by an internal node.
+ *
+ * Chains of indirect blocks pointed to by leaf nodes get reclaimed when the
+ * record that references them gets deleted.  Chains pointed to by internal
+ * pages never get deleted.  This routine marks a chain as pointed to by an
+ * internal page.
+ *
+ * Parameters:
+ *     t:      tree
+ *     pg:     page number of first page in the chain.
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+static int
+bt_preserve(t, pg)
+       BTREE *t;
+       pgno_t pg;
+{
+       PAGE *h;
+
+       if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+               return (RET_ERROR);
+       h->flags |= P_PRESERVE;
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+       return (RET_SUCCESS);
+}
+
+/*
+ * REC_TOTAL -- Return the number of recno entries below a page.
+ *
+ * Parameters:
+ *     h:      page
+ *
+ * Returns:
+ *     The number of recno entries below a page.
+ *
+ * XXX
+ * These values could be set by the bt_psplit routine.  The problem is that the
+ * entry has to be popped off of the stack etc. or the values have to be passed
+ * all the way back to bt_split/bt_rroot and it's not very clean.
+ */
+static recno_t
+rec_total(h)
+       PAGE *h;
+{
+       recno_t recs;
+       indx_t nxt, top;
+
+       for (recs = 0, nxt = 0, top = NEXTINDEX(h); nxt < top; ++nxt)
+               recs += GETRINTERNAL(h, nxt)->nrecs;
+       return (recs);
+}
diff --git a/db.subproj/btree.subproj/bt_stack.c b/db.subproj/btree.subproj/bt_stack.c
new file mode 100644 (file)
index 0000000..528299b
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <db.h>
+#include "btree.h"
+
+/*
+ * When a page splits, a new record has to be inserted into its parent page.
+ * This page may have to split as well, all the way up to the root.  Since
+ * parent pointers in each page would be expensive, we maintain a stack of
+ * parent pages as we descend the tree.
+ *
+ * XXX
+ * This is a concurrency problem -- if user a builds a stack, then user b
+ * splits the tree, then user a tries to split the tree, there's a new level
+ * in the tree that user a doesn't know about.
+ */
+
+/*
+ * __BT_PUSH -- Push parent page info onto the stack (LIFO).
+ *
+ * Parameters:
+ *     t:      tree
+ *     pgno:   page
+ *     index:  page index
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__bt_push(t, pgno, index)
+       BTREE *t;
+       pgno_t pgno;
+       indx_t index;
+{
+       if (t->bt_sp == t->bt_maxstack) {
+               t->bt_maxstack += 50;
+               if ((t->bt_stack = (EPGNO *)realloc(t->bt_stack,
+                   t->bt_maxstack * sizeof(EPGNO))) == NULL) {
+                       t->bt_maxstack -= 50;
+                       return (RET_ERROR);
+               }
+       }
+
+       t->bt_stack[t->bt_sp].pgno = pgno;
+       t->bt_stack[t->bt_sp].index = index;
+       ++t->bt_sp;
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/btree.subproj/bt_utils.c b/db.subproj/btree.subproj/bt_utils.c
new file mode 100644 (file)
index 0000000..17093b8
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "btree.h"
+
+/*
+ * __BT_RET -- Build return key/data pair as a result of search or scan.
+ *
+ * Parameters:
+ *     t:      tree
+ *     d:      LEAF to be returned to the user.
+ *     key:    user's key structure (NULL if not to be filled in)
+ *     data:   user's data structure
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+int
+__bt_ret(t, e, key, data)
+       BTREE *t;
+       EPG *e;
+       DBT *key, *data;
+{
+       register BLEAF *bl;
+       register void *p;
+
+       bl = GETBLEAF(e->page, e->index);
+
+       /*
+        * We always copy big keys/data to make them contigous.  Otherwise,
+        * we leave the page pinned and don't copy unless the user specified
+        * concurrent access.
+        */
+       if (bl->flags & P_BIGDATA) {
+               if (__ovfl_get(t, bl->bytes + bl->ksize,
+                   &data->size, &t->bt_dbuf, &t->bt_dbufsz))
+                       return (RET_ERROR);
+               data->data = t->bt_dbuf;
+       } else if (ISSET(t, B_DB_LOCK)) {
+               /* Use +1 in case the first record retrieved is 0 length. */
+               if (bl->dsize + 1 > t->bt_dbufsz) {
+                       if ((p =
+                           (void *)realloc(t->bt_dbuf, bl->dsize + 1)) == NULL)
+                               return (RET_ERROR);
+                       t->bt_dbuf = p;
+                       t->bt_dbufsz = bl->dsize + 1;
+               }
+               memmove(t->bt_dbuf, bl->bytes + bl->ksize, bl->dsize);
+               data->size = bl->dsize;
+               data->data = t->bt_dbuf;
+       } else {
+               data->size = bl->dsize;
+               data->data = bl->bytes + bl->ksize;
+       }
+
+       if (key == NULL)
+               return (RET_SUCCESS);
+
+       if (bl->flags & P_BIGKEY) {
+               if (__ovfl_get(t, bl->bytes,
+                   &key->size, &t->bt_kbuf, &t->bt_kbufsz))
+                       return (RET_ERROR);
+               key->data = t->bt_kbuf;
+       } else if (ISSET(t, B_DB_LOCK)) {
+               if (bl->ksize > t->bt_kbufsz) {
+                       if ((p =
+                           (void *)realloc(t->bt_kbuf, bl->ksize)) == NULL)
+                               return (RET_ERROR);
+                       t->bt_kbuf = p;
+                       t->bt_kbufsz = bl->ksize;
+               }
+               memmove(t->bt_kbuf, bl->bytes, bl->ksize);
+               key->size = bl->ksize;
+               key->data = t->bt_kbuf;
+       } else {
+               key->size = bl->ksize;
+               key->data = bl->bytes;
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * __BT_CMP -- Compare a key to a given record.
+ *
+ * Parameters:
+ *     t:      tree
+ *     k1:     DBT pointer of first arg to comparison
+ *     e:      pointer to EPG for comparison
+ *
+ * Returns:
+ *     < 0 if k1 is < record
+ *     = 0 if k1 is = record
+ *     > 0 if k1 is > record
+ */
+int
+__bt_cmp(t, k1, e)
+       BTREE *t;
+       const DBT *k1;
+       EPG *e;
+{
+       BINTERNAL *bi;
+       BLEAF *bl;
+       DBT k2;
+       PAGE *h;
+       void *bigkey;
+
+       /*
+        * The left-most key on internal pages, at any level of the tree, is
+        * guaranteed by the following code to be less than any user key.
+        * This saves us from having to update the leftmost key on an internal
+        * page when the user inserts a new key in the tree smaller than
+        * anything we've yet seen.
+        */
+       h = e->page;
+       if (e->index == 0 && h->prevpg == P_INVALID && !(h->flags & P_BLEAF))
+               return (1);
+
+       bigkey = NULL;
+       if (h->flags & P_BLEAF) {
+               bl = GETBLEAF(h, e->index);
+               if (bl->flags & P_BIGKEY)
+                       bigkey = bl->bytes;
+               else {
+                       k2.data = bl->bytes;
+                       k2.size = bl->ksize;
+               }
+       } else {
+               bi = GETBINTERNAL(h, e->index);
+               if (bi->flags & P_BIGKEY)
+                       bigkey = bi->bytes;
+               else {
+                       k2.data = bi->bytes;
+                       k2.size = bi->ksize;
+               }
+       }
+
+       if (bigkey) {
+               if (__ovfl_get(t, bigkey,
+                   &k2.size, &t->bt_dbuf, &t->bt_dbufsz))
+                       return (RET_ERROR);
+               k2.data = t->bt_dbuf;
+       }
+       return ((*t->bt_cmp)(k1, &k2));
+}
+
+/*
+ * __BT_DEFCMP -- Default comparison routine.
+ *
+ * Parameters:
+ *     a:      DBT #1
+ *     b:      DBT #2
+ *
+ * Returns:
+ *     < 0 if a is < b
+ *     = 0 if a is = b
+ *     > 0 if a is > b
+ */
+int
+__bt_defcmp(a, b)
+       const DBT *a, *b;
+{
+       register size_t len;
+       register u_char *p1, *p2;
+
+       /*
+        * XXX
+        * If a size_t doesn't fit in an int, this routine can lose.
+        * What we need is a integral type which is guaranteed to be
+        * larger than a size_t, and there is no such thing.
+        */
+       len = MIN(a->size, b->size);
+       for (p1 = a->data, p2 = b->data; len--; ++p1, ++p2)
+               if (*p1 != *p2)
+                       return ((int)*p1 - (int)*p2);
+       return ((int)a->size - (int)b->size);
+}
+
+/*
+ * __BT_DEFPFX -- Default prefix routine.
+ *
+ * Parameters:
+ *     a:      DBT #1
+ *     b:      DBT #2
+ *
+ * Returns:
+ *     Number of bytes needed to distinguish b from a.
+ */
+size_t
+__bt_defpfx(a, b)
+       const DBT *a, *b;
+{
+       register u_char *p1, *p2;
+       register size_t cnt, len;
+
+       cnt = 1;
+       len = MIN(a->size, b->size);
+       for (p1 = a->data, p2 = b->data; len--; ++p1, ++p2, ++cnt)
+               if (*p1 != *p2)
+                       return (cnt);
+
+       /* a->size must be <= b->size, or they wouldn't be in this order. */
+       return (a->size < b->size ? a->size + 1 : a->size);
+}
diff --git a/db.subproj/btree.subproj/btree.h b/db.subproj/btree.subproj/btree.h
new file mode 100644 (file)
index 0000000..aa62d01
--- /dev/null
@@ -0,0 +1,372 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <mpool.h>
+
+#define        DEFMINKEYPAGE   (2)             /* Minimum keys per page */
+#define        MINCACHE        (5)             /* Minimum cached pages */
+#define        MINPSIZE        (512)           /* Minimum page size */
+
+/*
+ * Page 0 of a btree file contains a copy of the meta-data.  This page is also
+ * used as an out-of-band page, i.e. page pointers that point to nowhere point
+ * to page 0.  Page 1 is the root of the btree.
+ */
+#define        P_INVALID        0              /* Invalid tree page number. */
+#define        P_META           0              /* Tree metadata page number. */
+#define        P_ROOT           1              /* Tree root page number. */
+
+/*
+ * There are five page layouts in the btree: btree internal pages (BINTERNAL),
+ * btree leaf pages (BLEAF), recno internal pages (RINTERNAL), recno leaf pages
+ * (RLEAF) and overflow pages.  All five page types have a page header (PAGE).
+ * This implementation requires that values within structures NOT be padded.
+ * (ANSI C permits random padding.)  If your compiler pads randomly you'll have
+ * to do some work to get this package to run.
+ */
+typedef struct _page {
+       pgno_t  pgno;                   /* this page's page number */
+       pgno_t  prevpg;                 /* left sibling */
+       pgno_t  nextpg;                 /* right sibling */
+
+#define        P_BINTERNAL     0x01            /* btree internal page */
+#define        P_BLEAF         0x02            /* leaf page */
+#define        P_OVERFLOW      0x04            /* overflow page */
+#define        P_RINTERNAL     0x08            /* recno internal page */
+#define        P_RLEAF         0x10            /* leaf page */
+#define P_TYPE         0x1f            /* type mask */
+#define        P_PRESERVE      0x20            /* never delete this chain of pages */
+       u_int32_t flags;
+
+       indx_t  lower;                  /* lower bound of free space on page */
+       indx_t  upper;                  /* upper bound of free space on page */
+       indx_t  linp[1];                /* indx_t-aligned VAR. LENGTH DATA */
+} PAGE;
+
+/* First and next index. */
+#define        BTDATAOFF       (sizeof(pgno_t) + sizeof(pgno_t) + sizeof(pgno_t) + \
+                           sizeof(u_int32_t) + sizeof(indx_t) + sizeof(indx_t))
+#define        NEXTINDEX(p)    (((p)->lower - BTDATAOFF) / sizeof(indx_t))
+
+/*
+ * For pages other than overflow pages, there is an array of offsets into the
+ * rest of the page immediately following the page header.  Each offset is to
+ * an item which is unique to the type of page.  The h_lower offset is just
+ * past the last filled-in index.  The h_upper offset is the first item on the
+ * page.  Offsets are from the beginning of the page.
+ *
+ * If an item is too big to store on a single page, a flag is set and the item
+ * is a { page, size } pair such that the page is the first page of an overflow
+ * chain with size bytes of item.  Overflow pages are simply bytes without any
+ * external structure.
+ *
+ * The page number and size fields in the items are pgno_t-aligned so they can
+ * be manipulated without copying.  (This presumes that 32 bit items can be
+ * manipulated on this system.)
+ */
+#define        LALIGN(n) \
+       (((n) + sizeof(pgno_t) - 1) & ~(sizeof(pgno_t) - 1))
+#define        NOVFLSIZE       (sizeof(pgno_t) + sizeof(size_t))
+
+/*
+ * For the btree internal pages, the item is a key.  BINTERNALs are {key, pgno}
+ * pairs, such that the key compares less than or equal to all of the records
+ * on that page.  For a tree without duplicate keys, an internal page with two
+ * consecutive keys, a and b, will have all records greater than or equal to a
+ * and less than b stored on the page associated with a.  Duplicate keys are
+ * somewhat special and can cause duplicate internal and leaf page records and
+ * some minor modifications of the above rule.
+ */
+typedef struct _binternal {
+       size_t  ksize;                  /* key size */
+       pgno_t  pgno;                   /* page number stored on */
+#define        P_BIGDATA       0x01            /* overflow data */
+#define        P_BIGKEY        0x02            /* overflow key */
+       u_char  flags;
+       char    bytes[1];               /* data */
+} BINTERNAL;
+
+/* Get the page's BINTERNAL structure at index indx. */
+#define        GETBINTERNAL(pg, indx) \
+       ((BINTERNAL *)((char *)(pg) + (pg)->linp[indx]))
+
+/* Get the number of bytes in the entry. */
+#define NBINTERNAL(len) \
+       LALIGN(sizeof(size_t) + sizeof(pgno_t) + sizeof(u_char) + (len))
+
+/* Copy a BINTERNAL entry to the page. */
+#define        WR_BINTERNAL(p, size, pgno, flags) { \
+       *(size_t *)p = size; \
+       p += sizeof(size_t); \
+       *(pgno_t *)p = pgno; \
+       p += sizeof(pgno_t); \
+       *(u_char *)p = flags; \
+       p += sizeof(u_char); \
+}
+
+/*
+ * For the recno internal pages, the item is a page number with the number of
+ * keys found on that page and below.
+ */
+typedef struct _rinternal {
+       recno_t nrecs;                  /* number of records */
+       pgno_t  pgno;                   /* page number stored below */
+} RINTERNAL;
+
+/* Get the page's RINTERNAL structure at index indx. */
+#define        GETRINTERNAL(pg, indx) \
+       ((RINTERNAL *)((char *)(pg) + (pg)->linp[indx]))
+
+/* Get the number of bytes in the entry. */
+#define NRINTERNAL \
+       LALIGN(sizeof(recno_t) + sizeof(pgno_t))
+
+/* Copy a RINTERAL entry to the page. */
+#define        WR_RINTERNAL(p, nrecs, pgno) { \
+       *(recno_t *)p = nrecs; \
+       p += sizeof(recno_t); \
+       *(pgno_t *)p = pgno; \
+}
+
+/* For the btree leaf pages, the item is a key and data pair. */
+typedef struct _bleaf {
+       size_t  ksize;                  /* size of key */
+       size_t  dsize;                  /* size of data */
+       u_char  flags;                  /* P_BIGDATA, P_BIGKEY */
+       char    bytes[1];               /* data */
+} BLEAF;
+
+/* Get the page's BLEAF structure at index indx. */
+#define        GETBLEAF(pg, indx) \
+       ((BLEAF *)((char *)(pg) + (pg)->linp[indx]))
+
+/* Get the number of bytes in the entry. */
+#define NBLEAF(p)      NBLEAFDBT((p)->ksize, (p)->dsize)
+
+/* Get the number of bytes in the user's key/data pair. */
+#define NBLEAFDBT(ksize, dsize) \
+       LALIGN(sizeof(size_t) + sizeof(size_t) + sizeof(u_char) + \
+           (ksize) + (dsize))
+
+/* Copy a BLEAF entry to the page. */
+#define        WR_BLEAF(p, key, data, flags) { \
+       *(size_t *)p = key->size; \
+       p += sizeof(size_t); \
+       *(size_t *)p = data->size; \
+       p += sizeof(size_t); \
+       *(u_char *)p = flags; \
+       p += sizeof(u_char); \
+       memmove(p, key->data, key->size); \
+       p += key->size; \
+       memmove(p, data->data, data->size); \
+}
+
+/* For the recno leaf pages, the item is a data entry. */
+typedef struct _rleaf {
+       size_t  dsize;                  /* size of data */
+       u_char  flags;                  /* P_BIGDATA */
+       char    bytes[1];
+} RLEAF;
+
+/* Get the page's RLEAF structure at index indx. */
+#define        GETRLEAF(pg, indx) \
+       ((RLEAF *)((char *)(pg) + (pg)->linp[indx]))
+
+/* Get the number of bytes in the entry. */
+#define NRLEAF(p)      NRLEAFDBT((p)->dsize)
+
+/* Get the number of bytes from the user's data. */
+#define        NRLEAFDBT(dsize) \
+       LALIGN(sizeof(size_t) + sizeof(u_char) + (dsize))
+
+/* Copy a RLEAF entry to the page. */
+#define        WR_RLEAF(p, data, flags) { \
+       *(size_t *)p = data->size; \
+       p += sizeof(size_t); \
+       *(u_char *)p = flags; \
+       p += sizeof(u_char); \
+       memmove(p, data->data, data->size); \
+}
+
+/*
+ * A record in the tree is either a pointer to a page and an index in the page
+ * or a page number and an index.  These structures are used as a cursor, stack
+ * entry and search returns as well as to pass records to other routines.
+ *
+ * One comment about searches.  Internal page searches must find the largest
+ * record less than key in the tree so that descents work.  Leaf page searches
+ * must find the smallest record greater than key so that the returned index
+ * is the record's correct position for insertion.
+ *
+ * One comment about cursors.  The cursor key is never removed from the tree,
+ * even if deleted.  This is because it is quite difficult to decide where the
+ * cursor should be when other keys have been inserted/deleted in the tree;
+ * duplicate keys make it impossible.  This scheme does require extra work
+ * though, to make sure that we don't perform an operation on a deleted key.
+ */
+typedef struct _epgno {
+       pgno_t  pgno;                   /* the page number */
+       indx_t  index;                  /* the index on the page */
+} EPGNO;
+
+typedef struct _epg {
+       PAGE    *page;                  /* the (pinned) page */
+       indx_t   index;                 /* the index on the page */
+} EPG;
+
+/*
+ * The metadata of the tree.  The m_nrecs field is used only by the RECNO code.
+ * This is because the btree doesn't really need it and it requires that every
+ * put or delete call modify the metadata.
+ */
+typedef struct _btmeta {
+       u_int32_t       m_magic;        /* magic number */
+       u_int32_t       m_version;      /* version */
+       u_int32_t       m_psize;        /* page size */
+       u_int32_t       m_free;         /* page number of first free page */
+       u_int32_t       m_nrecs;        /* R: number of records */
+#define        SAVEMETA        (B_NODUPS | R_RECNO)
+       u_int32_t       m_flags;        /* bt_flags & SAVEMETA */
+       u_int32_t       m_unused;       /* unused */
+} BTMETA;
+
+/* The in-memory btree/recno data structure. */
+typedef struct _btree {
+       MPOOL   *bt_mp;                 /* memory pool cookie */
+
+       DB      *bt_dbp;                /* pointer to enclosing DB */
+
+       EPG     bt_cur;                 /* current (pinned) page */
+       PAGE    *bt_pinned;             /* page pinned across calls */
+
+       EPGNO   bt_bcursor;             /* B: btree cursor */
+       recno_t bt_rcursor;             /* R: recno cursor (1-based) */
+
+#define        BT_POP(t)       (t->bt_sp ? t->bt_stack + --t->bt_sp : NULL)
+#define        BT_CLR(t)       (t->bt_sp = 0)
+       EPGNO   *bt_stack;              /* stack of parent pages */
+       u_int   bt_sp;                  /* current stack pointer */
+       u_int   bt_maxstack;            /* largest stack */
+
+       char    *bt_kbuf;               /* key buffer */
+       size_t  bt_kbufsz;              /* key buffer size */
+       char    *bt_dbuf;               /* data buffer */
+       size_t  bt_dbufsz;              /* data buffer size */
+
+       int     bt_fd;                  /* tree file descriptor */
+
+       pgno_t  bt_free;                /* next free page */
+       u_int32_t bt_psize;             /* page size */
+       indx_t  bt_ovflsize;            /* cut-off for key/data overflow */
+       int     bt_lorder;              /* byte order */
+                                       /* sorted order */
+       enum { NOT, BACK, FORWARD } bt_order;
+       EPGNO   bt_last;                /* last insert */
+
+                                       /* B: key comparison function */
+       int     (*bt_cmp) __P((const DBT *, const DBT *));
+                                       /* B: prefix comparison function */
+       size_t  (*bt_pfx) __P((const DBT *, const DBT *));
+                                       /* R: recno input function */
+       int     (*bt_irec) __P((struct _btree *, recno_t));
+
+       FILE    *bt_rfp;                /* R: record FILE pointer */
+       int     bt_rfd;                 /* R: record file descriptor */
+
+       caddr_t bt_cmap;                /* R: current point in mapped space */
+       caddr_t bt_smap;                /* R: start of mapped space */
+       caddr_t bt_emap;                /* R: end of mapped space */
+       size_t  bt_msize;               /* R: size of mapped region. */
+
+       recno_t bt_nrecs;               /* R: number of records */
+       size_t  bt_reclen;              /* R: fixed record length */
+       u_char  bt_bval;                /* R: delimiting byte/pad character */
+
+/*
+ * NB:
+ * B_NODUPS and R_RECNO are stored on disk, and may not be changed.
+ */
+#define        B_DELCRSR       0x00001         /* cursor has been deleted */
+#define        B_INMEM         0x00002         /* in-memory tree */
+#define        B_METADIRTY     0x00004         /* need to write metadata */
+#define        B_MODIFIED      0x00008         /* tree modified */
+#define        B_NEEDSWAP      0x00010         /* if byte order requires swapping */
+#define        B_NODUPS        0x00020         /* no duplicate keys permitted */
+#define        B_RDONLY        0x00040         /* read-only tree */
+#define        R_RECNO         0x00080         /* record oriented tree */
+#define        B_SEQINIT       0x00100         /* sequential scan initialized */
+
+#define        R_CLOSEFP       0x00200         /* opened a file pointer */
+#define        R_EOF           0x00400         /* end of input file reached. */
+#define        R_FIXLEN        0x00800         /* fixed length records */
+#define        R_MEMMAPPED     0x01000         /* memory mapped file. */
+#define        R_INMEM         0x02000         /* in-memory file */
+#define        R_MODIFIED      0x04000         /* modified file */
+#define        R_RDONLY        0x08000         /* read-only file */
+
+#define        B_DB_LOCK       0x10000         /* DB_LOCK specified. */
+#define        B_DB_SHMEM      0x20000         /* DB_SHMEM specified. */
+#define        B_DB_TXN        0x40000         /* DB_TXN specified. */
+
+       u_int32_t       bt_flags;       /* btree state */
+} BTREE;
+
+#define        SET(t, f)       ((t)->bt_flags |= (f))
+#define        CLR(t, f)       ((t)->bt_flags &= ~(f))
+#define        ISSET(t, f)     ((t)->bt_flags & (f))
+
+#include "bt_extern.h"
diff --git a/db.subproj/db.subproj/Makefile b/db.subproj/db.subproj/Makefile
new file mode 100644 (file)
index 0000000..b3f08b6
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = db
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = db.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/db.subproj/db.subproj/Makefile.postamble b/db.subproj/db.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/db.subproj/db.subproj/Makefile.preamble b/db.subproj/db.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/db.subproj/db.subproj/PB.project b/db.subproj/db.subproj/PB.project
new file mode 100644 (file)
index 0000000..b93a5d0
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (db.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = db; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/db.subproj/db.subproj/db.c b/db.subproj/db.subproj/db.c
new file mode 100644 (file)
index 0000000..086e14d
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include <db.h>
+
+DB *
+dbopen(fname, flags, mode, type, openinfo)
+       const char *fname;
+       int flags, mode;
+       DBTYPE type;
+       const void *openinfo;
+{
+
+#define        DB_FLAGS        (DB_LOCK | DB_SHMEM | DB_TXN)
+#define        USE_OPEN_FLAGS                                                  \
+       (O_CREAT | O_EXCL | O_EXLOCK | O_NONBLOCK | O_RDONLY |          \
+        O_RDWR | O_SHLOCK | O_TRUNC)
+
+       if ((flags & ~(USE_OPEN_FLAGS | DB_FLAGS)) == 0)
+               switch (type) {
+               case DB_BTREE:
+                       return (__bt_open(fname, flags & USE_OPEN_FLAGS,
+                           mode, openinfo, flags & DB_FLAGS));
+               case DB_HASH:
+                       return (__hash_open(fname, flags & USE_OPEN_FLAGS,
+                           mode, openinfo, flags & DB_FLAGS));
+               case DB_RECNO:
+                       return (__rec_open(fname, flags & USE_OPEN_FLAGS,
+                           mode, openinfo, flags & DB_FLAGS));
+               }
+       errno = EINVAL;
+       return (NULL);
+}
+
+static int
+__dberr()
+{
+       return (RET_ERROR);
+}
+
+/*
+ * __DBPANIC -- Stop.
+ *
+ * Parameters:
+ *     dbp:    pointer to the DB structure.
+ */
+void
+__dbpanic(dbp)
+       DB *dbp;
+{
+       /* The only thing that can succeed is a close. */
+       dbp->del = (int (*)())__dberr;
+       dbp->fd = (int (*)())__dberr;
+       dbp->get = (int (*)())__dberr;
+       dbp->put = (int (*)())__dberr;
+       dbp->seq = (int (*)())__dberr;
+       dbp->sync = (int (*)())__dberr;
+}
diff --git a/db.subproj/hash.subproj/Makefile b/db.subproj/hash.subproj/Makefile
new file mode 100644 (file)
index 0000000..f27af80
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = hash
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = extern.h hash.h page.h search.h
+
+CFILES = hash.c hash_bigkey.c hash_buf.c hash_func.c hash_log2.c\
+         hash_page.c hsearch.c ndbm.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/db.subproj/hash.subproj/Makefile.postamble b/db.subproj/hash.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/db.subproj/hash.subproj/Makefile.preamble b/db.subproj/hash.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/db.subproj/hash.subproj/PB.project b/db.subproj/hash.subproj/PB.project
new file mode 100644 (file)
index 0000000..6cfb553
--- /dev/null
@@ -0,0 +1,32 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (extern.h, hash.h, page.h, search.h); 
+        OTHER_LINKED = (
+            hash.c, 
+            hash_bigkey.c, 
+            hash_buf.c, 
+            hash_func.c, 
+            hash_log2.c, 
+            hash_page.c, 
+            hsearch.c, 
+            ndbm.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = hash; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/db.subproj/hash.subproj/extern.h b/db.subproj/hash.subproj/extern.h
new file mode 100644 (file)
index 0000000..cf678d2
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+BUFHEAD        *__add_ovflpage __P((HTAB *, BUFHEAD *));
+int     __addel __P((HTAB *, BUFHEAD *, const DBT *, const DBT *));
+int     __big_delete __P((HTAB *, BUFHEAD *));
+int     __big_insert __P((HTAB *, BUFHEAD *, const DBT *, const DBT *));
+int     __big_keydata __P((HTAB *, BUFHEAD *, DBT *, DBT *, int));
+int     __big_return __P((HTAB *, BUFHEAD *, int, DBT *, int));
+int     __big_split __P((HTAB *, BUFHEAD *, BUFHEAD *, BUFHEAD *,
+               int, u_int, SPLIT_RETURN *));
+int     __buf_free __P((HTAB *, int, int));
+void    __buf_init __P((HTAB *, int));
+u_int   __call_hash __P((HTAB *, char *, int));
+int     __delpair __P((HTAB *, BUFHEAD *, int));
+int     __expand_table __P((HTAB *));
+int     __find_bigpair __P((HTAB *, BUFHEAD *, int, char *, int));
+u_short         __find_last_page __P((HTAB *, BUFHEAD **));
+void    __free_ovflpage __P((HTAB *, BUFHEAD *));
+BUFHEAD        *__get_buf __P((HTAB *, u_int, BUFHEAD *, int));
+int     __get_page __P((HTAB *, char *, u_int, int, int, int));
+int     __init_bitmap __P((HTAB *, int, int, int));
+u_int   __log2 __P((u_int));
+int     __put_page __P((HTAB *, char *, u_int, int, int));
+void    __reclaim_buf __P((HTAB *, BUFHEAD *));
+int     __split_page __P((HTAB *, u_int, u_int));
+
+/* Default hash routine. */
+extern u_int32_t (*__default_hash) __P((const void *, size_t));
+
+#ifdef HASH_STATISTICS
+extern long hash_accesses, hash_collisions, hash_expansions, hash_overflows;
+#endif
diff --git a/db.subproj/hash.subproj/hash.c b/db.subproj/hash.subproj/hash.c
new file mode 100644 (file)
index 0000000..40b4761
--- /dev/null
@@ -0,0 +1,1012 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#ifdef DEBUG
+#include <assert.h>
+#endif
+
+#include <db.h>
+#include "hash.h"
+#include "page.h"
+#include "extern.h"
+
+static int   alloc_segs __P((HTAB *, int));
+static int   flush_meta __P((HTAB *));
+static int   hash_access __P((HTAB *, ACTION, DBT *, DBT *));
+static int   hash_close __P((DB *));
+static int   hash_delete __P((const DB *, const DBT *, u_int));
+static int   hash_fd __P((const DB *));
+static int   hash_get __P((const DB *, const DBT *, DBT *, u_int));
+static int   hash_put __P((const DB *, DBT *, const DBT *, u_int));
+static void *hash_realloc __P((SEGMENT **, int, int));
+static int   hash_seq __P((const DB *, DBT *, DBT *, u_int));
+static int   hash_sync __P((const DB *, u_int));
+static int   hdestroy __P((HTAB *));
+static HTAB *init_hash __P((HTAB *, const char *, HASHINFO *));
+static int   init_htab __P((HTAB *, int));
+#if BYTE_ORDER == LITTLE_ENDIAN
+static void  swap_header __P((HTAB *));
+static void  swap_header_copy __P((HASHHDR *, HASHHDR *));
+#endif
+
+/* Fast arithmetic, relying on powers of 2, */
+#define MOD(x, y)              ((x) & ((y) - 1))
+
+#define RETURN_ERROR(ERR, LOC) { save_errno = ERR; goto LOC; }
+
+/* Return values */
+#define        SUCCESS  (0)
+#define        ERROR   (-1)
+#define        ABNORMAL (1)
+
+#ifdef HASH_STATISTICS
+long hash_accesses, hash_collisions, hash_expansions, hash_overflows;
+#endif
+
+/************************** INTERFACE ROUTINES ***************************/
+/* OPEN/CLOSE */
+
+extern DB *
+__hash_open(file, flags, mode, info, dflags)
+       const char *file;
+       int flags, mode, dflags;
+       const HASHINFO *info;   /* Special directives for create */
+{
+       HTAB *hashp;
+       struct stat statbuf;
+       DB *dbp;
+       int bpages, hdrsize, new_table, nsegs, save_errno;
+
+       if ((flags & O_ACCMODE) == O_WRONLY) {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       if (!(hashp = (HTAB *)calloc(1, sizeof(HTAB))))
+               return (NULL);
+       hashp->fp = -1;
+
+       /*
+        * Even if user wants write only, we need to be able to read
+        * the actual file, so we need to open it read/write. But, the
+        * field in the hashp structure needs to be accurate so that
+        * we can check accesses.
+        */
+       hashp->flags = flags;
+
+       new_table = 0;
+       if (!file || (flags & O_TRUNC) ||
+           (stat(file, &statbuf) && (errno == ENOENT))) {
+               if (errno == ENOENT)
+                       errno = 0; /* Just in case someone looks at errno */
+               new_table = 1;
+       }
+       if (file) {
+               if ((hashp->fp = open(file, flags, mode)) == -1)
+                       RETURN_ERROR(errno, error0);
+               (void)fcntl(hashp->fp, F_SETFD, 1);
+       }
+       if (new_table) {
+               if (!(hashp = init_hash(hashp, file, (HASHINFO *)info)))
+                       RETURN_ERROR(errno, error1);
+       } else {
+               /* Table already exists */
+               if (info && info->hash)
+                       hashp->hash = info->hash;
+               else
+                       hashp->hash = __default_hash;
+
+               hdrsize = read(hashp->fp, &hashp->hdr, sizeof(HASHHDR));
+#if BYTE_ORDER == LITTLE_ENDIAN
+               swap_header(hashp);
+#endif
+               if (hdrsize == -1)
+                       RETURN_ERROR(errno, error1);
+               if (hdrsize != sizeof(HASHHDR))
+                       RETURN_ERROR(EFTYPE, error1);
+               /* Verify file type, versions and hash function */
+               if (hashp->MAGIC != HASHMAGIC)
+                       RETURN_ERROR(EFTYPE, error1);
+#define        OLDHASHVERSION  1
+               if (hashp->VERSION != HASHVERSION &&
+                   hashp->VERSION != OLDHASHVERSION)
+                       RETURN_ERROR(EFTYPE, error1);
+               if (hashp->hash(CHARKEY, sizeof(CHARKEY)) != hashp->H_CHARKEY)
+                       RETURN_ERROR(EFTYPE, error1);
+               /*
+                * Figure out how many segments we need.  Max_Bucket is the
+                * maximum bucket number, so the number of buckets is
+                * max_bucket + 1.
+                */
+               nsegs = (hashp->MAX_BUCKET + 1 + hashp->SGSIZE - 1) /
+                        hashp->SGSIZE;
+               hashp->nsegs = 0;
+               if (alloc_segs(hashp, nsegs))
+                       /*
+                        * If alloc_segs fails, table will have been destroyed
+                        * and errno will have been set.
+                        */
+                       return (NULL);
+               /* Read in bitmaps */
+               bpages = (hashp->SPARES[hashp->OVFL_POINT] +
+                   (hashp->BSIZE << BYTE_SHIFT) - 1) >>
+                   (hashp->BSHIFT + BYTE_SHIFT);
+
+               hashp->nmaps = bpages;
+               (void)memset(&hashp->mapp[0], 0, bpages * sizeof(u_long *));
+       }
+
+       /* Initialize Buffer Manager */
+       if (info && info->cachesize)
+               __buf_init(hashp, info->cachesize);
+       else
+               __buf_init(hashp, DEF_BUFSIZE);
+
+       hashp->new_file = new_table;
+       hashp->save_file = file && (hashp->flags & O_RDWR);
+       hashp->cbucket = -1;
+       if (!(dbp = (DB *)malloc(sizeof(DB)))) {
+               save_errno = errno;
+               hdestroy(hashp);
+               errno = save_errno;
+               return (NULL);
+       }
+       dbp->internal = hashp;
+       dbp->close = hash_close;
+       dbp->del = hash_delete;
+       dbp->fd = hash_fd;
+       dbp->get = hash_get;
+       dbp->put = hash_put;
+       dbp->seq = hash_seq;
+       dbp->sync = hash_sync;
+       dbp->type = DB_HASH;
+
+#ifdef DEBUG
+       (void)fprintf(stderr,
+"%s\n%s%x\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%x\n%s%x\n%s%d\n%s%d\n",
+           "init_htab:",
+           "TABLE POINTER   ", hashp,
+           "BUCKET SIZE     ", hashp->BSIZE,
+           "BUCKET SHIFT    ", hashp->BSHIFT,
+           "DIRECTORY SIZE  ", hashp->DSIZE,
+           "SEGMENT SIZE    ", hashp->SGSIZE,
+           "SEGMENT SHIFT   ", hashp->SSHIFT,
+           "FILL FACTOR     ", hashp->FFACTOR,
+           "MAX BUCKET      ", hashp->MAX_BUCKET,
+           "OVFL POINT      ", hashp->OVFL_POINT,
+           "LAST FREED      ", hashp->LAST_FREED,
+           "HIGH MASK       ", hashp->HIGH_MASK,
+           "LOW  MASK       ", hashp->LOW_MASK,
+           "NSEGS           ", hashp->nsegs,
+           "NKEYS           ", hashp->NKEYS);
+#endif
+#ifdef HASH_STATISTICS
+       hash_overflows = hash_accesses = hash_collisions = hash_expansions = 0;
+#endif
+       return (dbp);
+
+error1:
+       if (hashp != NULL)
+               (void)close(hashp->fp);
+
+error0:
+       free(hashp);
+       errno = save_errno;
+       return (NULL);
+}
+
+static int
+hash_close(dbp)
+       DB *dbp;
+{
+       HTAB *hashp;
+       int retval;
+
+       if (!dbp)
+               return (ERROR);
+
+       hashp = (HTAB *)dbp->internal;
+       retval = hdestroy(hashp);
+       free(dbp);
+       return (retval);
+}
+
+static int
+hash_fd(dbp)
+       const DB *dbp;
+{
+       HTAB *hashp;
+
+       if (!dbp)
+               return (ERROR);
+
+       hashp = (HTAB *)dbp->internal;
+       if (hashp->fp == -1) {
+               errno = ENOENT;
+               return (-1);
+       }
+       return (hashp->fp);
+}
+
+/************************** LOCAL CREATION ROUTINES **********************/
+static HTAB *
+init_hash(hashp, file, info)
+       HTAB *hashp;
+       const char *file;
+       HASHINFO *info;
+{
+       struct stat statbuf;
+       int nelem;
+
+       nelem = 1;
+       hashp->NKEYS = 0;
+       hashp->LORDER = BYTE_ORDER;
+       hashp->BSIZE = DEF_BUCKET_SIZE;
+       hashp->BSHIFT = DEF_BUCKET_SHIFT;
+       hashp->SGSIZE = DEF_SEGSIZE;
+       hashp->SSHIFT = DEF_SEGSIZE_SHIFT;
+       hashp->DSIZE = DEF_DIRSIZE;
+       hashp->FFACTOR = DEF_FFACTOR;
+       hashp->hash = __default_hash;
+       memset(hashp->SPARES, 0, sizeof(hashp->SPARES));
+       memset(hashp->BITMAPS, 0, sizeof (hashp->BITMAPS));
+
+       /* Fix bucket size to be optimal for file system */
+       if (file != NULL) {
+               if (stat(file, &statbuf))
+                       return (NULL);
+               hashp->BSIZE = statbuf.st_blksize;
+               hashp->BSHIFT = __log2(hashp->BSIZE);
+       }
+
+       if (info) {
+               if (info->bsize) {
+                       /* Round pagesize up to power of 2 */
+                       hashp->BSHIFT = __log2(info->bsize);
+                       hashp->BSIZE = 1 << hashp->BSHIFT;
+                       if (hashp->BSIZE > MAX_BSIZE) {
+                               errno = EINVAL;
+                               return (NULL);
+                       }
+               }
+               if (info->ffactor)
+                       hashp->FFACTOR = info->ffactor;
+               if (info->hash)
+                       hashp->hash = info->hash;
+               if (info->nelem)
+                       nelem = info->nelem;
+               if (info->lorder) {
+                       if (info->lorder != BIG_ENDIAN &&
+                           info->lorder != LITTLE_ENDIAN) {
+                               errno = EINVAL;
+                               return (NULL);
+                       }
+                       hashp->LORDER = info->lorder;
+               }
+       }
+       /* init_htab should destroy the table and set errno if it fails */
+       if (init_htab(hashp, nelem))
+               return (NULL);
+       else
+               return (hashp);
+}
+/*
+ * This calls alloc_segs which may run out of memory.  Alloc_segs will destroy
+ * the table and set errno, so we just pass the error information along.
+ *
+ * Returns 0 on No Error
+ */
+static int
+init_htab(hashp, nelem)
+       HTAB *hashp;
+       int nelem;
+{
+       register int nbuckets, nsegs;
+       int l2;
+
+       /*
+        * Divide number of elements by the fill factor and determine a
+        * desired number of buckets.  Allocate space for the next greater
+        * power of two number of buckets.
+        */
+       nelem = (nelem - 1) / hashp->FFACTOR + 1;
+
+       l2 = __log2(MAX(nelem, 2));
+       nbuckets = 1 << l2;
+
+       hashp->SPARES[l2] = l2 + 1;
+       hashp->SPARES[l2 + 1] = l2 + 1;
+       hashp->OVFL_POINT = l2;
+       hashp->LAST_FREED = 2;
+
+       /* First bitmap page is at: splitpoint l2 page offset 1 */
+       if (__init_bitmap(hashp, OADDR_OF(l2, 1), l2 + 1, 0))
+               return (-1);
+
+       hashp->MAX_BUCKET = hashp->LOW_MASK = nbuckets - 1;
+       hashp->HIGH_MASK = (nbuckets << 1) - 1;
+       hashp->HDRPAGES = ((MAX(sizeof(HASHHDR), MINHDRSIZE) - 1) >>
+           hashp->BSHIFT) + 1;
+
+       nsegs = (nbuckets - 1) / hashp->SGSIZE + 1;
+       nsegs = 1 << __log2(nsegs);
+
+       if (nsegs > hashp->DSIZE)
+               hashp->DSIZE = nsegs;
+       return (alloc_segs(hashp, nsegs));
+}
+
+/********************** DESTROY/CLOSE ROUTINES ************************/
+
+/*
+ * Flushes any changes to the file if necessary and destroys the hashp
+ * structure, freeing all allocated space.
+ */
+static int
+hdestroy(hashp)
+       HTAB *hashp;
+{
+       int i, save_errno;
+
+       save_errno = 0;
+
+#ifdef HASH_STATISTICS
+       (void)fprintf(stderr, "hdestroy: accesses %ld collisions %ld\n",
+           hash_accesses, hash_collisions);
+       (void)fprintf(stderr, "hdestroy: expansions %ld\n",
+           hash_expansions);
+       (void)fprintf(stderr, "hdestroy: overflows %ld\n",
+           hash_overflows);
+       (void)fprintf(stderr, "keys %ld maxp %d segmentcount %d\n",
+           hashp->NKEYS, hashp->MAX_BUCKET, hashp->nsegs);
+
+       for (i = 0; i < NCACHED; i++)
+               (void)fprintf(stderr,
+                   "spares[%d] = %d\n", i, hashp->SPARES[i]);
+#endif
+       /*
+        * Call on buffer manager to free buffers, and if required,
+        * write them to disk.
+        */
+       if (__buf_free(hashp, 1, hashp->save_file))
+               save_errno = errno;
+       if (hashp->dir) {
+               free(*hashp->dir);      /* Free initial segments */
+               /* Free extra segments */
+               while (hashp->exsegs--)
+                       free(hashp->dir[--hashp->nsegs]);
+               free(hashp->dir);
+       }
+       if (flush_meta(hashp) && !save_errno)
+               save_errno = errno;
+       /* Free Bigmaps */
+       for (i = 0; i < hashp->nmaps; i++)
+               if (hashp->mapp[i])
+                       free(hashp->mapp[i]);
+
+       if (hashp->fp != -1)
+               (void)close(hashp->fp);
+
+       free(hashp);
+
+       if (save_errno) {
+               errno = save_errno;
+               return (ERROR);
+       }
+       return (SUCCESS);
+}
+/*
+ * Write modified pages to disk
+ *
+ * Returns:
+ *      0 == OK
+ *     -1 ERROR
+ */
+static int
+hash_sync(dbp, flags)
+       const DB *dbp;
+       u_int flags;
+{
+       HTAB *hashp;
+
+       if (flags != 0) {
+               errno = EINVAL;
+               return (ERROR);
+       }
+
+       if (!dbp)
+               return (ERROR);
+
+       hashp = (HTAB *)dbp->internal;
+       if (!hashp->save_file)
+               return (0);
+       if (__buf_free(hashp, 0, 1) || flush_meta(hashp))
+               return (ERROR);
+       hashp->new_file = 0;
+       return (0);
+}
+
+/*
+ * Returns:
+ *      0 == OK
+ *     -1 indicates that errno should be set
+ */
+static int
+flush_meta(hashp)
+       HTAB *hashp;
+{
+       HASHHDR *whdrp;
+#if BYTE_ORDER == LITTLE_ENDIAN
+       HASHHDR whdr;
+#endif
+       int fp, i, wsize;
+
+       if (!hashp->save_file)
+               return (0);
+       hashp->MAGIC = HASHMAGIC;
+       hashp->VERSION = HASHVERSION;
+       hashp->H_CHARKEY = hashp->hash(CHARKEY, sizeof(CHARKEY));
+
+       fp = hashp->fp;
+       whdrp = &hashp->hdr;
+#if BYTE_ORDER == LITTLE_ENDIAN
+       whdrp = &whdr;
+       swap_header_copy(&hashp->hdr, whdrp);
+#endif
+       if ((lseek(fp, (off_t)0, SEEK_SET) == -1) ||
+           ((wsize = write(fp, whdrp, sizeof(HASHHDR))) == -1))
+               return (-1);
+       else
+               if (wsize != sizeof(HASHHDR)) {
+                       errno = EFTYPE;
+                       hashp->error = errno;
+                       return (-1);
+               }
+       for (i = 0; i < NCACHED; i++)
+               if (hashp->mapp[i])
+                       if (__put_page(hashp, (char *)hashp->mapp[i],
+                               hashp->BITMAPS[i], 0, 1))
+                               return (-1);
+       return (0);
+}
+
+/*******************************SEARCH ROUTINES *****************************/
+/*
+ * All the access routines return
+ *
+ * Returns:
+ *      0 on SUCCESS
+ *      1 to indicate an external ERROR (i.e. key not found, etc)
+ *     -1 to indicate an internal ERROR (i.e. out of memory, etc)
+ */
+static int
+hash_get(dbp, key, data, flag)
+       const DB *dbp;
+       const DBT *key;
+       DBT *data;
+       u_int flag;
+{
+       HTAB *hashp;
+
+       hashp = (HTAB *)dbp->internal;
+       if (flag) {
+               hashp->error = errno = EINVAL;
+               return (ERROR);
+       }
+       return (hash_access(hashp, HASH_GET, (DBT *)key, data));
+}
+
+static int
+hash_put(dbp, key, data, flag)
+       const DB *dbp;
+       DBT *key;
+       const DBT *data;
+       u_int flag;
+{
+       HTAB *hashp;
+
+       hashp = (HTAB *)dbp->internal;
+       if (flag && flag != R_NOOVERWRITE) {
+               hashp->error = errno = EINVAL;
+               return (ERROR);
+       }
+       if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
+               hashp->error = errno = EPERM;
+               return (ERROR);
+       }
+       return (hash_access(hashp, flag == R_NOOVERWRITE ?
+           HASH_PUTNEW : HASH_PUT, (DBT *)key, (DBT *)data));
+}
+
+static int
+hash_delete(dbp, key, flag)
+       const DB *dbp;
+       const DBT *key;
+       u_int flag;             /* Ignored */
+{
+       HTAB *hashp;
+
+       hashp = (HTAB *)dbp->internal;
+       if (flag && flag != R_CURSOR) {
+               hashp->error = errno = EINVAL;
+               return (ERROR);
+       }
+       if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
+               hashp->error = errno = EPERM;
+               return (ERROR);
+       }
+       return (hash_access(hashp, HASH_DELETE, (DBT *)key, NULL));
+}
+
+/*
+ * Assume that hashp has been set in wrapper routine.
+ */
+static int
+hash_access(hashp, action, key, val)
+       HTAB *hashp;
+       ACTION action;
+       DBT *key, *val;
+{
+       register BUFHEAD *rbufp;
+       BUFHEAD *bufp, *save_bufp;
+       register u_short *bp;
+       register int n, ndx, off, size;
+       register char *kp;
+       u_short pageno;
+
+#ifdef HASH_STATISTICS
+       hash_accesses++;
+#endif
+
+       off = hashp->BSIZE;
+       size = key->size;
+       kp = (char *)key->data;
+       rbufp = __get_buf(hashp, __call_hash(hashp, kp, size), NULL, 0);
+       if (!rbufp)
+               return (ERROR);
+       save_bufp = rbufp;
+
+       /* Pin the bucket chain */
+       rbufp->flags |= BUF_PIN;
+       for (bp = (u_short *)rbufp->page, n = *bp++, ndx = 1; ndx < n;)
+               if (bp[1] >= REAL_KEY) {
+                       /* Real key/data pair */
+                       if (size == off - *bp &&
+                           memcmp(kp, rbufp->page + *bp, size) == 0)
+                               goto found;
+                       off = bp[1];
+#ifdef HASH_STATISTICS
+                       hash_collisions++;
+#endif
+                       bp += 2;
+                       ndx += 2;
+               } else if (bp[1] == OVFLPAGE) {
+                       rbufp = __get_buf(hashp, *bp, rbufp, 0);
+                       if (!rbufp) {
+                               save_bufp->flags &= ~BUF_PIN;
+                               return (ERROR);
+                       }
+                       /* FOR LOOP INIT */
+                       bp = (u_short *)rbufp->page;
+                       n = *bp++;
+                       ndx = 1;
+                       off = hashp->BSIZE;
+               } else if (bp[1] < REAL_KEY) {
+                       if ((ndx =
+                           __find_bigpair(hashp, rbufp, ndx, kp, size)) > 0)
+                               goto found;
+                       if (ndx == -2) {
+                               bufp = rbufp;
+                               if (!(pageno =
+                                   __find_last_page(hashp, &bufp))) {
+                                       ndx = 0;
+                                       rbufp = bufp;
+                                       break;  /* FOR */
+                               }
+                               rbufp = __get_buf(hashp, pageno, bufp, 0);
+                               if (!rbufp) {
+                                       save_bufp->flags &= ~BUF_PIN;
+                                       return (ERROR);
+                               }
+                               /* FOR LOOP INIT */
+                               bp = (u_short *)rbufp->page;
+                               n = *bp++;
+                               ndx = 1;
+                               off = hashp->BSIZE;
+                       } else {
+                               save_bufp->flags &= ~BUF_PIN;
+                               return (ERROR);
+                       }
+               }
+
+       /* Not found */
+       switch (action) {
+       case HASH_PUT:
+       case HASH_PUTNEW:
+               if (__addel(hashp, rbufp, key, val)) {
+                       save_bufp->flags &= ~BUF_PIN;
+                       return (ERROR);
+               } else {
+                       save_bufp->flags &= ~BUF_PIN;
+                       return (SUCCESS);
+               }
+       case HASH_GET:
+       case HASH_DELETE:
+       default:
+               save_bufp->flags &= ~BUF_PIN;
+               return (ABNORMAL);
+       }
+
+found:
+       switch (action) {
+       case HASH_PUTNEW:
+               save_bufp->flags &= ~BUF_PIN;
+               return (ABNORMAL);
+       case HASH_GET:
+               bp = (u_short *)rbufp->page;
+               if (bp[ndx + 1] < REAL_KEY) {
+                       if (__big_return(hashp, rbufp, ndx, val, 0))
+                               return (ERROR);
+               } else {
+                       val->data = (u_char *)rbufp->page + (int)bp[ndx + 1];
+                       val->size = bp[ndx] - bp[ndx + 1];
+               }
+               break;
+       case HASH_PUT:
+               if ((__delpair(hashp, rbufp, ndx)) ||
+                   (__addel(hashp, rbufp, key, val))) {
+                       save_bufp->flags &= ~BUF_PIN;
+                       return (ERROR);
+               }
+               break;
+       case HASH_DELETE:
+               if (__delpair(hashp, rbufp, ndx))
+                       return (ERROR);
+               break;
+       default:
+               abort();
+       }
+       save_bufp->flags &= ~BUF_PIN;
+       return (SUCCESS);
+}
+
+static int
+hash_seq(dbp, key, data, flag)
+       const DB *dbp;
+       DBT *key, *data;
+       u_int flag;
+{
+       register u_int bucket;
+       register BUFHEAD *bufp;
+       HTAB *hashp;
+       u_short *bp, ndx;
+
+       hashp = (HTAB *)dbp->internal;
+       if (flag && flag != R_FIRST && flag != R_NEXT) {
+               hashp->error = errno = EINVAL;
+               return (ERROR);
+       }
+#ifdef HASH_STATISTICS
+       hash_accesses++;
+#endif
+       if ((hashp->cbucket < 0) || (flag == R_FIRST)) {
+               hashp->cbucket = 0;
+               hashp->cndx = 1;
+               hashp->cpage = NULL;
+       }
+
+       for (bp = NULL; !bp || !bp[0]; ) {
+               if (!(bufp = hashp->cpage)) {
+                       for (bucket = hashp->cbucket;
+                           bucket <= hashp->MAX_BUCKET;
+                           bucket++, hashp->cndx = 1) {
+                               bufp = __get_buf(hashp, bucket, NULL, 0);
+                               if (!bufp)
+                                       return (ERROR);
+                               hashp->cpage = bufp;
+                               bp = (u_short *)bufp->page;
+                               if (bp[0])
+                                       break;
+                       }
+                       hashp->cbucket = bucket;
+                       if (hashp->cbucket > hashp->MAX_BUCKET) {
+                               hashp->cbucket = -1;
+                               return (ABNORMAL);
+                       }
+               } else
+                       bp = (u_short *)hashp->cpage->page;
+
+#ifdef DEBUG
+               assert(bp);
+               assert(bufp);
+#endif
+               while (bp[hashp->cndx + 1] == OVFLPAGE) {
+                       bufp = hashp->cpage =
+                           __get_buf(hashp, bp[hashp->cndx], bufp, 0);
+                       if (!bufp)
+                               return (ERROR);
+                       bp = (u_short *)(bufp->page);
+                       hashp->cndx = 1;
+               }
+               if (!bp[0]) {
+                       hashp->cpage = NULL;
+                       ++hashp->cbucket;
+               }
+       }
+       ndx = hashp->cndx;
+       if (bp[ndx + 1] < REAL_KEY) {
+               if (__big_keydata(hashp, bufp, key, data, 1))
+                       return (ERROR);
+       } else {
+               key->data = (u_char *)hashp->cpage->page + bp[ndx];
+               key->size = (ndx > 1 ? bp[ndx - 1] : hashp->BSIZE) - bp[ndx];
+               data->data = (u_char *)hashp->cpage->page + bp[ndx + 1];
+               data->size = bp[ndx] - bp[ndx + 1];
+               ndx += 2;
+               if (ndx > bp[0]) {
+                       hashp->cpage = NULL;
+                       hashp->cbucket++;
+                       hashp->cndx = 1;
+               } else
+                       hashp->cndx = ndx;
+       }
+       return (SUCCESS);
+}
+
+/********************************* UTILITIES ************************/
+
+/*
+ * Returns:
+ *      0 ==> OK
+ *     -1 ==> Error
+ */
+extern int
+__expand_table(hashp)
+       HTAB *hashp;
+{
+       u_int old_bucket, new_bucket;
+       int dirsize, new_segnum, spare_ndx;
+
+#ifdef HASH_STATISTICS
+       hash_expansions++;
+#endif
+       new_bucket = ++hashp->MAX_BUCKET;
+       old_bucket = (hashp->MAX_BUCKET & hashp->LOW_MASK);
+
+       new_segnum = new_bucket >> hashp->SSHIFT;
+
+       /* Check if we need a new segment */
+       if (new_segnum >= hashp->nsegs) {
+               /* Check if we need to expand directory */
+               if (new_segnum >= hashp->DSIZE) {
+                       /* Reallocate directory */
+                       dirsize = hashp->DSIZE * sizeof(SEGMENT *);
+                       if (!hash_realloc(&hashp->dir, dirsize, dirsize << 1))
+                               return (-1);
+                       hashp->DSIZE = dirsize << 1;
+               }
+               if ((hashp->dir[new_segnum] =
+                   (SEGMENT)calloc(hashp->SGSIZE, sizeof(SEGMENT))) == NULL)
+                       return (-1);
+               hashp->exsegs++;
+               hashp->nsegs++;
+       }
+       /*
+        * If the split point is increasing (MAX_BUCKET's log base 2
+        * * increases), we need to copy the current contents of the spare
+        * split bucket to the next bucket.
+        */
+       spare_ndx = __log2(hashp->MAX_BUCKET + 1);
+       if (spare_ndx > hashp->OVFL_POINT) {
+               hashp->SPARES[spare_ndx] = hashp->SPARES[hashp->OVFL_POINT];
+               hashp->OVFL_POINT = spare_ndx;
+       }
+
+       if (new_bucket > hashp->HIGH_MASK) {
+               /* Starting a new doubling */
+               hashp->LOW_MASK = hashp->HIGH_MASK;
+               hashp->HIGH_MASK = new_bucket | hashp->LOW_MASK;
+       }
+       /* Relocate records to the new bucket */
+       return (__split_page(hashp, old_bucket, new_bucket));
+}
+
+/*
+ * If realloc guarantees that the pointer is not destroyed if the realloc
+ * fails, then this routine can go away.
+ */
+static void *
+hash_realloc(p_ptr, oldsize, newsize)
+       SEGMENT **p_ptr;
+       int oldsize, newsize;
+{
+       register void *p;
+
+       if (p = malloc(newsize)) {
+               memmove(p, *p_ptr, oldsize);
+               memset((char *)p + oldsize, 0, newsize - oldsize);
+               free(*p_ptr);
+               *p_ptr = p;
+       }
+       return (p);
+}
+
+extern u_int
+__call_hash(hashp, k, len)
+       HTAB *hashp;
+       char *k;
+       int len;
+{
+       int n, bucket;
+
+       n = hashp->hash(k, len);
+       bucket = n & hashp->HIGH_MASK;
+       if (bucket > hashp->MAX_BUCKET)
+               bucket = bucket & hashp->LOW_MASK;
+       return (bucket);
+}
+
+/*
+ * Allocate segment table.  On error, destroy the table and set errno.
+ *
+ * Returns 0 on success
+ */
+static int
+alloc_segs(hashp, nsegs)
+       HTAB *hashp;
+       int nsegs;
+{
+       register int i;
+       register SEGMENT store;
+
+       int save_errno;
+
+       if ((hashp->dir =
+           (SEGMENT *)calloc(hashp->DSIZE, sizeof(SEGMENT *))) == NULL) {
+               save_errno = errno;
+               (void)hdestroy(hashp);
+               errno = save_errno;
+               return (-1);
+       }
+       /* Allocate segments */
+       if ((store =
+           (SEGMENT)calloc(nsegs << hashp->SSHIFT, sizeof(SEGMENT))) == NULL) {
+               save_errno = errno;
+               (void)hdestroy(hashp);
+               errno = save_errno;
+               return (-1);
+       }
+       for (i = 0; i < nsegs; i++, hashp->nsegs++)
+               hashp->dir[i] = &store[i << hashp->SSHIFT];
+       return (0);
+}
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+/*
+ * Hashp->hdr needs to be byteswapped.
+ */
+static void
+swap_header_copy(srcp, destp)
+       HASHHDR *srcp, *destp;
+{
+       int i;
+
+       P_32_COPY(srcp->magic, destp->magic);
+       P_32_COPY(srcp->version, destp->version);
+       P_32_COPY(srcp->lorder, destp->lorder);
+       P_32_COPY(srcp->bsize, destp->bsize);
+       P_32_COPY(srcp->bshift, destp->bshift);
+       P_32_COPY(srcp->dsize, destp->dsize);
+       P_32_COPY(srcp->ssize, destp->ssize);
+       P_32_COPY(srcp->sshift, destp->sshift);
+       P_32_COPY(srcp->ovfl_point, destp->ovfl_point);
+       P_32_COPY(srcp->last_freed, destp->last_freed);
+       P_32_COPY(srcp->max_bucket, destp->max_bucket);
+       P_32_COPY(srcp->high_mask, destp->high_mask);
+       P_32_COPY(srcp->low_mask, destp->low_mask);
+       P_32_COPY(srcp->ffactor, destp->ffactor);
+       P_32_COPY(srcp->nkeys, destp->nkeys);
+       P_32_COPY(srcp->hdrpages, destp->hdrpages);
+       P_32_COPY(srcp->h_charkey, destp->h_charkey);
+       for (i = 0; i < NCACHED; i++) {
+               P_32_COPY(srcp->spares[i], destp->spares[i]);
+               P_16_COPY(srcp->bitmaps[i], destp->bitmaps[i]);
+       }
+}
+
+static void
+swap_header(hashp)
+       HTAB *hashp;
+{
+       HASHHDR *hdrp;
+       int i;
+
+       hdrp = &hashp->hdr;
+
+       M_32_SWAP(hdrp->magic);
+       M_32_SWAP(hdrp->version);
+       M_32_SWAP(hdrp->lorder);
+       M_32_SWAP(hdrp->bsize);
+       M_32_SWAP(hdrp->bshift);
+       M_32_SWAP(hdrp->dsize);
+       M_32_SWAP(hdrp->ssize);
+       M_32_SWAP(hdrp->sshift);
+       M_32_SWAP(hdrp->ovfl_point);
+       M_32_SWAP(hdrp->last_freed);
+       M_32_SWAP(hdrp->max_bucket);
+       M_32_SWAP(hdrp->high_mask);
+       M_32_SWAP(hdrp->low_mask);
+       M_32_SWAP(hdrp->ffactor);
+       M_32_SWAP(hdrp->nkeys);
+       M_32_SWAP(hdrp->hdrpages);
+       M_32_SWAP(hdrp->h_charkey);
+       for (i = 0; i < NCACHED; i++) {
+               M_32_SWAP(hdrp->spares[i]);
+               M_16_SWAP(hdrp->bitmaps[i]);
+       }
+}
+#endif
diff --git a/db.subproj/hash.subproj/hash.h b/db.subproj/hash.subproj/hash.h
new file mode 100644 (file)
index 0000000..2140387
--- /dev/null
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Operations */
+typedef enum {
+       HASH_GET, HASH_PUT, HASH_PUTNEW, HASH_DELETE, HASH_FIRST, HASH_NEXT
+} ACTION;
+
+/* Buffer Management structures */
+typedef struct _bufhead BUFHEAD;
+
+struct _bufhead {
+       BUFHEAD *prev;          /* LRU links */
+       BUFHEAD *next;          /* LRU links */
+       BUFHEAD *ovfl;          /* Overflow page buffer header */
+       u_int    addr;          /* Address of this page */
+       char    *page;          /* Actual page data */
+       char     flags;
+#define        BUF_MOD         0x0001
+#define BUF_DISK       0x0002
+#define        BUF_BUCKET      0x0004
+#define        BUF_PIN         0x0008
+};
+
+#define IS_BUCKET(X)   ((X) & BUF_BUCKET)
+
+typedef BUFHEAD **SEGMENT;
+
+/* Hash Table Information */
+typedef struct hashhdr {       /* Disk resident portion */
+       int     magic;          /* Magic NO for hash tables */
+       int     version;        /* Version ID */
+       long    lorder;         /* Byte Order */
+       int     bsize;          /* Bucket/Page Size */
+       int     bshift;         /* Bucket shift */
+       int     dsize;          /* Directory Size */
+       int     ssize;          /* Segment Size */
+       int     sshift;         /* Segment shift */
+       int     ovfl_point;     /* Where overflow pages are being allocated */
+       int     last_freed;     /* Last overflow page freed */
+       int     max_bucket;     /* ID of Maximum bucket in use */
+       int     high_mask;      /* Mask to modulo into entire table */
+       int     low_mask;       /* Mask to modulo into lower half of table */
+       int     ffactor;        /* Fill factor */
+       int     nkeys;          /* Number of keys in hash table */
+       int     hdrpages;       /* Size of table header */
+       int     h_charkey;      /* value of hash(CHARKEY) */
+#define NCACHED        32              /* number of bit maps and spare points */
+       int     spares[NCACHED];/* spare pages for overflow */
+       u_short bitmaps[NCACHED];       /* address of overflow page bitmaps */
+} HASHHDR;
+
+typedef struct htab {          /* Memory resident data structure */
+       HASHHDR hdr;            /* Header */
+       int     nsegs;          /* Number of allocated segments */
+       int     exsegs;         /* Number of extra allocated segments */
+       u_int32_t               /* Hash function */
+           (*hash)__P((const void *, size_t));
+       int     flags;          /* Flag values */
+       int     fp;             /* File pointer */
+       char    *tmp_buf;       /* Temporary Buffer for BIG data */
+       char    *tmp_key;       /* Temporary Buffer for BIG keys */
+       BUFHEAD *cpage;         /* Current page */
+       int     cbucket;        /* Current bucket */
+       int     cndx;           /* Index of next item on cpage */
+       int     error;          /* Error Number -- for DBM compatability */
+       int     new_file;       /* Indicates if fd is backing store or no */
+       int     save_file;      /* Indicates whether we need to flush file at
+                                * exit */
+       u_long *mapp[NCACHED];  /* Pointers to page maps */
+       int     nmaps;          /* Initial number of bitmaps */
+       int     nbufs;          /* Number of buffers left to allocate */
+       BUFHEAD bufhead;        /* Header of buffer lru list */
+       SEGMENT *dir;           /* Hash Bucket directory */
+} HTAB;
+
+/*
+ * Constants
+ */
+#define        MAX_BSIZE               65536           /* 2^16 */
+#define MIN_BUFFERS            6
+#define MINHDRSIZE             512
+#define DEF_BUFSIZE            65536           /* 64 K */
+#define DEF_BUCKET_SIZE                4096
+#define DEF_BUCKET_SHIFT       12              /* log2(BUCKET) */
+#define DEF_SEGSIZE            256
+#define DEF_SEGSIZE_SHIFT      8               /* log2(SEGSIZE)         */
+#define DEF_DIRSIZE            256
+#define DEF_FFACTOR            65536
+#define MIN_FFACTOR            4
+#define SPLTMAX                        8
+#define CHARKEY                        "%$sniglet^&"
+#define NUMKEY                 1038583
+#define BYTE_SHIFT             3
+#define INT_TO_BYTE            2
+#define INT_BYTE_SHIFT         5
+#define ALL_SET                        ((u_int)0xFFFFFFFF)
+#define ALL_CLEAR              0
+
+#define PTROF(X)       ((BUFHEAD *)((u_int)(X)&~0x3))
+#define ISMOD(X)       ((u_int)(X)&0x1)
+#define DOMOD(X)       ((X) = (char *)((u_int)(X)|0x1))
+#define ISDISK(X)      ((u_int)(X)&0x2)
+#define DODISK(X)      ((X) = (char *)((u_int)(X)|0x2))
+
+#define BITS_PER_MAP   32
+
+/* Given the address of the beginning of a big map, clear/set the nth bit */
+#define CLRBIT(A, N)   ((A)[(N)/BITS_PER_MAP] &= ~(1<<((N)%BITS_PER_MAP)))
+#define SETBIT(A, N)   ((A)[(N)/BITS_PER_MAP] |= (1<<((N)%BITS_PER_MAP)))
+#define ISSET(A, N)    ((A)[(N)/BITS_PER_MAP] & (1<<((N)%BITS_PER_MAP)))
+
+/* Overflow management */
+/*
+ * Overflow page numbers are allocated per split point.  At each doubling of
+ * the table, we can allocate extra pages.  So, an overflow page number has
+ * the top 5 bits indicate which split point and the lower 11 bits indicate
+ * which page at that split point is indicated (pages within split points are
+ * numberered starting with 1).
+ */
+
+#define SPLITSHIFT     11
+#define SPLITMASK      0x7FF
+#define SPLITNUM(N)    (((u_int)(N)) >> SPLITSHIFT)
+#define OPAGENUM(N)    ((N) & SPLITMASK)
+#define        OADDR_OF(S,O)   ((u_int)((u_int)(S) << SPLITSHIFT) + (O))
+
+#define BUCKET_TO_PAGE(B) \
+       (B) + hashp->HDRPAGES + ((B) ? hashp->SPARES[__log2((B)+1)-1] : 0)
+#define OADDR_TO_PAGE(B)       \
+       BUCKET_TO_PAGE ( (1 << SPLITNUM((B))) -1 ) + OPAGENUM((B));
+
+/*
+ * page.h contains a detailed description of the page format.
+ *
+ * Normally, keys and data are accessed from offset tables in the top of
+ * each page which point to the beginning of the key and data.  There are
+ * four flag values which may be stored in these offset tables which indicate
+ * the following:
+ *
+ *
+ * OVFLPAGE    Rather than a key data pair, this pair contains
+ *             the address of an overflow page.  The format of
+ *             the pair is:
+ *                 OVERFLOW_PAGE_NUMBER OVFLPAGE
+ *
+ * PARTIAL_KEY This must be the first key/data pair on a page
+ *             and implies that page contains only a partial key.
+ *             That is, the key is too big to fit on a single page
+ *             so it starts on this page and continues on the next.
+ *             The format of the page is:
+ *                 KEY_OFF PARTIAL_KEY OVFL_PAGENO OVFLPAGE
+ *             
+ *                 KEY_OFF -- offset of the beginning of the key
+ *                 PARTIAL_KEY -- 1
+ *                 OVFL_PAGENO - page number of the next overflow page
+ *                 OVFLPAGE -- 0
+ *
+ * FULL_KEY    This must be the first key/data pair on the page.  It
+ *             is used in two cases.
+ *
+ *             Case 1:
+ *                 There is a complete key on the page but no data
+ *                 (because it wouldn't fit).  The next page contains
+ *                 the data.
+ *
+ *                 Page format it:
+ *                 KEY_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE
+ *
+ *                 KEY_OFF -- offset of the beginning of the key
+ *                 FULL_KEY -- 2
+ *                 OVFL_PAGENO - page number of the next overflow page
+ *                 OVFLPAGE -- 0
+ *
+ *             Case 2:
+ *                 This page contains no key, but part of a large
+ *                 data field, which is continued on the next page.
+ *
+ *                 Page format it:
+ *                 DATA_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE
+ *
+ *                 KEY_OFF -- offset of the beginning of the data on
+ *                             this page
+ *                 FULL_KEY -- 2
+ *                 OVFL_PAGENO - page number of the next overflow page
+ *                 OVFLPAGE -- 0
+ *
+ * FULL_KEY_DATA 
+ *             This must be the first key/data pair on the page.
+ *             There are two cases:
+ *
+ *             Case 1:
+ *                 This page contains a key and the beginning of the
+ *                 data field, but the data field is continued on the
+ *                 next page.
+ *
+ *                 Page format is:
+ *                 KEY_OFF FULL_KEY_DATA OVFL_PAGENO DATA_OFF
+ *
+ *                 KEY_OFF -- offset of the beginning of the key
+ *                 FULL_KEY_DATA -- 3
+ *                 OVFL_PAGENO - page number of the next overflow page
+ *                 DATA_OFF -- offset of the beginning of the data
+ *
+ *             Case 2:
+ *                 This page contains the last page of a big data pair.
+ *                 There is no key, only the  tail end of the data
+ *                 on this page.
+ *
+ *                 Page format is:
+ *                 DATA_OFF FULL_KEY_DATA <OVFL_PAGENO> <OVFLPAGE>
+ *
+ *                 DATA_OFF -- offset of the beginning of the data on
+ *                             this page
+ *                 FULL_KEY_DATA -- 3
+ *                 OVFL_PAGENO - page number of the next overflow page
+ *                 OVFLPAGE -- 0
+ *
+ *                 OVFL_PAGENO and OVFLPAGE are optional (they are
+ *                 not present if there is no next page).
+ */
+
+#define OVFLPAGE       0
+#define PARTIAL_KEY    1
+#define FULL_KEY       2
+#define FULL_KEY_DATA  3
+#define        REAL_KEY        4
+
+/* Short hands for accessing structure */
+#define BSIZE          hdr.bsize
+#define BSHIFT         hdr.bshift
+#define DSIZE          hdr.dsize
+#define SGSIZE         hdr.ssize
+#define SSHIFT         hdr.sshift
+#define LORDER         hdr.lorder
+#define OVFL_POINT     hdr.ovfl_point
+#define        LAST_FREED      hdr.last_freed
+#define MAX_BUCKET     hdr.max_bucket
+#define FFACTOR                hdr.ffactor
+#define HIGH_MASK      hdr.high_mask
+#define LOW_MASK       hdr.low_mask
+#define NKEYS          hdr.nkeys
+#define HDRPAGES       hdr.hdrpages
+#define SPARES         hdr.spares
+#define BITMAPS                hdr.bitmaps
+#define VERSION                hdr.version
+#define MAGIC          hdr.magic
+#define NEXT_FREE      hdr.next_free
+#define H_CHARKEY      hdr.h_charkey
diff --git a/db.subproj/hash.subproj/hash_bigkey.c b/db.subproj/hash.subproj/hash_bigkey.c
new file mode 100644 (file)
index 0000000..8c8f467
--- /dev/null
@@ -0,0 +1,685 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * PACKAGE: hash
+ * DESCRIPTION:
+ *     Big key/data handling for the hashing package.
+ *
+ * ROUTINES:
+ * External
+ *     __big_keydata
+ *     __big_split
+ *     __big_insert
+ *     __big_return
+ *     __big_delete
+ *     __find_last_page
+ * Internal
+ *     collect_key
+ *     collect_data
+ */
+
+#include <sys/param.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef DEBUG
+#include <assert.h>
+#endif
+
+#include <db.h>
+#include "hash.h"
+#include "page.h"
+#include "extern.h"
+
+static int collect_key __P((HTAB *, BUFHEAD *, int, DBT *, int));
+static int collect_data __P((HTAB *, BUFHEAD *, int, int));
+
+/*
+ * Big_insert
+ *
+ * You need to do an insert and the key/data pair is too big
+ *
+ * Returns:
+ * 0 ==> OK
+ *-1 ==> ERROR
+ */
+extern int
+__big_insert(hashp, bufp, key, val)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       const DBT *key, *val;
+{
+       register u_short *p;
+       int key_size, n, val_size;
+       u_short space, move_bytes, off;
+       char *cp, *key_data, *val_data;
+
+       cp = bufp->page;                /* Character pointer of p. */
+       p = (u_short *)cp;
+
+       key_data = (char *)key->data;
+       key_size = key->size;
+       val_data = (char *)val->data;
+       val_size = val->size;
+
+       /* First move the Key */
+       for (space = FREESPACE(p) - BIGOVERHEAD; key_size;
+           space = FREESPACE(p) - BIGOVERHEAD) {
+               move_bytes = MIN(space, key_size);
+               off = OFFSET(p) - move_bytes;
+               memmove(cp + off, key_data, move_bytes);
+               key_size -= move_bytes;
+               key_data += move_bytes;
+               n = p[0];
+               p[++n] = off;
+               p[0] = ++n;
+               FREESPACE(p) = off - PAGE_META(n);
+               OFFSET(p) = off;
+               p[n] = PARTIAL_KEY;
+               bufp = __add_ovflpage(hashp, bufp);
+               if (!bufp)
+                       return (-1);
+               n = p[0];
+               if (!key_size)
+                       if (FREESPACE(p)) {
+                               move_bytes = MIN(FREESPACE(p), val_size);
+                               off = OFFSET(p) - move_bytes;
+                               p[n] = off;
+                               memmove(cp + off, val_data, move_bytes);
+                               val_data += move_bytes;
+                               val_size -= move_bytes;
+                               p[n - 2] = FULL_KEY_DATA;
+                               FREESPACE(p) = FREESPACE(p) - move_bytes;
+                               OFFSET(p) = off;
+                       } else
+                               p[n - 2] = FULL_KEY;
+               p = (u_short *)bufp->page;
+               cp = bufp->page;
+               bufp->flags |= BUF_MOD;
+       }
+
+       /* Now move the data */
+       for (space = FREESPACE(p) - BIGOVERHEAD; val_size;
+           space = FREESPACE(p) - BIGOVERHEAD) {
+               move_bytes = MIN(space, val_size);
+               /*
+                * Here's the hack to make sure that if the data ends on the
+                * same page as the key ends, FREESPACE is at least one.
+                */
+               if (space == val_size && val_size == val->size)
+                       move_bytes--;
+               off = OFFSET(p) - move_bytes;
+               memmove(cp + off, val_data, move_bytes);
+               val_size -= move_bytes;
+               val_data += move_bytes;
+               n = p[0];
+               p[++n] = off;
+               p[0] = ++n;
+               FREESPACE(p) = off - PAGE_META(n);
+               OFFSET(p) = off;
+               if (val_size) {
+                       p[n] = FULL_KEY;
+                       bufp = __add_ovflpage(hashp, bufp);
+                       if (!bufp)
+                               return (-1);
+                       cp = bufp->page;
+                       p = (u_short *)cp;
+               } else
+                       p[n] = FULL_KEY_DATA;
+               bufp->flags |= BUF_MOD;
+       }
+       return (0);
+}
+
+/*
+ * Called when bufp's page  contains a partial key (index should be 1)
+ *
+ * All pages in the big key/data pair except bufp are freed.  We cannot
+ * free bufp because the page pointing to it is lost and we can't get rid
+ * of its pointer.
+ *
+ * Returns:
+ * 0 => OK
+ *-1 => ERROR
+ */
+extern int
+__big_delete(hashp, bufp)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+{
+       register BUFHEAD *last_bfp, *rbufp;
+       u_short *bp, pageno;
+       int key_done, n;
+
+       rbufp = bufp;
+       last_bfp = NULL;
+       bp = (u_short *)bufp->page;
+       pageno = 0;
+       key_done = 0;
+
+       while (!key_done || (bp[2] != FULL_KEY_DATA)) {
+               if (bp[2] == FULL_KEY || bp[2] == FULL_KEY_DATA)
+                       key_done = 1;
+
+               /*
+                * If there is freespace left on a FULL_KEY_DATA page, then
+                * the data is short and fits entirely on this page, and this
+                * is the last page.
+                */
+               if (bp[2] == FULL_KEY_DATA && FREESPACE(bp))
+                       break;
+               pageno = bp[bp[0] - 1];
+               rbufp->flags |= BUF_MOD;
+               rbufp = __get_buf(hashp, pageno, rbufp, 0);
+               if (last_bfp)
+                       __free_ovflpage(hashp, last_bfp);
+               last_bfp = rbufp;
+               if (!rbufp)
+                       return (-1);            /* Error. */
+               bp = (u_short *)rbufp->page;
+       }
+
+       /*
+        * If we get here then rbufp points to the last page of the big
+        * key/data pair.  Bufp points to the first one -- it should now be
+        * empty pointing to the next page after this pair.  Can't free it
+        * because we don't have the page pointing to it.
+        */
+
+       /* This is information from the last page of the pair. */
+       n = bp[0];
+       pageno = bp[n - 1];
+
+       /* Now, bp is the first page of the pair. */
+       bp = (u_short *)bufp->page;
+       if (n > 2) {
+               /* There is an overflow page. */
+               bp[1] = pageno;
+               bp[2] = OVFLPAGE;
+               bufp->ovfl = rbufp->ovfl;
+       } else
+               /* This is the last page. */
+               bufp->ovfl = NULL;
+       n -= 2;
+       bp[0] = n;
+       FREESPACE(bp) = hashp->BSIZE - PAGE_META(n);
+       OFFSET(bp) = hashp->BSIZE - 1;
+
+       bufp->flags |= BUF_MOD;
+       if (rbufp)
+               __free_ovflpage(hashp, rbufp);
+       if (last_bfp != rbufp)
+               __free_ovflpage(hashp, last_bfp);
+
+       hashp->NKEYS--;
+       return (0);
+}
+/*
+ * Returns:
+ *  0 = key not found
+ * -1 = get next overflow page
+ * -2 means key not found and this is big key/data
+ * -3 error
+ */
+extern int
+__find_bigpair(hashp, bufp, ndx, key, size)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       int ndx;
+       char *key;
+       int size;
+{
+       register u_short *bp;
+       register char *p;
+       int ksize;
+       u_short bytes;
+       char *kkey;
+
+       bp = (u_short *)bufp->page;
+       p = bufp->page;
+       ksize = size;
+       kkey = key;
+
+       for (bytes = hashp->BSIZE - bp[ndx];
+           bytes <= size && bp[ndx + 1] == PARTIAL_KEY;
+           bytes = hashp->BSIZE - bp[ndx]) {
+               if (memcmp(p + bp[ndx], kkey, bytes))
+                       return (-2);
+               kkey += bytes;
+               ksize -= bytes;
+               bufp = __get_buf(hashp, bp[ndx + 2], bufp, 0);
+               if (!bufp)
+                       return (-3);
+               p = bufp->page;
+               bp = (u_short *)p;
+               ndx = 1;
+       }
+
+       if (bytes != ksize || memcmp(p + bp[ndx], kkey, bytes)) {
+#ifdef HASH_STATISTICS
+               ++hash_collisions;
+#endif
+               return (-2);
+       } else
+               return (ndx);
+}
+
+/*
+ * Given the buffer pointer of the first overflow page of a big pair,
+ * find the end of the big pair
+ *
+ * This will set bpp to the buffer header of the last page of the big pair.
+ * It will return the pageno of the overflow page following the last page
+ * of the pair; 0 if there isn't any (i.e. big pair is the last key in the
+ * bucket)
+ */
+extern u_short
+__find_last_page(hashp, bpp)
+       HTAB *hashp;
+       BUFHEAD **bpp;
+{
+       BUFHEAD *bufp;
+       u_short *bp, pageno;
+       int n;
+
+       bufp = *bpp;
+       bp = (u_short *)bufp->page;
+       for (;;) {
+               n = bp[0];
+
+               /*
+                * This is the last page if: the tag is FULL_KEY_DATA and
+                * either only 2 entries OVFLPAGE marker is explicit there
+                * is freespace on the page.
+                */
+               if (bp[2] == FULL_KEY_DATA &&
+                   ((n == 2) || (bp[n] == OVFLPAGE) || (FREESPACE(bp))))
+                       break;
+
+               pageno = bp[n - 1];
+               bufp = __get_buf(hashp, pageno, bufp, 0);
+               if (!bufp)
+                       return (0);     /* Need to indicate an error! */
+               bp = (u_short *)bufp->page;
+       }
+
+       *bpp = bufp;
+       if (bp[0] > 2)
+               return (bp[3]);
+       else
+               return (0);
+}
+
+/*
+ * Return the data for the key/data pair that begins on this page at this
+ * index (index should always be 1).
+ */
+extern int
+__big_return(hashp, bufp, ndx, val, set_current)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       int ndx;
+       DBT *val;
+       int set_current;
+{
+       BUFHEAD *save_p;
+       u_short *bp, len, off, save_addr;
+       char *tp;
+
+       bp = (u_short *)bufp->page;
+       while (bp[ndx + 1] == PARTIAL_KEY) {
+               bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+               if (!bufp)
+                       return (-1);
+               bp = (u_short *)bufp->page;
+               ndx = 1;
+       }
+
+       if (bp[ndx + 1] == FULL_KEY) {
+               bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+               if (!bufp)
+                       return (-1);
+               bp = (u_short *)bufp->page;
+               save_p = bufp;
+               save_addr = save_p->addr;
+               off = bp[1];
+               len = 0;
+       } else
+               if (!FREESPACE(bp)) {
+                       /*
+                        * This is a hack.  We can't distinguish between
+                        * FULL_KEY_DATA that contains complete data or
+                        * incomplete data, so we require that if the data
+                        * is complete, there is at least 1 byte of free
+                        * space left.
+                        */
+                       off = bp[bp[0]];
+                       len = bp[1] - off;
+                       save_p = bufp;
+                       save_addr = bufp->addr;
+                       bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+                       if (!bufp)
+                               return (-1);
+                       bp = (u_short *)bufp->page;
+               } else {
+                       /* The data is all on one page. */
+                       tp = (char *)bp;
+                       off = bp[bp[0]];
+                       val->data = (u_char *)tp + off;
+                       val->size = bp[1] - off;
+                       if (set_current) {
+                               if (bp[0] == 2) {       /* No more buckets in
+                                                        * chain */
+                                       hashp->cpage = NULL;
+                                       hashp->cbucket++;
+                                       hashp->cndx = 1;
+                               } else {
+                                       hashp->cpage = __get_buf(hashp,
+                                           bp[bp[0] - 1], bufp, 0);
+                                       if (!hashp->cpage)
+                                               return (-1);
+                                       hashp->cndx = 1;
+                                       if (!((u_short *)
+                                           hashp->cpage->page)[0]) {
+                                               hashp->cbucket++;
+                                               hashp->cpage = NULL;
+                                       }
+                               }
+                       }
+                       return (0);
+               }
+
+       val->size = collect_data(hashp, bufp, (int)len, set_current);
+       if (val->size == -1)
+               return (-1);
+       if (save_p->addr != save_addr) {
+               /* We are pretty short on buffers. */
+               errno = EINVAL;                 /* OUT OF BUFFERS */
+               return (-1);
+       }
+       memmove(hashp->tmp_buf, (save_p->page) + off, len);
+       val->data = (u_char *)hashp->tmp_buf;
+       return (0);
+}
+/*
+ * Count how big the total datasize is by recursing through the pages.  Then
+ * allocate a buffer and copy the data as you recurse up.
+ */
+static int
+collect_data(hashp, bufp, len, set)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       int len, set;
+{
+       register u_short *bp;
+       register char *p;
+       BUFHEAD *xbp;
+       u_short save_addr;
+       int mylen, totlen;
+
+       p = bufp->page;
+       bp = (u_short *)p;
+       mylen = hashp->BSIZE - bp[1];
+       save_addr = bufp->addr;
+
+       if (bp[2] == FULL_KEY_DATA) {           /* End of Data */
+               totlen = len + mylen;
+               if (hashp->tmp_buf)
+                       free(hashp->tmp_buf);
+               if ((hashp->tmp_buf = (char *)malloc(totlen)) == NULL)
+                       return (-1);
+               if (set) {
+                       hashp->cndx = 1;
+                       if (bp[0] == 2) {       /* No more buckets in chain */
+                               hashp->cpage = NULL;
+                               hashp->cbucket++;
+                       } else {
+                               hashp->cpage =
+                                   __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+                               if (!hashp->cpage)
+                                       return (-1);
+                               else if (!((u_short *)hashp->cpage->page)[0]) {
+                                       hashp->cbucket++;
+                                       hashp->cpage = NULL;
+                               }
+                       }
+               }
+       } else {
+               xbp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+               if (!xbp || ((totlen =
+                   collect_data(hashp, xbp, len + mylen, set)) < 1))
+                       return (-1);
+       }
+       if (bufp->addr != save_addr) {
+               errno = EINVAL;                 /* Out of buffers. */
+               return (-1);
+       }
+       memmove(&hashp->tmp_buf[len], (bufp->page) + bp[1], mylen);
+       return (totlen);
+}
+
+/*
+ * Fill in the key and data for this big pair.
+ */
+extern int
+__big_keydata(hashp, bufp, key, val, set)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       DBT *key, *val;
+       int set;
+{
+       key->size = collect_key(hashp, bufp, 0, val, set);
+       if (key->size == -1)
+               return (-1);
+       key->data = (u_char *)hashp->tmp_key;
+       return (0);
+}
+
+/*
+ * Count how big the total key size is by recursing through the pages.  Then
+ * collect the data, allocate a buffer and copy the key as you recurse up.
+ */
+static int
+collect_key(hashp, bufp, len, val, set)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       int len;
+       DBT *val;
+       int set;
+{
+       BUFHEAD *xbp;
+       char *p;
+       int mylen, totlen;
+       u_short *bp, save_addr;
+
+       p = bufp->page;
+       bp = (u_short *)p;
+       mylen = hashp->BSIZE - bp[1];
+
+       save_addr = bufp->addr;
+       totlen = len + mylen;
+       if (bp[2] == FULL_KEY || bp[2] == FULL_KEY_DATA) {    /* End of Key. */
+               if (hashp->tmp_key != NULL)
+                       free(hashp->tmp_key);
+               if ((hashp->tmp_key = (char *)malloc(totlen)) == NULL)
+                       return (-1);
+               if (__big_return(hashp, bufp, 1, val, set))
+                       return (-1);
+       } else {
+               xbp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+               if (!xbp || ((totlen =
+                   collect_key(hashp, xbp, totlen, val, set)) < 1))
+                       return (-1);
+       }
+       if (bufp->addr != save_addr) {
+               errno = EINVAL;         /* MIS -- OUT OF BUFFERS */
+               return (-1);
+       }
+       memmove(&hashp->tmp_key[len], (bufp->page) + bp[1], mylen);
+       return (totlen);
+}
+
+/*
+ * Returns:
+ *  0 => OK
+ * -1 => error
+ */
+extern int
+__big_split(hashp, op, np, big_keyp, addr, obucket, ret)
+       HTAB *hashp;
+       BUFHEAD *op;    /* Pointer to where to put keys that go in old bucket */
+       BUFHEAD *np;    /* Pointer to new bucket page */
+                       /* Pointer to first page containing the big key/data */
+       BUFHEAD *big_keyp;
+       int addr;       /* Address of big_keyp */
+       u_int   obucket;/* Old Bucket */
+       SPLIT_RETURN *ret;
+{
+       register BUFHEAD *tmpp;
+       register u_short *tp;
+       BUFHEAD *bp;
+       DBT key, val;
+       u_int change;
+       u_short free_space, n, off;
+
+       bp = big_keyp;
+
+       /* Now figure out where the big key/data goes */
+       if (__big_keydata(hashp, big_keyp, &key, &val, 0))
+               return (-1);
+       change = (__call_hash(hashp, key.data, key.size) != obucket);
+
+       if (ret->next_addr = __find_last_page(hashp, &big_keyp)) {
+               if (!(ret->nextp =
+                   __get_buf(hashp, ret->next_addr, big_keyp, 0)))
+                       return (-1);;
+       } else
+               ret->nextp = NULL;
+
+       /* Now make one of np/op point to the big key/data pair */
+#ifdef DEBUG
+       assert(np->ovfl == NULL);
+#endif
+       if (change)
+               tmpp = np;
+       else
+               tmpp = op;
+
+       tmpp->flags |= BUF_MOD;
+#ifdef DEBUG1
+       (void)fprintf(stderr,
+           "BIG_SPLIT: %d->ovfl was %d is now %d\n", tmpp->addr,
+           (tmpp->ovfl ? tmpp->ovfl->addr : 0), (bp ? bp->addr : 0));
+#endif
+       tmpp->ovfl = bp;        /* one of op/np point to big_keyp */
+       tp = (u_short *)tmpp->page;
+#ifdef DEBUG
+       assert(FREESPACE(tp) >= OVFLSIZE);
+#endif
+       n = tp[0];
+       off = OFFSET(tp);
+       free_space = FREESPACE(tp);
+       tp[++n] = (u_short)addr;
+       tp[++n] = OVFLPAGE;
+       tp[0] = n;
+       OFFSET(tp) = off;
+       FREESPACE(tp) = free_space - OVFLSIZE;
+
+       /*
+        * Finally, set the new and old return values. BIG_KEYP contains a
+        * pointer to the last page of the big key_data pair. Make sure that
+        * big_keyp has no following page (2 elements) or create an empty
+        * following page.
+        */
+
+       ret->newp = np;
+       ret->oldp = op;
+
+       tp = (u_short *)big_keyp->page;
+       big_keyp->flags |= BUF_MOD;
+       if (tp[0] > 2) {
+               /*
+                * There may be either one or two offsets on this page.  If
+                * there is one, then the overflow page is linked on normally
+                * and tp[4] is OVFLPAGE.  If there are two, tp[4] contains
+                * the second offset and needs to get stuffed in after the
+                * next overflow page is added.
+                */
+               n = tp[4];
+               free_space = FREESPACE(tp);
+               off = OFFSET(tp);
+               tp[0] -= 2;
+               FREESPACE(tp) = free_space + OVFLSIZE;
+               OFFSET(tp) = off;
+               tmpp = __add_ovflpage(hashp, big_keyp);
+               if (!tmpp)
+                       return (-1);
+               tp[4] = n;
+       } else
+               tmpp = big_keyp;
+
+       if (change)
+               ret->newp = tmpp;
+       else
+               ret->oldp = tmpp;
+       return (0);
+}
diff --git a/db.subproj/hash.subproj/hash_buf.c b/db.subproj/hash.subproj/hash_buf.c
new file mode 100644 (file)
index 0000000..9d89a8b
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * PACKAGE: hash
+ *
+ * DESCRIPTION:
+ *     Contains buffer management
+ *
+ * ROUTINES:
+ * External
+ *     __buf_init
+ *     __get_buf
+ *     __buf_free
+ *     __reclaim_buf
+ * Internal
+ *     newbuf
+ */
+
+#include <sys/param.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef DEBUG
+#include <assert.h>
+#endif
+
+#include <db.h>
+#include "hash.h"
+#include "page.h"
+#include "extern.h"
+
+static BUFHEAD *newbuf __P((HTAB *, u_int, BUFHEAD *));
+
+/* Unlink B from its place in the lru */
+#define BUF_REMOVE(B) { \
+       (B)->prev->next = (B)->next; \
+       (B)->next->prev = (B)->prev; \
+}
+
+/* Insert B after P */
+#define BUF_INSERT(B, P) { \
+       (B)->next = (P)->next; \
+       (B)->prev = (P); \
+       (P)->next = (B); \
+       (B)->next->prev = (B); \
+}
+
+#define        MRU     hashp->bufhead.next
+#define        LRU     hashp->bufhead.prev
+
+#define MRU_INSERT(B)  BUF_INSERT((B), &hashp->bufhead)
+#define LRU_INSERT(B)  BUF_INSERT((B), LRU)
+
+/*
+ * We are looking for a buffer with address "addr".  If prev_bp is NULL, then
+ * address is a bucket index.  If prev_bp is not NULL, then it points to the
+ * page previous to an overflow page that we are trying to find.
+ *
+ * CAVEAT:  The buffer header accessed via prev_bp's ovfl field may no longer
+ * be valid.  Therefore, you must always verify that its address matches the
+ * address you are seeking.
+ */
+extern BUFHEAD *
+__get_buf(hashp, addr, prev_bp, newpage)
+       HTAB *hashp;
+       u_int addr;
+       BUFHEAD *prev_bp;
+       int newpage;    /* If prev_bp set, indicates a new overflow page. */
+{
+       register BUFHEAD *bp;
+       register u_int is_disk_mask;
+       register int is_disk, segment_ndx;
+       SEGMENT segp;
+
+       is_disk = 0;
+       is_disk_mask = 0;
+       if (prev_bp) {
+               bp = prev_bp->ovfl;
+               if (!bp || (bp->addr != addr))
+                       bp = NULL;
+               if (!newpage)
+                       is_disk = BUF_DISK;
+       } else {
+               /* Grab buffer out of directory */
+               segment_ndx = addr & (hashp->SGSIZE - 1);
+
+               /* valid segment ensured by __call_hash() */
+               segp = hashp->dir[addr >> hashp->SSHIFT];
+#ifdef DEBUG
+               assert(segp != NULL);
+#endif
+               bp = PTROF(segp[segment_ndx]);
+               is_disk_mask = ISDISK(segp[segment_ndx]);
+               is_disk = is_disk_mask || !hashp->new_file;
+       }
+
+       if (!bp) {
+               bp = newbuf(hashp, addr, prev_bp);
+               if (!bp ||
+                   __get_page(hashp, bp->page, addr, !prev_bp, is_disk, 0))
+                       return (NULL);
+               if (!prev_bp)
+                       segp[segment_ndx] =
+                           (BUFHEAD *)((u_int)bp | is_disk_mask);
+       } else {
+               BUF_REMOVE(bp);
+               MRU_INSERT(bp);
+       }
+       return (bp);
+}
+
+/*
+ * We need a buffer for this page. Either allocate one, or evict a resident
+ * one (if we have as many buffers as we're allowed) and put this one in.
+ *
+ * If newbuf finds an error (returning NULL), it also sets errno.
+ */
+static BUFHEAD *
+newbuf(hashp, addr, prev_bp)
+       HTAB *hashp;
+       u_int addr;
+       BUFHEAD *prev_bp;
+{
+       register BUFHEAD *bp;           /* The buffer we're going to use */
+       register BUFHEAD *xbp;          /* Temp pointer */
+       register BUFHEAD *next_xbp;
+       SEGMENT segp;
+       int segment_ndx;
+       u_short oaddr, *shortp;
+
+       oaddr = 0;
+       bp = LRU;
+       /*
+        * If LRU buffer is pinned, the buffer pool is too small. We need to
+        * allocate more buffers.
+        */
+       if (hashp->nbufs || (bp->flags & BUF_PIN)) {
+               /* Allocate a new one */
+               if ((bp = (BUFHEAD *)malloc(sizeof(BUFHEAD))) == NULL)
+                       return (NULL);
+               if ((bp->page = (char *)malloc(hashp->BSIZE)) == NULL) {
+                       free(bp);
+                       return (NULL);
+               }
+               if (hashp->nbufs)
+                       hashp->nbufs--;
+       } else {
+               /* Kick someone out */
+               BUF_REMOVE(bp);
+               /*
+                * If this is an overflow page with addr 0, it's already been
+                * flushed back in an overflow chain and initialized.
+                */
+               if ((bp->addr != 0) || (bp->flags & BUF_BUCKET)) {
+                       /*
+                        * Set oaddr before __put_page so that you get it
+                        * before bytes are swapped.
+                        */
+                       shortp = (u_short *)bp->page;
+                       if (shortp[0])
+                               oaddr = shortp[shortp[0] - 1];
+                       if ((bp->flags & BUF_MOD) && __put_page(hashp, bp->page,
+                           bp->addr, (int)IS_BUCKET(bp->flags), 0))
+                               return (NULL);
+                       /*
+                        * Update the pointer to this page (i.e. invalidate it).
+                        *
+                        * If this is a new file (i.e. we created it at open
+                        * time), make sure that we mark pages which have been
+                        * written to disk so we retrieve them from disk later,
+                        * rather than allocating new pages.
+                        */
+                       if (IS_BUCKET(bp->flags)) {
+                               segment_ndx = bp->addr & (hashp->SGSIZE - 1);
+                               segp = hashp->dir[bp->addr >> hashp->SSHIFT];
+#ifdef DEBUG
+                               assert(segp != NULL);
+#endif
+
+                               if (hashp->new_file &&
+                                   ((bp->flags & BUF_MOD) ||
+                                   ISDISK(segp[segment_ndx])))
+                                       segp[segment_ndx] = (BUFHEAD *)BUF_DISK;
+                               else
+                                       segp[segment_ndx] = NULL;
+                       }
+                       /*
+                        * Since overflow pages can only be access by means of
+                        * their bucket, free overflow pages associated with
+                        * this bucket.
+                        */
+                       for (xbp = bp; xbp->ovfl;) {
+                               next_xbp = xbp->ovfl;
+                               xbp->ovfl = 0;
+                               xbp = next_xbp;
+
+                               /* Check that ovfl pointer is up date. */
+                               if (IS_BUCKET(xbp->flags) ||
+                                   (oaddr != xbp->addr))
+                                       break;
+
+                               shortp = (u_short *)xbp->page;
+                               if (shortp[0])
+                                       /* set before __put_page */
+                                       oaddr = shortp[shortp[0] - 1];
+                               if ((xbp->flags & BUF_MOD) && __put_page(hashp,
+                                   xbp->page, xbp->addr, 0, 0))
+                                       return (NULL);
+                               xbp->addr = 0;
+                               xbp->flags = 0;
+                               BUF_REMOVE(xbp);
+                               LRU_INSERT(xbp);
+                       }
+               }
+       }
+
+       /* Now assign this buffer */
+       bp->addr = addr;
+#ifdef DEBUG1
+       (void)fprintf(stderr, "NEWBUF1: %d->ovfl was %d is now %d\n",
+           bp->addr, (bp->ovfl ? bp->ovfl->addr : 0), 0);
+#endif
+       bp->ovfl = NULL;
+       if (prev_bp) {
+               /*
+                * If prev_bp is set, this is an overflow page, hook it in to
+                * the buffer overflow links.
+                */
+#ifdef DEBUG1
+               (void)fprintf(stderr, "NEWBUF2: %d->ovfl was %d is now %d\n",
+                   prev_bp->addr, (prev_bp->ovfl ? bp->ovfl->addr : 0),
+                   (bp ? bp->addr : 0));
+#endif
+               prev_bp->ovfl = bp;
+               bp->flags = 0;
+       } else
+               bp->flags = BUF_BUCKET;
+       MRU_INSERT(bp);
+       return (bp);
+}
+
+extern void
+__buf_init(hashp, nbytes)
+       HTAB *hashp;
+       int nbytes;
+{
+       BUFHEAD *bfp;
+       int npages;
+
+       bfp = &(hashp->bufhead);
+       npages = (nbytes + hashp->BSIZE - 1) >> hashp->BSHIFT;
+       npages = MAX(npages, MIN_BUFFERS);
+
+       hashp->nbufs = npages;
+       bfp->next = bfp;
+       bfp->prev = bfp;
+       /*
+        * This space is calloc'd so these are already null.
+        *
+        * bfp->ovfl = NULL;
+        * bfp->flags = 0;
+        * bfp->page = NULL;
+        * bfp->addr = 0;
+        */
+}
+
+extern int
+__buf_free(hashp, do_free, to_disk)
+       HTAB *hashp;
+       int do_free, to_disk;
+{
+       BUFHEAD *bp;
+
+       /* Need to make sure that buffer manager has been initialized */
+       if (!LRU)
+               return (0);
+       for (bp = LRU; bp != &hashp->bufhead;) {
+               /* Check that the buffer is valid */
+               if (bp->addr || IS_BUCKET(bp->flags)) {
+                       if (to_disk && (bp->flags & BUF_MOD) &&
+                           __put_page(hashp, bp->page,
+                           bp->addr, IS_BUCKET(bp->flags), 0))
+                               return (-1);
+               }
+               /* Check if we are freeing stuff */
+               if (do_free) {
+                       if (bp->page)
+                               free(bp->page);
+                       BUF_REMOVE(bp);
+                       free(bp);
+                       bp = LRU;
+               } else
+                       bp = bp->prev;
+       }
+       return (0);
+}
+
+extern void
+__reclaim_buf(hashp, bp)
+       HTAB *hashp;
+       BUFHEAD *bp;
+{
+       bp->ovfl = 0;
+       bp->addr = 0;
+       bp->flags = 0;
+       BUF_REMOVE(bp);
+       LRU_INSERT(bp);
+}
diff --git a/db.subproj/hash.subproj/hash_func.c b/db.subproj/hash.subproj/hash_func.c
new file mode 100644 (file)
index 0000000..d33b481
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <db.h>
+#include "hash.h"
+#include "page.h"
+#include "extern.h"
+
+static u_int32_t hash1 __P((const void *, size_t));
+static u_int32_t hash2 __P((const void *, size_t));
+static u_int32_t hash3 __P((const void *, size_t));
+static u_int32_t hash4 __P((const void *, size_t));
+
+/* Global default hash function */
+u_int32_t (*__default_hash) __P((const void *, size_t)) = hash4;
+
+/*
+ * HASH FUNCTIONS
+ *
+ * Assume that we've already split the bucket to which this key hashes,
+ * calculate that bucket, and check that in fact we did already split it.
+ *
+ * This came from ejb's hsearch.
+ */
+
+#define PRIME1         37
+#define PRIME2         1048583
+
+static u_int32_t
+hash1(keyarg, len)
+       const void *keyarg;
+       register size_t len;
+{
+       register const u_char *key;
+       register u_int32_t h;
+
+       /* Convert string to integer */
+       for (key = keyarg, h = 0; len--;)
+               h = h * PRIME1 ^ (*key++ - ' ');
+       h %= PRIME2;
+       return (h);
+}
+
+/*
+ * Phong's linear congruential hash
+ */
+#define dcharhash(h, c)        ((h) = 0x63c63cd9*(h) + 0x9c39c33d + (c))
+
+static u_int32_t
+hash2(keyarg, len)
+       const void *keyarg;
+       size_t len;
+{
+       register const u_char *e, *key;
+       register u_int32_t h;
+       register u_char c;
+
+       key = keyarg;
+       e = key + len;
+       for (h = 0; key != e;) {
+               c = *key++;
+               if (!c && key > e)
+                       break;
+               dcharhash(h, c);
+       }
+       return (h);
+}
+
+/*
+ * This is INCREDIBLY ugly, but fast.  We break the string up into 8 byte
+ * units.  On the first time through the loop we get the "leftover bytes"
+ * (strlen % 8).  On every other iteration, we perform 8 HASHC's so we handle
+ * all 8 bytes.  Essentially, this saves us 7 cmp & branch instructions.  If
+ * this routine is heavily used enough, it's worth the ugly coding.
+ *
+ * OZ's original sdbm hash
+ */
+static u_int32_t
+hash3(keyarg, len)
+       const void *keyarg;
+       register size_t len;
+{
+       register const u_char *key;
+       register size_t loop;
+       register u_int32_t h;
+
+#define HASHC   h = *key++ + 65599 * h
+
+       h = 0;
+       key = keyarg;
+       if (len > 0) {
+               loop = (len + 8 - 1) >> 3;
+
+               switch (len & (8 - 1)) {
+               case 0:
+                       do {
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 7:
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 6:
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 5:
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 4:
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 3:
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 2:
+                               HASHC;
+                               /* FALLTHROUGH */
+               case 1:
+                               HASHC;
+                       } while (--loop);
+               }
+       }
+       return (h);
+}
+
+/* Hash function from Chris Torek. */
+static u_int32_t
+hash4(keyarg, len)
+       const void *keyarg;
+       register size_t len;
+{
+       register const u_char *key;
+       register size_t loop;
+       register u_int32_t h;
+
+#define HASH4a   h = (h << 5) - h + *key++;
+#define HASH4b   h = (h << 5) + h + *key++;
+#define HASH4 HASH4b
+
+       h = 0;
+       key = keyarg;
+       if (len > 0) {
+               loop = (len + 8 - 1) >> 3;
+
+               switch (len & (8 - 1)) {
+               case 0:
+                       do {
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 7:
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 6:
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 5:
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 4:
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 3:
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 2:
+                               HASH4;
+                               /* FALLTHROUGH */
+               case 1:
+                               HASH4;
+                       } while (--loop);
+               }
+       }
+       return (h);
+}
diff --git a/db.subproj/hash.subproj/hash_log2.c b/db.subproj/hash.subproj/hash_log2.c
new file mode 100644 (file)
index 0000000..0f7f002
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+u_int
+__log2(num)
+       u_int num;
+{
+       register u_int i, limit;
+
+       limit = 1;
+       for (i = 0; limit < num; limit = limit << 1, i++);
+       return (i);
+}
diff --git a/db.subproj/hash.subproj/hash_page.c b/db.subproj/hash.subproj/hash_page.c
new file mode 100644 (file)
index 0000000..aa7b36f
--- /dev/null
@@ -0,0 +1,962 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * PACKAGE:  hashing
+ *
+ * DESCRIPTION:
+ *     Page manipulation for hashing package.
+ *
+ * ROUTINES:
+ *
+ * External
+ *     __get_page
+ *     __add_ovflpage
+ * Internal
+ *     overflow_page
+ *     open_temp
+ */
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#ifdef DEBUG
+#include <assert.h>
+#endif
+
+#include <db.h>
+#include "hash.h"
+#include "page.h"
+#include "extern.h"
+
+static u_long  *fetch_bitmap __P((HTAB *, int));
+static u_long   first_free __P((u_long));
+static int      open_temp __P((HTAB *));
+static u_short  overflow_page __P((HTAB *));
+static void     putpair __P((char *, const DBT *, const DBT *));
+static void     squeeze_key __P((u_short *, const DBT *, const DBT *));
+static int      ugly_split
+                   __P((HTAB *, u_int, BUFHEAD *, BUFHEAD *, int, int));
+
+#define        PAGE_INIT(P) { \
+       ((u_short *)(P))[0] = 0; \
+       ((u_short *)(P))[1] = hashp->BSIZE - 3 * sizeof(u_short); \
+       ((u_short *)(P))[2] = hashp->BSIZE; \
+}
+
+/*
+ * This is called AFTER we have verified that there is room on the page for
+ * the pair (PAIRFITS has returned true) so we go right ahead and start moving
+ * stuff on.
+ */
+static void
+putpair(p, key, val)
+       char *p;
+       const DBT *key, *val;
+{
+       register u_short *bp, n, off;
+
+       bp = (u_short *)p;
+
+       /* Enter the key first. */
+       n = bp[0];
+
+       off = OFFSET(bp) - key->size;
+       memmove(p + off, key->data, key->size);
+       bp[++n] = off;
+
+       /* Now the data. */
+       off -= val->size;
+       memmove(p + off, val->data, val->size);
+       bp[++n] = off;
+
+       /* Adjust page info. */
+       bp[0] = n;
+       bp[n + 1] = off - ((n + 3) * sizeof(u_short));
+       bp[n + 2] = off;
+}
+
+/*
+ * Returns:
+ *      0 OK
+ *     -1 error
+ */
+extern int
+__delpair(hashp, bufp, ndx)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       register int ndx;
+{
+       register u_short *bp, newoff;
+       register int n;
+       u_short pairlen;
+
+       bp = (u_short *)bufp->page;
+       n = bp[0];
+
+       if (bp[ndx + 1] < REAL_KEY)
+               return (__big_delete(hashp, bufp));
+       if (ndx != 1)
+               newoff = bp[ndx - 1];
+       else
+               newoff = hashp->BSIZE;
+       pairlen = newoff - bp[ndx + 1];
+
+       if (ndx != (n - 1)) {
+               /* Hard Case -- need to shuffle keys */
+               register int i;
+               register char *src = bufp->page + (int)OFFSET(bp);
+               register char *dst = src + (int)pairlen;
+               memmove(dst, src, bp[ndx + 1] - OFFSET(bp));
+
+               /* Now adjust the pointers */
+               for (i = ndx + 2; i <= n; i += 2) {
+                       if (bp[i + 1] == OVFLPAGE) {
+                               bp[i - 2] = bp[i];
+                               bp[i - 1] = bp[i + 1];
+                       } else {
+                               bp[i - 2] = bp[i] + pairlen;
+                               bp[i - 1] = bp[i + 1] + pairlen;
+                       }
+               }
+       }
+       /* Finally adjust the page data */
+       bp[n] = OFFSET(bp) + pairlen;
+       bp[n - 1] = bp[n + 1] + pairlen + 2 * sizeof(u_short);
+       bp[0] = n - 2;
+       hashp->NKEYS--;
+
+       bufp->flags |= BUF_MOD;
+       return (0);
+}
+/*
+ * Returns:
+ *      0 ==> OK
+ *     -1 ==> Error
+ */
+extern int
+__split_page(hashp, obucket, nbucket)
+       HTAB *hashp;
+       u_int obucket, nbucket;
+{
+       register BUFHEAD *new_bufp, *old_bufp;
+       register u_short *ino;
+       register char *np;
+       DBT key, val;
+       int n, ndx, retval;
+       u_short copyto, diff, off, moved;
+       char *op;
+
+       copyto = (u_short)hashp->BSIZE;
+       off = (u_short)hashp->BSIZE;
+       old_bufp = __get_buf(hashp, obucket, NULL, 0);
+       if (old_bufp == NULL)
+               return (-1);
+       new_bufp = __get_buf(hashp, nbucket, NULL, 0);
+       if (new_bufp == NULL)
+               return (-1);
+
+       old_bufp->flags |= (BUF_MOD | BUF_PIN);
+       new_bufp->flags |= (BUF_MOD | BUF_PIN);
+
+       ino = (u_short *)(op = old_bufp->page);
+       np = new_bufp->page;
+
+       moved = 0;
+
+       for (n = 1, ndx = 1; n < ino[0]; n += 2) {
+               if (ino[n + 1] < REAL_KEY) {
+                       retval = ugly_split(hashp, obucket, old_bufp, new_bufp,
+                           (int)copyto, (int)moved);
+                       old_bufp->flags &= ~BUF_PIN;
+                       new_bufp->flags &= ~BUF_PIN;
+                       return (retval);
+
+               }
+               key.data = (u_char *)op + ino[n];
+               key.size = off - ino[n];
+
+               if (__call_hash(hashp, key.data, key.size) == obucket) {
+                       /* Don't switch page */
+                       diff = copyto - off;
+                       if (diff) {
+                               copyto = ino[n + 1] + diff;
+                               memmove(op + copyto, op + ino[n + 1],
+                                   off - ino[n + 1]);
+                               ino[ndx] = copyto + ino[n] - ino[n + 1];
+                               ino[ndx + 1] = copyto;
+                       } else
+                               copyto = ino[n + 1];
+                       ndx += 2;
+               } else {
+                       /* Switch page */
+                       val.data = (u_char *)op + ino[n + 1];
+                       val.size = ino[n] - ino[n + 1];
+                       putpair(np, &key, &val);
+                       moved += 2;
+               }
+
+               off = ino[n + 1];
+       }
+
+       /* Now clean up the page */
+       ino[0] -= moved;
+       FREESPACE(ino) = copyto - sizeof(u_short) * (ino[0] + 3);
+       OFFSET(ino) = copyto;
+
+#ifdef DEBUG3
+       (void)fprintf(stderr, "split %d/%d\n",
+           ((u_short *)np)[0] / 2,
+           ((u_short *)op)[0] / 2);
+#endif
+       /* unpin both pages */
+       old_bufp->flags &= ~BUF_PIN;
+       new_bufp->flags &= ~BUF_PIN;
+       return (0);
+}
+
+/*
+ * Called when we encounter an overflow or big key/data page during split
+ * handling.  This is special cased since we have to begin checking whether
+ * the key/data pairs fit on their respective pages and because we may need
+ * overflow pages for both the old and new pages.
+ *
+ * The first page might be a page with regular key/data pairs in which case
+ * we have a regular overflow condition and just need to go on to the next
+ * page or it might be a big key/data pair in which case we need to fix the
+ * big key/data pair.
+ *
+ * Returns:
+ *      0 ==> success
+ *     -1 ==> failure
+ */
+static int
+ugly_split(hashp, obucket, old_bufp, new_bufp, copyto, moved)
+       HTAB *hashp;
+       u_int obucket;  /* Same as __split_page. */
+       BUFHEAD *old_bufp, *new_bufp;
+       int copyto;     /* First byte on page which contains key/data values. */
+       int moved;      /* Number of pairs moved to new page. */
+{
+       register BUFHEAD *bufp; /* Buffer header for ino */
+       register u_short *ino;  /* Page keys come off of */
+       register u_short *np;   /* New page */
+       register u_short *op;   /* Page keys go on to if they aren't moving */
+
+       BUFHEAD *last_bfp;      /* Last buf header OVFL needing to be freed */
+       DBT key, val;
+       SPLIT_RETURN ret;
+       u_short n, off, ov_addr, scopyto;
+       char *cino;             /* Character value of ino */
+
+       bufp = old_bufp;
+       ino = (u_short *)old_bufp->page;
+       np = (u_short *)new_bufp->page;
+       op = (u_short *)old_bufp->page;
+       last_bfp = NULL;
+       scopyto = (u_short)copyto;      /* ANSI */
+
+       n = ino[0] - 1;
+       while (n < ino[0]) {
+               if (ino[2] < REAL_KEY && ino[2] != OVFLPAGE) {
+                       if (__big_split(hashp, old_bufp,
+                           new_bufp, bufp, bufp->addr, obucket, &ret))
+                               return (-1);
+                       old_bufp = ret.oldp;
+                       if (!old_bufp)
+                               return (-1);
+                       op = (u_short *)old_bufp->page;
+                       new_bufp = ret.newp;
+                       if (!new_bufp)
+                               return (-1);
+                       np = (u_short *)new_bufp->page;
+                       bufp = ret.nextp;
+                       if (!bufp)
+                               return (0);
+                       cino = (char *)bufp->page;
+                       ino = (u_short *)cino;
+                       last_bfp = ret.nextp;
+               } else if (ino[n + 1] == OVFLPAGE) {
+                       ov_addr = ino[n];
+                       /*
+                        * Fix up the old page -- the extra 2 are the fields
+                        * which contained the overflow information.
+                        */
+                       ino[0] -= (moved + 2);
+                       FREESPACE(ino) =
+                           scopyto - sizeof(u_short) * (ino[0] + 3);
+                       OFFSET(ino) = scopyto;
+
+                       bufp = __get_buf(hashp, ov_addr, bufp, 0);
+                       if (!bufp)
+                               return (-1);
+
+                       ino = (u_short *)bufp->page;
+                       n = 1;
+                       scopyto = hashp->BSIZE;
+                       moved = 0;
+
+                       if (last_bfp)
+                               __free_ovflpage(hashp, last_bfp);
+                       last_bfp = bufp;
+               }
+               /* Move regular sized pairs of there are any */
+               off = hashp->BSIZE;
+               for (n = 1; (n < ino[0]) && (ino[n + 1] >= REAL_KEY); n += 2) {
+                       cino = (char *)ino;
+                       key.data = (u_char *)cino + ino[n];
+                       key.size = off - ino[n];
+                       val.data = (u_char *)cino + ino[n + 1];
+                       val.size = ino[n] - ino[n + 1];
+                       off = ino[n + 1];
+
+                       if (__call_hash(hashp, key.data, key.size) == obucket) {
+                               /* Keep on old page */
+                               if (PAIRFITS(op, (&key), (&val)))
+                                       putpair((char *)op, &key, &val);
+                               else {
+                                       old_bufp =
+                                           __add_ovflpage(hashp, old_bufp);
+                                       if (!old_bufp)
+                                               return (-1);
+                                       op = (u_short *)old_bufp->page;
+                                       putpair((char *)op, &key, &val);
+                               }
+                               old_bufp->flags |= BUF_MOD;
+                       } else {
+                               /* Move to new page */
+                               if (PAIRFITS(np, (&key), (&val)))
+                                       putpair((char *)np, &key, &val);
+                               else {
+                                       new_bufp =
+                                           __add_ovflpage(hashp, new_bufp);
+                                       if (!new_bufp)
+                                               return (-1);
+                                       np = (u_short *)new_bufp->page;
+                                       putpair((char *)np, &key, &val);
+                               }
+                               new_bufp->flags |= BUF_MOD;
+                       }
+               }
+       }
+       if (last_bfp)
+               __free_ovflpage(hashp, last_bfp);
+       return (0);
+}
+
+/*
+ * Add the given pair to the page
+ *
+ * Returns:
+ *     0 ==> OK
+ *     1 ==> failure
+ */
+extern int
+__addel(hashp, bufp, key, val)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+       const DBT *key, *val;
+{
+       register u_short *bp, *sop;
+       int do_expand;
+
+       bp = (u_short *)bufp->page;
+       do_expand = 0;
+       while (bp[0] && (bp[2] < REAL_KEY || bp[bp[0]] < REAL_KEY))
+               /* Exception case */
+               if (bp[2] == FULL_KEY_DATA && bp[0] == 2)
+                       /* This is the last page of a big key/data pair
+                          and we need to add another page */
+                       break;
+               else if (bp[2] < REAL_KEY && bp[bp[0]] != OVFLPAGE) {
+                       bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+                       if (!bufp)
+                               return (-1);
+                       bp = (u_short *)bufp->page;
+               } else
+                       /* Try to squeeze key on this page */
+                       if (FREESPACE(bp) > PAIRSIZE(key, val)) {
+                               squeeze_key(bp, key, val);
+                               return (0);
+                       } else {
+                               bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
+                               if (!bufp)
+                                       return (-1);
+                               bp = (u_short *)bufp->page;
+                       }
+
+       if (PAIRFITS(bp, key, val))
+               putpair(bufp->page, key, val);
+       else {
+               do_expand = 1;
+               bufp = __add_ovflpage(hashp, bufp);
+               if (!bufp)
+                       return (-1);
+               sop = (u_short *)bufp->page;
+
+               if (PAIRFITS(sop, key, val))
+                       putpair((char *)sop, key, val);
+               else
+                       if (__big_insert(hashp, bufp, key, val))
+                               return (-1);
+       }
+       bufp->flags |= BUF_MOD;
+       /*
+        * If the average number of keys per bucket exceeds the fill factor,
+        * expand the table.
+        */
+       hashp->NKEYS++;
+       if (do_expand ||
+           (hashp->NKEYS / (hashp->MAX_BUCKET + 1) > hashp->FFACTOR))
+               return (__expand_table(hashp));
+       return (0);
+}
+
+/*
+ *
+ * Returns:
+ *     pointer on success
+ *     NULL on error
+ */
+extern BUFHEAD *
+__add_ovflpage(hashp, bufp)
+       HTAB *hashp;
+       BUFHEAD *bufp;
+{
+       register u_short *sp;
+       u_short ndx, ovfl_num;
+#ifdef DEBUG1
+       int tmp1, tmp2;
+#endif
+       sp = (u_short *)bufp->page;
+
+       /* Check if we are dynamically determining the fill factor */
+       if (hashp->FFACTOR == DEF_FFACTOR) {
+               hashp->FFACTOR = sp[0] >> 1;
+               if (hashp->FFACTOR < MIN_FFACTOR)
+                       hashp->FFACTOR = MIN_FFACTOR;
+       }
+       bufp->flags |= BUF_MOD;
+       ovfl_num = overflow_page(hashp);
+#ifdef DEBUG1
+       tmp1 = bufp->addr;
+       tmp2 = bufp->ovfl ? bufp->ovfl->addr : 0;
+#endif
+       if (!ovfl_num || !(bufp->ovfl = __get_buf(hashp, ovfl_num, bufp, 1)))
+               return (NULL);
+       bufp->ovfl->flags |= BUF_MOD;
+#ifdef DEBUG1
+       (void)fprintf(stderr, "ADDOVFLPAGE: %d->ovfl was %d is now %d\n",
+           tmp1, tmp2, bufp->ovfl->addr);
+#endif
+       ndx = sp[0];
+       /*
+        * Since a pair is allocated on a page only if there's room to add
+        * an overflow page, we know that the OVFL information will fit on
+        * the page.
+        */
+       sp[ndx + 4] = OFFSET(sp);
+       sp[ndx + 3] = FREESPACE(sp) - OVFLSIZE;
+       sp[ndx + 1] = ovfl_num;
+       sp[ndx + 2] = OVFLPAGE;
+       sp[0] = ndx + 2;
+#ifdef HASH_STATISTICS
+       hash_overflows++;
+#endif
+       return (bufp->ovfl);
+}
+
+/*
+ * Returns:
+ *      0 indicates SUCCESS
+ *     -1 indicates FAILURE
+ */
+extern int
+__get_page(hashp, p, bucket, is_bucket, is_disk, is_bitmap)
+       HTAB *hashp;
+       char *p;
+       u_int bucket;
+       int is_bucket, is_disk, is_bitmap;
+{
+       register int fd, page, size;
+       int rsize;
+       u_short *bp;
+
+       fd = hashp->fp;
+       size = hashp->BSIZE;
+
+       if ((fd == -1) || !is_disk) {
+               PAGE_INIT(p);
+               return (0);
+       }
+       if (is_bucket)
+               page = BUCKET_TO_PAGE(bucket);
+       else
+               page = OADDR_TO_PAGE(bucket);
+       if ((lseek(fd, (off_t)page << hashp->BSHIFT, SEEK_SET) == -1) ||
+           ((rsize = read(fd, p, size)) == -1))
+               return (-1);
+       bp = (u_short *)p;
+       if (!rsize)
+               bp[0] = 0;      /* We hit the EOF, so initialize a new page */
+       else
+               if (rsize != size) {
+                       errno = EFTYPE;
+                       return (-1);
+               }
+       if (!is_bitmap && !bp[0]) {
+               PAGE_INIT(p);
+       } else
+               if (hashp->LORDER != BYTE_ORDER) {
+                       register int i, max;
+
+                       if (is_bitmap) {
+                               max = hashp->BSIZE >> 2; /* divide by 4 */
+                               for (i = 0; i < max; i++)
+                                       M_32_SWAP(((long *)p)[i]);
+                       } else {
+                               M_16_SWAP(bp[0]);
+                               max = bp[0] + 2;
+                               for (i = 1; i <= max; i++)
+                                       M_16_SWAP(bp[i]);
+                       }
+               }
+       return (0);
+}
+
+/*
+ * Write page p to disk
+ *
+ * Returns:
+ *      0 ==> OK
+ *     -1 ==>failure
+ */
+extern int
+__put_page(hashp, p, bucket, is_bucket, is_bitmap)
+       HTAB *hashp;
+       char *p;
+       u_int bucket;
+       int is_bucket, is_bitmap;
+{
+       register int fd, page, size;
+       int wsize;
+
+       size = hashp->BSIZE;
+       if ((hashp->fp == -1) && open_temp(hashp))
+               return (-1);
+       fd = hashp->fp;
+
+       if (hashp->LORDER != BYTE_ORDER) {
+               register int i;
+               register int max;
+
+               if (is_bitmap) {
+                       max = hashp->BSIZE >> 2;        /* divide by 4 */
+                       for (i = 0; i < max; i++)
+                               M_32_SWAP(((long *)p)[i]);
+               } else {
+                       max = ((u_short *)p)[0] + 2;
+                       for (i = 0; i <= max; i++)
+                               M_16_SWAP(((u_short *)p)[i]);
+               }
+       }
+       if (is_bucket)
+               page = BUCKET_TO_PAGE(bucket);
+       else
+               page = OADDR_TO_PAGE(bucket);
+       if ((lseek(fd, (off_t)page << hashp->BSHIFT, SEEK_SET) == -1) ||
+           ((wsize = write(fd, p, size)) == -1))
+               /* Errno is set */
+               return (-1);
+       if (wsize != size) {
+               errno = EFTYPE;
+               return (-1);
+       }
+       return (0);
+}
+
+#define BYTE_MASK      ((1 << INT_BYTE_SHIFT) -1)
+/*
+ * Initialize a new bitmap page.  Bitmap pages are left in memory
+ * once they are read in.
+ */
+extern int
+__init_bitmap(hashp, pnum, nbits, ndx)
+       HTAB *hashp;
+       int pnum, nbits, ndx;
+{
+       u_long *ip;
+       int clearbytes, clearints;
+
+       if ((ip = (u_long *)malloc(hashp->BSIZE)) == NULL)
+               return (1);
+       hashp->nmaps++;
+       clearints = ((nbits - 1) >> INT_BYTE_SHIFT) + 1;
+       clearbytes = clearints << INT_TO_BYTE;
+       (void)memset((char *)ip, 0, clearbytes);
+       (void)memset(((char *)ip) + clearbytes, 0xFF,
+           hashp->BSIZE - clearbytes);
+       ip[clearints - 1] = ALL_SET << (nbits & BYTE_MASK);
+       SETBIT(ip, 0);
+       hashp->BITMAPS[ndx] = (u_short)pnum;
+       hashp->mapp[ndx] = ip;
+       return (0);
+}
+
+static u_long
+first_free(map)
+       u_long map;
+{
+       register u_long i, mask;
+
+       mask = 0x1;
+       for (i = 0; i < BITS_PER_MAP; i++) {
+               if (!(mask & map))
+                       return (i);
+               mask = mask << 1;
+       }
+       return (i);
+}
+
+static u_short
+overflow_page(hashp)
+       HTAB *hashp;
+{
+       register u_long *freep;
+       register int max_free, offset, splitnum;
+       u_short addr;
+       int bit, first_page, free_bit, free_page, i, in_use_bits, j;
+#ifdef DEBUG2
+       int tmp1, tmp2;
+#endif
+       splitnum = hashp->OVFL_POINT;
+       max_free = hashp->SPARES[splitnum];
+
+       free_page = (max_free - 1) >> (hashp->BSHIFT + BYTE_SHIFT);
+       free_bit = (max_free - 1) & ((hashp->BSIZE << BYTE_SHIFT) - 1);
+
+       /* Look through all the free maps to find the first free block */
+       first_page = hashp->LAST_FREED >>(hashp->BSHIFT + BYTE_SHIFT);
+       for ( i = first_page; i <= free_page; i++ ) {
+               if (!(freep = (u_long *)hashp->mapp[i]) &&
+                   !(freep = fetch_bitmap(hashp, i)))
+                       return (NULL);
+               if (i == free_page)
+                       in_use_bits = free_bit;
+               else
+                       in_use_bits = (hashp->BSIZE << BYTE_SHIFT) - 1;
+               
+               if (i == first_page) {
+                       bit = hashp->LAST_FREED &
+                           ((hashp->BSIZE << BYTE_SHIFT) - 1);
+                       j = bit / BITS_PER_MAP;
+                       bit = bit & ~(BITS_PER_MAP - 1);
+               } else {
+                       bit = 0;
+                       j = 0;
+               }
+               for (; bit <= in_use_bits; j++, bit += BITS_PER_MAP)
+                       if (freep[j] != ALL_SET)
+                               goto found;
+       }
+
+       /* No Free Page Found */
+       hashp->LAST_FREED = hashp->SPARES[splitnum];
+       hashp->SPARES[splitnum]++;
+       offset = hashp->SPARES[splitnum] -
+           (splitnum ? hashp->SPARES[splitnum - 1] : 0);
+
+#define        OVMSG   "HASH: Out of overflow pages.  Increase page size\n"
+       if (offset > SPLITMASK) {
+               if (++splitnum >= NCACHED) {
+                       (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1);
+                       return (NULL);
+               }
+               hashp->OVFL_POINT = splitnum;
+               hashp->SPARES[splitnum] = hashp->SPARES[splitnum-1];
+               hashp->SPARES[splitnum-1]--;
+               offset = 1;
+       }
+
+       /* Check if we need to allocate a new bitmap page */
+       if (free_bit == (hashp->BSIZE << BYTE_SHIFT) - 1) {
+               free_page++;
+               if (free_page >= NCACHED) {
+                       (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1);
+                       return (NULL);
+               }
+               /*
+                * This is tricky.  The 1 indicates that you want the new page
+                * allocated with 1 clear bit.  Actually, you are going to
+                * allocate 2 pages from this map.  The first is going to be
+                * the map page, the second is the overflow page we were
+                * looking for.  The init_bitmap routine automatically, sets
+                * the first bit of itself to indicate that the bitmap itself
+                * is in use.  We would explicitly set the second bit, but
+                * don't have to if we tell init_bitmap not to leave it clear
+                * in the first place.
+                */
+               if (__init_bitmap(hashp, (int)OADDR_OF(splitnum, offset),
+                   1, free_page))
+                       return (NULL);
+               hashp->SPARES[splitnum]++;
+#ifdef DEBUG2
+               free_bit = 2;
+#endif
+               offset++;
+               if (offset > SPLITMASK) {
+                       if (++splitnum >= NCACHED) {
+                               (void)write(STDERR_FILENO, OVMSG,
+                                   sizeof(OVMSG) - 1);
+                               return (NULL);
+                       }
+                       hashp->OVFL_POINT = splitnum;
+                       hashp->SPARES[splitnum] = hashp->SPARES[splitnum-1];
+                       hashp->SPARES[splitnum-1]--;
+                       offset = 0;
+               }
+       } else {
+               /*
+                * Free_bit addresses the last used bit.  Bump it to address
+                * the first available bit.
+                */
+               free_bit++;
+               SETBIT(freep, free_bit);
+       }
+
+       /* Calculate address of the new overflow page */
+       addr = OADDR_OF(splitnum, offset);
+#ifdef DEBUG2
+       (void)fprintf(stderr, "OVERFLOW_PAGE: ADDR: %d BIT: %d PAGE %d\n",
+           addr, free_bit, free_page);
+#endif
+       return (addr);
+
+found:
+       bit = bit + first_free(freep[j]);
+       SETBIT(freep, bit);
+#ifdef DEBUG2
+       tmp1 = bit;
+       tmp2 = i;
+#endif
+       /*
+        * Bits are addressed starting with 0, but overflow pages are addressed
+        * beginning at 1. Bit is a bit addressnumber, so we need to increment
+        * it to convert it to a page number.
+        */
+       bit = 1 + bit + (i * (hashp->BSIZE << BYTE_SHIFT));
+       if (bit >= hashp->LAST_FREED)
+               hashp->LAST_FREED = bit - 1;
+
+       /* Calculate the split number for this page */
+       for (i = 0; (i < splitnum) && (bit > hashp->SPARES[i]); i++);
+       offset = (i ? bit - hashp->SPARES[i - 1] : bit);
+       if (offset >= SPLITMASK)
+               return (NULL);  /* Out of overflow pages */
+       addr = OADDR_OF(i, offset);
+#ifdef DEBUG2
+       (void)fprintf(stderr, "OVERFLOW_PAGE: ADDR: %d BIT: %d PAGE %d\n",
+           addr, tmp1, tmp2);
+#endif
+
+       /* Allocate and return the overflow page */
+       return (addr);
+}
+
+/*
+ * Mark this overflow page as free.
+ */
+extern void
+__free_ovflpage(hashp, obufp)
+       HTAB *hashp;
+       BUFHEAD *obufp;
+{
+       register u_short addr;
+       u_long *freep;
+       int bit_address, free_page, free_bit;
+       u_short ndx;
+
+       addr = obufp->addr;
+#ifdef DEBUG1
+       (void)fprintf(stderr, "Freeing %d\n", addr);
+#endif
+       ndx = (((u_short)addr) >> SPLITSHIFT);
+       bit_address =
+           (ndx ? hashp->SPARES[ndx - 1] : 0) + (addr & SPLITMASK) - 1;
+        if (bit_address < hashp->LAST_FREED)
+               hashp->LAST_FREED = bit_address;
+       free_page = (bit_address >> (hashp->BSHIFT + BYTE_SHIFT));
+       free_bit = bit_address & ((hashp->BSIZE << BYTE_SHIFT) - 1);
+
+       if (!(freep = hashp->mapp[free_page]))
+               freep = fetch_bitmap(hashp, free_page);
+#ifdef DEBUG
+       /*
+        * This had better never happen.  It means we tried to read a bitmap
+        * that has already had overflow pages allocated off it, and we
+        * failed to read it from the file.
+        */
+       if (!freep)
+               assert(0);
+#endif
+       CLRBIT(freep, free_bit);
+#ifdef DEBUG2
+       (void)fprintf(stderr, "FREE_OVFLPAGE: ADDR: %d BIT: %d PAGE %d\n",
+           obufp->addr, free_bit, free_page);
+#endif
+       __reclaim_buf(hashp, obufp);
+}
+
+/*
+ * Returns:
+ *      0 success
+ *     -1 failure
+ */
+static int
+open_temp(hashp)
+       HTAB *hashp;
+{
+       sigset_t set, oset;
+       static char namestr[] = "_hashXXXXXX";
+
+       /* Block signals; make sure file goes away at process exit. */
+       (void)sigfillset(&set);
+       (void)sigprocmask(SIG_BLOCK, &set, &oset);
+       if ((hashp->fp = mkstemp(namestr)) != -1) {
+               (void)unlink(namestr);
+               (void)fcntl(hashp->fp, F_SETFD, 1);
+       }
+       (void)sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL);
+       return (hashp->fp != -1 ? 0 : -1);
+}
+
+/*
+ * We have to know that the key will fit, but the last entry on the page is
+ * an overflow pair, so we need to shift things.
+ */
+static void
+squeeze_key(sp, key, val)
+       u_short *sp;
+       const DBT *key, *val;
+{
+       register char *p;
+       u_short free_space, n, off, pageno;
+
+       p = (char *)sp;
+       n = sp[0];
+       free_space = FREESPACE(sp);
+       off = OFFSET(sp);
+
+       pageno = sp[n - 1];
+       off -= key->size;
+       sp[n - 1] = off;
+       memmove(p + off, key->data, key->size);
+       off -= val->size;
+       sp[n] = off;
+       memmove(p + off, val->data, val->size);
+       sp[0] = n + 2;
+       sp[n + 1] = pageno;
+       sp[n + 2] = OVFLPAGE;
+       FREESPACE(sp) = free_space - PAIRSIZE(key, val);
+       OFFSET(sp) = off;
+}
+
+static u_long *
+fetch_bitmap(hashp, ndx)
+       HTAB *hashp;
+       int ndx;
+{
+       if (ndx >= hashp->nmaps)
+               return (NULL);
+       if ((hashp->mapp[ndx] = (u_long *)malloc(hashp->BSIZE)) == NULL)
+               return (NULL);
+       if (__get_page(hashp,
+           (char *)hashp->mapp[ndx], hashp->BITMAPS[ndx], 0, 1, 1)) {
+               free(hashp->mapp[ndx]);
+               return (NULL);
+       }
+       return (hashp->mapp[ndx]);
+}
+
+#ifdef DEBUG4
+int
+print_chain(addr)
+       int addr;
+{
+       BUFHEAD *bufp;
+       short *bp, oaddr;
+
+       (void)fprintf(stderr, "%d ", addr);
+       bufp = __get_buf(hashp, addr, NULL, 0);
+       bp = (short *)bufp->page;
+       while (bp[0] && ((bp[bp[0]] == OVFLPAGE) ||
+               ((bp[0] > 2) && bp[2] < REAL_KEY))) {
+               oaddr = bp[bp[0] - 1];
+               (void)fprintf(stderr, "%d ", (int)oaddr);
+               bufp = __get_buf(hashp, (int)oaddr, bufp, 0);
+               bp = (short *)bufp->page;
+       }
+       (void)fprintf(stderr, "\n");
+}
+#endif
diff --git a/db.subproj/hash.subproj/hsearch.c b/db.subproj/hash.subproj/hsearch.c
new file mode 100644 (file)
index 0000000..83ed150
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <fcntl.h>
+#include <string.h>
+
+#include <db.h>
+#include "search.h"
+
+static DB *dbp = NULL;
+static ENTRY retval;
+
+extern int
+hcreate(nel)
+       u_int nel;
+{
+       HASHINFO info;
+
+       info.nelem = nel;
+       info.bsize = 256;
+       info.ffactor = 8;
+       info.cachesize = NULL;
+       info.hash = NULL;
+       info.lorder = 0;
+       dbp = (DB *)__hash_open(NULL, O_CREAT | O_RDWR, 0600, &info, 0);
+       return ((int)dbp);
+}
+
+extern ENTRY *
+hsearch(item, action)
+       ENTRY item;
+       ACTION action;
+{
+       DBT key, val;
+       int status;
+
+       if (!dbp)
+               return (NULL);
+       key.data = (u_char *)item.key;
+       key.size = strlen(item.key) + 1;
+
+       if (action == ENTER) {
+               val.data = (u_char *)item.data;
+               val.size = strlen(item.data) + 1;
+               status = (dbp->put)(dbp, &key, &val, R_NOOVERWRITE);
+               if (status)
+                       return (NULL);
+       } else {
+               /* FIND */
+               status = (dbp->get)(dbp, &key, &val, 0);
+               if (status)
+                       return (NULL);
+               else
+                       item.data = (char *)val.data;
+       }
+       retval.key = item.key;
+       retval.data = item.data;
+       return (&retval);
+}
+
+extern void
+hdestroy()
+{
+       if (dbp) {
+               (void)(dbp->close)(dbp);
+               dbp = NULL;
+       }
+}
diff --git a/db.subproj/hash.subproj/ndbm.c b/db.subproj/hash.subproj/ndbm.c
new file mode 100644 (file)
index 0000000..ca7125b
--- /dev/null
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * This package provides a dbm compatible interface to the new hashing
+ * package described in db(3).
+ */
+
+#include <sys/param.h>
+
+#include <ndbm.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "hash.h"
+
+/*
+ * Returns:
+ *     *DBM on success
+ *      NULL on failure
+ */
+extern DBM *
+dbm_open(file, flags, mode)
+       const char *file;
+       int flags, mode;
+{
+       HASHINFO info;
+       char path[MAXPATHLEN];
+
+       info.bsize = 4096;
+       info.ffactor = 40;
+       info.nelem = 1;
+       info.cachesize = NULL;
+       info.hash = NULL;
+       info.lorder = 0;
+       (void)strcpy(path, file);
+       (void)strcat(path, DBM_SUFFIX);
+       return ((DBM *)__hash_open(path, flags, mode, &info, 0));
+}
+
+extern void
+dbm_close(db)
+       DBM *db;
+{
+       (void)(db->close)(db);
+}
+
+/*
+ * Returns:
+ *     DATUM on success
+ *     NULL on failure
+ */
+extern datum
+dbm_fetch(db, key)
+       DBM *db;
+       datum key;
+{
+       datum retval;
+       int status;
+
+       status = (db->get)(db, (DBT *)&key, (DBT *)&retval, 0);
+       if (status) {
+               retval.dptr = NULL;
+               retval.dsize = 0;
+       }
+       return (retval);
+}
+
+/*
+ * Returns:
+ *     DATUM on success
+ *     NULL on failure
+ */
+extern datum
+dbm_firstkey(db)
+       DBM *db;
+{
+       int status;
+       datum retdata, retkey;
+
+       status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST);
+       if (status)
+               retkey.dptr = NULL;
+       return (retkey);
+}
+
+/*
+ * Returns:
+ *     DATUM on success
+ *     NULL on failure
+ */
+extern datum
+dbm_nextkey(db)
+       DBM *db;
+{
+       int status;
+       datum retdata, retkey;
+
+       status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT);
+       if (status)
+               retkey.dptr = NULL;
+       return (retkey);
+}
+/*
+ * Returns:
+ *      0 on success
+ *     <0 failure
+ */
+extern int
+dbm_delete(db, key)
+       DBM *db;
+       datum key;
+{
+       int status;
+
+       status = (db->del)(db, (DBT *)&key, 0);
+       if (status)
+               return (-1);
+       else
+               return (0);
+}
+
+/*
+ * Returns:
+ *      0 on success
+ *     <0 failure
+ *      1 if DBM_INSERT and entry exists
+ */
+extern int
+dbm_store(db, key, content, flags)
+       DBM *db;
+       datum key, content;
+       int flags;
+{
+       return ((db->put)(db, (DBT *)&key, (DBT *)&content,
+           (flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
+}
+
+extern int
+dbm_error(db)
+       DBM *db;
+{
+       HTAB *hp;
+
+       hp = (HTAB *)db->internal;
+       return (hp->error);
+}
+
+extern int
+dbm_clearerr(db)
+       DBM *db;
+{
+       HTAB *hp;
+
+       hp = (HTAB *)db->internal;
+       hp->error = 0;
+       return (0);
+}
+
+extern int
+dbm_dirfno(db)
+       DBM *db;
+{
+       return(((HTAB *)db->internal)->fp);
+}
diff --git a/db.subproj/hash.subproj/page.h b/db.subproj/hash.subproj/page.h
new file mode 100644 (file)
index 0000000..a74c50b
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Definitions for hashing page file format.
+ */
+
+/*
+ * routines dealing with a data page
+ *
+ * page format:
+ *     +------------------------------+
+ * p   | n | keyoff | datoff | keyoff |
+ *     +------------+--------+--------+
+ *     | datoff | free  |  ptr  | --> |
+ *     +--------+---------------------+
+ *     |        F R E E A R E A       |
+ *     +--------------+---------------+
+ *     |  <---- - - - | data          |
+ *     +--------+-----+----+----------+
+ *     |  key   | data     | key      |
+ *     +--------+----------+----------+
+ *
+ * Pointer to the free space is always:  p[p[0] + 2]
+ * Amount of free space on the page is:  p[p[0] + 1]
+ */
+
+/*
+ * How many bytes required for this pair?
+ *     2 shorts in the table at the top of the page + room for the
+ *     key and room for the data
+ *
+ * We prohibit entering a pair on a page unless there is also room to append
+ * an overflow page. The reason for this it that you can get in a situation
+ * where a single key/data pair fits on a page, but you can't append an
+ * overflow page and later you'd have to split the key/data and handle like
+ * a big pair.
+ * You might as well do this up front.
+ */
+
+#define        PAIRSIZE(K,D)   (2*sizeof(u_short) + (K)->size + (D)->size)
+#define BIGOVERHEAD    (4*sizeof(u_short))
+#define KEYSIZE(K)     (4*sizeof(u_short) + (K)->size);
+#define OVFLSIZE       (2*sizeof(u_short))
+#define FREESPACE(P)   ((P)[(P)[0]+1])
+#define        OFFSET(P)       ((P)[(P)[0]+2])
+#define PAIRFITS(P,K,D) \
+       (((P)[2] >= REAL_KEY) && \
+           (PAIRSIZE((K),(D)) + OVFLSIZE) <= FREESPACE((P)))
+#define PAGE_META(N)   (((N)+3) * sizeof(u_short))
+
+typedef struct {
+       BUFHEAD *newp;
+       BUFHEAD *oldp;
+       BUFHEAD *nextp;
+       u_short next_addr;
+}       SPLIT_RETURN;
diff --git a/db.subproj/hash.subproj/search.h b/db.subproj/hash.subproj/search.h
new file mode 100644 (file)
index 0000000..3196b8f
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Margo Seltzer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Backward compatibility to hsearch interface. */
+typedef struct entry {
+       char *key;
+       char *data;
+} ENTRY;
+
+typedef enum {
+       FIND, ENTER
+} ACTION;
+
+int     hcreate __P((unsigned int));
+void    hdestroy __P((void));
+ENTRY  *hsearch __P((ENTRY, ACTION));
diff --git a/db.subproj/mpool.subproj/Makefile b/db.subproj/mpool.subproj/Makefile
new file mode 100644 (file)
index 0000000..a127134
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = mpool
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = mpool.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/db.subproj/mpool.subproj/Makefile.postamble b/db.subproj/mpool.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/db.subproj/mpool.subproj/Makefile.preamble b/db.subproj/mpool.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/db.subproj/mpool.subproj/PB.project b/db.subproj/mpool.subproj/PB.project
new file mode 100644 (file)
index 0000000..06d52a0
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (mpool.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = mpool; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/db.subproj/mpool.subproj/mpool.c b/db.subproj/mpool.subproj/mpool.c
new file mode 100644 (file)
index 0000000..d3e9e2e
--- /dev/null
@@ -0,0 +1,552 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <db.h>
+#define        __MPOOLINTERFACE_PRIVATE
+#include "mpool.h"
+
+static BKT *mpool_bkt __P((MPOOL *));
+static BKT *mpool_look __P((MPOOL *, pgno_t));
+static int  mpool_write __P((MPOOL *, BKT *));
+#ifdef DEBUG
+static void __mpoolerr __P((const char *fmt, ...));
+#endif
+
+/*
+ * MPOOL_OPEN -- initialize a memory pool.
+ *
+ * Parameters:
+ *     key:            Shared buffer key.
+ *     fd:             File descriptor.
+ *     pagesize:       File page size.
+ *     maxcache:       Max number of cached pages.
+ *
+ * Returns:
+ *     MPOOL pointer, NULL on error.
+ */
+MPOOL *
+mpool_open(key, fd, pagesize, maxcache)
+       DBT *key;
+       int fd;
+       pgno_t pagesize, maxcache;
+{
+       struct stat sb;
+       MPOOL *mp;
+       int entry;
+
+       if (fstat(fd, &sb))
+               return (NULL);
+       /* XXX
+        * We should only set st_size to 0 for pipes -- 4.4BSD has the fix so
+        * that stat(2) returns true for ISSOCK on pipes.  Until then, this is
+        * fairly close.
+        */
+       if (!S_ISREG(sb.st_mode)) {
+               errno = ESPIPE;
+               return (NULL);
+       }
+
+       if ((mp = (MPOOL *)malloc(sizeof(MPOOL))) == NULL)
+               return (NULL);
+       mp->free.cnext = mp->free.cprev = (BKT *)&mp->free;
+       mp->lru.cnext = mp->lru.cprev = (BKT *)&mp->lru;
+       for (entry = 0; entry < HASHSIZE; ++entry)
+               mp->hashtable[entry].hnext = mp->hashtable[entry].hprev = 
+                   mp->hashtable[entry].cnext = mp->hashtable[entry].cprev =
+                   (BKT *)&mp->hashtable[entry];
+       mp->curcache = 0;
+       mp->maxcache = maxcache;
+       mp->pagesize = pagesize;
+       mp->npages = sb.st_size / pagesize;
+       mp->fd = fd;
+       mp->pgcookie = NULL;
+       mp->pgin = mp->pgout = NULL;
+
+#ifdef STATISTICS
+       mp->cachehit = mp->cachemiss = mp->pagealloc = mp->pageflush = 
+           mp->pageget = mp->pagenew = mp->pageput = mp->pageread = 
+           mp->pagewrite = 0;
+#endif
+       return (mp);
+}
+
+/*
+ * MPOOL_FILTER -- initialize input/output filters.
+ *
+ * Parameters:
+ *     pgin:           Page in conversion routine.
+ *     pgout:          Page out conversion routine.
+ *     pgcookie:       Cookie for page in/out routines.
+ */
+void
+mpool_filter(mp, pgin, pgout, pgcookie)
+       MPOOL *mp;
+       void (*pgin) __P((void *, pgno_t, void *));
+       void (*pgout) __P((void *, pgno_t, void *));
+       void *pgcookie;
+{
+       mp->pgin = pgin;
+       mp->pgout = pgout;
+       mp->pgcookie = pgcookie;
+}
+       
+/*
+ * MPOOL_NEW -- get a new page
+ *
+ * Parameters:
+ *     mp:             mpool cookie
+ *     pgnoadddr:      place to store new page number
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+void *
+mpool_new(mp, pgnoaddr)
+       MPOOL *mp;
+       pgno_t *pgnoaddr;
+{
+       BKT *b;
+       BKTHDR *hp;
+
+#ifdef STATISTICS
+       ++mp->pagenew;
+#endif
+       /*
+        * Get a BKT from the cache.  Assign a new page number, attach it to
+        * the hash and lru chains and return.
+        */
+       if ((b = mpool_bkt(mp)) == NULL)
+               return (NULL);
+       *pgnoaddr = b->pgno = mp->npages++;
+       b->flags = MPOOL_PINNED;
+       inshash(b, b->pgno);
+       inschain(b, &mp->lru);
+       return (b->page);
+}
+
+/*
+ * MPOOL_GET -- get a page from the pool
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *     pgno:   page number
+ *     flags:  not used
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+void *
+mpool_get(mp, pgno, flags)
+       MPOOL *mp;
+       pgno_t pgno;
+       u_int flags;            /* XXX not used? */
+{
+       BKT *b;
+       BKTHDR *hp;
+       off_t off;
+       int nr;
+
+       /*
+        * If asking for a specific page that is already in the cache, find
+        * it and return it.
+        */
+       if (b = mpool_look(mp, pgno)) {
+#ifdef STATISTICS
+               ++mp->pageget;
+#endif
+#ifdef DEBUG
+               if (b->flags & MPOOL_PINNED)
+                       __mpoolerr("mpool_get: page %d already pinned",
+                           b->pgno);
+#endif
+               rmchain(b);
+               inschain(b, &mp->lru);
+               b->flags |= MPOOL_PINNED;
+               return (b->page);
+       }
+
+       /* Not allowed to retrieve a non-existent page. */
+       if (pgno >= mp->npages) {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       /* Get a page from the cache. */
+       if ((b = mpool_bkt(mp)) == NULL)
+               return (NULL);
+       b->pgno = pgno;
+       b->flags = MPOOL_PINNED;
+
+#ifdef STATISTICS
+       ++mp->pageread;
+#endif
+       /* Read in the contents. */
+       off = mp->pagesize * pgno;
+       if (lseek(mp->fd, off, SEEK_SET) != off)
+               return (NULL);
+       if ((nr = read(mp->fd, b->page, mp->pagesize)) != mp->pagesize) {
+               if (nr >= 0)
+                       errno = EFTYPE;
+               return (NULL);
+       }
+       if (mp->pgin)
+               (mp->pgin)(mp->pgcookie, b->pgno, b->page);
+
+       inshash(b, b->pgno);
+       inschain(b, &mp->lru);
+#ifdef STATISTICS
+       ++mp->pageget;
+#endif
+       return (b->page);
+}
+
+/*
+ * MPOOL_PUT -- return a page to the pool
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *     page:   page pointer
+ *     pgno:   page number
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+mpool_put(mp, page, flags)
+       MPOOL *mp;
+       void *page;
+       u_int flags;
+{
+       BKT *baddr;
+#ifdef DEBUG
+       BKT *b;
+#endif
+
+#ifdef STATISTICS
+       ++mp->pageput;
+#endif
+       baddr = (BKT *)((char *)page - sizeof(BKT));
+#ifdef DEBUG
+       if (!(baddr->flags & MPOOL_PINNED))
+               __mpoolerr("mpool_put: page %d not pinned", b->pgno);
+       for (b = mp->lru.cnext; b != (BKT *)&mp->lru; b = b->cnext) {
+               if (b == (BKT *)&mp->lru)
+                       __mpoolerr("mpool_put: %0x: bad address", baddr);
+               if (b == baddr)
+                       break;
+       }
+#endif
+       baddr->flags &= ~MPOOL_PINNED;
+       baddr->flags |= flags & MPOOL_DIRTY;
+       return (RET_SUCCESS);
+}
+
+/*
+ * MPOOL_CLOSE -- close the buffer pool
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+mpool_close(mp)
+       MPOOL *mp;
+{
+       BKT *b, *next;
+
+       /* Free up any space allocated to the lru pages. */
+       for (b = mp->lru.cprev; b != (BKT *)&mp->lru; b = next) {
+               next = b->cprev;
+               free(b);
+       }
+       free(mp);
+       return (RET_SUCCESS);
+}
+
+/*
+ * MPOOL_SYNC -- sync the file to disk.
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+mpool_sync(mp)
+       MPOOL *mp;
+{
+       BKT *b;
+
+       for (b = mp->lru.cprev; b != (BKT *)&mp->lru; b = b->cprev)
+               if (b->flags & MPOOL_DIRTY && mpool_write(mp, b) == RET_ERROR)
+                       return (RET_ERROR);
+       return (fsync(mp->fd) ? RET_ERROR : RET_SUCCESS);
+}
+
+/*
+ * MPOOL_BKT -- get/create a BKT from the cache
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *
+ * Returns:
+ *     NULL on failure and a pointer to the BKT on success     
+ */
+static BKT *
+mpool_bkt(mp)
+       MPOOL *mp;
+{
+       BKT *b;
+
+       if (mp->curcache < mp->maxcache)
+               goto new;
+
+       /*
+        * If the cache is maxxed out, search the lru list for a buffer we
+        * can flush.  If we find one, write it if necessary and take it off
+        * any lists.  If we don't find anything we grow the cache anyway.
+        * The cache never shrinks.
+        */
+       for (b = mp->lru.cprev; b != (BKT *)&mp->lru; b = b->cprev)
+               if (!(b->flags & MPOOL_PINNED)) {
+                       if (b->flags & MPOOL_DIRTY &&
+                           mpool_write(mp, b) == RET_ERROR)
+                               return (NULL);
+                       rmhash(b);
+                       rmchain(b);
+#ifdef STATISTICS
+                       ++mp->pageflush;
+#endif
+#ifdef DEBUG
+                       {
+                               void *spage;
+                               spage = b->page;
+                               memset(b, 0xff, sizeof(BKT) + mp->pagesize);
+                               b->page = spage;
+                       }
+#endif
+                       return (b);
+               }
+
+new:   if ((b = (BKT *)malloc(sizeof(BKT) + mp->pagesize)) == NULL)
+               return (NULL);
+#ifdef STATISTICS
+       ++mp->pagealloc;
+#endif
+#ifdef DEBUG
+       memset(b, 0xff, sizeof(BKT) + mp->pagesize);
+#endif
+       b->page = (char *)b + sizeof(BKT);
+       ++mp->curcache;
+       return (b);
+}
+
+/*
+ * MPOOL_WRITE -- sync a page to disk
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+static int
+mpool_write(mp, b)
+       MPOOL *mp;
+       BKT *b;
+{
+       off_t off;
+
+       if (mp->pgout)
+               (mp->pgout)(mp->pgcookie, b->pgno, b->page);
+
+#ifdef STATISTICS
+       ++mp->pagewrite;
+#endif
+       off = mp->pagesize * b->pgno;
+       if (lseek(mp->fd, off, SEEK_SET) != off)
+               return (RET_ERROR);
+       if (write(mp->fd, b->page, mp->pagesize) != mp->pagesize)
+               return (RET_ERROR);
+       b->flags &= ~MPOOL_DIRTY;
+       return (RET_SUCCESS);
+}
+
+/*
+ * MPOOL_LOOK -- lookup a page
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ *     pgno:   page number
+ *
+ * Returns:
+ *     NULL on failure and a pointer to the BKT on success
+ */
+static BKT *
+mpool_look(mp, pgno)
+       MPOOL *mp;
+       pgno_t pgno;
+{
+       register BKT *b;
+       register BKTHDR *tb;
+
+       /* XXX
+        * If find the buffer, put it first on the hash chain so can
+        * find it again quickly.
+        */
+       tb = &mp->hashtable[HASHKEY(pgno)];
+       for (b = tb->hnext; b != (BKT *)tb; b = b->hnext)
+               if (b->pgno == pgno) {
+#ifdef STATISTICS
+                       ++mp->cachehit;
+#endif
+                       return (b);
+               }
+#ifdef STATISTICS
+       ++mp->cachemiss;
+#endif
+       return (NULL);
+}
+
+#ifdef STATISTICS
+/*
+ * MPOOL_STAT -- cache statistics
+ *
+ * Parameters:
+ *     mp:     mpool cookie
+ */
+void
+mpool_stat(mp)
+       MPOOL *mp;
+{
+       BKT *b;
+       int cnt;
+       char *sep;
+
+       (void)fprintf(stderr, "%lu pages in the file\n", mp->npages);
+       (void)fprintf(stderr,
+           "page size %lu, cacheing %lu pages of %lu page max cache\n",
+           mp->pagesize, mp->curcache, mp->maxcache);
+       (void)fprintf(stderr, "%lu page puts, %lu page gets, %lu page new\n",
+           mp->pageput, mp->pageget, mp->pagenew);
+       (void)fprintf(stderr, "%lu page allocs, %lu page flushes\n",
+           mp->pagealloc, mp->pageflush);
+       if (mp->cachehit + mp->cachemiss)
+               (void)fprintf(stderr,
+                   "%.0f%% cache hit rate (%lu hits, %lu misses)\n", 
+                   ((double)mp->cachehit / (mp->cachehit + mp->cachemiss))
+                   * 100, mp->cachehit, mp->cachemiss);
+       (void)fprintf(stderr, "%lu page reads, %lu page writes\n",
+           mp->pageread, mp->pagewrite);
+
+       sep = "";
+       cnt = 0;
+       for (b = mp->lru.cnext; b != (BKT *)&mp->lru; b = b->cnext) {
+               (void)fprintf(stderr, "%s%d", sep, b->pgno);
+               if (b->flags & MPOOL_DIRTY)
+                       (void)fprintf(stderr, "d");
+               if (b->flags & MPOOL_PINNED)
+                       (void)fprintf(stderr, "P");
+               if (++cnt == 10) {
+                       sep = "\n";
+                       cnt = 0;
+               } else
+                       sep = ", ";
+                       
+       }
+       (void)fprintf(stderr, "\n");
+}
+#endif
+
+#ifdef DEBUG
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+static void
+#if __STDC__
+__mpoolerr(const char *fmt, ...)
+#else
+__mpoolerr(fmt, va_alist)
+       char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       (void)vfprintf(stderr, fmt, ap);
+       va_end(ap);
+       (void)fprintf(stderr, "\n");
+       abort();
+       /* NOTREACHED */
+}
+#endif
diff --git a/db.subproj/recno.subproj/Makefile b/db.subproj/recno.subproj/Makefile
new file mode 100644 (file)
index 0000000..56520b7
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = recno
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = extern.h recno.h
+
+CFILES = rec_close.c rec_delete.c rec_get.c rec_open.c rec_put.c\
+         rec_search.c rec_seq.c rec_utils.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/db.subproj/recno.subproj/Makefile.postamble b/db.subproj/recno.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/db.subproj/recno.subproj/Makefile.preamble b/db.subproj/recno.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/db.subproj/recno.subproj/PB.project b/db.subproj/recno.subproj/PB.project
new file mode 100644 (file)
index 0000000..3a7b202
--- /dev/null
@@ -0,0 +1,32 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (extern.h, recno.h); 
+        OTHER_LINKED = (
+            rec_close.c, 
+            rec_delete.c, 
+            rec_get.c, 
+            rec_open.c, 
+            rec_put.c, 
+            rec_search.c, 
+            rec_seq.c, 
+            rec_utils.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = recno; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/db.subproj/recno.subproj/extern.h b/db.subproj/recno.subproj/extern.h
new file mode 100644 (file)
index 0000000..d903770
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "bt_extern.h"
+
+int     __rec_close __P((DB *));
+int     __rec_delete __P((const DB *, const DBT *, u_int));
+int     __rec_dleaf __P((BTREE *, PAGE *, indx_t));
+int     __rec_fd __P((const DB *));
+int     __rec_fmap __P((BTREE *, recno_t));
+int     __rec_fout __P((BTREE *));
+int     __rec_fpipe __P((BTREE *, recno_t));
+int     __rec_get __P((const DB *, const DBT *, DBT *, u_int));
+int     __rec_iput __P((BTREE *, recno_t, const DBT *, u_int));
+int     __rec_put __P((const DB *dbp, DBT *, const DBT *, u_int));
+int     __rec_ret __P((BTREE *, EPG *, recno_t, DBT *, DBT *));
+EPG    *__rec_search __P((BTREE *, recno_t, enum SRCHOP));
+int     __rec_seq __P((const DB *, DBT *, DBT *, u_int));
+int     __rec_sync __P((const DB *, u_int));
+int     __rec_vmap __P((BTREE *, recno_t));
+int     __rec_vout __P((BTREE *));
+int     __rec_vpipe __P((BTREE *, recno_t));
diff --git a/db.subproj/recno.subproj/rec_close.c b/db.subproj/recno.subproj/rec_close.c
new file mode 100644 (file)
index 0000000..7c57f5f
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#include <mach/mach.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <db.h>
+#include "recno.h"
+
+/*
+ * __REC_CLOSE -- Close a recno tree.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__rec_close(dbp)
+       DB *dbp;
+{
+       BTREE *t;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       if (__rec_sync(dbp, 0) == RET_ERROR)
+               return (RET_ERROR);
+
+       /* Committed to closing. */
+       status = RET_SUCCESS;
+       if (ISSET(t, R_MEMMAPPED)
+       &&  vm_deallocate(mach_task_self(), (vm_offset_t) t->bt_smap, t->bt_msize))
+               status = RET_ERROR;
+
+       if (!ISSET(t, R_INMEM))
+               if (ISSET(t, R_CLOSEFP)) {
+                       if (fclose(t->bt_rfp))
+                               status = RET_ERROR;
+               } else
+                       if (close(t->bt_rfd))
+                               status = RET_ERROR;
+
+       if (__bt_close(dbp) == RET_ERROR)
+               status = RET_ERROR;
+
+       return (status);
+}
+
+/*
+ * __REC_SYNC -- sync the recno tree to disk.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+int
+__rec_sync(dbp, flags)
+       const DB *dbp;
+       u_int flags;
+{
+       struct iovec iov[2];
+       BTREE *t;
+       DBT data, key;
+       off_t off;
+       recno_t scursor, trec;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       if (flags == R_RECNOSYNC)
+               return (__bt_sync(dbp, 0));
+
+       if (ISSET(t, R_RDONLY | R_INMEM) || !ISSET(t, R_MODIFIED))
+               return (RET_SUCCESS);
+
+       /* Read any remaining records into the tree. */
+       if (!ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
+               return (RET_ERROR);
+
+       /* Rewind the file descriptor. */
+       if (lseek(t->bt_rfd, (off_t)0, SEEK_SET) != 0)
+               return (RET_ERROR);
+
+       iov[1].iov_base = "\n";
+       iov[1].iov_len = 1;
+       scursor = t->bt_rcursor;
+
+       key.size = sizeof(recno_t);
+       key.data = &trec;
+
+       status = (dbp->seq)(dbp, &key, &data, R_FIRST);
+        while (status == RET_SUCCESS) {
+               iov[0].iov_base = data.data;
+               iov[0].iov_len = data.size;
+               if (writev(t->bt_rfd, iov, 2) != data.size + 1)
+                       return (RET_ERROR);
+                status = (dbp->seq)(dbp, &key, &data, R_NEXT);
+        }
+       t->bt_rcursor = scursor;
+       if (status == RET_ERROR)
+               return (RET_ERROR);
+       if ((off = lseek(t->bt_rfd, (off_t)0, SEEK_CUR)) == -1)
+               return (RET_ERROR);
+       if (ftruncate(t->bt_rfd, off))
+               return (RET_ERROR);
+       CLR(t, R_MODIFIED);
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/recno.subproj/rec_delete.c b/db.subproj/recno.subproj/rec_delete.c
new file mode 100644 (file)
index 0000000..126cd7f
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <db.h>
+#include "recno.h"
+
+static int rec_rdelete __P((BTREE *, recno_t));
+
+/*
+ * __REC_DELETE -- Delete the item(s) referenced by a key.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key to delete
+ *     flags:  R_CURSOR if deleting what the cursor references
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
+ */
+int
+__rec_delete(dbp, key, flags)
+       const DB *dbp;
+       const DBT *key;
+       u_int flags;
+{
+       BTREE *t;
+       recno_t nrec;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       switch(flags) {
+       case 0:
+               if ((nrec = *(recno_t *)key->data) == 0)
+                       goto einval;
+               if (nrec > t->bt_nrecs)
+                       return (RET_SPECIAL);
+               --nrec;
+               status = rec_rdelete(t, nrec);
+               break;
+       case R_CURSOR:
+               if (!ISSET(t, B_SEQINIT))
+                       goto einval;
+               if (t->bt_nrecs == 0)
+                       return (RET_SPECIAL);
+               status = rec_rdelete(t, t->bt_rcursor - 1);
+               if (status == RET_SUCCESS)
+                       --t->bt_rcursor;
+               break;
+       default:
+einval:                errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       if (status == RET_SUCCESS)
+               SET(t, B_MODIFIED | R_MODIFIED);
+       return (status);
+}
+
+/*
+ * REC_RDELETE -- Delete the data matching the specified key.
+ *
+ * Parameters:
+ *     tree:   tree
+ *     nrec:   record to delete
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
+ */
+static int
+rec_rdelete(t, nrec)
+       BTREE *t;
+       recno_t nrec;
+{
+       EPG *e;
+       PAGE *h;
+       int status;
+
+       /* Find the record; __rec_search pins the page. */
+       if ((e = __rec_search(t, nrec, SDELETE)) == NULL)
+               return (RET_ERROR);
+
+       /* Delete the record. */
+       h = e->page;
+       status = __rec_dleaf(t, h, e->index);
+       if (status != RET_SUCCESS) {
+               mpool_put(t->bt_mp, h, 0);
+               return (status);
+       }
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+       return (RET_SUCCESS);
+}
+
+/*
+ * __REC_DLEAF -- Delete a single record from a recno leaf page.
+ *
+ * Parameters:
+ *     t:      tree
+ *     index:  index on current page to delete
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+int
+__rec_dleaf(t, h, index)
+       BTREE *t;
+       PAGE *h;
+       indx_t index;
+{
+       register RLEAF *rl;
+       register indx_t *ip, cnt, offset;
+       register size_t nbytes;
+       char *from;
+       void *to;
+
+       /*
+        * Delete a record from a recno leaf page.  Internal records are never
+        * deleted from internal pages, regardless of the records that caused
+        * them to be added being deleted.  Pages made empty by deletion are
+        * not reclaimed.  They are, however, made available for reuse.
+        *
+        * Pack the remaining entries at the end of the page, shift the indices
+        * down, overwriting the deleted record and its index.  If the record
+        * uses overflow pages, make them available for reuse.
+        */
+       to = rl = GETRLEAF(h, index);
+       if (rl->flags & P_BIGDATA && __ovfl_delete(t, rl->bytes) == RET_ERROR)
+               return (RET_ERROR);
+       nbytes = NRLEAF(rl);
+
+       /*
+        * Compress the key/data pairs.  Compress and adjust the [BR]LEAF
+        * offsets.  Reset the headers.
+        */
+       from = (char *)h + h->upper;
+       memmove(from + nbytes, from, (char *)to - from);
+       h->upper += nbytes;
+
+       offset = h->linp[index];
+       for (cnt = &h->linp[index] - (ip = &h->linp[0]); cnt--; ++ip)
+               if (ip[0] < offset)
+                       ip[0] += nbytes;
+       for (cnt = &h->linp[NEXTINDEX(h)] - ip; --cnt; ++ip)
+               ip[0] = ip[1] < offset ? ip[1] + nbytes : ip[1];
+       h->lower -= sizeof(indx_t);
+       --t->bt_nrecs;
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/recno.subproj/rec_get.c b/db.subproj/recno.subproj/rec_get.c
new file mode 100644 (file)
index 0000000..a14bfc2
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <db.h>
+#include "recno.h"
+
+/*
+ * __REC_GET -- Get a record from the btree.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key to find
+ *     data:   data to return
+ *     flag:   currently unused
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
+ */
+int
+__rec_get(dbp, key, data, flags)
+       const DB *dbp;
+       const DBT *key;
+       DBT *data;
+       u_int flags;
+{
+       BTREE *t;
+       EPG *e;
+       recno_t nrec;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /* Get currently doesn't take any flags, and keys of 0 are illegal. */
+       if (flags || (nrec = *(recno_t *)key->data) == 0) {
+               errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       /*
+        * If we haven't seen this record yet, try to find it in the
+        * original file.
+        */
+       if (nrec > t->bt_nrecs) {
+               if (ISSET(t, R_EOF | R_INMEM))
+                       return (RET_SPECIAL);
+               if ((status = t->bt_irec(t, nrec)) != RET_SUCCESS)
+                       return (status);
+       }
+
+       --nrec;
+       if ((e = __rec_search(t, nrec, SEARCH)) == NULL)
+               return (RET_ERROR);
+
+       status = __rec_ret(t, e, 0, NULL, data);
+       if (ISSET(t, B_DB_LOCK))
+               mpool_put(t->bt_mp, e->page, 0);
+       else
+               t->bt_pinned = e->page;
+       return (status);
+}
+
+/*
+ * __REC_FPIPE -- Get fixed length records from a pipe.
+ *
+ * Parameters:
+ *     t:      tree
+ *     cnt:    records to read
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__rec_fpipe(t, top)
+       BTREE *t;
+       recno_t top;
+{
+       DBT data;
+       recno_t nrec;
+       size_t len;
+       int ch;
+       char *p;
+
+       if (t->bt_dbufsz < t->bt_reclen) {
+               if ((t->bt_dbuf =
+                   (char *)realloc(t->bt_dbuf, t->bt_reclen)) == NULL)
+                       return (RET_ERROR);
+               t->bt_dbufsz = t->bt_reclen;
+       }
+       data.data = t->bt_dbuf;
+       data.size = t->bt_reclen;
+
+       for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
+               len = t->bt_reclen;
+               for (p = t->bt_dbuf;; *p++ = ch)
+                       if ((ch = getc(t->bt_rfp)) == EOF || !len--) {
+                               if (__rec_iput(t, nrec, &data, 0)
+                                   != RET_SUCCESS)
+                                       return (RET_ERROR);
+                               break;
+                       }
+               if (ch == EOF)
+                       break;
+       }
+       if (nrec < top) {
+               SET(t, R_EOF);
+               return (RET_SPECIAL);
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * __REC_VPIPE -- Get variable length records from a pipe.
+ *
+ * Parameters:
+ *     t:      tree
+ *     cnt:    records to read
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__rec_vpipe(t, top)
+       BTREE *t;
+       recno_t top;
+{
+       DBT data;
+       recno_t nrec;
+       indx_t len;
+       size_t sz;
+       int bval, ch;
+       char *p;
+
+       bval = t->bt_bval;
+       for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
+               for (p = t->bt_dbuf, sz = t->bt_dbufsz;; *p++ = ch, --sz) {
+                       if ((ch = getc(t->bt_rfp)) == EOF || ch == bval) {
+                               data.data = t->bt_dbuf;
+                               data.size = p - t->bt_dbuf;
+                               if (ch == EOF && data.size == 0)
+                                       break;
+                               if (__rec_iput(t, nrec, &data, 0)
+                                   != RET_SUCCESS)
+                                       return (RET_ERROR);
+                               break;
+                       }
+                       if (sz == 0) {
+                               len = p - t->bt_dbuf;
+                               t->bt_dbufsz += (sz = 256);
+                               if ((t->bt_dbuf = (char *)realloc(t->bt_dbuf,
+                                   t->bt_dbufsz)) == NULL)
+                                       return (RET_ERROR);
+                               p = t->bt_dbuf + len;
+                       }
+               }
+               if (ch == EOF)
+                       break;
+       }
+       if (nrec < top) {
+               SET(t, R_EOF);
+               return (RET_SPECIAL);
+       }
+       return (RET_SUCCESS);
+}
+
+/*
+ * __REC_FMAP -- Get fixed length records from a file.
+ *
+ * Parameters:
+ *     t:      tree
+ *     cnt:    records to read
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__rec_fmap(t, top)
+       BTREE *t;
+       recno_t top;
+{
+       DBT data;
+       recno_t nrec;
+       caddr_t sp, ep;
+       size_t len;
+       char *p;
+
+       if (t->bt_dbufsz < t->bt_reclen) {
+               if ((t->bt_dbuf =
+                   (char *)realloc(t->bt_dbuf, t->bt_reclen)) == NULL)
+                       return (RET_ERROR);
+               t->bt_dbufsz = t->bt_reclen;
+       }
+       data.data = t->bt_dbuf;
+       data.size = t->bt_reclen;
+
+       sp = t->bt_cmap;
+       ep = t->bt_emap;
+       for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
+               if (sp >= ep) {
+                       SET(t, R_EOF);
+                       return (RET_SPECIAL);
+               }
+               len = t->bt_reclen;
+               for (p = t->bt_dbuf; sp < ep && len--; *p++ = *sp++);
+               memset(p, t->bt_bval, len);
+               if (__rec_iput(t, nrec, &data, 0) != RET_SUCCESS)
+                       return (RET_ERROR);
+       }
+       t->bt_cmap = sp;
+       return (RET_SUCCESS);
+}
+
+/*
+ * __REC_VMAP -- Get variable length records from a file.
+ *
+ * Parameters:
+ *     t:      tree
+ *     cnt:    records to read
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__rec_vmap(t, top)
+       BTREE *t;
+       recno_t top;
+{
+       DBT data;
+       caddr_t sp, ep;
+       recno_t nrec;
+       int bval;
+
+       sp = t->bt_cmap;
+       ep = t->bt_emap;
+       bval = t->bt_bval;
+
+       for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
+               if (sp >= ep) {
+                       SET(t, R_EOF);
+                       return (RET_SPECIAL);
+               }
+               for (data.data = sp; sp < ep && *sp != bval; ++sp);
+               data.size = sp - (caddr_t)data.data;
+               if (__rec_iput(t, nrec, &data, 0) != RET_SUCCESS)
+                       return (RET_ERROR);
+               ++sp;
+       }
+       t->bt_cmap = sp;
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/recno.subproj/rec_open.c b/db.subproj/recno.subproj/rec_open.c
new file mode 100644 (file)
index 0000000..4f8743e
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Olson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <mach/mach.h>
+#include <mach/mach_traps.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <db.h>
+#include "recno.h"
+
+DB *
+__rec_open(fname, flags, mode, openinfo, dflags)
+       const char *fname;
+       int flags, mode, dflags;
+       const RECNOINFO *openinfo;
+{
+       BTREE *t;
+       BTREEINFO btopeninfo;
+       DB *dbp;
+       PAGE *h;
+       struct stat sb;
+       int rfd, sverrno;
+
+       /* Open the user's file -- if this fails, we're done. */
+       if (fname != NULL && (rfd = open(fname, flags, mode)) < 0)
+               return (NULL);
+
+       /* Create a btree in memory (backed by disk). */
+       dbp = NULL;
+       if (openinfo) {
+               if (openinfo->flags & ~(R_FIXEDLEN | R_NOKEY | R_SNAPSHOT))
+                       goto einval;
+               btopeninfo.flags = 0;
+               btopeninfo.cachesize = openinfo->cachesize;
+               btopeninfo.maxkeypage = 0;
+               btopeninfo.minkeypage = 0;
+               btopeninfo.psize = openinfo->psize;
+               btopeninfo.compare = NULL;
+               btopeninfo.prefix = NULL;
+               btopeninfo.lorder = openinfo->lorder;
+               dbp = __bt_open(openinfo->bfname,
+                   O_RDWR, S_IRUSR | S_IWUSR, &btopeninfo, dflags);
+       } else
+               dbp = __bt_open(NULL, O_RDWR, S_IRUSR | S_IWUSR, NULL, dflags);
+       if (dbp == NULL)
+               goto err;
+
+       /*
+        * Some fields in the tree structure are recno specific.  Fill them
+        * in and make the btree structure look like a recno structure.  We
+        * don't change the bt_ovflsize value, it's close enough and slightly
+        * bigger.
+        */
+       t = dbp->internal;
+       if (openinfo) {
+               if (openinfo->flags & R_FIXEDLEN) {
+                       SET(t, R_FIXLEN);
+                       t->bt_reclen = openinfo->reclen;
+                       if (t->bt_reclen == 0)
+                               goto einval;
+               }
+               t->bt_bval = openinfo->bval;
+       } else
+               t->bt_bval = '\n';
+
+       SET(t, R_RECNO);
+       if (fname == NULL)
+               SET(t, R_EOF | R_INMEM);
+       else
+               t->bt_rfd = rfd;
+       t->bt_rcursor = 0;
+
+       if (fname != NULL) {
+               /*
+                * In 4.4BSD, stat(2) returns true for ISSOCK on pipes.
+                * Unfortunately, that's not portable, so we use lseek
+                * and check the errno values.
+                */
+               errno = 0;
+               if (lseek(rfd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE) {
+                       switch (flags & O_ACCMODE) {
+                       case O_RDONLY:
+                               SET(t, R_RDONLY);
+                               break;
+                       default:
+                               goto einval;
+                       }
+slow:                  if ((t->bt_rfp = fdopen(rfd, "r")) == NULL)
+                               goto err;
+                       SET(t, R_CLOSEFP);
+                       t->bt_irec =
+                           ISSET(t, R_FIXLEN) ? __rec_fpipe : __rec_vpipe;
+               } else {
+                       switch (flags & O_ACCMODE) {
+                       case O_RDONLY:
+                               SET(t, R_RDONLY);
+                               break;
+                       case O_RDWR:
+                               break;
+                       default:
+                               goto einval;
+                       }
+
+                       if (fstat(rfd, &sb))
+                               goto err;
+                       /*
+                        * Kluge -- we'd like to test to see if the file is too
+                        * big to mmap.  Since, we don't know what size or type
+                        * off_t's or size_t's are, what the largest unsigned
+                        * integral type is, or what random insanity the local
+                        * C compiler will perpetrate, doing the comparison in
+                        * a portable way is flatly impossible.  Hope that mmap
+                        * fails if the file is too large.
+                        */
+                       if (sb.st_size == 0)
+                               SET(t, R_EOF);
+                       else {
+                               t->bt_msize = sb.st_size;
+                               if ( (map_fd(rfd, 0, (vm_offset_t *)
+                                   &t->bt_smap, TRUE, t->bt_msize)
+                                    != KERN_SUCCESS)
+                               ||   (vm_protect(mach_task_self(), (vm_offset_t)
+                                   t->bt_smap,  t->bt_msize, TRUE,
+                                   VM_PROT_READ) != KERN_SUCCESS) )
+                                       goto slow;
+                               t->bt_cmap = t->bt_smap;
+                               t->bt_emap = t->bt_smap + sb.st_size;
+                               t->bt_irec = ISSET(t, R_FIXLEN) ?
+                                   __rec_fmap : __rec_vmap;
+                               SET(t, R_MEMMAPPED);
+                       }
+               }
+       }
+
+       /* Use the recno routines. */
+       dbp->close = __rec_close;
+       dbp->del = __rec_delete;
+       dbp->fd = __rec_fd;
+       dbp->get = __rec_get;
+       dbp->put = __rec_put;
+       dbp->seq = __rec_seq;
+       dbp->sync = __rec_sync;
+
+       /* If the root page was created, reset the flags. */
+       if ((h = mpool_get(t->bt_mp, P_ROOT, 0)) == NULL)
+               goto err;
+       if ((h->flags & P_TYPE) == P_BLEAF) {
+               h->flags = h->flags & ~P_TYPE | P_RLEAF;
+               mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+       } else
+               mpool_put(t->bt_mp, h, 0);
+
+       if (openinfo && openinfo->flags & R_SNAPSHOT &&
+           !ISSET(t, R_EOF | R_INMEM) &&
+           t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
+                goto err;
+       return (dbp);
+
+einval:        errno = EINVAL;
+err:   sverrno = errno;
+       if (dbp != NULL)
+               (void)__bt_close(dbp);
+       if (fname != NULL)
+               (void)close(rfd);
+       errno = sverrno;
+       return (NULL);
+}
+
+int
+__rec_fd(dbp)
+       const DB *dbp;
+{
+       BTREE *t;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       /* In-memory database can't have a file descriptor. */
+       if (ISSET(t, R_INMEM)) {
+               errno = ENOENT;
+               return (-1);
+       }
+       return (t->bt_rfd);
+}
diff --git a/db.subproj/recno.subproj/rec_put.c b/db.subproj/recno.subproj/rec_put.c
new file mode 100644 (file)
index 0000000..45029a6
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "recno.h"
+
+/*
+ * __REC_PUT -- Add a recno item to the tree.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key
+ *     data:   data
+ *     flag:   R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key is
+ *     already in the tree and R_NOOVERWRITE specified.
+ */
+int
+__rec_put(dbp, key, data, flags)
+       const DB *dbp;
+       DBT *key;
+       const DBT *data;
+       u_int flags;
+{
+       BTREE *t;
+       DBT tdata;
+       recno_t nrec;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       switch (flags) {
+       case R_CURSOR:
+               if (!ISSET(t, B_SEQINIT))
+                       goto einval;
+               nrec = t->bt_rcursor;
+               break;
+       case R_SETCURSOR:
+               if ((nrec = *(recno_t *)key->data) == 0)
+                       goto einval;
+               break;
+       case R_IAFTER:
+               if ((nrec = *(recno_t *)key->data) == 0) {
+                       nrec = 1;
+                       flags = R_IBEFORE;
+               }
+               break;
+       case 0:
+       case R_IBEFORE:
+               if ((nrec = *(recno_t *)key->data) == 0)
+                       goto einval;
+               break;
+       case R_NOOVERWRITE:
+               if ((nrec = *(recno_t *)key->data) == 0)
+                       goto einval;
+               if (nrec <= t->bt_nrecs)
+                       return (RET_SPECIAL);
+               break;
+       default:
+einval:                errno = EINVAL;
+               return (RET_ERROR);
+       }
+
+       /*
+        * Make sure that records up to and including the put record are
+        * already in the database.  If skipping records, create empty ones.
+        */
+       if (nrec > t->bt_nrecs) {
+               if (!ISSET(t, R_EOF | R_INMEM) &&
+                   t->bt_irec(t, nrec) == RET_ERROR)
+                       return (RET_ERROR);
+               if (nrec > t->bt_nrecs + 1) {
+                       if (ISSET(t, R_FIXLEN)) {
+                               if ((tdata.data =
+                                   (void *)malloc(t->bt_reclen)) == NULL)
+                                       return (RET_ERROR);
+                               tdata.size = t->bt_reclen;
+                               memset(tdata.data, t->bt_bval, tdata.size);
+                       } else {
+                               tdata.data = NULL;
+                               tdata.size = 0;
+                       }
+                       while (nrec > t->bt_nrecs + 1)
+                               if (__rec_iput(t,
+                                   t->bt_nrecs, &tdata, 0) != RET_SUCCESS)
+                                       return (RET_ERROR);
+                       if (ISSET(t, R_FIXLEN))
+                               free(tdata.data);
+               }
+       }
+
+       if ((status = __rec_iput(t, nrec - 1, data, flags)) != RET_SUCCESS)
+               return (status);
+
+       if (flags == R_SETCURSOR)
+               t->bt_rcursor = nrec;
+       
+       SET(t, R_MODIFIED);
+       return (__rec_ret(t, NULL, nrec, key, NULL));
+}
+
+/*
+ * __REC_IPUT -- Add a recno item to the tree.
+ *
+ * Parameters:
+ *     t:      tree
+ *     nrec:   record number
+ *     data:   data
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS
+ */
+int
+__rec_iput(t, nrec, data, flags)
+       BTREE *t;
+       recno_t nrec;
+       const DBT *data;
+       u_int flags;
+{
+       DBT tdata;
+       EPG *e;
+       PAGE *h;
+       indx_t index, nxtindex;
+       pgno_t pg;
+       size_t nbytes;
+       int dflags, status;
+       char *dest, db[NOVFLSIZE];
+
+       /*
+        * If the data won't fit on a page, store it on indirect pages.
+        *
+        * XXX
+        * If the insert fails later on, these pages aren't recovered.
+        */
+       if (data->size > t->bt_ovflsize) {
+               if (__ovfl_put(t, data, &pg) == RET_ERROR)
+                       return (RET_ERROR);
+               tdata.data = db;
+               tdata.size = NOVFLSIZE;
+               *(pgno_t *)db = pg;
+               *(size_t *)(db + sizeof(pgno_t)) = data->size;
+               dflags = P_BIGDATA;
+               data = &tdata;
+       } else
+               dflags = 0;
+
+       /* __rec_search pins the returned page. */
+       if ((e = __rec_search(t, nrec,
+           nrec > t->bt_nrecs || flags == R_IAFTER || flags == R_IBEFORE ?
+           SINSERT : SEARCH)) == NULL)
+               return (RET_ERROR);
+
+       h = e->page;
+       index = e->index;
+
+       /*
+        * Add the specified key/data pair to the tree.  The R_IAFTER and
+        * R_IBEFORE flags insert the key after/before the specified key.
+        *
+        * Pages are split as required.
+        */
+       switch (flags) {
+       case R_IAFTER:
+               ++index;
+               break;
+       case R_IBEFORE:
+               break;
+       default:
+               if (nrec < t->bt_nrecs &&
+                   __rec_dleaf(t, h, index) == RET_ERROR) {
+                       mpool_put(t->bt_mp, h, 0);
+                       return (RET_ERROR);
+               }
+               break;
+       }
+
+       /*
+        * If not enough room, split the page.  The split code will insert
+        * the key and data and unpin the current page.  If inserting into
+        * the offset array, shift the pointers up.
+        */
+       nbytes = NRLEAFDBT(data->size);
+       if (h->upper - h->lower < nbytes + sizeof(indx_t)) {
+               status = __bt_split(t, h, NULL, data, dflags, nbytes, index);
+               if (status == RET_SUCCESS)
+                       ++t->bt_nrecs;
+               return (status);
+       }
+
+       if (index < (nxtindex = NEXTINDEX(h)))
+               memmove(h->linp + index + 1, h->linp + index,
+                   (nxtindex - index) * sizeof(indx_t));
+       h->lower += sizeof(indx_t);
+
+       h->linp[index] = h->upper -= nbytes;
+       dest = (char *)h + h->upper;
+       WR_RLEAF(dest, data, dflags);
+
+       ++t->bt_nrecs;
+       SET(t, B_MODIFIED);
+       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/recno.subproj/rec_search.c b/db.subproj/recno.subproj/rec_search.c
new file mode 100644 (file)
index 0000000..9cf4341
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+#include <db.h>
+#include "recno.h"
+
+/*
+ * __REC_SEARCH -- Search a btree for a key.
+ *
+ * Parameters:
+ *     t:      tree to search
+ *     recno:  key to find
+ *     op:     search operation
+ *
+ * Returns:
+ *     EPG for matching record, if any, or the EPG for the location of the
+ *     key, if it were inserted into the tree.
+ *
+ * Returns:
+ *     The EPG for matching record, if any, or the EPG for the location
+ *     of the key, if it were inserted into the tree, is entered into
+ *     the bt_cur field of the tree.  A pointer to the field is returned.
+ */
+EPG *
+__rec_search(t, recno, op)
+       BTREE *t;
+       recno_t recno;
+       enum SRCHOP op;
+{
+       register indx_t index;
+       register PAGE *h;
+       EPGNO *parent;
+       RINTERNAL *r;
+       pgno_t pg;
+       indx_t top;
+       recno_t total;
+       int sverrno;
+
+       BT_CLR(t);
+       for (pg = P_ROOT, total = 0;;) {
+               if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
+                       goto err;
+               if (h->flags & P_RLEAF) {
+                       t->bt_cur.page = h;
+                       t->bt_cur.index = recno - total;
+                       return (&t->bt_cur);
+               }
+               for (index = 0, top = NEXTINDEX(h);;) {
+                       r = GETRINTERNAL(h, index);
+                       if (++index == top || total + r->nrecs > recno)
+                               break;
+                       total += r->nrecs;
+               }
+
+               if (__bt_push(t, pg, index - 1) == RET_ERROR)
+                       return (NULL);
+               
+               pg = r->pgno;
+               switch (op) {
+               case SDELETE:
+                       --GETRINTERNAL(h, (index - 1))->nrecs;
+                       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+                       break;
+               case SINSERT:
+                       ++GETRINTERNAL(h, (index - 1))->nrecs;
+                       mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+                       break;
+               case SEARCH:
+                       mpool_put(t->bt_mp, h, 0);
+                       break;
+               }
+
+       }
+       /* Try and recover the tree. */
+err:   sverrno = errno;
+       if (op != SEARCH)
+               while  ((parent = BT_POP(t)) != NULL) {
+                       if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
+                               break;
+                       if (op == SINSERT)
+                               --GETRINTERNAL(h, parent->index)->nrecs;
+                       else
+                               ++GETRINTERNAL(h, parent->index)->nrecs;
+                        mpool_put(t->bt_mp, h, MPOOL_DIRTY);
+                }
+       errno = sverrno;
+       return (NULL);
+}
diff --git a/db.subproj/recno.subproj/rec_seq.c b/db.subproj/recno.subproj/rec_seq.c
new file mode 100644 (file)
index 0000000..693d447
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <db.h>
+#include "recno.h"
+
+/*
+ * __REC_SEQ -- Recno sequential scan interface.
+ *
+ * Parameters:
+ *     dbp:    pointer to access method
+ *     key:    key for positioning and return value
+ *     data:   data return value
+ *     flags:  R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV.
+ *
+ * Returns:
+ *     RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
+ */
+int
+__rec_seq(dbp, key, data, flags)
+       const DB *dbp;
+       DBT *key, *data;
+       u_int flags;
+{
+       BTREE *t;
+       EPG *e;
+       recno_t nrec;
+       int status;
+
+       t = dbp->internal;
+
+       /* Toss any page pinned across calls. */
+       if (t->bt_pinned != NULL) {
+               mpool_put(t->bt_mp, t->bt_pinned, 0);
+               t->bt_pinned = NULL;
+       }
+
+       switch(flags) {
+       case R_CURSOR:
+               if ((nrec = *(recno_t *)key->data) == 0)
+                       goto einval;
+               break;
+       case R_NEXT:
+               if (ISSET(t, B_SEQINIT)) {
+                       nrec = t->bt_rcursor + 1;
+                       break;
+               }
+               /* FALLTHROUGH */
+       case R_FIRST:
+               nrec = 1;
+               break;
+       case R_PREV:
+               if (ISSET(t, B_SEQINIT)) {
+                       if ((nrec = t->bt_rcursor - 1) == 0)
+                               return (RET_SPECIAL);
+                       break;
+               }
+               /* FALLTHROUGH */
+       case R_LAST:
+               if (!ISSET(t, R_EOF | R_INMEM) &&
+                   t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
+                       return (RET_ERROR);
+               nrec = t->bt_nrecs;
+               break;
+       default:
+einval:                errno = EINVAL;
+               return (RET_ERROR);
+       }
+       
+       if (t->bt_nrecs == 0 || nrec > t->bt_nrecs) {
+               if (!ISSET(t, R_EOF | R_INMEM) &&
+                   (status = t->bt_irec(t, nrec)) != RET_SUCCESS)
+                       return (status);
+               if (t->bt_nrecs == 0 || nrec > t->bt_nrecs)
+                       return (RET_SPECIAL);
+       }
+
+       if ((e = __rec_search(t, nrec - 1, SEARCH)) == NULL)
+               return (RET_ERROR);
+
+       SET(t, B_SEQINIT);
+       t->bt_rcursor = nrec;
+
+       status = __rec_ret(t, e, nrec, key, data);
+       if (ISSET(t, B_DB_LOCK))
+               mpool_put(t->bt_mp, e->page, 0);
+       else
+               t->bt_pinned = e->page;
+       return (status);
+}
diff --git a/db.subproj/recno.subproj/rec_utils.c b/db.subproj/recno.subproj/rec_utils.c
new file mode 100644 (file)
index 0000000..8f7c475
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <db.h>
+#include "recno.h"
+
+/*
+ * __REC_RET -- Build return data as a result of search or scan.
+ *
+ * Parameters:
+ *     t:      tree
+ *     d:      LEAF to be returned to the user.
+ *     data:   user's data structure
+ *
+ * Returns:
+ *     RET_SUCCESS, RET_ERROR.
+ */
+int
+__rec_ret(t, e, nrec, key, data)
+       BTREE *t;
+       EPG *e;
+       recno_t nrec;
+       DBT *key, *data;
+{
+       register RLEAF *rl;
+       register void *p;
+
+       if (data == NULL)
+               goto retkey;
+
+       rl = GETRLEAF(e->page, e->index);
+
+       /*
+        * We always copy big data to make it contigous.  Otherwise, we
+        * leave the page pinned and don't copy unless the user specified
+        * concurrent access.
+        */
+       if (rl->flags & P_BIGDATA) {
+               if (__ovfl_get(t, rl->bytes,
+                   &data->size, &t->bt_dbuf, &t->bt_dbufsz))
+                       return (RET_ERROR);
+               data->data = t->bt_dbuf;
+       } else if (ISSET(t, B_DB_LOCK)) {
+               /* Use +1 in case the first record retrieved is 0 length. */
+               if (rl->dsize + 1 > t->bt_dbufsz) {
+                       if ((p =
+                           (void *)realloc(t->bt_dbuf, rl->dsize + 1)) == NULL)
+                               return (RET_ERROR);
+                       t->bt_dbuf = p;
+                       t->bt_dbufsz = rl->dsize + 1;
+               }
+               memmove(t->bt_dbuf, rl->bytes, rl->dsize);
+               data->size = rl->dsize;
+               data->data = t->bt_dbuf;
+       } else {
+               data->size = rl->dsize;
+               data->data = rl->bytes;
+       }
+
+retkey:        if (key == NULL)
+               return (RET_SUCCESS);
+
+       /* We have to copy the key, it's not on the page. */
+       if (sizeof(recno_t) > t->bt_kbufsz) {
+               if ((p = (void *)realloc(t->bt_kbuf, sizeof(recno_t))) == NULL)
+                       return (RET_ERROR);
+               t->bt_kbuf = p;
+               t->bt_kbufsz = sizeof(recno_t);
+       }
+       memmove(t->bt_kbuf, &nrec, sizeof(recno_t));
+       key->size = sizeof(recno_t);
+       key->data = t->bt_kbuf;
+       return (RET_SUCCESS);
+}
diff --git a/db.subproj/recno.subproj/recno.h b/db.subproj/recno.subproj/recno.h
new file mode 100644 (file)
index 0000000..39b076d
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+enum SRCHOP { SDELETE, SINSERT, SEARCH};       /* Rec_search operation. */
+
+#include <btree.h>
+#include "extern.h"
diff --git a/gen.subproj/Makefile b/gen.subproj/Makefile
new file mode 100644 (file)
index 0000000..0148fde
--- /dev/null
@@ -0,0 +1,72 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = gen
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = zone.h scalable_malloc.h malloc.h stack_logging.h
+
+CFILES = alarm.c assert.c clock.c closedir.c confstr.c crypt.c\
+         ctermid.c ctime.c daemon.c devname.c difftime.c disklabel.c\
+         err.c errlst.c exec.c fnmatch.c ftok.c fts.c getbsize.c\
+         getcap.c getcwd.c gethostname.c getloadavg.c getlogin.c\
+         getmntinfo.c getpagesize.c getpass.c getttyent.c\
+         getusershell.c getvfsbyname.c gmon.c isatty.c isnan.c\
+         malloc.c nanosleep.c nice.c nlist.c NSSystemDirectories.c\
+         opendir.c pause.c popen.c psignal.c raise.c readdir.c\
+         rewinddir.c scalable_malloc.c scandir.c seekdir.c\
+         sethostname.c setlogin.c setmode.c siginterrupt.c siglist.c\
+         signal.c sigsetops.c sleep.c stack_logging.c sysconf.c\
+         sysctl.c syslog.c telldir.c termios.c time.c times.c\
+         timezone.c ttyname.c ttyslot.c ualarm.c uname.c unvis.c\
+         usleep.c utime.c vis.c wait.c wait3.c waitpid.c zone.c\
+         sysctlbyname.c
+
+SUBPROJECTS = i386.subproj ppc.subproj
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble ftok.3
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+PUBLIC_HEADERS = zone.h malloc.h
+
+PROJECT_HEADERS = malloc.h zone.h stack_logging.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/SandBox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/gen.subproj/Makefile.postamble b/gen.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..b0473f2
--- /dev/null
@@ -0,0 +1,4 @@
+PROFILE_CFLAGS = $(filter-out -DPROFILE, $(filter-out -pg, $(ALL_CFLAGS)))
+$(OFILE_DIR)/gmon.i386.o $(OFILE_DIR)/gmon.ppc.o: gmon.c
+       $(CC) -arch $(CURRENT_ARCH) $(PROFILE_CFLAGS) $(LOCAL_DIR_INCLUDE_DIRECTIVE) -c gmon.c -o $@
+
diff --git a/gen.subproj/Makefile.preamble b/gen.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..3be9dcf
--- /dev/null
@@ -0,0 +1,2 @@
+PUBLIC_HEADER_DIR_SUFFIX = /objc
+PROJECT_HEADER_DIR_SUFFIX = /objc
diff --git a/gen.subproj/NSSystemDirectories.c b/gen.subproj/NSSystemDirectories.c
new file mode 100644 (file)
index 0000000..1e37408
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <libc.h>
+#import <stdio.h>
+#import <stdlib.h>
+#import <NSSystemDirectories.h>
+
+// Names of directories; index into this with NSSearchPathDirectory - 1
+#define numDirs 8
+static const struct {
+    unsigned char invalidDomainMask;   // Domains in which this dir does not appear
+    unsigned char alternateDomainMask; // Domains in which this dir uses the alternate domain path
+    const char *dirPath;
+} dirInfo[numDirs] = {
+    {0,   0,   "Applications"},
+    {0,   0,   "Applications/GrabBag"},
+    {0,   0,   "Developer/Applications"},
+    {0,   0,   "Applications/Utilities"},
+    {0,   0x8, "Library"},                     // Uses alternate form in System domain
+    {0,   0,   "Developer"},
+    {0x9, 0,   "Users"},                       // Not valid in the System and User domains
+    {0,   0x8, "Library/Documentation"}                // Uses alternate form in System domain
+};
+
+// Ordered list of where to find applications in each domain (the numbers are NSSearchPathDirectory)
+#define numApplicationDirs 4
+static const char applicationDirs[numApplicationDirs] = {1, 4, 3, 2};
+
+// Ordered list of where to find resources in each domain (the numbers are NSSearchPathDirectory)
+#define numLibraryDirs 2
+static const char libraryDirs[numLibraryDirs] = {5, 6};
+
+// Names of domains; index into this log2(domainMask). If the search path ordering is ever changed, then we need an indirection (as the domainMask values cannot be changed).
+#define numDomains 4
+static const struct {
+    char needsRootPrepended;
+    const char *domainPath;
+    const char *alternateDomainPath;
+} domainInfo[numDomains] = {
+    {0, "~",        "~"},
+    {1, "",         ""},
+    {1, "/Network", "/Network"},
+    {1, "",         "/System"}
+};
+
+#define invalidDomains 0x00    // some domains may be invalid on non-Mach systems
+
+NSSearchPathEnumerationState NSStartSearchPathEnumeration(NSSearchPathDirectory dir, NSSearchPathDomainMask domainMask) {
+    // The state is AABBCCCC, where
+    // AA is the dir(s) requested
+    // BB is the current state of dirs (if AA < 100, then this is always 0; otherwise it goes up to number of dirs)
+    // CCCC is the domains requested
+    // the state always contains the next item; if CCCC is 0, then we're done
+    domainMask = domainMask & ((1 << numDomains) - 1) & ~invalidDomains;       // Just leave useful bits in there
+    if (dir != NSAllLibrariesDirectory && dir != NSLibraryDirectory && dir != NSUserDirectory && dir != NSDocumentationDirectory && (domainMask & NSLocalDomainMask) && (domainMask & NSSystemDomainMask)) domainMask = domainMask & ~NSSystemDomainMask;      // Hack to avoid duplication
+    return (((unsigned int)dir) << 24) + ((unsigned int)domainMask);
+}
+
+NSSearchPathEnumerationState NSGetNextSearchPathEnumeration(NSSearchPathEnumerationState state, char *path) {
+    static const char *nextRoot = NULL;
+    unsigned dir = (state >> 24) & 0xff;
+    unsigned dirState = (state >> 16) & 0xff;
+    unsigned domainMask = state & 0xffff;
+    unsigned int curDomain;    // The current domain we're at...
+    unsigned int curDir = 0;   // The current dir...
+    
+    do {
+        if (domainMask == 0) return 0; // Looks like we're done
+        for (curDomain = 0; curDomain < numDomains; curDomain++) if ((domainMask & (1 << curDomain))) break;
+
+        // Determine directory
+        if (dir < NSAllApplicationsDirectory) {        // One directory per domain, simple...
+            curDir = dir;
+        } else {                                       // Can return multiple directories for each domain
+            if (dir == NSAllApplicationsDirectory) {
+                curDir = applicationDirs[dirState];
+                if (++dirState == numApplicationDirs) dirState = 0;
+            } else if (dir == NSAllLibrariesDirectory) {
+                curDir = libraryDirs[dirState];
+                if (++dirState == numLibraryDirs) dirState = 0;
+            }
+        }
+        if (dirState == 0) domainMask &= ~(1 << curDomain);    // If necessary, jump to next domain
+    } while ((dirInfo[curDir - 1].invalidDomainMask & (1 << curDomain)));      // If invalid, try again...
+
+    // Get NEXT_ROOT, if necessary.
+    if (domainInfo[curDomain].needsRootPrepended && nextRoot == 0) {
+       nextRoot = getenv("NEXT_ROOT");
+        if (nextRoot == NULL) {
+            nextRoot = "";
+        } else {
+            strcpy(malloc(strlen(nextRoot) + 1), nextRoot);    // Be safe...
+        }
+    }
+
+    snprintf(path, PATH_MAX, "%s%s/%s", domainInfo[curDomain].needsRootPrepended ? nextRoot : "", (dirInfo[curDir - 1].alternateDomainMask & (1 << curDomain)) ? domainInfo[curDomain].alternateDomainPath : domainInfo[curDomain].domainPath, dirInfo[curDir - 1].dirPath);
+        
+    return (dir << 24) + (dirState << 16) + domainMask;
+}
+
+
diff --git a/gen.subproj/PB.project b/gen.subproj/PB.project
new file mode 100644 (file)
index 0000000..5401699
--- /dev/null
@@ -0,0 +1,108 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (zone.h, scalable_malloc.h, malloc.h, stack_logging.h); 
+        OTHER_LINKED = (
+            alarm.c, 
+            assert.c, 
+            clock.c, 
+            closedir.c, 
+            confstr.c, 
+            crypt.c, 
+            ctermid.c, 
+            ctime.c, 
+            daemon.c, 
+            devname.c, 
+            difftime.c, 
+            disklabel.c, 
+            err.c, 
+            errlst.c, 
+            exec.c, 
+            fnmatch.c, 
+            ftok.c, 
+            fts.c, 
+            getbsize.c, 
+            getcap.c, 
+            getcwd.c, 
+            gethostname.c, 
+            getloadavg.c, 
+            getlogin.c, 
+            getmntinfo.c, 
+            getpagesize.c, 
+            getpass.c, 
+            getttyent.c, 
+            getusershell.c, 
+            getvfsbyname.c, 
+            gmon.c, 
+            isatty.c, 
+            isnan.c, 
+            malloc.c, 
+            nanosleep.c, 
+            nice.c, 
+            nlist.c, 
+            NSSystemDirectories.c, 
+            opendir.c, 
+            pause.c, 
+            popen.c, 
+            psignal.c, 
+            raise.c, 
+            readdir.c, 
+            rewinddir.c, 
+            scalable_malloc.c, 
+            scandir.c, 
+            seekdir.c, 
+            sethostname.c, 
+            setlogin.c, 
+            setmode.c, 
+            siginterrupt.c, 
+            siglist.c, 
+            signal.c, 
+            sigsetops.c, 
+            sleep.c, 
+            stack_logging.c, 
+            sysconf.c, 
+            sysctl.c, 
+            syslog.c, 
+            telldir.c, 
+            termios.c, 
+            time.c, 
+            times.c, 
+            timezone.c, 
+            ttyname.c, 
+            ttyslot.c, 
+            ualarm.c, 
+            uname.c, 
+            unvis.c, 
+            usleep.c, 
+            utime.c, 
+            vis.c, 
+            wait.c, 
+            wait3.c, 
+            waitpid.c, 
+            zone.c, 
+            sysctlbyname.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble, ftok.3); 
+        PRECOMPILED_HEADERS = (); 
+        PROJECT_HEADERS = (malloc.h, zone.h, stack_logging.h); 
+        PUBLIC_HEADERS = (zone.h, malloc.h); 
+        SUBPROJECTS = (i386.subproj, ppc.subproj); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/SandBox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = gen; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/gen.subproj/alarm.c b/gen.subproj/alarm.c
new file mode 100644 (file)
index 0000000..1b66b07
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Backwards compatible alarm.
+ */
+#include <sys/time.h>
+#include <unistd.h>
+
+unsigned int
+alarm(secs)
+       unsigned int secs;
+{
+       struct itimerval it, oitv;
+       register struct itimerval *itp = &it;
+
+       timerclear(&itp->it_interval);
+       itp->it_value.tv_sec = secs;
+       itp->it_value.tv_usec = 0;
+       if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
+               return (-1);
+       if (oitv.it_value.tv_usec)
+               oitv.it_value.tv_sec++;
+       return (oitv.it_value.tv_sec);
+}
diff --git a/gen.subproj/assert.c b/gen.subproj/assert.c
new file mode 100644 (file)
index 0000000..2ce97a7
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/* We let the compiler's assert.h own the implementation */
+#if !defined(__APPLE__)
+
+#include <sys/types.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void
+__assert(file, line, failedexpr)
+       const char *file, *failedexpr;
+       int line;
+{
+       (void)fprintf(stderr,
+           "assertion \"%s\" failed: file \"%s\", line %d\n",
+           failedexpr, file, line);
+       abort();
+       /* NOTREACHED */
+}
+#endif
diff --git a/gen.subproj/clock.c b/gen.subproj/clock.c
new file mode 100644 (file)
index 0000000..47367f3
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+/*
+ * Convert usec to clock ticks; could do (usec * CLK_TCK) / 1000000,
+ * but this would overflow if we switch to nanosec.
+ */
+#define        CONVTCK(r)      (r.tv_sec * CLK_TCK + r.tv_usec / (1000000 / CLK_TCK))
+
+clock_t
+clock()
+{
+       struct rusage ru;
+
+       if (getrusage(RUSAGE_SELF, &ru))
+               return ((clock_t) -1);
+       return((clock_t)((CONVTCK(ru.ru_utime) + CONVTCK(ru.ru_stime))));
+}
diff --git a/gen.subproj/closedir.c b/gen.subproj/closedir.c
new file mode 100644 (file)
index 0000000..858f4fc
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/*
+ * close a directory.
+ */
+int
+closedir(dirp)
+       register DIR *dirp;
+{
+       int fd;
+
+       seekdir(dirp, dirp->dd_rewind); /* free seekdir storage */
+       fd = dirp->dd_fd;
+       dirp->dd_fd = -1;
+       dirp->dd_loc = 0;
+       (void)free((void *)dirp->dd_buf);
+       (void)free((void *)dirp);
+       return(close(fd));
+}
diff --git a/gen.subproj/confstr.c b/gen.subproj/confstr.c
new file mode 100644 (file)
index 0000000..9c380aa
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+#include <errno.h>
+#include <paths.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+size_t
+confstr(name, buf, len)
+       int name;
+       char *buf;
+       size_t len;
+{
+       size_t tlen;
+       int mib[2], sverrno;
+       char *p;
+
+       switch (name) {
+       case _CS_PATH:
+               mib[0] = CTL_USER;
+               mib[1] = USER_CS_PATH;
+               if (sysctl(mib, 2, NULL, &tlen, NULL, 0) == -1)
+                       return (-1);
+               if (len != 0 && buf != NULL) {
+                       if ((p = malloc(tlen)) == NULL)
+                               return (-1);
+                       if (sysctl(mib, 2, p, &tlen, NULL, 0) == -1) {
+                               sverrno = errno;
+                               free(p);
+                               errno = sverrno;
+                               return (-1);
+                       }
+                       /*
+                        * POSIX 1003.2 requires partial return of
+                        * the string -- that should be *real* useful.
+                        */
+                       (void)strncpy(buf, p, len - 1);
+                       buf[len - 1] = '\0';
+                       free(p);
+               }
+               return (tlen + 1);
+       default:
+               errno = EINVAL;
+               return (0);
+       }
+       /* NOTREACHED */
+}
diff --git a/gen.subproj/crypt.c b/gen.subproj/crypt.c
new file mode 100644 (file)
index 0000000..5e2caec
--- /dev/null
@@ -0,0 +1,981 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Tom Truscott.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <unistd.h>
+#include <limits.h>
+#include <pwd.h>
+
+/*
+ * UNIX password, and DES, encryption.
+ * By Tom Truscott, trt@rti.rti.org,
+ * from algorithms by Robert W. Baldwin and James Gillogly.
+ *
+ * References:
+ * "Mathematical Cryptology for Computer Scientists and Mathematicians,"
+ * by Wayne Patterson, 1987, ISBN 0-8476-7438-X.
+ *
+ * "Password Security: A Case History," R. Morris and Ken Thompson,
+ * Communications of the ACM, vol. 22, pp. 594-597, Nov. 1979.
+ *
+ * "DES will be Totally Insecure within Ten Years," M.E. Hellman,
+ * IEEE Spectrum, vol. 16, pp. 32-39, July 1979.
+ */
+
+/* =====  Configuration ==================== */
+
+/*
+ * define "MUST_ALIGN" if your compiler cannot load/store
+ * long integers at arbitrary (e.g. odd) memory locations.
+ * (Either that or never pass unaligned addresses to des_cipher!)
+ */
+#if !defined(vax)
+#define        MUST_ALIGN
+#endif
+
+#ifdef CHAR_BITS
+#if CHAR_BITS != 8
+       #error C_block structure assumes 8 bit characters
+#endif
+#endif
+
+/*
+ * define "LONG_IS_32_BITS" only if sizeof(long)==4.
+ * This avoids use of bit fields (your compiler may be sloppy with them).
+ */
+#if !defined(cray)
+#define        LONG_IS_32_BITS
+#endif
+
+/*
+ * define "B64" to be the declaration for a 64 bit integer.
+ * XXX this feature is currently unused, see "endian" comment below.
+ */
+#if defined(cray)
+#define        B64     long
+#endif
+#if defined(convex)
+#define        B64     long long
+#endif
+
+/*
+ * define "LARGEDATA" to get faster permutations, by using about 72 kilobytes
+ * of lookup tables.  This speeds up des_setkey() and des_cipher(), but has
+ * little effect on crypt().
+ */
+#if defined(notdef)
+#define        LARGEDATA
+#endif
+
+/* compile with "-DSTATIC=int" when profiling */
+#ifndef STATIC
+#define        STATIC  static
+#endif
+STATIC void init_des(), init_perm(), permute();
+#ifdef DEBUG
+STATIC prtab();
+#endif
+
+/* ==================================== */
+
+/*
+ * Cipher-block representation (Bob Baldwin):
+ *
+ * DES operates on groups of 64 bits, numbered 1..64 (sigh).  One
+ * representation is to store one bit per byte in an array of bytes.  Bit N of
+ * the NBS spec is stored as the LSB of the Nth byte (index N-1) in the array.
+ * Another representation stores the 64 bits in 8 bytes, with bits 1..8 in the
+ * first byte, 9..16 in the second, and so on.  The DES spec apparently has
+ * bit 1 in the MSB of the first byte, but that is particularly noxious so we
+ * bit-reverse each byte so that bit 1 is the LSB of the first byte, bit 8 is
+ * the MSB of the first byte.  Specifically, the 64-bit input data and key are
+ * converted to LSB format, and the output 64-bit block is converted back into
+ * MSB format.
+ *
+ * DES operates internally on groups of 32 bits which are expanded to 48 bits
+ * by permutation E and shrunk back to 32 bits by the S boxes.  To speed up
+ * the computation, the expansion is applied only once, the expanded
+ * representation is maintained during the encryption, and a compression
+ * permutation is applied only at the end.  To speed up the S-box lookups,
+ * the 48 bits are maintained as eight 6 bit groups, one per byte, which
+ * directly feed the eight S-boxes.  Within each byte, the 6 bits are the
+ * most significant ones.  The low two bits of each byte are zero.  (Thus,
+ * bit 1 of the 48 bit E expansion is stored as the "4"-valued bit of the
+ * first byte in the eight byte representation, bit 2 of the 48 bit value is
+ * the "8"-valued bit, and so on.)  In fact, a combined "SPE"-box lookup is
+ * used, in which the output is the 64 bit result of an S-box lookup which
+ * has been permuted by P and expanded by E, and is ready for use in the next
+ * iteration.  Two 32-bit wide tables, SPE[0] and SPE[1], are used for this
+ * lookup.  Since each byte in the 48 bit path is a multiple of four, indexed
+ * lookup of SPE[0] and SPE[1] is simple and fast.  The key schedule and
+ * "salt" are also converted to this 8*(6+2) format.  The SPE table size is
+ * 8*64*8 = 4K bytes.
+ *
+ * To speed up bit-parallel operations (such as XOR), the 8 byte
+ * representation is "union"ed with 32 bit values "i0" and "i1", and, on
+ * machines which support it, a 64 bit value "b64".  This data structure,
+ * "C_block", has two problems.  First, alignment restrictions must be
+ * honored.  Second, the byte-order (e.g. little-endian or big-endian) of
+ * the architecture becomes visible.
+ *
+ * The byte-order problem is unfortunate, since on the one hand it is good
+ * to have a machine-independent C_block representation (bits 1..8 in the
+ * first byte, etc.), and on the other hand it is good for the LSB of the
+ * first byte to be the LSB of i0.  We cannot have both these things, so we
+ * currently use the "little-endian" representation and avoid any multi-byte
+ * operations that depend on byte order.  This largely precludes use of the
+ * 64-bit datatype since the relative order of i0 and i1 are unknown.  It
+ * also inhibits grouping the SPE table to look up 12 bits at a time.  (The
+ * 12 bits can be stored in a 16-bit field with 3 low-order zeroes and 1
+ * high-order zero, providing fast indexing into a 64-bit wide SPE.)  On the
+ * other hand, 64-bit datatypes are currently rare, and a 12-bit SPE lookup
+ * requires a 128 kilobyte table, so perhaps this is not a big loss.
+ *
+ * Permutation representation (Jim Gillogly):
+ *
+ * A transformation is defined by its effect on each of the 8 bytes of the
+ * 64-bit input.  For each byte we give a 64-bit output that has the bits in
+ * the input distributed appropriately.  The transformation is then the OR
+ * of the 8 sets of 64-bits.  This uses 8*256*8 = 16K bytes of storage for
+ * each transformation.  Unless LARGEDATA is defined, however, a more compact
+ * table is used which looks up 16 4-bit "chunks" rather than 8 8-bit chunks.
+ * The smaller table uses 16*16*8 = 2K bytes for each transformation.  This
+ * is slower but tolerable, particularly for password encryption in which
+ * the SPE transformation is iterated many times.  The small tables total 9K
+ * bytes, the large tables total 72K bytes.
+ *
+ * The transformations used are:
+ * IE3264: MSB->LSB conversion, initial permutation, and expansion.
+ *     This is done by collecting the 32 even-numbered bits and applying
+ *     a 32->64 bit transformation, and then collecting the 32 odd-numbered
+ *     bits and applying the same transformation.  Since there are only
+ *     32 input bits, the IE3264 transformation table is half the size of
+ *     the usual table.
+ * CF6464: Compression, final permutation, and LSB->MSB conversion.
+ *     This is done by two trivial 48->32 bit compressions to obtain
+ *     a 64-bit block (the bit numbering is given in the "CIFP" table)
+ *     followed by a 64->64 bit "cleanup" transformation.  (It would
+ *     be possible to group the bits in the 64-bit block so that 2
+ *     identical 32->32 bit transformations could be used instead,
+ *     saving a factor of 4 in space and possibly 2 in time, but
+ *     byte-ordering and other complications rear their ugly head.
+ *     Similar opportunities/problems arise in the key schedule
+ *     transforms.)
+ * PC1ROT: MSB->LSB, PC1 permutation, rotate, and PC2 permutation.
+ *     This admittedly baroque 64->64 bit transformation is used to
+ *     produce the first code (in 8*(6+2) format) of the key schedule.
+ * PC2ROT[0]: Inverse PC2 permutation, rotate, and PC2 permutation.
+ *     It would be possible to define 15 more transformations, each
+ *     with a different rotation, to generate the entire key schedule.
+ *     To save space, however, we instead permute each code into the
+ *     next by using a transformation that "undoes" the PC2 permutation,
+ *     rotates the code, and then applies PC2.  Unfortunately, PC2
+ *     transforms 56 bits into 48 bits, dropping 8 bits, so PC2 is not
+ *     invertible.  We get around that problem by using a modified PC2
+ *     which retains the 8 otherwise-lost bits in the unused low-order
+ *     bits of each byte.  The low-order bits are cleared when the
+ *     codes are stored into the key schedule.
+ * PC2ROT[1]: Same as PC2ROT[0], but with two rotations.
+ *     This is faster than applying PC2ROT[0] twice,
+ *
+ * The Bell Labs "salt" (Bob Baldwin):
+ *
+ * The salting is a simple permutation applied to the 48-bit result of E.
+ * Specifically, if bit i (1 <= i <= 24) of the salt is set then bits i and
+ * i+24 of the result are swapped.  The salt is thus a 24 bit number, with
+ * 16777216 possible values.  (The original salt was 12 bits and could not
+ * swap bits 13..24 with 36..48.)
+ *
+ * It is possible, but ugly, to warp the SPE table to account for the salt
+ * permutation.  Fortunately, the conditional bit swapping requires only
+ * about four machine instructions and can be done on-the-fly with about an
+ * 8% performance penalty.
+ */
+
+typedef union {
+       unsigned char b[8];
+       struct {
+#if defined(LONG_IS_32_BITS)
+               /* long is often faster than a 32-bit bit field */
+               long    i0;
+               long    i1;
+#else
+               long    i0: 32;
+               long    i1: 32;
+#endif
+       } b32;
+#if defined(B64)
+       B64     b64;
+#endif
+} C_block;
+
+/*
+ * Convert twenty-four-bit long in host-order
+ * to six bits (and 2 low-order zeroes) per char little-endian format.
+ */
+#define        TO_SIX_BIT(rslt, src) {                         \
+               C_block cvt;                            \
+               cvt.b[0] = src; src >>= 6;              \
+               cvt.b[1] = src; src >>= 6;              \
+               cvt.b[2] = src; src >>= 6;              \
+               cvt.b[3] = src;                         \
+               rslt = (cvt.b32.i0 & 0x3f3f3f3fL) << 2; \
+       }
+
+/*
+ * These macros may someday permit efficient use of 64-bit integers.
+ */
+#define        ZERO(d,d0,d1)                   d0 = 0, d1 = 0
+#define        LOAD(d,d0,d1,bl)                d0 = (bl).b32.i0, d1 = (bl).b32.i1
+#define        LOADREG(d,d0,d1,s,s0,s1)        d0 = s0, d1 = s1
+#define        OR(d,d0,d1,bl)                  d0 |= (bl).b32.i0, d1 |= (bl).b32.i1
+#define        STORE(s,s0,s1,bl)               (bl).b32.i0 = s0, (bl).b32.i1 = s1
+#define        DCL_BLOCK(d,d0,d1)              long d0, d1
+
+#if defined(LARGEDATA)
+       /* Waste memory like crazy.  Also, do permutations in line */
+#define        LGCHUNKBITS     3
+#define        CHUNKBITS       (1<<LGCHUNKBITS)
+#define        PERM6464(d,d0,d1,cpp,p)                         \
+       LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]);             \
+       OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]);              \
+       OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]);              \
+       OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);              \
+       OR (d,d0,d1,(p)[(4<<CHUNKBITS)+(cpp)[4]]);              \
+       OR (d,d0,d1,(p)[(5<<CHUNKBITS)+(cpp)[5]]);              \
+       OR (d,d0,d1,(p)[(6<<CHUNKBITS)+(cpp)[6]]);              \
+       OR (d,d0,d1,(p)[(7<<CHUNKBITS)+(cpp)[7]]);
+#define        PERM3264(d,d0,d1,cpp,p)                         \
+       LOAD(d,d0,d1,(p)[(0<<CHUNKBITS)+(cpp)[0]]);             \
+       OR (d,d0,d1,(p)[(1<<CHUNKBITS)+(cpp)[1]]);              \
+       OR (d,d0,d1,(p)[(2<<CHUNKBITS)+(cpp)[2]]);              \
+       OR (d,d0,d1,(p)[(3<<CHUNKBITS)+(cpp)[3]]);
+#else
+       /* "small data" */
+#define        LGCHUNKBITS     2
+#define        CHUNKBITS       (1<<LGCHUNKBITS)
+#define        PERM6464(d,d0,d1,cpp,p)                         \
+       { C_block tblk; permute(cpp,&tblk,p,8); LOAD (d,d0,d1,tblk); }
+#define        PERM3264(d,d0,d1,cpp,p)                         \
+       { C_block tblk; permute(cpp,&tblk,p,4); LOAD (d,d0,d1,tblk); }
+
+STATIC void permute(cp, out, p, chars_in)
+       unsigned char *cp;
+       C_block *out;
+       register C_block *p;
+       int chars_in;
+{
+       register DCL_BLOCK(D,D0,D1);
+       register C_block *tp;
+       register int t;
+
+       ZERO(D,D0,D1);
+       do {
+               t = *cp++;
+               tp = &p[t&0xf]; OR(D,D0,D1,*tp); p += (1<<CHUNKBITS);
+               tp = &p[t>>4];  OR(D,D0,D1,*tp); p += (1<<CHUNKBITS);
+       } while (--chars_in > 0);
+       STORE(D,D0,D1,*out);
+}
+#endif /* LARGEDATA */
+
+
+/* =====  (mostly) Standard DES Tables ==================== */
+
+static unsigned char IP[] = {          /* initial permutation */
+       58, 50, 42, 34, 26, 18, 10,  2,
+       60, 52, 44, 36, 28, 20, 12,  4,
+       62, 54, 46, 38, 30, 22, 14,  6,
+       64, 56, 48, 40, 32, 24, 16,  8,
+       57, 49, 41, 33, 25, 17,  9,  1,
+       59, 51, 43, 35, 27, 19, 11,  3,
+       61, 53, 45, 37, 29, 21, 13,  5,
+       63, 55, 47, 39, 31, 23, 15,  7,
+};
+
+/* The final permutation is the inverse of IP - no table is necessary */
+
+static unsigned char ExpandTr[] = {    /* expansion operation */
+       32,  1,  2,  3,  4,  5,
+        4,  5,  6,  7,  8,  9,
+        8,  9, 10, 11, 12, 13,
+       12, 13, 14, 15, 16, 17,
+       16, 17, 18, 19, 20, 21,
+       20, 21, 22, 23, 24, 25,
+       24, 25, 26, 27, 28, 29,
+       28, 29, 30, 31, 32,  1,
+};
+
+static unsigned char PC1[] = {         /* permuted choice table 1 */
+       57, 49, 41, 33, 25, 17,  9,
+        1, 58, 50, 42, 34, 26, 18,
+       10,  2, 59, 51, 43, 35, 27,
+       19, 11,  3, 60, 52, 44, 36,
+
+       63, 55, 47, 39, 31, 23, 15,
+        7, 62, 54, 46, 38, 30, 22,
+       14,  6, 61, 53, 45, 37, 29,
+       21, 13,  5, 28, 20, 12,  4,
+};
+
+static unsigned char Rotates[] = {     /* PC1 rotation schedule */
+       1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
+};
+
+/* note: each "row" of PC2 is left-padded with bits that make it invertible */
+static unsigned char PC2[] = {         /* permuted choice table 2 */
+        9, 18,    14, 17, 11, 24,  1,  5,
+       22, 25,     3, 28, 15,  6, 21, 10,
+       35, 38,    23, 19, 12,  4, 26,  8,
+       43, 54,    16,  7, 27, 20, 13,  2,
+
+        0,  0,    41, 52, 31, 37, 47, 55,
+        0,  0,    30, 40, 51, 45, 33, 48,
+        0,  0,    44, 49, 39, 56, 34, 53,
+        0,  0,    46, 42, 50, 36, 29, 32,
+};
+
+static const unsigned char S[8][64] = {        /* 48->32 bit substitution tables */
+                                       /* S[1]                 */
+       14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
+        0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
+        4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
+       15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
+                                       /* S[2]                 */
+       15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
+        3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
+        0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
+       13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
+                                       /* S[3]                 */
+       10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
+       13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
+       13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
+        1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
+                                       /* S[4]                 */
+        7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
+       13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
+       10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
+        3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
+                                       /* S[5]                 */
+        2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
+       14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
+        4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
+       11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
+                                       /* S[6]                 */
+       12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
+       10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
+        9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
+        4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
+                                       /* S[7]                 */
+        4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
+       13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
+        1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
+        6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
+                                       /* S[8]                 */
+       13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
+        1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
+        7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
+        2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11,
+};
+
+static unsigned char P32Tr[] = {       /* 32-bit permutation function */
+       16,  7, 20, 21,
+       29, 12, 28, 17,
+        1, 15, 23, 26,
+        5, 18, 31, 10,
+        2,  8, 24, 14,
+       32, 27,  3,  9,
+       19, 13, 30,  6,
+       22, 11,  4, 25,
+};
+
+static unsigned char CIFP[] = {                /* compressed/interleaved permutation */
+        1,  2,  3,  4,   17, 18, 19, 20,
+        5,  6,  7,  8,   21, 22, 23, 24,
+        9, 10, 11, 12,   25, 26, 27, 28,
+       13, 14, 15, 16,   29, 30, 31, 32,
+
+       33, 34, 35, 36,   49, 50, 51, 52,
+       37, 38, 39, 40,   53, 54, 55, 56,
+       41, 42, 43, 44,   57, 58, 59, 60,
+       45, 46, 47, 48,   61, 62, 63, 64,
+};
+
+static unsigned char itoa64[] =                /* 0..63 => ascii-64 */
+       "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+
+/* =====  Tables that are initialized at run time  ==================== */
+
+
+static unsigned char a64toi[128];      /* ascii-64 => 0..63 */
+
+/* Initial key schedule permutation */
+static C_block PC1ROT[64/CHUNKBITS][1<<CHUNKBITS];
+
+/* Subsequent key schedule rotation permutations */
+static C_block PC2ROT[2][64/CHUNKBITS][1<<CHUNKBITS];
+
+/* Initial permutation/expansion table */
+static C_block IE3264[32/CHUNKBITS][1<<CHUNKBITS];
+
+/* Table that combines the S, P, and E operations.  */
+static long SPE[2][8][64];
+
+/* compressed/interleaved => final permutation table */
+static C_block CF6464[64/CHUNKBITS][1<<CHUNKBITS];
+
+
+/* ==================================== */
+
+
+static C_block constdatablock;                 /* encryption constant */
+static char    cryptresult[1+4+4+11+1];        /* encrypted result */
+
+/*
+ * Return a pointer to static data consisting of the "setting"
+ * followed by an encryption produced by the "key" and "setting".
+ */
+char *
+crypt(key, setting)
+       register const char *key;
+       register const char *setting;
+{
+       register char *encp;
+       register long i;
+       register int t;
+       long salt;
+       int num_iter, salt_size;
+       C_block keyblock, rsltblock;
+
+       for (i = 0; i < 8; i++) {
+               if ((t = 2*(unsigned char)(*key)) != 0)
+                       key++;
+               keyblock.b[i] = t;
+       }
+       if (des_setkey((char *)keyblock.b))     /* also initializes "a64toi" */
+               return (NULL);
+
+       encp = &cryptresult[0];
+       switch (*setting) {
+       case _PASSWORD_EFMT1:
+               /*
+                * Involve the rest of the password 8 characters at a time.
+                */
+               while (*key) {
+                       if (des_cipher((char *)&keyblock,
+                           (char *)&keyblock, 0L, 1))
+                               return (NULL);
+                       for (i = 0; i < 8; i++) {
+                               if ((t = 2*(unsigned char)(*key)) != 0)
+                                       key++;
+                               keyblock.b[i] ^= t;
+                       }
+                       if (des_setkey((char *)keyblock.b))
+                               return (NULL);
+               }
+
+               *encp++ = *setting++;
+
+               /* get iteration count */
+               num_iter = 0;
+               for (i = 4; --i >= 0; ) {
+                       if ((t = (unsigned char)setting[i]) == '\0')
+                               t = '.';
+                       encp[i] = t;
+                       num_iter = (num_iter<<6) | a64toi[t];
+               }
+               setting += 4;
+               encp += 4;
+               salt_size = 4;
+               break;
+       default:
+               num_iter = 25;
+               salt_size = 2;
+       }
+
+       salt = 0;
+       for (i = salt_size; --i >= 0; ) {
+               if ((t = (unsigned char)setting[i]) == '\0')
+                       t = '.';
+               encp[i] = t;
+               salt = (salt<<6) | a64toi[t];
+       }
+       encp += salt_size;
+       if (des_cipher((char *)&constdatablock, (char *)&rsltblock,
+           salt, num_iter))
+               return (NULL);
+
+       /*
+        * Encode the 64 cipher bits as 11 ascii characters.
+        */
+       i = ((long)((rsltblock.b[0]<<8) | rsltblock.b[1])<<8) | rsltblock.b[2];
+       encp[3] = itoa64[i&0x3f];       i >>= 6;
+       encp[2] = itoa64[i&0x3f];       i >>= 6;
+       encp[1] = itoa64[i&0x3f];       i >>= 6;
+       encp[0] = itoa64[i];            encp += 4;
+       i = ((long)((rsltblock.b[3]<<8) | rsltblock.b[4])<<8) | rsltblock.b[5];
+       encp[3] = itoa64[i&0x3f];       i >>= 6;
+       encp[2] = itoa64[i&0x3f];       i >>= 6;
+       encp[1] = itoa64[i&0x3f];       i >>= 6;
+       encp[0] = itoa64[i];            encp += 4;
+       i = ((long)((rsltblock.b[6])<<8) | rsltblock.b[7])<<2;
+       encp[2] = itoa64[i&0x3f];       i >>= 6;
+       encp[1] = itoa64[i&0x3f];       i >>= 6;
+       encp[0] = itoa64[i];
+
+       encp[3] = 0;
+
+       return (cryptresult);
+}
+
+
+/*
+ * The Key Schedule, filled in by des_setkey() or setkey().
+ */
+#define        KS_SIZE 16
+static C_block KS[KS_SIZE];
+
+/*
+ * Set up the key schedule from the key.
+ */
+STATIC int des_setkey(key)
+       register const char *key;
+{
+       register DCL_BLOCK(K, K0, K1);
+       register C_block *ptabp;
+       register int i;
+       static int des_ready = 0;
+
+       if (!des_ready) {
+               init_des();
+               des_ready = 1;
+       }
+
+       PERM6464(K,K0,K1,(unsigned char *)key,(C_block *)PC1ROT);
+       key = (char *)&KS[0];
+       STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);
+       for (i = 1; i < 16; i++) {
+               key += sizeof(C_block);
+               STORE(K,K0,K1,*(C_block *)key);
+               ptabp = (C_block *)PC2ROT[Rotates[i]-1];
+               PERM6464(K,K0,K1,(unsigned char *)key,ptabp);
+               STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);
+       }
+       return (0);
+}
+
+/*
+ * Encrypt (or decrypt if num_iter < 0) the 8 chars at "in" with abs(num_iter)
+ * iterations of DES, using the the given 24-bit salt and the pre-computed key
+ * schedule, and store the resulting 8 chars at "out" (in == out is permitted).
+ *
+ * NOTE: the performance of this routine is critically dependent on your
+ * compiler and machine architecture.
+ */
+STATIC int des_cipher(in, out, salt, num_iter)
+       const char *in;
+       char *out;
+       long salt;
+       int num_iter;
+{
+       /* variables that we want in registers, most important first */
+#if defined(pdp11)
+       register int j;
+#endif
+       register long L0, L1, R0, R1, k;
+       register C_block *kp;
+       register int ks_inc, loop_count;
+       C_block B;
+
+       L0 = salt;
+       TO_SIX_BIT(salt, L0);   /* convert to 4*(6+2) format */
+
+#if defined(vax) || defined(pdp11)
+       salt = ~salt;   /* "x &~ y" is faster than "x & y". */
+#define        SALT (~salt)
+#else
+#define        SALT salt
+#endif
+
+#if defined(MUST_ALIGN)
+       B.b[0] = in[0]; B.b[1] = in[1]; B.b[2] = in[2]; B.b[3] = in[3];
+       B.b[4] = in[4]; B.b[5] = in[5]; B.b[6] = in[6]; B.b[7] = in[7];
+       LOAD(L,L0,L1,B);
+#else
+       LOAD(L,L0,L1,*(C_block *)in);
+#endif
+       LOADREG(R,R0,R1,L,L0,L1);
+       L0 &= 0x55555555L;
+       L1 &= 0x55555555L;
+       L0 = (L0 << 1) | L1;    /* L0 is the even-numbered input bits */
+       R0 &= 0xaaaaaaaaL;
+       R1 = (R1 >> 1) & 0x55555555L;
+       L1 = R0 | R1;           /* L1 is the odd-numbered input bits */
+       STORE(L,L0,L1,B);
+       PERM3264(L,L0,L1,B.b,  (C_block *)IE3264);      /* even bits */
+       PERM3264(R,R0,R1,B.b+4,(C_block *)IE3264);      /* odd bits */
+
+       if (num_iter >= 0)
+       {               /* encryption */
+               kp = &KS[0];
+               ks_inc  = sizeof(*kp);
+       }
+       else
+       {               /* decryption */
+               num_iter = -num_iter;
+               kp = &KS[KS_SIZE-1];
+               ks_inc  = -sizeof(*kp);
+       }
+
+       while (--num_iter >= 0) {
+               loop_count = 8;
+               do {
+
+#define        SPTAB(t, i)     (*(long *)((unsigned char *)t + i*(sizeof(long)/4)))
+#if defined(gould)
+                       /* use this if B.b[i] is evaluated just once ... */
+#define        DOXOR(x,y,i)    x^=SPTAB(SPE[0][i],B.b[i]); y^=SPTAB(SPE[1][i],B.b[i]);
+#else
+#if defined(pdp11)
+                       /* use this if your "long" int indexing is slow */
+#define        DOXOR(x,y,i)    j=B.b[i]; x^=SPTAB(SPE[0][i],j); y^=SPTAB(SPE[1][i],j);
+#else
+                       /* use this if "k" is allocated to a register ... */
+#define        DOXOR(x,y,i)    k=B.b[i]; x^=SPTAB(SPE[0][i],k); y^=SPTAB(SPE[1][i],k);
+#endif
+#endif
+
+#define        CRUNCH(p0, p1, q0, q1)  \
+                       k = (q0 ^ q1) & SALT;   \
+                       B.b32.i0 = k ^ q0 ^ kp->b32.i0;         \
+                       B.b32.i1 = k ^ q1 ^ kp->b32.i1;         \
+                       kp = (C_block *)((char *)kp+ks_inc);    \
+                                                       \
+                       DOXOR(p0, p1, 0);               \
+                       DOXOR(p0, p1, 1);               \
+                       DOXOR(p0, p1, 2);               \
+                       DOXOR(p0, p1, 3);               \
+                       DOXOR(p0, p1, 4);               \
+                       DOXOR(p0, p1, 5);               \
+                       DOXOR(p0, p1, 6);               \
+                       DOXOR(p0, p1, 7);
+
+                       CRUNCH(L0, L1, R0, R1);
+                       CRUNCH(R0, R1, L0, L1);
+               } while (--loop_count != 0);
+               kp = (C_block *)((char *)kp-(ks_inc*KS_SIZE));
+
+
+               /* swap L and R */
+               L0 ^= R0;  L1 ^= R1;
+               R0 ^= L0;  R1 ^= L1;
+               L0 ^= R0;  L1 ^= R1;
+       }
+
+       /* store the encrypted (or decrypted) result */
+       L0 = ((L0 >> 3) & 0x0f0f0f0fL) | ((L1 << 1) & 0xf0f0f0f0L);
+       L1 = ((R0 >> 3) & 0x0f0f0f0fL) | ((R1 << 1) & 0xf0f0f0f0L);
+       STORE(L,L0,L1,B);
+       PERM6464(L,L0,L1,B.b, (C_block *)CF6464);
+#if defined(MUST_ALIGN)
+       STORE(L,L0,L1,B);
+       out[0] = B.b[0]; out[1] = B.b[1]; out[2] = B.b[2]; out[3] = B.b[3];
+       out[4] = B.b[4]; out[5] = B.b[5]; out[6] = B.b[6]; out[7] = B.b[7];
+#else
+       STORE(L,L0,L1,*(C_block *)out);
+#endif
+       return (0);
+}
+
+
+/*
+ * Initialize various tables.  This need only be done once.  It could even be
+ * done at compile time, if the compiler were capable of that sort of thing.
+ */
+STATIC void init_des()
+{
+       register int i, j;
+       register long k;
+       register int tableno;
+       static unsigned char perm[64], tmp32[32];       /* "static" for speed */
+
+       /*
+        * table that converts chars "./0-9A-Za-z"to integers 0-63.
+        */
+       for (i = 0; i < 64; i++)
+               a64toi[itoa64[i]] = i;
+
+       /*
+        * PC1ROT - bit reverse, then PC1, then Rotate, then PC2.
+        */
+       for (i = 0; i < 64; i++)
+               perm[i] = 0;
+       for (i = 0; i < 64; i++) {
+               if ((k = PC2[i]) == 0)
+                       continue;
+               k += Rotates[0]-1;
+               if ((k%28) < Rotates[0]) k -= 28;
+               k = PC1[k];
+               if (k > 0) {
+                       k--;
+                       k = (k|07) - (k&07);
+                       k++;
+               }
+               perm[i] = k;
+       }
+#ifdef DEBUG
+       prtab("pc1tab", perm, 8);
+#endif
+       init_perm(PC1ROT, perm, 8, 8);
+
+       /*
+        * PC2ROT - PC2 inverse, then Rotate (once or twice), then PC2.
+        */
+       for (j = 0; j < 2; j++) {
+               unsigned char pc2inv[64];
+               for (i = 0; i < 64; i++)
+                       perm[i] = pc2inv[i] = 0;
+               for (i = 0; i < 64; i++) {
+                       if ((k = PC2[i]) == 0)
+                               continue;
+                       pc2inv[k-1] = i+1;
+               }
+               for (i = 0; i < 64; i++) {
+                       if ((k = PC2[i]) == 0)
+                               continue;
+                       k += j;
+                       if ((k%28) <= j) k -= 28;
+                       perm[i] = pc2inv[k];
+               }
+#ifdef DEBUG
+               prtab("pc2tab", perm, 8);
+#endif
+               init_perm(PC2ROT[j], perm, 8, 8);
+       }
+
+       /*
+        * Bit reverse, then initial permutation, then expansion.
+        */
+       for (i = 0; i < 8; i++) {
+               for (j = 0; j < 8; j++) {
+                       k = (j < 2)? 0: IP[ExpandTr[i*6+j-2]-1];
+                       if (k > 32)
+                               k -= 32;
+                       else if (k > 0)
+                               k--;
+                       if (k > 0) {
+                               k--;
+                               k = (k|07) - (k&07);
+                               k++;
+                       }
+                       perm[i*8+j] = k;
+               }
+       }
+#ifdef DEBUG
+       prtab("ietab", perm, 8);
+#endif
+       init_perm(IE3264, perm, 4, 8);
+
+       /*
+        * Compression, then final permutation, then bit reverse.
+        */
+       for (i = 0; i < 64; i++) {
+               k = IP[CIFP[i]-1];
+               if (k > 0) {
+                       k--;
+                       k = (k|07) - (k&07);
+                       k++;
+               }
+               perm[k-1] = i+1;
+       }
+#ifdef DEBUG
+       prtab("cftab", perm, 8);
+#endif
+       init_perm(CF6464, perm, 8, 8);
+
+       /*
+        * SPE table
+        */
+       for (i = 0; i < 48; i++)
+               perm[i] = P32Tr[ExpandTr[i]-1];
+       for (tableno = 0; tableno < 8; tableno++) {
+               for (j = 0; j < 64; j++)  {
+                       k = (((j >> 0) &01) << 5)|
+                           (((j >> 1) &01) << 3)|
+                           (((j >> 2) &01) << 2)|
+                           (((j >> 3) &01) << 1)|
+                           (((j >> 4) &01) << 0)|
+                           (((j >> 5) &01) << 4);
+                       k = S[tableno][k];
+                       k = (((k >> 3)&01) << 0)|
+                           (((k >> 2)&01) << 1)|
+                           (((k >> 1)&01) << 2)|
+                           (((k >> 0)&01) << 3);
+                       for (i = 0; i < 32; i++)
+                               tmp32[i] = 0;
+                       for (i = 0; i < 4; i++)
+                               tmp32[4 * tableno + i] = (k >> i) & 01;
+                       k = 0;
+                       for (i = 24; --i >= 0; )
+                               k = (k<<1) | tmp32[perm[i]-1];
+                       TO_SIX_BIT(SPE[0][tableno][j], k);
+                       k = 0;
+                       for (i = 24; --i >= 0; )
+                               k = (k<<1) | tmp32[perm[i+24]-1];
+                       TO_SIX_BIT(SPE[1][tableno][j], k);
+               }
+       }
+}
+
+/*
+ * Initialize "perm" to represent transformation "p", which rearranges
+ * (perhaps with expansion and/or contraction) one packed array of bits
+ * (of size "chars_in" characters) into another array (of size "chars_out"
+ * characters).
+ *
+ * "perm" must be all-zeroes on entry to this routine.
+ */
+STATIC void init_perm(perm, p, chars_in, chars_out)
+       C_block perm[64/CHUNKBITS][1<<CHUNKBITS];
+       unsigned char p[64];
+       int chars_in, chars_out;
+{
+       register int i, j, k, l;
+
+       for (k = 0; k < chars_out*8; k++) {     /* each output bit position */
+               l = p[k] - 1;           /* where this bit comes from */
+               if (l < 0)
+                       continue;       /* output bit is always 0 */
+               i = l>>LGCHUNKBITS;     /* which chunk this bit comes from */
+               l = 1<<(l&(CHUNKBITS-1));       /* mask for this bit */
+               for (j = 0; j < (1<<CHUNKBITS); j++) {  /* each chunk value */
+                       if ((j & l) != 0)
+                               perm[i][j].b[k>>3] |= 1<<(k&07);
+               }
+       }
+}
+
+/*
+ * "setkey" routine (for backwards compatibility)
+ */
+int setkey(key)
+       register const char *key;
+{
+       register int i, j, k;
+       C_block keyblock;
+
+       for (i = 0; i < 8; i++) {
+               k = 0;
+               for (j = 0; j < 8; j++) {
+                       k <<= 1;
+                       k |= (unsigned char)*key++;
+               }
+               keyblock.b[i] = k;
+       }
+       return (des_setkey((char *)keyblock.b));
+}
+
+/*
+ * "encrypt" routine (for backwards compatibility)
+ */
+int encrypt(block, flag)
+       register char *block;
+       int flag;
+{
+       register int i, j, k;
+       C_block cblock;
+
+       for (i = 0; i < 8; i++) {
+               k = 0;
+               for (j = 0; j < 8; j++) {
+                       k <<= 1;
+                       k |= (unsigned char)*block++;
+               }
+               cblock.b[i] = k;
+       }
+       if (des_cipher((char *)&cblock, (char *)&cblock, 0L, (flag ? -1: 1)))
+               return (1);
+       for (i = 7; i >= 0; i--) {
+               k = cblock.b[i];
+               for (j = 7; j >= 0; j--) {
+                       *--block = k&01;
+                       k >>= 1;
+               }
+       }
+       return (0);
+}
+
+#ifdef DEBUG
+STATIC
+prtab(s, t, num_rows)
+       char *s;
+       unsigned char *t;
+       int num_rows;
+{
+       register int i, j;
+
+       (void)printf("%s:\n", s);
+       for (i = 0; i < num_rows; i++) {
+               for (j = 0; j < 8; j++) {
+                        (void)printf("%3d", t[i*8+j]);
+               }
+               (void)printf("\n");
+       }
+       (void)printf("\n");
+}
+#endif
diff --git a/gen.subproj/ctermid.c b/gen.subproj/ctermid.c
new file mode 100644 (file)
index 0000000..507c9cf
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <paths.h>
+#include <string.h>
+
+char *
+ctermid(s)
+       char *s;
+{
+       static char def[] = _PATH_TTY;
+
+       if (s) {
+               bcopy(def, s, sizeof(_PATH_TTY));
+               return(s);
+       }
+       return(def);
+}
diff --git a/gen.subproj/ctime.c b/gen.subproj/ctime.c
new file mode 100644 (file)
index 0000000..d8b0656
--- /dev/null
@@ -0,0 +1,1399 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Arthur David Olson of the National Cancer Institute.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+** Leap second handling from Bradley White (bww@k.gp.cs.cmu.edu).
+** POSIX-style TZ environment variable handling from Guy Harris
+** (guy@auspex.com).
+*/
+
+/*LINTLIBRARY*/
+
+#include <sys/param.h>
+#include <fcntl.h>
+#include <time.h>
+#include <tzfile.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#ifdef __STDC__
+#include <stdlib.h>
+
+#define P(s)           s
+#define alloc_size_t   size_t
+#define qsort_size_t   size_t
+#define fread_size_t   size_t
+#define fwrite_size_t  size_t
+
+#else /* !defined __STDC__ */
+
+#define P(s)           ()
+
+typedef char *         genericptr_t;
+typedef unsigned       alloc_size_t;
+typedef int            qsort_size_t;
+typedef int            fread_size_t;
+typedef int            fwrite_size_t;
+
+extern char *  calloc();
+extern char *  malloc();
+extern char *  realloc();
+extern char *  getenv();
+
+#endif /* !defined __STDC__ */
+
+extern time_t  time();
+
+#define ACCESS_MODE    O_RDONLY
+#define OPEN_MODE      O_RDONLY
+
+#ifndef WILDABBR
+/*
+** Someone might make incorrect use of a time zone abbreviation:
+**     1.      They might reference tzname[0] before calling tzset (explicitly
+**             or implicitly).
+**     2.      They might reference tzname[1] before calling tzset (explicitly
+**             or implicitly).
+**     3.      They might reference tzname[1] after setting to a time zone
+**             in which Daylight Saving Time is never observed.
+**     4.      They might reference tzname[0] after setting to a time zone
+**             in which Standard Time is never observed.
+**     5.      They might reference tm.TM_ZONE after calling offtime.
+** What's best to do in the above cases is open to debate;
+** for now, we just set things up so that in any of the five cases
+** WILDABBR is used.  Another possibility:  initialize tzname[0] to the
+** string "tzname[0] used before set", and similarly for the other cases.
+** And another:  initialize tzname[0] to "ERA", with an explanation in the
+** manual page of what this "time zone abbreviation" means (doing this so
+** that tzname[0] has the "normal" length of three characters).
+*/
+#define WILDABBR       "   "
+#endif /* !defined WILDABBR */
+
+#ifndef TRUE
+#define TRUE           1
+#define FALSE          0
+#endif /* !defined TRUE */
+
+static const char GMT[] = "GMT";
+
+struct ttinfo {                                /* time type information */
+       long            tt_gmtoff;      /* GMT offset in seconds */
+       int             tt_isdst;       /* used to set tm_isdst */
+       int             tt_abbrind;     /* abbreviation list index */
+       int             tt_ttisstd;     /* TRUE if transition is std time */
+};
+
+struct lsinfo {                                /* leap second information */
+       time_t          ls_trans;       /* transition time */
+       long            ls_corr;        /* correction to apply */
+};
+
+struct state {
+       int             leapcnt;
+       int             timecnt;
+       int             typecnt;
+       int             charcnt;
+       time_t          ats[TZ_MAX_TIMES];
+       unsigned char   types[TZ_MAX_TIMES];
+       struct ttinfo   ttis[TZ_MAX_TYPES];
+       char            chars[(TZ_MAX_CHARS + 1 > sizeof GMT) ?
+                               TZ_MAX_CHARS + 1 : sizeof GMT];
+       struct lsinfo   lsis[TZ_MAX_LEAPS];
+};
+
+struct rule {
+       int             r_type;         /* type of rule--see below */
+       int             r_day;          /* day number of rule */
+       int             r_week;         /* week number of rule */
+       int             r_mon;          /* month number of rule */
+       long            r_time;         /* transition time of rule */
+};
+
+#define        JULIAN_DAY              0       /* Jn - Julian day */
+#define        DAY_OF_YEAR             1       /* n - day of year */
+#define        MONTH_NTH_DAY_OF_WEEK   2       /* Mm.n.d - month, week, day of week */
+
+/*
+** Prototypes for static functions.
+*/
+
+static long            detzcode P((const char * codep));
+static const char *    getzname P((const char * strp));
+static const char *    getnum P((const char * strp, int * nump, int min,
+                               int max));
+static const char *    getsecs P((const char * strp, long * secsp));
+static const char *    getoffset P((const char * strp, long * offsetp));
+static const char *    getrule P((const char * strp, struct rule * rulep));
+static void            gmtload P((struct state * sp));
+static void            gmtsub P((const time_t * timep, long offset,
+                               struct tm * tmp));
+static void            localsub P((const time_t * timep, long offset,
+                               struct tm * tmp));
+static void            normalize P((int * tensptr, int * unitsptr, int base));
+static void            settzname P((void));
+static time_t          time1 P((struct tm * tmp, void (* funcp)(),
+                               long offset));
+static time_t          time2 P((struct tm *tmp, void (* funcp)(),
+                               long offset, int * okayp));
+static void            timesub P((const time_t * timep, long offset,
+                               const struct state * sp, struct tm * tmp));
+static int             tmcomp P((const struct tm * atmp,
+                               const struct tm * btmp));
+static time_t          transtime P((time_t janfirst, int year,
+                               const struct rule * rulep, long offset));
+static int             tzload P((const char * name, struct state * sp));
+static int             tzparse P((const char * name, struct state * sp,
+                               int lastditch));
+
+#ifdef ALL_STATE
+static struct state *  lclptr;
+static struct state *  gmtptr;
+#endif /* defined ALL_STATE */
+
+#ifndef ALL_STATE
+static struct state    lclmem;
+static struct state    gmtmem;
+#define lclptr         (&lclmem)
+#define gmtptr         (&gmtmem)
+#endif /* State Farm */
+
+static int             lcl_is_set;
+static int             gmt_is_set;
+
+char *                 tzname[2] = {
+       WILDABBR,
+       WILDABBR
+};
+
+#ifdef USG_COMPAT
+time_t                 timezone = 0;
+int                    daylight = 0;
+#endif /* defined USG_COMPAT */
+
+#ifdef ALTZONE
+time_t                 altzone = 0;
+#endif /* defined ALTZONE */
+
+static long
+detzcode(codep)
+const char * const     codep;
+{
+       register long   result;
+       register int    i;
+
+       result = 0;
+       for (i = 0; i < 4; ++i)
+               result = (result << 8) | (codep[i] & 0xff);
+       return result;
+}
+
+static void
+settzname()
+{
+       register const struct state * const     sp = lclptr;
+       register int                            i;
+
+       tzname[0] = WILDABBR;
+       tzname[1] = WILDABBR;
+#ifdef USG_COMPAT
+       daylight = 0;
+       timezone = 0;
+#endif /* defined USG_COMPAT */
+#ifdef ALTZONE
+       altzone = 0;
+#endif /* defined ALTZONE */
+#ifdef ALL_STATE
+       if (sp == NULL) {
+               tzname[0] = tzname[1] = GMT;
+               return;
+       }
+#endif /* defined ALL_STATE */
+       for (i = 0; i < sp->typecnt; ++i) {
+               register const struct ttinfo * const    ttisp = &sp->ttis[i];
+
+               tzname[ttisp->tt_isdst] =
+                       (char *) &sp->chars[ttisp->tt_abbrind];
+#ifdef USG_COMPAT
+               if (ttisp->tt_isdst)
+                       daylight = 1;
+               if (i == 0 || !ttisp->tt_isdst)
+                       timezone = -(ttisp->tt_gmtoff);
+#endif /* defined USG_COMPAT */
+#ifdef ALTZONE
+               if (i == 0 || ttisp->tt_isdst)
+                       altzone = -(ttisp->tt_gmtoff);
+#endif /* defined ALTZONE */
+       }
+       /*
+       ** And to get the latest zone names into tzname. . .
+       */
+       for (i = 0; i < sp->timecnt; ++i) {
+               register const struct ttinfo * const    ttisp =
+                                                       &sp->ttis[sp->types[i]];
+
+               tzname[ttisp->tt_isdst] =
+                       (char *) &sp->chars[ttisp->tt_abbrind];
+       }
+}
+
+static int
+tzload(name, sp)
+register const char *          name;
+register struct state * const  sp;
+{
+       register const char *   p;
+       register int            i;
+       register int            fid;
+
+       if (name == NULL && (name = TZDEFAULT) == NULL)
+               return -1;
+       {
+               char            fullname[FILENAME_MAX + 1];
+
+               if (name[0] == ':')
+                       ++name;
+               if (name[0] != '/') {
+                       if ((p = TZDIR) == NULL)
+                               return -1;
+                       if ((strlen(p) + strlen(name) + 1) >= sizeof fullname)
+                               return -1;
+                       (void) strcpy(fullname, p);
+                       (void) strcat(fullname, "/");
+                       (void) strcat(fullname, name);
+                       name = fullname;
+               }
+               if ((fid = open(name, OPEN_MODE)) == -1)
+                       return -1;
+       }
+       {
+               register const struct tzhead *  tzhp;
+               char                            buf[sizeof *sp + sizeof *tzhp];
+               int                             ttisstdcnt;
+
+               i = read(fid, buf, sizeof buf);
+               if (close(fid) != 0 || i < sizeof *tzhp)
+                       return -1;
+               tzhp = (struct tzhead *) buf;
+               ttisstdcnt = (int) detzcode(tzhp->tzh_ttisstdcnt);
+               sp->leapcnt = (int) detzcode(tzhp->tzh_leapcnt);
+               sp->timecnt = (int) detzcode(tzhp->tzh_timecnt);
+               sp->typecnt = (int) detzcode(tzhp->tzh_typecnt);
+               sp->charcnt = (int) detzcode(tzhp->tzh_charcnt);
+               if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS ||
+                       sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES ||
+                       sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES ||
+                       sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS ||
+                       (ttisstdcnt != sp->typecnt && ttisstdcnt != 0))
+                               return -1;
+               if (i < sizeof *tzhp +
+                       sp->timecnt * (4 + sizeof (char)) +
+                       sp->typecnt * (4 + 2 * sizeof (char)) +
+                       sp->charcnt * sizeof (char) +
+                       sp->leapcnt * 2 * 4 +
+                       ttisstdcnt * sizeof (char))
+                               return -1;
+               p = buf + sizeof *tzhp;
+               for (i = 0; i < sp->timecnt; ++i) {
+                       sp->ats[i] = detzcode(p);
+                       p += 4;
+               }
+               for (i = 0; i < sp->timecnt; ++i) {
+                       sp->types[i] = (unsigned char) *p++;
+                       if (sp->types[i] >= sp->typecnt)
+                               return -1;
+               }
+               for (i = 0; i < sp->typecnt; ++i) {
+                       register struct ttinfo *        ttisp;
+
+                       ttisp = &sp->ttis[i];
+                       ttisp->tt_gmtoff = detzcode(p);
+                       p += 4;
+                       ttisp->tt_isdst = (unsigned char) *p++;
+                       if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1)
+                               return -1;
+                       ttisp->tt_abbrind = (unsigned char) *p++;
+                       if (ttisp->tt_abbrind < 0 ||
+                               ttisp->tt_abbrind > sp->charcnt)
+                                       return -1;
+               }
+               for (i = 0; i < sp->charcnt; ++i)
+                       sp->chars[i] = *p++;
+               sp->chars[i] = '\0';    /* ensure '\0' at end */
+               for (i = 0; i < sp->leapcnt; ++i) {
+                       register struct lsinfo *        lsisp;
+
+                       lsisp = &sp->lsis[i];
+                       lsisp->ls_trans = detzcode(p);
+                       p += 4;
+                       lsisp->ls_corr = detzcode(p);
+                       p += 4;
+               }
+               for (i = 0; i < sp->typecnt; ++i) {
+                       register struct ttinfo *        ttisp;
+
+                       ttisp = &sp->ttis[i];
+                       if (ttisstdcnt == 0)
+                               ttisp->tt_ttisstd = FALSE;
+                       else {
+                               ttisp->tt_ttisstd = *p++;
+                               if (ttisp->tt_ttisstd != TRUE &&
+                                       ttisp->tt_ttisstd != FALSE)
+                                               return -1;
+                       }
+               }
+       }
+       return 0;
+}
+
+static const int       mon_lengths[2][MONSPERYEAR] = {
+       31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
+       31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
+};
+
+static const int       year_lengths[2] = {
+       DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+/*
+** Given a pointer into a time zone string, scan until a character that is not
+** a valid character in a zone name is found.  Return a pointer to that
+** character.
+*/
+
+static const char *
+getzname(strp)
+register const char *  strp;
+{
+       register char   c;
+
+       while ((c = *strp) != '\0' && !isdigit(c) && c != ',' && c != '-' &&
+               c != '+')
+                       ++strp;
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a number from that string.
+** Check that the number is within a specified range; if it is not, return
+** NULL.
+** Otherwise, return a pointer to the first character not part of the number.
+*/
+
+static const char *
+getnum(strp, nump, min, max)
+register const char *  strp;
+int * const            nump;
+const int              min;
+const int              max;
+{
+       register char   c;
+       register int    num;
+
+       if (strp == NULL || !isdigit(*strp))
+               return NULL;
+       num = 0;
+       while ((c = *strp) != '\0' && isdigit(c)) {
+               num = num * 10 + (c - '0');
+               if (num > max)
+                       return NULL;    /* illegal value */
+               ++strp;
+       }
+       if (num < min)
+               return NULL;            /* illegal value */
+       *nump = num;
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a number of seconds,
+** in hh[:mm[:ss]] form, from the string.
+** If any error occurs, return NULL.
+** Otherwise, return a pointer to the first character not part of the number
+** of seconds.
+*/
+
+static const char *
+getsecs(strp, secsp)
+register const char *  strp;
+long * const           secsp;
+{
+       int     num;
+
+       strp = getnum(strp, &num, 0, HOURSPERDAY);
+       if (strp == NULL)
+               return NULL;
+       *secsp = num * SECSPERHOUR;
+       if (*strp == ':') {
+               ++strp;
+               strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
+               if (strp == NULL)
+                       return NULL;
+               *secsp += num * SECSPERMIN;
+               if (*strp == ':') {
+                       ++strp;
+                       strp = getnum(strp, &num, 0, SECSPERMIN - 1);
+                       if (strp == NULL)
+                               return NULL;
+                       *secsp += num;
+               }
+       }
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract an offset, in
+** [+-]hh[:mm[:ss]] form, from the string.
+** If any error occurs, return NULL.
+** Otherwise, return a pointer to the first character not part of the time.
+*/
+
+static const char *
+getoffset(strp, offsetp)
+register const char *  strp;
+long * const           offsetp;
+{
+       register int    neg;
+
+       if (*strp == '-') {
+               neg = 1;
+               ++strp;
+       } else if (isdigit(*strp) || *strp++ == '+')
+               neg = 0;
+       else    return NULL;            /* illegal offset */
+       strp = getsecs(strp, offsetp);
+       if (strp == NULL)
+               return NULL;            /* illegal time */
+       if (neg)
+               *offsetp = -*offsetp;
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a rule in the form
+** date[/time].  See POSIX section 8 for the format of "date" and "time".
+** If a valid rule is not found, return NULL.
+** Otherwise, return a pointer to the first character not part of the rule.
+*/
+
+static const char *
+getrule(strp, rulep)
+const char *                   strp;
+register struct rule * const   rulep;
+{
+       if (*strp == 'J') {
+               /*
+               ** Julian day.
+               */
+               rulep->r_type = JULIAN_DAY;
+               ++strp;
+               strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
+       } else if (*strp == 'M') {
+               /*
+               ** Month, week, day.
+               */
+               rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
+               ++strp;
+               strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
+               if (strp == NULL)
+                       return NULL;
+               if (*strp++ != '.')
+                       return NULL;
+               strp = getnum(strp, &rulep->r_week, 1, 5);
+               if (strp == NULL)
+                       return NULL;
+               if (*strp++ != '.')
+                       return NULL;
+               strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
+       } else if (isdigit(*strp)) {
+               /*
+               ** Day of year.
+               */
+               rulep->r_type = DAY_OF_YEAR;
+               strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
+       } else  return NULL;            /* invalid format */
+       if (strp == NULL)
+               return NULL;
+       if (*strp == '/') {
+               /*
+               ** Time specified.
+               */
+               ++strp;
+               strp = getsecs(strp, &rulep->r_time);
+       } else  rulep->r_time = 2 * SECSPERHOUR;        /* default = 2:00:00 */
+       return strp;
+}
+
+/*
+** Given the Epoch-relative time of January 1, 00:00:00 GMT, in a year, the
+** year, a rule, and the offset from GMT at the time that rule takes effect,
+** calculate the Epoch-relative time that rule takes effect.
+*/
+
+static time_t
+transtime(janfirst, year, rulep, offset)
+const time_t                           janfirst;
+const int                              year;
+register const struct rule * const     rulep;
+const long                             offset;
+{
+       register int    leapyear;
+       register time_t value;
+       register int    i;
+       int             d, m1, yy0, yy1, yy2, dow;
+
+       leapyear = isleap(year);
+       switch (rulep->r_type) {
+
+       case JULIAN_DAY:
+               /*
+               ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap
+               ** years.
+               ** In non-leap years, or if the day number is 59 or less, just
+               ** add SECSPERDAY times the day number-1 to the time of
+               ** January 1, midnight, to get the day.
+               */
+               value = janfirst + (rulep->r_day - 1) * SECSPERDAY;
+               if (leapyear && rulep->r_day >= 60)
+                       value += SECSPERDAY;
+               break;
+
+       case DAY_OF_YEAR:
+               /*
+               ** n - day of year.
+               ** Just add SECSPERDAY times the day number to the time of
+               ** January 1, midnight, to get the day.
+               */
+               value = janfirst + rulep->r_day * SECSPERDAY;
+               break;
+
+       case MONTH_NTH_DAY_OF_WEEK:
+               /*
+               ** Mm.n.d - nth "dth day" of month m.
+               */
+               value = janfirst;
+               for (i = 0; i < rulep->r_mon - 1; ++i)
+                       value += mon_lengths[leapyear][i] * SECSPERDAY;
+
+               /*
+               ** Use Zeller's Congruence to get day-of-week of first day of
+               ** month.
+               */
+               m1 = (rulep->r_mon + 9) % 12 + 1;
+               yy0 = (rulep->r_mon <= 2) ? (year - 1) : year;
+               yy1 = yy0 / 100;
+               yy2 = yy0 % 100;
+               dow = ((26 * m1 - 2) / 10 +
+                       1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7;
+               if (dow < 0)
+                       dow += DAYSPERWEEK;
+
+               /*
+               ** "dow" is the day-of-week of the first day of the month.  Get
+               ** the day-of-month (zero-origin) of the first "dow" day of the
+               ** month.
+               */
+               d = rulep->r_day - dow;
+               if (d < 0)
+                       d += DAYSPERWEEK;
+               for (i = 1; i < rulep->r_week; ++i) {
+                       if (d + DAYSPERWEEK >=
+                               mon_lengths[leapyear][rulep->r_mon - 1])
+                                       break;
+                       d += DAYSPERWEEK;
+               }
+
+               /*
+               ** "d" is the day-of-month (zero-origin) of the day we want.
+               */
+               value += d * SECSPERDAY;
+               break;
+       }
+
+       /*
+       ** "value" is the Epoch-relative time of 00:00:00 GMT on the day in
+       ** question.  To get the Epoch-relative time of the specified local
+       ** time on that day, add the transition time and the current offset
+       ** from GMT.
+       */
+       return value + rulep->r_time + offset;
+}
+
+/*
+** Given a POSIX section 8-style TZ string, fill in the rule tables as
+** appropriate.
+*/
+
+static int
+tzparse(name, sp, lastditch)
+const char *                   name;
+register struct state * const  sp;
+const int                      lastditch;
+{
+       const char *                    stdname;
+       const char *                    dstname;
+       int                             stdlen;
+       int                             dstlen;
+       long                            stdoffset;
+       long                            dstoffset;
+       register time_t *               atp;
+       register unsigned char *        typep;
+       register char *                 cp;
+       register int                    load_result;
+
+       stdname = name;
+       if (lastditch) {
+               stdlen = strlen(name);  /* length of standard zone name */
+               name += stdlen;
+               if (stdlen >= sizeof sp->chars)
+                       stdlen = (sizeof sp->chars) - 1;
+       } else {
+               name = getzname(name);
+               stdlen = name - stdname;
+               if (stdlen < 3)
+                       return -1;
+       }
+       if (*name == '\0')
+               return -1;
+       else {
+               name = getoffset(name, &stdoffset);
+               if (name == NULL)
+                       return -1;
+       }
+       load_result = tzload(TZDEFRULES, sp);
+       if (load_result != 0)
+               sp->leapcnt = 0;                /* so, we're off a little */
+       if (*name != '\0') {
+               dstname = name;
+               name = getzname(name);
+               dstlen = name - dstname;        /* length of DST zone name */
+               if (dstlen < 3)
+                       return -1;
+               if (*name != '\0' && *name != ',' && *name != ';') {
+                       name = getoffset(name, &dstoffset);
+                       if (name == NULL)
+                               return -1;
+               } else  dstoffset = stdoffset - SECSPERHOUR;
+               if (*name == ',' || *name == ';') {
+                       struct rule     start;
+                       struct rule     end;
+                       register int    year;
+                       register time_t janfirst;
+                       time_t          starttime;
+                       time_t          endtime;
+
+                       ++name;
+                       if ((name = getrule(name, &start)) == NULL)
+                               return -1;
+                       if (*name++ != ',')
+                               return -1;
+                       if ((name = getrule(name, &end)) == NULL)
+                               return -1;
+                       if (*name != '\0')
+                               return -1;
+                       sp->typecnt = 2;        /* standard time and DST */
+                       /*
+                       ** Two transitions per year, from EPOCH_YEAR to 2037.
+                       */
+                       sp->timecnt = 2 * (2037 - EPOCH_YEAR + 1);
+                       if (sp->timecnt > TZ_MAX_TIMES)
+                               return -1;
+                       sp->ttis[0].tt_gmtoff = -dstoffset;
+                       sp->ttis[0].tt_isdst = 1;
+                       sp->ttis[0].tt_abbrind = stdlen + 1;
+                       sp->ttis[1].tt_gmtoff = -stdoffset;
+                       sp->ttis[1].tt_isdst = 0;
+                       sp->ttis[1].tt_abbrind = 0;
+                       atp = sp->ats;
+                       typep = sp->types;
+                       janfirst = 0;
+                       for (year = EPOCH_YEAR; year <= 2037; ++year) {
+                               starttime = transtime(janfirst, year, &start,
+                                       stdoffset);
+                               endtime = transtime(janfirst, year, &end,
+                                       dstoffset);
+                               if (starttime > endtime) {
+                                       *atp++ = endtime;
+                                       *typep++ = 1;   /* DST ends */
+                                       *atp++ = starttime;
+                                       *typep++ = 0;   /* DST begins */
+                               } else {
+                                       *atp++ = starttime;
+                                       *typep++ = 0;   /* DST begins */
+                                       *atp++ = endtime;
+                                       *typep++ = 1;   /* DST ends */
+                               }
+                               janfirst +=
+                                       year_lengths[isleap(year)] * SECSPERDAY;
+                       }
+               } else {
+                       int             sawstd;
+                       int             sawdst;
+                       long            stdfix;
+                       long            dstfix;
+                       long            oldfix;
+                       int             isdst;
+                       register int    i;
+
+                       if (*name != '\0')
+                               return -1;
+                       if (load_result != 0)
+                               return -1;
+                       /*
+                       ** Compute the difference between the real and
+                       ** prototype standard and summer time offsets
+                       ** from GMT, and put the real standard and summer
+                       ** time offsets into the rules in place of the
+                       ** prototype offsets.
+                       */
+                       sawstd = FALSE;
+                       sawdst = FALSE;
+                       stdfix = 0;
+                       dstfix = 0;
+                       for (i = 0; i < sp->typecnt; ++i) {
+                               if (sp->ttis[i].tt_isdst) {
+                                       oldfix = dstfix;
+                                       dstfix =
+                                           sp->ttis[i].tt_gmtoff + dstoffset;
+                                       if (sawdst && (oldfix != dstfix))
+                                               return -1;
+                                       sp->ttis[i].tt_gmtoff = -dstoffset;
+                                       sp->ttis[i].tt_abbrind = stdlen + 1;
+                                       sawdst = TRUE;
+                               } else {
+                                       oldfix = stdfix;
+                                       stdfix =
+                                           sp->ttis[i].tt_gmtoff + stdoffset;
+                                       if (sawstd && (oldfix != stdfix))
+                                               return -1;
+                                       sp->ttis[i].tt_gmtoff = -stdoffset;
+                                       sp->ttis[i].tt_abbrind = 0;
+                                       sawstd = TRUE;
+                               }
+                       }
+                       /*
+                       ** Make sure we have both standard and summer time.
+                       */
+                       if (!sawdst || !sawstd)
+                               return -1;
+                       /*
+                       ** Now correct the transition times by shifting
+                       ** them by the difference between the real and
+                       ** prototype offsets.  Note that this difference
+                       ** can be different in standard and summer time;
+                       ** the prototype probably has a 1-hour difference
+                       ** between standard and summer time, but a different
+                       ** difference can be specified in TZ.
+                       */
+                       isdst = FALSE;  /* we start in standard time */
+                       for (i = 0; i < sp->timecnt; ++i) {
+                               register const struct ttinfo *  ttisp;
+
+                               /*
+                               ** If summer time is in effect, and the
+                               ** transition time was not specified as
+                               ** standard time, add the summer time
+                               ** offset to the transition time;
+                               ** otherwise, add the standard time offset
+                               ** to the transition time.
+                               */
+                               ttisp = &sp->ttis[sp->types[i]];
+                               sp->ats[i] +=
+                                       (isdst && !ttisp->tt_ttisstd) ?
+                                               dstfix : stdfix;
+                               isdst = ttisp->tt_isdst;
+                       }
+               }
+       } else {
+               dstlen = 0;
+               sp->typecnt = 1;                /* only standard time */
+               sp->timecnt = 0;
+               sp->ttis[0].tt_gmtoff = -stdoffset;
+               sp->ttis[0].tt_isdst = 0;
+               sp->ttis[0].tt_abbrind = 0;
+       }
+       sp->charcnt = stdlen + 1;
+       if (dstlen != 0)
+               sp->charcnt += dstlen + 1;
+       if (sp->charcnt > sizeof sp->chars)
+               return -1;
+       cp = sp->chars;
+       (void) strncpy(cp, stdname, stdlen);
+       cp += stdlen;
+       *cp++ = '\0';
+       if (dstlen != 0) {
+               (void) strncpy(cp, dstname, dstlen);
+               *(cp + dstlen) = '\0';
+       }
+       return 0;
+}
+
+static void
+gmtload(sp)
+struct state * const   sp;
+{
+       if (tzload(GMT, sp) != 0)
+               (void) tzparse(GMT, sp, TRUE);
+}
+
+void
+tzset()
+{
+       register const char *   name;
+       void tzsetwall();
+
+       name = getenv("TZ");
+       if (name == NULL) {
+               tzsetwall();
+               return;
+       }
+       lcl_is_set = TRUE;
+#ifdef ALL_STATE
+       if (lclptr == NULL) {
+               lclptr = (struct state *) malloc(sizeof *lclptr);
+               if (lclptr == NULL) {
+                       settzname();    /* all we can do */
+                       return;
+               }
+       }
+#endif /* defined ALL_STATE */
+       if (*name == '\0') {
+               /*
+               ** User wants it fast rather than right.
+               */
+               lclptr->leapcnt = 0;            /* so, we're off a little */
+               lclptr->timecnt = 0;
+               lclptr->ttis[0].tt_gmtoff = 0;
+               lclptr->ttis[0].tt_abbrind = 0;
+               (void) strcpy(lclptr->chars, GMT);
+       } else if (tzload(name, lclptr) != 0)
+               if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0)
+                       (void) gmtload(lclptr);
+       settzname();
+}
+
+void
+tzsetwall()
+{
+       lcl_is_set = TRUE;
+#ifdef ALL_STATE
+       if (lclptr == NULL) {
+               lclptr = (struct state *) malloc(sizeof *lclptr);
+               if (lclptr == NULL) {
+                       settzname();    /* all we can do */
+                       return;
+               }
+       }
+#endif /* defined ALL_STATE */
+       if (tzload((char *) NULL, lclptr) != 0)
+               gmtload(lclptr);
+       settzname();
+}
+
+/*
+** The easy way to behave "as if no library function calls" localtime
+** is to not call it--so we drop its guts into "localsub", which can be
+** freely called.  (And no, the PANS doesn't require the above behavior--
+** but it *is* desirable.)
+**
+** The unused offset argument is for the benefit of mktime variants.
+*/
+
+/*ARGSUSED*/
+static void
+localsub(timep, offset, tmp)
+const time_t * const   timep;
+const long             offset;
+struct tm * const      tmp;
+{
+       register struct state * sp;
+       register const struct ttinfo *  ttisp;
+       register int                    i;
+       const time_t                    t = *timep;
+
+       if (!lcl_is_set)
+               tzset();
+       sp = lclptr;
+#ifdef ALL_STATE
+       if (sp == NULL) {
+               gmtsub(timep, offset, tmp);
+               return;
+       }
+#endif /* defined ALL_STATE */
+       if (sp->timecnt == 0 || t < sp->ats[0]) {
+               i = 0;
+               while (sp->ttis[i].tt_isdst)
+                       if (++i >= sp->typecnt) {
+                               i = 0;
+                               break;
+                       }
+       } else {
+               for (i = 1; i < sp->timecnt; ++i)
+                       if (t < sp->ats[i])
+                               break;
+               i = sp->types[i - 1];
+       }
+       ttisp = &sp->ttis[i];
+       /*
+       ** To get (wrong) behavior that's compatible with System V Release 2.0
+       ** you'd replace the statement below with
+       **      t += ttisp->tt_gmtoff;
+       **      timesub(&t, 0L, sp, tmp);
+       */
+       timesub(&t, ttisp->tt_gmtoff, sp, tmp);
+       tmp->tm_isdst = ttisp->tt_isdst;
+       tzname[tmp->tm_isdst] = (char *) &sp->chars[ttisp->tt_abbrind];
+       tmp->tm_zone = &sp->chars[ttisp->tt_abbrind];
+}
+
+struct tm *
+localtime(timep)
+const time_t * const   timep;
+{
+       static struct tm        tm;
+
+       localsub(timep, 0L, &tm);
+       return &tm;
+}
+
+/*
+** gmtsub is to gmtime as localsub is to localtime.
+*/
+
+static void
+gmtsub(timep, offset, tmp)
+const time_t * const   timep;
+const long             offset;
+struct tm * const      tmp;
+{
+       if (!gmt_is_set) {
+               gmt_is_set = TRUE;
+#ifdef ALL_STATE
+               gmtptr = (struct state *) malloc(sizeof *gmtptr);
+               if (gmtptr != NULL)
+#endif /* defined ALL_STATE */
+                       gmtload(gmtptr);
+       }
+       timesub(timep, offset, gmtptr, tmp);
+       /*
+       ** Could get fancy here and deliver something such as
+       ** "GMT+xxxx" or "GMT-xxxx" if offset is non-zero,
+       ** but this is no time for a treasure hunt.
+       */
+       if (offset != 0)
+               tmp->tm_zone = WILDABBR;
+       else {
+#ifdef ALL_STATE
+               if (gmtptr == NULL)
+                       tmp->TM_ZONE = GMT;
+               else    tmp->TM_ZONE = gmtptr->chars;
+#endif /* defined ALL_STATE */
+#ifndef ALL_STATE
+               tmp->tm_zone = gmtptr->chars;
+#endif /* State Farm */
+       }
+}
+
+struct tm *
+gmtime(timep)
+const time_t * const   timep;
+{
+       static struct tm        tm;
+
+       gmtsub(timep, 0L, &tm);
+       return &tm;
+}
+
+static void
+timesub(timep, offset, sp, tmp)
+const time_t * const                   timep;
+const long                             offset;
+register const struct state * const    sp;
+register struct tm * const             tmp;
+{
+       register const struct lsinfo *  lp;
+       register long                   days;
+       register long                   rem;
+       register int                    y;
+       register int                    yleap;
+       register const int *            ip;
+       register long                   corr;
+       register int                    hit;
+       register int                    i;
+
+       corr = 0;
+       hit = FALSE;
+#ifdef ALL_STATE
+       i = (sp == NULL) ? 0 : sp->leapcnt;
+#endif /* defined ALL_STATE */
+#ifndef ALL_STATE
+       i = sp->leapcnt;
+#endif /* State Farm */
+       while (--i >= 0) {
+               lp = &sp->lsis[i];
+               if (*timep >= lp->ls_trans) {
+                       if (*timep == lp->ls_trans)
+                               hit = ((i == 0 && lp->ls_corr > 0) ||
+                                       lp->ls_corr > sp->lsis[i - 1].ls_corr);
+                       corr = lp->ls_corr;
+                       break;
+               }
+       }
+       days = *timep / SECSPERDAY;
+       rem = *timep % SECSPERDAY;
+#ifdef mc68k
+       if (*timep == 0x80000000) {
+               /*
+               ** A 3B1 muffs the division on the most negative number.
+               */
+               days = -24855;
+               rem = -11648;
+       }
+#endif /* mc68k */
+       rem += (offset - corr);
+       while (rem < 0) {
+               rem += SECSPERDAY;
+               --days;
+       }
+       while (rem >= SECSPERDAY) {
+               rem -= SECSPERDAY;
+               ++days;
+       }
+       tmp->tm_hour = (int) (rem / SECSPERHOUR);
+       rem = rem % SECSPERHOUR;
+       tmp->tm_min = (int) (rem / SECSPERMIN);
+       tmp->tm_sec = (int) (rem % SECSPERMIN);
+       if (hit)
+               /*
+               ** A positive leap second requires a special
+               ** representation.  This uses "... ??:59:60".
+               */
+               ++(tmp->tm_sec);
+       tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYSPERWEEK);
+       if (tmp->tm_wday < 0)
+               tmp->tm_wday += DAYSPERWEEK;
+       y = EPOCH_YEAR;
+       if (days >= 0)
+               for ( ; ; ) {
+                       yleap = isleap(y);
+                       if (days < (long) year_lengths[yleap])
+                               break;
+                       ++y;
+                       days = days - (long) year_lengths[yleap];
+               }
+       else do {
+               --y;
+               yleap = isleap(y);
+               days = days + (long) year_lengths[yleap];
+       } while (days < 0);
+       tmp->tm_year = y - TM_YEAR_BASE;
+       tmp->tm_yday = (int) days;
+       ip = mon_lengths[yleap];
+       for (tmp->tm_mon = 0; days >= (long) ip[tmp->tm_mon]; ++(tmp->tm_mon))
+               days = days - (long) ip[tmp->tm_mon];
+       tmp->tm_mday = (int) (days + 1);
+       tmp->tm_isdst = 0;
+       tmp->tm_gmtoff = offset;
+}
+
+/*
+** A la X3J11
+*/
+
+char *
+asctime(timeptr)
+register const struct tm *     timeptr;
+{
+       static const char       wday_name[DAYSPERWEEK][3] = {
+               "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+       };
+       static const char       mon_name[MONSPERYEAR][3] = {
+               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+       };
+       static char     result[26];
+
+       (void) sprintf(result, "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %d\n",
+               wday_name[timeptr->tm_wday],
+               mon_name[timeptr->tm_mon],
+               timeptr->tm_mday, timeptr->tm_hour,
+               timeptr->tm_min, timeptr->tm_sec,
+               TM_YEAR_BASE + timeptr->tm_year);
+       return result;
+}
+
+char *
+ctime(timep)
+const time_t * const   timep;
+{
+       return asctime(localtime(timep));
+}
+
+/*
+** Adapted from code provided by Robert Elz, who writes:
+**     The "best" way to do mktime I think is based on an idea of Bob
+**     Kridle's (so its said...) from a long time ago. (mtxinu!kridle now).
+**     It does a binary search of the time_t space.  Since time_t's are
+**     just 32 bits, its a max of 32 iterations (even at 64 bits it
+**     would still be very reasonable).
+*/
+
+#ifndef WRONG
+#define WRONG  (-1)
+#endif /* !defined WRONG */
+
+static void
+normalize(tensptr, unitsptr, base)
+int * const    tensptr;
+int * const    unitsptr;
+const int      base;
+{
+       if (*unitsptr >= base) {
+               *tensptr += *unitsptr / base;
+               *unitsptr %= base;
+       } else if (*unitsptr < 0) {
+               *tensptr -= 1 + (-(*unitsptr + 1)) / base;
+               *unitsptr = base - 1 - (-(*unitsptr + 1)) % base;
+       }
+}
+
+static int
+tmcomp(atmp, btmp)
+register const struct tm * const atmp;
+register const struct tm * const btmp;
+{
+       register int    result;
+
+       if ((result = (atmp->tm_year - btmp->tm_year)) == 0 &&
+               (result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
+               (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
+               (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
+               (result = (atmp->tm_min - btmp->tm_min)) == 0)
+                       result = atmp->tm_sec - btmp->tm_sec;
+       return result;
+}
+
+static time_t
+time2(tmp, funcp, offset, okayp)
+struct tm * const      tmp;
+void (* const          funcp)();
+const long             offset;
+int * const            okayp;
+{
+       register const struct state *   sp;
+       register int                    dir;
+       register int                    bits;
+       register int                    i, j ;
+       register int                    saved_seconds;
+       time_t                          newt;
+       time_t                          t;
+       struct tm                       yourtm, mytm;
+
+       *okayp = FALSE;
+       yourtm = *tmp;
+       if (yourtm.tm_sec >= SECSPERMIN + 2 || yourtm.tm_sec < 0)
+               normalize(&yourtm.tm_min, &yourtm.tm_sec, SECSPERMIN);
+       normalize(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR);
+       normalize(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY);
+       normalize(&yourtm.tm_year, &yourtm.tm_mon, MONSPERYEAR);
+       while (yourtm.tm_mday <= 0) {
+               --yourtm.tm_year;
+               yourtm.tm_mday +=
+                       year_lengths[isleap(yourtm.tm_year + TM_YEAR_BASE)];
+       }
+       while (yourtm.tm_mday > DAYSPERLYEAR) {
+               yourtm.tm_mday -=
+                   year_lengths[isleap(yourtm.tm_year + TM_YEAR_BASE)];
+               ++yourtm.tm_year;
+       }
+       for ( ; ; ) {
+               i = mon_lengths[isleap(yourtm.tm_year +
+                       TM_YEAR_BASE)][yourtm.tm_mon];
+               if (yourtm.tm_mday <= i)
+                       break;
+               yourtm.tm_mday -= i;
+               if (++yourtm.tm_mon >= MONSPERYEAR) {
+                       yourtm.tm_mon = 0;
+                       ++yourtm.tm_year;
+               }
+       }
+       saved_seconds = yourtm.tm_sec;
+       yourtm.tm_sec = 0;
+       /*
+       ** Calculate the number of magnitude bits in a time_t
+       ** (this works regardless of whether time_t is
+       ** signed or unsigned, though lint complains if unsigned).
+       */
+       for (bits = 0, t = 1; t > 0; ++bits, t <<= 1)
+               ;
+       /*
+       ** If time_t is signed, then 0 is the median value,
+       ** if time_t is unsigned, then 1 << bits is median.
+       */
+       t = (t < 0) ? 0 : ((time_t) 1 << bits);
+       for ( ; ; ) {
+               (*funcp)(&t, offset, &mytm);
+               dir = tmcomp(&mytm, &yourtm);
+               if (dir != 0) {
+                       if (bits-- < 0)
+                               return WRONG;
+                       if (bits < 0)
+                               --t;
+                       else if (dir > 0)
+                               t -= (time_t) 1 << bits;
+                       else    t += (time_t) 1 << bits;
+                       continue;
+               }
+               if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
+                       break;
+               /*
+               ** Right time, wrong type.
+               ** Hunt for right time, right type.
+               ** It's okay to guess wrong since the guess
+               ** gets checked.
+               */
+               sp = (const struct state *)
+                       ((funcp == localsub) ? lclptr : gmtptr);
+#ifdef ALL_STATE
+               if (sp == NULL)
+                       return WRONG;
+#endif /* defined ALL_STATE */
+               for (i = 0; i < sp->typecnt; ++i) {
+                       if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)
+                               continue;
+                       for (j = 0; j < sp->typecnt; ++j) {
+                               if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)
+                                       continue;
+                               newt = t + sp->ttis[j].tt_gmtoff -
+                                       sp->ttis[i].tt_gmtoff;
+                               (*funcp)(&newt, offset, &mytm);
+                               if (tmcomp(&mytm, &yourtm) != 0)
+                                       continue;
+                               if (mytm.tm_isdst != yourtm.tm_isdst)
+                                       continue;
+                               /*
+                               ** We have a match.
+                               */
+                               t = newt;
+                               goto label;
+                       }
+               }
+               return WRONG;
+       }
+label:
+       t += saved_seconds;
+       (*funcp)(&t, offset, tmp);
+       *okayp = TRUE;
+       return t;
+}
+
+static time_t
+time1(tmp, funcp, offset)
+struct tm * const      tmp;
+void (* const          funcp)();
+const long             offset;
+{
+       register time_t                 t;
+       register const struct state *   sp;
+       register int                    samei, otheri;
+       int                             okay;
+
+       if (tmp->tm_isdst > 1)
+               tmp->tm_isdst = 1;
+       t = time2(tmp, funcp, offset, &okay);
+       if (okay || tmp->tm_isdst < 0)
+               return t;
+       /*
+       ** We're supposed to assume that somebody took a time of one type
+       ** and did some math on it that yielded a "struct tm" that's bad.
+       ** We try to divine the type they started from and adjust to the
+       ** type they need.
+       */
+       sp = (const struct state *) ((funcp == localsub) ? lclptr : gmtptr);
+#ifdef ALL_STATE
+       if (sp == NULL)
+               return WRONG;
+#endif /* defined ALL_STATE */
+       for (samei = 0; samei < sp->typecnt; ++samei) {
+               if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)
+                       continue;
+               for (otheri = 0; otheri < sp->typecnt; ++otheri) {
+                       if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)
+                               continue;
+                       tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
+                                       sp->ttis[samei].tt_gmtoff;
+                       tmp->tm_isdst = !tmp->tm_isdst;
+                       t = time2(tmp, funcp, offset, &okay);
+                       if (okay)
+                               return t;
+                       tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
+                                       sp->ttis[samei].tt_gmtoff;
+                       tmp->tm_isdst = !tmp->tm_isdst;
+               }
+       }
+       return WRONG;
+}
+
+time_t
+mktime(tmp)
+struct tm * const      tmp;
+{
+       return time1(tmp, localsub, 0L);
+}
diff --git a/gen.subproj/daemon.c b/gen.subproj/daemon.c
new file mode 100644 (file)
index 0000000..7c638ce
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <fcntl.h>
+#include <paths.h>
+#include <unistd.h>
+
+int
+daemon(nochdir, noclose)
+       int nochdir, noclose;
+{
+       int fd;
+
+       switch (fork()) {
+       case -1:
+               return (-1);
+       case 0:
+               break;
+       default:
+               _exit(0);
+       }
+
+       if (setsid() == -1)
+               return (-1);
+
+       if (!nochdir)
+               (void)chdir("/");
+
+       if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
+               (void)dup2(fd, STDIN_FILENO);
+               (void)dup2(fd, STDOUT_FILENO);
+               (void)dup2(fd, STDERR_FILENO);
+               if (fd > 2)
+                       (void)close (fd);
+       }
+       return (0);
+}
diff --git a/gen.subproj/devname.c b/gen.subproj/devname.c
new file mode 100644 (file)
index 0000000..3a03f5a
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <db.h>
+#include <dirent.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <paths.h>
+#include <stdio.h>
+#include <string.h>
+
+static char buf[sizeof(_PATH_DEV) + MAXNAMLEN] = _PATH_DEV;
+static char *olddevname __P((dev_t, mode_t));
+
+char *
+devname(dev, type)
+       dev_t dev;
+       mode_t type;
+{
+       struct {
+               mode_t type;
+               dev_t dev;
+       } bkey;
+       static DB *db;
+       static int failure;
+       DBT data, key;
+
+       if (!db && !failure &&
+           !(db = dbopen(_PATH_DEVDB, O_RDONLY, 0, DB_HASH, NULL))) {
+               failure = 1;
+       }
+       if (failure)
+               return (olddevname(dev, type));
+
+       /*
+        * Keys are a mode_t followed by a dev_t.  The former is the type of
+        * the file (mode & S_IFMT), the latter is the st_rdev field.  Be
+        * sure to clear any padding that may be found in bkey.
+        */
+       memset(&bkey, 0, sizeof(bkey));
+       bkey.dev = dev;
+       bkey.type = type;
+       key.data = &bkey;
+       key.size = sizeof(bkey);
+       return ((db->get)(db, &key, &data, 0) ? NULL : (char *)data.data);
+}
+
+static char *
+olddevname(dev, type)
+       dev_t dev;
+       mode_t type;
+{
+       register DIR *dp;
+       register struct dirent *dirp;
+       struct stat sb;
+
+       if ((dp = opendir(_PATH_DEV)) == NULL)
+               return (NULL);
+
+       while ( (dirp = readdir(dp)) ) {
+               bcopy(dirp->d_name, buf + sizeof(_PATH_DEV) - 1,
+                   dirp->d_namlen + 1);
+               if (stat(buf, &sb))
+                       continue;
+               if (dev != sb.st_rdev)
+                       continue;
+               if (type != (sb.st_mode & S_IFMT))
+                       continue;
+               (void)closedir(dp);
+               return (buf + sizeof(_PATH_DEV) - 1);
+       }
+       (void)closedir(dp);
+       return (NULL);
+}
diff --git a/gen.subproj/difftime.c b/gen.subproj/difftime.c
new file mode 100644 (file)
index 0000000..015b223
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+double
+difftime(time1, time0)
+       time_t time1, time0;
+{
+       return(time1 - time0);
+}
diff --git a/gen.subproj/disklabel.c b/gen.subproj/disklabel.c
new file mode 100644 (file)
index 0000000..e828970
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/time.h>
+#define DKTYPENAMES
+#include <sys/disklabel.h>
+#include <ufs/ufs/dinode.h>
+#include <ufs/ffs/fs.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+
+static int     error __P((int));
+static int     gettype __P((char *, char **));
+
+struct disklabel *
+getdiskbyname(name)
+       const char *name;
+{
+       static struct   disklabel disk;
+       register struct disklabel *dp = &disk;
+       register struct partition *pp;
+       char    *buf;
+       char    *db_array[2] = { _PATH_DISKTAB, 0 };
+       char    *cp, *cq;       /* can't be register */
+       char    p, max, psize[3], pbsize[3],
+               pfsize[3], poffset[3], ptype[3];
+       u_int32_t *dx;
+
+       if (cgetent(&buf, db_array, (char *) name) < 0)
+               return NULL;
+
+       bzero((char *)&disk, sizeof(disk));
+       /*
+        * typename
+        */
+       cq = dp->d_typename;
+       cp = buf;
+       while (cq < dp->d_typename + sizeof(dp->d_typename) - 1 &&
+           (*cq = *cp) && *cq != '|' && *cq != ':')
+               cq++, cp++;
+       *cq = '\0';
+       /*
+        * boot name (optional)  xxboot, bootxx
+        */
+       cgetstr(buf, "b0", &dp->d_boot0);
+       cgetstr(buf, "b1", &dp->d_boot1);
+
+       if (cgetstr(buf, "ty", &cq) > 0 && strcmp(cq, "removable") == 0)
+               dp->d_flags |= D_REMOVABLE;
+       else  if (cq && strcmp(cq, "simulated") == 0)
+               dp->d_flags |= D_RAMDISK;
+       if (cgetcap(buf, "sf", ':') != NULL)
+               dp->d_flags |= D_BADSECT;
+
+#define getnumdflt(field, dname, dflt) \
+        { long f; (field) = (cgetnum(buf, dname, &f) == -1) ? (dflt) : f; }
+
+       getnumdflt(dp->d_secsize, "se", DEV_BSIZE);
+       cgetnum(buf, "nt",(long *) &dp->d_ntracks);
+       cgetnum(buf, "ns",(long *) &dp->d_nsectors);
+       cgetnum(buf, "nc",(long *) &dp->d_ncylinders);
+
+       if (cgetstr(buf, "dt", &cq) > 0)
+               dp->d_type = gettype(cq, dktypenames);
+       else
+               getnumdflt(dp->d_type, "dt", 0);
+       getnumdflt(dp->d_secpercyl, "sc", dp->d_nsectors * dp->d_ntracks);
+       getnumdflt(dp->d_secperunit, "su", dp->d_secpercyl * dp->d_ncylinders);
+       getnumdflt(dp->d_rpm, "rm", 3600);
+       getnumdflt(dp->d_interleave, "il", 1);
+       getnumdflt(dp->d_trackskew, "sk", 0);
+       getnumdflt(dp->d_cylskew, "cs", 0);
+       getnumdflt(dp->d_headswitch, "hs", 0);
+       getnumdflt(dp->d_trkseek, "ts", 0);
+       getnumdflt(dp->d_bbsize, "bs", BBSIZE);
+       getnumdflt(dp->d_sbsize, "sb", SBSIZE);
+       strcpy(psize, "px");
+       strcpy(pbsize, "bx");
+       strcpy(pfsize, "fx");
+       strcpy(poffset, "ox");
+       strcpy(ptype, "tx");
+       max = 'a' - 1;
+       pp = &dp->d_partitions[0];
+       for (p = 'a'; p < 'a' + MAXPARTITIONS; p++, pp++) {
+               psize[1] = pbsize[1] = pfsize[1] = poffset[1] = ptype[1] = p;
+               if (cgetnum(buf, psize,(long *) &pp->p_size) == -1)
+                       pp->p_size = 0;
+               else {
+                       cgetnum(buf, poffset, (long *) &pp->p_offset);
+                       getnumdflt(pp->p_fsize, pfsize, 0);
+                       if (pp->p_fsize) {
+                               long bsize;
+
+                               if (cgetnum(buf, pbsize, &bsize) == 0)
+                                       pp->p_frag = bsize / pp->p_fsize;
+                               else
+                                       pp->p_frag = 8;
+                       }
+                       getnumdflt(pp->p_fstype, ptype, 0);
+                       if (pp->p_fstype == 0 && cgetstr(buf, ptype, &cq) > 0)
+                               pp->p_fstype = gettype(cq, fstypenames);
+                       max = p;
+               }
+       }
+       dp->d_npartitions = max + 1 - 'a';
+       (void)strcpy(psize, "dx");
+       dx = dp->d_drivedata;
+       for (p = '0'; p < '0' + NDDATA; p++, dx++) {
+               psize[1] = p;
+               getnumdflt(*dx, psize, 0);
+       }
+       dp->d_magic = DISKMAGIC;
+       dp->d_magic2 = DISKMAGIC;
+       free(buf);
+       return (dp);
+}
+
+static int
+gettype(t, names)
+       char *t;
+       char **names;
+{
+       register char **nm;
+
+       for (nm = names; *nm; nm++)
+               if (strcasecmp(t, *nm) == 0)
+                       return (nm - names);
+       if (isdigit(*t))
+               return (atoi(t));
+       return (0);
+}
+
+static int
+error(err)
+       int err;
+{
+       char *p;
+
+       (void)write(STDERR_FILENO, "disktab: ", 9);
+       (void)write(STDERR_FILENO, _PATH_DISKTAB, sizeof(_PATH_DISKTAB) - 1);
+       (void)write(STDERR_FILENO, ": ", 2);
+       p = strerror(err);
+       (void)write(STDERR_FILENO, p, strlen(p));
+       (void)write(STDERR_FILENO, "\n", 1);
+}
diff --git a/gen.subproj/err.c b/gen.subproj/err.c
new file mode 100644 (file)
index 0000000..a355d99
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <crt_externs.h>
+
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+__dead void
+#ifdef __STDC__
+err(int eval, const char *fmt, ...)
+#else
+err(eval, fmt, va_alist)
+       int eval;
+       const char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       verr(eval, fmt, ap);
+       va_end(ap);
+}
+
+__dead void
+verr(eval, fmt, ap)
+       int eval;
+       const char *fmt;
+       va_list ap;
+{
+       char* __progname = *(*_NSGetArgv());
+       int sverrno;
+
+       sverrno = errno;
+       (void)fprintf(stderr, "%s: ", __progname);
+       if (fmt != NULL) {
+               (void)vfprintf(stderr, fmt, ap);
+               (void)fprintf(stderr, ": ");
+       }
+       (void)fprintf(stderr, "%s\n", strerror(sverrno));
+       exit(eval);
+}
+
+__dead void
+#if __STDC__
+errx(int eval, const char *fmt, ...)
+#else
+errx(eval, fmt, va_alist)
+       int eval;
+       const char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       verrx(eval, fmt, ap);
+       va_end(ap);
+}
+
+__dead void
+verrx(eval, fmt, ap)
+       int eval;
+       const char *fmt;
+       va_list ap;
+{
+        char* __progname = *(*_NSGetArgv());
+       (void)fprintf(stderr, "%s: ", __progname);
+       if (fmt != NULL)
+               (void)vfprintf(stderr, fmt, ap);
+       (void)fprintf(stderr, "\n");
+       exit(eval);
+}
+
+void
+#if __STDC__
+warn(const char *fmt, ...)
+#else
+warn(fmt, va_alist)
+       const char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       vwarn(fmt, ap);
+       va_end(ap);
+}
+
+void
+vwarn(fmt, ap)
+       const char *fmt;
+       va_list ap;
+{
+       int sverrno = errno;
+        char* __progname = *(*_NSGetArgv());
+       (void)fprintf(stderr, "%s: ", __progname);
+       if (fmt != NULL) {
+               (void)vfprintf(stderr, fmt, ap);
+               (void)fprintf(stderr, ": ");
+       }
+       (void)fprintf(stderr, "%s\n", strerror(sverrno));
+}
+
+void
+#ifdef __STDC__
+warnx(const char *fmt, ...)
+#else
+warnx(fmt, va_alist)
+       const char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+#ifdef __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       vwarnx(fmt, ap);
+       va_end(ap);
+}
+
+void
+vwarnx(fmt, ap)
+       const char *fmt;
+       va_list ap;
+{
+        char* __progname = *(*_NSGetArgv());
+       (void)fprintf(stderr, "%s: ", __progname);
+       if (fmt != NULL)
+               (void)vfprintf(stderr, fmt, ap);
+       (void)fprintf(stderr, "\n");
+}
diff --git a/gen.subproj/errlst.c b/gen.subproj/errlst.c
new file mode 100644 (file)
index 0000000..1a022c9
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1982, 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+const char *const sys_errlist[] = {
+       "Undefined error: 0",                   /*  0 - ENOERROR */
+       "Operation not permitted",              /*  1 - EPERM */
+       "No such file or directory",            /*  2 - ENOENT */
+       "No such process",                      /*  3 - ESRCH */
+       "Interrupted system call",              /*  4 - EINTR */
+       "Input/output error",                   /*  5 - EIO */
+       "Device not configured",                /*  6 - ENXIO */
+       "Argument list too long",               /*  7 - E2BIG */
+       "Exec format error",                    /*  8 - ENOEXEC */
+       "Bad file descriptor",                  /*  9 - EBADF */
+       "No child processes",                   /* 10 - ECHILD */
+       "Resource deadlock avoided",            /* 11 - EDEADLK */
+       "Cannot allocate memory",               /* 12 - ENOMEM */
+       "Permission denied",                    /* 13 - EACCES */
+       "Bad address",                          /* 14 - EFAULT */
+       "Block device required",                /* 15 - ENOTBLK */
+       "Device busy",                          /* 16 - EBUSY */
+       "File exists",                          /* 17 - EEXIST */
+       "Cross-device link",                    /* 18 - EXDEV */
+       "Operation not supported by device",    /* 19 - ENODEV */
+       "Not a directory",                      /* 20 - ENOTDIR */
+       "Is a directory",                       /* 21 - EISDIR */
+       "Invalid argument",                     /* 22 - EINVAL */
+       "Too many open files in system",        /* 23 - ENFILE */
+       "Too many open files",                  /* 24 - EMFILE */
+       "Inappropriate ioctl for device",       /* 25 - ENOTTY */
+       "Text file busy",                       /* 26 - ETXTBSY */
+       "File too large",                       /* 27 - EFBIG */
+       "No space left on device",              /* 28 - ENOSPC */
+       "Illegal seek",                         /* 29 - ESPIPE */
+       "Read-only file system",                /* 30 - EROFS */
+       "Too many links",                       /* 31 - EMLINK */
+       "Broken pipe",                          /* 32 - EPIPE */
+
+/* math software */
+       "Numerical argument out of domain",     /* 33 - EDOM */
+       "Result too large",                     /* 34 - ERANGE */
+
+/* non-blocking and interrupt i/o */
+       "Resource temporarily unavailable",     /* 35 - EAGAIN */
+                                               /* 35 - EWOULDBLOCK */
+       "Operation now in progress",            /* 36 - EINPROGRESS */
+       "Operation already in progress",        /* 37 - EALREADY */
+
+/* ipc/network software -- argument errors */
+       "Socket operation on non-socket",       /* 38 - ENOTSOCK */
+       "Destination address required",         /* 39 - EDESTADDRREQ */
+       "Message too long",                     /* 40 - EMSGSIZE */
+       "Protocol wrong type for socket",       /* 41 - EPROTOTYPE */
+       "Protocol not available",               /* 42 - ENOPROTOOPT */
+       "Protocol not supported",               /* 43 - EPROTONOSUPPORT */
+       "Socket type not supported",            /* 44 - ESOCKTNOSUPPORT */
+       "Operation not supported",              /* 45 - EOPNOTSUPP */
+       "Protocol family not supported",        /* 46 - EPFNOSUPPORT */
+                                               /* 47 - EAFNOSUPPORT */
+       "Address family not supported by protocol family",
+       "Address already in use",               /* 48 - EADDRINUSE */
+       "Can't assign requested address",       /* 49 - EADDRNOTAVAIL */
+
+/* ipc/network software -- operational errors */
+       "Network is down",                      /* 50 - ENETDOWN */
+       "Network is unreachable",               /* 51 - ENETUNREACH */
+       "Network dropped connection on reset",  /* 52 - ENETRESET */
+       "Software caused connection abort",     /* 53 - ECONNABORTED */
+       "Connection reset by peer",             /* 54 - ECONNRESET */
+       "No buffer space available",            /* 55 - ENOBUFS */
+       "Socket is already connected",          /* 56 - EISCONN */
+       "Socket is not connected",              /* 57 - ENOTCONN */
+       "Can't send after socket shutdown",     /* 58 - ESHUTDOWN */
+       "Too many references: can't splice",    /* 59 - ETOOMANYREFS */
+       "Operation timed out",                  /* 60 - ETIMEDOUT */
+       "Connection refused",                   /* 61 - ECONNREFUSED */
+
+       "Too many levels of symbolic links",    /* 62 - ELOOP */
+       "File name too long",                   /* 63 - ENAMETOOLONG */
+
+/* should be rearranged */
+       "Host is down",                         /* 64 - EHOSTDOWN */
+       "No route to host",                     /* 65 - EHOSTUNREACH */
+       "Directory not empty",                  /* 66 - ENOTEMPTY */
+
+/* quotas & mush */
+       "Too many processes",                   /* 67 - EPROCLIM */
+       "Too many users",                       /* 68 - EUSERS */
+       "Disc quota exceeded",                  /* 69 - EDQUOT */
+
+/* Network File System */
+       "Stale NFS file handle",                /* 70 - ESTALE */
+       "Too many levels of remote in path",    /* 71 - EREMOTE */
+       "RPC struct is bad",                    /* 72 - EBADRPC */
+       "RPC version wrong",                    /* 73 - ERPCMISMATCH */
+       "RPC prog. not avail",                  /* 74 - EPROGUNAVAIL */
+       "Program version wrong",                /* 75 - EPROGMISMATCH */
+       "Bad procedure for program",            /* 76 - EPROCUNAVAIL */
+
+       "No locks available",                   /* 77 - ENOLCK */
+       "Function not implemented",             /* 78 - ENOSYS */
+       "Inappropriate file type or format",    /* 79 - EFTYPE */
+       "Authentication error",                 /* 80 - EAUTH */
+       "Need authenticator",                   /* 81 - ENEEDAUTH */
+
+       "Device power is off",                  /* 82 - EPWROFF */
+       "Device error",                         /* 83 - EDEVERR */
+       "Value too large to be stored in data type",    /* 84 - EOVERFLOW */
+
+/* program loading errors */
+       "Bad executable (or shared library)",   /* 85 - EBADEXEC */
+       "Bad CPU type in executable",           /* 86 - EBADARCH */
+       "Shared library version mismatch",      /* 87 - ESHLIBVERS */
+       "Malformed Mach-o file"                 /* 88 - EBADMACHO */
+};
+
+int errno;
+
+const int sys_nerr = sizeof(sys_errlist) / sizeof(sys_errlist[0]);
diff --git a/gen.subproj/exec.c b/gen.subproj/exec.c
new file mode 100644 (file)
index 0000000..1f6e2d7
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <paths.h>
+
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#if defined(__APPLE__)
+#include <crt_externs.h>
+#define environ (*_NSGetEnviron())
+#else
+extern char **environ;
+#endif
+
+int
+#ifdef __STDC__
+execl(const char *name, const char *arg, ...)
+#else
+execl(name, arg, va_alist)
+        const char *name;
+        const char *arg;
+        va_dcl
+#endif
+{
+        va_list ap;
+        char **argv;
+        int n;
+
+#ifdef __STDC__
+        va_start(ap, arg);
+#else
+        va_start(ap);
+#endif
+        n = 1;
+        while (va_arg(ap, char *) != NULL)
+                n++;
+        va_end(ap);
+        argv = alloca((n + 1) * sizeof(*argv));
+        if (argv == NULL) {
+                errno = ENOMEM;
+                return (-1);
+        }
+#ifdef __STDC__
+        va_start(ap, arg);
+#else
+        va_start(ap);
+#endif
+        n = 1;
+        argv[0] = (char *)arg;
+        while ((argv[n] = va_arg(ap, char *)) != NULL)
+                n++;
+        va_end(ap);
+        return (execve(name, argv, environ));
+}
+
+int
+#ifdef __STDC__
+execle(const char *name, const char *arg, ...)
+#else
+execle(name, arg, va_alist)
+        const char *name;
+        const char *arg;
+        va_dcl
+#endif
+{
+        va_list ap;
+        char **argv, **envp;
+        int n;
+
+#ifdef __STDC__
+        va_start(ap, arg);
+#else
+        va_start(ap);
+#endif
+        n = 1;
+        while (va_arg(ap, char *) != NULL)
+                n++;
+        va_end(ap);
+        argv = alloca((n + 1) * sizeof(*argv));
+        if (argv == NULL) {
+                errno = ENOMEM;
+                return (-1);
+        }
+#ifdef __STDC__
+        va_start(ap, arg);
+#else
+        va_start(ap);
+#endif
+        n = 1;
+        argv[0] = (char *)arg;
+        while ((argv[n] = va_arg(ap, char *)) != NULL)
+                n++;
+        envp = va_arg(ap, char **);
+        va_end(ap);
+        return (execve(name, argv, envp));
+}
+
+int
+#ifdef __STDC__
+execlp(const char *name, const char *arg, ...)
+#else
+execlp(name, arg, va_alist)
+        const char *name;
+        const char *arg;
+        va_dcl
+#endif
+{
+        va_list ap;
+        char **argv;
+        int n;
+
+#ifdef __STDC__
+        va_start(ap, arg);
+#else
+        va_start(ap);
+#endif
+        n = 1;
+        while (va_arg(ap, char *) != NULL)
+                n++;
+        va_end(ap);
+        argv = alloca((n + 1) * sizeof(*argv));
+        if (argv == NULL) {
+                errno = ENOMEM;
+                return (-1);
+        }
+#ifdef __STDC__
+        va_start(ap, arg);
+#else
+        va_start(ap);
+#endif
+        n = 1;
+        argv[0] = (char *)arg;
+        while ((argv[n] = va_arg(ap, char *)) != NULL)
+                n++;
+        va_end(ap);
+        return (execvp(name, argv));
+}
+
+int
+execv(name, argv)
+        const char *name;
+        char * const *argv;
+{
+        (void)execve(name, argv, environ);
+        return (-1);
+}
+
+int
+execvp(name, argv)
+        const char *name;
+        char * const *argv;
+{
+        char **memp;
+        register int cnt, lp, ln;
+        register char *p;
+        int eacces = 0, etxtbsy = 0;
+        char *bp, *cur, *path, buf[MAXPATHLEN];
+
+        /*
+         * Do not allow null name
+         */
+        if (name == NULL || *name == '\0') {
+                errno = ENOENT;
+                return (-1);
+        }
+
+        /* If it's an absolute or relative path name, it's easy. */
+        if (strchr(name, '/')) {
+                bp = (char *)name;
+                cur = path = NULL;
+                goto retry;
+        }
+        bp = buf;
+
+        /* Get the path we're searching. */
+        if (!(path = getenv("PATH")))
+                path = _PATH_DEFPATH;
+        cur = alloca(strlen(path) + 1);
+        if (cur == NULL) {
+                errno = ENOMEM;
+                return (-1);
+        }
+        strcpy(cur, path);
+        path = cur;
+        while ((p = strsep(&cur, ":"))) {
+                /*
+                 * It's a SHELL path -- double, leading and trailing colons
+                 * mean the current directory.
+                 */
+                if (!*p) {
+                        p = ".";
+                        lp = 1;
+                } else
+                        lp = strlen(p);
+                ln = strlen(name);
+
+                /*
+                 * If the path is too long complain.  This is a possible
+                 * security issue; given a way to make the path too long
+                 * the user may execute the wrong program.
+                 */
+                if (lp + ln + 2 > sizeof(buf)) {
+                        struct iovec iov[3];
+
+                        iov[0].iov_base = "execvp: ";
+                        iov[0].iov_len = 8;
+                        iov[1].iov_base = p;
+                        iov[1].iov_len = lp;
+                        iov[2].iov_base = ": path too long\n";
+                        iov[2].iov_len = 16;
+                        (void)writev(STDERR_FILENO, iov, 3);
+                        continue;
+                }
+                bcopy(p, buf, lp);
+                buf[lp] = '/';
+                bcopy(name, buf + lp + 1, ln);
+                buf[lp + ln + 1] = '\0';
+
+retry:          (void)execve(bp, argv, environ);
+                switch(errno) {
+                case E2BIG:
+                        goto done;
+                case ELOOP:
+                case ENAMETOOLONG:
+                case ENOENT:
+                        break;
+                case ENOEXEC:
+                        for (cnt = 0; argv[cnt]; ++cnt)
+                                ;
+                        memp = alloca((cnt + 2) * sizeof(char *));
+                        if (memp == NULL)
+                                goto done;
+                        memp[0] = "sh";
+                        memp[1] = bp;
+                        bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
+                        (void)execve(_PATH_BSHELL, memp, environ);
+                        goto done;
+                case ENOMEM:
+                        goto done;
+                case ENOTDIR:
+                        break;
+                case ETXTBSY:
+                        /*
+                         * We used to retry here, but sh(1) doesn't.
+                         */
+                        goto done;
+                case EACCES:
+                        eacces = 1;
+                        break;
+                default:
+                        goto done;
+                }
+        }
+        if (eacces)
+                errno = EACCES;
+        else if (!errno)
+                errno = ENOENT;
+done:
+        return (-1);
+}
diff --git a/gen.subproj/fnmatch.c b/gen.subproj/fnmatch.c
new file mode 100644 (file)
index 0000000..93bb361
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6.
+ * Compares a filename or pathname to a pattern.
+ */
+
+#include <fnmatch.h>
+#include <string.h>
+
+#define        EOS     '\0'
+
+static const char *rangematch __P((const char *, int, int));
+
+int
+fnmatch(pattern, string, flags)
+       const char *pattern, *string;
+       int flags;
+{
+       const char *stringstart;
+       char c, test;
+
+       for (stringstart = string;;)
+               switch (c = *pattern++) {
+               case EOS:
+                       return (*string == EOS ? 0 : FNM_NOMATCH);
+               case '?':
+                       if (*string == EOS)
+                               return (FNM_NOMATCH);
+                       if (*string == '/' && (flags & FNM_PATHNAME))
+                               return (FNM_NOMATCH);
+                       if (*string == '.' && (flags & FNM_PERIOD) &&
+                           (string == stringstart ||
+                           ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
+                               return (FNM_NOMATCH);
+                       ++string;
+                       break;
+               case '*':
+                       c = *pattern;
+                       /* Collapse multiple stars. */
+                       while (c == '*')
+                               c = *++pattern;
+
+                       if (*string == '.' && (flags & FNM_PERIOD) &&
+                           (string == stringstart ||
+                           ((flags & FNM_PATHNAME) && *(string - 1) == '/')))
+                               return (FNM_NOMATCH);
+
+                       /* Optimize for pattern with * at end or before /. */
+                       if (c == EOS)
+                               if (flags & FNM_PATHNAME)
+                                       return (strchr(string, '/') == NULL ?
+                                           0 : FNM_NOMATCH);
+                               else
+                                       return (0);
+                       else if (c == '/' && flags & FNM_PATHNAME) {
+                               if ((string = strchr(string, '/')) == NULL)
+                                       return (FNM_NOMATCH);
+                               break;
+                       }
+
+                       /* General case, use recursion. */
+                       while ((test = *string) != EOS) {
+                               if (!fnmatch(pattern, string, flags & ~FNM_PERIOD))
+                                       return (0);
+                               if (test == '/' && flags & FNM_PATHNAME)
+                                       break;
+                               ++string;
+                       }
+                       return (FNM_NOMATCH);
+               case '[':
+                       if (*string == EOS)
+                               return (FNM_NOMATCH);
+                       if (*string == '/' && flags & FNM_PATHNAME)
+                               return (FNM_NOMATCH);
+                       if ((pattern =
+                           rangematch(pattern, *string, flags)) == NULL)
+                               return (FNM_NOMATCH);
+                       ++string;
+                       break;
+               case '\\':
+                       if (!(flags & FNM_NOESCAPE)) {
+                               if ((c = *pattern++) == EOS) {
+                                       c = '\\';
+                                       --pattern;
+                               }
+                       }
+                       /* FALLTHROUGH */
+               default:
+                       if (c != *string++)
+                               return (FNM_NOMATCH);
+                       break;
+               }
+       /* NOTREACHED */
+}
+
+static const char *
+rangematch(pattern, test, flags)
+       const char *pattern;
+       int test, flags;
+{
+       int negate, ok;
+       char c, c2;
+
+       /*
+        * A bracket expression starting with an unquoted circumflex
+        * character produces unspecified results (IEEE 1003.2-1992,
+        * 3.13.2).  This implementation treats it like '!', for
+        * consistency with the regular expression syntax.
+        * J.T. Conklin (conklin@ngai.kaleida.com)
+        */
+       if (negate = (*pattern == '!' || *pattern == '^'))
+               ++pattern;
+       
+       for (ok = 0; (c = *pattern++) != ']';) {
+               if (c == '\\' && !(flags & FNM_NOESCAPE))
+                       c = *pattern++;
+               if (c == EOS)
+                       return (NULL);
+               if (*pattern == '-' 
+                   && (c2 = *(pattern+1)) != EOS && c2 != ']') {
+                       pattern += 2;
+                       if (c2 == '\\' && !(flags & FNM_NOESCAPE))
+                               c2 = *pattern++;
+                       if (c2 == EOS)
+                               return (NULL);
+                       if (c <= test && test <= c2)
+                               ok = 1;
+               } else if (c == test)
+                       ok = 1;
+       }
+       return (ok == negate ? NULL : pattern);
+}
diff --git a/gen.subproj/ftok.3 b/gen.subproj/ftok.3
new file mode 100644 (file)
index 0000000..ceed639
--- /dev/null
@@ -0,0 +1,87 @@
+.\"    $OpenBSD: ftok.3,v 1.8 1999/07/07 10:55:36 aaron Exp $
+.\"
+.\" Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the author may not be used to endorse or promote products
+.\"    derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd June 24, 1994
+.Dt FTOK 3
+.Os
+.Sh NAME
+.Nm ftok
+.Nd create IPC indentifier from a pathname
+.Sh SYNOPSIS
+.Fd #include <sys/types.h>
+.Fd #include <sys/ipc.h>
+.Ft key_t
+.Fn ftok "const char *path" "int id" ;
+.Sh DESCRIPTION
+The
+.Fn ftok
+function attempts to create a unique key suitable for use with the
+.Xr msgget 2 ,
+.Xr semget 2
+and
+.Xr shmget 2
+functions given the
+.Fa path
+of an existing file and a user-selectable
+.Fa id .
+.Pp
+The specified
+.Fa path
+must refer to an existing file that is accessible to the calling process
+or the call will fail.  Also, note that links to files will return the
+same key, given the same
+.Fa id .
+Only the 8 least significant bits of
+.Fa id
+are used in the key generation; the rest of the bits are ignored.
+.Sh RETURN VALUES
+The
+.Fn ftok
+function will return (key_t)\-1 if
+.Fa path
+does not exist or if it cannot be accessed by the calling process.
+.Sh SEE ALSO
+.Xr msgget 2 ,
+.Xr semget 2 ,
+.Xr shmget 2
+.Sh HISTORY
+The
+.Fn ftok
+function originated with System V and is typically used by programs
+that use the System V IPC routines.
+.Sh AUTHOR
+Thorsten Lockert <tholo@sigmasoft.com>
+.Sh BUGS
+The returned key is computed based on the device and inode of the
+specified
+.Fa path
+in combination with the given
+.Fa id .
+Thus it is quite possible for the routine to return duplicate keys
+given that those fields are not 8- and 16-bit quantities like they
+were on System V based systems where this library routine's ancestors
+were originally created.
diff --git a/gen.subproj/ftok.c b/gen.subproj/ftok.c
new file mode 100644 (file)
index 0000000..fc70f62
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1994 SigmaSoft, Th. Lockert <tholo@sigmasoft.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$Id: ftok.c,v 1.1.1.1 1999/10/14 21:08:51 wsanchez Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ipc.h>
+
+key_t
+ftok(path, id)
+       const char *path;
+       int id;
+{
+       struct stat st;
+
+       if (stat(path, &st) < 0)
+               return (key_t)-1;
+
+       return (key_t) ((id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff));
+}
diff --git a/gen.subproj/fts.c b/gen.subproj/fts.c
new file mode 100644 (file)
index 0000000..75576d7
--- /dev/null
@@ -0,0 +1,1015 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <fts.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static FTSENT  *fts_alloc __P((FTS *, char *, int));
+static FTSENT  *fts_build __P((FTS *, int));
+static void     fts_lfree __P((FTSENT *));
+static void     fts_load __P((FTS *, FTSENT *));
+static size_t   fts_maxarglen __P((char * const *));
+static void     fts_padjust __P((FTS *, void *));
+static int      fts_palloc __P((FTS *, size_t));
+static FTSENT  *fts_sort __P((FTS *, FTSENT *, int));
+static u_short  fts_stat __P((FTS *, FTSENT *, int));
+
+#define        ISDOT(a)        (a[0] == '.' && (!a[1] || a[1] == '.' && !a[2]))
+
+#define        ISSET(opt)      (sp->fts_options & opt)
+#define        SET(opt)        (sp->fts_options |= opt)
+
+#define        CHDIR(sp, path) (!ISSET(FTS_NOCHDIR) && chdir(path))
+#define        FCHDIR(sp, fd)  (!ISSET(FTS_NOCHDIR) && fchdir(fd))
+
+/* fts_build flags */
+#define        BCHILD          1               /* fts_children */
+#define        BNAMES          2               /* fts_children, names only */
+#define        BREAD           3               /* fts_read */
+
+FTS *
+fts_open(argv, options, compar)
+       char * const *argv;
+       register int options;
+       int (*compar)();
+{
+       register FTS *sp;
+       register FTSENT *p, *root;
+       register int nitems;
+       FTSENT *parent, *tmp;
+       int len;
+
+       /* Options check. */
+       if (options & ~FTS_OPTIONMASK) {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       /* Allocate/initialize the stream */
+       if ((sp = malloc((u_int)sizeof(FTS))) == NULL)
+               return (NULL);
+       memset(sp, 0, sizeof(FTS));
+       sp->fts_compar = compar;
+       sp->fts_options = options;
+
+       /* Logical walks turn on NOCHDIR; symbolic links are too hard. */
+       if (ISSET(FTS_LOGICAL))
+               SET(FTS_NOCHDIR);
+
+       /*
+        * Start out with 1K of path space, and enough, in any case,
+        * to hold the user's paths.
+        */
+       if (fts_palloc(sp, MAX(fts_maxarglen(argv), MAXPATHLEN)))
+               goto mem1;
+
+       /* Allocate/initialize root's parent. */
+       if ((parent = fts_alloc(sp, "", 0)) == NULL)
+               goto mem2;
+       parent->fts_level = FTS_ROOTPARENTLEVEL;
+
+       /* Allocate/initialize root(s). */
+       for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) {
+               /* Don't allow zero-length paths. */
+               if ((len = strlen(*argv)) == 0) {
+                       errno = ENOENT;
+                       goto mem3;
+               }
+
+               p = fts_alloc(sp, *argv, len);
+               p->fts_level = FTS_ROOTLEVEL;
+               p->fts_parent = parent;
+               p->fts_accpath = p->fts_name;
+               p->fts_info = fts_stat(sp, p, ISSET(FTS_COMFOLLOW));
+
+               /* Command-line "." and ".." are real directories. */
+               if (p->fts_info == FTS_DOT)
+                       p->fts_info = FTS_D;
+
+               /*
+                * If comparison routine supplied, traverse in sorted
+                * order; otherwise traverse in the order specified.
+                */
+               if (compar) {
+                       p->fts_link = root;
+                       root = p;
+               } else {
+                       p->fts_link = NULL;
+                       if (root == NULL)
+                               tmp = root = p;
+                       else {
+                               tmp->fts_link = p;
+                               tmp = p;
+                       }
+               }
+       }
+       if (compar && nitems > 1)
+               root = fts_sort(sp, root, nitems);
+
+       /*
+        * Allocate a dummy pointer and make fts_read think that we've just
+        * finished the node before the root(s); set p->fts_info to FTS_INIT
+        * so that everything about the "current" node is ignored.
+        */
+       if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL)
+               goto mem3;
+       sp->fts_cur->fts_link = root;
+       sp->fts_cur->fts_info = FTS_INIT;
+
+       /*
+        * If using chdir(2), grab a file descriptor pointing to dot to insure
+        * that we can get back here; this could be avoided for some paths,
+        * but almost certainly not worth the effort.  Slashes, symbolic links,
+        * and ".." are all fairly nasty problems.  Note, if we can't get the
+        * descriptor we run anyway, just more slowly.
+        */
+       if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = open(".", O_RDONLY, 0)) < 0)
+               SET(FTS_NOCHDIR);
+
+       return (sp);
+
+mem3:  fts_lfree(root);
+       free(parent);
+mem2:  free(sp->fts_path);
+mem1:  free(sp);
+       return (NULL);
+}
+
+static void
+fts_load(sp, p)
+       FTS *sp;
+       register FTSENT *p;
+{
+       register int len;
+       register char *cp;
+
+       /*
+        * Load the stream structure for the next traversal.  Since we don't
+        * actually enter the directory until after the preorder visit, set
+        * the fts_accpath field specially so the chdir gets done to the right
+        * place and the user can access the first node.  From fts_open it's
+        * known that the path will fit.
+        */
+       len = p->fts_pathlen = p->fts_namelen;
+       memmove(sp->fts_path, p->fts_name, len + 1);
+       if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) {
+               len = strlen(++cp);
+               memmove(p->fts_name, cp, len + 1);
+               p->fts_namelen = len;
+       }
+       p->fts_accpath = p->fts_path = sp->fts_path;
+       sp->fts_dev = p->fts_dev;
+}
+
+int
+fts_close(sp)
+       FTS *sp;
+{
+       register FTSENT *freep, *p;
+       int saved_errno = 0;
+
+       /*
+        * This still works if we haven't read anything -- the dummy structure
+        * points to the root list, so we step through to the end of the root
+        * list which has a valid parent pointer.
+        */
+       if (sp->fts_cur) {
+               for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
+                       freep = p;
+                       p = p->fts_link ? p->fts_link : p->fts_parent;
+                       free(freep);
+               }
+               free(p);
+       }
+
+       /* Free up child linked list, sort array, path buffer. */
+       if (sp->fts_child)
+               fts_lfree(sp->fts_child);
+       if (sp->fts_array)
+               free(sp->fts_array);
+       free(sp->fts_path);
+
+       /* Return to original directory, save errno if necessary. */
+       if (!ISSET(FTS_NOCHDIR)) {
+            if (fchdir(sp->fts_rfd)) {
+                saved_errno = errno;
+            }
+            (void)close(sp->fts_rfd);
+       }
+
+       /* Free up the stream pointer. */
+       free(sp);
+
+       /* Set errno and return. */
+       if (saved_errno) {
+               errno = saved_errno;
+               return (-1);
+       }
+       return (0);
+}
+
+/*
+ * Special case a root of "/" so that slashes aren't appended which would
+ * cause paths to be written as "//foo".
+ */
+#define        NAPPEND(p)                                                      \
+       (p->fts_level == FTS_ROOTLEVEL && p->fts_pathlen == 1 &&        \
+           p->fts_path[0] == '/' ? 0 : p->fts_pathlen)
+
+FTSENT *
+fts_read(sp)
+       register FTS *sp;
+{
+       register FTSENT *p, *tmp;
+       register int instr;
+       register char *t;
+       int saved_errno;
+
+       /* If finished or unrecoverable error, return NULL. */
+       if (sp->fts_cur == NULL || ISSET(FTS_STOP))
+               return (NULL);
+
+       /* Set current node pointer. */
+       p = sp->fts_cur;
+
+       /* Save and zero out user instructions. */
+       instr = p->fts_instr;
+       p->fts_instr = FTS_NOINSTR;
+
+       /* Any type of file may be re-visited; re-stat and re-turn. */
+       if (instr == FTS_AGAIN) {
+               p->fts_info = fts_stat(sp, p, 0);
+               return (p);
+       }
+
+       /*
+        * Following a symlink -- SLNONE test allows application to see
+        * SLNONE and recover.  If indirecting through a symlink, have
+        * keep a pointer to current location.  If unable to get that
+        * pointer, follow fails.
+        */
+       if (instr == FTS_FOLLOW &&
+           (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
+               p->fts_info = fts_stat(sp, p, 1);
+               if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR))
+                       if ((p->fts_symfd = open(".", O_RDONLY, 0)) < 0) {
+                               p->fts_errno = errno;
+                               p->fts_info = FTS_ERR;
+                       } else
+                               p->fts_flags |= FTS_SYMFOLLOW;
+               return (p);
+       }
+
+       /* Directory in pre-order. */
+       if (p->fts_info == FTS_D) {
+               /* If skipped or crossed mount point, do post-order visit. */
+               if (instr == FTS_SKIP ||
+                   ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev) {
+                       if (p->fts_flags & FTS_SYMFOLLOW)
+                               (void)close(p->fts_symfd);
+                       if (sp->fts_child) {
+                               fts_lfree(sp->fts_child);
+                               sp->fts_child = NULL;
+                       }
+                       p->fts_info = FTS_DP;
+                       return (p);
+               } 
+
+               /* Rebuild if only read the names and now traversing. */
+               if (sp->fts_child && sp->fts_options & FTS_NAMEONLY) {
+                       sp->fts_options &= ~FTS_NAMEONLY;
+                       fts_lfree(sp->fts_child);
+                       sp->fts_child = NULL;
+               }
+
+               /*
+                * Cd to the subdirectory.
+                *
+                * If have already read and now fail to chdir, whack the list
+                * to make the names come out right, and set the parent errno
+                * so the application will eventually get an error condition.
+                * Set the FTS_DONTCHDIR flag so that when we logically change
+                * directories back to the parent we don't do a chdir.
+                *
+                * If haven't read do so.  If the read fails, fts_build sets
+                * FTS_STOP or the fts_info field of the node.
+                */
+               if (sp->fts_child) {
+                       if (CHDIR(sp, p->fts_accpath)) {
+                               p->fts_errno = errno;
+                               p->fts_flags |= FTS_DONTCHDIR;
+                               for (p = sp->fts_child; p; p = p->fts_link)
+                                       p->fts_accpath =
+                                           p->fts_parent->fts_accpath;
+                       }
+               } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) {
+                       if (ISSET(FTS_STOP))
+                               return (NULL);
+                       return (p);
+               }
+               p = sp->fts_child;
+               sp->fts_child = NULL;
+               goto name;
+       }
+
+       /* Move to the next node on this level. */
+next:  tmp = p;
+       if (p = p->fts_link) {
+               free(tmp);
+
+               /*
+                * If reached the top, return to the original directory, and
+                * load the paths for the next root.
+                */
+               if (p->fts_level == FTS_ROOTLEVEL) {
+                       if (!ISSET(FTS_NOCHDIR) && FCHDIR(sp, sp->fts_rfd)) {
+                               SET(FTS_STOP);
+                               return (NULL);
+                       }
+                       fts_load(sp, p);
+                       return (sp->fts_cur = p);
+               }
+
+               /*
+                * User may have called fts_set on the node.  If skipped,
+                * ignore.  If followed, get a file descriptor so we can
+                * get back if necessary.
+                */
+               if (p->fts_instr == FTS_SKIP)
+                       goto next;
+               if (p->fts_instr == FTS_FOLLOW) {
+                       p->fts_info = fts_stat(sp, p, 1);
+                       if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR))
+                               if ((p->fts_symfd =
+                                   open(".", O_RDONLY, 0)) < 0) {
+                                       p->fts_errno = errno;
+                                       p->fts_info = FTS_ERR;
+                               } else
+                                       p->fts_flags |= FTS_SYMFOLLOW;
+                       p->fts_instr = FTS_NOINSTR;
+               }
+
+name:          t = sp->fts_path + NAPPEND(p->fts_parent);
+               *t++ = '/';
+               memmove(t, p->fts_name, p->fts_namelen + 1);
+               return (sp->fts_cur = p);
+       }
+
+       /* Move up to the parent node. */
+       p = tmp->fts_parent;
+       free(tmp);
+
+       if (p->fts_level == FTS_ROOTPARENTLEVEL) {
+               /*
+                * Done; free everything up and set errno to 0 so the user
+                * can distinguish between error and EOF.
+                */
+               free(p);
+               errno = 0;
+               return (sp->fts_cur = NULL);
+       }
+
+       /* Nul terminate the pathname. */
+       sp->fts_path[p->fts_pathlen] = '\0';
+
+       /*
+        * Return to the parent directory.  If at a root node or came through
+        * a symlink, go back through the file descriptor.  Otherwise, cd up
+        * one directory.
+        */
+       if (p->fts_level == FTS_ROOTLEVEL) {
+               if (!ISSET(FTS_NOCHDIR) && FCHDIR(sp, sp->fts_rfd)) {
+                       SET(FTS_STOP);
+                       return (NULL);
+               }
+       } else if (p->fts_flags & FTS_SYMFOLLOW) {
+               if (FCHDIR(sp, p->fts_symfd)) {
+                       saved_errno = errno;
+                       (void)close(p->fts_symfd);
+                       errno = saved_errno;
+                       SET(FTS_STOP);
+                       return (NULL);
+               }
+               (void)close(p->fts_symfd);
+       } else if (!(p->fts_flags & FTS_DONTCHDIR)) {
+               if (CHDIR(sp, "..")) {
+                       SET(FTS_STOP);
+                       return (NULL);
+               }
+       }
+       p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
+       return (sp->fts_cur = p);
+}
+
+/*
+ * Fts_set takes the stream as an argument although it's not used in this
+ * implementation; it would be necessary if anyone wanted to add global
+ * semantics to fts using fts_set.  An error return is allowed for similar
+ * reasons.
+ */
+/* ARGSUSED */
+int
+fts_set(sp, p, instr)
+       FTS *sp;
+       FTSENT *p;
+       int instr;
+{
+       if (instr && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
+           instr != FTS_NOINSTR && instr != FTS_SKIP) {
+               errno = EINVAL;
+               return (1);
+       }
+       p->fts_instr = instr;
+       return (0);
+}
+
+FTSENT *
+fts_children(sp, instr)
+       register FTS *sp;
+       int instr;
+{
+       register FTSENT *p;
+       int fd;
+
+       if (instr && instr != FTS_NAMEONLY) {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       /* Set current node pointer. */
+       p = sp->fts_cur;
+
+       /*
+        * Errno set to 0 so user can distinguish empty directory from
+        * an error.
+        */
+       errno = 0;
+
+       /* Fatal errors stop here. */
+       if (ISSET(FTS_STOP))
+               return (NULL);
+
+       /* Return logical hierarchy of user's arguments. */
+       if (p->fts_info == FTS_INIT)
+               return (p->fts_link);
+
+       /*
+        * If not a directory being visited in pre-order, stop here.  Could
+        * allow FTS_DNR, assuming the user has fixed the problem, but the
+        * same effect is available with FTS_AGAIN.
+        */
+       if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */)
+               return (NULL);
+
+       /* Free up any previous child list. */
+       if (sp->fts_child)
+               fts_lfree(sp->fts_child);
+
+       if (instr == FTS_NAMEONLY) {
+               sp->fts_options |= FTS_NAMEONLY;
+               instr = BNAMES;
+       } else 
+               instr = BCHILD;
+
+       /*
+        * If using chdir on a relative path and called BEFORE fts_read does
+        * its chdir to the root of a traversal, we can lose -- we need to
+        * chdir into the subdirectory, and we don't know where the current
+        * directory is, so we can't get back so that the upcoming chdir by
+        * fts_read will work.
+        */
+       if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' ||
+           ISSET(FTS_NOCHDIR))
+               return (sp->fts_child = fts_build(sp, instr));
+
+       if ((fd = open(".", O_RDONLY, 0)) < 0)
+               return (NULL);
+       sp->fts_child = fts_build(sp, instr);
+       if (fchdir(fd))
+               return (NULL);
+       (void)close(fd);
+       return (sp->fts_child);
+}
+
+/*
+ * This is the tricky part -- do not casually change *anything* in here.  The
+ * idea is to build the linked list of entries that are used by fts_children
+ * and fts_read.  There are lots of special cases.
+ *
+ * The real slowdown in walking the tree is the stat calls.  If FTS_NOSTAT is
+ * set and it's a physical walk (so that symbolic links can't be directories),
+ * we can do things quickly.  First, if it's a 4.4BSD file system, the type
+ * of the file is in the directory entry.  Otherwise, we assume that the number
+ * of subdirectories in a node is equal to the number of links to the parent.
+ * The former skips all stat calls.  The latter skips stat calls in any leaf
+ * directories and for any files after the subdirectories in the directory have
+ * been found, cutting the stat calls by about 2/3.
+ */
+static FTSENT *
+fts_build(sp, type)
+       register FTS *sp;
+       int type;
+{
+       register struct dirent *dp;
+       register FTSENT *p, *head;
+       register int nitems;
+       FTSENT *cur, *tail;
+       DIR *dirp;
+       void *adjaddr;
+       int cderrno, descend, len, level, maxlen, nlinks, oflag, saved_errno;
+       char *cp;
+
+       /* Set current node pointer. */
+       cur = sp->fts_cur;
+
+       /*
+        * Open the directory for reading.  If this fails, we're done.
+        * If being called from fts_read, set the fts_info field.
+        */
+#ifdef FTS_WHITEOUT
+       if (ISSET(FTS_WHITEOUT))
+               oflag = DTF_NODUP|DTF_REWIND;
+       else
+               oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
+#else
+#define __opendir2(path, flag) opendir(path)
+#endif
+       if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {
+               if (type == BREAD) {
+                       cur->fts_info = FTS_DNR;
+                       cur->fts_errno = errno;
+               }
+               return (NULL);
+       }
+
+       /*
+        * Nlinks is the number of possible entries of type directory in the
+        * directory if we're cheating on stat calls, 0 if we're not doing
+        * any stat calls at all, -1 if we're doing stats on everything.
+        */
+       if (type == BNAMES)
+               nlinks = 0;
+       else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL))
+               nlinks = cur->fts_nlink - (ISSET(FTS_SEEDOT) ? 0 : 2);
+       else
+               nlinks = -1;
+
+#ifdef notdef
+       (void)printf("nlinks == %d (cur: %d)\n", nlinks, cur->fts_nlink);
+       (void)printf("NOSTAT %d PHYSICAL %d SEEDOT %d\n",
+           ISSET(FTS_NOSTAT), ISSET(FTS_PHYSICAL), ISSET(FTS_SEEDOT));
+#endif
+       /*
+        * If we're going to need to stat anything or we want to descend
+        * and stay in the directory, chdir.  If this fails we keep going,
+        * but set a flag so we don't chdir after the post-order visit.
+        * We won't be able to stat anything, but we can still return the
+        * names themselves.  Note, that since fts_read won't be able to
+        * chdir into the directory, it will have to return different path
+        * names than before, i.e. "a/b" instead of "b".  Since the node
+        * has already been visited in pre-order, have to wait until the
+        * post-order visit to return the error.  There is a special case
+        * here, if there was nothing to stat then it's not an error to
+        * not be able to stat.  This is all fairly nasty.  If a program
+        * needed sorted entries or stat information, they had better be
+        * checking FTS_NS on the returned nodes.
+        */
+       cderrno = 0;
+       if (nlinks || type == BREAD)
+               if (FCHDIR(sp, dirfd(dirp))) {
+                       if (nlinks && type == BREAD)
+                               cur->fts_errno = errno;
+                       cur->fts_flags |= FTS_DONTCHDIR;
+                       descend = 0;
+                       cderrno = errno;
+               } else
+                       descend = 1;
+       else
+               descend = 0;
+
+       /*
+        * Figure out the max file name length that can be stored in the
+        * current path -- the inner loop allocates more path as necessary.
+        * We really wouldn't have to do the maxlen calculations here, we
+        * could do them in fts_read before returning the path, but it's a
+        * lot easier here since the length is part of the dirent structure.
+        *
+        * If not changing directories set a pointer so that can just append
+        * each new name into the path.
+        */
+       maxlen = sp->fts_pathlen - cur->fts_pathlen - 1;
+       len = NAPPEND(cur);
+       if (ISSET(FTS_NOCHDIR)) {
+               cp = sp->fts_path + len;
+               *cp++ = '/';
+       }
+
+       level = cur->fts_level + 1;
+
+       /* Read the directory, attaching each entry to the `link' pointer. */
+       adjaddr = NULL;
+       for (head = tail = NULL, nitems = 0; dp = readdir(dirp);) {
+               if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
+                       continue;
+
+               if ((p = fts_alloc(sp, dp->d_name, (int)dp->d_namlen)) == NULL)
+                       goto mem1;
+               if (dp->d_namlen > maxlen) {
+                       if (fts_palloc(sp, (size_t)dp->d_namlen)) {
+                               /*
+                                * No more memory for path or structures.  Save
+                                * errno, free up the current structure and the
+                                * structures already allocated.
+                                */
+mem1:                          saved_errno = errno;
+                               if (p)
+                                       free(p);
+                               fts_lfree(head);
+                               (void)closedir(dirp);
+                               errno = saved_errno;
+                               cur->fts_info = FTS_ERR;
+                               SET(FTS_STOP);
+                               return (NULL);
+                       }
+                       adjaddr = sp->fts_path;
+                       maxlen = sp->fts_pathlen - sp->fts_cur->fts_pathlen - 1;
+               }
+
+               p->fts_pathlen = len + dp->d_namlen + 1;
+               p->fts_parent = sp->fts_cur;
+               p->fts_level = level;
+
+#ifdef FTS_WHITEOUT
+               if (dp->d_type == DT_WHT)
+                       p->fts_flags |= FTS_ISW;
+#endif
+
+               if (cderrno) {
+                       if (nlinks) {
+                               p->fts_info = FTS_NS;
+                               p->fts_errno = cderrno;
+                       } else
+                               p->fts_info = FTS_NSOK;
+                       p->fts_accpath = cur->fts_accpath;
+               } else if (nlinks == 0
+#ifdef DT_DIR
+                   || nlinks > 0 && 
+                   dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN
+#endif
+                   ) {
+                       p->fts_accpath =
+                           ISSET(FTS_NOCHDIR) ? p->fts_path : p->fts_name;
+                       p->fts_info = FTS_NSOK;
+               } else {
+                       /* Build a file name for fts_stat to stat. */
+                       if (ISSET(FTS_NOCHDIR)) {
+                               p->fts_accpath = p->fts_path;
+                               memmove(cp, p->fts_name, p->fts_namelen + 1);
+                       } else
+                               p->fts_accpath = p->fts_name;
+                       /* Stat it. */
+                       p->fts_info = fts_stat(sp, p, 0);
+
+                       /* Decrement link count if applicable. */
+                       if (nlinks > 0 && (p->fts_info == FTS_D ||
+                           p->fts_info == FTS_DC || p->fts_info == FTS_DOT))
+                               --nlinks;
+               }
+
+               /* We walk in directory order so "ls -f" doesn't get upset. */
+               p->fts_link = NULL;
+               if (head == NULL)
+                       head = tail = p;
+               else {
+                       tail->fts_link = p;
+                       tail = p;
+               }
+               ++nitems;
+       }
+       (void)closedir(dirp);
+
+       /*
+        * If had to realloc the path, adjust the addresses for the rest
+        * of the tree.
+        */
+       if (adjaddr)
+               fts_padjust(sp, adjaddr);
+
+       /*
+        * If not changing directories, reset the path back to original
+        * state.
+        */
+       if (ISSET(FTS_NOCHDIR)) {
+               if (cp - 1 > sp->fts_path)
+                       --cp;
+               *cp = '\0';
+       }
+
+       /*
+        * If descended after called from fts_children or after called from
+        * fts_read and nothing found, get back.  At the root level we use
+        * the saved fd; if one of fts_open()'s arguments is a relative path
+        * to an empty directory, we wind up here with no other way back.  If
+        * can't get back, we're done.
+        */
+       if (descend && (type == BCHILD || !nitems) &&
+           (cur->fts_level == FTS_ROOTLEVEL ?
+           FCHDIR(sp, sp->fts_rfd) : CHDIR(sp, ".."))) {
+               cur->fts_info = FTS_ERR;
+               SET(FTS_STOP);
+               return (NULL);
+       }
+
+       /* If didn't find anything, return NULL. */
+       if (!nitems) {
+               if (type == BREAD)
+                       cur->fts_info = FTS_DP;
+               return (NULL);
+       }
+
+       /* Sort the entries. */
+       if (sp->fts_compar && nitems > 1)
+               head = fts_sort(sp, head, nitems);
+       return (head);
+}
+
+static u_short
+fts_stat(sp, p, follow)
+       FTS *sp;
+       register FTSENT *p;
+       int follow;
+{
+       register FTSENT *t;
+       register dev_t dev;
+       register ino_t ino;
+       struct stat *sbp, sb;
+       int saved_errno;
+
+       /* If user needs stat info, stat buffer already allocated. */
+       sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp;
+
+#ifdef FTS_WHITEOUT
+       /* check for whiteout */
+       if (p->fts_flags & FTS_ISW) {
+               if (sbp != &sb) {
+                       memset(sbp, '\0', sizeof (*sbp));
+                       sbp->st_mode = S_IFWHT;
+               }
+               return (FTS_W);
+       }
+#endif
+       
+       /*
+        * If doing a logical walk, or application requested FTS_FOLLOW, do
+        * a stat(2).  If that fails, check for a non-existent symlink.  If
+        * fail, set the errno from the stat call.
+        */
+       if (ISSET(FTS_LOGICAL) || follow) {
+               if (stat(p->fts_accpath, sbp)) {
+                       saved_errno = errno;
+                       if (!lstat(p->fts_accpath, sbp)) {
+                               errno = 0;
+                               return (FTS_SLNONE);
+                       } 
+                       p->fts_errno = saved_errno;
+                       goto err;
+               }
+       } else if (lstat(p->fts_accpath, sbp)) {
+               p->fts_errno = errno;
+err:           memset(sbp, 0, sizeof(struct stat));
+               return (FTS_NS);
+       }
+
+       if (S_ISDIR(sbp->st_mode)) {
+               /*
+                * Set the device/inode.  Used to find cycles and check for
+                * crossing mount points.  Also remember the link count, used
+                * in fts_build to limit the number of stat calls.  It is
+                * understood that these fields are only referenced if fts_info
+                * is set to FTS_D.
+                */
+               dev = p->fts_dev = sbp->st_dev;
+               ino = p->fts_ino = sbp->st_ino;
+               p->fts_nlink = sbp->st_nlink;
+
+               if (ISDOT(p->fts_name))
+                       return (FTS_DOT);
+
+               /*
+                * Cycle detection is done by brute force when the directory
+                * is first encountered.  If the tree gets deep enough or the
+                * number of symbolic links to directories is high enough,
+                * something faster might be worthwhile.
+                */
+               for (t = p->fts_parent;
+                   t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
+                       if (ino == t->fts_ino && dev == t->fts_dev) {
+                               p->fts_cycle = t;
+                               return (FTS_DC);
+                       }
+               return (FTS_D);
+       }
+       if (S_ISLNK(sbp->st_mode))
+               return (FTS_SL);
+       if (S_ISREG(sbp->st_mode))
+               return (FTS_F);
+       return (FTS_DEFAULT);
+}
+
+static FTSENT *
+fts_sort(sp, head, nitems)
+       FTS *sp;
+       FTSENT *head;
+       register int nitems;
+{
+       register FTSENT **ap, *p;
+
+       /*
+        * Construct an array of pointers to the structures and call qsort(3).
+        * Reassemble the array in the order returned by qsort.  If unable to
+        * sort for memory reasons, return the directory entries in their
+        * current order.  Allocate enough space for the current needs plus
+        * 40 so don't realloc one entry at a time.
+        */
+       if (nitems > sp->fts_nitems) {
+               sp->fts_nitems = nitems + 40;
+               if ((sp->fts_array = realloc(sp->fts_array,
+                   (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) {
+                       sp->fts_nitems = 0;
+                       return (head);
+               }
+       }
+       for (ap = sp->fts_array, p = head; p; p = p->fts_link)
+               *ap++ = p;
+       qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), sp->fts_compar);
+       for (head = *(ap = sp->fts_array); --nitems; ++ap)
+               ap[0]->fts_link = ap[1];
+       ap[0]->fts_link = NULL;
+       return (head);
+}
+
+static FTSENT *
+fts_alloc(sp, name, namelen)
+       FTS *sp;
+       char *name;
+       register int namelen;
+{
+       register FTSENT *p;
+       size_t len;
+
+       /*
+        * The file name is a variable length array and no stat structure is
+        * necessary if the user has set the nostat bit.  Allocate the FTSENT
+        * structure, the file name and the stat structure in one chunk, but
+        * be careful that the stat structure is reasonably aligned.  Since the
+        * fts_name field is declared to be of size 1, the fts_name pointer is
+        * namelen + 2 before the first possible address of the stat structure.
+        */
+       len = sizeof(FTSENT) + namelen;
+       if (!ISSET(FTS_NOSTAT))
+               len += sizeof(struct stat) + ALIGNBYTES;
+       if ((p = malloc(len)) == NULL)
+               return (NULL);
+
+       /* Copy the name plus the trailing NULL. */
+       memmove(p->fts_name, name, namelen + 1);
+
+       if (!ISSET(FTS_NOSTAT))
+               p->fts_statp = (struct stat *)ALIGN(p->fts_name + namelen + 2);
+       p->fts_namelen = namelen;
+       p->fts_path = sp->fts_path;
+       p->fts_errno = 0;
+       p->fts_flags = 0;
+       p->fts_instr = FTS_NOINSTR;
+       p->fts_number = 0;
+       p->fts_pointer = NULL;
+       return (p);
+}
+
+static void
+fts_lfree(head)
+       register FTSENT *head;
+{
+       register FTSENT *p;
+
+       /* Free a linked list of structures. */
+       while (p = head) {
+               head = head->fts_link;
+               free(p);
+       }
+}
+
+/*
+ * Allow essentially unlimited paths; find, rm, ls should all work on any tree.
+ * Most systems will allow creation of paths much longer than MAXPATHLEN, even
+ * though the kernel won't resolve them.  Add the size (not just what's needed)
+ * plus 256 bytes so don't realloc the path 2 bytes at a time. 
+ */
+static int
+fts_palloc(sp, more)
+       FTS *sp;
+       size_t more;
+{
+       sp->fts_pathlen += more + 256;
+       sp->fts_path = realloc(sp->fts_path, (size_t)sp->fts_pathlen);
+       return (sp->fts_path == NULL);
+}
+
+/*
+ * When the path is realloc'd, have to fix all of the pointers in structures
+ * already returned.
+ */
+static void
+fts_padjust(sp, addr)
+       FTS *sp;
+       void *addr;
+{
+       FTSENT *p;
+
+#define        ADJUST(p) {                                                     \
+       (p)->fts_accpath =                                              \
+           (char *)addr + ((p)->fts_accpath - (p)->fts_path);          \
+       (p)->fts_path = addr;                                           \
+}
+       /* Adjust the current set of children. */
+       for (p = sp->fts_child; p; p = p->fts_link)
+               ADJUST(p);
+
+       /* Adjust the rest of the tree. */
+       for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
+               ADJUST(p);
+               p = p->fts_link ? p->fts_link : p->fts_parent;
+       }
+}
+
+static size_t
+fts_maxarglen(argv)
+       char * const *argv;
+{
+       size_t len, max;
+
+       for (max = 0; *argv; ++argv)
+               if ((len = strlen(*argv)) > max)
+                       max = len;
+       return (max);
+}
diff --git a/gen.subproj/getbsize.c b/gen.subproj/getbsize.c
new file mode 100644 (file)
index 0000000..8d64465
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *
+getbsize(headerlenp, blocksizep)
+       int *headerlenp;
+       long *blocksizep;
+{
+       static char header[20];
+       long n, max, mul, blocksize;
+       char *ep, *p, *form;
+
+#define        KB      (1024L)
+#define        MB      (1024L * 1024L)
+#define        GB      (1024L * 1024L * 1024L)
+#define        MAXB    GB              /* No tera, peta, nor exa. */
+       form = "";
+       if ((p = getenv("BLOCKSIZE")) != NULL && *p != '\0') {
+               if ((n = strtol(p, &ep, 10)) < 0)
+                       goto underflow;
+               if (n == 0)
+                       n = 1;
+               if (*ep && ep[1])
+                       goto fmterr;
+               switch (*ep) {
+               case 'G': case 'g':
+                       form = "G";
+                       max = MAXB / GB;
+                       mul = GB;
+                       break;
+               case 'K': case 'k':
+                       form = "K";
+                       max = MAXB / KB;
+                       mul = KB;
+                       break;
+               case 'M': case 'm':
+                       form = "M";
+                       max = MAXB / MB;
+                       mul = MB;
+                       break;
+               case '\0':
+                       max = MAXB;
+                       mul = 1;
+                       break;
+               default:
+fmterr:                        warnx("%s: unknown blocksize", p);
+                       n = 512;
+                       mul = 1;
+                       break;
+               }
+               if (n > max) {
+                       warnx("maximum blocksize is %dG", MAXB / GB);
+                       n = max;
+               }
+               if ((blocksize = n * mul) < 512) {
+underflow:             warnx("minimum blocksize is 512");
+                       form = "";
+                       blocksize = n = 512;
+               }
+       } else
+               blocksize = n = 512;
+
+       (void)snprintf(header, sizeof(header), "%d%s-blocks", n, form);
+       *headerlenp = strlen(header);
+       *blocksizep = blocksize;
+       return (header);
+}
diff --git a/gen.subproj/getcap.c b/gen.subproj/getcap.c
new file mode 100644 (file)
index 0000000..8ce326b
--- /dev/null
@@ -0,0 +1,1064 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Casey Leedom of Lawrence Livermore National Laboratory.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: getcap.c,v 1.4 1997/02/01 04:35:33 deraadt Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <db.h>
+#include <errno.h>     
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define        BFRAG           1024
+#define        BSIZE           1024
+#define        ESC             ('[' & 037)     /* ASCII ESC */
+#define        MAX_RECURSION   32              /* maximum getent recursion */
+#define        SFRAG           100             /* cgetstr mallocs in SFRAG chunks */
+
+#define RECOK  (char)0
+#define TCERR  (char)1
+#define        SHADOW  (char)2
+
+static size_t   topreclen;     /* toprec length */
+static char    *toprec;        /* Additional record specified by cgetset() */
+static int      gottoprec;     /* Flag indicating retrieval of toprecord */
+
+static int     cdbget __P((DB *, char **, char *));
+static int     getent __P((char **, u_int *, char **, int, char *, int, char *));
+static int     nfcmp __P((char *, char *));
+
+/*
+ * Cgetset() allows the addition of a user specified buffer to be added
+ * to the database array, in effect "pushing" the buffer on top of the
+ * virtual database. 0 is returned on success, -1 on failure.
+ */
+int
+cgetset(ent)
+       char *ent;
+{
+       if (ent == NULL) {
+               if (toprec)
+                       free(toprec);
+                toprec = NULL;
+                topreclen = 0;
+                return (0);
+        }
+        topreclen = strlen(ent);
+        if ((toprec = malloc (topreclen + 1)) == NULL) {
+               errno = ENOMEM;
+                return (-1);
+       }
+       gottoprec = 0;
+        (void)strcpy(toprec, ent);
+        return (0);
+}
+
+/*
+ * Cgetcap searches the capability record buf for the capability cap with
+ * type `type'.  A pointer to the value of cap is returned on success, NULL
+ * if the requested capability couldn't be found.
+ *
+ * Specifying a type of ':' means that nothing should follow cap (:cap:).
+ * In this case a pointer to the terminating ':' or NUL will be returned if
+ * cap is found.
+ *
+ * If (cap, '@') or (cap, terminator, '@') is found before (cap, terminator)
+ * return NULL.
+ */
+char *
+cgetcap(buf, cap, type)
+       char *buf, *cap;
+       int type;
+{
+       register char *bp, *cp;
+
+       bp = buf;
+       for (;;) {
+               /*
+                * Skip past the current capability field - it's either the
+                * name field if this is the first time through the loop, or
+                * the remainder of a field whose name failed to match cap.
+                */
+               for (;;)
+                       if (*bp == '\0')
+                               return (NULL);
+                       else
+                               if (*bp++ == ':')
+                                       break;
+
+               /*
+                * Try to match (cap, type) in buf.
+                */
+               for (cp = cap; *cp == *bp && *bp != '\0'; cp++, bp++)
+                       continue;
+               if (*cp != '\0')
+                       continue;
+               if (*bp == '@')
+                       return (NULL);
+               if (type == ':') {
+                       if (*bp != '\0' && *bp != ':')
+                               continue;
+                       return(bp);
+               }
+               if (*bp != type)
+                       continue;
+               bp++;
+               return (*bp == '@' ? NULL : bp);
+       }
+       /* NOTREACHED */
+}
+
+/*
+ * Cgetent extracts the capability record name from the NULL terminated file
+ * array db_array and returns a pointer to a malloc'd copy of it in buf.
+ * Buf must be retained through all subsequent calls to cgetcap, cgetnum,
+ * cgetflag, and cgetstr, but may then be free'd.  0 is returned on success,
+ * -1 if the requested record couldn't be found, -2 if a system error was
+ * encountered (couldn't open/read a file, etc.), and -3 if a potential
+ * reference loop is detected.
+ */
+int
+cgetent(buf, db_array, name)
+       char **buf, **db_array, *name;
+{
+       u_int dummy;
+
+       return (getent(buf, &dummy, db_array, -1, name, 0, NULL));
+}
+
+/*
+ * Getent implements the functions of cgetent.  If fd is non-negative,
+ * *db_array has already been opened and fd is the open file descriptor.  We
+ * do this to save time and avoid using up file descriptors for tc=
+ * recursions.
+ *
+ * Getent returns the same success/failure codes as cgetent.  On success, a
+ * pointer to a malloc'ed capability record with all tc= capabilities fully
+ * expanded and its length (not including trailing ASCII NUL) are left in
+ * *cap and *len.
+ *
+ * Basic algorithm:
+ *     + Allocate memory incrementally as needed in chunks of size BFRAG
+ *       for capability buffer.
+ *     + Recurse for each tc=name and interpolate result.  Stop when all
+ *       names interpolated, a name can't be found, or depth exceeds
+ *       MAX_RECURSION.
+ */
+static int
+getent(cap, len, db_array, fd, name, depth, nfield)
+       char **cap, **db_array, *name, *nfield;
+       u_int *len;
+       int fd, depth;
+{
+       DB *capdbp;
+       register char *r_end, *rp, **db_p;
+       int myfd, eof, foundit, retval, clen;
+       char *record, *cbuf;
+       int tc_not_resolved;
+       char pbuf[_POSIX_PATH_MAX];
+       
+       /*
+        * Return with ``loop detected'' error if we've recursed more than
+        * MAX_RECURSION times.
+        */
+       if (depth > MAX_RECURSION)
+               return (-3);
+
+       /*
+        * Check if we have a top record from cgetset().
+         */
+       if (depth == 0 && toprec != NULL && cgetmatch(toprec, name) == 0) {
+               if ((record = malloc (topreclen + BFRAG)) == NULL) {
+                       errno = ENOMEM;
+                       return (-2);
+               }
+               (void)strcpy(record, toprec);
+               myfd = 0;
+               db_p = db_array;
+               rp = record + topreclen + 1;
+               r_end = rp + BFRAG;
+               goto tc_exp;
+       }
+       /*
+        * Allocate first chunk of memory.
+        */
+       if ((record = malloc(BFRAG)) == NULL) {
+               errno = ENOMEM;
+               return (-2);
+       }
+       r_end = record + BFRAG;
+       foundit = 0;
+       /*
+        * Loop through database array until finding the record.
+        */
+
+       for (db_p = db_array; *db_p != NULL; db_p++) {
+               eof = 0;
+
+               /*
+                * Open database if not already open.
+                */
+
+               if (fd >= 0) {
+                       (void)lseek(fd, (off_t)0, SEEK_SET);
+                       myfd = 0;
+               } else {
+                       (void)snprintf(pbuf, sizeof(pbuf), "%s.db", *db_p);
+                       if ((capdbp = dbopen(pbuf, O_RDONLY, 0, DB_HASH, 0))
+                            != NULL) {
+                               free(record);
+                               retval = cdbget(capdbp, &record, name);
+                               if (retval < 0) {
+                                       /* no record available */
+                                       (void)capdbp->close(capdbp);
+                                       return (retval);
+                               }
+                               /* save the data; close frees it */
+                               clen = strlen(record);
+                               cbuf = malloc(clen + 1);
+                               memcpy(cbuf, record, clen + 1);
+                               if (capdbp->close(capdbp) < 0) {
+                                       free(cbuf);
+                                       return (-2);
+                               }
+                               *len = clen;
+                               *cap = cbuf;
+                               return (retval);
+                       } else {
+                               fd = open(*db_p, O_RDONLY, 0);
+                               if (fd < 0) {
+                                       /* No error on unfound file. */
+                                       continue;
+                               }
+                               myfd = 1;
+                       }
+               }
+               /*
+                * Find the requested capability record ...
+                */
+               {
+               char buf[BUFSIZ];
+               register char *b_end, *bp;
+               register int c;
+
+               /*
+                * Loop invariants:
+                *      There is always room for one more character in record.
+                *      R_end always points just past end of record.
+                *      Rp always points just past last character in record.
+                *      B_end always points just past last character in buf.
+                *      Bp always points at next character in buf.
+                */
+               b_end = buf;
+               bp = buf;
+               for (;;) {
+
+                       /*
+                        * Read in a line implementing (\, newline)
+                        * line continuation.
+                        */
+                       rp = record;
+                       for (;;) {
+                               if (bp >= b_end) {
+                                       int n;
+               
+                                       n = read(fd, buf, sizeof(buf));
+                                       if (n <= 0) {
+                                               if (myfd)
+                                                       (void)close(fd);
+                                               if (n < 0) {
+                                                       free(record);
+                                                       return (-2);
+                                               } else {
+                                                       fd = -1;
+                                                       eof = 1;
+                                                       break;
+                                               }
+                                       }
+                                       b_end = buf+n;
+                                       bp = buf;
+                               }
+       
+                               c = *bp++;
+                               if (c == '\n') {
+                                       if (rp > record && *(rp-1) == '\\') {
+                                               rp--;
+                                               continue;
+                                       } else
+                                               break;
+                               }
+                               *rp++ = c;
+
+                               /*
+                                * Enforce loop invariant: if no room 
+                                * left in record buffer, try to get
+                                * some more.
+                                */
+                               if (rp >= r_end) {
+                                       u_int pos;
+                                       size_t newsize;
+
+                                       pos = rp - record;
+                                       newsize = r_end - record + BFRAG;
+                                       record = realloc(record, newsize);
+                                       if (record == NULL) {
+                                               errno = ENOMEM;
+                                               if (myfd)
+                                                       (void)close(fd);
+                                               return (-2);
+                                       }
+                                       r_end = record + newsize;
+                                       rp = record + pos;
+                               }
+                       }
+                               /* loop invariant let's us do this */
+                       *rp++ = '\0';
+
+                       /*
+                        * If encountered eof check next file.
+                        */
+                       if (eof)
+                               break;
+                               
+                       /*
+                        * Toss blank lines and comments.
+                        */
+                       if (*record == '\0' || *record == '#')
+                               continue;
+       
+                       /*
+                        * See if this is the record we want ...
+                        */
+                       if (cgetmatch(record, name) == 0) {
+                               if (nfield == NULL || !nfcmp(nfield, record)) {
+                                       foundit = 1;
+                                       break;  /* found it! */
+                               }
+                       }
+               }
+       }
+               if (foundit)
+                       break;
+       }
+
+       if (!foundit) {
+               free(record);
+               return (-1);
+       }
+
+       /*
+        * Got the capability record, but now we have to expand all tc=name
+        * references in it ...
+        */
+tc_exp:        {
+               register char *newicap, *s;
+               register int newilen;
+               u_int ilen;
+               int diff, iret, tclen;
+               char *icap, *scan, *tc, *tcstart, *tcend;
+
+               /*
+                * Loop invariants:
+                *      There is room for one more character in record.
+                *      R_end points just past end of record.
+                *      Rp points just past last character in record.
+                *      Scan points at remainder of record that needs to be
+                *      scanned for tc=name constructs.
+                */
+               scan = record;
+               tc_not_resolved = 0;
+               for (;;) {
+                       if ((tc = cgetcap(scan, "tc", '=')) == NULL)
+                               break;
+
+                       /*
+                        * Find end of tc=name and stomp on the trailing `:'
+                        * (if present) so we can use it to call ourselves.
+                        */
+                       s = tc;
+                       for (;;)
+                               if (*s == '\0')
+                                       break;
+                               else
+                                       if (*s++ == ':') {
+                                               *(s - 1) = '\0';
+                                               break;
+                                       }
+                       tcstart = tc - 3;
+                       tclen = s - tcstart;
+                       tcend = s;
+
+                       iret = getent(&icap, &ilen, db_p, fd, tc, depth+1, 
+                                     NULL);
+                       newicap = icap;         /* Put into a register. */
+                       newilen = ilen;
+                       if (iret != 0) {
+                               /* an error */
+                               if (iret < -1) {
+                                       if (myfd)
+                                               (void)close(fd);
+                                       free(record);
+                                       return (iret);
+                               }
+                               if (iret == 1)
+                                       tc_not_resolved = 1;
+                               /* couldn't resolve tc */
+                               if (iret == -1) {
+                                       *(s - 1) = ':';                 
+                                       scan = s - 1;
+                                       tc_not_resolved = 1;
+                                       continue;
+                                       
+                               }
+                       }
+                       /* not interested in name field of tc'ed record */
+                       s = newicap;
+                       for (;;)
+                               if (*s == '\0')
+                                       break;
+                               else
+                                       if (*s++ == ':')
+                                               break;
+                       newilen -= s - newicap;
+                       newicap = s;
+
+                       /* make sure interpolated record is `:'-terminated */
+                       s += newilen;
+                       if (*(s-1) != ':') {
+                               *s = ':';       /* overwrite NUL with : */
+                               newilen++;
+                       }
+
+                       /*
+                        * Make sure there's enough room to insert the
+                        * new record.
+                        */
+                       diff = newilen - tclen;
+                       if (diff >= r_end - rp) {
+                               u_int pos, tcpos, tcposend;
+                               size_t newsize;
+
+                               pos = rp - record;
+                               newsize = r_end - record + diff + BFRAG;
+                               tcpos = tcstart - record;
+                               tcposend = tcend - record;
+                               record = realloc(record, newsize);
+                               if (record == NULL) {
+                                       errno = ENOMEM;
+                                       if (myfd)
+                                               (void)close(fd);
+                                       free(icap);
+                                       return (-2);
+                               }
+                               r_end = record + newsize;
+                               rp = record + pos;
+                               tcstart = record + tcpos;
+                               tcend = record + tcposend;
+                       }
+
+                       /*
+                        * Insert tc'ed record into our record.
+                        */
+                       s = tcstart + newilen;
+                       bcopy(tcend, s, rp - tcend);
+                       bcopy(newicap, tcstart, newilen);
+                       rp += diff;
+                       free(icap);
+
+                       /*
+                        * Start scan on `:' so next cgetcap works properly
+                        * (cgetcap always skips first field).
+                        */
+                       scan = s-1;
+               }
+       
+       }
+       /*
+        * Close file (if we opened it), give back any extra memory, and
+        * return capability, length and success.
+        */
+       if (myfd)
+               (void)close(fd);
+       *len = rp - record - 1; /* don't count NUL */
+       if (r_end > rp)
+               if ((record = 
+                    realloc(record, (size_t)(rp - record))) == NULL) {
+                       errno = ENOMEM;
+                       return (-2);
+               }
+               
+       *cap = record;
+       if (tc_not_resolved)
+               return (1);
+       return (0);
+}      
+
+static int
+cdbget(capdbp, bp, name)
+       DB *capdbp;
+       char **bp, *name;
+{
+       DBT key, data;
+
+       key.data = name;
+       key.size = strlen(name);
+
+       for (;;) {
+               /* Get the reference. */
+               switch(capdbp->get(capdbp, &key, &data, 0)) {
+               case -1:
+                       return (-2);
+               case 1:
+                       return (-1);
+               }
+
+               /* If not an index to another record, leave. */
+               if (((char *)data.data)[0] != SHADOW)
+                       break;
+
+               key.data = (char *)data.data + 1;
+               key.size = data.size - 1;
+       }
+       
+       *bp = (char *)data.data + 1;
+       return (((char *)(data.data))[0] == TCERR ? 1 : 0);
+}
+
+/*
+ * Cgetmatch will return 0 if name is one of the names of the capability
+ * record buf, -1 if not.
+ */
+int
+cgetmatch(buf, name)
+       char *buf, *name;
+{
+       register char *np, *bp;
+
+       /*
+        * Start search at beginning of record.
+        */
+       bp = buf;
+       for (;;) {
+               /*
+                * Try to match a record name.
+                */
+               np = name;
+               for (;;)
+                       if (*np == '\0')
+                               if (*bp == '|' || *bp == ':' || *bp == '\0')
+                                       return (0);
+                               else
+                                       break;
+                       else
+                               if (*bp++ != *np++)
+                                       break;
+
+               /*
+                * Match failed, skip to next name in record.
+                */
+               bp--;   /* a '|' or ':' may have stopped the match */
+               for (;;)
+                       if (*bp == '\0' || *bp == ':')
+                               return (-1);    /* match failed totally */
+                       else
+                               if (*bp++ == '|')
+                                       break;  /* found next name */
+       }
+}
+
+
+
+
+
+int
+cgetfirst(buf, db_array)
+       char **buf, **db_array;
+{
+       (void)cgetclose();
+       return (cgetnext(buf, db_array));
+}
+
+static FILE *pfp;
+static int slash;
+static char **dbp;
+
+int
+cgetclose()
+{
+       if (pfp != NULL) {
+               (void)fclose(pfp);
+               pfp = NULL;
+       }
+       dbp = NULL;
+       gottoprec = 0;
+       slash = 0;
+       return(0);
+}
+
+/*
+ * Cgetnext() gets either the first or next entry in the logical database 
+ * specified by db_array.  It returns 0 upon completion of the database, 1
+ * upon returning an entry with more remaining, and -1 if an error occurs.
+ */
+int
+cgetnext(bp, db_array)
+        register char **bp;
+       char **db_array;
+{
+       size_t len;
+       int status, done;
+       char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE];
+       u_int dummy;
+
+       if (dbp == NULL)
+               dbp = db_array;
+
+       if (pfp == NULL && (pfp = fopen(*dbp, "r")) == NULL) {
+               (void)cgetclose();
+               return (-1);
+       }
+       for(;;) {
+               if (toprec && !gottoprec) {
+                       gottoprec = 1;
+                       line = toprec;
+               } else {
+                       line = fgetln(pfp, &len);
+                       if (line == NULL && pfp) {
+                               (void)fclose(pfp);
+                               if (ferror(pfp)) {
+                                       (void)cgetclose();
+                                       return (-1);
+                               } else {
+                                       if (*++dbp == NULL) {
+                                               (void)cgetclose();
+                                               return (0);
+                                       } else if ((pfp =
+                                           fopen(*dbp, "r")) == NULL) {
+                                               (void)cgetclose();
+                                               return (-1);
+                                       } else
+                                               continue;
+                               }
+                       } else
+                               line[len - 1] = '\0';
+                       if (len == 1) {
+                               slash = 0;
+                               continue;
+                       }
+                       if (isspace(*line) ||
+                           *line == ':' || *line == '#' || slash) {
+                               if (line[len - 2] == '\\')
+                                       slash = 1;
+                               else
+                                       slash = 0;
+                               continue;
+                       }
+                       if (line[len - 2] == '\\')
+                               slash = 1;
+                       else
+                               slash = 0;
+               }                       
+
+
+               /* 
+                * Line points to a name line.
+                */
+               done = 0;
+               np = nbuf;
+               for (;;) {
+                       for (cp = line; *cp != '\0'; cp++) {
+                               if (*cp == ':') {
+                                       *np++ = ':';
+                                       done = 1;
+                                       break;
+                               }
+                               if (*cp == '\\')
+                                       break;
+                               *np++ = *cp;
+                       }
+                       if (done) {
+                               *np = '\0';
+                               break;
+                       } else { /* name field extends beyond the line */
+                               line = fgetln(pfp, &len);
+                               if (line == NULL && pfp) {
+                                       (void)fclose(pfp);
+                                       if (ferror(pfp)) {
+                                               (void)cgetclose();
+                                               return (-1);
+                                       }
+                               } else
+                                       line[len - 1] = '\0';
+                       }
+               }
+               rp = buf;
+               for(cp = nbuf; *cp != NULL; cp++)
+                       if (*cp == '|' || *cp == ':')
+                               break;
+                       else
+                               *rp++ = *cp;
+
+               *rp = '\0';
+               /* 
+                * XXX 
+                * Last argument of getent here should be nbuf if we want true
+                * sequential access in the case of duplicates.  
+                * With NULL, getent will return the first entry found
+                * rather than the duplicate entry record.  This is a 
+                * matter of semantics that should be resolved.
+                */
+               status = getent(bp, &dummy, db_array, -1, buf, 0, NULL);
+               if (status == -2 || status == -3)
+                       (void)cgetclose();
+
+               return (status + 1);
+       }
+       /* NOTREACHED */
+}
+
+/*
+ * Cgetstr retrieves the value of the string capability cap from the
+ * capability record pointed to by buf.  A pointer to a decoded, NUL
+ * terminated, malloc'd copy of the string is returned in the char *
+ * pointed to by str.  The length of the string not including the trailing
+ * NUL is returned on success, -1 if the requested string capability
+ * couldn't be found, -2 if a system error was encountered (storage
+ * allocation failure).
+ */
+int
+cgetstr(buf, cap, str)
+       char *buf, *cap;
+       char **str;
+{
+       register u_int m_room;
+       register char *bp, *mp;
+       int len;
+       char *mem;
+
+       /*
+        * Find string capability cap
+        */
+       bp = cgetcap(buf, cap, '=');
+       if (bp == NULL)
+               return (-1);
+
+       /*
+        * Conversion / storage allocation loop ...  Allocate memory in
+        * chunks SFRAG in size.
+        */
+       if ((mem = malloc(SFRAG)) == NULL) {
+               errno = ENOMEM;
+               return (-2);    /* couldn't even allocate the first fragment */
+       }
+       m_room = SFRAG;
+       mp = mem;
+
+       while (*bp != ':' && *bp != '\0') {
+               /*
+                * Loop invariants:
+                *      There is always room for one more character in mem.
+                *      Mp always points just past last character in mem.
+                *      Bp always points at next character in buf.
+                */
+               if (*bp == '^') {
+                       bp++;
+                       if (*bp == ':' || *bp == '\0')
+                               break;  /* drop unfinished escape */
+                       *mp++ = *bp++ & 037;
+               } else if (*bp == '\\') {
+                       bp++;
+                       if (*bp == ':' || *bp == '\0')
+                               break;  /* drop unfinished escape */
+                       if ('0' <= *bp && *bp <= '7') {
+                               register int n, i;
+
+                               n = 0;
+                               i = 3;  /* maximum of three octal digits */
+                               do {
+                                       n = n * 8 + (*bp++ - '0');
+                               } while (--i && '0' <= *bp && *bp <= '7');
+                               *mp++ = n;
+                       }
+                       else switch (*bp++) {
+                               case 'b': case 'B':
+                                       *mp++ = '\b';
+                                       break;
+                               case 't': case 'T':
+                                       *mp++ = '\t';
+                                       break;
+                               case 'n': case 'N':
+                                       *mp++ = '\n';
+                                       break;
+                               case 'f': case 'F':
+                                       *mp++ = '\f';
+                                       break;
+                               case 'r': case 'R':
+                                       *mp++ = '\r';
+                                       break;
+                               case 'e': case 'E':
+                                       *mp++ = ESC;
+                                       break;
+                               case 'c': case 'C':
+                                       *mp++ = ':';
+                                       break;
+                               default:
+                                       /*
+                                        * Catches '\', '^', and
+                                        *  everything else.
+                                        */
+                                       *mp++ = *(bp-1);
+                                       break;
+                       }
+               } else
+                       *mp++ = *bp++;
+               m_room--;
+
+               /*
+                * Enforce loop invariant: if no room left in current
+                * buffer, try to get some more.
+                */
+               if (m_room == 0) {
+                       size_t size = mp - mem;
+
+                       if ((mem = realloc(mem, size + SFRAG)) == NULL)
+                               return (-2);
+                       m_room = SFRAG;
+                       mp = mem + size;
+               }
+       }
+       *mp++ = '\0';   /* loop invariant let's us do this */
+       m_room--;
+       len = mp - mem - 1;
+
+       /*
+        * Give back any extra memory and return value and success.
+        */
+       if (m_room != 0)
+               if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL)
+                       return (-2);
+       *str = mem;
+       return (len);
+}
+
+/*
+ * Cgetustr retrieves the value of the string capability cap from the
+ * capability record pointed to by buf.  The difference between cgetustr()
+ * and cgetstr() is that cgetustr does not decode escapes but rather treats
+ * all characters literally.  A pointer to a  NUL terminated malloc'd 
+ * copy of the string is returned in the char pointed to by str.  The 
+ * length of the string not including the trailing NUL is returned on success,
+ * -1 if the requested string capability couldn't be found, -2 if a system 
+ * error was encountered (storage allocation failure).
+ */
+int
+cgetustr(buf, cap, str)
+       char *buf, *cap, **str;
+{
+       register u_int m_room;
+       register char *bp, *mp;
+       int len;
+       char *mem;
+
+       /*
+        * Find string capability cap
+        */
+       if ((bp = cgetcap(buf, cap, '=')) == NULL)
+               return (-1);
+
+       /*
+        * Conversion / storage allocation loop ...  Allocate memory in
+        * chunks SFRAG in size.
+        */
+       if ((mem = malloc(SFRAG)) == NULL) {
+               errno = ENOMEM;
+               return (-2);    /* couldn't even allocate the first fragment */
+       }
+       m_room = SFRAG;
+       mp = mem;
+
+       while (*bp != ':' && *bp != '\0') {
+               /*
+                * Loop invariants:
+                *      There is always room for one more character in mem.
+                *      Mp always points just past last character in mem.
+                *      Bp always points at next character in buf.
+                */
+               *mp++ = *bp++;
+               m_room--;
+
+               /*
+                * Enforce loop invariant: if no room left in current
+                * buffer, try to get some more.
+                */
+               if (m_room == 0) {
+                       size_t size = mp - mem;
+
+                       if ((mem = realloc(mem, size + SFRAG)) == NULL)
+                               return (-2);
+                       m_room = SFRAG;
+                       mp = mem + size;
+               }
+       }
+       *mp++ = '\0';   /* loop invariant let's us do this */
+       m_room--;
+       len = mp - mem - 1;
+
+       /*
+        * Give back any extra memory and return value and success.
+        */
+       if (m_room != 0)
+               if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL)
+                       return (-2);
+       *str = mem;
+       return (len);
+}
+
+/*
+ * Cgetnum retrieves the value of the numeric capability cap from the
+ * capability record pointed to by buf.  The numeric value is returned in
+ * the long pointed to by num.  0 is returned on success, -1 if the requested
+ * numeric capability couldn't be found.
+ */
+int
+cgetnum(buf, cap, num)
+       char *buf, *cap;
+       long *num;
+{
+       register long n;
+       register int base, digit;
+       register char *bp;
+
+       /*
+        * Find numeric capability cap
+        */
+       bp = cgetcap(buf, cap, '#');
+       if (bp == NULL)
+               return (-1);
+
+       /*
+        * Look at value and determine numeric base:
+        *      0x... or 0X...  hexadecimal,
+        * else 0...            octal,
+        * else                 decimal.
+        */
+       if (*bp == '0') {
+               bp++;
+               if (*bp == 'x' || *bp == 'X') {
+                       bp++;
+                       base = 16;
+               } else
+                       base = 8;
+       } else
+               base = 10;
+
+       /*
+        * Conversion loop ...
+        */
+       n = 0;
+       for (;;) {
+               if ('0' <= *bp && *bp <= '9')
+                       digit = *bp - '0';
+               else if ('a' <= *bp && *bp <= 'f')
+                       digit = 10 + *bp - 'a';
+               else if ('A' <= *bp && *bp <= 'F')
+                       digit = 10 + *bp - 'A';
+               else
+                       break;
+
+               if (digit >= base)
+                       break;
+
+               n = n * base + digit;
+               bp++;
+       }
+
+       /*
+        * Return value and success.
+        */
+       *num = n;
+       return (0);
+}
+
+
+/*
+ * Compare name field of record.
+ */
+static int
+nfcmp(nf, rec)
+       char *nf, *rec;
+{
+       char *cp, tmp;
+       int ret;
+       
+       for (cp = rec; *cp != ':'; cp++)
+               ;
+       
+       tmp = *(cp + 1);
+       *(cp + 1) = '\0';
+       ret = strcmp(nf, rec);
+       *(cp + 1) = tmp;
+
+       return (ret);
+}
diff --git a/gen.subproj/getcwd.c b/gen.subproj/getcwd.c
new file mode 100644 (file)
index 0000000..0c71e79
--- /dev/null
@@ -0,0 +1,410 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static char *getcwd_physical __P((char *, size_t));
+
+#define        ISDOT(dp) \
+       (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
+           dp->d_name[1] == '.' && dp->d_name[2] == '\0'))
+
+char *
+getcwd(pt, size)
+       char *pt;
+       size_t size;
+{
+       char *pwd;
+       size_t pwdlen;
+       dev_t dev;
+       ino_t ino;
+       struct stat s;
+
+       /* Check $PWD -- if it's right, it's fast. */
+       if ((pwd = getenv("PWD")) != NULL && pwd[0] == '/' && stat(pwd, &s) != -1) {
+               dev = s.st_dev;
+               ino = s.st_ino;
+               if (stat(".", &s) != -1 && dev == s.st_dev && ino == s.st_ino) {
+                       pwdlen = strlen(pwd);
+                       if (pt) {
+                               if (!size) {
+                                       errno = EINVAL;
+                                       return (NULL);
+                               }
+                               if (pwdlen + 1 > size) {
+                                       errno = ERANGE;
+                                       return (NULL);
+                               }
+                       } else if ((pt = malloc(pwdlen + 1)) == NULL) {
+                               errno = ENOMEM;
+                               return (NULL);
+                       }
+                       memmove(pt, pwd, pwdlen);
+                       pt[pwdlen] = '\0';
+                       return (pt);
+               }
+       }
+
+       return (getcwd_physical(pt, size));
+}
+
+/*
+ * char *realpath(const char *path, char resolved_path[MAXPATHLEN]);
+ *
+ * Find the real name of path, by removing all ".", ".." and symlink
+ * components.  Returns (resolved) on success, or (NULL) on failure,
+ * in which case the path which caused trouble is left in (resolved).
+ */
+char *
+realpath(path, resolved)
+       const char *path;
+       char *resolved;
+{
+       struct stat sb;
+       int fd, n, rootd, serrno;
+       char *p, *q, wbuf[MAXPATHLEN];
+       int symlinks = 0;
+
+       /* Save the starting point. */
+       if ((fd = open(".", O_RDONLY)) < 0) {
+               (void)strcpy(resolved, ".");
+               return (NULL);
+       }
+
+       /*
+        * Find the dirname and basename from the path to be resolved.
+        * Change directory to the dirname component.
+        * lstat the basename part.
+        *     if it is a symlink, read in the value and loop.
+        *     if it is a directory, then change to that directory.
+        * get the current directory name and append the basename.
+        */
+       (void)strncpy(resolved, path, MAXPATHLEN - 1);
+       resolved[MAXPATHLEN - 1] = '\0';
+loop:
+       q = strrchr(resolved, '/');
+       if (q != NULL) {
+               p = q + 1;
+               if (q == resolved)
+                       q = "/";
+               else {
+                       do {
+                               --q;
+                       } while (q > resolved && *q == '/');
+                       q[1] = '\0';
+                       q = resolved;
+               }
+               if (chdir(q) < 0)
+                       goto err1;
+       } else
+               p = resolved;
+
+        /* Deal with the last component. */
+        if (lstat(p, &sb) == 0) {
+                if (S_ISLNK(sb.st_mode)) {
+                       if (++symlinks > MAXSYMLINKS) {
+                               errno = ELOOP;
+                               goto err1;
+                         }
+                       n = readlink(p, resolved, MAXPATHLEN-1);
+                       if (n < 0)
+                               goto err1;
+                       resolved[n] = '\0';
+                       goto loop;
+               }
+               if (S_ISDIR(sb.st_mode)) {
+                       if (chdir(p) < 0)
+                               goto err1;
+                       p = "";
+               }
+       }
+
+       /*
+        * Save the last component name and get the full pathname of
+        * the current directory.
+        */
+       (void)strcpy(wbuf, p);
+
+       /*
+        * Call the inernal internal version of getcwd which
+        * does a physical search rather than using the $PWD short-cut
+        */
+       if (getcwd_physical(resolved, MAXPATHLEN) == 0)
+               goto err1;
+
+       /*
+        * Join the two strings together, ensuring that the right thing
+        * happens if the last component is empty, or the dirname is root.
+        */
+       if (resolved[0] == '/' && resolved[1] == '\0')
+               rootd = 1;
+       else
+               rootd = 0;
+
+       if (*wbuf) {
+               if (strlen(resolved) + strlen(wbuf) + rootd + 1 > MAXPATHLEN) {
+                       errno = ENAMETOOLONG;
+                       goto err1;
+               }
+               if (rootd == 0)
+                       (void)strcat(resolved, "/");
+               (void)strcat(resolved, wbuf);
+       }
+
+       /* Go back to where we came from. */
+       if (fchdir(fd) < 0) {
+               serrno = errno;
+               goto err2;
+       }
+
+       /* It's okay if the close fails, what's an fd more or less? */
+       (void)close(fd);
+       return (resolved);
+
+err1:  serrno = errno;
+       (void)fchdir(fd);
+err2:  (void)close(fd);
+       errno = serrno;
+       return (NULL);
+}
+
+static char *
+getcwd_physical(pt, size)
+       char *pt;
+       size_t size;
+{
+       register struct dirent *dp;
+       register DIR *dir;
+       register dev_t dev;
+       register ino_t ino;
+       register int first;
+       register char *bpt, *bup;
+       struct stat s;
+       dev_t root_dev;
+       ino_t root_ino;
+       size_t ptsize, upsize;
+       int save_errno;
+       char *ept, *eup, *up;
+
+       /*
+        * If no buffer specified by the user, allocate one as necessary.
+        * If a buffer is specified, the size has to be non-zero.  The path
+        * is built from the end of the buffer backwards.
+        */
+       if (pt) {
+               ptsize = 0;
+               if (!size) {
+                       errno = EINVAL;
+                       return (NULL);
+               }
+               ept = pt + size;
+       } else {
+               if ((pt = malloc(ptsize = 1024 - 4)) == NULL)
+                       return (NULL);
+               ept = pt + ptsize;
+       }
+       bpt = ept - 1;
+       *bpt = '\0';
+
+       /*
+        * Allocate bytes (1024 - malloc space) for the string of "../"'s.
+        * Should always be enough (it's 340 levels).  If it's not, allocate
+        * as necessary.  Special case the first stat, it's ".", not "..".
+        */
+       if ((up = malloc(upsize = 1024 - 4)) == NULL)
+               goto err;
+       eup = up + MAXPATHLEN;
+       bup = up;
+       up[0] = '.';
+       up[1] = '\0';
+
+       /* Save root values, so know when to stop. */
+       if (stat("/", &s))
+               goto err;
+       root_dev = s.st_dev;
+       root_ino = s.st_ino;
+
+       errno = 0;                      /* XXX readdir has no error return. */
+
+       for (first = 1;; first = 0) {
+               /* Stat the current level. */
+               if (lstat(up, &s))
+                       goto err;
+
+               /* Save current node values. */
+               ino = s.st_ino;
+               dev = s.st_dev;
+
+               /* Check for reaching root. */
+               if (root_dev == dev && root_ino == ino) {
+                       *--bpt = '/';
+                       /*
+                        * It's unclear that it's a requirement to copy the
+                        * path to the beginning of the buffer, but it's always
+                        * been that way and stuff would probably break.
+                        */
+                       (void)bcopy(bpt, pt, ept - bpt);
+                       free(up);
+                       return (pt);
+               }
+
+               /*
+                * Build pointer to the parent directory, allocating memory
+                * as necessary.  Max length is 3 for "../", the largest
+                * possible component name, plus a trailing NULL.
+                */
+               if (bup + 3  + MAXNAMLEN + 1 >= eup) {
+                       if ((up = realloc(up, upsize *= 2)) == NULL)
+                               goto err;
+                       bup = up;
+                       eup = up + upsize;
+               }
+               *bup++ = '.';
+               *bup++ = '.';
+               *bup = '\0';
+
+               /* Open and stat parent directory. */
+               if (!(dir = opendir(up)) || fstat(dirfd(dir), &s))
+                       goto err;
+
+               /* Add trailing slash for next directory. */
+               *bup++ = '/';
+
+               /*
+                * If it's a mount point, have to stat each element because
+                * the inode number in the directory is for the entry in the
+                * parent directory, not the inode number of the mounted file.
+                */
+               save_errno = 0;
+               if (s.st_dev == dev) {
+                       for (;;) {
+                               if (!(dp = readdir(dir)))
+                                       goto notfound;
+                               if (dp->d_fileno == ino)
+                                       break;
+                       }
+               } else
+                       for (;;) {
+                               if (!(dp = readdir(dir)))
+                                       goto notfound;
+                               if (ISDOT(dp))
+                                       continue;
+                               bcopy(dp->d_name, bup, dp->d_namlen + 1);
+
+                               /* Save the first error for later. */
+                               if (lstat(up, &s)) {
+                                       if (!save_errno)
+                                               save_errno = errno;
+                                       errno = 0;
+                                       continue;
+                               }
+                               if (s.st_dev == dev && s.st_ino == ino)
+                                       break;
+                       }
+
+               /*
+                * Check for length of the current name, preceding slash,
+                * leading slash.
+                */
+               if (bpt - pt <= dp->d_namlen + (first ? 1 : 2)) {
+                       size_t len, off;
+
+                       if (!ptsize) {
+                               errno = ERANGE;
+                               goto err;
+                       }
+                       off = bpt - pt;
+                       len = ept - bpt;
+                       if ((pt = realloc(pt, ptsize *= 2)) == NULL)
+                               goto err;
+                       bpt = pt + off;
+                       ept = pt + ptsize;
+                       (void)bcopy(bpt, ept - len, len);
+                       bpt = ept - len;
+               }
+               if (!first)
+                       *--bpt = '/';
+               bpt -= dp->d_namlen;
+               bcopy(dp->d_name, bpt, dp->d_namlen);
+               (void)closedir(dir);
+
+               /* Truncate any file name. */
+               *bup = '\0';
+       }
+
+notfound:
+       /*
+        * If readdir set errno, use it, not any saved error; otherwise,
+        * didn't find the current directory in its parent directory, set
+        * errno to ENOENT.
+        */
+       if (!errno)
+               errno = save_errno ? save_errno : ENOENT;
+       /* FALLTHROUGH */
+err:
+       if (ptsize)
+               free(pt);
+       free(up);
+       return (NULL);
+}
diff --git a/gen.subproj/gethostname.c b/gen.subproj/gethostname.c
new file mode 100644 (file)
index 0000000..50ce9b5
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+
+long
+gethostname(name, namelen)
+       char *name;
+       int namelen;
+{
+       int mib[2];
+       size_t size;
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_HOSTNAME;
+       size = namelen;
+       if (sysctl(mib, 2, name, &size, NULL, 0) == -1)
+               return (-1);
+       return (0);
+}
diff --git a/gen.subproj/getloadavg.c b/gen.subproj/getloadavg.c
new file mode 100644 (file)
index 0000000..e65fdff
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/sysctl.h>
+
+#if 0
+#include <mach/vm_param.h>
+#endif /* 0 */
+
+#include <stdlib.h>
+
+/*
+ * getloadavg() -- Get system load averages.
+ *
+ * Put `nelem' samples into `loadavg' array.
+ * Return number of samples retrieved, or -1 on error.
+ */
+int
+getloadavg(loadavg, nelem)
+       double loadavg[];
+       int nelem;
+{
+       struct loadavg loadinfo;
+       int i, mib[2];
+       size_t size;
+
+       mib[0] = CTL_VM;
+       mib[1] = VM_LOADAVG;
+       size = sizeof(loadinfo);
+       if (sysctl(mib, 2, &loadinfo, &size, NULL, 0) < 0)
+               return (-1);
+
+       nelem = MIN(nelem, sizeof(loadinfo.ldavg) / sizeof(fixpt_t));
+       for (i = 0; i < nelem; i++)
+               loadavg[i] = (double) loadinfo.ldavg[i] / loadinfo.fscale;
+       return (nelem);
+}
diff --git a/gen.subproj/getlogin.c b/gen.subproj/getlogin.c
new file mode 100644 (file)
index 0000000..02563a6
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <pwd.h>
+#include <utmp.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+int _logname_valid = 0;                /* known to setlogin() */
+
+char *
+getlogin()
+{
+       static char logname[MAXLOGNAME + 1];
+
+       if (_logname_valid == 0) {
+               if (_getlogin(logname, sizeof(logname) - 1) < 0)
+                       return ((char *)NULL);
+               _logname_valid = 1;
+       }
+       return (*logname ? logname : (char *)NULL);
+}
diff --git a/gen.subproj/getmntinfo.c b/gen.subproj/getmntinfo.c
new file mode 100644 (file)
index 0000000..9284aa7
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+#include <stdlib.h>
+
+/*
+ * Return information about mounted filesystems.
+ */
+int
+getmntinfo(mntbufp, flags)
+       struct statfs **mntbufp;
+       int flags;
+{
+       static struct statfs *mntbuf;
+       static int mntsize;
+       static long bufsize;
+
+       if (mntsize <= 0 && (mntsize = getfsstat(0, 0, MNT_NOWAIT)) < 0)
+               return (0);
+       if (bufsize > 0 && (mntsize = getfsstat(mntbuf, bufsize, flags)) < 0)
+               return (0);
+       while (bufsize <= mntsize * sizeof(struct statfs)) {
+               if (mntbuf)
+                       free(mntbuf);
+               bufsize = (mntsize + 1) * sizeof(struct statfs);
+               if ((mntbuf = (struct statfs *)malloc(bufsize)) == 0)
+                       return (0);
+               if ((mntsize = getfsstat(mntbuf, bufsize, flags)) < 0)
+                       return (0);
+       }
+       *mntbufp = mntbuf;
+       return (mntsize);
+}
diff --git a/gen.subproj/getpagesize.c b/gen.subproj/getpagesize.c
new file mode 100644 (file)
index 0000000..c10d072
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+int
+getpagesize()
+{
+       int mib[2], value;
+       size_t size;
+
+       mib[0] = CTL_HW;
+       mib[1] = HW_PAGESIZE;
+       size = sizeof value;
+       if (sysctl(mib, 2, &value, &size, NULL, 0) == -1)
+               return (-1);
+       return (value);
+}
+
diff --git a/gen.subproj/getpass.c b/gen.subproj/getpass.c
new file mode 100644 (file)
index 0000000..a09ca80
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/termios.h>
+#include <sys/signal.h>
+
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <unistd.h>
+
+char *
+getpass(prompt)
+       const char *prompt;
+{
+       struct termios term;
+       register int ch;
+       register char *p;
+       FILE *fp, *outfp;
+       long omask;
+       int echo;
+       static char buf[_PASSWORD_LEN + 1];
+
+       /*
+        * read and write to /dev/tty if possible; else read from
+        * stdin and write to stderr.
+        */
+       if ((outfp = fp = fopen(_PATH_TTY, "w+")) == NULL) {
+               outfp = stderr;
+               fp = stdin;
+       }
+       /*
+        * note - blocking signals isn't necessarily the
+        * right thing, but we leave it for now.
+        */
+       omask = sigblock(sigmask(SIGINT)|sigmask(SIGTSTP));
+       (void)tcgetattr(fileno(fp), &term);
+       if (echo = (term.c_lflag & ECHO)) {
+               term.c_lflag &= ~ECHO;
+               (void)tcsetattr(fileno(fp), TCSAFLUSH|TCSASOFT, &term);
+       }
+       (void)fputs(prompt, outfp);
+       rewind(outfp);                  /* implied flush */
+       for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
+               if (p < buf + _PASSWORD_LEN)
+                       *p++ = ch;
+       *p = '\0';
+       (void)write(fileno(outfp), "\n", 1);
+       if (echo) {
+               term.c_lflag |= ECHO;
+               (void)tcsetattr(fileno(fp), TCSAFLUSH|TCSASOFT, &term);
+       }
+       (void)sigsetmask(omask);
+       if (fp != stdin)
+               (void)fclose(fp);
+       return(buf);
+}
diff --git a/gen.subproj/getttyent.c b/gen.subproj/getttyent.c
new file mode 100644 (file)
index 0000000..f033908
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <ttyent.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+static char zapchar;
+static FILE *tf;
+
+struct ttyent *
+getttynam(tty)
+       const char *tty;
+{
+       register struct ttyent *t;
+
+       setttyent();
+       while (t = getttyent())
+               if (!strcmp(tty, t->ty_name))
+                       break;
+       endttyent();
+       return (t);
+}
+
+struct ttyent *
+getttyent()
+{
+       static struct ttyent tty;
+       register int c;
+       register char *p;
+#define        MAXLINELENGTH   1024
+       static char line[MAXLINELENGTH];
+       static char *skip(), *value();
+
+       if (!tf && !setttyent())
+               return (NULL);
+       for (;;) {
+               if (!fgets(p = line, sizeof(line), tf))
+                       return (NULL);
+               /* skip lines that are too big */
+               if (!index(p, '\n')) {
+                       while ((c = getc(tf)) != '\n' && c != EOF)
+                               ;
+                       continue;
+               }
+               while (isspace(*p))
+                       ++p;
+               if (*p && *p != '#')
+                       break;
+       }
+
+       zapchar = 0;
+       tty.ty_name = p;
+       p = skip(p);
+       if (!*(tty.ty_getty = p))
+               tty.ty_getty = tty.ty_type = NULL;
+       else {
+               p = skip(p);
+               if (!*(tty.ty_type = p))
+                       tty.ty_type = NULL;
+               else
+                       p = skip(p);
+       }
+       tty.ty_status = 0;
+       tty.ty_window = NULL;
+       tty.ty_onerror = NULL;
+       tty.ty_onoption = NULL;
+
+#define        scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1])
+#define        vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '='
+       for (; *p; p = skip(p)) {
+               if (scmp(_TTYS_OFF))
+                       tty.ty_status &= ~TTY_ON;
+               else if (scmp(_TTYS_ON))
+                       tty.ty_status |= TTY_ON;
+               else if (scmp(_TTYS_SECURE))
+                       tty.ty_status |= TTY_SECURE;
+               else if (vcmp(_TTYS_WINDOW))
+                       tty.ty_window = value(p);
+               else if (vcmp(_TTYS_ONERROR))
+                       tty.ty_onerror = value(p);
+               else if (vcmp(_TTYS_ONOPTION))
+                       tty.ty_onoption = value(p);
+               else
+                       break;
+       }
+
+       if (zapchar == '#' || *p == '#')
+               while ((c = *++p) == ' ' || c == '\t')
+                       ;
+       tty.ty_comment = p;
+       if (*p == 0)
+               tty.ty_comment = 0;
+       if (p = index(p, '\n'))
+               *p = '\0';
+       return (&tty);
+}
+
+#define        QUOTED  1
+
+/*
+ * Skip over the current field, removing quotes, and return a pointer to
+ * the next field.
+ */
+static char *
+skip(p)
+       register char *p;
+{
+       register char *t;
+       register int c, q;
+
+       for (q = 0, t = p; (c = *p) != '\0'; p++) {
+               if (c == '"') {
+                       q ^= QUOTED;    /* obscure, but nice */
+                       continue;
+               }
+               if (q == QUOTED && *p == '\\' && *(p+1) == '"')
+                       p++;
+               *t++ = *p;
+               if (q == QUOTED)
+                       continue;
+               if (c == '#') {
+                       zapchar = c;
+                       *p = 0;
+                       break;
+               }
+               if (c == '\t' || c == ' ' || c == '\n') {
+                       zapchar = c;
+                       *p++ = 0;
+                       while ((c = *p) == '\t' || c == ' ' || c == '\n')
+                               p++;
+                       break;
+               }
+       }
+       *--t = '\0';
+       return (p);
+}
+
+static char *
+value(p)
+       register char *p;
+{
+
+       return ((p = index(p, '=')) ? ++p : NULL);
+}
+
+int
+setttyent()
+{
+
+       if (tf) {
+               (void)rewind(tf);
+               return (1);
+       } else if (tf = fopen(_PATH_TTYS, "r"))
+               return (1);
+       return (0);
+}
+
+int
+endttyent()
+{
+       int rval;
+
+       if (tf) {
+               rval = !(fclose(tf) == EOF);
+               tf = NULL;
+               return (rval);
+       }
+       return (1);
+}
diff --git a/gen.subproj/getusershell.c b/gen.subproj/getusershell.c
new file mode 100644 (file)
index 0000000..5a5f09a
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <paths.h>
+
+/*
+ * Local shells should NOT be added here.  They should be added in
+ * /etc/shells.
+ */
+
+static char *okshells[] = { _PATH_BSHELL, _PATH_CSHELL, NULL };
+static char **curshell, **shells, *strings;
+static char **initshells __P((void));
+
+/*
+ * Get a list of shells from _PATH_SHELLS, if it exists.
+ */
+char *
+getusershell()
+{
+       char *ret;
+
+       if (curshell == NULL)
+               curshell = initshells();
+       ret = *curshell;
+       if (ret != NULL)
+               curshell++;
+       return (ret);
+}
+
+void
+endusershell()
+{
+       
+       if (shells != NULL)
+               free(shells);
+       shells = NULL;
+       if (strings != NULL)
+               free(strings);
+       strings = NULL;
+       curshell = NULL;
+}
+
+void
+setusershell()
+{
+
+       curshell = initshells();
+}
+
+static char **
+initshells()
+{
+       register char **sp, *cp;
+       register FILE *fp;
+       struct stat statb;
+
+       if (shells != NULL)
+               free(shells);
+       shells = NULL;
+       if (strings != NULL)
+               free(strings);
+       strings = NULL;
+       if ((fp = fopen(_PATH_SHELLS, "r")) == NULL)
+               return (okshells);
+       if (fstat(fileno(fp), &statb) == -1) {
+               (void)fclose(fp);
+               return (okshells);
+       }
+       if ((strings = malloc((u_int)statb.st_size)) == NULL) {
+               (void)fclose(fp);
+               return (okshells);
+       }
+       shells = calloc((unsigned)statb.st_size / 3, sizeof (char *));
+       if (shells == NULL) {
+               (void)fclose(fp);
+               free(strings);
+               strings = NULL;
+               return (okshells);
+       }
+       sp = shells;
+       cp = strings;
+       while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
+               while (*cp != '#' && *cp != '/' && *cp != '\0')
+                       cp++;
+               if (*cp == '#' || *cp == '\0')
+                       continue;
+               *sp++ = cp;
+               while (!isspace(*cp) && *cp != '#' && *cp != '\0')
+                       cp++;
+               *cp++ = '\0';
+       }
+       *sp = NULL;
+       (void)fclose(fp);
+       return (shells);
+}
diff --git a/gen.subproj/getvfsbyname.c b/gen.subproj/getvfsbyname.c
new file mode 100644 (file)
index 0000000..2e1af68
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <sys/sysctl.h>
+#include <errno.h>
+#include <kvm.h>
+
+int getvfsbyname __P((const char *, struct vfsconf *));
+
+/*
+ * Given a filesystem name, determine if it is resident in the kernel,
+ * and if it is resident, return its vfsconf structure.
+ */
+getvfsbyname(fsname, vfcp)
+       const char *fsname;
+       struct vfsconf *vfcp;
+{
+       int name[4], maxtypenum, cnt;
+       size_t buflen;
+
+       name[0] = CTL_VFS;
+       name[1] = VFS_GENERIC;
+       name[2] = VFS_MAXTYPENUM;
+       buflen = 4;
+       if (sysctl(name, 3, &maxtypenum, &buflen, (void *)0, (size_t)0) < 0)
+               return (-1);
+       name[2] = VFS_CONF;
+       buflen = sizeof *vfcp;
+       for (cnt = 0; cnt < maxtypenum; cnt++) {
+               name[3] = cnt;
+               if (sysctl(name, 4, vfcp, &buflen, (void *)0, (size_t)0) < 0) {
+                       if (errno != EOPNOTSUPP)
+                               return (-1);
+                       continue;
+               }
+               if (!strcmp(fsname, vfcp->vfc_name))
+                       return (0);
+       }
+       errno = ENOENT;
+       return (-1);
+}
diff --git a/gen.subproj/gmon.c b/gen.subproj/gmon.c
new file mode 100644 (file)
index 0000000..8872c02
--- /dev/null
@@ -0,0 +1,758 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#if defined(PROFILE)
+#error This module cannot be compiled with profiling
+#endif
+
+/*-
+ * Copyright (c) 1983, 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * History
+ *  2-Mar-90  Gregg Kellogg (gk) at NeXT
+ *     Changed include of kern/mach.h to kern/mach_interface.h
+ *
+ *  1-May-90  Matthew Self (mself) at NeXT
+ *     Added prototypes, and added casts to remove all warnings.
+ *     Made all private data static.
+ *     vm_deallocate old data defore vm_allocate'ing new data.
+ *     Added new functions monoutput and monreset.
+ *
+ *  18-Dec-92 Development Environment Group at NeXT
+ *     Added multiple profile areas, the ability to profile shlibs and the
+ *     ability to profile rld loaded code.  Moved the machine dependent mcount
+ *     routine out of this source file.
+ *
+ *  13-Dec-92 Development Environment Group at NeXT
+ *     Added support for dynamic shared libraries.  Also removed the code that
+ *     had been ifdef'ed out for profiling fixed shared libraries and
+ *     objective-C.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)gmon.c     5.2 (Berkeley) 6/21/85";
+#endif
+
+/*
+ * see profil(2) where this (SCALE_1_TO_1) is describe (incorrectly).
+ *
+ * The correct description:  scale is a fixed point value with
+ * the binary point in the middle of the 32 bit value.  (Bit 16 is
+ * 1, bit 15 is .5, etc.)
+ *
+ * Setting the scale to "1" (i.e. 0x10000), results in the kernel
+ * choosing the profile bucket address 1 to 1 with the pc sampled.
+ * Since buckets are shorts, if the profiling base were 0, then a pc
+ * of 0 increments bucket 0, a pc of 2 increments bucket 1, and a pc
+ * of 4 increments bucket 2.)  (Actually, this seems a little bogus,
+ * 1 to 1 should map pc's to buckets -- that's probably what was
+ * intended from the man page, but historically....
+ */
+#define                SCALE_1_TO_1    0x10000L
+
+#define        MSG "No space for monitor buffer(s)\n"
+
+#include <stdio.h>
+#include <libc.h>
+extern const struct section *getsectbyname(
+       const char *segname, 
+       const char *sectname);
+#include <monitor.h>
+#include <sys/types.h>
+#include <sys/gmon.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <mach/mach.h>
+#include <mach-o/loader.h>
+#include <mach-o/dyld.h>
+
+/*
+ * These are defined in here and these declarations need to be moved to libc.h
+ * where the other declarations for the monitor(3) routines are declared.
+ */
+extern void moninit(
+    void);
+extern void monaddition(
+    char *lowpc,
+    char *highpc);
+extern void moncount(
+    char *frompc,
+    char *selfpc);
+extern void monreset(
+    void);
+extern void monoutput(
+    const char *filename);
+extern int add_profil(char *, int, int, int);
+
+static char profiling = -1;    /* tas (test and set) location for NeXT */
+static char init = 0;          /* set while moninit() is being serviced */
+
+static unsigned long order = 0;        /* call order */
+
+struct mon_t {
+    /* the address range and size this mon struct refers to */
+    char               *lowpc;
+    char               *highpc;
+    unsigned long      textsize;
+    /* the data structures to support the arc's and their counts */
+    unsigned short     *froms; /* froms is unsigned shorts indexing into tos */
+    struct tostruct    *tos;
+    long               tolimit;
+    /* the pc-sample buffer, it's size and scale */
+    char               *sbuf;
+    int                        ssiz;   /* includes the gmonhdr struct */
+    int                        scale;
+};
+static struct mon_t *mon = NULL;
+static unsigned long nmon = 0;
+
+static void monsetup(
+    struct mon_t *m,
+    char *lowpc,
+    char *highpc);
+static int getprofhz(
+    void);
+
+void
+moninit(
+void)
+{
+    const struct section *section;
+    char *lowpc, *highpc;
+    unsigned long i;
+
+       monreset();
+       init = 1;
+
+       section = getsectbyname ("__TEXT", "__text");
+       lowpc = (char *)section->addr,
+       highpc = (char *)(section->addr + section->size);
+
+       if(mon == NULL){
+           if((mon = malloc(sizeof(struct mon_t))) == NULL){
+               write(2, MSG, sizeof(MSG) - 1);
+               return;
+           }
+           nmon = 1;
+           memset(mon, '\0', sizeof(struct mon_t));
+       }
+       /*
+        * To continue to make monstartup() and the functions that existed
+        * before adding multiple profiling areas working correctly the new
+        * calls to get the dyld loaded code profiled are made after
+        * the first mon_t struct is allocated so that they will not use the 
+        * first mon_t and the old calls will always use the first mon_t struct
+        * in the list.
+        */
+       monsetup(mon, lowpc, highpc);
+
+       profil(mon->sbuf + sizeof(struct gmonhdr),
+              mon->ssiz - sizeof(struct gmonhdr),
+              (int)mon->lowpc, mon->scale);
+       for(i = 1; i < nmon; i++)
+           add_profil(mon[i].sbuf + sizeof(struct gmonhdr),
+                      mon[i].ssiz - sizeof(struct gmonhdr),
+                      (int)mon[i].lowpc, mon[i].scale);
+       init = 0;
+       profiling = 0;
+
+#if defined(__DYNAMIC__)
+        /*
+        * Call _dyld_moninit() if the dyld is present.  This is done after the
+        * above calls so the dynamic libraries will be added after the
+        * executable.
+        */
+       if(_dyld_present())
+           _dyld_moninit(monaddition);
+#endif
+}
+
+void
+monstartup(
+char *lowpc,
+char *highpc)
+{
+       monreset();
+       if(mon == NULL){
+           if((mon = malloc(sizeof(struct mon_t))) == NULL){
+               write(2, MSG, sizeof(MSG) - 1);
+               return;
+           }
+           nmon = 1;
+           memset(mon, '\0', sizeof(struct mon_t));
+       }
+       monsetup(mon, lowpc, highpc);
+}
+
+/*
+ * monaddtion() is used for adding additional pc ranges to profile.  This is
+ * used for profiling dyld loaded code.
+ */
+void
+monaddition(
+char *lowpc,
+char *highpc)
+{
+    char save_profiling;
+    struct mon_t *m;
+
+       if(mon == NULL){
+           monstartup(lowpc, highpc);
+           return;
+       }
+       save_profiling = profiling;
+       profiling = -1;
+       if((mon = realloc(mon, (nmon + 1) * sizeof(struct mon_t))) == NULL){
+           write(2, MSG, sizeof(MSG) - 1);
+           return;
+       }
+       m = mon + nmon;
+       memset(m, '\0', sizeof(struct mon_t));
+       nmon++;
+       monsetup(m, lowpc, highpc);
+       profiling = save_profiling;
+}
+
+static
+void
+monsetup(
+struct mon_t *m,
+char *lowpc,
+char *highpc)
+{
+    int monsize;
+    char *buffer;
+    kern_return_t ret;
+    struct gmonhdr *p;
+    unsigned int o;
+
+       /*
+        * round lowpc and highpc to multiples of the density we're using
+        * so the rest of the scaling (here and in gprof) stays in ints.
+        */
+       lowpc = (char *)ROUNDDOWN((unsigned)lowpc,
+                                 HISTFRACTION * sizeof(HISTCOUNTER));
+       m->lowpc = lowpc;
+       highpc = (char *)ROUNDUP((unsigned)highpc,
+                                HISTFRACTION * sizeof(HISTCOUNTER));
+       m->highpc = highpc;
+
+       if(m->froms)
+           vm_deallocate(mach_task_self(),
+                         (vm_address_t)m->froms,
+                         (vm_size_t)(m->textsize / HASHFRACTION));
+       m->textsize = highpc - lowpc;
+       ret = vm_allocate(mach_task_self(),
+                         (vm_address_t *)&m->froms,
+                         (vm_size_t)(m->textsize / HASHFRACTION),
+                          TRUE);
+       if(ret != KERN_SUCCESS){
+           write(2, MSG, sizeof(MSG) - 1);
+           m->froms = 0;
+           return;
+       }
+
+       if(m->sbuf)
+           vm_deallocate(mach_task_self(),
+                         (vm_address_t)m->sbuf,
+                         (vm_size_t)m->ssiz);
+       monsize = (m->textsize / HISTFRACTION) + sizeof(struct gmonhdr);
+       ret = vm_allocate(mach_task_self(),
+                         (vm_address_t *)&buffer,
+                         (vm_size_t)monsize,
+                          TRUE);
+       if(ret != KERN_SUCCESS){
+           write(2, MSG, sizeof(MSG) - 1);
+           m->sbuf = 0;
+           return;
+       }
+
+       if(m->tos)
+           vm_deallocate(mach_task_self(),
+                         (vm_address_t)m->tos,
+                         (vm_size_t)(m->tolimit * sizeof(struct tostruct)));
+       m->tolimit = m->textsize * ARCDENSITY / 100;
+       if(m->tolimit < MINARCS){
+           m->tolimit = MINARCS;
+       }
+       else if(m->tolimit > 65534){
+           m->tolimit = 65534;
+       }
+       ret =  vm_allocate(mach_task_self(), 
+                          (vm_address_t *)&m->tos,
+                          (vm_size_t)(m->tolimit * sizeof(struct tostruct)),
+                           TRUE);
+       if(ret != KERN_SUCCESS){
+           write(2, MSG, sizeof(MSG) - 1);
+           m->tos = 0;
+           return;
+       }
+       m->tos[0].link = 0; /* a nop since tos was vm_allocated and is zero */
+
+       /*
+        * If this is call to monsetup() was via monstartup() (m == mon) then
+        * it is using or reusing the first pc range and then the pc sample 
+        * buffer can be setup by the system call profil() via monitor() via
+        * a moncontrol(1) call.
+        *
+        * Otherwise this is call to monsetup() was via monaddition() and a
+        * new system call is needed to add an additional pc sample buffer in
+        * the kernel.
+        */
+       if(m == mon && !init){
+           monitor(lowpc, highpc, buffer, monsize, m->tolimit);
+       }
+       else{
+           /* monitor() functionality */
+           m->sbuf = buffer;
+           m->ssiz = monsize;
+           p = (struct gmonhdr *)m->sbuf;
+           memset(p, '\0', sizeof(struct gmonhdr));
+           p->lpc = (unsigned long)m->lowpc;
+           p->hpc = (unsigned long)m->highpc;
+           p->ncnt = m->ssiz;
+           p->version = GMONVERSION;
+           p->profrate = getprofhz();
+           o = highpc - lowpc;
+           if((monsize - sizeof(struct gmonhdr)) < o)
+               m->scale = ((float) (monsize - sizeof(struct gmonhdr))/ o) *
+                          SCALE_1_TO_1;
+           else
+               m->scale = SCALE_1_TO_1;
+
+            /* moncontrol(mode == 1) functionality */
+           if(!init)
+               add_profil(m->sbuf + sizeof(struct gmonhdr),
+                          m->ssiz - sizeof(struct gmonhdr),
+                          (int)m->lowpc, m->scale);
+       }
+}
+
+void
+monreset(
+void)
+{
+    unsigned long i;
+    struct mon_t *m;
+    struct gmonhdr *p;
+
+       moncontrol(0);
+       if(mon == NULL)
+           return;
+       for(i = 0; i < nmon; i++){
+           m = mon + i;
+           if(m->sbuf != NULL){
+               memset(m->sbuf, '\0', m->ssiz);
+               p = (struct gmonhdr *)m->sbuf;
+               p->lpc = (unsigned long)m->lowpc;
+               p->hpc = (unsigned long)m->highpc;
+               p->ncnt = m->ssiz;
+           }
+           if(m->froms != NULL)
+               memset(m->froms, '\0', m->textsize / HASHFRACTION);
+           if(m->tos != NULL)
+               memset(m->tos, '\0', m->tolimit * sizeof (struct tostruct));
+       }
+       order = 0;
+       moncontrol(1);
+}
+
+void
+monoutput(
+const char *filename)
+{
+    int fd;
+    unsigned long magic, i, fromindex, endfrom, toindex;
+    struct gmon_data sample_data, arc_data, dyld_data;
+    char *frompc;
+    struct rawarc_order rawarc_order;
+    struct mon_t *m;
+    unsigned long image_count, vmaddr_slide;
+    char *image_name;
+
+       moncontrol(0);
+       m = mon;
+       if(m == NULL)
+           return;
+       fd = creat(filename, 0666);
+       if(fd < 0){
+           perror("mcount: gmon.out");
+           return;
+       }
+
+       magic = GMON_MAGIC;
+       write(fd, &magic, sizeof(unsigned long));
+
+#if defined(__DYNAMIC__)
+        if(_dyld_present()){
+           image_count = _dyld_image_count();
+           if(image_count > 1){
+#ifdef DYLD_DEBUG
+               printf("image_count = %lu\n", image_count - 1);
+               for(i = 1; i < image_count; i++){
+                   vmaddr_slide = _dyld_get_image_vmaddr_slide(i);
+                   printf("\tvmaddr_slide 0x%x\n", (unsigned int)vmaddr_slide);
+                   image_name = _dyld_get_image_name(i);
+                   printf("\timage_name %s\n", image_name);
+               }
+#endif
+               /*
+                * Calculate the dyld_data.size.
+                */
+               dyld_data.type = GMONTYPE_DYLD_STATE;
+               dyld_data.size = sizeof(unsigned long) +
+                   sizeof(unsigned long) * (image_count - 1);
+               for(i = 1; i < image_count; i++){
+                   image_name = _dyld_get_image_name(i);
+                   dyld_data.size += strlen(image_name) + 1;
+               }
+
+               /*
+                * Write the dyld_data.
+                */
+               write(fd, &dyld_data, sizeof(struct gmon_data));
+               image_count--;
+               write(fd, &image_count, sizeof(unsigned long));
+               image_count++;
+               for(i = 1; i < image_count; i++){
+                   vmaddr_slide = _dyld_get_image_vmaddr_slide(i);
+                   write(fd, &vmaddr_slide, sizeof(unsigned long));
+                   image_name = _dyld_get_image_name(i);
+                   write(fd, image_name, strlen(image_name) + 1);
+               }
+           }
+       }
+#endif
+       for(i = 0; i < nmon; i++){
+           m = mon + i;
+#ifdef DEBUG
+           fprintf(stderr, "[monoutput] sbuf 0x%x ssiz %d\n",
+                   m->sbuf, m->ssiz);
+#endif
+           sample_data.type = GMONTYPE_SAMPLES;
+           sample_data.size = m->ssiz;
+           write(fd, &sample_data, sizeof(struct gmon_data));
+           /*
+            * Write the gmonhdr struct and the pc-sample buffer.  Note the
+            * gmonhdr struct is in sbuf at the beginning of sbuf already
+            * filled in.
+            */
+           write(fd, m->sbuf, m->ssiz);
+
+           /*
+            * Now write out the raw arcs.
+            */
+           endfrom = m->textsize / (HASHFRACTION * sizeof(*m->froms));
+           arc_data.type = GMONTYPE_ARCS_ORDERS;
+           arc_data.size = 0;
+           for(fromindex = 0; fromindex < endfrom; fromindex++){
+               if(m->froms[fromindex] == 0){
+                   continue;
+               }
+               frompc = m->lowpc +
+                        (fromindex * HASHFRACTION * sizeof(*m->froms));
+               for(toindex = m->froms[fromindex];
+                   toindex != 0;
+                   toindex = m->tos[toindex].link){
+                   arc_data.size += sizeof(struct rawarc_order);
+               }
+           }
+           write(fd, &arc_data, sizeof(struct gmon_data));
+
+           for(fromindex = 0; fromindex < endfrom; fromindex++){
+               if(m->froms[fromindex] == 0){
+                   continue;
+               }
+               frompc = m->lowpc +
+                        (fromindex * HASHFRACTION * sizeof(*m->froms));
+               for(toindex = m->froms[fromindex];
+                   toindex != 0;
+                   toindex = m->tos[toindex].link){
+#ifdef DEBUG
+                   fprintf(stderr, "[monoutput] frompc 0x%x selfpc 0x%x "
+                           "count %ld order %lu\n", (unsigned int)frompc,
+                           (unsigned int)m->tos[toindex].selfpc,
+                           m->tos[toindex].count, m->tos[toindex].order);
+#endif
+                   rawarc_order.raw_frompc = (unsigned long)frompc;
+                   rawarc_order.raw_selfpc = (unsigned long)
+                                              m->tos[toindex].selfpc;
+                   rawarc_order.raw_count = m->tos[toindex].count;
+                   rawarc_order.raw_order = m->tos[toindex].order;
+                   write(fd, &rawarc_order, sizeof(struct rawarc_order));
+               }
+           }
+       }
+       close(fd);
+}
+
+void
+monitor(
+char *lowpc,
+char *highpc,
+char *buf,
+int bufsiz,
+int nfunc) /* nfunc is not used; available for compatability only. */
+{
+    unsigned int o;
+    struct gmonhdr *p;
+    struct mon_t *m;
+
+       moncontrol(0);
+       m = mon;
+       if(m == NULL)
+           return;
+       if(lowpc == 0){
+           moncontrol(0);
+           monoutput("gmon.out");
+           return;
+       }
+       m->sbuf = buf;
+       m->ssiz = bufsiz;
+       p = (struct gmonhdr *)buf;
+       memset(p, '\0', sizeof(struct gmonhdr));
+       p->lpc = (unsigned long)lowpc;
+       p->hpc = (unsigned long)highpc;
+       p->ncnt = m->ssiz;
+       p->version = GMONVERSION;
+       p->profrate = getprofhz();
+       bufsiz -= sizeof(struct gmonhdr);
+       if(bufsiz <= 0)
+           return;
+       o = highpc - lowpc;
+       if(bufsiz < o)
+           m->scale = ((float) bufsiz / o) * SCALE_1_TO_1;
+       else
+           m->scale = SCALE_1_TO_1;
+       moncontrol(1);
+}
+
+/*
+ * Control profiling
+ *     profiling is what mcount checks to see if
+ *     all the data structures are ready.
+ */
+void
+moncontrol(
+int mode)
+{
+    struct mon_t *m;
+    unsigned long i;
+
+       if(mode){
+           /* start */
+           m = mon;
+           if(m != NULL){
+               profil(m->sbuf + sizeof(struct gmonhdr),
+                      m->ssiz - sizeof(struct gmonhdr),
+                      (int)m->lowpc, m->scale);
+               for(i = 1; i < nmon; i++)
+                   add_profil(mon[i].sbuf + sizeof(struct gmonhdr),
+                              mon[i].ssiz - sizeof(struct gmonhdr),
+                              (int)mon[i].lowpc, mon[i].scale);
+               profiling = 0;
+           }
+       }
+       else{
+           /* stop */
+           profil((char *)0, 0, 0, 0);
+           profiling = -1;
+       }
+}
+
+void
+moncount(
+char *frompc,
+char *selfpc)
+{
+    unsigned short *frompcindex;
+    struct tostruct *top, *prevtop;
+    unsigned long i, toindex;
+    struct mon_t *m;
+
+       m = mon;
+       if(m == NULL)
+           return;
+       /*
+        * Check that we are profiling and that we aren't recursively invoked.
+        * This should really be a test and set instruction in changing the
+        * value of profiling.
+        */
+       if(profiling)
+           return;
+       profiling++;
+
+
+#ifdef DEBUG
+       fprintf(stderr, "[moncount] frompc 0x%x selfpc 0x%x\n",
+               (unsigned int)frompc, (unsigned int)selfpc);
+#endif
+       frompcindex = (unsigned short *)frompc;
+
+       /*
+        * check that frompcindex is a reasonable pc value.
+        * for example: signal catchers get called from the stack,
+        *              not from text space.  too bad.
+        */
+       for(i = 0; i < nmon; i++){
+           m = mon + i;
+           if((unsigned long)frompcindex >= (unsigned long)m->lowpc &&
+              (unsigned long)frompcindex <  (unsigned long)m->highpc)
+               break;
+       }
+       if(i == nmon){
+           goto done;
+       }
+       else{
+           frompcindex = (unsigned short *)
+                 ((unsigned long)frompcindex - (unsigned long)m->lowpc);
+       }
+       frompcindex =
+           &m->froms[((long)frompcindex) / (HASHFRACTION * sizeof(*m->froms))];
+       toindex = *frompcindex;
+       if(toindex == 0){
+           /*
+            *  first time traversing this arc
+            */
+           toindex = ++m->tos[0].link;
+           if(toindex >= m->tolimit){
+               goto overflow;
+           }
+           *frompcindex = toindex;
+           top = &m->tos[toindex];
+           top->selfpc = (unsigned long)selfpc;
+           top->count = 1;
+           top->link = 0;
+           top->order = ++order;
+           goto done;
+       }
+       top = &m->tos[toindex];
+       if(top->selfpc == (unsigned long)selfpc){
+           /*
+            * arc at front of chain; usual case.
+            */
+           top->count++;
+           goto done;
+       }
+       /*
+        * have to go looking down chain for it.
+        * top points to what we are looking at,
+        * prevtop points to previous top.
+        * we know it is not at the head of the chain.
+        */
+       for(; /* goto done */; ){
+           if(top->link == 0){
+               /*
+                * top is end of the chain and none of the chain
+                * had top->selfpc == selfpc.
+                * so we allocate a new tostruct
+                * and link it to the head of the chain.
+                */
+               toindex = ++m->tos[0].link;
+               if(toindex >= m->tolimit){
+                   goto overflow;
+               }
+               top = &m->tos[toindex];
+               top->selfpc = (unsigned long)selfpc;
+               top->count = 1;
+               top->link = *frompcindex;
+               top->order = ++order;
+               *frompcindex = toindex;
+               goto done;
+           }
+           /*
+            * otherwise, check the next arc on the chain.
+            */
+           prevtop = top;
+           top = &m->tos[top->link];
+           if(top->selfpc == (unsigned long)selfpc){
+               /*
+                * there it is.
+                * increment its count
+                * move it to the head of the chain.
+                */
+               top->count++;
+               toindex = prevtop->link;
+               prevtop->link = top->link;
+               top->link = *frompcindex;
+               *frompcindex = toindex;
+               goto done;
+           }
+       }
+done:
+       profiling--;
+       return;
+
+overflow:
+       profiling++; /* halt further profiling */
+#define        TOLIMIT "mcount: tos overflow\n"
+       write(2, TOLIMIT, sizeof(TOLIMIT) - 1);
+}
+
+/*
+ * Get the profiling rate.
+ */
+static
+int
+getprofhz(void)
+{
+    int mib[2];
+    size_t size;
+    struct clockinfo clockrate;
+
+        mib[0] = CTL_KERN;
+        mib[1] = KERN_CLOCKRATE;
+        clockrate.profhz = 1;
+        size = sizeof(clockrate);
+        if(sysctl(mib, 2, &clockrate, &size, NULL, 0) < 0)
+               ;
+        return(clockrate.profhz);
+}
diff --git a/gen.subproj/i386.subproj/Makefile b/gen.subproj/i386.subproj/Makefile
new file mode 100644 (file)
index 0000000..5aea859
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = i386
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+OTHERLINKED = mcount.s
+
+CFILES = abs.c bcmp.c bcopy.c bzero.c ecvt.c ffs.c insque.c isinf.c\
+         memcpy.c memmove.c remque.c setjmperr.c strcat.c strcpy.c\
+         strlen.c strncat.c strncmp.c strncpy.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+OTHERLINKEDOFILES = mcount.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/gen.subproj/i386.subproj/Makefile.postamble b/gen.subproj/i386.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/gen.subproj/i386.subproj/Makefile.preamble b/gen.subproj/i386.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..6544e5f
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+INCLUDED_ARCHS = i386
diff --git a/gen.subproj/i386.subproj/PB.project b/gen.subproj/i386.subproj/PB.project
new file mode 100644 (file)
index 0000000..6bad7ee
--- /dev/null
@@ -0,0 +1,43 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (
+            abs.c, 
+            bcmp.c, 
+            bcopy.c, 
+            bzero.c, 
+            ecvt.c, 
+            ffs.c, 
+            insque.c, 
+            isinf.c, 
+            mcount.s, 
+            memcpy.c, 
+            memmove.c, 
+            remque.c, 
+            setjmperr.c, 
+            strcat.c, 
+            strcpy.c, 
+            strlen.c, 
+            strncat.c, 
+            strncmp.c, 
+            strncpy.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = i386; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/gen.subproj/i386.subproj/abs.c b/gen.subproj/i386.subproj/abs.c
new file mode 100644 (file)
index 0000000..4d6c1bb
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)abs.c      8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdlib.h>
+
+int
+abs(j)
+       int j;
+{
+       return(j < 0 ? -j : j);
+}
+#else
+#warning ----------- Check for implementation of abs() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/bcmp.c b/gen.subproj/i386.subproj/bcmp.c
new file mode 100644 (file)
index 0000000..ae8f18f
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)bcmp.c     8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <string.h>
+
+/*
+ * bcmp -- vax cmpc3 instruction
+ */
+int
+bcmp(b1, b2, length)
+       const void *b1, *b2;
+       register size_t length;
+{
+       register char *p1, *p2;
+
+       if (length == 0)
+               return(0);
+       p1 = (char *)b1;
+       p2 = (char *)b2;
+       do
+               if (*p1++ != *p2++)
+                       break;
+       while (--length);
+       return(length);
+}
+
+#else
+#warning ----------- Check for implementation of bcmp() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/bcopy.c b/gen.subproj/i386.subproj/bcopy.c
new file mode 100644 (file)
index 0000000..6bfae93
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)bcopy.c    8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * sizeof(word) MUST BE A POWER OF TWO
+ * SO THAT wmask BELOW IS ALL ONES
+ */
+typedef        int word;               /* "word" used for optimal copy speed */
+
+#define        wsize   sizeof(word)
+#define        wmask   (wsize - 1)
+
+/*
+ * Copy a block of memory, handling overlap.
+ * This is the routine that actually implements
+ * (the portable versions of) bcopy, memcpy, and memmove.
+ */
+#ifdef MEMCOPY
+void *
+memcpy(dst0, src0, length)
+#else
+#ifdef MEMMOVE
+void *
+memmove(dst0, src0, length)
+#else
+void
+bcopy(src0, dst0, length)
+#endif
+#endif
+       void *dst0;
+       const void *src0;
+       register size_t length;
+{
+       register char *dst = dst0;
+       register const char *src = src0;
+       register size_t t;
+
+       if (length == 0 || dst == src)          /* nothing to do */
+               goto done;
+
+       /*
+        * Macros: loop-t-times; and loop-t-times, t>0
+        */
+#define        TLOOP(s) if (t) TLOOP1(s)
+#define        TLOOP1(s) do { s; } while (--t)
+
+       if (((unsigned long)dst < (unsigned long)src) || ((unsigned long)dst >= ((unsigned long)src + length))) {
+               /*
+                * Copy forward.
+                */
+               t = (int)src;   /* only need low bits */
+               if ((t | (int)dst) & wmask) {
+                       /*
+                        * Try to align operands.  This cannot be done
+                        * unless the low bits match.
+                        */
+                       if ((t ^ (int)dst) & wmask || length < wsize)
+                               t = length;
+                       else
+                               t = wsize - (t & wmask);
+                       length -= t;
+                       TLOOP1(*dst++ = *src++);
+               }
+               /*
+                * Copy whole words, then mop up any trailing bytes.
+                */
+               t = length / wsize;
+               TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
+               t = length & wmask;
+               TLOOP(*dst++ = *src++);
+       } else {
+               /*
+                * Copy backwards.  Otherwise essentially the same.
+                * Alignment works as before, except that it takes
+                * (t&wmask) bytes to align, not wsize-(t&wmask).
+                */
+               src += length;
+               dst += length;
+               t = (int)src;
+               if ((t | (int)dst) & wmask) {
+                       if ((t ^ (int)dst) & wmask || length <= wsize)
+                               t = length;
+                       else
+                               t &= wmask;
+                       length -= t;
+                       TLOOP1(*--dst = *--src);
+               }
+               t = length / wsize;
+               TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
+               t = length & wmask;
+               TLOOP(*--dst = *--src);
+       }
+done:
+#if defined(MEMCOPY) || defined(MEMMOVE)
+       return (dst0);
+#else
+       return;
+#endif
+}
+
diff --git a/gen.subproj/i386.subproj/bzero.c b/gen.subproj/i386.subproj/bzero.c
new file mode 100644 (file)
index 0000000..b0c8884
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *      File:   libc/i386/gen/bzero.c
+ *      Author: Bruce Martin, NeXT Computer, Inc.
+ *
+ *      This file contains machine dependent code for the bzero function
+ *      on NeXT i386-based products.  Currently tuned for the i486.
+ *
+ * HISTORY
+ * 26-Aug-92  Bruce Martin (Bruce_Martin@NeXT.COM)
+ *      Created.
+ */
+
+#include <string.h>
+
+#undef bzero
+
+void bzero (void *b, size_t length)
+{
+    memset((void *) b, 0, (size_t) length);
+}
diff --git a/gen.subproj/i386.subproj/ecvt.c b/gen.subproj/i386.subproj/ecvt.c
new file mode 100644 (file)
index 0000000..70b7c25
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ *     ecvt converts to decimal
+ *     the number of digits is specified by ndigit
+ *     decptp is set to the position of the decimal point
+ *     signp is set to 0 for positive, 1 for negative
+ */
+
+
+static double ecvt_rint(double x);
+static double ecvt_copysign(double x, double y);
+
+static char *cvt();
+
+/* big enough to handle %.20f conversion of 1e308 */
+#define        NDIG            350
+
+char*
+ecvt(arg, ndigits, decptp, signp)
+double arg;
+int ndigits, *decptp, *signp;
+{
+       return(cvt(arg, ndigits, decptp, signp, 1));
+}
+
+char*
+fcvt(arg, ndigits, decptp, signp)
+double arg;
+int ndigits, *decptp, *signp;
+{
+       return(cvt(arg, ndigits, decptp, signp, 0));
+}
+
+static char*
+cvt(arg, ndigits, decptp, signp, eflag)
+double arg;
+int ndigits, *decptp, *signp;
+int eflag;
+{
+       register int decpt;
+       double fi, fj;
+       register char *p, *p1;
+       static char buf[NDIG] = { 0 };
+       double modf();
+
+       if (ndigits < 0)
+               ndigits = 0;
+       if (ndigits >= NDIG-1)
+               ndigits = NDIG-2;
+
+       decpt = 0;
+       *signp = 0;
+       p = &buf[0];
+
+       if (arg == 0) {
+               *decptp = 0;
+               while (p < &buf[ndigits])
+                       *p++ = '0';
+               *p = '\0';
+               return(buf);
+       } else if (arg < 0) {
+               *signp = 1;
+               arg = -arg;
+       }
+
+       arg = modf(arg, &fi);
+       p1 = &buf[NDIG];
+
+       /*
+        * Do integer part
+        */
+       if (fi != 0) {
+               while (fi != 0) {
+                       fj = modf(fi/10, &fi);
+                       /**--p1 = (int)((fj+.03)*10) + '0';*/
+                       *--p1 = (int)ecvt_rint((fj)*10) + '0';
+                       decpt++;
+               }
+               while (p1 < &buf[NDIG])
+                       *p++ = *p1++;
+       } else if (arg > 0) {
+               while ((fj = arg*10) < 1) {
+                       arg = fj;
+                       decpt--;
+               }
+       }
+       *decptp = decpt;
+
+       /*
+        * do fraction part
+        * p pts to where fraction should be concatenated
+        * p1 is how far conversion must go to
+        */
+       p1 = &buf[ndigits];
+       if (eflag==0) {
+               /* fcvt must provide ndigits after decimal pt */
+               p1 += decpt;
+               /* if decpt was negative, we might done for fcvt */
+               if (p1 < &buf[0]) {
+                       buf[0] = '\0';
+                       return(buf);
+               }
+       }
+       while (p <= p1 && p < &buf[NDIG]) {
+               arg *= 10;
+               arg = modf(arg, &fj);
+               *p++ = (int)fj + '0';
+       }
+       /*
+        * if we converted all the way to the end of the
+        * buf, don't mess with rounding since there's nothing
+        * significant out here anyway
+        */
+       if (p1 >= &buf[NDIG]) {
+               buf[NDIG-1] = '\0';
+               return(buf);
+       }
+       /*
+        * round by adding 5 to last digit and propagating
+        * carries
+        */
+       p = p1;
+       *p1 += 5;
+       while (*p1 > '9') {
+               *p1 = '0';
+               if (p1 > buf)
+                       ++*--p1;
+               else {
+                       *p1 = '1';
+                       (*decptp)++;
+                       if (eflag == 0) {
+                               if (p > buf)
+                                       *p = '0';
+                               p++;
+                       }
+               }
+       }
+       *p = '\0';
+       return(buf);
+}
+
+static double ecvt_rint(double x)
+{
+       asm("frndint" : "=t" (x) :  "0" (x));
+       return(x);
+}
diff --git a/gen.subproj/i386.subproj/ffs.c b/gen.subproj/i386.subproj/ffs.c
new file mode 100644 (file)
index 0000000..6205d2b
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)ffs.c      8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <string.h>
+
+/*
+ * ffs -- vax ffs instruction
+ */
+int
+ffs(mask)
+       register int mask;
+{
+       register int bit;
+
+       if (mask == 0)
+               return(0);
+       for (bit = 1; !(mask & 1); bit++)
+               mask >>= 1;
+       return(bit);
+}
+
+#else
+#warning ----------- Check for implementation of ffs() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/insque.c b/gen.subproj/i386.subproj/insque.c
new file mode 100644 (file)
index 0000000..17f0b48
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/insque.c
+ *
+ * struct qelem {
+ *     struct qelem *q_forw;
+ *     struct qelem *q_back;
+ *     char q_data[];
+ * };
+ *
+ * void insque(struct qelem *elem, struct qelem *prev);
+ *
+ * Inserts queue entry `elem' into a queue after element `prev'.
+ *
+ * HISTORY
+*  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+*      Ported to PPC.
+ *  10-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#include <libc.h>
+
+void
+insque(struct qelem *elem, struct qelem *prev)
+{
+    struct qelem *next;
+
+    next = prev->q_forw;
+    prev->q_forw = elem;
+    if (next != 0)
+       next->q_back = elem;
+    elem->q_forw = next;
+    elem->q_back = prev;
+}
diff --git a/gen.subproj/i386.subproj/isinf.c b/gen.subproj/i386.subproj/isinf.c
new file mode 100644 (file)
index 0000000..838b17b
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987 NeXT, INC.
+ */
+
+/*
+ * isinf -- returns 1 if positive IEEE infinity, -1 if negative
+ *         IEEE infinity, 0 otherwise.
+ */
+int
+isinf(d)
+double d;
+{
+       int i;
+
+       i = *((int *)&d + 1);
+       if (i == 0x7ff00000)
+               return(1);
+       if (i == 0xfff00000)
+               return(-1);
+       return(0);
+}
diff --git a/gen.subproj/i386.subproj/mcount.s b/gen.subproj/i386.subproj/mcount.s
new file mode 100644 (file)
index 0000000..82af032
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#import <architecture/i386/asm_help.h>
+
+.text
+        .globl mcount
+mcount:
+        pushl   %ebp            // setup mcount's frame
+        movl    %esp,%ebp
+
+        movl    (%ebp),%eax     // load the frame pointer of mcount's caller
+        movl    4(%eax),%eax    // load mcount's caller's return address
+        pushl   4(%ebp)         // push the selfpc parameter for moncount()
+        pushl   %eax            // push the frompc parameter for moncount()
+        CALL_EXTERN(_moncount)  // call moncount()
+
+        movl    %ebp,%esp       // tear down mcount's frame
+        popl    %ebp
+        ret
diff --git a/gen.subproj/i386.subproj/memcpy.c b/gen.subproj/i386.subproj/memcpy.c
new file mode 100644 (file)
index 0000000..6b5774f
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *      File:   libc/i386/ansi/memcpy.c
+ *      Author: Bruce Martin, NeXT Computer, Inc.
+ *
+ * HISTORY
+ * 24-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created for m98k.
+ */
+#define MEMCOPY
+#include "bcopy.c"
diff --git a/gen.subproj/i386.subproj/memmove.c b/gen.subproj/i386.subproj/memmove.c
new file mode 100644 (file)
index 0000000..c907093
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *      File:   libc/i386/ansi/memmove.c
+ *      Author: Bruce Martin, NeXT Computer, Inc.
+ *
+ * HISTORY
+ * 24-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created for m98k.
+ */
+#define MEMMOVE
+#include "bcopy.c"
diff --git a/gen.subproj/i386.subproj/remque.c b/gen.subproj/i386.subproj/remque.c
new file mode 100644 (file)
index 0000000..9e032c5
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997  NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/remque.c
+ *
+ * struct qelem {
+ *     struct qelem    *q_forw;
+ *     struct qelem    *q_back;
+ *     char            q_data[];
+ * };
+ *
+ * void remque(struct qelem *entry);
+ *
+ * Removes `entry' from a queue.
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ *  10-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#import <libc.h>
+
+void
+remque(struct qelem *elem)
+{
+    struct qelem *next, *prev;
+
+    next = elem->q_forw;
+    prev = elem->q_back;
+    if (next != 0)
+       next->q_back = prev;
+    if (prev != 0)
+       prev->q_forw = next;
+}
diff --git a/gen.subproj/i386.subproj/setjmperr.c b/gen.subproj/i386.subproj/setjmperr.c
new file mode 100644 (file)
index 0000000..ab963b5
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)setjmperr.c        5.4 (Berkeley) 6/27/88";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * This routine is called from longjmp() when an error occurs.
+ * Programs that wish to exit gracefully from this error may
+ * write their own versions.
+ * If this routine returns, the program is aborted.
+ */
+
+void
+longjmperror()
+{
+#define        ERRMSG  "longjmp botch\n"
+       write(2, ERRMSG, sizeof(ERRMSG) - 1);
+}
diff --git a/gen.subproj/i386.subproj/strcat.c b/gen.subproj/i386.subproj/strcat.c
new file mode 100644 (file)
index 0000000..32cefc0
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strcat.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <string.h>
+
+char *
+strcat(s, append)
+       register char *s;
+       register const char *append;
+{
+       char *save = s;
+
+       for (; *s; ++s);
+       while (*s++ = *append++);
+       return(save);
+}
+
+#else
+#warning ----------- Check for implementation of strcat() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/strcpy.c b/gen.subproj/i386.subproj/strcpy.c
new file mode 100644 (file)
index 0000000..77ecaf3
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strcpy.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+char *
+strcpy(to, from)
+       register char *to;
+       register const char *from;
+{
+       char *save = to;
+
+       for (; *to = *from; ++from, ++to);
+       return(save);
+}
+
+#else
+#warning ----------- Check for implementation of strcpy() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/strlen.c b/gen.subproj/i386.subproj/strlen.c
new file mode 100644 (file)
index 0000000..b57e6e7
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strlen.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+size_t
+strlen(str)
+       const char *str;
+{
+       register const char *s;
+
+       for (s = str; *s; ++s);
+       return(s - str);
+}
+
+#else
+#warning ----------- Check for implementation of strlen() ----------- !
+#endif /* !defined(__ppc__) */
+
diff --git a/gen.subproj/i386.subproj/strncat.c b/gen.subproj/i386.subproj/strncat.c
new file mode 100644 (file)
index 0000000..a73aabe
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strncat.c  8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Concatenate src on the end of dst.  At most strlen(dst)+n+1 bytes
+ * are written at dst (at most n+1 bytes being appended).  Return dst.
+ */
+char *
+strncat(dst, src, n)
+       char *dst;
+       const char *src;
+       register size_t n;
+{
+       if (n != 0) {
+               register char *d = dst;
+               register const char *s = src;
+
+               while (*d != 0)
+                       d++;
+               do {
+                       if ((*d = *s++) == 0)
+                               break;
+                       d++;
+               } while (--n != 0);
+               *d = 0;
+       }
+       return (dst);
+}
+
+#else
+#warning ----------- Check for implementation of strncat() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/strncmp.c b/gen.subproj/i386.subproj/strncmp.c
new file mode 100644 (file)
index 0000000..0dc3d06
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strncmp.c  8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+int
+strncmp(s1, s2, n)
+       register const char *s1, *s2;
+       register size_t n;
+{
+
+       if (n == 0)
+               return (0);
+       do {
+               if (*s1 != *s2++)
+                       return (*(unsigned char *)s1 - *(unsigned char *)--s2);
+               if (*s1++ == 0)
+                       break;
+       } while (--n != 0);
+       return (0);
+}
+
+#else
+#warning ----------- Check for implementation of strncmp() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/i386.subproj/strncpy.c b/gen.subproj/i386.subproj/strncpy.c
new file mode 100644 (file)
index 0000000..c47add3
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(__ppc__)
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strncpy.c  8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Copy src to dst, truncating or null-padding to always copy n bytes.
+ * Return dst.
+ */
+char *
+strncpy(dst, src, n)
+       char *dst;
+       const char *src;
+       register size_t n;
+{
+       if (n != 0) {
+               register char *d = dst;
+               register const char *s = src;
+
+               do {
+                       if ((*d++ = *s++) == 0) {
+                               /* NUL pad the remaining n-1 bytes */
+                               while (--n != 0)
+                                       *d++ = 0;
+                               break;
+                       }
+               } while (--n != 0);
+       }
+       return (dst);
+}
+
+#else
+#warning ----------- Check for implementation of strncpy() ----------- !
+#endif /* !defined(__ppc__) */
diff --git a/gen.subproj/isatty.c b/gen.subproj/isatty.c
new file mode 100644 (file)
index 0000000..5170369
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <termios.h>
+#include <unistd.h>
+
+int
+isatty(fd)
+       int fd;
+{
+       struct termios t;
+
+       return(tcgetattr(fd, &t) != -1);
+}
diff --git a/gen.subproj/isnan.c b/gen.subproj/isnan.c
new file mode 100644 (file)
index 0000000..bce7a53
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* @(#)s_isnan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: s_isnan.c,v 1.8 1995/05/10 20:47:36 jtc Exp $";
+#endif
+
+/*
+ * isnan(x) returns 1 is x is nan, else 0;
+ * no branching!
+ */
+
+#include <sys/types.h>
+
+typedef union
+{
+  double value;
+  struct
+  {
+#if defined(__BIG_ENDIAN__)
+    u_int32_t msw;
+    u_int32_t lsw;
+#else
+    u_int32_t lsw;
+    u_int32_t msw;
+#endif
+  } parts;
+} ieee_double_shape_type;
+/* Get two 32 bit ints from a double.  */
+
+#define EXTRACT_WORDS(ix0,ix1,d)                               \
+do {                                                           \
+  ieee_double_shape_type ew_u;                                 \
+  ew_u.value = (d);                                            \
+  (ix0) = ew_u.parts.msw;                                      \
+  (ix1) = ew_u.parts.lsw;                                      \
+} while (0)
+
+
+#ifdef __STDC__
+       int isnan(double x)
+#else
+       int isnan(x)
+       double x;
+#endif
+{
+       int32_t hx,lx;
+       EXTRACT_WORDS(hx,lx,x);
+       hx &= 0x7fffffff;
+       hx |= (u_int32_t)(lx|(-lx))>>31;        
+       hx = 0x7ff00000 - hx;
+       return (int)((u_int32_t)(hx))>>31;
+}
diff --git a/gen.subproj/malloc.c b/gen.subproj/malloc.c
new file mode 100644 (file)
index 0000000..5393b99
--- /dev/null
@@ -0,0 +1,774 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#define __POSIX_LIB__
+#import <stdlib.h>
+#import <stdio.h>
+#import <string.h>
+#import <unistd.h>
+#import <objc/zone.h>
+#import <pthread_internals.h>  // for spin lock
+#import <objc/malloc.h>
+#include <crt_externs.h>
+
+#import "scalable_malloc.h"
+#import "stack_logging.h"
+
+#define USE_SLEEP_RATHER_THAN_ABORT    0
+
+#define MAX_ALLOCATION 0xc0000000 // beyond this, assume a programming error
+#define INITIAL_ZONES  8  // After this number, we reallocate for new zones
+
+typedef void (malloc_logger_t)(unsigned type, unsigned arg1, unsigned arg2, unsigned arg3, unsigned result, unsigned num_hot_frames_to_skip);
+
+static pthread_lock_t _malloc_lock;
+static malloc_zone_t *initial_malloc_zones[INITIAL_ZONES] = {0};
+
+/* The following variables are exported for the benefit of performance tools */
+unsigned malloc_num_zones = 0;
+malloc_zone_t **malloc_zones = initial_malloc_zones;
+malloc_logger_t *malloc_logger = NULL;
+
+unsigned malloc_debug_flags = 0;
+
+unsigned malloc_check_start = 0; // 0 means don't check
+unsigned malloc_check_counter = 0;
+unsigned malloc_check_each = 1000;
+
+#define MALLOC_LOCK()          LOCK(_malloc_lock)
+#define MALLOC_UNLOCK()                UNLOCK(_malloc_lock)
+
+#define MALLOC_LOG_TYPE_ALLOCATE       stack_logging_type_alloc
+#define MALLOC_LOG_TYPE_DEALLOCATE     stack_logging_type_dealloc
+#define MALLOC_LOG_TYPE_HAS_ZONE       stack_logging_flag_zone
+#define MALLOC_LOG_TYPE_CLEARED                stack_logging_flag_cleared
+
+/*********     Utilities       ************/
+
+static inline malloc_zone_t *find_registered_zone(const void *ptr, size_t *returned_size) {
+    // locates the proper zone
+    // if zone found fills returnedSize; else returns NULL
+    // See comment in malloc_zone_register() about clients non locking to call this function
+    // Speed is critical for this function
+    unsigned   index = malloc_num_zones;
+    malloc_zone_t      **zones = malloc_zones;
+    while (index--) {
+        malloc_zone_t  *zone = *zones++;
+        size_t size;
+        size = zone->size(zone, ptr);
+        if (size) {
+            if (returned_size) *returned_size = size;
+            return zone;
+        }
+    }
+    return NULL;
+}
+
+/*********     Creation and destruction        ************/
+
+static void _malloc_initialize(void) {
+    // guaranteed to be called only once
+    (void)malloc_create_zone(0, 0);
+    malloc_set_zone_name(malloc_zones[0], "DefaultMallocZone");
+    LOCK_INIT(_malloc_lock);
+    // malloc_printf("Malloc: %d registered zones\n", malloc_num_zones);
+    // malloc_printf("malloc: malloc_zones is at 0x%x; malloc_num_zones is at 0x%x\n", (unsigned)&malloc_zones, (unsigned)&malloc_num_zones);
+}
+
+static inline malloc_zone_t *inline_malloc_default_zone(void) {
+    if (!malloc_num_zones) _malloc_initialize();
+    // malloc_printf("In inline_malloc_default_zone with %d %d\n", malloc_num_zones, malloc_has_debug_zone);
+    return malloc_zones[0];
+}
+
+malloc_zone_t *malloc_default_zone(void) {
+    return inline_malloc_default_zone();
+}
+
+static void set_flags_from_environment(void) {
+    const char *flag;
+    if (getenv("MallocGuardEdges")) {
+       malloc_debug_flags = SCALABLE_MALLOC_ADD_GUARD_PAGES;
+       malloc_printf("malloc[%d]: protecting edges\n", getpid());
+       if (getenv("MallocDoNotProtectPrelude")) {
+           malloc_debug_flags |= SCALABLE_MALLOC_DONT_PROTECT_PRELUDE;
+           malloc_printf("malloc[%d]: ... but not protecting prelude guard page\n", getpid());
+       }
+       if (getenv("MallocDoNotProtectPostlude")) {
+           malloc_debug_flags |= SCALABLE_MALLOC_DONT_PROTECT_POSTLUDE;
+           malloc_printf("malloc[%d]: ... but not protecting postlude guard page\n", getpid());
+       }
+    }
+    flag = getenv("MallocStackLogging");
+    if (!flag) {
+       flag = getenv("MallocStackLoggingNoCompact");
+       stack_logging_dontcompact = 1;
+    }
+    if (flag) {
+       unsigned        val = strtoul(flag, NULL, 0);
+       if (val == 1) val = 0;
+       if (val == -1) val = 0;
+       malloc_logger = (val) ? (void *)val : stack_logging_log_stack;
+       stack_logging_enable_logging = 1;
+       if (malloc_logger == stack_logging_log_stack) {
+           malloc_printf("malloc[%d]: recording stacks using standard recorder\n", getpid());
+       } else {
+           malloc_printf("malloc[%d]: recording stacks using recorder %p\n", getpid(), malloc_logger);
+       }
+       if (stack_logging_dontcompact) malloc_printf("malloc[%d]: stack logging compaction turned off; VM can increase rapidly\n", getpid());
+    }
+    if (getenv("MallocScribble")) {
+       malloc_debug_flags |= SCALABLE_MALLOC_DO_SCRIBBLE;
+       malloc_printf("malloc[%d]: enabling scribbling to detect mods to free blocks\n", getpid());
+    }
+    flag = getenv("MallocCheckHeapStart");
+    if (flag) {
+       malloc_check_start = strtoul(flag, NULL, 0);
+       if (malloc_check_start == 0) malloc_check_start = 1;
+       if (malloc_check_start == -1) malloc_check_start = 1;
+       flag = getenv("MallocCheckHeapEach");
+       if (flag) {
+           malloc_check_each = strtoul(flag, NULL, 0);
+           if (malloc_check_each == 0) malloc_check_each = 1;
+           if (malloc_check_each == -1) malloc_check_each = 1;
+       }
+       malloc_printf("malloc[%d]: checks heap after %dth operation and each %d operations\n", getpid(), malloc_check_start, malloc_check_each);
+    }
+    if (getenv("MallocHelp")) {
+       malloc_printf(
+           "malloc[%d]: environment variables that can be set for debug:\n"
+           "- MallocGuardEdges to add 2 guard pages for each large block\n"
+           "- MallocDoNotProtectPrelude to disable protection (when previous flag set)\n"
+           "- MallocDoNotProtectPostlude to disable protection (when previous flag set)\n"
+           "- MallocStackLogging to record all stacks.  Tools like leaks can then be applied\n"
+           "- MallocStackLoggingNoCompact to record all stacks.  Needed for malloc_history\n"
+           "- MallocScribble to detect writing on free blocks: 0x55 is written upon free\n"
+           "- MallocCheckHeapStart <n> to check the heap from time to time after <n> operations \n"
+           "- MallocHelp - this help!\n", getpid());
+    }
+}
+
+malloc_zone_t *malloc_create_zone(vm_size_t start_size, unsigned flags) {
+    malloc_zone_t      *zone;
+    if (!malloc_num_zones) {
+       char    **env = * _NSGetEnviron();
+       char    **p;
+       char    *c;
+       /* Given that all environment variables start with "Malloc" we optimize by scanning quickly first the environment, therefore avoiding repeated calls to getenv() */
+       for (p = env; (c = *p) != NULL; ++p) {
+           if (!strncmp(c, "Malloc", 6)) {
+               set_flags_from_environment(); 
+               break;
+           }
+       }
+
+    }
+    zone = create_scalable_zone(start_size, malloc_debug_flags);
+    malloc_zone_register(zone);
+    return zone;
+}
+
+void malloc_destroy_zone(malloc_zone_t *zone) {
+    malloc_zone_unregister(zone);
+    zone->destroy(zone);
+}
+
+/*********     Block creation and manipulation ************/
+
+static void internal_check(void) {
+    static vm_address_t        *frames = NULL;
+    static unsigned    num_frames;
+    if (malloc_zone_check(NULL)) {
+       malloc_printf("MallocCheckHeap: PASSED check at %dth operation\n", malloc_check_counter-1);
+       if (!frames) vm_allocate(mach_task_self(), (void *)&frames, vm_page_size, 1);
+       thread_stack_pcs(frames, vm_page_size/sizeof(vm_address_t) - 1, &num_frames);
+    } else {
+       malloc_printf("*** MallocCheckHeap: FAILED check at %dth operation\n", malloc_check_counter-1);
+       if (frames) {
+           unsigned    index = 1;
+           malloc_printf("Stack for last operation where the malloc check succeeded: ");
+           while (index < num_frames) malloc_printf("0x%x ", frames[index++]);
+           malloc_printf("\n(Use 'atos' for a symbolic stack)\n");
+       }
+       if (malloc_check_each > 1) {
+           unsigned    recomm_each = (malloc_check_each > 10) ? malloc_check_each/10 : 1;
+           unsigned    recomm_start = (malloc_check_counter > malloc_check_each+1) ? malloc_check_counter-1-malloc_check_each : 1;
+           malloc_printf("*** Recommend using 'setenv MallocCheckHeapStart %d; setenv MallocCheckHeapEach %d' to narrow down failure\n", recomm_start, recomm_each);
+       }
+       malloc_printf("*** Sleeping for 100 seconds to leave time to attach\n");
+       sleep(100);
+    }
+    malloc_check_start += malloc_check_each;
+}
+
+void *malloc_zone_malloc(malloc_zone_t *zone, size_t size) {
+    void       *ptr;
+    if ((unsigned)size >= MAX_ALLOCATION) {
+        /* Probably a programming error */
+        fprintf(stderr, "*** malloc_zone_malloc[%d]: argument too large: %d\n", getpid(), (unsigned)size);
+        return NULL;
+    }
+    if (malloc_check_start && (malloc_check_counter++ >= malloc_check_start)) {
+       internal_check();
+    }
+    ptr = zone->malloc(zone, size);
+    if (malloc_logger) malloc_logger(MALLOC_LOG_TYPE_ALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE, (unsigned)zone, size, 0, (unsigned)ptr, 0);
+    return ptr;
+}
+
+void *malloc_zone_calloc(malloc_zone_t *zone, size_t num_items, size_t size) {
+    void       *ptr;
+    if (malloc_check_start && (malloc_check_counter++ >= malloc_check_start)) {
+       internal_check();
+    }
+    if (((unsigned)num_items >= MAX_ALLOCATION) || ((unsigned)size >= MAX_ALLOCATION) || ((long long)size * num_items >= (long long) MAX_ALLOCATION)) {
+        /* Probably a programming error */
+        fprintf(stderr, "*** malloc_zone_calloc[%d]: arguments too large: %d,%d\n", getpid(), (unsigned)num_items, (unsigned)size);
+        return NULL;
+    }
+    ptr = zone->calloc(zone, num_items, size);
+    if (malloc_logger) malloc_logger(MALLOC_LOG_TYPE_ALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE | MALLOC_LOG_TYPE_CLEARED, (unsigned)zone, num_items * size, 0, (unsigned)ptr, 0);
+    return ptr;
+}
+
+void *malloc_zone_valloc(malloc_zone_t *zone, size_t size) {
+    void       *ptr;
+    if ((unsigned)size >= MAX_ALLOCATION) {
+        /* Probably a programming error */
+        fprintf(stderr, "*** malloc_zone_valloc[%d]: argument too large: %d\n", getpid(), (unsigned)size);
+        return NULL;
+    }
+    if (malloc_check_start && (malloc_check_counter++ >= malloc_check_start)) {
+       internal_check();
+    }
+    ptr = zone->valloc(zone, size);
+    if (malloc_logger) malloc_logger(MALLOC_LOG_TYPE_ALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE, (unsigned)zone, size, 0, (unsigned)ptr, 0);
+    return ptr;
+}
+
+void *malloc_zone_realloc(malloc_zone_t *zone, void *ptr, size_t size) {
+    void       *new_ptr;
+    if (malloc_check_start && (malloc_check_counter++ >= malloc_check_start)) {
+       internal_check();
+    }
+    new_ptr = zone->realloc(zone, ptr, size);
+    if (malloc_logger) malloc_logger(MALLOC_LOG_TYPE_ALLOCATE | MALLOC_LOG_TYPE_DEALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE, (unsigned)zone, (unsigned)ptr, size, (unsigned)new_ptr, 0);
+    return new_ptr;
+}
+
+void malloc_zone_free(malloc_zone_t *zone, void *ptr) {
+    if (malloc_logger) malloc_logger(MALLOC_LOG_TYPE_DEALLOCATE | MALLOC_LOG_TYPE_HAS_ZONE, (unsigned)zone, (unsigned)ptr, 0, 0, 0);
+    if (malloc_check_start && (malloc_check_counter++ >= malloc_check_start)) {
+       internal_check();
+    }
+    zone->free(zone, ptr);
+}
+
+malloc_zone_t *malloc_zone_from_ptr(const void *ptr) {
+    malloc_zone_t      *zone;
+    if (!ptr) return NULL;
+    zone = find_registered_zone(ptr, NULL);
+    return zone;
+}
+
+/*********     Functions for zone implementors ************/
+
+void malloc_zone_register(malloc_zone_t *zone) {
+    /* Note that given the sequencing it is always safe to first get the number of zones, then get malloc_zones without taking the lock, if all you need is to iterate through the list */
+    MALLOC_LOCK();
+    if (malloc_num_zones >= INITIAL_ZONES) {
+        malloc_zone_t          **zones = malloc_zones;
+        malloc_zone_t          *pzone = malloc_zones[0];
+        boolean_t              copy = malloc_num_zones == INITIAL_ZONES;
+        if (copy) zones = NULL; // to avoid realloc on something not allocated
+        MALLOC_UNLOCK();
+        zones = pzone->realloc(pzone, zones, (malloc_num_zones + 1) * sizeof(malloc_zone_t *)); // we leak initial_malloc_zones, not worth tracking it
+        MALLOC_LOCK();
+        if (copy) memcpy(zones, malloc_zones, malloc_num_zones * sizeof(malloc_zone_t *));
+        malloc_zones = zones;
+    }
+    malloc_zones[malloc_num_zones] = zone;
+    malloc_num_zones++; // note that we do this after setting malloc_num_zones, so enumerations without taking the lock are safe
+    MALLOC_UNLOCK();
+    // malloc_printf("Registered %p malloc_zones at address %p is %p [%d zones]\n", zone, &malloc_zones, malloc_zones, malloc_num_zones);
+}
+
+void malloc_zone_unregister(malloc_zone_t *z) {
+    unsigned   index;
+    MALLOC_LOCK();
+    index = malloc_num_zones;
+    while (index--) {
+        malloc_zone_t  *zone = malloc_zones[index];
+        if (zone == z) {
+            malloc_zones[index] = malloc_zones[--malloc_num_zones];
+            MALLOC_UNLOCK();
+            return;
+        }
+    }
+    MALLOC_UNLOCK();
+    fprintf(stderr, "*** malloc[%d]: malloc_zone_unregister() failed for %p\n", getpid(), z);
+}
+
+void malloc_set_zone_name(malloc_zone_t *z, const char *name) {
+    char       *newName;
+    if (z->zone_name) {
+        free((char *)z->zone_name);
+        z->zone_name = NULL;
+    }
+    newName = malloc_zone_malloc(z, strlen(name) + 1);
+    strcpy(newName, name);
+    z->zone_name = (const char *)newName;
+}
+
+const char *malloc_get_zone_name(malloc_zone_t *zone) {
+    return zone->zone_name;
+}
+
+static char *_malloc_append_unsigned(unsigned value, unsigned base, char *head) {
+    if (!value) {
+        head[0] = '0';
+    } else {
+        if (value >= base) head = _malloc_append_unsigned(value / base, base, head);
+        value = value % base;
+        head[0] = (value < 10) ? '0' + value : 'a' + value - 10;
+    }
+    return head+1;
+}
+
+void malloc_printf(const char *format, ...) {
+    va_list    args;
+    char       buf[1024];
+    char       *head = buf;
+    char       ch;
+    unsigned   *nums;
+    va_start(args, format);
+#if LOG_THREAD
+    head = _malloc_append_unsigned(((unsigned)&args) >> 12, 16, head);
+    *head++ = ' ';
+#endif
+    nums = args;
+    while (ch = *format++) {
+        if (ch == '%') {
+            ch = *format++;
+            if (ch == 's') {
+                char   *str = (char *)(*nums++);
+                write(2, buf, head - buf);
+                head = buf;
+                write(2, str, strlen(str));
+            } else {
+                if (ch == 'p') {
+                    *head++ = '0'; *head++ = 'x';
+                }
+                head = _malloc_append_unsigned(*nums++, (ch == 'd') ? 10 : 16, head);
+            }
+        } else {
+            *head++ = ch;
+        }
+    }
+    write(2, buf, head - buf); fflush(stderr);
+    va_end(args);
+}
+
+/*********     Generic ANSI callouts   ************/
+
+void *malloc(size_t size) {
+    return malloc_zone_malloc(inline_malloc_default_zone(), size);
+}
+
+void *calloc(size_t num_items, size_t size) {
+    return malloc_zone_calloc(inline_malloc_default_zone(), num_items, size);
+}
+
+void free(void *ptr) {
+    malloc_zone_t      *zone;
+    if (!ptr) return;
+    zone = find_registered_zone(ptr, NULL);
+    if (zone) {
+        malloc_zone_free(zone, ptr);
+    } else {
+        fprintf(stderr, "*** malloc[%d]: Deallocation of a pointer not malloced: %p; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug\n", getpid(), ptr);
+    }
+}
+
+void *realloc(void *old_ptr, size_t new_size) {
+    malloc_zone_t      *zone;
+    size_t     old_size = 0;
+    if (!old_ptr) return malloc_zone_malloc(inline_malloc_default_zone(), new_size);
+    zone = find_registered_zone(old_ptr, &old_size);
+    if (zone && (old_size >= new_size)) return old_ptr;
+    if (!zone) zone = inline_malloc_default_zone();
+    return malloc_zone_realloc(zone, old_ptr, new_size);
+}
+
+void *valloc(size_t size) {
+    malloc_zone_t      *zone = inline_malloc_default_zone();
+    return malloc_zone_valloc(zone, size);
+}
+
+extern void vfree(void *ptr) {
+    free(ptr);
+}
+
+size_t malloc_size(const void *ptr) {
+    size_t     size = 0;
+    if (!ptr) return size;
+    (void)find_registered_zone(ptr, &size);
+    return size;
+}
+
+size_t malloc_good_size (size_t size) {
+    malloc_zone_t      *zone = inline_malloc_default_zone();
+    return zone->introspect->good_size(zone, size);
+}
+
+/*********     Functions for performance tools ************/
+
+static kern_return_t _malloc_default_reader(task_t task, vm_address_t address, vm_size_t size, void **ptr) {
+    *ptr = (void *)address;
+    return 0;
+}
+
+kern_return_t malloc_get_all_zones(task_t task, memory_reader_t reader, vm_address_t **addresses, unsigned *count) {
+    // Note that the 2 following addresses are not correct if the address of the target is different from your own.  This notably occurs if the address of System.framework is slid (e.g. different than at B & I )
+    vm_address_t       remote_malloc_zones = (vm_address_t)&malloc_zones;
+    vm_address_t       remote_malloc_num_zones = (vm_address_t)&malloc_num_zones;
+    kern_return_t      err;
+    vm_address_t       zones_address;
+    vm_address_t       *zones_address_ref;
+    unsigned           num_zones;
+    unsigned           *num_zones_ref;
+    if (!reader) reader = _malloc_default_reader;
+    // printf("Read malloc_zones at address %p should be %p\n", &malloc_zones, malloc_zones);
+    err = reader(task, remote_malloc_zones, sizeof(void *), (void **)&zones_address_ref);
+    // printf("Read malloc_zones[0x%x]=%p\n", remote_malloc_zones, *zones_address_ref);
+    if (err) {
+        fprintf(stderr, "*** malloc[%d]: malloc_get_all_zones: error reading zones_address at 0x%x\n", getpid(), (unsigned)remote_malloc_zones);
+        return err;
+    }
+    zones_address = *zones_address_ref;
+    // printf("Reading num_zones at address %p\n", remote_malloc_num_zones);
+    err = reader(task, remote_malloc_num_zones, sizeof(unsigned), (void **)&num_zones_ref);
+    if (err) {
+        fprintf(stderr, "*** malloc[%d]: malloc_get_all_zones: error reading num_zones at 0x%x\n",  getpid(), (unsigned)remote_malloc_num_zones);
+        return err;
+    }
+    num_zones = *num_zones_ref;
+    // printf("Read malloc_num_zones[0x%x]=%d\n", remote_malloc_num_zones, num_zones);
+    *count = num_zones;
+    // printf("malloc_get_all_zones succesfully found %d zones\n", num_zones);
+    err = reader(task, zones_address, sizeof(malloc_zone_t *) * num_zones, (void **)addresses);
+    if (err) {
+        fprintf(stderr, "*** malloc[%d]: malloc_get_all_zones: error reading zones at 0x%x\n", getpid(), (unsigned)&zones_address);
+        return err;
+    }
+    // printf("malloc_get_all_zones succesfully read %d zones\n", num_zones);
+    return err;
+}
+
+/*********     Debug helpers   ************/
+
+void malloc_zone_print_ptr_info(void *ptr) {
+    malloc_zone_t      *zone;
+    if (!ptr) return;
+    zone = find_registered_zone(ptr, NULL);
+    if (zone) {
+        printf("ptr %p in registered zone %p\n", ptr, zone);
+    } else {
+        printf("ptr %p not in heap\n", ptr);
+    }
+}
+
+boolean_t malloc_zone_check(malloc_zone_t *zone) {
+    boolean_t  ok = 1;
+    if (!zone) {
+        unsigned       index = 0;
+        while (index < malloc_num_zones) {
+            zone = malloc_zones[index++];
+            if (!zone->introspect->check(zone)) ok = 0;
+        }
+    } else {
+        ok = zone->introspect->check(zone);
+    }
+    return ok;
+}
+
+void malloc_zone_print(malloc_zone_t *zone, boolean_t verbose) {
+    if (!zone) {
+        unsigned       index = 0;
+        while (index < malloc_num_zones) {
+            zone = malloc_zones[index++];
+            zone->introspect->print(zone, verbose);
+        }
+    } else {
+        zone->introspect->print(zone, verbose);
+    }
+}
+
+void malloc_zone_log(malloc_zone_t *zone, void *address) {
+    if (!zone) {
+        unsigned       index = 0;
+        while (index < malloc_num_zones) {
+            zone = malloc_zones[index++];
+            zone->introspect->log(zone, address);
+        }
+    } else {
+        zone->introspect->log(zone, address);
+    }
+}
+
+/*********     Misc other entry points ************/
+
+static void DefaultMallocError(int x) {
+    fprintf(stderr, "*** malloc[%d]: error %d\n", getpid(), x);
+#if USE_SLEEP_RATHER_THAN_ABORT
+    sleep(3600);
+#else
+    abort();
+#endif
+}
+
+void (*malloc_error(void (*func)(int)))(int) {
+    return DefaultMallocError;
+}
+
+void _malloc_fork_prepare() {
+    /* Prepare the malloc module for a fork by insuring that no thread is in a malloc critical section */
+    unsigned   index = 0;
+    MALLOC_LOCK();
+    while (index < malloc_num_zones) {
+        malloc_zone_t  *zone = malloc_zones[index++];
+        zone->introspect->force_lock(zone);
+    }
+}
+
+void _malloc_fork_parent() {
+    /* Called in the parent process after a fork() to resume normal operation. */
+    unsigned   index = 0;
+    MALLOC_UNLOCK();
+    while (index < malloc_num_zones) {
+        malloc_zone_t  *zone = malloc_zones[index++];
+        zone->introspect->force_unlock(zone);
+    }
+}
+
+void _malloc_fork_child() {
+    /* Called in the child process after a fork() to resume normal operation.  In the MTASK case we also have to change memory inheritance so that the child does not share memory with the parent. */
+    unsigned   index = 0;
+    MALLOC_UNLOCK();
+    while (index < malloc_num_zones) {
+        malloc_zone_t  *zone = malloc_zones[index++];
+        zone->introspect->force_unlock(zone);
+    }
+}
+
+size_t mstats(void) {
+    malloc_zone_print(NULL, 0);
+    return 1;
+}
+
+/*****************     OBSOLETE ENTRY POINTS   ********************/
+
+#if PHASE_OUT_OLD_MALLOC
+#error PHASE OUT THE FOLLOWING FUNCTIONS
+#else
+#warning PHASE OUT THE FOLLOWING FUNCTIONS
+#endif
+
+void set_malloc_singlethreaded(boolean_t single) {
+    static boolean_t warned = 0;
+    if (!warned) {
+#if PHASE_OUT_OLD_MALLOC
+        fprintf(stderr, "*** malloc[%d]: OBSOLETE: set_malloc_singlethreaded(%d)\n", getpid(), single);
+#endif
+        warned = 1;
+    }
+}
+
+void malloc_singlethreaded() {
+    static boolean_t warned = 0;
+    if (!warned) {
+        fprintf(stderr, "*** malloc[%d]: OBSOLETE: malloc_singlethreaded()\n", getpid());
+        warned = 1;
+    }
+}
+
+int malloc_debug(int level) {
+    fprintf(stderr, "*** malloc[%d]: OBSOLETE: malloc_debug()\n", getpid());
+    return 0;
+}
+
+/*********     exo_zone - FOR emacs freeze drying      ************/
+
+typedef struct {
+    malloc_zone_t      basic_zone;
+    vm_range_t range;
+    unsigned   flags;
+} exo_zone_t;
+
+#define MALLOC_EXO_ZONE_SIZE_IS_OLD    1
+#define MALLOC_EXO_ZONE_SIZE_IS_SCALABLE       2
+
+typedef struct {
+    unsigned int       lastguyfree:1;
+    unsigned int       free:1;
+    unsigned int       size:30;
+} old_header_t;
+
+#define THIS_FREE                      0x8000  // indicates this block is free
+#define PREV_FREE                      0x4000  // indicates previous block is free
+#define        SHIFT_QUANTUM                   4
+
+static size_t exo_zone_size(exo_zone_t *zone, const void *ptr) {
+    if (zone->flags == MALLOC_EXO_ZONE_SIZE_IS_OLD) {
+        if (ptr == (void *)zone->range.address) return zone->range.size;
+        return ((old_header_t *)ptr)[-1].size - sizeof(old_header_t);
+    }
+    if (zone->flags == MALLOC_EXO_ZONE_SIZE_IS_SCALABLE) {
+        // this is indeed a valid pointer
+        unsigned short         msize_and_free = ((unsigned short *)ptr)[-1];
+        return (msize_and_free & THIS_FREE) ? 0 : ((msize_and_free & ~PREV_FREE) << SHIFT_QUANTUM) - sizeof(unsigned short);
+    }
+    fprintf(stderr, "*** malloc[%d]: exo_zone_size unknown flags()\n", getpid());
+    return 0;
+}
+
+static void *exo_zone_malloc(exo_zone_t *zone, size_t new_size) {
+    return malloc(new_size);
+}
+
+static void *exo_zone_calloc(exo_zone_t *zone, size_t num_items, size_t size) {
+    return calloc(num_items, size);
+}
+
+static void *exo_zone_valloc(exo_zone_t *zone, size_t new_size) {
+    return valloc(new_size);
+}
+
+static void *exo_zone_realloc(exo_zone_t *zone, void *ptr, size_t new_size) {
+    size_t     old_size = exo_zone_size(zone, ptr);
+    void       *new_ptr;
+    if (new_size <= old_size) return ptr;
+    new_ptr = malloc(new_size);
+    if (old_size) memcpy(new_ptr, ptr, old_size);
+    return new_ptr;
+}
+
+static void exo_zone_free(exo_zone_t *zone, void *ptr) {
+}
+
+static void exo_zone_destroy(exo_zone_t *zone) {
+    free(zone);
+}
+
+static kern_return_t exo_zone_noop(void) {
+    return 0;
+}
+
+static size_t exo_zone_good_size(exo_zone_t *zone, size_t size) {
+    return size;
+}
+
+static struct malloc_introspection_t exo_zone_introspect = {(void *)exo_zone_noop, (void *)exo_zone_good_size, (void *)exo_zone_noop, (void *)exo_zone_noop, (void *)exo_zone_noop, (void *)exo_zone_noop, (void *)exo_zone_noop};
+
+static malloc_zone_t *create_exo_zone(vm_address_t start, vm_size_t size, unsigned flags) {
+    exo_zone_t         *zone = calloc(sizeof(exo_zone_t), 1);
+    zone->basic_zone.size = (void *)exo_zone_size;
+    zone->basic_zone.malloc = (void *)exo_zone_malloc;
+    zone->basic_zone.calloc = (void *)exo_zone_calloc;
+    zone->basic_zone.valloc = (void *)exo_zone_valloc;
+    zone->basic_zone.free = (void *)exo_zone_free;
+    zone->basic_zone.realloc = (void *)exo_zone_realloc;
+    zone->basic_zone.destroy = (void *)exo_zone_destroy;
+    zone->basic_zone.introspect = &exo_zone_introspect;
+    zone->flags = flags;
+    return (malloc_zone_t *)zone;
+}
+
+/*********     Support for emacs FreezeDrying  ************/
+
+#define OLD_MALLOC_VERSION  1
+#define SCALABLE_MALLOC_VERSION  2
+
+#define MAX_RANGES     1023
+typedef struct {
+    unsigned   version;
+    unsigned   num;
+    vm_range_t ranges[MAX_RANGES];
+} malloc_freezedry_ranges;
+
+static void malloc_freezedry_recorder(task_t task, void *rr, unsigned type, vm_range_t *ranges, unsigned num) {
+    malloc_freezedry_ranges    *recorded = rr;
+    while (num && (recorded->num < MAX_RANGES)) {
+        recorded->ranges[recorded->num++] = *ranges;
+        ranges++; num--;
+    }
+    if (recorded->num == MAX_RANGES) fprintf(stderr, "*** malloc[%d]: malloc_freezedry_recorder: exceeding capacity\n", getpid());
+}
+
+#define ADDINT(cp,i) (*((int *)cp) = i, cp += sizeof(int))
+static kern_return_t default_reader(task_t task, vm_address_t address, vm_size_t size, void **ptr) {
+    *ptr = (void *)address;
+    return 0;
+}
+
+int malloc_freezedry(void) {
+    malloc_freezedry_ranges    rr;
+    unsigned   index = 0;
+    char       *cp;
+    size_t     size;
+    rr.version = SCALABLE_MALLOC_VERSION;
+    rr.num = 0;
+    while (index < malloc_num_zones) {
+        malloc_zone_t  *zone = malloc_zones[index++];
+        zone->introspect->enumerator(mach_task_self(), &rr, MALLOC_PTR_REGION_RANGE_TYPE | MALLOC_ADMIN_REGION_RANGE_TYPE, (vm_address_t)zone, default_reader, malloc_freezedry_recorder);
+    }
+    size = sizeof(rr) - (MAX_RANGES - rr.num) * sizeof(vm_range_t);
+    cp = valloc(size);
+    memcpy(cp, (void *)&rr, size);
+    return (int)cp;
+}
+
+#define FETCHINT(i) (i = *((int *)cp), cp += sizeof(int))
+int malloc_jumpstart(int cookie) {
+    char       *cp = (char *)cookie;
+    int                version, regions;
+    FETCHINT(version);
+    if ((version != OLD_MALLOC_VERSION) && (version != SCALABLE_MALLOC_VERSION)) return 1;
+    FETCHINT(regions);
+    // fprintf(stderr, "malloc_jumpstart got (version %d): %d regions\n", version, regions);
+    while (--regions >= 0) {
+        malloc_zone_t  *zone;
+        void   **region = (void **)cp;
+        if (version == OLD_MALLOC_VERSION) {
+            cp += 3 * sizeof(void *);
+            // printf("Should add region beginadd=%p endadd=%p zone=%p\n", region[0], region[1], region[2]);
+            zone = create_exo_zone((vm_address_t)(region[0]), (vm_size_t)(region[1] - region[0]), MALLOC_EXO_ZONE_SIZE_IS_OLD);
+        } else {
+            cp += 2 * sizeof(void *);
+            // printf("Should add region beginadd=%p endadd=%p zone=%p\n", region[0], region[1], region[2]);
+            zone = create_exo_zone((vm_address_t)(region[0]), (vm_size_t)region[1], MALLOC_EXO_ZONE_SIZE_IS_SCALABLE);
+        }
+        malloc_zone_register(zone);
+    }
+    return 0;
+}
+
diff --git a/gen.subproj/malloc.h b/gen.subproj/malloc.h
new file mode 100644 (file)
index 0000000..219f605
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#import <stddef.h>
+#import <mach/mach.h>
+
+/*********     Type definitions        ************/
+
+typedef struct _malloc_zone_t {
+    /* Only zone implementors should depend on the layout of this structure;
+    Regular callers should use the access functions below */
+    void       *reserved1;
+    void       *reserved2;
+    size_t (*size)(struct _malloc_zone_t *zone, const void *ptr); /* returns the size of a block or 0 if not in this zone; must be fast, especially for negative answers */
+    void *(*malloc)(struct _malloc_zone_t *zone, size_t size);
+    void *(*calloc)(struct _malloc_zone_t *zone, size_t num_items, size_t size); /* same as malloc, but block returned is set to zero */
+    void *(*valloc)(struct _malloc_zone_t *zone, size_t size); /* same as malloc, but block returned is set to zero and is guaranteed to be page aligned */
+    void (*free)(struct _malloc_zone_t *zone, void *ptr);
+    void *(*realloc)(struct _malloc_zone_t *zone, void *ptr, size_t size);
+    void (*destroy)(struct _malloc_zone_t *zone); /* zone is destroyed and all memory reclaimed */
+    const char *zone_name;
+    void       *reserved3;
+    void       *reserved4;
+    struct malloc_introspection_t      *introspect;
+    void       *reserved5;
+} malloc_zone_t;
+
+/*********     Creation and destruction        ************/
+
+extern malloc_zone_t *malloc_default_zone(void);
+    /* The initial zone */
+
+extern malloc_zone_t *malloc_create_zone(vm_size_t start_size, unsigned flags);
+    /* Create a new zone */
+
+extern void malloc_destroy_zone(malloc_zone_t *zone);
+    /* Destroys zone and everything it allocated */
+
+/*********     Block creation and manipulation ************/
+
+extern void *malloc_zone_malloc(malloc_zone_t *zone, size_t size);
+    /* Allocates a new pointer of size size; zone must be non-NULL */
+
+extern void *malloc_zone_calloc(malloc_zone_t *zone, size_t num_items, size_t size);
+    /* Allocates a new pointer of size num_items * size; block is cleared; zone must be non-NULL */
+
+extern void *malloc_zone_valloc(malloc_zone_t *zone, size_t size);
+    /* Allocates a new pointer of size size; zone must be non-NULL; Pointer is guaranteed to be page-aligned and block is cleared */
+
+extern void malloc_zone_free(malloc_zone_t *zone, void *ptr);
+    /* Frees pointer in zone; zone must be non-NULL */
+
+extern void *malloc_zone_realloc(malloc_zone_t *zone, void *ptr, size_t size);
+    /* Enlarges block if necessary; zone must be non-NULL */
+
+extern malloc_zone_t *malloc_zone_from_ptr(const void *ptr);
+    /* Returns the zone for a pointer, or NULL if not in any zone.
+    The ptr must have been returned from a malloc or realloc call. */
+
+extern size_t malloc_size(const void *ptr);
+    /* Returns size of given ptr */
+
+/*********     Functions for zone implementors ************/
+
+extern void malloc_zone_register(malloc_zone_t *zone);
+    /* Registers a freshly created zone;
+    Should typically be called after a zone has been created */
+
+extern void malloc_zone_unregister(malloc_zone_t *zone);
+    /* De-registers a zone
+    Should typically be called before calling the zone destruction routine */
+
+extern void malloc_set_zone_name(malloc_zone_t *zone, const char *name);
+    /* Sets the name of a zone */
+
+extern const char *malloc_get_zone_name(malloc_zone_t *zone);
+    /* Returns the name of a zone */
+
+typedef struct {
+    vm_address_t       address;
+    vm_size_t          size;
+} vm_range_t;
+
+typedef kern_return_t memory_reader_t(task_t remote_task, vm_address_t remote_address, vm_size_t size, void **local_memory);
+    /* given a task, "reads" the memory at the given address and size
+local_memory: set to a contiguous chunk of memory; validity of local_memory is assumed to be limited (until next call) */
+
+#define MALLOC_PTR_IN_USE_RANGE_TYPE   1       /* for allocated pointers */
+#define MALLOC_PTR_REGION_RANGE_TYPE   2       /* for region containing pointers */
+#define MALLOC_ADMIN_REGION_RANGE_TYPE 4       /* for region used internally */
+
+typedef void vm_range_recorder_t(task_t, void *, unsigned type, vm_range_t *, unsigned);
+    /* given a task and context, "records" the specified addresses */
+
+typedef struct malloc_introspection_t {
+    kern_return_t (*enumerator)(task_t task, void *, unsigned type_mask, vm_address_t zone_address, memory_reader_t reader, vm_range_recorder_t recorder); /* enumerates all the malloc pointers in use */
+    size_t     (*good_size)(malloc_zone_t *zone, size_t size);
+    boolean_t  (*check)(malloc_zone_t *zone); /* Consistency checker */
+    void       (*print)(malloc_zone_t *zone, boolean_t verbose); /* Prints zone  */
+    void       (*log)(malloc_zone_t *zone, void *address); /* Enables logging of activity */
+    void       (*force_lock)(malloc_zone_t *zone); /* Forces locking zone */
+    void       (*force_unlock)(malloc_zone_t *zone); /* Forces unlocking zone */
+} malloc_introspection_t;
+
+extern void malloc_printf(const char *format, ...);
+    /* Convenience for logging errors and warnings;
+    No allocation is performed during execution of this function;
+    Only understand %p %d %x %s formats
+    */
+
+/*********     Functions for performance tools ************/
+
+extern kern_return_t malloc_get_all_zones(task_t task, memory_reader_t reader, vm_address_t **addresses, unsigned *count);
+    /* Fills addresses and count with the addresses of the zones in task;
+    Note that the validity of the addresses returned correspond to the validity of the memory returned by reader */
+
+/*********     Debug helpers   ************/
+
+extern void malloc_zone_print_ptr_info(void *ptr);
+    /* print to stdout if this pointer is in the malloc heap, free status, and size */
+
+extern boolean_t malloc_zone_check(malloc_zone_t *zone);
+    /* Checks zone is well formed; if !zone, checks all zones */
+
+extern void malloc_zone_print(malloc_zone_t *zone, boolean_t verbose);
+    /* Prints summary on zone; if !zone, prints all zones */
+
+extern void malloc_zone_log(malloc_zone_t *zone, void *address);
+    /* Controls logging of all activity; if !zone, for all zones;
+    If address==0 nothing is logged;
+    If address==-1 all activity is logged;
+    Else only the activity regarding address is logged */
diff --git a/gen.subproj/nanosleep.c b/gen.subproj/nanosleep.c
new file mode 100644 (file)
index 0000000..84dec2f
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#include <errno.h>
+#include <sys/time.h>
+#include <mach/message.h>
+#include <mach/mach_error.h>
+#include <mach/mach_syscalls.h>
+#include <mach/clock.h>
+#include <mach/clock_types.h>
+#include <stdio.h>
+
+extern mach_port_t clock_port;
+
+int
+nanosleep(const struct timespec *requested_time, struct timespec *remaining_time) {
+    kern_return_t ret;
+    mach_timespec_t remain;
+    mach_timespec_t current;
+    
+    if ((requested_time == NULL) || (requested_time->tv_sec < 0) || (requested_time->tv_nsec > NSEC_PER_SEC)) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    ret = clock_get_time(clock_port, &current);
+    if (ret != KERN_SUCCESS) {
+        fprintf(stderr, "clock_get_time() failed: %s\n", mach_error_string(ret));
+        return -1;
+    }
+    /* This depends on the layout of a mach_timespec_t and timespec_t being equivalent */
+    ret = clock_sleep_trap(clock_port, TIME_RELATIVE, requested_time->tv_sec, requested_time->tv_nsec, &remain);
+    if (ret != KERN_SUCCESS) {
+        if (ret == KERN_ABORTED) {
+            errno = EINTR;
+            if (remaining_time != NULL) {
+                ret = clock_get_time(clock_port, &remain);
+                if (ret != KERN_SUCCESS) {
+                    fprintf(stderr, "clock_get_time() failed: %s\n", mach_error_string(ret));
+                    return -1;
+                }
+                ADD_MACH_TIMESPEC(&current, requested_time);
+                SUB_MACH_TIMESPEC(&current, &remain);
+                remaining_time->tv_sec = current.tv_sec;
+                remaining_time->tv_nsec = current.tv_nsec;
+            }
+        } else {
+            errno = EINVAL;
+        }
+        return -1;
+    }
+    return 0;
+}
diff --git a/gen.subproj/nice.c b/gen.subproj/nice.c
new file mode 100644 (file)
index 0000000..8b99cd2
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <errno.h>
+/*
+ * Backwards compatible nice.
+ */
+int
+nice(incr)
+       int incr;
+{
+       int prio;
+
+       errno = 0;
+       prio = getpriority(PRIO_PROCESS, 0);
+       if (prio == -1 && errno)
+               return (-1);
+       return (setpriority(PRIO_PROCESS, 0, prio + incr));
+}
diff --git a/gen.subproj/nlist.c b/gen.subproj/nlist.c
new file mode 100644 (file)
index 0000000..e6fca65
--- /dev/null
@@ -0,0 +1,329 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+/* Stuff lifted from <a.out.h> and <sys/exec.h> since they are gone */
+/*
+ * Header prepended to each a.out file.
+ */
+struct exec {
+unsigned short  a_machtype;     /* machine type */
+unsigned short  a_magic;        /* magic number */
+unsigned long  a_text;         /* size of text segment */
+unsigned long  a_data;         /* size of initialized data */
+unsigned long  a_bss;          /* size of uninitialized data */
+unsigned long  a_syms;         /* size of symbol table */
+unsigned long  a_entry;        /* entry point */
+unsigned long  a_trsize;       /* size of text relocation */
+unsigned long  a_drsize;       /* size of data relocation */
+};
+
+#define        OMAGIC  0407            /* old impure format */
+#define        NMAGIC  0410            /* read-only text */
+#define        ZMAGIC  0413            /* demand load format */
+
+#define        N_BADMAG(x) \
+    (((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC)
+#define        N_TXTOFF(x) \
+       ((x).a_magic==ZMAGIC ? 0 : sizeof (struct exec))
+#define N_SYMOFF(x) \
+       (N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize)
+
+#include <mach/mach.h>
+#include <mach-o/nlist.h>
+#include <stdio.h>
+#include <mach-o/loader.h>
+#include <mach-o/fat.h>
+
+/*
+ * CPUSUBTYPE_SUPPORT should be changed to non-zero once the
+ * cpusubtype_* routines are available in libc.
+ */
+#define        CPUSUBTYPE_SUPPORT      0
+
+/*
+ * nlist - retreive attributes from name list (string table version)
+ */
+
+int
+nlist(name, list)
+       const char *name;
+       struct nlist *list;
+{
+       int fd, n;
+
+       fd = open(name, O_RDONLY, 0);
+       if (fd < 0)
+               return (-1);
+       n = __fdnlist(fd, list);
+       (void)close(fd);
+       return (n);
+}
+
+/* Note: __fdnlist() is called from kvm_nlist in libkvm's kvm.c */
+
+int
+__fdnlist(fd, list)
+       int fd;
+       struct nlist *list;
+{
+       register struct nlist *p, *q;
+       register char *s1, *s2;
+       register n, m;
+       int maxlen, nreq;
+       off_t sa;               /* symbol address */
+       off_t ss;               /* start of strings */
+       struct exec buf;
+       struct nlist space[BUFSIZ/sizeof (struct nlist)];
+       unsigned  arch_offset = 0;
+
+       maxlen = 0;
+       for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
+               q->n_type = 0;
+               q->n_value = 0;
+               q->n_desc = 0;
+               q->n_sect = 0;
+               n = strlen(q->n_un.n_name);
+               if (n > maxlen)
+                       maxlen = n;
+       }
+       if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf) ||
+           (N_BADMAG(buf) && *((long *)&buf) != MH_MAGIC &&
+            NXSwapBigLongToHost(*((long *)&buf)) != FAT_MAGIC)) {
+               return (-1);
+       }
+
+       /* Deal with fat file if necessary */
+       if (NXSwapBigLongToHost(*((long *)&buf)) == FAT_MAGIC) {
+               struct host_basic_info hbi;
+               struct fat_header fh;
+               struct fat_arch *fat_archs, *fap;
+               unsigned i;
+
+               /* Get our host info */
+               i = HOST_BASIC_INFO_COUNT;
+               if (host_info(mach_host_self(), HOST_BASIC_INFO,
+                             (host_info_t)(&hbi), &i) != KERN_SUCCESS) {
+                       return (-1);
+               }
+                 
+               /* Read in the fat header */
+               lseek(fd, 0, SEEK_SET);
+               if (read(fd, (char *)&fh, sizeof(fh)) != sizeof(fh)) {
+                       return (-1);
+               }
+
+               /* Convert fat_narchs to host byte order */
+               fh.nfat_arch = NXSwapBigLongToHost(fh.nfat_arch);
+
+               /* Read in the fat archs */
+               fat_archs = (struct fat_arch *)malloc(fh.nfat_arch *
+                                                     sizeof(struct fat_arch));
+               if (fat_archs == NULL) {
+                       return (-1);
+               }
+               if (read(fd, (char *)fat_archs,
+                        sizeof(struct fat_arch) * fh.nfat_arch) !=
+                   sizeof(struct fat_arch) * fh.nfat_arch) {
+                       free(fat_archs);
+                       return (-1);
+               }
+
+               /*
+                * Convert archs to host byte ordering (a constraint of
+                * cpusubtype_getbestarch()
+                */
+               for (i = 0; i < fh.nfat_arch; i++) {
+                       fat_archs[i].cputype =
+                               NXSwapBigLongToHost(fat_archs[i].cputype);
+                       fat_archs[i].cpusubtype =
+                             NXSwapBigLongToHost(fat_archs[i].cpusubtype);
+                       fat_archs[i].offset =
+                               NXSwapBigLongToHost(fat_archs[i].offset);
+                       fat_archs[i].size =
+                               NXSwapBigLongToHost(fat_archs[i].size);
+                       fat_archs[i].align =
+                               NXSwapBigLongToHost(fat_archs[i].align);
+               }
+
+#if    CPUSUBTYPE_SUPPORT
+               fap = cpusubtype_getbestarch(hbi.cpu_type, hbi.cpu_subtype,
+                                            fat_archs, fh.nfat_arch);
+#else  CPUSUBTYPE_SUPPORT
+#warning       Use the cpusubtype functions!!!
+               fap = NULL;
+               for (i = 0; i < fh.nfat_arch; i++) {
+                       if (fat_archs[i].cputype == hbi.cpu_type) {
+                               fap = &fat_archs[i];
+                               break;
+                       }
+               }
+#endif CPUSUBTYPE_SUPPORT
+               if (!fap) {
+                       free(fat_archs);
+                       return (-1);
+               }
+               arch_offset = fap->offset;
+               free(fat_archs);
+
+               /* Read in the beginning of the architecture-specific file */
+               lseek(fd, arch_offset, SEEK_SET);
+               if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf)) {
+                       return (-1);
+               }
+       }
+               
+       if (*((long *)&buf) == MH_MAGIC) {
+           struct mach_header mh;
+           struct load_command *load_commands, *lcp;
+           struct symtab_command *stp;
+           long i;
+
+               lseek(fd, arch_offset, SEEK_SET);
+               if (read(fd, (char *)&mh, sizeof(mh)) != sizeof(mh)) {
+                       return (-1);
+               }
+               load_commands = (struct load_command *)malloc(mh.sizeofcmds);
+               if (load_commands == NULL) {
+                       return (-1);
+               }
+               if (read(fd, (char *)load_commands, mh.sizeofcmds) !=
+                   mh.sizeofcmds) {
+                       free(load_commands);
+                       return (-1);
+               }
+               stp = NULL;
+               lcp = load_commands;
+               for (i = 0; i < mh.ncmds; i++) {
+                       if (lcp->cmdsize % sizeof(long) != 0 ||
+                           lcp->cmdsize <= 0 ||
+                           (char *)lcp + lcp->cmdsize >
+                           (char *)load_commands + mh.sizeofcmds) {
+                               free(load_commands);
+                               return (-1);
+                       }
+                       if (lcp->cmd == LC_SYMTAB) {
+                               if (lcp->cmdsize !=
+                                  sizeof(struct symtab_command)) {
+                                       free(load_commands);
+                                       return (-1);
+                               }
+                               stp = (struct symtab_command *)lcp;
+                               break;
+                       }
+                       lcp = (struct load_command *)
+                             ((char *)lcp + lcp->cmdsize);
+               }
+               if (stp == NULL) {
+                       free(load_commands);
+                       return (-1);
+               }
+               sa = stp->symoff + arch_offset;
+               ss = stp->stroff + arch_offset;
+               n = stp->nsyms * sizeof(struct nlist);
+               free(load_commands);
+       }
+       else {
+               sa = N_SYMOFF(buf) + arch_offset;
+               ss = sa + buf.a_syms + arch_offset;
+               n = buf.a_syms;
+       }
+
+       lseek(fd, sa, SEEK_SET);
+       while (n) {
+               long savpos;
+
+               m = sizeof (space);
+               if (n < m)
+                       m = n;
+               if (read(fd, (char *)space, m) != m)
+                       break;
+               n -= m;
+               savpos = lseek(fd, 0, SEEK_CUR);
+               for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
+                       char nambuf[BUFSIZ];
+
+                       if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
+                               continue;
+                       lseek(fd, ss+q->n_un.n_strx, SEEK_SET);
+                       read(fd, nambuf, maxlen+1);
+                       for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
+                               s1 = p->n_un.n_name;
+                               s2 = nambuf;
+                               while (*s1) {
+                                       if (*s1++ != *s2++)
+                                               goto cont;
+                               }
+                               if (*s2)
+                                       goto cont;
+                               p->n_value = q->n_value;
+                               p->n_type = q->n_type;
+                               p->n_desc = q->n_desc;
+                               p->n_sect = q->n_sect;
+                               if (--nreq == 0)
+                                       return (nreq);
+                               break;
+               cont:           ;
+                       }
+               }
+               lseek(fd, savpos, SEEK_SET);
+       }
+       return (nreq);
+}
diff --git a/gen.subproj/opendir.c b/gen.subproj/opendir.c
new file mode 100644 (file)
index 0000000..1426f1d
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+DIR *__opendir2(const char *name, int flags)
+{
+       DIR *dirp;
+       int fd;
+       int incr;
+       int unionstack;
+       struct stat statb;
+
+       if ((fd = open(name, O_RDONLY)) == -1)
+               return (NULL);
+       if (fstat(fd, &statb) || !S_ISDIR(statb.st_mode)) {
+               errno = ENOTDIR;
+               close(fd);
+               return (NULL);
+       }
+       if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1 ||
+           (dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
+               close(fd);
+               return (NULL);
+       }
+
+       /*
+        * If CLBYTES is an exact multiple of DIRBLKSIZ, use a CLBYTES
+        * buffer that it cluster boundary aligned.
+        * Hopefully this can be a big win someday by allowing page
+        * trades to user space to be done by getdirentries()
+        */
+       if ((CLBYTES % DIRBLKSIZ) == 0)
+               incr = CLBYTES;
+       else
+               incr = DIRBLKSIZ;
+
+       /*
+        * Determine whether this directory is the top of a union stack.
+        */
+       if (flags & DTF_NODUP) {
+               struct statfs sfb;
+
+               if (fstatfs(fd, &sfb) < 0) {
+                       free(dirp);
+                       close(fd);
+                       return (NULL);
+               }
+               unionstack = (!strcmp(sfb.f_fstypename, "union") || (sfb.f_flags & MNT_UNION));
+       } else {
+               unionstack = 0;
+       }
+
+       if (unionstack) {
+               int len = 0;
+               int space = 0;
+               char *buf = 0;
+               char *ddptr = 0;
+               char *ddeptr;
+               int n;
+               struct dirent **dpv;
+
+               /*
+                * The strategy here is to read all the directory
+                * entries into a buffer, sort the buffer, and
+                * remove duplicate entries by setting the inode
+                * number to zero.
+                */
+
+               do {
+                       /*
+                        * Always make at least DIRBLKSIZ bytes
+                        * available to getdirentries
+                        */
+                       if (space < DIRBLKSIZ) {
+                               space += incr;
+                               len += incr;
+                               buf = realloc(buf, len);
+                               if (buf == NULL) {
+                                       free(dirp);
+                                       close(fd);
+                                       return (NULL);
+                               }
+                               ddptr = buf + (len - space);
+                       }
+
+                       n = getdirentries(fd, ddptr, space, &dirp->dd_seek);
+                       if (n > 0) {
+                               ddptr += n;
+                               space -= n;
+                       }
+               } while (n > 0);
+
+               ddeptr = ddptr;
+               flags |= __DTF_READALL;
+
+               /*
+                * Re-open the directory.
+                * This has the effect of rewinding back to the
+                * top of the union stack and is needed by
+                * programs which plan to fchdir to a descriptor
+                * which has also been read -- see fts.c.
+                */
+               if (flags & DTF_REWIND) {
+                       (void) close(fd);
+                       if ((fd = open(name, O_RDONLY)) == -1) {
+                               free(buf);
+                               free(dirp);
+                               return (NULL);
+                       }
+               }
+
+               /*
+                * There is now a buffer full of (possibly) duplicate
+                * names.
+                */
+               dirp->dd_buf = buf;
+
+               /*
+                * Go round this loop twice...
+                *
+                * Scan through the buffer, counting entries.
+                * On the second pass, save pointers to each one.
+                * Then sort the pointers and remove duplicate names.
+                */
+               for (dpv = 0;;) {
+                       n = 0;
+                       ddptr = buf;
+                       while (ddptr < ddeptr) {
+                               struct dirent *dp;
+
+                               dp = (struct dirent *) ddptr;
+                               if ((int)dp & 03)
+                                       break;
+                               if ((dp->d_reclen <= 0) ||
+                                   (dp->d_reclen > (ddeptr + 1 - ddptr)))
+                                       break;
+                               ddptr += dp->d_reclen;
+                               if (dp->d_fileno) {
+                                       if (dpv)
+                                               dpv[n] = dp;
+                                       n++;
+                               }
+                       }
+
+                       if (dpv) {
+                               struct dirent *xp;
+
+                               /*
+                                * This sort must be stable.
+                                */
+                               mergesort(dpv, n, sizeof(*dpv), alphasort);
+
+                               dpv[n] = NULL;
+                               xp = NULL;
+
+                               /*
+                                * Scan through the buffer in sort order,
+                                * zapping the inode number of any
+                                * duplicate names.
+                                */
+                               for (n = 0; dpv[n]; n++) {
+                                       struct dirent *dp = dpv[n];
+
+                                       if ((xp == NULL) ||
+                                           strcmp(dp->d_name, xp->d_name)) {
+                                               xp = dp;
+                                       } else {
+                                               dp->d_fileno = 0;
+                                       }
+                                       if (dp->d_type == DT_WHT &&
+                                           (flags & DTF_HIDEW))
+                                               dp->d_fileno = 0;
+                               }
+
+                               free(dpv);
+                               break;
+                       } else {
+                               dpv = malloc((n+1) * sizeof(struct dirent *));
+                               if (dpv == NULL)
+                                       break;
+                       }
+               }
+
+               dirp->dd_len = len;
+               dirp->dd_size = ddptr - dirp->dd_buf;
+       } else {
+               dirp->dd_len = incr;
+               dirp->dd_buf = malloc(dirp->dd_len);
+               if (dirp->dd_buf == NULL) {
+                       free(dirp);
+                       close (fd);
+                       return (NULL);
+               }
+               dirp->dd_seek = 0;
+               flags &= ~DTF_REWIND;
+       }
+
+       dirp->dd_loc = 0;
+       dirp->dd_fd = fd;
+       dirp->dd_flags = flags;
+
+       /*
+        * Set up seek point for rewinddir.
+        */
+       dirp->dd_rewind = telldir(dirp);
+
+       return (dirp);
+}
+
+/*
+ * Open a directory.
+ */
+DIR *opendir(const char *name)
+{
+       return (__opendir2(name, DTF_HIDEW|DTF_NODUP));
+}
diff --git a/gen.subproj/pause.c b/gen.subproj/pause.c
new file mode 100644 (file)
index 0000000..fea8bc1
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <signal.h>
+#include <unistd.h>
+
+/*
+ * Backwards compatible pause.
+ */
+int
+pause()
+{
+
+       return sigpause(sigblock(0L));
+}
diff --git a/gen.subproj/popen.c b/gen.subproj/popen.c
new file mode 100644 (file)
index 0000000..7729280
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software written by Ken Arnold and
+ * published in UNIX Review, Vol. 6, No. 8.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <paths.h>
+
+static struct pid {
+       struct pid *next;
+       FILE *fp;
+       pid_t pid;
+} *pidlist; 
+       
+FILE *
+popen(command, type)
+       const char *command, *type;
+{
+       struct pid *cur;
+       FILE *iop;
+       int pdes[2], pid, twoway;
+
+       if (strchr(type, '+')) {
+               twoway = 1;
+               type = "r+";
+               if (socketpair(AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
+                       return (NULL);
+       } else  {
+               twoway = 0;
+               if (*type != 'r' && *type != 'w' || type[1] ||
+                   (pipe(pdes) < 0))
+                       return (NULL);
+       }
+
+       if ((cur = malloc(sizeof(struct pid))) == NULL)
+               return (NULL);
+
+       switch (pid = vfork()) {
+       case -1:                        /* Error. */
+               (void)close(pdes[0]);
+               (void)close(pdes[1]);
+               (void)free(cur);
+               return (NULL);
+               /* NOTREACHED */
+       case 0:                         /* Child. */
+               if (*type == 'r') {
+                       if (pdes[1] != STDOUT_FILENO) {
+                               (void)dup2(pdes[1], STDOUT_FILENO);
+                               (void)close(pdes[1]);
+                               pdes[1] = STDOUT_FILENO;
+                       }
+                       (void) close(pdes[0]);
+                       if (twoway && (pdes[1] != STDIN_FILENO))
+                               (void)dup2(pdes[1], STDIN_FILENO);
+               } else {
+                       if (pdes[0] != STDIN_FILENO) {
+                               (void)dup2(pdes[0], STDIN_FILENO);
+                               (void)close(pdes[0]);
+                       }
+                       (void)close(pdes[1]);
+               }
+               execl(_PATH_BSHELL, "sh", "-c", command, NULL);
+               _exit(127);
+               /* NOTREACHED */
+       }
+
+       /* Parent; assume fdopen can't fail. */
+       if (*type == 'r') {
+               iop = fdopen(pdes[0], type);
+               (void)close(pdes[1]);
+       } else {
+               iop = fdopen(pdes[1], type);
+               (void)close(pdes[0]);
+       }
+
+       /* Link into list of file descriptors. */
+       cur->fp = iop;
+       cur->pid =  pid;
+       cur->next = pidlist;
+       pidlist = cur;
+
+       return (iop);
+}
+
+/*
+ * pclose --
+ *     Pclose returns -1 if stream is not associated with a `popened' command,
+ *     if already `pclosed', or waitpid returns an error.
+ */
+int
+pclose(iop)
+       FILE *iop;
+{
+       register struct pid *cur, *last;
+       int omask;
+       int pstat;
+       pid_t pid;
+
+       /* Find the appropriate file pointer. */
+       for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
+               if (cur->fp == iop)
+                       break;
+       if (cur == NULL)
+               return (-1);
+
+       (void)fclose(iop);
+
+       do {
+               pid = waitpid(cur->pid, &pstat, 0);
+       } while (pid == -1 && errno == EINTR);
+
+       /* Remove the entry from the linked list. */
+       if (last == NULL)
+               pidlist = cur->next;
+       else
+               last->next = cur->next;
+       free(cur);
+               
+       return (pid == -1 ? -1 : pstat);
+}
diff --git a/gen.subproj/ppc.subproj/Makefile b/gen.subproj/ppc.subproj/Makefile
new file mode 100644 (file)
index 0000000..2a0ec70
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = ppc
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = fp.h genassym.h
+
+OTHERLINKED = abs.s bcopy.s bzero.s ffs.s mcount.s memcpy.s\
+              memmove.s strlen.s
+
+CFILES = bcmp.c ecvt.c insque.c isinf.c remque.c setjmperr.c\
+         strcat.c strcpy.c strncat.c strncmp.c strncpy.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+OTHERLINKEDOFILES = abs.o bcopy.o bzero.o ffs.o mcount.o memcpy.o\
+                    memmove.o strlen.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/gen.subproj/ppc.subproj/Makefile.postamble b/gen.subproj/ppc.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/gen.subproj/ppc.subproj/Makefile.preamble b/gen.subproj/ppc.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..7211b2b
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+INCLUDED_ARCHS = ppc
diff --git a/gen.subproj/ppc.subproj/PB.project b/gen.subproj/ppc.subproj/PB.project
new file mode 100644 (file)
index 0000000..d1d8013
--- /dev/null
@@ -0,0 +1,43 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (fp.h, genassym.h); 
+        OTHER_LINKED = (
+            abs.s, 
+            bcmp.c, 
+            bcopy.s, 
+            bzero.s, 
+            ecvt.c, 
+            ffs.s, 
+            insque.c, 
+            isinf.c, 
+            mcount.s, 
+            memcpy.s, 
+            memmove.s, 
+            remque.c, 
+            setjmperr.c, 
+            strcat.c, 
+            strcpy.c, 
+            strlen.s, 
+            strncat.c, 
+            strncmp.c, 
+            strncpy.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = ppc; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/gen.subproj/ppc.subproj/abs.s b/gen.subproj/ppc.subproj/abs.s
new file mode 100644 (file)
index 0000000..3d7ae3c
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992,1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/abs.s
+ *     Author: Derek B Clegg, NeXT Software, Inc.
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ *  10-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ *  13-Jan-93  Derek B Clegg (dclegg@next.com)
+ *      Optimized.
+ *
+ * ANSI X3.159-1989:
+ *   int abs(int j);
+ *
+ * Description:
+ *   The `abs' function computes the absolute value of an integer `j'.
+ *   If the result cannot be represented, the behavior is undefined.
+ * Returns:
+ *   The `abs' function returns the absolute value.
+ */
+#include <architecture/ppc/asm_help.h>
+#include <architecture/ppc/pseudo_inst.h>
+
+/* We calculate abs(x) as
+ *   s = x >> 31;
+ *   y = x + s;
+ *   return y ^ s;
+ *
+ * If x >= 0, then s = 0, so clearly we return x.  On the other hand, if
+ * x < 0, then we may write x as ~z + 1, where z = -x.  In this case,
+ * s = -1, so y = x - 1 = ~z, and hence we return -1 ^ (x - 1) = -1 ^ ~z
+ * = z = -x.
+ */
+LEAF(_abs)
+       srawi   a1,a0,31
+       add     a2,a1,a0
+       xor     a0,a2,a1
+       blr
+END(_abs)
diff --git a/gen.subproj/ppc.subproj/bcmp.c b/gen.subproj/ppc.subproj/bcmp.c
new file mode 100644 (file)
index 0000000..b9fdb04
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/bcmp.c
+ *
+ *     Byte-compare routine.
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ */
+
+#import <string.h>
+
+#undef bcmp
+
+int
+bcmp(const void *b1, const void *b2, size_t length)
+{
+    return memcmp(b1, b2, length);
+}
diff --git a/gen.subproj/ppc.subproj/bcopy.s b/gen.subproj/ppc.subproj/bcopy.s
new file mode 100644 (file)
index 0000000..38ffd42
--- /dev/null
@@ -0,0 +1,410 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+;
+;                      Copy bytes of data around. handles overlapped data.
+;
+;                      Change this to use Altivec later on
+;
+
+;      
+; void bcopy(from, to, nbytes)
+;
+
+;                      Use CR5_lt to indicate non-cached
+#define noncache       20
+.text
+.align 2
+#if !defined(MEMCPY) && !defined(MEMMOVE)
+.globl _bcopy
+_bcopy:
+                       crclr           noncache                                        ; Set cached
+                       cmplw           cr1,r4,r3                                       ; Compare "to" and "from"
+                       mr.             r5,r5                                           ; Check if we have a 0 length
+                       mr              r6,r3                                           ; Set source
+                       beqlr-          cr1                                             ; Bail if "to" and "from" are the same  
+                       beqlr-                                                          ; Bail if length is 0
+                       b               Lcopyit                                         ; Go copy it...
+
+;
+;                      When we move the memory, forward overlays must be handled.  We
+;                      also can not use the cache instructions if we are from bcopy_nc.
+;                      We need to preserve R3 because it needs to be returned for memcpy.
+;                      We can be interrupted and lose control here.
+;
+;                      There is no stack, so in order to used floating point, we would
+;                      need to take the FP exception. Any potential gains by using FP 
+;                      would be more than eaten up by this.
+;
+;                      Later, we should used Altivec for large moves.
+;
+
+#else
+#if defined(MEMCPY)
+.globl _memcpy
+_memcpy:
+#endif
+
+#if defined(MEMMOVE)
+.globl _memmove
+_memmove:
+#endif
+                       cmplw           cr1,r3,r4                                       ; "to" and "from" the same?
+                       mr              r6,r4                                           ; Set the "from"
+                       mr.             r5,r5                                           ; Length zero?
+                        crclr          noncache                                        ; Set cached
+                       mr              r4,r3                                           ; Set the "to"
+                       beqlr-          cr1                                             ; "to" and "from" are the same
+                       beqlr-                                                          ; Length is 0
+#endif
+Lcopyit:               sub             r12,r4,r6                                       ; Get potential overlap (negative if backward move)
+                       lis             r8,0x7FFF                                       ; Start up a mask
+                       srawi           r11,r12,31                                      ; Propagate the sign bit
+                       dcbt            0,r6                                            ; Touch in the first source line
+                       cntlzw          r7,r5                                           ; Get the highest power of 2 factor of the length
+                       ori             r8,r8,0xFFFF                                    ; Make limit 0x7FFFFFFF
+                       xor             r9,r12,r11                                      ; If sink - source was negative, invert bits
+                       srw             r8,r8,r7                                        ; Get move length limitation
+                       sub             r9,r9,r11                                       ; If sink - source was negative, add 1 and get absolute value
+                       cmplw           r12,r5                                          ; See if we actually forward overlap
+                       cmplwi          cr7,r9,32                                       ; See if at least a line between  source and sink
+                       dcbtst          0,r4                                            ; Touch in the first sink line
+                       cmplwi          cr1,r5,32                                       ; Are we moving more than a line?
+                        cror           noncache,noncache,28                            ; Set to not DCBZ output line if not enough space
+                       blt-            Lfwdovrlap                                      ; This is a forward overlapping area, handle it...
+
+;
+;                      R4 = sink
+;                      R5 = length
+;                      R6 = source
+;
+                       
+;
+;                      Here we figure out how much we have to move to get the sink onto a
+;                      cache boundary.  If we can, and there are still more that 32 bytes
+;                      left to move, we can really speed things up by DCBZing the sink line.
+;                      We can not do this if noncache is set because we will take an 
+;                      alignment exception.
+
+                       neg             r0,r4                                           ; Get the number of bytes to move to align to a line boundary
+                       rlwinm.         r0,r0,0,27,31                                   ; Clean it up and test it
+                       and             r0,r0,r8                                        ; limit to the maximum front end move
+                       mtcrf           3,r0                                            ; Make branch mask for partial moves
+                       sub             r5,r5,r0                                        ; Set the length left to move
+                       beq             Lalline                                         ; Already on a line...
+                       
+                       bf              31,Lalhalf                                      ; No single byte to do...
+                       lbz             r7,0(r6)                                        ; Get the byte
+                       addi            r6,r6,1                                         ; Point to the next
+                       stb             r7,0(r4)                                        ; Save the single
+                       addi            r4,r4,1                                         ; Bump sink
+                       
+;                      Sink is halfword aligned here
+
+Lalhalf:               bf              30,Lalword                                      ; No halfword to do...
+                       lhz             r7,0(r6)                                        ; Get the halfword
+                       addi            r6,r6,2                                         ; Point to the next
+                       sth             r7,0(r4)                                        ; Save the halfword
+                       addi            r4,r4,2                                         ; Bump sink
+                       
+;                      Sink is word aligned here
+
+Lalword:               bf              29,Laldouble                                    ; No word to do...
+                       lwz             r7,0(r6)                                        ; Get the word
+                       addi            r6,r6,4                                         ; Point to the next
+                       stw             r7,0(r4)                                        ; Save the word
+                       addi            r4,r4,4                                         ; Bump sink
+                       
+;                      Sink is double aligned here
+
+Laldouble:             bf              28,Lalquad                                      ; No double to do...
+                       lwz             r7,0(r6)                                        ; Get the first word
+                       lwz             r8,4(r6)                                        ; Get the second word
+                       addi            r6,r6,8                                         ; Point to the next
+                       stw             r7,0(r4)                                        ; Save the first word
+                       stw             r8,4(r4)                                        ; Save the second word
+                       addi            r4,r4,8                                         ; Bump sink
+                       
+;                      Sink is quadword aligned here
+
+Lalquad:                       bf              27,Lalline                                      ; No quad to do...
+                       lwz             r7,0(r6)                                        ; Get the first word
+                       lwz             r8,4(r6)                                        ; Get the second word
+                       lwz             r9,8(r6)                                        ; Get the third word
+                       stw             r7,0(r4)                                        ; Save the first word
+                       lwz             r11,12(r6)                                      ; Get the fourth word
+                       addi            r6,r6,16                                        ; Point to the next
+                       stw             r8,4(r4)                                        ; Save the second word
+                       stw             r9,8(r4)                                        ; Save the third word
+                       stw             r11,12(r4)                                      ; Save the fourth word
+                       addi            r4,r4,16                                        ; Bump sink
+                       
+;                      Sink is line aligned here
+
+Lalline:                       rlwinm.         r0,r5,27,5,31                                   ; Get the number of full lines to move
+                       mtcrf           3,r5                                            ; Make branch mask for backend partial moves
+                       rlwinm          r11,r5,0,0,26                                   ; Get number of bytes to move
+                       beq-            Lbackend                                        ; No full lines to move
+                       
+                       sub             r5,r5,r11                                       ; Calculate the residual
+                        li              r10,96                                          ; Stride for touch ahead
+
+Lnxtline:              subic.          r0,r0,1                                         ; Account for the line now
+
+                       bt-             noncache,Lskipz                                 ; Skip if we are not cached...
+                       dcbz            0,r4                                            ; Blow away the whole line because we are replacing it
+                        dcbt           r6,r10                                          ; Touch ahead a bit
+
+Lskipz:                        lwz             r7,0(r6)                                        ; Get the first word
+                       lwz             r8,4(r6)                                        ; Get the second word
+                       lwz             r9,8(r6)                                        ; Get the third word
+                       stw             r7,0(r4)                                        ; Save the first word
+                       lwz             r11,12(r6)                                      ; Get the fourth word
+                       stw             r8,4(r4)                                        ; Save the second word
+                       lwz             r7,16(r6)                                       ; Get the fifth word
+                       stw             r9,8(r4)                                        ; Save the third word
+                       lwz             r8,20(r6)                                       ; Get the sixth word
+                       stw             r11,12(r4)                                      ; Save the fourth word
+                       lwz             r9,24(r6)                                       ; Get the seventh word
+                       stw             r7,16(r4)                                       ; Save the fifth word
+                       lwz             r11,28(r6)                                      ; Get the eighth word
+                       addi            r6,r6,32                                        ; Point to the next
+                       stw             r8,20(r4)                                       ; Save the sixth word
+                       stw             r9,24(r4)                                       ; Save the seventh word
+                       stw             r11,28(r4)                                      ; Save the eighth word
+                       addi            r4,r4,32                                        ; Bump sink
+                       bgt+            Lnxtline                                        ; Do the next line, if any...
+
+       
+;                      Move backend quadword
+
+Lbackend:              bf              27,Lnoquad                                      ; No quad to do...
+                       lwz             r7,0(r6)                                        ; Get the first word
+                       lwz             r8,4(r6)                                        ; Get the second word
+                       lwz             r9,8(r6)                                        ; Get the third word
+                       lwz             r11,12(r6)                                      ; Get the fourth word
+                       stw             r7,0(r4)                                        ; Save the first word
+                       addi            r6,r6,16                                        ; Point to the next
+                       stw             r8,4(r4)                                        ; Save the second word
+                       stw             r9,8(r4)                                        ; Save the third word
+                       stw             r11,12(r4)                                      ; Save the fourth word
+                       addi            r4,r4,16                                        ; Bump sink
+                       
+;                      Move backend double
+
+Lnoquad:               bf              28,Lnodouble                                    ; No double to do...
+                       lwz             r7,0(r6)                                        ; Get the first word
+                       lwz             r8,4(r6)                                        ; Get the second word
+                       addi            r6,r6,8                                         ; Point to the next
+                       stw             r7,0(r4)                                        ; Save the first word
+                       stw             r8,4(r4)                                        ; Save the second word
+                       addi            r4,r4,8                                         ; Bump sink
+                       
+;                      Move backend word
+
+Lnodouble:             bf              29,Lnoword                                      ; No word to do...
+                       lwz             r7,0(r6)                                        ; Get the word
+                       addi            r6,r6,4                                         ; Point to the next
+                       stw             r7,0(r4)                                        ; Save the word
+                       addi            r4,r4,4                                         ; Bump sink
+                       
+;                      Move backend halfword
+
+Lnoword:                       bf              30,Lnohalf                                      ; No halfword to do...
+                       lhz             r7,0(r6)                                        ; Get the halfword
+                       addi            r6,r6,2                                         ; Point to the next
+                       sth             r7,0(r4)                                        ; Save the halfword
+                       addi            r4,r4,2                                         ; Bump sink
+
+;                      Move backend byte
+
+Lnohalf:                       bflr            31                                              ; Leave cuz we are all done...  
+                       lbz             r7,0(r6)                                        ; Get the byte
+                       stb             r7,0(r4)                                        ; Save the single
+                       
+                       blr                                                             ; Leave cuz we are all done...                  
+
+;
+;                      0123456789ABCDEF0123456789ABCDEF
+;                       0123456789ABCDEF0123456789ABCDEF
+;                                                                                  F
+;                                                                                DE
+;                                                                        9ABC
+;                                                        12345678
+;             123456789ABCDEF0 
+;            0
+
+;
+;                      Here is where we handle a forward overlapping move.  These will be slow
+;                      because we can not kill the cache of the destination until after we have
+;                      loaded/saved the source area.  Also, because reading memory backwards is
+;                      slower when the cache line needs to be loaded because the critical 
+;                      doubleword is loaded first, i.e., the last, then it goes back to the first,
+;                      and on in order.  That means that when we are at the second to last DW we
+;                      have to wait until the whole line is in cache before we can proceed.
+;
+       
+Lfwdovrlap:            add             r4,r5,r4                                        ; Point past the last sink byte
+                       add             r6,r5,r6                                        ; Point past the last source byte 
+                       and             r0,r4,r8                                        ; Apply movement limit
+                       li              r12,-1                                          ; Make sure we touch in the actual line                         
+                       mtcrf           3,r0                                            ; Figure out the best way to move backwards                     
+                       dcbt            r12,r6                                          ; Touch in the last line of source
+                       rlwinm.         r0,r0,0,27,31                                   ; Calculate the length to adjust to cache boundary
+                       dcbtst          r12,r4                                          ; Touch in the last line of the sink
+                       beq-            Lballine                                                ; Aready on cache line boundary
+                       
+                       sub             r5,r5,r0                                        ; Precaculate move length left after alignment
+                       
+                       bf              31,Lbalhalf                                     ; No single byte to do...
+                       lbz             r7,-1(r6)                                       ; Get the byte
+                       subi            r6,r6,1                                         ; Point to the next
+                       stb             r7,-1(r4)                                       ; Save the single
+                       subi            r4,r4,1                                         ; Bump sink
+                       
+;                      Sink is halfword aligned here
+
+Lbalhalf:              bf              30,Lbalword                                     ; No halfword to do...
+                       lhz             r7,-2(r6)                                       ; Get the halfword
+                       subi            r6,r6,2                                         ; Point to the next
+                       sth             r7,-2(r4)                                       ; Save the halfword
+                       subi            r4,r4,2                                         ; Bump sink
+                       
+;                      Sink is word aligned here
+
+Lbalword:              bf              29,Lbaldouble                                   ; No word to do...
+                       lwz             r7,-4(r6)                                       ; Get the word
+                       subi            r6,r6,4                                         ; Point to the next
+                       stw             r7,-4(r4)                                       ; Save the word
+                       subi            r4,r4,4                                         ; Bump sink
+                       
+;                      Sink is double aligned here
+
+Lbaldouble:            bf              28,Lbalquad                                     ; No double to do...
+                       lwz             r7,-8(r6)                                       ; Get the first word
+                       lwz             r8,-4(r6)                                       ; Get the second word
+                       subi            r6,r6,8                                         ; Point to the next
+                       stw             r7,-8(r4)                                       ; Save the first word
+                       stw             r8,-4(r4)                                       ; Save the second word
+                       subi            r4,r4,8                                         ; Bump sink
+                       
+;                      Sink is quadword aligned here
+
+Lbalquad:              bf              27,Lballine                                     ; No quad to do...
+                       lwz             r7,-16(r6)                                      ; Get the first word
+                       lwz             r8,-12(r6)                                      ; Get the second word
+                       lwz             r9,-8(r6)                                       ; Get the third word
+                       lwz             r11,-4(r6)                                      ; Get the fourth word
+                       stw             r7,-16(r4)                                      ; Save the first word
+                       subi            r6,r6,16                                        ; Point to the next
+                       stw             r8,-12(r4)                                      ; Save the second word
+                       stw             r9,-8(r4)                                       ; Save the third word
+                       stw             r11,-4(r4)                                      ; Save the fourth word
+                       subi            r4,r4,16                                        ; Bump sink
+                       
+;                      Sink is line aligned here
+
+Lballine:              rlwinm.         r0,r5,27,5,31                                   ; Get the number of full lines to move
+                       mtcrf           3,r5                                            ; Make branch mask for backend partial moves
+                       beq-            Lbbackend                                       ; No full lines to move
+
+
+;                      Registers in use:       R0, R1,     R3, R4, R5, R6
+;                      Registers not in use:           R2,                 R7, R8, R9, R10, R11, R12 - Ok, we can make another free for 8 of them
+                       
+Lbnxtline:             subic.          r0,r0,1                                         ; Account for the line now
+
+                       lwz             r7,-32(r6)                                      ; Get the first word
+                       lwz             r5,-28(r6)                                      ; Get the second word
+                       lwz             r2,-24(r6)                                      ; Get the third word
+                       lwz             r12,-20(r6)                                     ; Get the third word
+                       lwz             r11,-16(r6)                                     ; Get the fifth word
+                       lwz             r10,-12(r6)                                     ; Get the sixth word
+                       lwz             r9,-8(r6)                                       ; Get the seventh word
+                       lwz             r8,-4(r6)                                       ; Get the eighth word
+                       subi            r6,r6,32                                        ; Point to the next
+                       
+                       stw             r7,-32(r4)                                      ; Get the first word
+                       ble-            Lbnotouch                                       ; Last time, skip touch of source...
+                       dcbt            0,r6                                            ; Touch in next source line
+                       
+Lbnotouch:             stw             r5,-28(r4)                                      ; Get the second word
+                       stw             r2,-24(r4)                                      ; Get the third word
+                       stw             r12,-20(r4)                                     ; Get the third word
+                       stw             r11,-16(r4)                                     ; Get the fifth word
+                       stw             r10,-12(r4)                                     ; Get the sixth word
+                       stw             r9,-8(r4)                                       ; Get the seventh word
+                       stw             r8,-4(r4)                                       ; Get the eighth word
+                       subi            r4,r4,32                                        ; Bump sink
+                       
+                       bgt+            Lbnxtline                                       ; Do the next line, if any...
+
+;
+;                      Note: We touched these lines in at the beginning
+;
+       
+;                      Move backend quadword
+
+Lbbackend:             bf              27,Lbnoquad                                     ; No quad to do...
+                       lwz             r7,-16(r6)                                      ; Get the first word
+                       lwz             r8,-12(r6)                                      ; Get the second word
+                       lwz             r9,-8(r6)                                       ; Get the third word
+                       lwz             r11,-4(r6)                                      ; Get the fourth word
+                       stw             r7,-16(r4)                                      ; Save the first word
+                       subi            r6,r6,16                                        ; Point to the next
+                       stw             r8,-12(r4)                                      ; Save the second word
+                       stw             r9,-8(r4)                                       ; Save the third word
+                       stw             r11,-4(r4)                                      ; Save the fourth word
+                       subi            r4,r4,16                                        ; Bump sink
+                       
+;                      Move backend double
+
+Lbnoquad:              bf              28,Lbnodouble                                   ; No double to do...
+                       lwz             r7,-8(r6)                                       ; Get the first word
+                       lwz             r8,-4(r6)                                       ; Get the second word
+                       subi            r6,r6,8                                         ; Point to the next
+                       stw             r7,-8(r4)                                       ; Save the first word
+                       stw             r8,-4(r4)                                       ; Save the second word
+                       subi            r4,r4,8                                         ; Bump sink
+                       
+;                      Move backend word
+
+Lbnodouble:            bf              29,Lbnoword                                     ; No word to do...
+                       lwz             r7,-4(r6)                                       ; Get the word
+                       subi            r6,r6,4                                         ; Point to the next
+                       stw             r7,-4(r4)                                       ; Save the word
+                       subi            r4,r4,4                                         ; Bump sink
+                       
+;                      Move backend halfword
+
+Lbnoword:              bf              30,Lbnohalf                                     ; No halfword to do...
+                       lhz             r7,-2(r6)                                       ; Get the halfword
+                       subi            r6,r6,2                                         ; Point to the next
+                       sth             r7,-2(r4)                                       ; Save the halfword
+                       subi            r4,r4,2                                         ; Bump sink
+
+;                      Move backend byte
+
+Lbnohalf:              bflr            31                                              ; Leave cuz we are all done...  
+                       lbz             r7,-1(r6)                                       ; Get the byte
+                       stb             r7,-1(r4)                                       ; Save the single
+                       
+                       blr                                                             ; Leave cuz we are all done...                  
diff --git a/gen.subproj/ppc.subproj/bzero.s b/gen.subproj/ppc.subproj/bzero.s
new file mode 100644 (file)
index 0000000..f320437
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/bzero.s
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ *  18-Jan-93  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ *
+ * void bzero(void *s, size_t n);
+ *
+ * Description:
+ *     The `bzero' function copies a zero into the first `n' bytes of
+ *   the object pointed to by `s'.
+ * Returns:
+ *     The `bzero' function does not return a value.
+ */
+#import        <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+
+#define a8     ep
+#define a9     at
+
+.at_off
+
+LEAF(_bzero)
+       li32    a2,0            // Clear registers a2 - a9.
+       li32    a3,0
+       li32    a4,0
+       li32    a5,0
+       li32    a6,0
+       li32    a7,0
+       li32    a8,0
+       li32    a9,0
+       andi.   zt,a0,31        // We want `s' to be 32-byte aligned.
+       subfic  zt,zt,32        // Get the number of bytes to start with.
+       cmplw   a1,zt           // Don't move more than we were asked to.
+       ble-    L_finish
+       mtxer   zt              // Load xer with the number of bytes to move.
+       stswx   a2,0,a0         // Store into `s'.
+       add     a0,a0,zt        // Advance the pointer; a0 is now aligned.
+       sub     a1,a1,zt        // Calculate the bytes remaining to move.
+       srwi.   zt,a1,5         // Get the number of 32-byte blocks to move.
+       beq-    L_finish        // Branch if fewer than 32 bytes are left.
+       mtctr   zt              // Setup counter for loop.
+       andi.   a1,a1,31        // Get the number of bytes left over.
+L_loop:
+       dcbz    0,a0            // Clear 32 bytes.
+       addi    a0,a0,32        // Advance the pointer.
+       bdnz+   L_loop          // Continue if there are still blocks to move.
+
+       /* At this point, `a1' contains the number of bytes left to move. */
+L_finish:
+       mtxer   a1              // Setup xer with # of bytes left to move.
+       stswx   a2,0,a0         // Store.
+       blr
+END(_bzero)
diff --git a/gen.subproj/ppc.subproj/ecvt.c b/gen.subproj/ppc.subproj/ecvt.c
new file mode 100755 (executable)
index 0000000..1146030
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/m98k/gen/ecvt.c
+ *
+ * char *ecvt(double x, int ndigits, int *decimal, int *sign);
+ * char *fcvt(double x, int ndigits, int *decimal, int *sign);
+ *
+ * The function `ecvt' converts the double `x' to a null-terminated
+ * string of `ndigits' ASCII digits and returns a pointer to the string.
+ * The position of the decimal point relative to the beginning of the
+ * string is stored in the int pointed to by `decimal'.  A negative
+ * value means that the decimal point appears to the left of the returned
+ * digits.  If the sign of the result is negative, a non-zero value is
+ * stored in the int pointed to by `sign'; otherwise, a zero value is stored.
+ * The low-order digit of the returned value is rounded.
+ *
+ * The function `fcvt' is identical to `ecvt', except that the correct digit
+ * has been rounded for Fortran F-format output of the number of digits
+ * specified by `ndigits'.
+ *
+ * HISTORY
+ *  10-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Ported to m98k.
+ *   8-Jan-92  Peter King (king@next.com)
+ *     Created from M68K sources which was created from VAX sources.
+ */
+#import <math.h>
+
+static double ecvt_rint(double x);
+static double ecvt_copysign(double x, double y);
+static char *cvt(double arg, int ndigits, int *decptp, int *signp, int eflag);
+
+#define isNAN(x) ((x) != (x))
+
+/* big enough to handle %.20f conversion of 1e308 */
+#define        NDIG            350
+
+char *
+ecvt(double arg, int ndigits, int *decptp, int *signp)
+{
+    return (cvt(arg, ndigits, decptp, signp, 1));
+}
+
+char *
+fcvt(double arg, int ndigits, int *decptp, int *signp)
+{
+    return (cvt(arg, ndigits, decptp, signp, 0));
+}
+
+static char *
+cvt(double arg, int ndigits, int *decptp, int *signp, int eflag)
+{
+    int decpt;
+    double fi, fj;
+    char *p, *p1;
+    static char buf[NDIG] = { 0 };
+
+    if (ndigits < 0)
+       ndigits = 0;
+    if (ndigits >= NDIG - 1)
+       ndigits = NDIG - 2;
+
+    decpt = 0;
+    *signp = 0;
+    p = &buf[0];
+
+    if (arg == 0) {
+       *decptp = 0;
+       while (p < &buf[ndigits])
+           *p++ = '0';
+       *p = '\0';
+       return (buf);
+    } else if (arg < 0) {
+       *signp = 1;
+       arg = -arg;
+    }
+
+    arg = modf(arg, &fi);
+    p1 = &buf[NDIG];
+
+    /* Do integer part */
+
+    if (fi != 0) {
+       while (fi != 0) {
+           fj = modf(fi/10, &fi);
+#if 0
+           *--p1 = (int)((fj + 0.03) * 10) + '0';
+#else
+           *--p1 = (int)ecvt_rint(fj * 10) + '0';
+#endif
+           decpt++;
+       }
+       while (p1 < &buf[NDIG])
+           *p++ = *p1++;
+    } else if (arg > 0) {
+       while ((fj = arg*10) < 1) {
+           arg = fj;
+           decpt--;
+       }
+    }
+    *decptp = decpt;
+
+    /* Do the fractional part.
+     * p pts to where fraction should be concatenated.
+     * p1 is how far conversion must go to.
+     */
+    p1 = &buf[ndigits];
+    if (eflag == 0) {
+       /* fcvt must provide ndigits after decimal pt */
+       p1 += decpt;
+       /* if decpt was negative, we might be done for fcvt */
+       if (p1 < &buf[0]) {
+           buf[0] = '\0';
+           return (buf);
+       }
+    }
+
+    while (p <= p1 && p < &buf[NDIG]) {
+       arg *= 10;
+       arg = modf(arg, &fj);
+       *p++ = (int)fj + '0';
+    }
+
+    /* If we converted all the way to the end of the buf, don't mess with
+     * rounding since there's nothing significant out here anyway.
+     */
+    if (p1 >= &buf[NDIG]) {
+       buf[NDIG-1] = '\0';
+       return (buf);
+    }
+
+    /* Round by adding 5 to last digit and propagating carries. */
+    p = p1;
+    *p1 += 5;
+    while (*p1 > '9') {
+       *p1 = '0';
+       if (p1 > buf) {
+           ++*--p1;
+       } else {
+           *p1 = '1';
+           (*decptp)++;
+           if (eflag == 0) {
+               if (p > buf)
+                   *p = '0';
+               p++;
+           }
+       }
+    }
+    *p = '\0';
+    return (buf);
+}
+
+static double L = 4503599627370496.0E0;                /* 2**52 */
+
+static int ecvt_init = 0;
+
+/*
+ * FIXME: This deserves a comment if you turn this off!
+ * This used to #pragma CC_OPT_OFF.
+ * (Probably this was because the isNAN test was optimized away.)
+ * Why don't we just use the value of L given above?
+ */
+
+static double
+ecvt_rint(double x)
+{
+    double s, t, one;
+
+    one = 1.0;
+
+    if (ecvt_init == 0) {
+       int i;
+       L = 1.0;
+       for (i = 52; i != 0; i--)
+           L *= 2.0;
+       ecvt_init = 1;
+    }
+    if (isNAN(x))
+       return (x);
+    if (ecvt_copysign(x, one) >= L)            /* already an integer */
+       return (x);
+    s = ecvt_copysign(L, x);
+    t = x + s;                         /* x+s rounded to integer */
+    return (t - s);
+}
+
+/* Couldn't we use something like the following structure instead of the
+   hacky unsigned short pointer stuff?
+
+struct double_format {
+    unsigned sign:1;
+    unsigned exponent:11;
+    unsigned hi_fraction:20;
+    unsigned lo_fraction:32;
+};
+
+*/
+
+#define msign ((unsigned short)0x7fff)
+#define mexp ((unsigned short)0x7ff0)
+
+static double
+ecvt_copysign(double x, double y)
+{
+    unsigned short *px, *py;
+
+    px = (unsigned short *)&x;
+    py = (unsigned short *)&y;
+    *px = (*px & msign) | (*py & ~msign);
+    return (x);
+}
+
+/*
+ * This used to #pragma CC_OPT_ON
+ */
diff --git a/gen.subproj/ppc.subproj/ffs.s b/gen.subproj/ppc.subproj/ffs.s
new file mode 100644 (file)
index 0000000..bb4963a
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *      File:  libc/gen/ppc/ffs.s
+ *
+ *      Find the first bit set (starting with the least significant bit).
+ *
+ * HISTORY
+ *
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *      Ported to PPC. 
+ *
+ *  19-Jan-1998 Matt Watson (mwatson@apple.com)
+ *      Simplified
+ *
+ *  10-Mar-1998 Matt Watson (mwatson@apple.com)
+ *      Correctified
+ *
+ */
+
+.text
+.align 2
+.globl _ffs
+_ffs:
+       neg    r0,r3
+       and    r3,r0,r3
+       cntlzw r3,r3
+       subfic r3,r3,32
+       blr
diff --git a/gen.subproj/ppc.subproj/fp.h b/gen.subproj/ppc.subproj/fp.h
new file mode 100755 (executable)
index 0000000..0934658
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/m98k/gen/fp.h
+ *     Author: Derek B Clegg, NeXT Computer, Inc.
+ *
+ * HISTORY
+ *  11-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ *
+ * Common definitions for floating-point numbers.
+ */
+
+/* The following definitions for for double precision IEEE format numbers. */
+
+#define EXPONENT_BIAS 1023
+
+#define SIGN_BITS 1
+#define EXPONENT_BITS 11
+#define FRACTION_BITS 52
+#define HI_FRACTION_BITS 20
+#define LO_FRACTION_BITS 32
+
+struct double_format {
+    unsigned sign: SIGN_BITS;
+    unsigned exponent: EXPONENT_BITS;
+    unsigned hi_fraction: HI_FRACTION_BITS;
+    unsigned lo_fraction: LO_FRACTION_BITS;
+};
+
+union dbl {
+    struct double_format s;
+    unsigned int u[2];
+    double value;
+};
+
+#define PlusInfinity   (1.0/0.0)
+#define MinusInfinity  (-1.0/0.0)
+
+#define not_a_number(x)                ((x) != (x))
+#define positive_infinity(x)   ((x) == PlusInfinity)
+#define negative_infinity(x)   ((x) == MinusInfinity)
diff --git a/gen.subproj/ppc.subproj/genassym.h b/gen.subproj/ppc.subproj/genassym.h
new file mode 100644 (file)
index 0000000..729dfa9
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * genassym.h -- macros of use with genassym.c and assymdefs.c
+ */
+
+#import        <architecture/ppc/reg_help.h>
+#import        <architecture/ppc/macro_help.h>
+
+#define        PRINT_OFFSET(ptr_type, field)                                   \
+MACRO_BEGIN                                                            \
+       print_define("", #ptr_type, #field);                            \
+       print_hex((unsigned) &(((ptr_type)0)->field));                  \
+MACRO_END
+
+#define        PRINT_BIT_FIELD(reg_type, field)                                \
+MACRO_BEGIN                                                            \
+       reg_type __reg;                                                 \
+       CONTENTS(__reg) = 0;                                            \
+       __reg.field = (typeof (__reg.field)) -1;                        \
+       print_define("", #reg_type, #field);                            \
+       print_hex(CONTENTS(__reg));                                     \
+MACRO_END
+
+#define        PRINT_ENUM(item)                                                \
+MACRO_BEGIN                                                            \
+       print_define("", "", #item);                                    \
+       print_hex((unsigned)item);                                      \
+MACRO_END
+
+#define        PRINT_DEFINE(macro)                                             \
+MACRO_BEGIN                                                            \
+       print_define("", "", #macro);                                   \
+       print_str(STRINGIFY(macro));                                    \
+MACRO_END
+
+#define        PRINT_CONSTANT(macro)                                           \
+MACRO_BEGIN                                                            \
+       print_define("", "", #macro);                                   \
+       print_hex((unsigned)macro);                                     \
+MACRO_END
+
+#define        PRINT_REGADDR(macro)                                            \
+MACRO_BEGIN                                                            \
+       print_define("", "", #macro);                                   \
+       print_hex((unsigned) &macro);                                   \
+MACRO_END
+
+#define        PRINT_REG_PAIR(struct_ptr, name0, name1)                        \
+MACRO_BEGIN                                                            \
+       print_define("", #struct_ptr, #name0 "_" #name1);               \
+       print_hex((unsigned) &(((struct_ptr)0)->U_##name0##_##name1));  \
+MACRO_END
+
+#define        PRINT_BIT_POS(reg_type, field)                                  \
+MACRO_BEGIN                                                            \
+       reg_type __reg;                                                 \
+       CONTENTS(__reg) = 0;                                            \
+       __reg.field = 1;                                                \
+       print_define("", #reg_type, #field "_BIT");                     \
+       print_dec((int) bit_num(#reg_type, #field, CONTENTS(__reg)));   \
+MACRO_END
+
+#define        PRINT_FIELD_INFO(reg_type, field)                               \
+MACRO_BEGIN                                                            \
+       reg_type __reg;                                                 \
+       CONTENTS(__reg) = 0;                                            \
+       __reg.field = -1;                                               \
+       print_define("", #reg_type, #field "_OFF");                     \
+       print_dec((int) bit_num(#reg_type, #field, CONTENTS(__reg)));   \
+       print_define("", #reg_type, #field "_WIDTH");                   \
+       print_dec((int) field_width(#reg_type, #field, CONTENTS(__reg)));\
+MACRO_END
+
+#define        PRINT_L2_SIZE(type)                                             \
+MACRO_BEGIN                                                            \
+       print_define("L2_SIZEOF", #type, "");                           \
+       print_dec((int) log2(sizeof(type), #type));                     \
+MACRO_END
+
+#define        PRINT_SIZEOF(type)                                              \
+MACRO_BEGIN                                                            \
+       print_define("SIZEOF", #type, "");                              \
+       print_dec((int) sizeof(type));                                  \
+MACRO_END
+
+#define        PRINT_L2_CONSTANT(macro)                                        \
+MACRO_BEGIN                                                            \
+       print_define("L2", "", #macro);                                 \
+       print_dec((int) log2(macro, #macro));                           \
+MACRO_END
+
+typedef enum {
+       MAJOR, MINOR
+} cmt_level_t;
+
+extern void comment(cmt_level_t level, const char *cmt);
+extern void print_define(const char *prefix, const char *type_name,
+ const char *field);
+extern void print_dec(int val);
+extern void print_hex(unsigned val);
+extern void print_str(const char *str);
+extern unsigned bit_num(char *reg_type, char *field, unsigned bits);
+extern unsigned field_width(char *reg_type, char *field, unsigned bits);
+extern unsigned log2(unsigned val, char *type);
+extern void assymdefs(void);
+
diff --git a/gen.subproj/ppc.subproj/insque.c b/gen.subproj/ppc.subproj/insque.c
new file mode 100644 (file)
index 0000000..17f0b48
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/insque.c
+ *
+ * struct qelem {
+ *     struct qelem *q_forw;
+ *     struct qelem *q_back;
+ *     char q_data[];
+ * };
+ *
+ * void insque(struct qelem *elem, struct qelem *prev);
+ *
+ * Inserts queue entry `elem' into a queue after element `prev'.
+ *
+ * HISTORY
+*  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+*      Ported to PPC.
+ *  10-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#include <libc.h>
+
+void
+insque(struct qelem *elem, struct qelem *prev)
+{
+    struct qelem *next;
+
+    next = prev->q_forw;
+    prev->q_forw = elem;
+    if (next != 0)
+       next->q_back = elem;
+    elem->q_forw = next;
+    elem->q_back = prev;
+}
diff --git a/gen.subproj/ppc.subproj/isinf.c b/gen.subproj/ppc.subproj/isinf.c
new file mode 100644 (file)
index 0000000..b98587d
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/isinf.c
+ *     Author: Derek B Clegg, NeXT Software, Inc.
+ *
+ * HISTORY
+*  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+*      Ported to PPC.
+ *  11-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ *
+ * int isinf(double value);
+ *
+ * Returns 1 if `value' is equal to positive IEEE infinity, -1 if `value'
+ * is equal to negative IEEE infinity, 0 otherwise.
+ *
+ * An IEEE infinity is a double value with the maximum biased exponent value
+ * (2047) and a zero fraction value.
+ */
+#import "fp.h"
+
+int
+isinf(double value)
+{
+    union dbl d;
+
+    d.value = value;
+    if (d.u[0] == 0x7FF00000 && d.u[1] == 0)
+       return 1;
+    if (d.u[0] == 0xFFF00000 && d.u[1] == 0)
+       return -1;
+    return 0;
+}
diff --git a/gen.subproj/ppc.subproj/mcount.s b/gen.subproj/ppc.subproj/mcount.s
new file mode 100644 (file)
index 0000000..2c73e3d
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1997 Apple Computer, Inc.
+**
+** 10 June 1997 - Created by mwatson@apple.com
+**
+*/
+
+#include <architecture/ppc/asm_help.h>
+
+        .text
+        .align 2
+        .globl mcount
+mcount:
+        mflr r0
+        stw r0,8(r1)
+        stwu r1,-64(r1)
+        mflr r4
+        CALL_EXTERN(_moncount)
+        addi r1,r1,64
+        lwz r0,8(r1)
+        mtlr r0
+        blr
+
diff --git a/gen.subproj/ppc.subproj/memcpy.s b/gen.subproj/ppc.subproj/memcpy.s
new file mode 100644 (file)
index 0000000..0c371f6
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#define MEMCPY
+#include "bcopy.s"
diff --git a/gen.subproj/ppc.subproj/memmove.s b/gen.subproj/ppc.subproj/memmove.s
new file mode 100644 (file)
index 0000000..d517786
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#define MEMMOVE
+#include "bcopy.s"
diff --git a/gen.subproj/ppc.subproj/remque.c b/gen.subproj/ppc.subproj/remque.c
new file mode 100644 (file)
index 0000000..9e032c5
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997  NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/remque.c
+ *
+ * struct qelem {
+ *     struct qelem    *q_forw;
+ *     struct qelem    *q_back;
+ *     char            q_data[];
+ * };
+ *
+ * void remque(struct qelem *entry);
+ *
+ * Removes `entry' from a queue.
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ *  10-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#import <libc.h>
+
+void
+remque(struct qelem *elem)
+{
+    struct qelem *next, *prev;
+
+    next = elem->q_forw;
+    prev = elem->q_back;
+    if (next != 0)
+       next->q_back = prev;
+    if (prev != 0)
+       prev->q_forw = next;
+}
diff --git a/gen.subproj/ppc.subproj/setjmperr.c b/gen.subproj/ppc.subproj/setjmperr.c
new file mode 100755 (executable)
index 0000000..3df3b7d
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)setjmperr.c        5.2 (Berkeley) 3/9/86";
+#endif LIBC_SCCS and not lint
+
+#define ERRMSG "longjmp botch\n"
+
+/*
+ * This routine is called from longjmp() when an error occurs.
+ * Programs that wish to exit gracefully from this error may
+ * write their own versions.
+ * If this routine returns, the program is aborted.
+ */
+void
+longjmperror(void)
+{
+    write(2, ERRMSG, sizeof(ERRMSG));
+}
diff --git a/gen.subproj/ppc.subproj/strcat.c b/gen.subproj/ppc.subproj/strcat.c
new file mode 100644 (file)
index 0000000..ef5c208
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1991, 1997 NeXT Software, Inc.  All rights reserved.
+ * 
+ *     File:   libc/gen/ppc/strcat.c
+ *     Author: Mike DeMoney, NeXT Software, Inc.
+ *
+ *     This file contains machine dependent code for string copy
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ * 9-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Ported to m98k.
+ * 4-Jun-91  Mike DeMoney (mike@next.com)
+ *     Created.
+ */
+#import <string.h>
+
+char *
+strcat(char *s1, const char *s2)
+{
+    strcpy(&s1[strlen(s1)], s2);
+    return s1;
+}
diff --git a/gen.subproj/ppc.subproj/strcpy.c b/gen.subproj/ppc.subproj/strcpy.c
new file mode 100644 (file)
index 0000000..a4c78b4
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ * 
+ *     File:   libc/gen/ppc/strcpy.c
+ *
+ *     This file contains machine dependent code for string copy
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ * 24-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#import <string.h>
+
+/* XXX This routine should be optimized. */
+
+/* ANSI sez:
+ *   The `strcpy' function copies the string pointed to by `s2' (including
+ *   the terminating null character) into the array pointed to by `s1'.
+ *   If copying takes place between objects that overlap, the behavior
+ *   is undefined.
+ *   The `strcpy' function returns the value of `s1'.  [4.11.2.3]
+ */
+char *
+strcpy(char *s1, const char *s2)
+{
+    char *s = s1;
+    while ((*s++ = *s2++) != 0)
+       ;
+    return (s1);
+}
diff --git a/gen.subproj/ppc.subproj/strlen.s b/gen.subproj/ppc.subproj/strlen.s
new file mode 100644 (file)
index 0000000..baa1216
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ *
+ *     File:   libc/gen/ppc/strlen.s
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ *  12-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ *
+ * size_t strlen(const char *s);
+ *
+ * Description:
+ *
+ * Returns:
+ */
+#import        <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+
+/* size_t strlen(const char *s); */
+
+#define a8 ep
+#define a9 at
+
+.at_off
+
+#define check_for_zero(reg, tmp, found_zero, checked_all) \
+       extrwi. tmp,reg,8,0                                             @\
+       beq-    found_zero                                              @\
+       bdz-    checked_all                                             @\
+       extrwi. tmp,reg,8,8                                             @\
+       beq-    found_zero                                              @\
+       bdz-    checked_all                                             @\
+       extrwi. tmp,reg,8,16                                            @\
+       beq-    found_zero                                              @\
+       bdz-    checked_all                                             @\
+       extrwi. tmp,reg,8,24                                            @\
+       beq-    found_zero                                              @\
+       bdz-    checked_all
+
+#define check_32(tmp, found_zero) \
+       check_for_zero(a2, tmp, found_zero, 1f)         @\
+       check_for_zero(a3, tmp, found_zero, 1f)         @\
+       check_for_zero(a4, tmp, found_zero, 1f)         @\
+       check_for_zero(a5, tmp, found_zero, 1f)         @\
+       check_for_zero(a6, tmp, found_zero, 1f)         @\
+       check_for_zero(a7, tmp, found_zero, 1f)         @\
+       check_for_zero(a8, tmp, found_zero, 1f)         @\
+       check_for_zero(a9, tmp, found_zero, 1f)         @\
+1:
+
+LEAF(_strlen)
+       dcbt    0,a0            // Try to load the cache line.
+       andi.   a1,a0,31        // We want to be 32-byte aligned.
+       subfic  a1,a1,32        // Get the number of bytes to start with.
+       mtxer   a1              // Setup xer for load.
+       lswx    a2,0,a0         // Load the bytes.
+       mtctr   a1              // Setup ctr for zero check.
+       check_32(zt, L_found_zero)
+
+       /* Now check 32-byte blocks. At this point, ctr is zero, so we can
+        * use it as our running count. */
+       dcbt    a1,a0           // Try to load the cache line.
+       li32    a2,32
+       mtxer   a2
+       li32    a2,0
+       mtctr   a2
+
+2:     lswx    a2,a1,a0        // Load 32 bytes.
+       check_32(zt, L_found_zero)
+       addi    a0,a0,32        // Increment the pointer.
+       dcbt    a1,a0           // Try to load the cache.
+       b       2b              // Loop
+
+L_found_zero:
+       mfctr   a0
+       sub     a0,a1,a0        // Get the number of bytes before 0.
+       blr                     // Return.
+END(_strlen)
diff --git a/gen.subproj/ppc.subproj/strncat.c b/gen.subproj/ppc.subproj/strncat.c
new file mode 100644 (file)
index 0000000..9f9ef54
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1991, 1997 NeXT Software, Inc.  All rights reserved.
+ * 
+ *     File:   libc/gen/ppc/strncat.c
+ *     Author: Mike DeMoney, NeXT Software, Inc.
+ *
+ *     This file contains machine dependent code for string copy
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ * 23-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Ported to m98k.
+ *  4-Jun-91  Mike DeMoney (mike@next.com)
+ *     Created.
+ */
+#import        <string.h>
+
+char *
+strncat(char *s1, const char *s2, size_t n)
+{
+    unsigned len1 = strlen(s1);
+    unsigned len2 = strlen(s2);
+    
+    if (len2 < n) {
+       strcpy(&s1[len1], s2);
+    } else {
+       strncpy(&s1[len1], s2, n);
+       s1[len1 + n] = '\0';
+    }
+    return s1;
+}
diff --git a/gen.subproj/ppc.subproj/strncmp.c b/gen.subproj/ppc.subproj/strncmp.c
new file mode 100644 (file)
index 0000000..bd54d2d
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ * 
+ *     File:   libc/gen/ppc/strncmp.c
+ *
+ *     This file contains machine dependent code for string comparison
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ * 24-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#import <string.h>
+
+/* This routine should be optimized. */
+
+/* ANSI sez:
+ *   The `strncmp' function compares not more than `n' characters (characters
+ *   that follow a null character are not compared) from the array pointed to
+ *   by `s1' to the array pointed to by `s2'.
+ *   The `strncmp' function returns an integer greater than, equal to, or less
+ *   than zero, according as the possibly null-terminated array pointed to by
+ *   `s1' is greater than, equal to, or less than the possibly null-terminated
+ *   array pointed to by `s2'.  [4.11.4.4]
+ */
+int
+strncmp(const char *s1, const char *s2, size_t n)
+{
+    for ( ; n > 0; s1++, s2++, --n)
+       if (*s1 != *s2)
+           return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
+       else if (*s1 == '\0')
+           return 0;
+    return 0;
+}
diff --git a/gen.subproj/ppc.subproj/strncpy.c b/gen.subproj/ppc.subproj/strncpy.c
new file mode 100644 (file)
index 0000000..1fd6e26
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992, 1997 NeXT Software, Inc.  All rights reserved.
+ * 
+ *     File:   libc/gen/ppc/strncpy.c
+ *
+ *     This file contains machine dependent code for string copy
+ *
+ * HISTORY
+ *  24-Jan-1997 Umesh Vaishampayan (umeshv@NeXT.com)
+ *     Ported to PPC.
+ * 24-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#import <string.h>
+
+/* This routine should be optimized. */
+
+/* ANSI sez:
+ *   The `strncpy' function copies not more than `n' characters (characters
+ *   that follow a null character are not copied) from the array pointed to
+ *   by `s2' to the array pointed to by `s1'.  If copying takes place between
+ *   objects that overlap, the behavior is undefined.
+ *   If the array pointed to by `s2' is a string that is shorter than `n'
+ *   characters, null characters are appended to the copy in the array
+ *   pointed to by `s1', until `n' characters in all have been written.
+ *   The `strncpy' function returns the value of `s1'.  [4.11.2.4]
+ */
+char *
+strncpy(char *s1, const char *s2, size_t n)
+{
+    char *s = s1;
+    while (n > 0 && *s2 != '\0') {
+       *s++ = *s2++;
+       --n;
+    }
+    while (n > 0) {
+       *s++ = '\0';
+       --n;
+    }
+    return s1;
+}
diff --git a/gen.subproj/psignal.c b/gen.subproj/psignal.c
new file mode 100644 (file)
index 0000000..3d8a0b8
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Print the name of the signal indicated
+ * along with the supplied message.
+ */
+#include <sys/signal.h>
+#include <string.h>
+#include <unistd.h>
+
+extern const char *const sys_siglist[];
+
+void
+psignal(sig, s)
+       unsigned int sig;
+       const char *s;
+{
+       register const char *c;
+       register int n;
+
+       if (sig < NSIG)
+               c = (char *)sys_siglist[sig];
+       else
+               c = "Unknown signal";
+       n = strlen(s);
+       if (n) {
+               (void)write(STDERR_FILENO, s, n);
+               (void)write(STDERR_FILENO, ": ", 2);
+       }
+       (void)write(STDERR_FILENO, c, strlen(c));
+       (void)write(STDERR_FILENO, "\n", 1);
+}
diff --git a/gen.subproj/raise.c b/gen.subproj/raise.c
new file mode 100644 (file)
index 0000000..533615e
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <signal.h>
+#include <unistd.h>
+
+raise(s)
+       int s;
+{
+       return(kill(getpid(), s));
+}
diff --git a/gen.subproj/readdir.c b/gen.subproj/readdir.c
new file mode 100644 (file)
index 0000000..fd86c9e
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <dirent.h>
+
+/*
+ * get next entry in a directory.
+ */
+struct dirent *
+readdir(dirp)
+       register DIR *dirp;
+{
+       register struct dirent *dp;
+
+       for (;;) {
+               if (dirp->dd_loc >= dirp->dd_size) {
+                       if (dirp->dd_flags & __DTF_READALL)
+                               return (NULL);
+                       dirp->dd_loc = 0;
+               }
+               if (dirp->dd_loc == 0 && !(dirp->dd_flags & __DTF_READALL)) {
+                       dirp->dd_size = getdirentries(dirp->dd_fd,
+                           dirp->dd_buf, dirp->dd_len, &dirp->dd_seek);
+                       if (dirp->dd_size <= 0)
+                               return (NULL);
+               }
+               dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc);
+               if ((int)dp & 03)       /* bogus pointer check */
+                       return (NULL);
+               if (dp->d_reclen <= 0 ||
+                   dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc)
+                       return (NULL);
+               dirp->dd_loc += dp->d_reclen;
+               if (dp->d_ino == 0)
+                       continue;
+               if (dp->d_type == DT_WHT && (dirp->dd_flags & DTF_HIDEW))
+                       continue;
+               return (dp);
+       }
+}
diff --git a/gen.subproj/rewinddir.c b/gen.subproj/rewinddir.c
new file mode 100644 (file)
index 0000000..0829a23
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <dirent.h>
+
+void
+rewinddir(dirp)
+       DIR *dirp;
+{
+
+       _seekdir(dirp, dirp->dd_rewind);
+       dirp->dd_rewind = telldir(dirp);
+}
diff --git a/gen.subproj/scalable_malloc.c b/gen.subproj/scalable_malloc.c
new file mode 100644 (file)
index 0000000..cbf6ab8
--- /dev/null
@@ -0,0 +1,1649 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/* Author: Bertrand Serlet, August 1999 */
+
+#import "scalable_malloc.h"
+
+#define __POSIX_LIB__
+#import <unistd.h>
+#import <pthread_internals.h>  // for spin lock
+#import <libc.h>
+#include <mach/vm_statistics.h>
+
+/********************* DEFINITIONS     ************************/
+
+static unsigned vm_page_shift = 0; // guaranteed to be intialized by zone creation
+
+#define DEBUG_MALLOC   0       // set to one to debug malloc itself
+#define DEBUG_CLIENT   0       // set to one to help debug a nasty memory smasher
+
+#if DEBUG_MALLOC
+#warning DEBUG ENABLED
+#define INLINE
+#else
+#define INLINE inline
+#endif
+
+#define CHECK_REGIONS                  (1 << 31)
+
+#define VM_COPY_THRESHOLD              (40 * 1024)
+    // When all memory is touched after a copy, vm_copy() is always a lose
+    // But if the memory is only read, vm_copy() wins over memmove() at 3 or 4 pages (on a G3/300MHz)
+#define KILL_THRESHOLD                 (32 * 1024)
+
+#define LARGE_THRESHOLD                        (3 * vm_page_size) // at or above this use "large"
+
+#define        SHIFT_QUANTUM                   4       // Required for AltiVec
+#define        QUANTUM                         (1 << SHIFT_QUANTUM) // allocation quantum
+#define MIN_BLOCK                      1       // minimum size, in QUANTUM multiples
+
+/* The header of a small block in use contains its size (expressed as multiples of QUANTUM, and header included), or 0;
+If 0 then the block is either free (in which case the size is directly at the block itself), or the last block (indicated by either being beyond range, or having 0 in the block itself) */
+
+#define PTR_HEADER_SIZE                        (sizeof(msize_t))
+#define FOLLOWING_PTR(ptr,msize)       (((char *)(ptr)) + ((msize) << SHIFT_QUANTUM))
+#define PREVIOUS_MSIZE(ptr)            ((msize_t *)(ptr))[-2]
+
+#define THIS_FREE                      0x8000  // indicates this block is free
+#define PREV_FREE                      0x4000  // indicates previous block is free
+#define MSIZE_FLAGS_FOR_PTR(ptr)       (((msize_t *)(ptr))[-1])
+
+#define REGION_SIZE                    (1 << (16 - 2 + SHIFT_QUANTUM)) // since we only have 16 bits for msize_t, and 1 bit is taken by THIS_FREE, and 1 by PREV_FREE
+
+#define INITIAL_NUM_REGIONS            8 // must always be at least 2 to always have 1 slot empty
+
+#define CHECKSUM_MAGIC                 0x357B
+
+#define PROTECT_SMALL                  0       // Should be 0: 1 is too slow for normal use
+
+#define LARGE_CACHE_SIZE       4       // define hysterisis of large chunks
+
+#define MAX_RECORDER_BUFFER    256
+
+#define MAX_GRAIN      64
+
+typedef unsigned short msize_t; // a size in multiples of SHIFT_QUANTUM
+
+typedef struct {
+    unsigned   checksum;
+    void       *previous;
+    void       *next;
+} free_list_t;
+
+typedef struct {
+    unsigned   address_and_num_pages;
+    // this type represents both an address and a number of pages
+    // the low bits are the number of pages
+    // the high bits are the address
+    // note that the exact number of bits used for depends on the page size
+    // also, this cannot represent pointers larger than 1 << (vm_page_shift * 2)
+} compact_range_t;
+
+typedef vm_address_t region_t;
+
+typedef compact_range_t large_entry_t;
+
+typedef vm_range_t huge_entry_t;
+
+typedef unsigned short grain_t;
+
+typedef struct {
+    malloc_zone_t      basic_zone;
+    pthread_lock_t     lock;
+    unsigned           debug_flags;
+    void               *log_address;
+    
+    /* Regions for small objects */
+    unsigned           num_regions;
+    region_t           *regions;
+        // this array is always created with 1 extra slot to be able to add a region without taking memory right away
+    unsigned           last_region_hit;
+    free_list_t                *free_list[MAX_GRAIN];
+    unsigned           num_bytes_free_in_last_region; // these bytes are cleared
+    unsigned           num_small_objects;
+    unsigned           num_bytes_in_small_objects;
+    
+    /* Cache of recently freed large object */
+    vm_range_t         large_to_deallocate[LARGE_CACHE_SIZE];
+        // Entries that are 0 should be discarded
+    
+    /* large objects: vm_page_shift <= log2(size) < 2 *vm_page_shift */
+    unsigned           num_large_objects_in_use; // does not count the large entries in large_to_deallocate
+    unsigned           num_large_entries;
+    unsigned           num_bytes_in_large_objects;
+    large_entry_t      *large_entries;
+        // large_entries are hashed by location
+        // large_entries that are 0 should be discarded
+    
+    /* huge objects: log2(size) >= 2 *vm_page_shift */
+    unsigned           num_bytes_in_huge_objects;
+    unsigned           num_huge_entries;
+    huge_entry_t       *huge_entries;
+} szone_t;
+
+static void *szone_malloc(szone_t *szone, size_t size);
+static void *szone_valloc(szone_t *szone, size_t size);
+static INLINE void *szone_malloc_should_clear(szone_t *szone, size_t size, boolean_t cleared_requested);
+static void szone_free(szone_t *szone, void *ptr);
+static size_t szone_good_size(szone_t *szone, size_t size);
+static boolean_t szone_check_all(szone_t *szone, const char *function);
+static void szone_print(szone_t *szone, boolean_t verbose);
+static INLINE region_t *region_for_ptr_no_lock(szone_t *szone, const void *ptr);
+
+#define LOG(szone,ptr) (szone->log_address && (szone->num_small_objects > 8) && (((unsigned)szone->log_address == -1) || (szone->log_address == (void *)(ptr))))
+
+/********************* ACCESSOR MACROS ************************/
+
+#define SZONE_LOCK(szone)              LOCK(szone->lock)
+#define SZONE_UNLOCK(szone)            UNLOCK(szone->lock)
+
+#define CHECK(szone,fun)               if ((szone)->debug_flags & CHECK_REGIONS) szone_check_all(szone, fun)
+
+#define REGION_ADDRESS(region)         (region)
+#define REGION_END(region)             (region+REGION_SIZE)
+
+#define LARGE_ENTRY_ADDRESS(entry)     (((entry).address_and_num_pages >> vm_page_shift) << vm_page_shift)
+#define LARGE_ENTRY_NUM_PAGES(entry)   ((entry).address_and_num_pages & ((1 << vm_page_shift) - 1))
+#define LARGE_ENTRY_SIZE(entry)                (LARGE_ENTRY_NUM_PAGES(entry) << vm_page_shift)
+#define LARGE_ENTRY_MATCHES(entry,ptr) (!(((entry).address_and_num_pages - (unsigned)(ptr)) >> vm_page_shift))
+#define LARGE_ENTRY_IS_EMPTY(entry)    (!((entry).address_and_num_pages))
+
+/********************* VERY LOW LEVEL UTILITIES        ************************/
+
+static void szone_error(szone_t *szone, const char *msg, const void *ptr) {
+    if (szone) SZONE_UNLOCK(szone);
+    if (ptr) {
+        malloc_printf("*** malloc[%d]: error for object %p: %s\n", getpid(), ptr, msg);
+#if DEBUG_MALLOC
+        szone_print(szone, 1);
+#endif
+    } else {
+        malloc_printf("*** malloc[%d]: error: %s\n", getpid(), msg);
+    }
+#if DEBUG_CLIENT
+    malloc_printf("*** Sleeping to help debug\n");
+    sleep(3600); // to help debug
+#endif
+}
+
+static void protect(szone_t *szone, vm_address_t address, vm_size_t size, unsigned protection, unsigned debug_flags) {
+    kern_return_t      err;
+    if (!(debug_flags & SCALABLE_MALLOC_DONT_PROTECT_PRELUDE)) {
+        err = vm_protect(mach_task_self(), address - vm_page_size, vm_page_size, 0, protection);
+        if (err) malloc_printf("*** malloc[%d]: Can't protect(%x) region for prelude guard page at 0x%x\n", getpid(), protection, address - vm_page_size);
+    }
+    if (!(debug_flags & SCALABLE_MALLOC_DONT_PROTECT_POSTLUDE)) {
+        err = vm_protect(mach_task_self(), (vm_address_t)(address + size), vm_page_size, 0, protection);
+        if (err) malloc_printf("*** malloc[%d]: Can't protect(%x) region for postlude guard page at 0x%x\n", getpid(), protection, address + size);
+    }
+}
+
+static vm_address_t allocate_pages(szone_t *szone, size_t size, unsigned debug_flags, int vm_page_label) {
+    kern_return_t      err;
+    vm_address_t       addr;
+    boolean_t          add_guard_pages = debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES;
+    size_t             allocation_size = round_page(size);
+    if (!allocation_size) allocation_size = vm_page_size;
+    if (add_guard_pages) allocation_size += 2 * vm_page_size;
+    err = vm_allocate(mach_task_self(), &addr, allocation_size, vm_page_label | 1);
+    if (err) {
+        szone_error(szone, "Can't allocate region", NULL);
+        return NULL;
+    }
+    if (add_guard_pages) {
+        addr += vm_page_size;
+        protect(szone, addr, size, 0, debug_flags);
+    }
+    return addr;
+}
+
+static void deallocate_pages(szone_t *szone, vm_address_t addr, size_t size, unsigned debug_flags) {
+    kern_return_t      err;
+    boolean_t          add_guard_pages = debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES;
+    if (add_guard_pages) {
+        addr -= vm_page_size;
+        size += 2 * vm_page_size;
+    }
+    err = vm_deallocate(mach_task_self(), addr, size);
+    if (err) {
+        szone_error(szone, "Can't deallocate_pages region", (void *)addr);
+    }
+}
+
+static kern_return_t _szone_default_reader(task_t task, vm_address_t address, vm_size_t size, void **ptr) {
+    *ptr = (void *)address;
+    return 0;
+}
+
+/********************* RANGE UTILITIES ************************/
+
+static const vm_range_t zero_range = {0, 0};
+
+static vm_range_t coalesce_range(vm_range_t *ranges, unsigned count, vm_range_t range) {
+    // Given a sequence of ranges and a range, tries to find an abutting range
+    // If no, returns original range
+    // Else zeroes out coalesced range, and reapplies with coalesced range
+    unsigned           index = count;
+    vm_range_t         *current = ranges;
+    while (index--) {
+        vm_range_t     this = *current++;
+        if (!this.size) continue;
+        if (this.address + this.size == range.address) {
+            range.address = this.address;
+            range.size += this.size;
+            current[-1] = zero_range;
+            return coalesce_range(ranges, count, range);
+        }
+        if (range.address + range.size == this.address) {
+            range.size += this.size;
+            current[-1] = zero_range;
+            return coalesce_range(ranges, count, range);
+        }
+    }
+    return range;
+}
+
+static INLINE vm_range_t *first_zero_range(vm_range_t *ranges, unsigned count) {
+    // Given a sequence of ranges, find the first empty slot
+    // or returns NULL
+    while (count--) {
+        if (!ranges->size) return ranges;
+        ranges++;
+    }
+    return NULL;
+}
+
+static vm_range_t *largest_range(vm_range_t *ranges, unsigned count) {
+    // Given a sequence of ranges, find the largest range
+    // Returns NULL on empty arrays
+    vm_range_t *largest_range;
+    if (!count) return NULL;
+    largest_range = ranges;
+    count--; ranges++;
+    while (count--) {
+        if (ranges->size > largest_range->size) largest_range = ranges;
+        ranges++;
+    }
+    return largest_range;
+}
+
+static vm_range_t *first_range_greater_or_equal(vm_range_t *ranges, unsigned count, vm_size_t size) {
+    // Given a sequence of ranges, find the first range greater than range
+    // Returns NULL when none found
+    while (count--) {
+        if (ranges->size >= size) return ranges;
+        ranges++;
+    }
+    return NULL;
+}
+
+/********************* FREE LIST UTILITIES     ************************/
+
+static INLINE grain_t grain_for_msize(szone_t *szone, msize_t msize) {
+    // assumes msize >= MIN_BLOCK
+#if DEBUG_MALLOC
+    if (msize < MIN_BLOCK) {
+        szone_error(szone, "grain_for_msize: msize too small", NULL);
+    }
+#endif
+    return (msize < MAX_GRAIN + MIN_BLOCK) ? msize - MIN_BLOCK : MAX_GRAIN - 1;
+}
+
+static INLINE msize_t msize_for_grain(szone_t *szone, grain_t grain) {
+    // 0 if multiple sizes
+    return (grain < MAX_GRAIN - 1) ? grain + MIN_BLOCK : 0;
+}
+
+static INLINE void free_list_checksum(szone_t *szone, free_list_t *ptr) {
+    // We always checksum, as testing whether to do it (based on szone->debug_flags) is as fast as doing it
+    if (ptr->checksum != (((unsigned)ptr->previous) ^ ((unsigned)ptr->next) ^ CHECKSUM_MAGIC)) {
+       szone_error(szone, "Incorrect check sum for freed object - object was probably modified after beeing freed; break at szone_error", ptr);
+    }
+}
+
+static INLINE void free_list_set_checksum(szone_t *szone, free_list_t *ptr) {
+    // We always set checksum, as testing whether to do it (based on szone->debug_flags) is slower than just doing it
+    ptr->checksum = ((unsigned)ptr->previous) ^ ((unsigned)ptr->next) ^ CHECKSUM_MAGIC;
+}
+
+static void free_list_add_ptr(szone_t *szone, void *ptr, msize_t msize) {
+    // Adds an item to the proper free list
+    // Also marks the header of the block properly
+    grain_t    grain = grain_for_msize(szone, msize);
+    free_list_t        *free_ptr = ptr;
+    free_list_t        *free_head = szone->free_list[grain];
+    msize_t    *follower = (msize_t *)FOLLOWING_PTR(ptr, msize);
+#if DEBUG_MALLOC
+    if (LOG(szone,ptr)) malloc_printf("In free_list_add_ptr(), ptr=%p, msize=%d\n", ptr, msize);
+    if (((unsigned)ptr) & (QUANTUM - 1)) {
+        szone_error(szone, "free_list_add_ptr: Unaligned ptr", ptr);
+    }
+#endif
+    MSIZE_FLAGS_FOR_PTR(ptr) = msize | THIS_FREE;
+    if (free_head) {
+        free_list_checksum(szone, free_head);
+#if DEBUG_MALLOC
+        if (free_head->previous) {
+            malloc_printf("ptr=%p grain=%d free_head=%p previous=%p\n", ptr, grain, free_head, free_head->previous);
+            szone_error(szone, "free_list_add_ptr: Internal invariant broken (free_head->previous)", ptr);
+        }
+        if (!(MSIZE_FLAGS_FOR_PTR(free_head) & THIS_FREE)) {
+            malloc_printf("ptr=%p grain=%d free_head=%p\n", ptr, grain, free_head);
+            szone_error(szone, "free_list_add_ptr: Internal invariant broken (free_head is not a free pointer)", ptr);
+        }
+        if ((grain != MAX_GRAIN-1) && (MSIZE_FLAGS_FOR_PTR(free_head) != (THIS_FREE | msize))) {
+            malloc_printf("ptr=%p grain=%d free_head=%p previous_msize=%d\n", ptr, grain, free_head, MSIZE_FLAGS_FOR_PTR(free_head));
+            szone_error(szone, "free_list_add_ptr: Internal invariant broken (incorrect msize)", ptr);
+        }
+#endif
+        free_head->previous = free_ptr;
+        free_list_set_checksum(szone, free_head);
+    }
+    free_ptr->previous = NULL;
+    free_ptr->next = free_head;
+    free_list_set_checksum(szone, free_ptr);
+    szone->free_list[grain] = free_ptr;
+    // mark the end of this block
+    PREVIOUS_MSIZE(follower) = msize;
+    MSIZE_FLAGS_FOR_PTR(follower) |= PREV_FREE;
+}
+
+static void free_list_remove_ptr(szone_t *szone, void *ptr, msize_t msize) {
+    // Removes item in the proper free list
+    // msize could be read, but all callers have it so we pass it in
+    grain_t    grain = grain_for_msize(szone, msize);
+    free_list_t        *free_ptr = ptr;
+    free_list_t        *next = free_ptr->next;
+    free_list_t        *previous = free_ptr->previous;
+#if DEBUG_MALLOC
+    if (LOG(szone,ptr)) malloc_printf("In free_list_remove_ptr(), ptr=%p, msize=%d\n", ptr, msize);
+#endif
+    free_list_checksum(szone, free_ptr);
+    if (!previous) {
+#if DEBUG_MALLOC
+        if (szone->free_list[grain] != ptr) {
+            malloc_printf("ptr=%p grain=%d msize=%d szone->free_list[grain]=%p\n", ptr, grain, msize, szone->free_list[grain]);
+            szone_error(szone, "free_list_remove_ptr: Internal invariant broken (szone->free_list[grain])", ptr);
+            return;
+        }
+#endif
+        szone->free_list[grain] = next;
+    } else {
+        previous->next = next;
+        free_list_set_checksum(szone, previous);
+    }
+    if (next) {
+        next->previous = previous;
+        free_list_set_checksum(szone, next);
+    }
+    MSIZE_FLAGS_FOR_PTR(FOLLOWING_PTR(ptr, msize)) &= ~ PREV_FREE;
+}
+
+static boolean_t free_list_check(szone_t *szone, grain_t grain) {
+    unsigned   count = 0;
+    free_list_t        *ptr = szone->free_list[grain];
+    free_list_t        *previous = NULL;
+    while (ptr) {
+        msize_t        msize_and_free = MSIZE_FLAGS_FOR_PTR(ptr);
+        count++;
+        if (!(msize_and_free & THIS_FREE)) {
+            malloc_printf("*** malloc[%d]: In-use ptr in free list grain=%d count=%d ptr=%p\n", getpid(), grain, count, ptr);
+            return 0;
+        }
+        if (((unsigned)ptr) & (QUANTUM - 1)) {
+            malloc_printf("*** malloc[%d]: Unaligned ptr in free list grain=%d  count=%d ptr=%p\n", getpid(), grain, count, ptr);
+            return 0;
+        }
+        if (!region_for_ptr_no_lock(szone, ptr)) {
+            malloc_printf("*** malloc[%d]: Ptr not in szone grain=%d  count=%d ptr=%p\n", getpid(), grain, count, ptr);
+            return 0;
+        }
+        free_list_checksum(szone, ptr);
+        if (ptr->previous != previous) {
+            malloc_printf("*** malloc[%d]: Previous incorrectly set grain=%d  count=%d ptr=%p\n", getpid(), grain, count, ptr);
+            return 0;
+        }
+        if ((grain != MAX_GRAIN-1) && (msize_and_free != (msize_for_grain(szone, grain) | THIS_FREE))) {
+            malloc_printf("*** malloc[%d]: Incorrect msize for grain=%d  count=%d ptr=%p msize=%d\n", getpid(), grain, count, ptr, msize_and_free);
+            return 0;
+        }
+        previous = ptr;
+        ptr = ptr->next;
+    }
+    return 1;
+}
+
+/********************* SMALL BLOCKS MANAGEMENT ************************/
+
+static INLINE region_t *region_for_ptr_no_lock(szone_t *szone, const void *ptr) {
+    region_t           *first_region = szone->regions;
+    region_t           *region = first_region + szone->last_region_hit;
+    region_t           this = *region;
+    if ((unsigned)ptr - (unsigned)REGION_ADDRESS(this) < (unsigned)REGION_SIZE) {
+        return region;
+    } else {
+        // We iterate in reverse order becase last regions are more likely
+        region = first_region + szone->num_regions;
+        while (region != first_region) {
+            this = *(--region);
+            if ((unsigned)ptr - (unsigned)REGION_ADDRESS(this) < (unsigned)REGION_SIZE) {
+                szone->last_region_hit = region - first_region;
+                return region;
+            }
+        }
+        return NULL;
+    }
+}
+
+static INLINE void small_free_no_lock(szone_t *szone, region_t *region, void *ptr, msize_t msize_and_free) {
+    msize_t    msize = msize_and_free & ~ PREV_FREE;
+    size_t     original_size = msize << SHIFT_QUANTUM;
+    void       *next_block = ((char *)ptr + original_size);
+    msize_t    next_msize_and_free;
+#if DEBUG_MALLOC
+    if (LOG(szone,ptr)) malloc_printf("In small_free_no_lock(), ptr=%p, msize=%d\n", ptr, msize);
+    if (msize < MIN_BLOCK) {
+        malloc_printf("In small_free_no_lock(), ptr=%p, msize=%d\n", ptr, msize);
+        szone_error(szone, "Trying to free small block that is too small", ptr);
+    }
+#endif
+    if (((vm_address_t)next_block < REGION_END(*region)) && ((next_msize_and_free = MSIZE_FLAGS_FOR_PTR(next_block)) & THIS_FREE)) {
+        // If the next block is free, we coalesce
+        msize_t        next_msize = next_msize_and_free & ~THIS_FREE;
+        if (LOG(szone,ptr)) malloc_printf("In small_free_no_lock(), for ptr=%p, msize=%d coalesced next block=%p next_msize=%d\n", ptr, msize, next_block, next_msize);
+        free_list_remove_ptr(szone, next_block, next_msize);
+        msize += next_msize;
+    }
+    // Let's try to coalesce backwards now
+    if (msize_and_free & PREV_FREE) {
+        msize_t        previous_msize = PREVIOUS_MSIZE(ptr);
+        void   *previous = ptr - (previous_msize << SHIFT_QUANTUM);
+#if DEBUG_MALLOC
+        if (LOG(szone,previous)) malloc_printf("In small_free_no_lock(), coalesced backwards for %p previous=%p, msize=%d\n", ptr, previous, previous_msize);
+        if (!previous_msize || (previous_msize >= (((vm_address_t)ptr - REGION_ADDRESS(*region)) >> SHIFT_QUANTUM))) {
+            szone_error(szone, "Invariant 1 broken when coalescing backwards", ptr);
+        }
+        if (MSIZE_FLAGS_FOR_PTR(previous) != (previous_msize | THIS_FREE)) {
+            malloc_printf("previous=%p its_msize_and_free=0x%x previous_msize=%d\n", previous, MSIZE_FLAGS_FOR_PTR(previous), previous_msize);
+            szone_error(szone, "Invariant 3 broken when coalescing backwards", ptr);
+        }
+#endif
+        free_list_remove_ptr(szone, previous, previous_msize);
+        ptr = previous;
+        msize += previous_msize;
+#if DEBUG_MALLOC
+       if (msize & PREV_FREE) {
+           malloc_printf("In small_free_no_lock(), after coalescing with previous ptr=%p, msize=%d previous_msize=%d\n", ptr, msize, previous_msize);
+           szone_error(szone, "Incorrect coalescing", ptr);
+       }
+#endif 
+    }
+    if (szone->debug_flags & SCALABLE_MALLOC_DO_SCRIBBLE) {
+       if (!msize) {
+           szone_error(szone, "Incorrect size information - block header was damaged", ptr);
+       } else {
+           memset(ptr, 0x55, (msize << SHIFT_QUANTUM) - PTR_HEADER_SIZE);
+       }
+    }
+    free_list_add_ptr(szone, ptr, msize);
+    CHECK(szone, "small_free_no_lock: added to free list");
+    szone->num_small_objects--;
+    szone->num_bytes_in_small_objects -= original_size; // we use original_size and not msize to avoid double counting the coalesced blocks
+}
+
+static void *small_malloc_from_region_no_lock(szone_t *szone, msize_t msize) {
+    // Allocates from the last region or a freshly allocated region
+    region_t           *last_region = szone->regions + szone->num_regions - 1;
+    vm_address_t       new_address;
+    void               *ptr;
+    msize_t            msize_and_free;
+    unsigned           region_capacity;
+    ptr = (void *)(REGION_END(*last_region) - szone->num_bytes_free_in_last_region + PTR_HEADER_SIZE);
+#if DEBUG_MALLOC
+    if (((vm_address_t)ptr) & (QUANTUM - 1)) {
+        szone_error(szone, "Invariant broken while using end of region", ptr);
+    }
+#endif
+    msize_and_free = MSIZE_FLAGS_FOR_PTR(ptr);
+#if DEBUG_MALLOC
+    if (msize_and_free != PREV_FREE && msize_and_free != 0) {
+        malloc_printf("*** malloc[%d]: msize_and_free = %d\n", getpid(), msize_and_free);
+        szone_error(szone, "Invariant broken when allocating at end of zone", ptr);
+    }
+#endif
+    // In order to make sure we don't have 2 free pointers following themselves, if the last item is a free item, we combine it and clear it
+    if (msize_and_free == PREV_FREE) {
+        msize_t                previous_msize = PREVIOUS_MSIZE(ptr);
+        void           *previous = ptr - (previous_msize << SHIFT_QUANTUM);
+#if DEBUG_MALLOC
+        if (LOG(szone, ptr)) malloc_printf("Combining last with free space at %p\n", ptr);
+        if (!previous_msize || (previous_msize >= (((vm_address_t)ptr - REGION_ADDRESS(*last_region)) >> SHIFT_QUANTUM)) || (MSIZE_FLAGS_FOR_PTR(previous) != (previous_msize | THIS_FREE))) {
+            szone_error(szone, "Invariant broken when coalescing backwards at end of zone", ptr);
+        }
+#endif
+        free_list_remove_ptr(szone, previous, previous_msize);
+        szone->num_bytes_free_in_last_region += previous_msize << SHIFT_QUANTUM;
+        memset(previous, 0, previous_msize << SHIFT_QUANTUM);
+        MSIZE_FLAGS_FOR_PTR(previous) = 0;
+        ptr = previous;
+    }
+    // first try at the end of the last region
+    CHECK(szone, __PRETTY_FUNCTION__);
+    if (szone->num_bytes_free_in_last_region >= (msize << SHIFT_QUANTUM)) {
+        szone->num_bytes_free_in_last_region -= (msize << SHIFT_QUANTUM);
+        szone->num_small_objects++;
+        szone->num_bytes_in_small_objects += msize << SHIFT_QUANTUM;
+        MSIZE_FLAGS_FOR_PTR(ptr) = msize;
+        return ptr;
+    }
+    // time to create a new region
+    new_address = allocate_pages(szone, REGION_SIZE, 0, VM_MAKE_TAG(VM_MEMORY_MALLOC_SMALL));
+    if (!new_address) {
+        // out of memory!
+        return NULL;
+    }
+    // let's prepare to free the remnants of last_region
+    if (szone->num_bytes_free_in_last_region >= QUANTUM) {
+        msize_t        this_msize = szone->num_bytes_free_in_last_region >> SHIFT_QUANTUM;
+        // malloc_printf("Entering last block %p size=%d\n", ptr, this_msize << SHIFT_QUANTUM);
+        if (this_msize >= MIN_BLOCK) {
+            free_list_add_ptr(szone, ptr, this_msize);
+        } else {
+            // malloc_printf("Leaking last block at %p\n", ptr);
+        }
+        szone->num_bytes_free_in_last_region -= this_msize << SHIFT_QUANTUM; // to avoid coming back here
+    }
+    last_region[1] = new_address;
+    szone->num_regions++;
+    szone->num_bytes_free_in_last_region = REGION_SIZE - QUANTUM + PTR_HEADER_SIZE - (msize << SHIFT_QUANTUM);
+    ptr = (void *)(new_address + QUANTUM); // waste the first bytes
+    region_capacity = (MSIZE_FLAGS_FOR_PTR(szone->regions) * QUANTUM - PTR_HEADER_SIZE) / sizeof(region_t);
+    if (szone->num_regions >= region_capacity) {
+        unsigned       new_capacity = region_capacity * 2 + 1;
+        msize_t                new_msize = (new_capacity * sizeof(region_t) + PTR_HEADER_SIZE + QUANTUM - 1) / QUANTUM;
+        region_t       *new_regions = ptr;
+        // malloc_printf("Now %d regions growing regions %p to %d\n", szone->num_regions, szone->regions, new_capacity);
+        MSIZE_FLAGS_FOR_PTR(new_regions) = new_msize;
+        szone->num_small_objects++;
+        szone->num_bytes_in_small_objects += new_msize << SHIFT_QUANTUM;
+        memcpy(new_regions, szone->regions, szone->num_regions * sizeof(region_t));
+        // We intentionally leak the previous regions pointer to avoid multi-threading crashes if another thread was reading it (unlocked) while we are changing it
+        // Given that in practise the number of regions is typically a handful, this should not be a big deal
+        szone->regions = new_regions;
+        ptr += (new_msize << SHIFT_QUANTUM);
+        szone->num_bytes_free_in_last_region -= (new_msize << SHIFT_QUANTUM);
+        // malloc_printf("Regions is now %p next ptr is %p\n", szone->regions, ptr);
+    }
+    szone->num_small_objects++;
+    szone->num_bytes_in_small_objects += msize << SHIFT_QUANTUM;
+    MSIZE_FLAGS_FOR_PTR(ptr) = msize;
+    return ptr;
+}
+
+static boolean_t szone_check_region(szone_t *szone, region_t *region) {
+    void               *ptr = (void *)REGION_ADDRESS(*region) + QUANTUM;
+    vm_address_t       region_end = REGION_END(*region);
+    int                        is_last_region = region == szone->regions + szone->num_regions - 1;
+    msize_t            prev_free = 0;
+    while ((vm_address_t)ptr < region_end) {
+        msize_t                msize_and_free = MSIZE_FLAGS_FOR_PTR(ptr);
+        if (!(msize_and_free & THIS_FREE)) {
+            msize_t    msize = msize_and_free & ~PREV_FREE;
+            if ((msize_and_free & PREV_FREE) != prev_free) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p (prev_free=%d) this msize=%d\n", getpid(), ptr, prev_free, msize_and_free);
+                return 0;
+            }
+            if (!msize) {
+                int    extra = (is_last_region) ? szone->num_bytes_free_in_last_region : QUANTUM;
+                if (((unsigned)(ptr + extra)) < region_end) {
+                    malloc_printf("*** malloc[%d]: invariant broken at region end: ptr=%p extra=%d index=%d num_regions=%d end=%p\n", getpid(), ptr, extra, region - szone->regions, szone->num_regions, (void *)region_end);
+                    return 0;
+                }
+                break; // last encountered
+            }
+           if (msize > (LARGE_THRESHOLD / QUANTUM)) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p this msize=%d - size is too large\n", getpid(), ptr, msize_and_free);
+                return 0;
+            }
+            if ((msize < MIN_BLOCK) && ((unsigned)ptr != region_end - QUANTUM)) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p this msize=%d - size is too small\n", getpid(), ptr, msize_and_free);
+                return 0;
+            }
+            ptr += msize << SHIFT_QUANTUM;
+            prev_free = 0;
+           if (is_last_region && ((vm_address_t)ptr - PTR_HEADER_SIZE > region_end - szone->num_bytes_free_in_last_region)) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p this msize=%d - block extends beyond allocated region\n", getpid(), ptr, msize_and_free);
+           }
+        } else {
+            // free pointer
+            msize_t    msize = msize_and_free & ~THIS_FREE;
+            free_list_t        *free_head = ptr;
+            msize_t    *follower = (void *)FOLLOWING_PTR(ptr, msize);
+           if ((msize_and_free & PREV_FREE) && !prev_free) {
+                malloc_printf("*** malloc[%d]: invariant broken for free block %p this msize=%d: PREV_FREE set while previous block is in use\n", getpid(), ptr, msize);
+                return 0;
+           }
+            if (msize < MIN_BLOCK) {
+                malloc_printf("*** malloc[%d]: invariant broken for free block %p this msize=%d\n", getpid(), ptr, msize);
+                return 0;
+            }
+            if (prev_free) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p (2 free in a row)\n", getpid(), ptr);
+                return 0;
+            }
+            free_list_checksum(szone, free_head);
+            if (free_head->previous && !(MSIZE_FLAGS_FOR_PTR(free_head->previous) & THIS_FREE)) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p (previous %p is not a free pointer)\n", getpid(), ptr, free_head->previous);
+                return 0;
+            }
+            if (free_head->next && !(MSIZE_FLAGS_FOR_PTR(free_head->next) & THIS_FREE)) {
+                malloc_printf("*** malloc[%d]: invariant broken for %p (next is not a free pointer)\n", getpid(), ptr);
+                return 0;
+            }
+            if (PREVIOUS_MSIZE(follower) != msize) {
+                malloc_printf("*** malloc[%d]: invariant broken for free %p followed by %p in region [%x-%x] (end marker incorrect) should be %d; in fact %d\n", getpid(), ptr, follower, REGION_ADDRESS(*region), region_end, msize, PREVIOUS_MSIZE(follower));
+                return 0;
+            }
+            ptr = follower;
+            prev_free = PREV_FREE;
+        }
+    }
+    return 1;
+}
+
+static kern_return_t small_in_use_enumerator(task_t task, void *context, unsigned type_mask, vm_address_t region_address, unsigned num_regions, memory_reader_t reader, vm_range_recorder_t recorder) {
+    region_t           *regions;
+    unsigned           index = 0;
+    vm_range_t         buffer[MAX_RECORDER_BUFFER];
+    unsigned           count = 0;
+    kern_return_t      err;
+    err = reader(task, region_address, sizeof(region_t) * num_regions, (void **)&regions);
+    if (err) return err;
+    while (index < num_regions) {
+        region_t       region = regions[index++];
+        vm_range_t     range = {REGION_ADDRESS(region), REGION_SIZE};
+        vm_address_t   start = range.address + QUANTUM;
+        // malloc_printf("Enumerating small ptrs for Region starting at 0x%x\n", start);
+        if (type_mask & MALLOC_PTR_REGION_RANGE_TYPE) recorder(task, context, MALLOC_PTR_REGION_RANGE_TYPE, &range, 1);
+        if (type_mask & MALLOC_PTR_IN_USE_RANGE_TYPE) while (start < range.address + range.size) {
+            void       *previous;
+            msize_t    msize_and_free;
+            err = reader(task, start - PTR_HEADER_SIZE, QUANTUM, (void **)&previous);
+            if (err) return err;
+            previous += PTR_HEADER_SIZE;
+            msize_and_free = MSIZE_FLAGS_FOR_PTR(previous);
+            if (!(msize_and_free & THIS_FREE)) {
+                // Block in use
+                msize_t                msize = msize_and_free & ~PREV_FREE;
+                if (!msize) break; // last encountered
+                buffer[count].address = start;
+                buffer[count].size = (msize << SHIFT_QUANTUM) - PTR_HEADER_SIZE;
+                count++;
+                if (count >= MAX_RECORDER_BUFFER) {
+                    recorder(task, context, MALLOC_PTR_IN_USE_RANGE_TYPE, buffer, count);
+                    count = 0;
+                }
+                start += msize << SHIFT_QUANTUM;
+            } else {
+                // free pointer
+                msize_t        msize = msize_and_free & ~THIS_FREE;
+                start += msize << SHIFT_QUANTUM;
+            }
+        }
+        // malloc_printf("End region - count=%d\n", count);
+    }
+    if (count) recorder(task, context, MALLOC_PTR_IN_USE_RANGE_TYPE, buffer, count);
+    return 0;
+}
+
+static INLINE void *small_malloc_from_free_list(szone_t *szone, msize_t msize, boolean_t *locked) {
+    void       *ptr;
+    msize_t    this_msize;
+    free_list_t        **free_list;
+    free_list_t        **limit = szone->free_list + MAX_GRAIN - 1;
+    // first try the small grains
+    free_list = szone->free_list + grain_for_msize(szone, msize);
+    while (free_list < limit) {
+        // try bigger grains
+        ptr = *free_list;
+        if (ptr) {
+            if (!*locked) { *locked = 1; SZONE_LOCK(szone); CHECK(szone, __PRETTY_FUNCTION__); }
+            ptr = *free_list;
+            if (ptr) {
+                // optimistic test worked
+                free_list_t    *next;
+                next = ((free_list_t *)ptr)->next;
+                if (next) {
+                    next->previous = NULL;
+                    free_list_set_checksum(szone, next);
+                }
+                *free_list = next;
+                this_msize = MSIZE_FLAGS_FOR_PTR(ptr) & ~THIS_FREE;
+                MSIZE_FLAGS_FOR_PTR(FOLLOWING_PTR(ptr, this_msize)) &= ~ PREV_FREE;
+                goto add_leftover_and_proceed;
+            }
+        }
+        free_list++;
+    }
+    // We now check the large grains for one that is big enough
+    if (!*locked) { *locked = 1; SZONE_LOCK(szone); CHECK(szone, __PRETTY_FUNCTION__); }
+    ptr = *free_list;
+    while (ptr) {
+        this_msize = MSIZE_FLAGS_FOR_PTR(ptr) & ~THIS_FREE;
+        if (this_msize >= msize) {
+            free_list_remove_ptr(szone, ptr, this_msize);
+            goto add_leftover_and_proceed;
+        }
+        ptr = ((free_list_t *)ptr)->next;
+    }
+    return NULL;
+add_leftover_and_proceed:
+    if (this_msize >= msize + MIN_BLOCK) {
+        if (LOG(szone,ptr)) malloc_printf("In small_malloc_should_clear(), adding leftover ptr=%p, this_msize=%d\n", ptr, this_msize);
+        free_list_add_ptr(szone, ptr + (msize << SHIFT_QUANTUM), this_msize - msize);
+        this_msize = msize;
+    }
+    szone->num_small_objects++;
+    szone->num_bytes_in_small_objects += this_msize << SHIFT_QUANTUM;
+#if DEBUG_MALLOC
+    if (LOG(szone,ptr)) malloc_printf("In small_malloc_should_clear(), ptr=%p, this_msize=%d, msize=%d\n", ptr, this_msize, msize);
+#endif
+    MSIZE_FLAGS_FOR_PTR(ptr) = this_msize;
+    return ptr;
+}
+
+static INLINE void *small_malloc_should_clear(szone_t *szone, msize_t msize, boolean_t cleared_requested) {
+    boolean_t  locked = 0;
+    void       *ptr;
+#if DEBUG_MALLOC
+    if (! (msize & 0xffff)) {
+        szone_error(szone, "Invariant broken (!msize) in allocation (region)", NULL);
+    }
+    if (msize < MIN_BLOCK) {
+        szone_error(szone, "Invariant broken (msize too small) in allocation (region)", NULL);
+    }
+#endif
+    ptr = small_malloc_from_free_list(szone, msize, &locked);
+    if (ptr) {
+        CHECK(szone, __PRETTY_FUNCTION__);
+        SZONE_UNLOCK(szone);
+        if (cleared_requested) memset(ptr, 0, (msize << SHIFT_QUANTUM) - PTR_HEADER_SIZE);
+        return ptr;
+    } else {
+        if (!locked) SZONE_LOCK(szone);
+        CHECK(szone, __PRETTY_FUNCTION__);
+        ptr = small_malloc_from_region_no_lock(szone, msize);
+        // we don't clear because this freshly allocated space is pristine
+        CHECK(szone, __PRETTY_FUNCTION__);
+        SZONE_UNLOCK(szone);
+    }
+    return ptr;
+}
+
+static INLINE void *small_malloc_cleared_no_lock(szone_t *szone, msize_t msize) {
+    // tries to allocate a small, cleared block
+    boolean_t  locked = 1;
+    void       *ptr;
+    ptr = small_malloc_from_free_list(szone, msize, &locked);
+    if (ptr) {
+        memset(ptr, 0, (msize << SHIFT_QUANTUM) - PTR_HEADER_SIZE);
+        return ptr;
+    } else {
+        ptr = small_malloc_from_region_no_lock(szone, msize);
+        // we don't clear because this freshly allocated space is pristine
+    }
+    return ptr;
+}
+
+/********************* LARGE ENTRY UTILITIES   ************************/
+
+#if DEBUG_MALLOC
+
+static void large_cache_debug_print(szone_t *szone) {
+    unsigned   index = LARGE_CACHE_SIZE;
+    malloc_printf("Cache to be dealloced: ");
+    while (index--) {
+        vm_range_t     range = szone->large_to_deallocate[index];
+        if (range.size) malloc_printf("0x%x(%dKB) ", range.address, range.size/1024);
+    }
+    malloc_printf("\n");
+}
+
+static void large_debug_print(szone_t *szone) {
+    unsigned   num_large_entries = szone->num_large_entries;
+    unsigned   index = num_large_entries;
+    while (index--) {
+        large_entry_t  *range = szone->large_entries + index;
+        large_entry_t  entry = *range;
+        if (!LARGE_ENTRY_IS_EMPTY(entry)) malloc_printf("%d: 0x%x(%dKB);  ", index, LARGE_ENTRY_ADDRESS(entry), LARGE_ENTRY_SIZE(entry)/1024);
+    }
+    malloc_printf("\n");
+}
+#endif
+
+static large_entry_t *large_entry_for_pointer_no_lock(szone_t *szone, const void *ptr) {
+    // result only valid during a lock
+    unsigned   num_large_entries = szone->num_large_entries;
+    unsigned   hash_index;
+    unsigned   index;
+    if (!num_large_entries) return NULL;
+    hash_index = ((unsigned)ptr >> vm_page_shift) % num_large_entries;
+    index = hash_index;
+    do {
+        large_entry_t  *range = szone->large_entries + index;
+        large_entry_t  entry = *range;
+        if (LARGE_ENTRY_MATCHES(entry, ptr)) return range;
+        if (LARGE_ENTRY_IS_EMPTY(entry)) return NULL; // end of chain
+        index++; if (index == num_large_entries) index = 0;
+    } while (index != hash_index);
+    return NULL;
+}
+
+static void large_entry_insert_no_lock(szone_t *szone, large_entry_t range) {
+    unsigned   num_large_entries = szone->num_large_entries;
+    unsigned   hash_index = (range.address_and_num_pages >> vm_page_shift) % num_large_entries;
+    unsigned   index = hash_index;
+    // malloc_printf("Before insertion of 0x%x\n", LARGE_ENTRY_ADDRESS(range));
+    do {
+        large_entry_t  *entry = szone->large_entries + index;
+        if (LARGE_ENTRY_IS_EMPTY(*entry)) {
+            *entry = range;
+            return; // end of chain
+        }
+        index++; if (index == num_large_entries) index = 0;
+    } while (index != hash_index);
+}
+
+static INLINE void large_entries_rehash_after_entry_no_lock(szone_t *szone, large_entry_t *entry) {
+    unsigned   num_large_entries = szone->num_large_entries;
+    unsigned   hash_index = entry - szone->large_entries;
+    unsigned   index = hash_index;
+    do {
+        large_entry_t  range;
+        index++; if (index == num_large_entries) index = 0;
+        range = szone->large_entries[index];
+        if (LARGE_ENTRY_IS_EMPTY(range)) return;
+        szone->large_entries[index].address_and_num_pages = 0;
+        large_entry_insert_no_lock(szone, range); // this will reinsert in the proper place
+    } while (index != hash_index);
+}
+
+static INLINE large_entry_t *large_entries_alloc_no_lock(szone_t *szone, unsigned num) {
+    size_t     size = num * sizeof(large_entry_t);
+    boolean_t  is_vm_allocation = size >= LARGE_THRESHOLD;
+    if (is_vm_allocation) {
+        return (void *)allocate_pages(szone, round_page(size), 0, VM_MAKE_TAG(VM_MEMORY_MALLOC_LARGE));
+    } else {
+        return small_malloc_cleared_no_lock(szone, (size + PTR_HEADER_SIZE + QUANTUM - 1) >> SHIFT_QUANTUM);
+    }
+}
+
+static void large_entries_free_no_lock(szone_t *szone, large_entry_t *entries, unsigned num) {
+    size_t     size = num * sizeof(large_entry_t);
+    boolean_t  is_vm_allocation = size >= LARGE_THRESHOLD;
+    if (is_vm_allocation) {
+        deallocate_pages(szone, (vm_address_t)entries, round_page(size), 0);
+    } else {
+        region_t       *region = region_for_ptr_no_lock(szone, entries);
+        msize_t                msize_and_free = MSIZE_FLAGS_FOR_PTR(entries);
+        if (msize_and_free & THIS_FREE) {
+            szone_error(szone, "Object already freed being freed", entries);
+            return;
+        }
+        small_free_no_lock(szone, region, entries, msize_and_free);
+    }
+}
+
+static void large_entries_grow_no_lock(szone_t *szone) {
+    unsigned           old_num_entries = szone->num_large_entries;
+    large_entry_t      *old_entries = szone->large_entries;
+    unsigned           new_num_entries = (old_num_entries) ? old_num_entries * 2 + 1 : 15; // always an odd number for good hashing
+    large_entry_t      *new_entries = large_entries_alloc_no_lock(szone, new_num_entries);
+    unsigned           index = old_num_entries;
+    szone->num_large_entries = new_num_entries;
+    szone->large_entries = new_entries;
+    // malloc_printf("_grow_large_entries old_num_entries=%d new_num_entries=%d\n", old_num_entries, new_num_entries);
+    while (index--) {
+        large_entry_t  oldRange = old_entries[index];
+        if (!LARGE_ENTRY_IS_EMPTY(oldRange)) large_entry_insert_no_lock(szone, oldRange);
+    }
+    if (old_entries) large_entries_free_no_lock(szone, old_entries, old_num_entries);
+}
+
+static vm_range_t large_free_no_lock(szone_t *szone, large_entry_t *entry) {
+    // enters the specified large entry into the cache of freed entries
+    // returns a range to truly deallocate
+    vm_range_t         vm_range_to_deallocate;
+    vm_range_t         range;
+    vm_range_t         *range_to_use;
+    range.address = LARGE_ENTRY_ADDRESS(*entry);
+    range.size = LARGE_ENTRY_SIZE(*entry);
+    szone->num_large_objects_in_use --;
+    szone->num_bytes_in_large_objects -= range.size;
+    if (szone->debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES) {
+        protect(szone, range.address, range.size, VM_PROT_READ | VM_PROT_WRITE, szone->debug_flags);
+        range.address -= vm_page_size;
+        range.size += 2 * vm_page_size;
+    }
+    // printf("Entry is 0x%x=%d; cache is 0x%x ; found=0x%x\n", entry, entry-szone->large_entries, szone->large_entries, large_entry_for_pointer_no_lock(szone, (void *)range.address));
+    entry->address_and_num_pages = 0;
+    large_entries_rehash_after_entry_no_lock(szone, entry);
+#if DEBUG_MALLOC
+    if (large_entry_for_pointer_no_lock(szone, (void *)range.address)) {
+        malloc_printf("*** malloc[%d]: Freed entry 0x%x still in use; num_large_entries=%d\n", getpid(), range.address, szone->num_large_entries);
+        large_cache_debug_print(szone);
+        large_debug_print(szone);
+        sleep(3600);
+    }
+#endif
+    range = coalesce_range(szone->large_to_deallocate, LARGE_CACHE_SIZE, range);
+    range_to_use = first_zero_range(szone->large_to_deallocate, LARGE_CACHE_SIZE);
+    if (range_to_use) {
+        // we fill an empty slot
+        *range_to_use = range;
+        return zero_range;
+    }
+    // we always try to deallocate the largest chunk
+    range_to_use = largest_range(szone->large_to_deallocate, LARGE_CACHE_SIZE);
+    if (!range_to_use) return range;
+    vm_range_to_deallocate = *range_to_use;
+    *range_to_use = range;
+    return vm_range_to_deallocate;
+}
+
+static kern_return_t large_in_use_enumerator(task_t task, void *context, unsigned type_mask, vm_address_t large_entries_address, unsigned num_entries, memory_reader_t reader, vm_range_recorder_t recorder) {
+    unsigned           index = 0;
+    vm_range_t         buffer[MAX_RECORDER_BUFFER];
+    unsigned           count = 0;
+    large_entry_t      *entries;
+    kern_return_t      err;
+    err = reader(task, large_entries_address, sizeof(large_entry_t) * num_entries, (void **)&entries);
+    if (err) return err;
+    index = num_entries;
+    if ((type_mask & MALLOC_ADMIN_REGION_RANGE_TYPE) && (num_entries * sizeof(large_entry_t) >= LARGE_THRESHOLD)) {
+        vm_range_t     range;
+        range.address = large_entries_address;
+        range.size = round_page(num_entries * sizeof(large_entry_t));
+        recorder(task, context, MALLOC_ADMIN_REGION_RANGE_TYPE, &range, 1);
+    }
+    if (type_mask & (MALLOC_PTR_IN_USE_RANGE_TYPE | MALLOC_PTR_REGION_RANGE_TYPE)) while (index--) {
+        large_entry_t  entry = entries[index];
+        if (!LARGE_ENTRY_IS_EMPTY(entry)) {
+            vm_range_t range;
+            range.address = LARGE_ENTRY_ADDRESS(entry);
+            range.size = LARGE_ENTRY_SIZE(entry);
+            buffer[count++] = range;
+            if (count >= MAX_RECORDER_BUFFER) {
+                recorder(task, context, MALLOC_PTR_IN_USE_RANGE_TYPE | MALLOC_PTR_REGION_RANGE_TYPE, buffer, count);
+                count = 0;
+            }
+        }
+    }
+    if (count) recorder(task, context, MALLOC_PTR_IN_USE_RANGE_TYPE | MALLOC_PTR_REGION_RANGE_TYPE, buffer, count);
+    return 0;
+}
+
+/********************* HUGE ENTRY UTILITIES    ************************/
+
+static huge_entry_t *huge_entry_for_pointer_no_lock(szone_t *szone, const void *ptr) {
+    unsigned   index = szone->num_huge_entries;
+    while (index--) {
+        huge_entry_t   *huge = szone->huge_entries + index;
+        if (huge->address == (vm_address_t)ptr) return huge;
+    }
+    return NULL;
+}
+
+static void huge_entry_append(szone_t *szone, huge_entry_t huge) {
+    // We do a little dance with locking because doing allocation (even in the default szone) may cause something to get freed in this szone, with a deadlock
+    huge_entry_t       *new_huge_entries = NULL;
+    SZONE_LOCK(szone);
+    while (1) {
+        unsigned       num_huge_entries;
+        num_huge_entries = szone->num_huge_entries;
+        SZONE_UNLOCK(szone);
+        // malloc_printf("In huge_entry_append currentEntries=%d\n", num_huge_entries);
+        if (new_huge_entries) szone_free(szone, new_huge_entries);
+        new_huge_entries = szone_malloc(szone, (num_huge_entries + 1) * sizeof(huge_entry_t));
+        SZONE_LOCK(szone);
+        if (num_huge_entries == szone->num_huge_entries) {
+            // No change - our malloc still applies
+            huge_entry_t       *old_huge_entries = szone->huge_entries;
+            if (num_huge_entries) memcpy(new_huge_entries, old_huge_entries, num_huge_entries * sizeof(huge_entry_t));
+            new_huge_entries[szone->num_huge_entries++] = huge;
+            szone->huge_entries = new_huge_entries;
+            SZONE_UNLOCK(szone);
+            szone_free(szone, old_huge_entries);
+            // malloc_printf("Done huge_entry_append now=%d\n", szone->num_huge_entries);
+            return;
+        }
+        // try again!
+    }
+}
+
+static kern_return_t huge_in_use_enumerator(task_t task, void *context, unsigned type_mask, vm_address_t huge_entries_address, unsigned num_entries, memory_reader_t reader, vm_range_recorder_t recorder) {
+    huge_entry_t       *entries;
+    kern_return_t      err;
+    err = reader(task, huge_entries_address, sizeof(huge_entry_t) * num_entries, (void **)&entries);
+    if (err) return err;
+    if (num_entries) recorder(task, context, MALLOC_PTR_IN_USE_RANGE_TYPE | MALLOC_PTR_REGION_RANGE_TYPE, entries, num_entries);
+    return 0;
+}
+
+static void *large_and_huge_malloc(szone_t *szone, unsigned num_pages, boolean_t cleared_requested) {
+    vm_address_t       addr = 0;
+    boolean_t          cleared_needed = 0; // by default blocks will be freshly allocated and therefore no need to clean them
+    if (!num_pages) num_pages = 1; // minimal allocation size for this szone
+    // malloc_printf("In large_and_huge_malloc for %dKB\n", num_pages * vm_page_size / 1024);
+    if (num_pages >= (1 << vm_page_shift)) {
+        huge_entry_t   huge;
+        huge.size = num_pages << vm_page_shift;
+        addr = allocate_pages(szone, huge.size, szone->debug_flags, VM_MAKE_TAG(VM_MEMORY_MALLOC_HUGE));
+        if (!addr) return NULL;
+        huge.address = addr;
+        huge_entry_append(szone, huge);
+        SZONE_LOCK(szone);
+        szone->num_bytes_in_huge_objects += huge.size;
+    } else {
+        vm_size_t              size = num_pages << vm_page_shift;
+        large_entry_t          entry;
+       boolean_t               add_guard_pages = szone->debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES;
+       vm_size_t               guard_pages = (add_guard_pages) ? 2 * vm_page_size : 0;
+       vm_range_t              *range_to_use;
+       cleared_needed = cleared_requested; // in the "large" case set by default
+        SZONE_LOCK(szone);
+        // First check in the list large_to_deallocate if we can reuse
+        // malloc_printf("In szone_malloc checking recently deallocated\n");
+       range_to_use = first_range_greater_or_equal(szone->large_to_deallocate, LARGE_CACHE_SIZE, size + guard_pages);
+       if (range_to_use) {
+           // that one will do!
+           addr = range_to_use->address + ((add_guard_pages) ? vm_page_size : 0);
+           if (add_guard_pages) protect(szone, addr, size, 0, szone->debug_flags);
+           // malloc_printf("In szone_malloc found recently deallocated at 0x%x for %d pages\n", addr, num_pages);
+           if (range_to_use->size == size + guard_pages) {
+               *range_to_use = zero_range;
+           } else {
+               range_to_use->address += size + guard_pages;
+               range_to_use->size -= size + guard_pages;
+           }
+#if DEBUG_MALLOC
+           if (large_entry_for_pointer_no_lock(szone, (void *)addr)) {
+               malloc_printf("Entry about to be reused already in use: 0x%x\n", addr);
+               large_debug_print(szone);
+               sleep(3600);
+           }
+#endif
+       }
+        if (!addr) {
+            // we need to really allocate_pages a new region
+            SZONE_UNLOCK(szone);
+            addr = allocate_pages(szone, size, szone->debug_flags, VM_MAKE_TAG(VM_MEMORY_MALLOC_LARGE));
+           cleared_needed = 0; // since we allocated the pages, no need to clean them
+            if (LOG(szone, addr)) malloc_printf("In szone_malloc true large allocation at %p for %dKB\n", (void *)addr, size / 1024);
+            SZONE_LOCK(szone);
+            if (!addr) return NULL;
+#if DEBUG_MALLOC
+            if (large_entry_for_pointer_no_lock(szone, (void *)addr)) {
+                malloc_printf("Freshly allocated is already in use: 0x%x\n", addr);
+                large_debug_print(szone);
+                sleep(3600);
+            }
+#endif
+        }
+        if ((szone->num_large_objects_in_use + 1) * 4 > szone->num_large_entries) {
+            // density of hash table too high; grow table
+            // we do that under lock to avoid a race
+            // malloc_printf("In szone_malloc growing hash table current=%d\n", szone->num_large_entries);
+            large_entries_grow_no_lock(szone);
+        }
+        // malloc_printf("Inserting large entry (0x%x, %dKB)\n", addr, num_pages * vm_page_size / 1024);
+        entry.address_and_num_pages = addr | num_pages;
+#if DEBUG_MALLOC
+        if (large_entry_for_pointer_no_lock(szone, (void *)addr)) {
+            malloc_printf("Entry about to be added already in use: 0x%x\n", addr);
+            large_debug_print(szone);
+            sleep(3600);
+        }
+#endif
+        large_entry_insert_no_lock(szone, entry);
+#if DEBUG_MALLOC
+        if (!large_entry_for_pointer_no_lock(szone, (void *)addr)) {
+            malloc_printf("Can't find entry just added\n");
+            large_debug_print(szone);
+            sleep(3600);
+        }
+#endif
+        // malloc_printf("Inserted large entry (0x%x, %d pages)\n", addr, num_pages);
+        szone->num_large_objects_in_use ++;
+        szone->num_bytes_in_large_objects += size;
+    }
+    SZONE_UNLOCK(szone);
+    if (cleared_needed) memset((void *)addr, 0, num_pages << vm_page_shift);
+    return (void *)addr;
+}
+
+/********************* Zone call backs ************************/
+
+static void szone_free(szone_t *szone, void *ptr) {
+    region_t           *region;
+    large_entry_t      *entry;
+    vm_range_t         vm_range_to_deallocate;
+    huge_entry_t       *huge;
+    if (LOG(szone, ptr)) malloc_printf("In szone_free with %p\n", ptr);
+    if (!ptr) return;
+    if ((vm_address_t)ptr & (QUANTUM - 1)) {
+        szone_error(szone, "Non-aligned pointer being freed", ptr);
+        return;
+    }
+    // try a small pointer
+    region = region_for_ptr_no_lock(szone, ptr);
+    if (region) {
+        // this is indeed a valid pointer
+        msize_t                msize_and_free;
+        SZONE_LOCK(szone);
+        msize_and_free = MSIZE_FLAGS_FOR_PTR(ptr);
+        if (msize_and_free & THIS_FREE) {
+            szone_error(szone, "Object already freed being freed", ptr);
+            return;
+        }
+        CHECK(szone, __PRETTY_FUNCTION__);
+        small_free_no_lock(szone, region, ptr, msize_and_free);
+        CHECK(szone, __PRETTY_FUNCTION__);
+        SZONE_UNLOCK(szone);
+        return;
+    }
+    if (((unsigned)ptr) & (vm_page_size - 1)) {
+        szone_error(szone, "Non-page-aligned, non-allocated pointer being freed", ptr);
+        return;
+    }
+    SZONE_LOCK(szone);
+    entry = large_entry_for_pointer_no_lock(szone, ptr);
+    if (entry) {
+        // malloc_printf("Ready for deallocation [0x%x-%dKB]\n", LARGE_ENTRY_ADDRESS(*entry), LARGE_ENTRY_SIZE(*entry)/1024);
+       if (KILL_THRESHOLD && (LARGE_ENTRY_SIZE(*entry) > KILL_THRESHOLD)) {
+           // We indicate to the VM system that these pages contain garbage and therefore don't need to be swapped out
+           vm_msync(mach_task_self(), LARGE_ENTRY_ADDRESS(*entry), LARGE_ENTRY_SIZE(*entry), VM_SYNC_KILLPAGES);
+       }
+        vm_range_to_deallocate = large_free_no_lock(szone, entry);
+#if DEBUG_MALLOC
+        if (large_entry_for_pointer_no_lock(szone, ptr)) {
+            malloc_printf("*** malloc[%d]: Just after freeing 0x%x still in use num_large_entries=%d\n", getpid(), ptr, szone->num_large_entries);
+            large_cache_debug_print(szone);
+            large_debug_print(szone);
+            sleep(3600);
+        }
+#endif
+    } else if ((huge = huge_entry_for_pointer_no_lock(szone, ptr))) {
+        vm_range_to_deallocate = *huge;
+        *huge = szone->huge_entries[--szone->num_huge_entries]; // last entry fills that spot
+        szone->num_bytes_in_huge_objects -= vm_range_to_deallocate.size;
+    } else {
+#if DEBUG_MALLOC
+        large_debug_print(szone);
+#endif
+        szone_error(szone, "Pointer being freed was not allocated", ptr);
+        return;
+    }
+    CHECK(szone, __PRETTY_FUNCTION__);
+    SZONE_UNLOCK(szone); // we release the lock asap
+    // we deallocate_pages, including guard pages
+    if (vm_range_to_deallocate.address) {
+        // malloc_printf("About to deallocate 0x%x size %dKB\n", vm_range_to_deallocate.address, vm_range_to_deallocate.size / 1024);
+#if DEBUG_MALLOC
+        if (large_entry_for_pointer_no_lock(szone, (void *)vm_range_to_deallocate.address)) {
+            malloc_printf("*** malloc[%d]: Invariant broken: 0x%x still in use num_large_entries=%d\n", getpid(), vm_range_to_deallocate.address, szone->num_large_entries);
+            large_cache_debug_print(szone);
+            large_debug_print(szone);
+            sleep(3600);
+        }
+#endif
+        deallocate_pages(szone, vm_range_to_deallocate.address, vm_range_to_deallocate.size, 0);
+    }
+}
+
+static INLINE void *szone_malloc_should_clear(szone_t *szone, size_t size, boolean_t cleared_requested) {
+    void       *ptr;
+    if (!((szone->debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES) && PROTECT_SMALL) && (size < LARGE_THRESHOLD)) {
+        // think small
+        size_t         msize = (size + PTR_HEADER_SIZE + QUANTUM - 1) >> SHIFT_QUANTUM;
+        if (msize < MIN_BLOCK) msize = MIN_BLOCK;
+        ptr = small_malloc_should_clear(szone, msize, cleared_requested);
+#if DEBUG_MALLOC
+        if ((MSIZE_FLAGS_FOR_PTR(ptr) & ~ PREV_FREE) < msize) {
+            malloc_printf("ptr=%p this=%d msize=%d\n", ptr, MSIZE_FLAGS_FOR_PTR(ptr), (int)msize);
+            szone_error(szone, "Pointer allocated has improper size (1)", ptr);
+            return NULL;
+        }
+        if ((MSIZE_FLAGS_FOR_PTR(ptr) & ~ PREV_FREE) < MIN_BLOCK) {
+            malloc_printf("ptr=%p this=%d msize=%d\n", ptr, MSIZE_FLAGS_FOR_PTR(ptr), (int)msize);
+            szone_error(szone, "Pointer allocated has improper size (2)", ptr);
+            return NULL;
+        }
+#endif
+    } else {
+        unsigned               num_pages;
+        num_pages = round_page(size) >> vm_page_shift;
+        ptr = large_and_huge_malloc(szone, num_pages, cleared_requested);
+    }
+    if (LOG(szone, ptr)) malloc_printf("szone_malloc returned %p\n", ptr);
+    return ptr;
+}
+
+static void *szone_malloc(szone_t *szone, size_t size) {
+    return szone_malloc_should_clear(szone, size, 0);
+}
+
+static void *szone_calloc(szone_t *szone, size_t num_items, size_t size) {
+    return szone_malloc_should_clear(szone, num_items * size, 1);
+}
+
+static void *szone_valloc(szone_t *szone, size_t size) {
+    void       *ptr;
+    unsigned   num_pages;
+    num_pages = round_page(size) >> vm_page_shift;
+    ptr = large_and_huge_malloc(szone, num_pages, 1);
+    if (LOG(szone, ptr)) malloc_printf("szone_valloc returned %p\n", ptr);
+    return ptr;
+}
+
+static size_t szone_size(szone_t *szone, const void *ptr) {
+    size_t             size = 0;
+    region_t           *region;
+    large_entry_t      *entry;
+    huge_entry_t       *huge;
+    if (!ptr) return 0;
+    if (LOG(szone, ptr)) malloc_printf("In szone_size for %p (szone=%p)\n", ptr, szone);
+    if ((vm_address_t)ptr & (QUANTUM - 1)) return 0;
+    if ((((unsigned)ptr) & (vm_page_size - 1)) && (MSIZE_FLAGS_FOR_PTR(ptr) & THIS_FREE)) {
+        // not page aligned, but definitely not in use
+        return 0;
+    }
+    // Try a small pointer
+    region = region_for_ptr_no_lock(szone, ptr);
+    // malloc_printf("FOUND REGION %p\n", region);
+    if (region) {
+        // this is indeed a valid pointer
+        msize_t                msize_and_free = MSIZE_FLAGS_FOR_PTR(ptr);
+        return (msize_and_free & THIS_FREE) ? 0 : ((msize_and_free & ~PREV_FREE) << SHIFT_QUANTUM) - PTR_HEADER_SIZE;
+    }
+    if (((unsigned)ptr) & (vm_page_size - 1)) {
+        return 0;
+    }
+    SZONE_LOCK(szone);
+    entry = large_entry_for_pointer_no_lock(szone, ptr);
+    if (entry) {
+        size = LARGE_ENTRY_SIZE(*entry);
+    } else if ((huge = huge_entry_for_pointer_no_lock(szone, ptr))) {
+        size = huge->size;
+    }
+    SZONE_UNLOCK(szone); 
+    // malloc_printf("szone_size for large/huge %p returned %d\n", ptr, (unsigned)size);
+    if (LOG(szone, ptr)) malloc_printf("szone_size for %p returned %d\n", ptr, (unsigned)size);
+    return size;
+}
+
+static INLINE int szone_try_realloc_in_place(szone_t *szone, void *ptr, size_t old_size, size_t new_size) {
+    // returns 1 on success
+    void       *next_block = (char *)ptr + old_size + PTR_HEADER_SIZE;
+    msize_t    next_msize_and_free;
+    msize_t    next_msize;
+    region_t   region;
+    msize_t    coalesced_msize;
+    msize_t    leftover_msize;
+    msize_t    new_msize_and_free;
+    void       *following_ptr;
+    SZONE_LOCK(szone);
+    region = szone->regions[szone->num_regions - 1];
+    if (((vm_address_t)ptr >= region) && ((vm_address_t)ptr < region + REGION_SIZE) && ((vm_address_t)next_block == REGION_END(region) - szone->num_bytes_free_in_last_region + PTR_HEADER_SIZE)) {
+       // This could be optimized but it is so rare it's not worth it
+       SZONE_UNLOCK(szone);
+       return 0;
+    }
+    // If the next block is free, we coalesce
+    next_msize_and_free = MSIZE_FLAGS_FOR_PTR(next_block);
+#if DEBUG_MALLOC
+    if ((vm_address_t)next_block & (QUANTUM - 1)) {
+       szone_error(szone, "Internal invariant broken in realloc(next_block)", next_block);
+    }
+    if (next_msize_and_free & PREV_FREE) {
+       malloc_printf("szone_try_realloc_in_place: 0x%x=PREV_FREE|%d\n", next_msize_and_free, next_msize_and_free & ~PREV_FREE);
+       SZONE_UNLOCK(szone);
+       return 0;
+    }
+#endif
+    next_msize = next_msize_and_free & ~THIS_FREE;
+    if (!(next_msize_and_free & THIS_FREE) || !next_msize || (old_size + (next_msize << SHIFT_QUANTUM) < new_size)) {
+       SZONE_UNLOCK(szone);
+       return 0;
+    }
+    coalesced_msize = (new_size - old_size + QUANTUM - 1) >> SHIFT_QUANTUM;
+    leftover_msize = next_msize - coalesced_msize;
+    new_msize_and_free = MSIZE_FLAGS_FOR_PTR(ptr);
+    // malloc_printf("Realloc in place for %p;  current msize=%d next_msize=%d wanted=%d\n", ptr, MSIZE_FLAGS_FOR_PTR(ptr), next_msize, new_size);
+    free_list_remove_ptr(szone, next_block, next_msize);
+    if ((leftover_msize < MIN_BLOCK) || (leftover_msize < coalesced_msize / 4)) {
+       // don't bother splitting it off
+       // malloc_printf("No leftover ");
+       coalesced_msize = next_msize;
+       leftover_msize = 0;
+    } else {
+       void    *leftover = next_block + (coalesced_msize << SHIFT_QUANTUM);
+       // malloc_printf("Leftover ");
+       free_list_add_ptr(szone, leftover, leftover_msize);
+    }
+    new_msize_and_free += coalesced_msize;
+    MSIZE_FLAGS_FOR_PTR(ptr) = new_msize_and_free;
+    following_ptr = FOLLOWING_PTR(ptr, new_msize_and_free & ~PREV_FREE);
+    MSIZE_FLAGS_FOR_PTR(following_ptr) &= ~ PREV_FREE;
+#if DEBUG_MALLOC
+    {
+       msize_t ms = MSIZE_FLAGS_FOR_PTR(following_ptr);
+       msize_t pms = PREVIOUS_MSIZE(FOLLOWING_PTR(following_ptr, ms & ~THIS_FREE));
+       malloc_printf("Following ptr of coalesced (%p) has msize_and_free=0x%x=%s%d end_of_block_marker=%d\n", following_ptr, ms, (ms & THIS_FREE) ? "THIS_FREE|" : "", ms & ~THIS_FREE, pms);
+    }
+    if (LOG(szone,ptr)) malloc_printf("In szone_realloc(), ptr=%p, msize=%d\n", ptr, MSIZE_FLAGS_FOR_PTR(ptr));
+#endif
+    CHECK(szone, __PRETTY_FUNCTION__);
+    szone->num_bytes_in_small_objects += coalesced_msize << SHIFT_QUANTUM;
+    SZONE_UNLOCK(szone);
+    // malloc_printf("Extended ptr %p for realloc old=%d desired=%d new=%d leftover=%d\n", ptr, (unsigned)old_size, (unsigned)new_size, (unsigned)szone_size(szone, ptr), leftover_msize << SHIFT_QUANTUM);
+    return 1;
+}
+
+static void *szone_realloc(szone_t *szone, void *ptr, size_t new_size) {
+    size_t             old_size = 0;
+    void               *newPtr;
+    if (LOG(szone, ptr)) malloc_printf("In szone_realloc for %p, %d\n", ptr, (unsigned)new_size);
+    if (!ptr) return szone_malloc(szone, new_size);
+    old_size = szone_size(szone, ptr);
+    if (!old_size) {
+        szone_error(szone, "Pointer being reallocated was not allocated", ptr);
+        return NULL;
+    }
+    if (old_size >= new_size) return ptr;
+    if (!((szone->debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES) && PROTECT_SMALL) && (new_size < LARGE_THRESHOLD)) {
+        // We now try to realloc in place
+       if (szone_try_realloc_in_place(szone, ptr, old_size, new_size)) return ptr;
+    }
+    newPtr = szone_malloc(szone, new_size);
+    if (old_size > VM_COPY_THRESHOLD) {
+        kern_return_t  err = 0;
+        err = vm_copy(mach_task_self(), (vm_address_t)ptr, old_size, (vm_address_t)newPtr);
+        if (err) {
+            szone_error(szone, "Can't vm_copy region", ptr);
+        }
+    } else {
+        memcpy(newPtr, ptr, old_size);
+    }
+    szone_free(szone, ptr);
+    if (LOG(szone, ptr)) malloc_printf("szone_realloc returned %p for %d\n", newPtr, (unsigned)new_size);
+    return newPtr;
+}
+
+static void szone_destroy(szone_t *szone) {
+    unsigned   index;
+    index = szone->num_large_entries;
+    while (index--) {
+        large_entry_t  *entry = szone->large_entries + index;
+        if (!LARGE_ENTRY_IS_EMPTY(*entry)) {
+            large_entry_t      range;
+            range = *entry;
+            // we deallocate_pages, including guard pages
+            deallocate_pages(szone, LARGE_ENTRY_ADDRESS(range), LARGE_ENTRY_SIZE(range), szone->debug_flags);
+        }
+    }
+    if (szone->num_large_entries * sizeof(large_entry_t) >= LARGE_THRESHOLD) large_entries_free_no_lock(szone, szone->large_entries, szone->num_large_entries); // we do not free in the small chunk case
+    index = LARGE_CACHE_SIZE;
+    while (index--) {
+        vm_range_t     range = szone->large_to_deallocate[index];
+        if (range.size) deallocate_pages(szone, range.address, range.size, 0);
+    }
+    index = szone->num_huge_entries;
+    while (index--) {
+        huge_entry_t   *huge = szone->huge_entries + index;
+        deallocate_pages(szone, huge->address, huge->size, szone->debug_flags);
+    }
+    // and now we free regions, with regions[0] as the last one (the final harakiri)
+    index = szone->num_regions;
+    while (index--) { // we skip the first region, that is the zone itself
+        region_t       region = szone->regions[index];
+        deallocate_pages(szone, REGION_ADDRESS(region), REGION_SIZE, 0);
+    }
+}
+
+static size_t szone_good_size(szone_t *szone, size_t size) {
+    if (!((szone->debug_flags & SCALABLE_MALLOC_ADD_GUARD_PAGES) && PROTECT_SMALL) && (size < LARGE_THRESHOLD)) {
+        // think small
+        msize_t        msize = (size + PTR_HEADER_SIZE + QUANTUM - 1) >> SHIFT_QUANTUM;
+        if (msize < MIN_BLOCK) msize = MIN_BLOCK;
+        return (msize << SHIFT_QUANTUM) - PTR_HEADER_SIZE;
+    } else {
+        unsigned               num_pages;
+        num_pages = round_page(size) >> vm_page_shift;
+        if (!num_pages) num_pages = 1; // minimal allocation size for this
+        return num_pages << vm_page_shift;
+    }
+}
+
+unsigned szone_check_counter = 0;
+unsigned szone_check_start = 0;
+unsigned szone_check_modulo = 1;
+
+static boolean_t szone_check_all(szone_t *szone, const char *function) {
+    unsigned   index = 0;
+    SZONE_LOCK(szone);
+    while (index < szone->num_regions) {
+        region_t       *region = szone->regions + index++;
+        if (!szone_check_region(szone, region)) {
+            SZONE_UNLOCK(szone);
+            szone->debug_flags &= ~ CHECK_REGIONS;
+            malloc_printf("*** malloc[%d]: Region %d incorrect szone_check_all(%s) counter=%d\n", getpid(), index-1, function, szone_check_counter);
+            szone_error(szone, "Check: region incorrect", NULL);
+            return 0;
+        }
+    }
+    index = 0;
+    while (index < MAX_GRAIN) {
+        if (! free_list_check(szone, index)) {
+            SZONE_UNLOCK(szone);
+            szone->debug_flags &= ~ CHECK_REGIONS;
+            malloc_printf("*** malloc[%d]: Free list incorrect (grain=%d) szone_check_all(%s) counter=%d\n", getpid(), index, function, szone_check_counter);
+            szone_error(szone, "Check: free list incorrect", NULL);
+            return 0;
+        }
+        index++;
+    }
+    SZONE_UNLOCK(szone);
+    return 1;
+}
+
+static boolean_t szone_check(szone_t *szone) {
+    if (! (++szone_check_counter % 10000)) {
+        malloc_printf("At szone_check counter=%d\n", szone_check_counter);
+    }
+    if (szone_check_counter < szone_check_start) return 1;
+    if (szone_check_counter % szone_check_modulo) return 1;
+    return szone_check_all(szone, "");
+}
+
+static kern_return_t szone_ptr_in_use_enumerator(task_t task, void *context, unsigned type_mask, vm_address_t zone_address, memory_reader_t reader, vm_range_recorder_t recorder) {
+    szone_t            *szone;
+    kern_return_t      err;
+    if (!reader) reader = _szone_default_reader;
+    // malloc_printf("Enumerator for zone 0x%x\n", zone_address);
+    err = reader(task, zone_address, sizeof(szone_t), (void **)&szone);
+    if (err) return err;
+    // malloc_printf("Small ptrs enumeration for zone 0x%x\n", zone_address);
+    err = small_in_use_enumerator(task, context, type_mask, (vm_address_t)szone->regions, szone->num_regions, reader, recorder);
+    if (err) return err;
+    // malloc_printf("Large ptrs enumeration for zone 0x%x\n", zone_address);
+    err = large_in_use_enumerator(task, context, type_mask, (vm_address_t)szone->large_entries, szone->num_large_entries, reader, recorder);
+    if (err) return err;
+    // malloc_printf("Huge ptrs enumeration for zone 0x%x\n", zone_address);
+    err = huge_in_use_enumerator(task, context, type_mask, (vm_address_t)szone->huge_entries, szone->num_huge_entries, reader, recorder);
+    return err;
+}
+
+static void szone_print_free_list(szone_t *szone) {
+    grain_t            grain = MAX_GRAIN;
+    malloc_printf("Free Sizes: ");
+    while (grain--) {
+        free_list_t    *ptr = szone->free_list[grain];
+        if (ptr) {
+            unsigned   count = 0;
+            while (ptr) {
+                count++;
+                // malloc_printf("%p ", ptr);
+                ptr = ptr->next;
+            }
+            malloc_printf("%s%d[%d] ", (grain == MAX_GRAIN-1) ? ">=" : "", (grain+1)*QUANTUM, count);
+        }
+    }
+    malloc_printf("\n");
+}
+
+static void szone_print(szone_t *szone, boolean_t verbose) {
+    unsigned   info[scalable_zone_info_count];
+    unsigned   index;
+    unsigned   num = 0;
+    index = LARGE_CACHE_SIZE;
+    while (index--) if (szone->large_to_deallocate[index].size) num++;
+    index = 0;
+    scalable_zone_info((void *)szone, info, scalable_zone_info_count);
+    malloc_printf("Scalable zone %p: inUse=%d(%dKB) small=%d(%dKB) large=%d(%dKB) to_be_deallocated=%d huge=%d(%dKB) guard_page=%d\n", szone, info[0], info[1] / 1024, info[2], info[3] / 1024, info[4], info[5] / 1024, num, info[6], info[7] / 1024, info[8]);
+    malloc_printf("%d regions: \n", szone->num_regions);
+    while (index < szone->num_regions) {
+        region_t       *region = szone->regions + index;
+        unsigned       counts[512];
+        unsigned       ci = 0;
+        unsigned       in_use = 0;
+        vm_address_t   start = REGION_ADDRESS(*region) + QUANTUM;
+        memset(counts, 0, 512 * sizeof(unsigned));
+        while (start < REGION_END(*region)) {
+            msize_t    msize_and_free = MSIZE_FLAGS_FOR_PTR(start);
+            if (!(msize_and_free & THIS_FREE)) {
+                msize_t        msize = msize_and_free & ~PREV_FREE;
+                if (!msize) break; // last encountered
+                // block in use
+                if (msize < 512) counts[msize]++;
+                start += msize << SHIFT_QUANTUM;
+                in_use++;
+            } else {
+                msize_t        msize = msize_and_free & ~THIS_FREE;
+                // free block
+                start += msize << SHIFT_QUANTUM;
+            }
+        }
+        malloc_printf("Region [0x%x-0x%x, %dKB] \tIn_use=%d ", REGION_ADDRESS(*region), REGION_END(*region), (int)REGION_SIZE / 1024, in_use);
+        if (verbose) {
+            malloc_printf("\n\tSizes in use: ");
+            while (ci < 512) {
+                if (counts[ci]) malloc_printf("%d[%d] ", ci << SHIFT_QUANTUM, counts[ci]);
+                ci++;
+            }
+        }
+        malloc_printf("\n");
+        index++;
+    }
+    if (verbose) szone_print_free_list(szone);
+    malloc_printf("Free in last zone %d\n", szone->num_bytes_free_in_last_region);
+}
+
+static void szone_log(malloc_zone_t *zone, void *log_address) {
+    szone_t    *szone = (void *)zone;
+    szone->log_address = log_address;
+}
+
+static void szone_force_lock(szone_t *szone) {
+    // malloc_printf("szone_force_lock\n");
+    SZONE_LOCK(szone);
+}
+
+static void szone_force_unlock(szone_t *szone) {
+    // malloc_printf("szone_force_unlock\n");
+    SZONE_UNLOCK(szone);
+}
+
+static struct malloc_introspection_t szone_introspect = {(void *)szone_ptr_in_use_enumerator, (void *)szone_good_size, (void *)szone_check, (void *)szone_print, szone_log, (void *)szone_force_lock, (void *)szone_force_unlock};
+
+malloc_zone_t *create_scalable_zone(size_t initial_size, unsigned debug_flags) {
+    szone_t            *szone;
+    vm_address_t       addr;
+    size_t             msize;
+    size_t             msize_used = 0;
+    if (!vm_page_shift) {
+        unsigned       page;
+        vm_page_shift = 12; // the minimal for page sizes
+        page = 1 << vm_page_shift;
+        while (page != vm_page_size) { page += page; vm_page_shift++;};
+        if (MIN_BLOCK * QUANTUM < sizeof(free_list_t) + PTR_HEADER_SIZE) {
+            malloc_printf("*** malloc[%d]: inconsistant parameters\n", getpid());
+        }
+    }
+    addr = allocate_pages(NULL, REGION_SIZE, 0, VM_MAKE_TAG(VM_MEMORY_MALLOC));
+    if (!addr) return NULL;
+    szone = (void *)(addr + QUANTUM);
+    msize = (sizeof(szone_t) + PTR_HEADER_SIZE + QUANTUM-1) >> SHIFT_QUANTUM;
+    MSIZE_FLAGS_FOR_PTR(szone) = msize;
+    msize_used += msize; szone->num_small_objects++;
+    szone->basic_zone.size = (void *)szone_size;
+    szone->basic_zone.malloc = (void *)szone_malloc;
+    szone->basic_zone.calloc = (void *)szone_calloc;
+    szone->basic_zone.valloc = (void *)szone_valloc;
+    szone->basic_zone.free = (void *)szone_free;
+    szone->basic_zone.realloc = (void *)szone_realloc;
+    szone->basic_zone.destroy = (void *)szone_destroy;
+    szone->basic_zone.introspect = &szone_introspect;
+    LOCK_INIT(szone->lock);
+    szone->debug_flags = debug_flags;
+    szone->regions = (void *)((char *)szone + (msize << SHIFT_QUANTUM));
+    // we always reserve room for a few regions
+    msize = (sizeof(region_t) * INITIAL_NUM_REGIONS + PTR_HEADER_SIZE + QUANTUM-1) >> SHIFT_QUANTUM;
+    if (msize < MIN_BLOCK) msize = MIN_BLOCK;
+    MSIZE_FLAGS_FOR_PTR(szone->regions) = msize;
+    msize_used += msize; szone->num_small_objects++;
+    szone->regions[0] = addr;
+    szone->num_regions = 1;
+    szone->num_bytes_free_in_last_region = REGION_SIZE - ((msize_used+1) << SHIFT_QUANTUM) + PTR_HEADER_SIZE;
+    CHECK(szone, __PRETTY_FUNCTION__);
+    return (malloc_zone_t *)szone;
+}
+
+/*********     The following is private API for debug and perf tools   ************/
+
+void scalable_zone_info(malloc_zone_t *zone, unsigned *info_to_fill, unsigned count) {
+    szone_t    *szone = (void *)zone;
+    unsigned   info[scalable_zone_info_count];
+    // We do not lock to facilitate debug
+    info[2] = szone->num_small_objects;
+    info[3] = szone->num_bytes_in_small_objects;
+    info[4] = szone->num_large_objects_in_use;
+    info[5] = szone->num_bytes_in_large_objects;
+    info[6] = szone->num_huge_entries;
+    info[7] = szone->num_bytes_in_huge_objects;
+    info[8] = szone->debug_flags;
+    info[0] = info[2] + info[4] + info[6];
+    info[1] = info[3] + info[5] + info[7];
+    memcpy(info_to_fill, info, sizeof(unsigned)*count);
+}
+
diff --git a/gen.subproj/scalable_malloc.h b/gen.subproj/scalable_malloc.h
new file mode 100644 (file)
index 0000000..8891c3d
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#import <objc/malloc.h>
+
+#define SCALABLE_MALLOC_ADD_GUARD_PAGES                (1 << 0)
+    // add a guard page before and after each VM region to help debug
+#define SCALABLE_MALLOC_DONT_PROTECT_PRELUDE   (1 << 1)
+    // do not protect prelude page
+#define SCALABLE_MALLOC_DONT_PROTECT_POSTLUDE  (1 << 2)
+    // do not protect postlude page
+#define SCALABLE_MALLOC_DO_SCRIBBLE            (1 << 3)
+    // write 0x55 onto free blocks
+
+extern malloc_zone_t *create_scalable_zone(size_t initial_size, unsigned debug_flags);
+    /* Create a new zone that scales for small objects or large objects */
+
+/***** Private API for debug and performance tools     ********/
+
+#define scalable_zone_info_count       9       // maximum number of numbers
+
+extern void scalable_zone_info(malloc_zone_t *zone, unsigned *info, unsigned count);
+    /* Fills info[] with some statistical information:
+    info[0]: number of objects in use
+    info[1]: number of bytes in use
+    ...
+    */
+
diff --git a/gen.subproj/scandir.c b/gen.subproj/scandir.c
new file mode 100644 (file)
index 0000000..d963bbd
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Scan the directory dirname calling select to make a list of selected
+ * directory entries then sort using qsort and compare routine dcomp.
+ * Returns the number of entries and a pointer to a list of pointers to
+ * struct dirent (through namelist). Returns -1 if there were any errors.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * The DIRSIZ macro is the minimum record length which will hold the directory
+ * entry.  This requires the amount of space in struct dirent without the
+ * d_name field, plus enough space for the name and a terminating nul byte
+ * (dp->d_namlen + 1), rounded up to a 4 byte boundary.
+ */
+#undef DIRSIZ
+#define DIRSIZ(dp)                                                     \
+       ((sizeof(struct dirent) - sizeof(dp)->d_name) +                 \
+           (((dp)->d_namlen + 1 + 3) &~ 3))
+
+int
+scandir(dirname, namelist, select, dcomp)
+       const char *dirname;
+       struct dirent ***namelist;
+       int (*select) __P((struct dirent *));
+       int (*dcomp) __P((const void *, const void *));
+{
+       register struct dirent *d, *p, **names;
+       register size_t nitems;
+       struct stat stb;
+       long arraysz;
+       DIR *dirp;
+
+       if ((dirp = opendir(dirname)) == NULL)
+               return(-1);
+       if (fstat(dirp->dd_fd, &stb) < 0)
+               return(-1);
+
+       /*
+        * estimate the array size by taking the size of the directory file
+        * and dividing it by a multiple of the minimum size entry. 
+        */
+       arraysz = (stb.st_size / 24);
+       names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *));
+       if (names == NULL)
+               return(-1);
+
+       nitems = 0;
+       while ((d = readdir(dirp)) != NULL) {
+               if (select != NULL && !(*select)(d))
+                       continue;       /* just selected names */
+               /*
+                * Make a minimum size copy of the data
+                */
+               p = (struct dirent *)malloc(DIRSIZ(d));
+               if (p == NULL)
+                       return(-1);
+               p->d_ino = d->d_ino;
+               p->d_reclen = d->d_reclen;
+               p->d_namlen = d->d_namlen;
+               bcopy(d->d_name, p->d_name, p->d_namlen + 1);
+               /*
+                * Check to make sure the array has space left and
+                * realloc the maximum size.
+                */
+               if (++nitems >= arraysz) {
+                       if (fstat(dirp->dd_fd, &stb) < 0)
+                               return(-1);     /* just might have grown */
+                       arraysz = stb.st_size / 12;
+                       names = (struct dirent **)realloc((char *)names,
+                               arraysz * sizeof(struct dirent *));
+                       if (names == NULL)
+                               return(-1);
+               }
+               names[nitems-1] = p;
+       }
+       closedir(dirp);
+       if (nitems && dcomp != NULL)
+               qsort(names, nitems, sizeof(struct dirent *), dcomp);
+       *namelist = names;
+       return(nitems);
+}
+
+/*
+ * Alphabetic order comparison routine for those who want it.
+ */
+int
+alphasort(d1, d2)
+       const void *d1;
+       const void *d2;
+{
+       return(strcmp((*(struct dirent **)d1)->d_name,
+           (*(struct dirent **)d2)->d_name));
+}
diff --git a/gen.subproj/seekdir.c b/gen.subproj/seekdir.c
new file mode 100644 (file)
index 0000000..b005ed2
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <dirent.h>
+
+/*
+ * Seek to an entry in a directory.
+ * _seekdir is in telldir.c so that it can share opaque data structures.
+ */
+void
+seekdir(dirp, loc)
+       DIR *dirp;
+       long loc;
+{
+
+       _seekdir(dirp, loc);
+}
diff --git a/gen.subproj/sethostname.c b/gen.subproj/sethostname.c
new file mode 100644 (file)
index 0000000..7947676
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+#if __STDC__
+long
+sethostname(const char *name, int namelen)
+#else
+long
+sethostname(name, namelen)
+       char *name;
+       int namelen;
+#endif
+{
+       int mib[2];
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_HOSTNAME;
+       if (sysctl(mib, 2, NULL, NULL, (void *)name, namelen) == -1)
+               return (-1);
+       return (0);
+}
+
+
diff --git a/gen.subproj/setlogin.c b/gen.subproj/setlogin.c
new file mode 100644 (file)
index 0000000..5c6b5a3
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <unistd.h>
+
+extern int _logname_valid;             /* shared with getlogin() */
+
+int setlogin(const char* name)
+{
+       return (_logname_valid = _setlogin(name));
+}
diff --git a/gen.subproj/setmode.c b/gen.subproj/setmode.c
new file mode 100644 (file)
index 0000000..dc2cc3a
--- /dev/null
@@ -0,0 +1,471 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Dave Borman at Cray Research, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <signal.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#ifdef SETMODE_DEBUG
+#include <stdio.h>
+#endif
+
+#define        SET_LEN 6               /* initial # of bitcmd struct to malloc */
+#define        SET_LEN_INCR 4          /* # of bitcmd structs to add as needed */
+
+typedef struct bitcmd {
+       char    cmd;
+       char    cmd2;
+       mode_t  bits;
+} BITCMD;
+
+#define        CMD2_CLR        0x01
+#define        CMD2_SET        0x02
+#define        CMD2_GBITS      0x04
+#define        CMD2_OBITS      0x08
+#define        CMD2_UBITS      0x10
+
+static BITCMD  *addcmd __P((BITCMD *, int, int, int, u_int));
+static int      compress_mode __P((BITCMD *));
+#ifdef SETMODE_DEBUG
+static void     dumpmode __P((BITCMD *));
+#endif
+
+/*
+ * Given the old mode and an array of bitcmd structures, apply the operations
+ * described in the bitcmd structures to the old mode, and return the new mode.
+ * Note that there is no '=' command; a strict assignment is just a '-' (clear
+ * bits) followed by a '+' (set bits).
+ */
+mode_t
+getmode(bbox, omode)
+       void *bbox;
+       mode_t omode;
+{
+       register BITCMD *set;
+       register mode_t clrval, newmode, value;
+
+       set = (BITCMD *)bbox;
+       newmode = omode;
+       for (value = 0;; set++)
+               switch(set->cmd) {
+               /*
+                * When copying the user, group or other bits around, we "know"
+                * where the bits are in the mode so that we can do shifts to
+                * copy them around.  If we don't use shifts, it gets real
+                * grundgy with lots of single bit checks and bit sets.
+                */
+               case 'u':
+                       value = (newmode & S_IRWXU) >> 6;
+                       goto common;
+
+               case 'g':
+                       value = (newmode & S_IRWXG) >> 3;
+                       goto common;
+
+               case 'o':
+                       value = newmode & S_IRWXO;
+common:                        if (set->cmd2 & CMD2_CLR) {
+                               clrval =
+                                   (set->cmd2 & CMD2_SET) ?  S_IRWXO : value;
+                               if (set->cmd2 & CMD2_UBITS)
+                                       newmode &= ~((clrval<<6) & set->bits);
+                               if (set->cmd2 & CMD2_GBITS)
+                                       newmode &= ~((clrval<<3) & set->bits);
+                               if (set->cmd2 & CMD2_OBITS)
+                                       newmode &= ~(clrval & set->bits);
+                       }
+                       if (set->cmd2 & CMD2_SET) {
+                               if (set->cmd2 & CMD2_UBITS)
+                                       newmode |= (value<<6) & set->bits;
+                               if (set->cmd2 & CMD2_GBITS)
+                                       newmode |= (value<<3) & set->bits;
+                               if (set->cmd2 & CMD2_OBITS)
+                                       newmode |= value & set->bits;
+                       }
+                       break;
+
+               case '+':
+                       newmode |= set->bits;
+                       break;
+
+               case '-':
+                       newmode &= ~set->bits;
+                       break;
+
+               case 'X':
+                       if (omode & (S_IFDIR|S_IXUSR|S_IXGRP|S_IXOTH))
+                               newmode |= set->bits;
+                       break;
+
+               case '\0':
+               default:
+#ifdef SETMODE_DEBUG
+                       (void)printf("getmode:%04o -> %04o\n", omode, newmode);
+#endif
+                       return (newmode);
+               }
+}
+
+#define        ADDCMD(a, b, c, d)                                              \
+       if (set >= endset) {                                            \
+               register BITCMD *newset;                                \
+               setlen += SET_LEN_INCR;                                 \
+               newset = realloc(saveset, sizeof(BITCMD) * setlen);     \
+               if (!saveset)                                           \
+                       return (NULL);                                  \
+               set = newset + (set - saveset);                         \
+               saveset = newset;                                       \
+               endset = newset + (setlen - 2);                         \
+       }                                                               \
+       set = addcmd(set, (a), (b), (c), (d))
+
+#define        STANDARD_BITS   (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO)
+
+void *
+setmode(p)
+       register char *p;
+{
+       register int perm, who;
+       register char op;
+       BITCMD *set, *saveset, *endset;
+       sigset_t sigset, sigoset;
+       mode_t mask;
+       int equalopdone, permXbits, setlen;
+
+       if (!*p)
+               return (NULL);
+
+       /*
+        * Get a copy of the mask for the permissions that are mask relative.
+        * Flip the bits, we want what's not set.  Since it's possible that
+        * the caller is opening files inside a signal handler, protect them
+        * as best we can.
+        */
+       sigfillset(&sigset);
+        (void)sigprocmask(SIG_BLOCK, &sigset, &sigoset);
+       (void)umask(mask = umask(0));
+       mask = ~mask;
+        (void)sigprocmask(SIG_SETMASK, &sigoset, NULL);
+
+       setlen = SET_LEN + 2;
+       
+       if ((set = malloc((u_int)(sizeof(BITCMD) * setlen))) == NULL)
+               return (NULL);
+       saveset = set;
+       endset = set + (setlen - 2);
+
+       /*
+        * If an absolute number, get it and return; disallow non-octal digits
+        * or illegal bits.
+        */
+       if (isdigit(*p)) {
+               perm = (mode_t)strtol(p, NULL, 8);
+               if (perm & ~(STANDARD_BITS|S_ISTXT)) {
+                       free(saveset);
+                       return (NULL);
+               }
+               while (*++p)
+                       if (*p < '0' || *p > '7') {
+                               free(saveset);
+                               return (NULL);
+                       }
+               ADDCMD('=', (STANDARD_BITS|S_ISTXT), perm, mask);
+               return (saveset);
+       }
+
+       /*
+        * Build list of structures to set/clear/copy bits as described by
+        * each clause of the symbolic mode.
+        */
+       for (;;) {
+               /* First, find out which bits might be modified. */
+               for (who = 0;; ++p) {
+                       switch (*p) {
+                       case 'a':
+                               who |= STANDARD_BITS;
+                               break;
+                       case 'u':
+                               who |= S_ISUID|S_IRWXU;
+                               break;
+                       case 'g':
+                               who |= S_ISGID|S_IRWXG;
+                               break;
+                       case 'o':
+                               who |= S_IRWXO;
+                               break;
+                       default:
+                               goto getop;
+                       }
+               }
+
+getop:         if ((op = *p++) != '+' && op != '-' && op != '=') {
+                       free(saveset);
+                       return (NULL);
+               }
+               if (op == '=')
+                       equalopdone = 0;
+
+               who &= ~S_ISTXT;
+               for (perm = 0, permXbits = 0;; ++p) {
+                       switch (*p) {
+                       case 'r':
+                               perm |= S_IRUSR|S_IRGRP|S_IROTH;
+                               break;
+                       case 's':
+                               /* If only "other" bits ignore set-id. */
+                               if (who & ~S_IRWXO)
+                                       perm |= S_ISUID|S_ISGID;
+                               break;
+                       case 't':
+                               /* If only "other" bits ignore sticky. */
+                               if (who & ~S_IRWXO) {
+                                       who |= S_ISTXT;
+                                       perm |= S_ISTXT;
+                               }
+                               break;
+                       case 'w':
+                               perm |= S_IWUSR|S_IWGRP|S_IWOTH;
+                               break;
+                       case 'X':
+                               permXbits = S_IXUSR|S_IXGRP|S_IXOTH;
+                               break;
+                       case 'x':
+                               perm |= S_IXUSR|S_IXGRP|S_IXOTH;
+                               break;
+                       case 'u':
+                       case 'g':
+                       case 'o':
+                               /*
+                                * When ever we hit 'u', 'g', or 'o', we have
+                                * to flush out any partial mode that we have,
+                                * and then do the copying of the mode bits.
+                                */
+                               if (perm) {
+                                       ADDCMD(op, who, perm, mask);
+                                       perm = 0;
+                               }
+                               if (op == '=')
+                                       equalopdone = 1;
+                               if (op == '+' && permXbits) {
+                                       ADDCMD('X', who, permXbits, mask);
+                                       permXbits = 0;
+                               }
+                               ADDCMD(*p, who, op, mask);
+                               break;
+
+                       default:
+                               /*
+                                * Add any permissions that we haven't already
+                                * done.
+                                */
+                               if (perm || (op == '=' && !equalopdone)) {
+                                       if (op == '=')
+                                               equalopdone = 1;
+                                       ADDCMD(op, who, perm, mask);
+                                       perm = 0;
+                               }
+                               if (permXbits) {
+                                       ADDCMD('X', who, permXbits, mask);
+                                       permXbits = 0;
+                               }
+                               goto apply;
+                       }
+               }
+
+apply:         if (!*p)
+                       break;
+               if (*p != ',')
+                       goto getop;
+               ++p;
+       }
+       set->cmd = 0;
+#ifdef SETMODE_DEBUG
+       (void)printf("Before compress_mode()\n");
+       dumpmode(saveset);
+#endif
+       compress_mode(saveset);
+#ifdef SETMODE_DEBUG
+       (void)printf("After compress_mode()\n");
+       dumpmode(saveset);
+#endif
+       return (saveset);
+}
+
+static BITCMD *
+addcmd(set, op, who, oparg, mask)
+       BITCMD *set;
+       register int oparg, who;
+       register int op;
+       u_int mask;
+{
+       switch (op) {
+       case '=':
+               set->cmd = '-';
+               set->bits = who ? who : STANDARD_BITS;
+               set++;
+
+               op = '+';
+               /* FALLTHROUGH */
+       case '+':
+       case '-':
+       case 'X':
+               set->cmd = op;
+               set->bits = (who ? who : mask) & oparg;
+               break;
+
+       case 'u':
+       case 'g':
+       case 'o':
+               set->cmd = op;
+               if (who) {
+                       set->cmd2 = ((who & S_IRUSR) ? CMD2_UBITS : 0) |
+                                   ((who & S_IRGRP) ? CMD2_GBITS : 0) |
+                                   ((who & S_IROTH) ? CMD2_OBITS : 0);
+                       set->bits = ~0;
+               } else {
+                       set->cmd2 = CMD2_UBITS | CMD2_GBITS | CMD2_OBITS;
+                       set->bits = mask;
+               }
+       
+               if (oparg == '+')
+                       set->cmd2 |= CMD2_SET;
+               else if (oparg == '-')
+                       set->cmd2 |= CMD2_CLR;
+               else if (oparg == '=')
+                       set->cmd2 |= CMD2_SET|CMD2_CLR;
+               break;
+       }
+       return (set + 1);
+}
+
+#ifdef SETMODE_DEBUG
+static void
+dumpmode(set)
+       register BITCMD *set;
+{
+       for (; set->cmd; ++set)
+               (void)printf("cmd: '%c' bits %04o%s%s%s%s%s%s\n",
+                   set->cmd, set->bits, set->cmd2 ? " cmd2:" : "",
+                   set->cmd2 & CMD2_CLR ? " CLR" : "",
+                   set->cmd2 & CMD2_SET ? " SET" : "",
+                   set->cmd2 & CMD2_UBITS ? " UBITS" : "",
+                   set->cmd2 & CMD2_GBITS ? " GBITS" : "",
+                   set->cmd2 & CMD2_OBITS ? " OBITS" : "");
+}
+#endif
+
+/*
+ * Given an array of bitcmd structures, compress by compacting consecutive
+ * '+', '-' and 'X' commands into at most 3 commands, one of each.  The 'u',
+ * 'g' and 'o' commands continue to be separate.  They could probably be 
+ * compacted, but it's not worth the effort.
+ */
+static int
+compress_mode(set)
+       register BITCMD *set;
+{
+       register BITCMD *nset;
+       register int setbits, clrbits, Xbits, op;
+
+       for (nset = set;;) {
+               /* Copy over any 'u', 'g' and 'o' commands. */
+               while ((op = nset->cmd) != '+' && op != '-' && op != 'X') {
+                       *set++ = *nset++;
+                       if (!op)
+                               return;
+               }
+
+               for (setbits = clrbits = Xbits = 0;; nset++) {
+                       if ((op = nset->cmd) == '-') {
+                               clrbits |= nset->bits;
+                               setbits &= ~nset->bits;
+                               Xbits &= ~nset->bits;
+                       } else if (op == '+') {
+                               setbits |= nset->bits;
+                               clrbits &= ~nset->bits;
+                               Xbits &= ~nset->bits;
+                       } else if (op == 'X')
+                               Xbits |= nset->bits & ~setbits;
+                       else
+                               break;
+               }
+               if (clrbits) {
+                       set->cmd = '-';
+                       set->cmd2 = 0;
+                       set->bits = clrbits;
+                       set++;
+               }
+               if (setbits) {
+                       set->cmd = '+';
+                       set->cmd2 = 0;
+                       set->bits = setbits;
+                       set++;
+               }
+               if (Xbits) {
+                       set->cmd = 'X';
+                       set->cmd2 = 0;
+                       set->bits = Xbits;
+                       set++;
+               }
+       }
+}
diff --git a/gen.subproj/siginterrupt.c b/gen.subproj/siginterrupt.c
new file mode 100644 (file)
index 0000000..591f73c
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <signal.h>
+
+/*
+ * Set signal state to prevent restart of system calls
+ * after an instance of the indicated signal.
+ */
+siginterrupt(sig, flag)
+       int sig, flag;
+{
+       extern sigset_t _sigintr;
+       struct sigaction sa;
+       int ret;
+
+       if ((ret = sigaction(sig, (struct sigaction *)0, &sa)) < 0)
+               return (ret);
+       if (flag) {
+               sigaddset(&_sigintr, sig);
+               sa.sa_flags &= ~SA_RESTART;
+       } else {
+               sigdelset(&_sigintr, sig);
+               sa.sa_flags |= SA_RESTART;
+       }
+       return (sigaction(sig, &sa, (struct sigaction *)0));
+}
diff --git a/gen.subproj/siglist.c b/gen.subproj/siglist.c
new file mode 100644 (file)
index 0000000..5c700fe
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <signal.h>
+
+const char *const sys_signame[NSIG] = {
+       "Signal 0",
+       "hup",                          /* SIGHUP */
+       "int",                          /* SIGINT */
+       "quit",                         /* SIGQUIT */
+       "ill",                          /* SIGILL */
+       "trap",                         /* SIGTRAP */
+       "abrt",                         /* SIGABRT */
+       "emt",                          /* SIGEMT */
+       "fpe",                          /* SIGFPE */
+       "kill",                         /* SIGKILL */
+       "bus",                          /* SIGBUS */
+       "segv",                         /* SIGSEGV */
+       "sys",                          /* SIGSYS */
+       "pipe",                         /* SIGPIPE */
+       "alrm",                         /* SIGALRM */
+       "term",                         /* SIGTERM */
+       "urg",                          /* SIGURG */
+       "stop",                         /* SIGSTOP */
+       "tstp",                         /* SIGTSTP */
+       "cont",                         /* SIGCONT */
+       "chld",                         /* SIGCHLD */
+       "ttin",                         /* SIGTTIN */
+       "ttou",                         /* SIGTTOU */
+       "io",                           /* SIGIO */
+       "xcpu",                         /* SIGXCPU */
+       "xfsz",                         /* SIGXFSZ */
+       "vtalrm",                       /* SIGVTALRM */
+       "prof",                         /* SIGPROF */
+       "winch",                        /* SIGWINCH */
+       "info",                         /* SIGINFO */
+       "usr1",                         /* SIGUSR1 */
+       "usr2",                         /* SIGUSR2 */
+};
+
+const char *const sys_siglist[NSIG] = {
+       "Signal 0",
+       "Hangup",                       /* SIGHUP */
+       "Interrupt",                    /* SIGINT */
+       "Quit",                         /* SIGQUIT */
+       "Illegal instruction",          /* SIGILL */
+       "Trace/BPT trap",               /* SIGTRAP */
+       "Abort trap",                   /* SIGABRT */
+       "EMT trap",                     /* SIGEMT */
+       "Floating point exception",     /* SIGFPE */
+       "Killed",                       /* SIGKILL */
+       "Bus error",                    /* SIGBUS */
+       "Segmentation fault",           /* SIGSEGV */
+       "Bad system call",              /* SIGSYS */
+       "Broken pipe",                  /* SIGPIPE */
+       "Alarm clock",                  /* SIGALRM */
+       "Terminated",                   /* SIGTERM */
+       "Urgent I/O condition",         /* SIGURG */
+       "Suspended (signal)",           /* SIGSTOP */
+       "Suspended",                    /* SIGTSTP */
+       "Continued",                    /* SIGCONT */
+       "Child exited",                 /* SIGCHLD */
+       "Stopped (tty input)",          /* SIGTTIN */
+       "Stopped (tty output)",         /* SIGTTOU */
+       "I/O possible",                 /* SIGIO */
+       "Cputime limit exceeded",       /* SIGXCPU */
+       "Filesize limit exceeded",      /* SIGXFSZ */
+       "Virtual timer expired",        /* SIGVTALRM */
+       "Profiling timer expired",      /* SIGPROF */
+       "Window size changes",          /* SIGWINCH */
+       "Information request",          /* SIGINFO */
+       "User defined signal 1",        /* SIGUSR1 */
+       "User defined signal 2"         /* SIGUSR2 */
+};
diff --git a/gen.subproj/signal.c b/gen.subproj/signal.c
new file mode 100644 (file)
index 0000000..e936bd9
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1985, 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Almost backwards compatible signal.
+ */
+#include <signal.h>
+
+sigset_t _sigintr = 0;         /* shared with siginterrupt */
+
+static sig_t
+signal__(s, a, bind)
+       int s;
+       sig_t a;
+       int bind;
+{
+       struct sigaction sa, osa;
+
+       sa.sa_handler = a;
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = 0;
+       if (!sigismember(&_sigintr, s))
+               sa.sa_flags |= SA_RESTART;
+#if defined(__DYNAMIC__)
+       if (bind) {
+#endif
+            if (sigaction(s, &sa, &osa) < 0)
+               return (SIG_ERR);
+#if defined(__DYNAMIC__)
+        } else {
+            if (_sigaction_nobind(s, &sa, &osa) < 0)
+                return (SIG_ERR);
+        }
+#endif
+       return (osa.sa_handler);
+}
+
+sig_t
+signal(s, a)
+        int s;
+        sig_t a;
+{
+    return signal__(s, a, 1);
+}
+
+#if defined(__DYNAMIC__)
+sig_t
+_signal_nobind(s, a)
+        int s;
+        sig_t a;
+{
+    return signal__(s, a, 0);
+}
+#endif
diff --git a/gen.subproj/sigsetops.c b/gen.subproj/sigsetops.c
new file mode 100644 (file)
index 0000000..9588381
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <signal.h>
+
+#undef sigemptyset
+#undef sigfillset
+#undef sigaddset
+#undef sigdelset
+#undef sigismember
+
+sigemptyset(set)
+       sigset_t *set;
+{
+       *set = 0;
+       return (0);
+}
+
+sigfillset(set)
+       sigset_t *set;
+{
+       *set = ~(sigset_t)0;
+       return (0);
+}
+
+sigaddset(set, signo)
+       sigset_t *set;
+       int signo;
+{
+       *set |= sigmask(signo);
+       return (0);
+}
+
+sigdelset(set, signo)
+       sigset_t *set;
+       int signo;
+{
+       *set &= ~sigmask(signo);
+       return (0);
+}
+
+sigismember(set, signo)
+       const sigset_t *set;
+       int signo;
+{
+       return ((*set & ~sigmask(signo)) != 0);
+}
diff --git a/gen.subproj/sleep.c b/gen.subproj/sleep.c
new file mode 100644 (file)
index 0000000..e47b89e
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#include <sys/time.h>
+
+extern int nanosleep(const struct timespec *, struct timespec *);
+
+/* We use nanosleep and let it set errno, and compute the residual for us. */
+unsigned int
+sleep(unsigned int seconds)
+{
+    struct timespec req, rem;
+
+    if (seconds == 0) {
+        return 0;
+    }
+    req.tv_sec = seconds;
+    req.tv_nsec = 0;
+
+    /* It's not clear from the spec whether the remainder will be 0
+    ** if we weren't interrupted
+    */
+    if (nanosleep(&req, &rem) == -1) {
+        return (unsigned int)rem.tv_sec;
+    }
+    return 0;
+}
diff --git a/gen.subproj/stack_logging.c b/gen.subproj/stack_logging.c
new file mode 100644 (file)
index 0000000..a8e7a4d
--- /dev/null
@@ -0,0 +1,384 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*     Bertrand from vmutils -> CF -> System */
+
+#import "stack_logging.h"
+
+#import <libc.h>
+#import <pthread.h>
+#import <mach/mach.h>
+#include <mach/vm_statistics.h>
+
+extern void spin_lock(int *);
+
+static inline void *allocate_pages(unsigned bytes) {
+    void *address;
+    if (vm_allocate(mach_task_self(), (vm_address_t *)&address, bytes, 
+                    VM_MAKE_TAG(VM_MEMORY_ANALYSIS_TOOL)| TRUE)) {
+       address = 0;
+    } 
+    return (void *)address;
+}
+
+static inline void deallocate_pages(void *ptr, unsigned bytes) {
+    vm_deallocate(mach_task_self(), (vm_address_t)ptr, bytes);
+}
+
+static inline void copy_pages(const void *source, void *dest, unsigned bytes) {
+    if (vm_copy(mach_task_self(), (vm_address_t)source, bytes, (vm_address_t)dest)) memmove(dest, source, bytes);
+}
+
+/***************       Recording stack         ***********/
+
+static void *first_frame_address(void) {
+#if 0
+    return __builtin_frame_address(1);
+#elif defined(__ppc__)
+    void *addr;
+#warning __builtin_frame_address IS BROKEN IN BEAKER: RADAR #2340421
+    __asm__ volatile("mr %0, r1" : "=r" (addr));
+    return addr;
+#else
+#warning first_frame_address WILL NOT BE FUNCTIONAL ON THIS ARCHITECTURE
+    return NULL;
+#endif
+}
+
+static void *next_frame_address(void *addr) {
+    void *ret;
+#if defined(__MACH__) && defined(__i386__)
+    __asm__ volatile("movl (%1),%0" : "=r" (ret) : "r" (addr));
+#elif defined(__MACH__) && defined(__ppc__)
+    __asm__ volatile("lwz %0,0x0(%1)" : "=r" (ret) : "r" (addr));
+#elif defined(__hpux__)
+    __asm__ volatile("ldw 0x0(%1),%0" : "=r" (ret) : "r" (addr));
+#elif defined(__svr4__)
+    __asm__ volatile("ta 0x3");
+    __asm__ volatile("ld [%1 + 56],%0" : "=r" (ret) : "r" (addr));
+#else
+#error Unknown architecture
+#endif
+    return ret;
+}
+
+#if defined(__i386__) || defined (__m68k__)
+#define FP_LINK_OFFSET 1
+#elif defined(__ppc__)
+#define FP_LINK_OFFSET 2
+#elif defined(__hppa__)
+#define FP_LINK_OFFSET -5
+#elif defined(__sparc__)
+#define FP_LINK_OFFSET 14
+#else
+#error  ********** Unimplemented architecture
+#endif
+
+void thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *nb) {
+    void *addr;
+    addr = first_frame_address();
+    *nb = 0;
+    while ((addr >= (void *)0x800) && (max--)) {
+        vm_address_t   fp_link = (vm_address_t)(((unsigned *)addr)+FP_LINK_OFFSET);
+        void   *addr2;
+        buffer[*nb] = *((vm_address_t *)fp_link);
+        (*nb)++;
+        addr2 = next_frame_address(addr);
+#if defined(__ppc__)
+        if ((unsigned)addr2 <= (unsigned)addr) break; // catch bozo frames
+#endif
+        addr = addr2;
+    }
+}
+
+/***************       Uniquing stack          ***********/
+
+#define MAX_COLLIDE    8
+
+#define MAX_NUM_PC     512
+
+static int enter_pair_in_table(unsigned *table, unsigned numPages, unsigned *uniquedParent, unsigned thisPC) {
+    // uniquedParent is in-out; return 1 is collisions max not exceeded
+    unsigned   base = numPages * vm_page_size / (sizeof(int)*2*2);
+    unsigned   hash = base + (((*uniquedParent) << 4) ^ (thisPC >> 2)) % (base - 1); // modulo odd number for hashing
+    unsigned   collisions = MAX_COLLIDE;
+    while (collisions--) {
+        unsigned       *head = table + hash*2;
+        if (! head[0] && !head[1]) {
+            /* end of chain; store this entry! */
+            /* Note that we need to test for both head[0] and head[1] as (0, -1) is a valid entry */
+            head[0] = thisPC;
+            head[1] = *uniquedParent;
+            *uniquedParent = hash;
+            return 1;
+        }
+        if ((head[0] == thisPC) && (head[1] == *uniquedParent)) {
+            /* we found the proper entry, the value for the pair is the entry offset */
+            *uniquedParent = hash;
+            return 1;
+        }
+        hash++;
+        if (hash == base*2) hash = base;
+    }
+    return 0;
+}
+
+unsigned stack_logging_get_unique_stack(unsigned **table, unsigned *table_num_pages, unsigned *stack_entries, unsigned count, unsigned num_hot_to_skip) {
+    unsigned   uniquedParent = (unsigned)-1;
+    // we skip the warmest entries that are an artefact of the code
+    while (num_hot_to_skip--) {
+        if (count > 0) { stack_entries++; count--; }
+    }
+    while (count--) {
+        unsigned       thisPC = stack_entries[count];
+        while (!enter_pair_in_table(*table, *table_num_pages, &uniquedParent, thisPC)) {
+            unsigned   *newTable;
+            unsigned   oldBytes = (*table_num_pages) * vm_page_size;
+            newTable = allocate_pages(oldBytes*2);
+            copy_pages(*table, newTable, oldBytes);
+            deallocate_pages(*table, oldBytes);
+            *table_num_pages *= 2;
+            *table = newTable;
+        }
+    }
+    return uniquedParent;
+}
+
+/***************       Logging stack and arguments             ***********/
+
+stack_logging_record_list_t *stack_logging_the_record_list = NULL;
+
+int stack_logging_enable_logging = 0;
+
+int stack_logging_dontcompact = 0;
+
+static stack_logging_record_list_t *GrowLogRecords(stack_logging_record_list_t *records, unsigned desiredNumRecords) {
+    stack_logging_record_list_t        *new_records;
+    unsigned   old_size = records->overall_num_bytes;
+    if (desiredNumRecords*sizeof(stack_logging_record_t)+sizeof(stack_logging_record_list_t) < records->overall_num_bytes) return records;
+    records->overall_num_bytes += records->overall_num_bytes + vm_page_size; // in order to always get an even number of pages
+    new_records = allocate_pages(records->overall_num_bytes);
+    copy_pages(records, new_records, old_size);
+    deallocate_pages(records, old_size);
+    return new_records;
+}
+
+static void prepare_to_log_stack(void) {
+    if (!stack_logging_the_record_list) {
+        unsigned       totalSize = 4 * vm_page_size;
+        stack_logging_the_record_list = allocate_pages(totalSize);
+        memset(stack_logging_the_record_list, 0, sizeof(stack_logging_record_list_t));
+        stack_logging_the_record_list->overall_num_bytes = totalSize;
+        stack_logging_the_record_list->uniquing_table_num_pages = 128;
+        stack_logging_the_record_list->uniquing_table = allocate_pages(stack_logging_the_record_list->uniquing_table_num_pages * vm_page_size);
+    }
+}
+
+void stack_logging_log_stack(unsigned type, unsigned arg1, unsigned arg2, unsigned arg3, unsigned result, unsigned num_hot_to_skip) {
+    stack_logging_record_t     *rec;
+    if (!stack_logging_enable_logging) return;
+    // printf("stack_logging_log_stack 0x%x 0x%x 0x%x 0x%x -> 0x%x\n", type, arg1, arg2, arg3, result);
+    if (type & stack_logging_flag_zone) {
+        // just process it now and be done with it!
+        arg1 = arg2; arg2 = arg3; arg3 = 0; type &= ~stack_logging_flag_zone;
+    }
+    if (type & stack_logging_flag_calloc) {
+        // just process it now and be done with it!
+        arg1 *= arg2; arg2 = arg3; arg3 = 0; type &= ~stack_logging_flag_calloc;
+    }
+    if (type & stack_logging_flag_object) {
+        unsigned       *class = (unsigned *)arg1;
+        arg1 = arg2 + class[5]; // corresponds to the instance_size field
+        arg2 = 0; arg3 = 0; type = stack_logging_type_alloc;
+    }
+    if (type & stack_logging_flag_cleared) {
+        type &= ~stack_logging_flag_cleared;
+    }
+    if (type & stack_logging_flag_handle) {
+        if (stack_logging_type_alloc) {
+            if (!result) return;
+            stack_logging_log_stack(stack_logging_type_alloc, 0, 0, 0, result, num_hot_to_skip+1);
+            stack_logging_log_stack(stack_logging_type_alloc, arg1, 0, 0, *((int *)result), num_hot_to_skip+1);
+            return;
+        }
+        if (stack_logging_type_dealloc) {
+            if (!arg1) return;
+            stack_logging_log_stack(stack_logging_type_dealloc, *((int *)arg1), 0, 0, 0, num_hot_to_skip+1);
+            stack_logging_log_stack(stack_logging_type_dealloc, arg1, 0, 0, 0, num_hot_to_skip+1);
+            return;
+        }
+        printf("*** Unknown logging type: 0x%x\n", type);
+    }
+    if (type == stack_logging_flag_set_handle_size) {
+        if (!arg1) return;
+        // Thanks to a horrible hack, arg3 contains the prvious handle value
+        if (arg3 == *((int *)arg1)) return;
+        stack_logging_log_stack(stack_logging_type_dealloc, arg3, 0, 0, 0, num_hot_to_skip+1);
+        stack_logging_log_stack(stack_logging_type_alloc, arg2, 0, 0, *((int *)arg1), num_hot_to_skip+1);
+        return;
+    }            
+    if (type == (stack_logging_type_dealloc|stack_logging_type_alloc)) {
+        if (arg1 == result) return; // realloc had no effect, skipping
+        if (!arg1) {
+            // realloc(NULL, size) same as malloc(size)
+            type = stack_logging_type_alloc; arg1 = arg2; arg2 = arg3; arg3 = 0;
+       } else {
+            // realloc(arg1, arg2) -> result is same as free(arg1); malloc(arg2) -> result
+            stack_logging_log_stack(stack_logging_type_dealloc, arg1, 0, 0, 0, num_hot_to_skip+1);
+            stack_logging_log_stack(stack_logging_type_alloc, arg2, 0, 0, result, num_hot_to_skip+1);
+            return;
+        }
+    }
+    if (type == stack_logging_type_dealloc) {
+        // simple free
+        if (!arg1) return; // free(nil)
+    }
+    prepare_to_log_stack();
+    spin_lock(&stack_logging_the_record_list->lock);
+    stack_logging_enable_logging = 0;
+    stack_logging_the_record_list = GrowLogRecords(stack_logging_the_record_list, stack_logging_the_record_list->num_records + 1);
+    rec = stack_logging_the_record_list->records + stack_logging_the_record_list->num_records;
+    // We take care of the common case of alloc-dealloc
+    if (!stack_logging_dontcompact && stack_logging_the_record_list->num_records && (type == stack_logging_type_dealloc) && arg1 && ((rec-1)->type == stack_logging_type_alloc) && (arg1 == STACK_LOGGING_DISGUISE((rec-1)->address))) {
+        stack_logging_the_record_list->num_records--;
+        // printf("Erased previous record in alloc-dealloc sequence\n");
+    } else {
+        unsigned       stack_entries[MAX_NUM_PC];
+        unsigned       count = 0;
+        rec->type = type;
+        if (type == stack_logging_type_dealloc) {
+            rec->argument = 0;
+            rec->address = STACK_LOGGING_DISGUISE(arg1); // we disguise the address
+        } else if (type == stack_logging_type_alloc) {
+            rec->argument = arg1;
+            rec->address = STACK_LOGGING_DISGUISE(result); // we disguise the address
+        } else {
+            rec->argument = arg2;
+            rec->address = STACK_LOGGING_DISGUISE(arg1); // we disguise the address
+        }
+       // printf("Before getting samples  0x%x 0x%x 0x%x 0x%x -> 0x%x\n", type, arg1, arg2, arg3, result);
+        thread_stack_pcs(stack_entries, MAX_NUM_PC - 1, &count);
+        // We put at the bottom of the stack a marker that denotes the thread (+1 for good measure...)
+        stack_entries[count++] = (int)pthread_self() + 1;
+        /* now let's unique the sample */    
+        // printf("Uniquing 0x%x 0x%x 0x%x 0x%x -> 0x%x\n", type, arg1, arg2, arg3, result);
+        rec->uniqued_stack = stack_logging_get_unique_stack(&stack_logging_the_record_list->uniquing_table, &stack_logging_the_record_list->uniquing_table_num_pages, stack_entries, count, num_hot_to_skip+2); // we additionally skip the warmest 2 entries that are an artefact of the code
+        stack_logging_the_record_list->num_records++;
+    }
+    stack_logging_enable_logging = 1;
+    stack_logging_the_record_list->lock = 0;
+}
+
+static kern_return_t default_reader(task_t task, vm_address_t address, vm_size_t size, void **ptr) {
+    *ptr = (void *)address;
+    return 0;
+}
+
+static kern_return_t get_remote_records(task_t task, memory_reader_t reader, stack_logging_record_list_t **records) {
+    // sets records
+    vm_address_t       *remote_records_address_ref;
+    kern_return_t      err;
+    *records = NULL;
+    err = reader(task, (vm_address_t)&stack_logging_the_record_list, sizeof(vm_address_t), (void **)&remote_records_address_ref);
+    if (err) return err;
+    if (!*remote_records_address_ref) {
+        // printf("stack_logging: no stack record\n");
+        return 0;
+    }
+    // printf("stack_logging: stack records at %p\n", (void *)(*remote_records_address_ref));
+    // printf("stack_logging: reading %d bytes\n", sizeof(stack_logging_record_list_t));
+    err = reader(task, *remote_records_address_ref, sizeof(stack_logging_record_list_t), (void **)records); // get the list head
+    if (err) return err;
+    // printf("stack_logging: overall num bytes = %d\n", records->overall_num_bytes);
+    return reader(task, *remote_records_address_ref, (*records)->overall_num_bytes, (void **)records);
+}
+
+kern_return_t stack_logging_get_frames(task_t task, memory_reader_t reader, vm_address_t address, vm_address_t *stack_frames_buffer, unsigned max_stack_frames, unsigned *num_frames) {
+    stack_logging_record_list_t        *records;
+    kern_return_t      err;
+    unsigned           index;
+    unsigned           disguised = STACK_LOGGING_DISGUISE(address);
+    if (!reader) reader = default_reader;
+    *num_frames = 0;
+    err = get_remote_records(task, reader, &records);
+    if (err || !records) return err;
+    // printf("stack_logging: %d records\n", records->num_records);
+    index = 0;
+    while (index < records->num_records) {
+        stack_logging_record_t *record = records->records + index;
+        if (record->address == disguised) {
+           return stack_logging_frames_for_uniqued_stack(task, reader, record->uniqued_stack, stack_frames_buffer, max_stack_frames, num_frames);
+        }
+       index++;
+    }
+    fprintf(stderr, "*** stack_logging: no record found for 0x%x\n", address);
+    return 0;
+}
+
+kern_return_t stack_logging_enumerate_records(task_t task, memory_reader_t reader, vm_address_t address, void enumerator(stack_logging_record_t, void *), void *context) {
+    stack_logging_record_list_t        *records;
+    kern_return_t      err;
+    unsigned           index;
+    unsigned           disguised = STACK_LOGGING_DISGUISE(address);
+    if (!reader) reader = default_reader;
+    err = get_remote_records(task, reader, &records);
+    if (err || !records) return err;
+    // printf("stack_logging: %d records\n", records->num_records);
+    index = 0;
+    while (index < records->num_records) {
+        stack_logging_record_t *record = records->records + index;
+        if (!address || (record->address == disguised)) enumerator(*record, context);
+       index++;
+    }
+    return 0;
+}
+
+kern_return_t stack_logging_frames_for_uniqued_stack(task_t task, memory_reader_t reader, unsigned uniqued_stack, vm_address_t *stack_frames_buffer, unsigned max_stack_frames, unsigned *num_frames) {
+    stack_logging_record_list_t        *records;
+    unsigned           *uniquing_table;
+    kern_return_t      err;
+    if (!reader) reader = default_reader;
+    *num_frames = 0;
+    err = get_remote_records(task, reader, &records);
+    if (err || !records) return err;
+    err = reader(task, (vm_address_t)records->uniquing_table, records->uniquing_table_num_pages * vm_page_size, (void **)&uniquing_table);
+    if (err) return err;
+    while (max_stack_frames && (uniqued_stack != -1)) {
+       unsigned        thisPC;
+       if ((uniqued_stack * 2 + 1) * sizeof(unsigned) >= records->uniquing_table_num_pages * vm_page_size) {
+           fprintf(stderr, "*** stack_logging: Invalid uniqued stack 0x%x", uniqued_stack);
+           break;
+       }
+       thisPC = uniquing_table[uniqued_stack * 2];
+       uniqued_stack = uniquing_table[uniqued_stack * 2 + 1];
+       if (!thisPC && !uniqued_stack) {
+           // Invalid entry
+           fprintf(stderr, "*** stack_logging: Invalid entry 0x%x", thisPC);
+           break;
+       }
+       stack_frames_buffer[0] = thisPC;
+       stack_frames_buffer++;
+       (*num_frames)++;
+       max_stack_frames--;
+    }
+    return 0;
+}
diff --git a/gen.subproj/stack_logging.h b/gen.subproj/stack_logging.h
new file mode 100644 (file)
index 0000000..32ede79
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#import <malloc.h>
+
+#define stack_logging_type_free        0
+#define stack_logging_type_generic     1       /* anything that is not allocation/deallocation */
+#define stack_logging_type_alloc       2       /* malloc, realloc, etc... */
+#define stack_logging_type_dealloc     4       /* free, realloc, etc... */
+
+// Following flags are absorbed by stack_logging_log_stack()
+#define        stack_logging_flag_zone         8       /* NSZoneMalloc, etc... */
+#define        stack_logging_flag_calloc       16      /* multiply arguments to get the size */
+#define stack_logging_flag_object      32      /* NSAllocateObject(Class, extraBytes, zone) */
+#define stack_logging_flag_cleared     64      /* for NewEmptyHandle */
+#define stack_logging_flag_handle      128     /* for Handle (de-)allocation routines */
+#define stack_logging_flag_set_handle_size     256     /* (Handle, newSize) treated specially */
+
+/* Macro used to disguise addresses so that leak finding can work */
+#define STACK_LOGGING_DISGUISE(address)        (((unsigned)address) ^ 0x00005555) /* nicely idempotent */
+
+typedef struct {
+    unsigned   type;
+    unsigned   uniqued_stack;
+    unsigned   argument;
+    unsigned   address; /* disguised, to avoid confusing leaks */
+} stack_logging_record_t;
+
+typedef struct {
+    unsigned   overall_num_bytes;
+    unsigned   num_records;
+    unsigned   lock; /* 0 means OK to lock; used for inter-process locking */
+    unsigned   *uniquing_table; /* allocated using vm_allocate() */
+            /* hashtable organized as (PC, uniqued parent)
+            Only the second half of the table is active
+            To enable us to grow dynamically */
+    unsigned   uniquing_table_num_pages; /* number of pages of the table */
+    unsigned   extra_retain_count; /* not used by stack_logging_log_stack */
+    unsigned   filler[2]; /* align to cache lines for better performance */
+    stack_logging_record_t     records[0]; /* records follow here */
+} stack_logging_record_list_t;
+
+extern unsigned stack_logging_get_unique_stack(unsigned **table, unsigned *table_num_pages, unsigned *stack_entries, unsigned count, unsigned num_hot_to_skip);
+    /* stack_entries are from hot to cold */
+
+extern stack_logging_record_list_t *stack_logging_the_record_list;
+    /* This is the global variable containing all logs */
+
+extern int stack_logging_enable_logging;
+    /* when clear, no logging takes place */
+
+extern int stack_logging_dontcompact;
+    /* default is to compact; when set does not compact alloc/free logs; useful for tracing history */
+
+extern void stack_logging_log_stack(unsigned type, unsigned arg1, unsigned arg2, unsigned arg3, unsigned result, unsigned num_hot_to_skip);
+
+extern kern_return_t stack_logging_get_frames(task_t task, memory_reader_t reader, vm_address_t address, vm_address_t *stack_frames_buffer, unsigned max_stack_frames, unsigned *num_frames);
+    /* Gets the last record in stack_logging_the_record_list about address */
+
+#define STACK_LOGGING_ENUMERATION_PROVIDED     1       // temporary to avoid dependencies between projects
+
+extern kern_return_t stack_logging_enumerate_records(task_t task, memory_reader_t reader, vm_address_t address, void enumerator(stack_logging_record_t, void *), void *context);
+    /* Gets all the records about address;
+    If !address, gets all records */
+
+extern kern_return_t stack_logging_frames_for_uniqued_stack(task_t task, memory_reader_t reader, unsigned uniqued_stack, vm_address_t *stack_frames_buffer, unsigned max_stack_frames, unsigned *num_frames);
+    /* Given a uniqued_stack fills stack_frames_buffer */
+
+extern void thread_stack_pcs(vm_address_t *buffer, unsigned max, unsigned *num);
+    /* Convenience to fill buffer with the PCs of the frames, starting with the hot frames;
+    num: returned number of frames
+    */
+
diff --git a/gen.subproj/sysconf.c b/gen.subproj/sysconf.c
new file mode 100644 (file)
index 0000000..32cf64c
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Sean Eric Fagan of Cygnus Support.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+/*
+ * sysconf --
+ *     get configurable system variables.
+ *
+ * XXX
+ * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values
+ * not change during the lifetime of the calling process.  This would seem
+ * to require that any change to system limits kill all running processes.
+ * A workaround might be to cache the values when they are first retrieved
+ * and then simply return the cached value on subsequent calls.  This is
+ * less useful than returning up-to-date values, however.
+ */
+long
+sysconf(name)
+       int name;
+{
+       struct clockinfo clk;
+       struct rlimit rl;
+       size_t len;
+       int mib[2], value;
+
+       len = sizeof(value);
+
+       switch (name) {
+/* 1003.1 */
+       case _SC_ARG_MAX:
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_ARGMAX;
+               break;
+       case _SC_CHILD_MAX:
+               return (getrlimit(RLIMIT_NPROC, &rl) ? -1 : rl.rlim_cur);
+       case _SC_CLK_TCK:
+               return (CLK_TCK);
+       case _SC_JOB_CONTROL:
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_JOB_CONTROL;
+               goto yesno;
+       case _SC_NGROUPS_MAX:
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_NGROUPS;
+               break;
+       case _SC_OPEN_MAX:
+               return (getrlimit(RLIMIT_NOFILE, &rl) ? -1 : rl.rlim_cur);
+       case _SC_STREAM_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_STREAM_MAX;
+               break;
+       case _SC_TZNAME_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_TZNAME_MAX;
+               break;
+       case _SC_SAVED_IDS:
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_SAVED_IDS;
+               goto yesno;
+       case _SC_VERSION:
+               mib[0] = CTL_KERN;
+               mib[1] = KERN_POSIX1;
+               break;
+
+/* 1003.2 */
+       case _SC_BC_BASE_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_BC_BASE_MAX;
+               break;
+       case _SC_BC_DIM_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_BC_DIM_MAX;
+               break;
+       case _SC_BC_SCALE_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_BC_SCALE_MAX;
+               break;
+       case _SC_BC_STRING_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_BC_STRING_MAX;
+               break;
+       case _SC_COLL_WEIGHTS_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_COLL_WEIGHTS_MAX;
+               break;
+       case _SC_EXPR_NEST_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_EXPR_NEST_MAX;
+               break;
+       case _SC_LINE_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_LINE_MAX;
+               break;
+       case _SC_RE_DUP_MAX:
+               mib[0] = CTL_USER;
+               mib[1] = USER_RE_DUP_MAX;
+               break;
+       case _SC_2_VERSION:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_VERSION;
+               break;
+       case _SC_2_C_BIND:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_C_BIND;
+               goto yesno;
+       case _SC_2_C_DEV:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_C_DEV;
+               goto yesno;
+       case _SC_2_CHAR_TERM:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_CHAR_TERM;
+               goto yesno;
+       case _SC_2_FORT_DEV:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_FORT_DEV;
+               goto yesno;
+       case _SC_2_FORT_RUN:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_FORT_RUN;
+               goto yesno;
+       case _SC_2_LOCALEDEF:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_LOCALEDEF;
+               goto yesno;
+       case _SC_2_SW_DEV:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_SW_DEV;
+               goto yesno;
+       case _SC_2_UPE:
+               mib[0] = CTL_USER;
+               mib[1] = USER_POSIX2_UPE;
+yesno:         if (sysctl(mib, 2, &value, &len, NULL, 0) == -1)
+                       return (-1);
+               if (value == 0)
+                       return (-1);
+               return (value);
+               break;
+       default:
+               errno = EINVAL;
+               return (-1);
+       }
+       return (sysctl(mib, 2, &value, &len, NULL, 0) == -1 ? -1 : value); 
+}
diff --git a/gen.subproj/sysctl.c b/gen.subproj/sysctl.c
new file mode 100644 (file)
index 0000000..0ba7784
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <paths.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int
+sysctl(name, namelen, oldp, oldlenp, newp, newlen)
+       int *name;
+       u_int namelen;
+       void *oldp, *newp;
+       size_t *oldlenp, newlen;
+{
+       if (name[0] != CTL_USER)
+               return (__sysctl(name, namelen, oldp, oldlenp, newp, newlen));
+
+       if (newp != NULL) {
+               errno = EPERM;
+               return (-1);
+       }
+       if (namelen != 2) {
+               errno = EINVAL;
+               return (-1);
+       }
+
+       switch (name[1]) {
+       case USER_CS_PATH:
+               if (oldp && *oldlenp < sizeof(_PATH_STDPATH))
+                       return (ENOMEM);
+               *oldlenp = sizeof(_PATH_STDPATH);
+               if (oldp != NULL)
+                       memmove(oldp, _PATH_STDPATH, sizeof(_PATH_STDPATH));
+               return (0);
+       }
+
+       if (oldp && *oldlenp < sizeof(int))
+               return (ENOMEM);
+       *oldlenp = sizeof(int);
+       if (oldp == NULL)
+               return (0);
+
+       switch (name[1]) {
+       case USER_BC_BASE_MAX:
+               *(int *)oldp = BC_BASE_MAX;
+               return (0);
+       case USER_BC_DIM_MAX:
+               *(int *)oldp = BC_DIM_MAX;
+               return (0);
+       case USER_BC_SCALE_MAX:
+               *(int *)oldp = BC_SCALE_MAX;
+               return (0);
+       case USER_BC_STRING_MAX:
+               *(int *)oldp = BC_STRING_MAX;
+               return (0);
+       case USER_COLL_WEIGHTS_MAX:
+               *(int *)oldp = COLL_WEIGHTS_MAX;
+               return (0);
+       case USER_EXPR_NEST_MAX:
+               *(int *)oldp = EXPR_NEST_MAX;
+               return (0);
+       case USER_LINE_MAX:
+               *(int *)oldp = LINE_MAX;
+               return (0);
+       case USER_RE_DUP_MAX:
+               *(int *)oldp = RE_DUP_MAX;
+               return (0);
+       case USER_POSIX2_VERSION:
+               *(int *)oldp = _POSIX2_VERSION;
+               return (0);
+       case USER_POSIX2_C_BIND:
+#ifdef POSIX2_C_BIND
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_C_DEV:
+#ifdef POSIX2_C_DEV
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_CHAR_TERM:
+#ifdef POSIX2_CHAR_TERM
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_FORT_DEV:
+#ifdef POSIX2_FORT_DEV
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_FORT_RUN:
+#ifdef POSIX2_FORT_RUN
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_LOCALEDEF:
+#ifdef POSIX2_LOCALEDEF
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_SW_DEV:
+#ifdef POSIX2_SW_DEV
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_POSIX2_UPE:
+#ifdef POSIX2_UPE
+               *(int *)oldp = 1;
+#else
+               *(int *)oldp = 0;
+#endif
+               return (0);
+       case USER_STREAM_MAX:
+               *(int *)oldp = FOPEN_MAX;
+               return (0);
+       case USER_TZNAME_MAX:
+               *(int *)oldp = NAME_MAX;
+               return (0);
+       default:
+               errno = EINVAL;
+               return (-1);
+       }
+       /* NOTREACHED */
+}
diff --git a/gen.subproj/sysctlbyname.c b/gen.subproj/sysctlbyname.c
new file mode 100644 (file)
index 0000000..27e3ca9
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ *
+ * $FreeBSD: src/lib/libc/gen/sysctlbyname.c,v 1.4 1999/08/27 23:59:01 peter Exp $
+ *
+ */
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <string.h>
+
+int
+sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp,
+            size_t newlen)
+{
+       int name2oid_oid[2];
+       int real_oid[CTL_MAXNAME+2];
+       int error;
+       size_t oidlen;
+
+       name2oid_oid[0] = 0;    /* This is magic & undocumented! */
+       name2oid_oid[1] = 3;
+
+       oidlen = sizeof(real_oid);
+       error = sysctl(name2oid_oid, 2, real_oid, &oidlen, (void *)name,
+                      strlen(name));
+       if (error < 0) 
+               return error;
+       oidlen /= sizeof (int);
+       error = sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen);
+       return (error);
+}
+
diff --git a/gen.subproj/syslog.c b/gen.subproj/syslog.c
new file mode 100644 (file)
index 0000000..cd3985f
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/syslog.h>
+#include <sys/uio.h>
+#include <sys/un.h>
+#include <netdb.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <paths.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#include <crt_externs.h>
+static int     LogFile = -1;           /* fd for log */
+static int     connected;              /* have done connect */
+static int     LogStat = 0;            /* status bits, set by openlog() */
+static const char *LogTag = NULL;      /* string to tag the entry with */
+static int     LogFacility = LOG_USER; /* default facility code */
+static int     LogMask = 0xff;         /* mask of priorities to be logged */
+
+/*
+ * syslog, vsyslog --
+ *     print message on log file; output is intended for syslogd(8).
+ */
+void
+#ifdef __STDC__
+syslog(int pri, const char *fmt, ...)
+#else
+syslog(pri, fmt, va_alist)
+       int pri;
+       char *fmt;
+       va_dcl
+#endif
+{
+       va_list ap;
+
+#ifdef __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       vsyslog(pri, fmt, ap);
+       va_end(ap);
+}
+
+void
+vsyslog(pri, fmt, ap)
+       int pri;
+       register const char *fmt;
+       va_list ap;
+{
+       register int cnt;
+       register char ch, *p, *t;
+       time_t now;
+       int fd, saved_errno;
+#define        TBUF_LEN        2048
+#define        FMT_LEN         1024
+       char *stdp, tbuf[TBUF_LEN], fmt_cpy[FMT_LEN];
+       int tbuf_left, fmt_left, prlen;
+
+#define        INTERNALLOG     LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID
+       /* Check for invalid bits. */
+       if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) {
+               syslog(INTERNALLOG,
+                   "syslog: unknown facility/priority: %x", pri);
+               pri &= LOG_PRIMASK|LOG_FACMASK;
+       }
+
+       /* Check priority against setlogmask values. */
+       if (!(LOG_MASK(LOG_PRI(pri)) & LogMask))
+               return;
+
+       saved_errno = errno;
+
+       /* Set default facility if none specified. */
+       if ((pri & LOG_FACMASK) == 0)
+               pri |= LogFacility;
+
+       /* Build the message. */
+       
+       /*
+        * Although it's tempting, we can't ignore the possibility of
+        * overflowing the buffer when assembling the "fixed" portion
+        * of the message.  Strftime's "%h" directive expands to the
+        * locale's abbreviated month name, but if the user has the
+        * ability to construct to his own locale files, it may be
+        * arbitrarily long.
+        */
+       (void)time(&now);
+
+       p = tbuf;  
+       tbuf_left = TBUF_LEN;
+       
+#define        DEC()   \
+       do {                                    \
+               if (prlen >= tbuf_left)         \
+                       prlen = tbuf_left - 1;  \
+               p += prlen;                     \
+               tbuf_left -= prlen;             \
+       } while (0)
+
+       prlen = snprintf(p, tbuf_left, "<%d>", pri);
+       DEC();
+
+       prlen = strftime(p, tbuf_left, "%h %e %T ", localtime(&now));
+       DEC();
+
+       if (LogStat & LOG_PERROR)
+               stdp = p;
+       if (LogTag == NULL)
+               LogTag = *(*_NSGetArgv());
+       if (LogTag != NULL) {
+               prlen = snprintf(p, tbuf_left, "%s", LogTag);
+               DEC();
+       }
+       if (LogStat & LOG_PID) {
+               prlen = snprintf(p, tbuf_left, "[%d]", getpid());
+               DEC();
+       }
+       if (LogTag != NULL) {
+               if (tbuf_left > 1) {
+                       *p++ = ':';
+                       tbuf_left--;
+               }
+               if (tbuf_left > 1) {
+                       *p++ = ' ';
+                       tbuf_left--;
+               }
+       }
+
+       /* 
+        * We wouldn't need this mess if printf handled %m, or if 
+        * strerror() had been invented before syslog().
+        */
+       for (t = fmt_cpy, fmt_left = FMT_LEN; (ch = *fmt); ++fmt) {
+               if (ch == '%' && fmt[1] == 'm') {
+                       ++fmt;
+                       prlen = snprintf(t, fmt_left, "%s",
+                           strerror(saved_errno));
+                       if (prlen >= fmt_left)
+                               prlen = fmt_left - 1;
+                       t += prlen;
+                       fmt_left -= prlen;
+               } else {
+                       if (fmt_left > 1) {
+                               *t++ = ch;
+                               fmt_left--;
+                       }
+               }
+       }
+       *t = '\0';
+
+       prlen = vsnprintf(p, tbuf_left, fmt_cpy, ap);
+       DEC();
+       cnt = p - tbuf;
+
+       /* Output to stderr if requested. */
+       if (LogStat & LOG_PERROR) {
+               struct iovec iov[2];
+
+               iov[0].iov_base = stdp;
+               iov[0].iov_len = cnt - (stdp - tbuf);
+               iov[1].iov_base = "\n";
+               iov[1].iov_len = 1;
+               (void)writev(STDERR_FILENO, iov, 2);
+       }
+
+       /* Get connected, output the message to the local logger. */
+       if (!connected)
+               openlog(LogTag, LogStat | LOG_NDELAY, 0);
+       if (send(LogFile, tbuf, cnt, 0) >= 0)
+               return;
+
+       /*
+        * Output the message to the console; don't worry about blocking,
+        * if console blocks everything will.  Make sure the error reported
+        * is the one from the syslogd failure.
+        */
+       if (LogStat & LOG_CONS &&
+           (fd = open(_PATH_CONSOLE, O_WRONLY, 0)) >= 0) {
+               struct iovec iov[2];
+               
+               p = strchr(tbuf, '>') + 1;
+               iov[0].iov_base = p;
+               iov[0].iov_len = cnt - (p - tbuf);
+               iov[1].iov_base = "\r\n";
+               iov[1].iov_len = 2;
+               (void)writev(fd, iov, 2);
+               (void)close(fd);
+       }
+}
+
+static struct sockaddr_un SyslogAddr;  /* AF_UNIX address of local logger */
+
+void
+openlog(ident, logstat, logfac)
+       const char *ident;
+       int logstat, logfac;
+{
+       if (ident != NULL)
+               LogTag = ident;
+       LogStat = logstat;
+       if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
+               LogFacility = logfac;
+
+       if (LogFile == -1) {
+               SyslogAddr.sun_family = AF_UNIX;
+               (void)strncpy(SyslogAddr.sun_path, _PATH_LOG,
+                   sizeof(SyslogAddr.sun_path));
+               if (LogStat & LOG_NDELAY) {
+                       if ((LogFile = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
+                               return;
+                       (void)fcntl(LogFile, F_SETFD, 1);
+               }
+       }
+       if (LogFile != -1 && !connected)
+               if (connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1) {
+                       (void)close(LogFile);
+                       LogFile = -1;
+               } else
+                       connected = 1;
+}
+
+void
+closelog()
+{
+       (void)close(LogFile);
+       LogFile = -1;
+       connected = 0;
+}
+
+/* setlogmask -- set the log mask level */
+int
+setlogmask(pmask)
+       int pmask;
+{
+       int omask;
+
+       omask = LogMask;
+       if (pmask != 0)
+               LogMask = pmask;
+       return (omask);
+}
diff --git a/gen.subproj/telldir.c b/gen.subproj/telldir.c
new file mode 100644 (file)
index 0000000..19d655e
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/*
+ * The option SINGLEUSE may be defined to say that a telldir
+ * cookie may be used only once before it is freed. This option
+ * is used to avoid having memory usage grow without bound.
+ */
+#define SINGLEUSE
+
+/*
+ * One of these structures is malloced to describe the current directory
+ * position each time telldir is called. It records the current magic 
+ * cookie returned by getdirentries and the offset within the buffer
+ * associated with that return value.
+ */
+struct ddloc {
+       struct  ddloc *loc_next;/* next structure in list */
+       long    loc_index;      /* key associated with structure */
+       long    loc_seek;       /* magic cookie returned by getdirentries */
+       long    loc_loc;        /* offset of entry in buffer */
+};
+
+#define        NDIRHASH        32      /* Num of hash lists, must be a power of 2 */
+#define        LOCHASH(i)      ((i)&(NDIRHASH-1))
+
+static long    dd_loccnt;      /* Index of entry for sequential readdir's */
+static struct  ddloc *dd_hash[NDIRHASH];   /* Hash list heads for ddlocs */
+
+/*
+ * return a pointer into a directory
+ */
+long
+telldir(dirp)
+       const DIR *dirp;
+{
+       register int index;
+       register struct ddloc *lp;
+
+       if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL)
+               return (-1);
+       index = dd_loccnt++;
+       lp->loc_index = index;
+       lp->loc_seek = dirp->dd_seek;
+       lp->loc_loc = dirp->dd_loc;
+       lp->loc_next = dd_hash[LOCHASH(index)];
+       dd_hash[LOCHASH(index)] = lp;
+       return (index);
+}
+
+/*
+ * seek to an entry in a directory.
+ * Only values returned by "telldir" should be passed to seekdir.
+ */
+void
+_seekdir(dirp, loc)
+       register DIR *dirp;
+       long loc;
+{
+       register struct ddloc *lp;
+       register struct ddloc **prevlp;
+       struct dirent *dp;
+
+       prevlp = &dd_hash[LOCHASH(loc)];
+       lp = *prevlp;
+       while (lp != NULL) {
+               if (lp->loc_index == loc)
+                       break;
+               prevlp = &lp->loc_next;
+               lp = lp->loc_next;
+       }
+       if (lp == NULL)
+               return;
+       if (lp->loc_loc == dirp->dd_loc && lp->loc_seek == dirp->dd_seek)
+               goto found;
+       (void) lseek(dirp->dd_fd, (off_t)lp->loc_seek, SEEK_SET);
+       dirp->dd_seek = lp->loc_seek;
+       dirp->dd_loc = 0;
+       while (dirp->dd_loc < lp->loc_loc) {
+               dp = readdir(dirp);
+               if (dp == NULL)
+                       break;
+       }
+found:
+#ifdef SINGLEUSE
+       *prevlp = lp->loc_next;
+       free((caddr_t)lp);
+#endif
+}
diff --git a/gen.subproj/termios.c b/gen.subproj/termios.c
new file mode 100644 (file)
index 0000000..d4af066
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/tty.h>
+#include <sys/time.h>
+#define KERNEL                 /* XXX - FREAD and FWRITE ifdef'd KERNEL*/
+#include <sys/fcntl.h>
+#undef KERNEL
+
+#include <errno.h>
+#include <stdio.h>
+#include <termios.h>
+#include <unistd.h>
+
+int
+tcgetattr(fd, t)
+       int fd;
+       struct termios *t;
+{
+
+       return (ioctl(fd, TIOCGETA, t));
+}
+
+int
+tcsetattr(fd, opt, t)
+       int fd, opt;
+       const struct termios *t;
+{
+       struct termios localterm;
+
+       if (opt & TCSASOFT) {
+               localterm = *t;
+               localterm.c_cflag |= CIGNORE;
+               t = &localterm;
+       }
+       switch (opt & ~TCSASOFT) {
+       case TCSANOW:
+               return (ioctl(fd, TIOCSETA, t));
+       case TCSADRAIN:
+               return (ioctl(fd, TIOCSETAW, t));
+       case TCSAFLUSH:
+               return (ioctl(fd, TIOCSETAF, t));
+       default:
+               errno = EINVAL;
+               return (-1);
+       }
+}
+
+int
+#if __STDC__
+tcsetpgrp(int fd, pid_t pgrp)
+#else
+tcsetpgrp(fd, pgrp)
+       int fd;
+       pid_t pgrp;
+#endif
+{
+       int s;
+
+       s = pgrp;
+       return (ioctl(fd, TIOCSPGRP, &s));
+}
+
+pid_t
+tcgetpgrp(fd)
+{
+       int s;
+
+       if (ioctl(fd, TIOCGPGRP, &s) < 0)
+               return ((pid_t)-1);
+
+       return ((pid_t)s);
+}
+
+speed_t
+cfgetospeed(t)
+       const struct termios *t;
+{
+
+       return (t->c_ospeed);
+}
+
+speed_t
+cfgetispeed(t)
+       const struct termios *t;
+{
+
+       return (t->c_ispeed);
+}
+
+int
+cfsetospeed(t, speed)
+       struct termios *t;
+       speed_t speed;
+{
+
+       t->c_ospeed = speed;
+       return (0);
+}
+
+int
+cfsetispeed(t, speed)
+       struct termios *t;
+       speed_t speed;
+{
+
+       t->c_ispeed = speed;
+       return (0);
+}
+
+int
+cfsetspeed(t, speed)
+       struct termios *t;
+       speed_t speed;
+{
+
+       t->c_ispeed = t->c_ospeed = speed;
+       return (0);
+}
+
+/*
+ * Make a pre-existing termios structure into "raw" mode: character-at-a-time
+ * mode with no characters interpreted, 8-bit data path.
+ */
+void
+cfmakeraw(t)
+       struct termios *t;
+{
+
+       t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+       t->c_oflag &= ~OPOST;
+       t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+       t->c_cflag &= ~(CSIZE|PARENB);
+       t->c_cflag |= CS8;
+       /* XXX set MIN/TIME */
+}
+
+tcsendbreak(fd, len)
+       int fd, len;
+{
+       struct timeval sleepytime;
+
+       sleepytime.tv_sec = 0;
+       sleepytime.tv_usec = 400000;
+       if (ioctl(fd, TIOCSBRK, 0) == -1)
+               return (-1);
+       (void)select(0, 0, 0, 0, &sleepytime);
+       if (ioctl(fd, TIOCCBRK, 0) == -1)
+               return (-1);
+       return (0);
+}
+
+tcdrain(fd)
+       int fd;
+{
+
+       return (ioctl(fd, TIOCDRAIN, 0));
+}
+
+tcflush(fd, which)
+       int fd, which;
+{
+       int com;
+
+       switch (which) {
+       case TCIFLUSH:
+               com = FREAD;
+               break;
+       case TCOFLUSH:
+               com = FWRITE;
+               break;
+       case TCIOFLUSH:
+               com = FREAD | FWRITE;
+               break;
+       default:
+               errno = EINVAL;
+               return (-1);
+       }
+       return (ioctl(fd, TIOCFLUSH, &com));
+}
+
+tcflow(fd, action)
+       int fd, action;
+{
+       struct termios term;
+       u_char c;
+
+       switch (action) {
+       case TCOOFF:
+               return (ioctl(fd, TIOCSTOP, 0));
+       case TCOON:
+               return (ioctl(fd, TIOCSTART, 0));
+       case TCION:
+       case TCIOFF:
+               if (tcgetattr(fd, &term) == -1)
+                       return (-1);
+               c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
+               if (c != _POSIX_VDISABLE && write(fd, &c, sizeof(c)) == -1)
+                       return (-1);
+               return (0);
+       default:
+               errno = EINVAL;
+               return (-1);
+       }
+       /* NOTREACHED */
+}
diff --git a/gen.subproj/time.c b/gen.subproj/time.c
new file mode 100644 (file)
index 0000000..dcfd0b2
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+time_t
+time(t)
+       time_t *t;
+{
+       struct timeval tt;
+
+       if (gettimeofday(&tt, (struct timezone *)0) < 0)
+               return(-1);
+       if (t)
+               *t = tt.tv_sec;
+       return(tt.tv_sec);
+}
diff --git a/gen.subproj/times.c b/gen.subproj/times.c
new file mode 100644 (file)
index 0000000..4b7c4e8
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <sys/resource.h>
+
+/*
+ * Convert usec to clock ticks; could do (usec * CLK_TCK) / 1000000,
+ * but this would overflow if we switch to nanosec.
+ */
+#define        CONVTCK(r)      (r.tv_sec * CLK_TCK + r.tv_usec / (1000000 / CLK_TCK))
+
+clock_t
+times(tp)
+       register struct tms *tp;
+{
+       struct rusage ru;
+       struct timeval t;
+
+       if (getrusage(RUSAGE_SELF, &ru) < 0)
+               return ((clock_t)-1);
+       tp->tms_utime = CONVTCK(ru.ru_utime);
+       tp->tms_stime = CONVTCK(ru.ru_stime);
+       if (getrusage(RUSAGE_CHILDREN, &ru) < 0)
+               return ((clock_t)-1);
+       tp->tms_cutime = CONVTCK(ru.ru_utime);
+       tp->tms_cstime = CONVTCK(ru.ru_stime);
+       if (gettimeofday(&t, (struct timezone *)0))
+               return ((clock_t)-1);
+       return ((clock_t)(CONVTCK(t)));
+}
diff --git a/gen.subproj/timezone.c b/gen.subproj/timezone.c
new file mode 100644 (file)
index 0000000..c175032
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tzfile.h>
+
+char *_tztab();
+
+/*
+ * timezone --
+ *     The arguments are the number of minutes of time you are westward
+ *     from Greenwich and whether DST is in effect.  It returns a string
+ *     giving the name of the local timezone.  Should be replaced, in the
+ *     application code, by a call to localtime.
+ */
+
+static char    czone[TZ_MAX_CHARS];            /* space for zone name */
+
+char *
+timezone(zone, dst)
+       int     zone,
+               dst;
+{
+       register char   *beg,
+                       *end;
+
+       if (beg = getenv("TZNAME")) {           /* set in environment */
+               if (end = index(beg, ',')) {    /* "PST,PDT" */
+                       if (dst)
+                               return(++end);
+                       *end = '\0';
+                       (void)strncpy(czone,beg,sizeof(czone) - 1);
+                       czone[sizeof(czone) - 1] = '\0';
+                       *end = ',';
+                       return(czone);
+               }
+               return(beg);
+       }
+       return(_tztab(zone,dst));       /* default: table or created zone */
+}
+
+static struct zone {
+       int     offset;
+       char    *stdzone;
+       char    *dlzone;
+} zonetab[] = {
+       -1*60,  "MET",  "MET DST",      /* Middle European */
+       -2*60,  "EET",  "EET DST",      /* Eastern European */
+       4*60,   "AST",  "ADT",          /* Atlantic */
+       5*60,   "EST",  "EDT",          /* Eastern */
+       6*60,   "CST",  "CDT",          /* Central */
+       7*60,   "MST",  "MDT",          /* Mountain */
+       8*60,   "PST",  "PDT",          /* Pacific */
+#ifdef notdef
+       /* there's no way to distinguish this from WET */
+       0,      "GMT",  0,              /* Greenwich */
+#endif
+       0*60,   "WET",  "WET DST",      /* Western European */
+       -10*60, "EST",  "EST",          /* Aust: Eastern */
+     -10*60+30,        "CST",  "CST",          /* Aust: Central */
+       -8*60,  "WST",  0,              /* Aust: Western */
+       -1
+};
+
+/*
+ * _tztab --
+ *     check static tables or create a new zone name; broken out so that
+ *     we can make a guess as to what the zone is if the standard tables
+ *     aren't in place in /etc.  DO NOT USE THIS ROUTINE OUTSIDE OF THE
+ *     STANDARD LIBRARY.
+ */
+char *
+_tztab(zone,dst)
+       register int    zone;
+       int     dst;
+{
+       register struct zone    *zp;
+       register char   sign;
+
+       for (zp = zonetab; zp->offset != -1;++zp)       /* static tables */
+               if (zp->offset == zone) {
+                       if (dst && zp->dlzone)
+                               return(zp->dlzone);
+                       if (!dst && zp->stdzone)
+                               return(zp->stdzone);
+               }
+
+       if (zone < 0) {                                 /* create one */
+               zone = -zone;
+               sign = '+';
+       }
+       else
+               sign = '-';
+       (void)sprintf(czone,"GMT%c%d:%02d",sign,zone / 60,zone % 60);
+       return(czone);
+}
diff --git a/gen.subproj/ttyname.c b/gen.subproj/ttyname.c
new file mode 100644 (file)
index 0000000..a07b134
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/termios.h>
+
+#include <fcntl.h>
+#include <dirent.h>
+#include <db.h>
+#include <string.h>
+#include <paths.h>
+
+static char buf[sizeof(_PATH_DEV) + MAXNAMLEN] = _PATH_DEV;
+static char *oldttyname __P((int, struct stat *));
+
+char *
+ttyname(fd)
+       int fd;
+{
+       struct stat sb;
+       struct termios term;
+       DB *db;
+       DBT data, key;
+       struct {
+               mode_t type;
+               dev_t dev;
+       } bkey;
+
+       /* Must be a terminal. */
+       if (ioctl(fd, TIOCGETA, &term) < 0)
+               return (NULL);
+       /* Must be a character device. */
+       if (fstat(fd, &sb) || !S_ISCHR(sb.st_mode))
+               return (NULL);
+
+       db = dbopen(_PATH_DEVDB, O_RDONLY, 0, DB_HASH, NULL);
+       if (db) {
+               memset(&bkey, 0, sizeof(bkey));
+               bkey.type = S_IFCHR;
+               bkey.dev = sb.st_rdev;
+               key.data = &bkey;
+               key.size = sizeof(bkey);
+               if (!(db->get)(db, &key, &data, 0)) {
+                       bcopy(data.data,
+                           buf + sizeof(_PATH_DEV) - 1, data.size);
+                       (void)(db->close)(db);
+                       return (buf);
+               }
+               (void)(db->close)(db);
+       }
+       return (oldttyname(fd, &sb));
+}
+
+static char *
+oldttyname(fd, sb)
+       int fd;
+       struct stat *sb;
+{
+       register struct dirent *dirp;
+       register DIR *dp;
+       struct stat dsb;
+
+       if ((dp = opendir(_PATH_DEV)) == NULL)
+               return (NULL);
+
+       while ( (dirp = readdir(dp)) ) {
+               if (dirp->d_fileno != sb->st_ino)
+                       continue;
+               bcopy(dirp->d_name, buf + sizeof(_PATH_DEV) - 1,
+                   dirp->d_namlen + 1);
+               if (stat(buf, &dsb) || sb->st_dev != dsb.st_dev ||
+                   sb->st_ino != dsb.st_ino)
+                       continue;
+               (void)closedir(dp);
+               return (buf);
+       }
+       (void)closedir(dp);
+       return (NULL);
+}
diff --git a/gen.subproj/ttyslot.c b/gen.subproj/ttyslot.c
new file mode 100644 (file)
index 0000000..bb3cfb5
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <ttyent.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+int
+ttyslot()
+{
+       register struct ttyent *ttyp;
+       register int slot;
+       register char *p;
+       int cnt;
+       char *name;
+
+       setttyent();
+       for (cnt = 0; cnt < 3; ++cnt) 
+               if (name = ttyname(cnt)) {
+                       if (p = rindex(name, '/')) 
+                               ++p;
+                       else
+                               p = name;
+                       for (slot = 1; ttyp = getttyent(); ++slot)
+                               if (!strcmp(ttyp->ty_name, p)) {
+                                       endttyent();
+                                       return(slot);
+                               }
+                       break;
+               }
+       endttyent();
+       return(0);
+}
diff --git a/gen.subproj/ualarm.c b/gen.subproj/ualarm.c
new file mode 100644 (file)
index 0000000..d057766
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/time.h>
+#include <unistd.h>
+
+#define        USPS    1000000         /* # of microseconds in a second */
+
+/*
+ * Generate a SIGALRM signal in ``usecs'' microseconds.
+ * If ``reload'' is non-zero, keep generating SIGALRM
+ * every ``reload'' microseconds after the first signal.
+ */
+unsigned
+ualarm(usecs, reload)
+       register unsigned usecs;
+       register unsigned reload;
+{
+       struct itimerval new, old;
+
+       new.it_interval.tv_usec = reload % USPS;
+       new.it_interval.tv_sec = reload / USPS;
+       
+       new.it_value.tv_usec = usecs % USPS;
+       new.it_value.tv_sec = usecs / USPS;
+
+       if (setitimer(ITIMER_REAL, &new, &old) == 0)
+               return (old.it_value.tv_sec * USPS + old.it_value.tv_usec);
+       /* else */
+               return (-1);
+}
diff --git a/gen.subproj/uname.c b/gen.subproj/uname.c
new file mode 100644 (file)
index 0000000..f3d8ed7
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/utsname.h>
+
+int
+uname(name)
+       struct utsname *name;
+{
+       int mib[2], rval;
+       size_t len;
+       char *p;
+
+       rval = 0;
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_OSTYPE;
+       len = sizeof(name->sysname);
+       if (sysctl(mib, 2, &name->sysname, &len, NULL, 0) == -1)
+               rval = -1;
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_HOSTNAME;
+       len = sizeof(name->nodename);
+       if (sysctl(mib, 2, &name->nodename, &len, NULL, 0) == -1)
+               rval = -1;
+
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_OSRELEASE;
+       len = sizeof(name->release);
+       if (sysctl(mib, 2, &name->release, &len, NULL, 0) == -1)
+               rval = -1;
+
+       /* The version may have newlines in it, turn them into spaces. */
+       mib[0] = CTL_KERN;
+       mib[1] = KERN_VERSION;
+       len = sizeof(name->version);
+       if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1)
+               rval = -1;
+       else
+               for (p = name->version; len--; ++p)
+                       if (*p == '\n' || *p == '\t')
+                               if (len > 1)
+                                       *p = ' ';
+                               else
+                                       *p = '\0';
+
+       mib[0] = CTL_HW;
+       mib[1] = HW_MACHINE;
+       len = sizeof(name->machine);
+       if (sysctl(mib, 2, &name->machine, &len, NULL, 0) == -1)
+               rval = -1;
+       return (rval);
+}
diff --git a/gen.subproj/unvis.c b/gen.subproj/unvis.c
new file mode 100644 (file)
index 0000000..0272875
--- /dev/null
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <vis.h>
+
+/*
+ * decode driven by state machine
+ */
+#define        S_GROUND        0       /* haven't seen escape char */
+#define        S_START         1       /* start decoding special sequence */
+#define        S_META          2       /* metachar started (M) */
+#define        S_META1         3       /* metachar more, regular char (-) */
+#define        S_CTRL          4       /* control char started (^) */
+#define        S_OCTAL2        5       /* octal digit 2 */
+#define        S_OCTAL3        6       /* octal digit 3 */
+
+#define        isoctal(c)      (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
+
+/*
+ * unvis - decode characters previously encoded by vis
+ */
+int
+unvis(cp, c, astate, flag)
+       char *cp;
+       int c, *astate, flag;
+{
+
+       if (flag & UNVIS_END) {
+               if (*astate == S_OCTAL2 || *astate == S_OCTAL3) {
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               } 
+               return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD);
+       }
+
+       switch (*astate) {
+
+       case S_GROUND:
+               *cp = 0;
+               if (c == '\\') {
+                       *astate = S_START;
+                       return (0);
+               } 
+               *cp = c;
+               return (UNVIS_VALID);
+
+       case S_START:
+               switch(c) {
+               case '\\':
+                       *cp = c;
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case '0': case '1': case '2': case '3':
+               case '4': case '5': case '6': case '7':
+                       *cp = (c - '0');
+                       *astate = S_OCTAL2;
+                       return (0);
+               case 'M':
+                       *cp = 0200;
+                       *astate = S_META;
+                       return (0);
+               case '^':
+                       *astate = S_CTRL;
+                       return (0);
+               case 'n':
+                       *cp = '\n';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 'r':
+                       *cp = '\r';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 'b':
+                       *cp = '\b';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 'a':
+                       *cp = '\007';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 'v':
+                       *cp = '\v';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 't':
+                       *cp = '\t';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 'f':
+                       *cp = '\f';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 's':
+                       *cp = ' ';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case 'E':
+                       *cp = '\033';
+                       *astate = S_GROUND;
+                       return (UNVIS_VALID);
+               case '\n':
+                       /*
+                        * hidden newline
+                        */
+                       *astate = S_GROUND;
+                       return (UNVIS_NOCHAR);
+               case '$':
+                       /*
+                        * hidden marker
+                        */
+                       *astate = S_GROUND;
+                       return (UNVIS_NOCHAR);
+               }
+               *astate = S_GROUND;
+               return (UNVIS_SYNBAD);
+                
+       case S_META:
+               if (c == '-')
+                       *astate = S_META1;
+               else if (c == '^')
+                       *astate = S_CTRL;
+               else {
+                       *astate = S_GROUND;
+                       return (UNVIS_SYNBAD);
+               }
+               return (0);
+                
+       case S_META1:
+               *astate = S_GROUND;
+               *cp |= c;
+               return (UNVIS_VALID);
+                
+       case S_CTRL:
+               if (c == '?')
+                       *cp |= 0177;
+               else
+                       *cp |= c & 037;
+               *astate = S_GROUND;
+               return (UNVIS_VALID);
+
+       case S_OCTAL2:  /* second possible octal digit */
+               if (isoctal(c)) {
+                       /* 
+                        * yes - and maybe a third 
+                        */
+                       *cp = (*cp << 3) + (c - '0');
+                       *astate = S_OCTAL3;     
+                       return (0);
+               } 
+               /* 
+                * no - done with current sequence, push back passed char 
+                */
+               *astate = S_GROUND;
+               return (UNVIS_VALIDPUSH);
+
+       case S_OCTAL3:  /* third possible octal digit */
+               *astate = S_GROUND;
+               if (isoctal(c)) {
+                       *cp = (*cp << 3) + (c - '0');
+                       return (UNVIS_VALID);
+               }
+               /*
+                * we were done, push back passed char
+                */
+               return (UNVIS_VALIDPUSH);
+                       
+       default:        
+               /* 
+                * decoder in unknown state - (probably uninitialized) 
+                */
+               *astate = S_GROUND;
+               return (UNVIS_SYNBAD);
+       }
+}
+
+/*
+ * strunvis - decode src into dst 
+ *
+ *     Number of chars decoded into dst is returned, -1 on error.
+ *     Dst is null terminated.
+ */
+
+int
+strunvis(dst, src)
+       register char *dst;
+       register const char *src;
+{
+       register char c;
+       char *start = dst;
+       int state = 0;
+
+       while (c = *src++) {
+       again:
+               switch (unvis(dst, c, &state, 0)) {
+               case UNVIS_VALID:
+                       dst++;
+                       break;
+               case UNVIS_VALIDPUSH:
+                       dst++;
+                       goto again;
+               case 0:
+               case UNVIS_NOCHAR:
+                       break;
+               default:
+                       return (-1);
+               }
+       }
+       if (unvis(dst, c, &state, UNVIS_END) == UNVIS_VALID)
+               dst++;
+       *dst = '\0';
+       return (dst - start);
+}
diff --git a/gen.subproj/usleep.c b/gen.subproj/usleep.c
new file mode 100644 (file)
index 0000000..96e7432
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <mach/mach_types.h>
+#include <mach/thread_switch.h>
+#include <mach/mach_syscalls.h>
+
+void
+usleep(useconds)
+       unsigned int useconds;
+{
+    (void)syscall_thread_switch(THREAD_NULL, SWITCH_OPTION_WAIT, useconds / 1000);
+}
diff --git a/gen.subproj/utime.c b/gen.subproj/utime.c
new file mode 100644 (file)
index 0000000..cdddca7
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/time.h>
+
+#include <utime.h>
+
+int
+utime(path, times)
+       const char *path;
+       const struct utimbuf *times;
+{
+       struct timeval tv[2], *tvp;
+
+       if (times) {
+               tv[0].tv_sec = times->actime;
+               tv[1].tv_sec = times->modtime;
+               tv[0].tv_usec = tv[1].tv_usec = 0;
+               tvp = tv;
+       } else
+               tvp = NULL;
+       return (utimes(path, tvp));
+}
diff --git a/gen.subproj/vis.c b/gen.subproj/vis.c
new file mode 100644 (file)
index 0000000..4b6924e
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <limits.h>
+#include <ctype.h>
+#include <vis.h>
+
+#define        isoctal(c)      (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
+
+/*
+ * vis - visually encode characters
+ */
+char *
+vis(dst, c, flag, nextc)
+       register char *dst;
+       int c, nextc;
+       register int flag;
+{
+       if ((u_int)c <= UCHAR_MAX && isgraph(c) ||
+          ((flag & VIS_SP) == 0 && c == ' ') ||
+          ((flag & VIS_TAB) == 0 && c == '\t') ||
+          ((flag & VIS_NL) == 0 && c == '\n') ||
+          ((flag & VIS_SAFE) && (c == '\b' || c == '\007' || c == '\r'))) {
+               *dst++ = c;
+               if (c == '\\' && (flag & VIS_NOSLASH) == 0)
+                       *dst++ = '\\';
+               *dst = '\0';
+               return (dst);
+       }
+
+       if (flag & VIS_CSTYLE) {
+               switch(c) {
+               case '\n':
+                       *dst++ = '\\';
+                       *dst++ = 'n';
+                       goto done;
+               case '\r':
+                       *dst++ = '\\';
+                       *dst++ = 'r';
+                       goto done;
+               case '\b':
+                       *dst++ = '\\';
+                       *dst++ = 'b';
+                       goto done;
+#if __STDC__
+               case '\a':
+#else
+               case '\007':
+#endif
+                       *dst++ = '\\';
+                       *dst++ = 'a';
+                       goto done;
+               case '\v':
+                       *dst++ = '\\';
+                       *dst++ = 'v';
+                       goto done;
+               case '\t':
+                       *dst++ = '\\';
+                       *dst++ = 't';
+                       goto done;
+               case '\f':
+                       *dst++ = '\\';
+                       *dst++ = 'f';
+                       goto done;
+               case ' ':
+                       *dst++ = '\\';
+                       *dst++ = 's';
+                       goto done;
+               case '\0':
+                       *dst++ = '\\';
+                       *dst++ = '0';
+                       if (isoctal(nextc)) {
+                               *dst++ = '0';
+                               *dst++ = '0';
+                       }
+                       goto done;
+               }
+       }
+       if (((c & 0177) == ' ') || (flag & VIS_OCTAL)) {        
+               *dst++ = '\\';
+               *dst++ = ((u_char)c >> 6 & 07) + '0';
+               *dst++ = ((u_char)c >> 3 & 07) + '0';
+               *dst++ = ((u_char)c & 07) + '0';
+               goto done;
+       }
+       if ((flag & VIS_NOSLASH) == 0)
+               *dst++ = '\\';
+       if (c & 0200) {
+               c &= 0177;
+               *dst++ = 'M';
+       }
+       if (iscntrl(c)) {
+               *dst++ = '^';
+               if (c == 0177)
+                       *dst++ = '?';
+               else
+                       *dst++ = c + '@';
+       } else {
+               *dst++ = '-';
+               *dst++ = c;
+       }
+done:
+       *dst = '\0';
+       return (dst);
+}
+
+/*
+ * strvis, strvisx - visually encode characters from src into dst
+ *     
+ *     Dst must be 4 times the size of src to account for possible
+ *     expansion.  The length of dst, not including the trailing NULL,
+ *     is returned. 
+ *
+ *     Strvisx encodes exactly len bytes from src into dst.
+ *     This is useful for encoding a block of data.
+ */
+int
+strvis(dst, src, flag)
+       register char *dst;
+       register const char *src;
+       int flag;
+{
+       register char c;
+       char *start;
+
+       for (start = dst; c = *src;)
+               dst = vis(dst, c, flag, *++src);
+       *dst = '\0';
+       return (dst - start);
+}
+
+int
+strvisx(dst, src, len, flag)
+       register char *dst;
+       register const char *src;
+       register size_t len;
+       int flag;
+{
+       int c;
+       char *start;
+
+       for (start = dst; len > 1; len--) {
+               c = *src;
+               dst = vis(dst, c, flag, *++src);
+       }
+       if (len)
+               dst = vis(dst, *src, flag, '\0');
+       *dst = '\0';
+
+       return (dst - start);
+}
diff --git a/gen.subproj/wait.c b/gen.subproj/wait.c
new file mode 100644 (file)
index 0000000..216853a
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <sys/resource.h>
+
+pid_t wait(istat)
+       int *istat;
+{
+       return (wait4(WAIT_ANY, istat, 0, (struct rusage *)0));
+}
+
diff --git a/gen.subproj/wait3.c b/gen.subproj/wait3.c
new file mode 100644 (file)
index 0000000..e516385
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <sys/resource.h>
+
+pid_t
+wait3(istat, options, rup)
+       int *istat;
+       int options;
+       struct rusage *rup;
+{
+       return (wait4(WAIT_ANY, istat, options, rup));
+}
diff --git a/gen.subproj/waitpid.c b/gen.subproj/waitpid.c
new file mode 100644 (file)
index 0000000..f60a2f1
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <sys/resource.h>
+
+pid_t
+#if __STDC__
+waitpid(pid_t pid, int *istat, int options)
+#else
+waitpid(pid, istat, options)
+       pid_t pid;
+       int *istat;
+       int options;
+#endif
+{
+       return (wait4(pid, istat, options, (struct rusage *)0));
+}
diff --git a/gen.subproj/zone.c b/gen.subproj/zone.c
new file mode 100644 (file)
index 0000000..0f4610f
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#import <objc/zone.h>
+#import <stdio.h>
+#import <libc.h>
+
+/*********     NX functions    ************/
+
+malloc_zone_t *NXDefaultMallocZone() {
+    return malloc_default_zone();
+}
+
+malloc_zone_t *NXCreateZone(size_t startsize, size_t granularity, int canfree) {
+    return malloc_create_zone(startsize, 0);
+}
+
+void NXNameZone(malloc_zone_t *z, const char *name) {
+    malloc_set_zone_name(z, name);
+}
+
+void *NXZoneMalloc(malloc_zone_t *zone, size_t size) {
+    return malloc_zone_malloc(zone, size);
+}
+
+void *NXZoneRealloc(malloc_zone_t *zone, void *ptr, size_t size) {
+    return malloc_zone_realloc(zone, ptr, size);
+}
+
+void *NXZoneCalloc(malloc_zone_t *zone, size_t num_items, size_t size) {
+    return malloc_zone_calloc(zone, num_items, size);
+}
+
+void NXZoneFree(malloc_zone_t *zone, void *ptr) {
+    malloc_zone_free(zone, ptr);
+}
+
+void NXDestroyZone(malloc_zone_t *zone) {
+    if (zone == malloc_default_zone()) return; // we avoid destroying child zones
+    malloc_destroy_zone(zone);
+}
+
+NXZone *NXZoneFromPtr(void *ptr) {
+    NXZone     *zone = malloc_zone_from_ptr(ptr);
+    if (!zone) {
+        fprintf(stderr, "*** malloc[%d]: NXZoneFromPtr() did not find any zone for %p; returning default\n", getpid(), ptr);
+        zone = NX_NOZONE;
+    }
+    return zone;
+}
+
+void NXAddRegion(void *start, size_t size, malloc_zone_t *zone) {
+    fprintf(stderr, "*** malloc[%d]: OBSOLETE: NXAddRegion()\n", getpid());
+}
+
+void NXRemoveRegion(void *start) {
+    fprintf(stderr, "*** malloc[%d]: OBSOLETE: NXRemoveRegion()\n", getpid());
+}
+
+void NXZonePtrInfo(void *ptr) {
+    malloc_zone_print_ptr_info(ptr);
+}
+
+int NXMallocCheck(void) {
+    malloc_zone_check(NULL);
+    return 1;
+}
+
+void _NXMallocDumpZones(void) {
+    malloc_zone_print(NULL, 0);
+}
+
+/*****************     UNIMPLEMENTED ENTRY POINTS      ********************/
+
+void NXMergeZone(malloc_zone_t *z) {
+    static char warned = 0;
+    if (!warned) {
+        fprintf(stderr, "*** malloc[%d]: NXMergeZone() now obsolete, does nothing\n", getpid());
+        warned = 1;
+    }
+}
+
+boolean_t NXProtectZone(malloc_zone_t *zone, int protection) {
+    fprintf(stderr, "*** malloc[%d]: NXProtectZone() is obsolete\n", getpid());
+    return 0;
+}
+
+malloc_zone_t *NXCreateChildZone(malloc_zone_t *parentzone, size_t startsize, size_t granularity, int canfree) {
+    // We can not remove this one as it is still used by IndexingKit
+    static char warned = 0;
+    if (!warned) {
+        fprintf(stderr, "*** malloc[%d]: NXCreateChildZone() now obsolete, has been defined to create new zone\n", getpid());
+        warned = 1;
+    }
+    return NXCreateZone(startsize, granularity, canfree);
+}
+
+void _NXMallocDumpFrees(void) {
+    fprintf(stderr, "*** malloc[%d]: OBSOLETE: _NXMallocDumpFrees()\n", getpid());
+}
+
diff --git a/gen.subproj/zone.h b/gen.subproj/zone.h
new file mode 100644 (file)
index 0000000..94dd796
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#import <objc/malloc.h>
+
+typedef malloc_zone_t NXZone;
+
+#define NX_NOZONE  ((NXZone *)0)
+
+/*********     Interface to zone based malloc  ************/
+
+extern NXZone *NXDefaultMallocZone(void);
+    // Returns the default zone used by the malloc(3) calls
+
+extern NXZone *NXCreateZone(size_t startSize, size_t granularity, int canFree);
+    // Create a new zone with its own memory pool.
+    // canfree: if 0 the allocator will never free memory and mallocing will be fast
+
+extern void NXNameZone(NXZone *z, const char *name);
+    // name a zone; The string will be copied
+
+extern void *NXZoneMalloc(malloc_zone_t *zone, size_t size);
+
+extern void *NXZoneRealloc(malloc_zone_t *zone, void *ptr, size_t size);
+
+extern void *NXZoneCalloc(NXZone *zonep, size_t numElems, size_t byteSize);
+    // Allocates and then clears
+
+extern void NXZoneFree(malloc_zone_t *zone, void *ptr);
+
+extern void NXDestroyZone(malloc_zone_t *zone);
+
+extern NXZone *NXZoneFromPtr(void *ptr);
+    // Returns the zone for a pointer, or NX_NOZONE if not in any zone.
+    // The ptr must have been returned from a malloc or realloc call.
+
diff --git a/headers.subproj/Makefile b/headers.subproj/Makefile
new file mode 100644 (file)
index 0000000..4c2346e
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = headers
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = asm.h crt_externs.h libc.h monitor.h NSSystemDirectories.h\
+         standards.h
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+PUBLIC_HEADERS = crt_externs.h libc.h monitor.h NSSystemDirectories.h\
+                 standards.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/SandBox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/headers.subproj/Makefile.postamble b/headers.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..df76c31
--- /dev/null
@@ -0,0 +1,5 @@
+$(DSTROOT)$(PRIVATE_HDR_INSTALLDIR)$(MY_PRIVATE_HEADER_DIR_SUFFIX):
+       $(MKDIRS) $@
+
+my_installhdrs: $(DSTROOT)$(PRIVATE_HDR_INSTALLDIR)$(MY_PRIVATE_HEADER_DIR_SUFFIX)
+       $(SILENT) $(FASTCP) $(MY_PRIVATE_HEADERS)  $(DSTROOT)$(PRIVATE_HDR_INSTALLDIR)$(MY_PRIVATE_HEADER_DIR_SUFFIX)
diff --git a/headers.subproj/Makefile.preamble b/headers.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..1a55329
--- /dev/null
@@ -0,0 +1,4 @@
+MY_PRIVATE_HEADERS = asm.h
+PUBLIC_HEADER_DIR_SUFFIX = 
+MY_PRIVATE_HEADER_DIR_SUFFIX = /machine
+AFTER_INSTALLHDRS += my_installhdrs
diff --git a/headers.subproj/NSSystemDirectories.h b/headers.subproj/NSSystemDirectories.h
new file mode 100644 (file)
index 0000000..75782d6
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999-2000 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999-2000 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ This API returns the various standard system directories where apps, resources, etc get installed.
+ Because queries can return multiple directories, the API is in the form of an enumeration.
+ The directories are returned in search path order; that is, the first place to look is returned first.
+ This API may return directories that do not exist yet.
+ If NSUserDomain is included in a query, then the results will contain "~" to refer to the user's directory.
+ NEXT_ROOT is prepended as necessary to the returned values.
+ Some calls might return no directories!
+ The buffer that is passed in will be filled with a null-terminated string, possibly containing as many as PATH_MAX-1 characters.
+
+ Typical usage:
+    #include <limits.h>
+    #include <NSSystemDirectories.h>
+
+    char path[PATH_MAX];
+    NSSearchPathEnumerationState state = NSStartSearchPathEnumeration(dir, domainMask);
+    while (state = NSGetNextSearchPathEnumeration(state, path)) {
+        // Handle path
+    }
+
+
+*/
+
+#ifndef __NS_SYSTEM_DIRECTORIES_H__
+#define __NS_SYSTEM_DIRECTORIES_H__
+
+// Directories
+
+typedef enum {
+    NSApplicationDirectory = 1,                // supported applications (Applications)
+    NSDemoApplicationDirectory,                // unsupported applications, demonstration versions (Applications/GrabBag)
+    NSDeveloperApplicationDirectory,   // developer applications (Developer/Applications)
+    NSAdminApplicationDirectory,       // system and network administration applications (Applications/Utilities)
+    NSLibraryDirectory,                // various user-visible documentation, support, and configuration files, resources (Library)
+    NSDeveloperDirectory,              // developer resources (Developer)
+    NSUserDirectory,                   // user home directories (Users)
+    NSDocumentationDirectory,          // documentation (Library/Documentation)
+    NSAllApplicationsDirectory = 100,  // all directories where applications can occur (Applications, Applications/Utilities, Developer/Applications, Applications/GrabBag)
+    NSAllLibrariesDirectory = 101      // all directories where resources can occur (Library, Developer)
+} NSSearchPathDirectory;
+
+// Domains
+
+typedef enum {
+   NSUserDomainMask = 1,       // user's home directory --- place to install user's personal items (~)
+   NSLocalDomainMask = 2,      // local to the current machine --- place to install items available to everyone on this machine
+   NSNetworkDomainMask = 4,    // publically available location in the local area network --- place to install items available on the network (/Network)
+   NSSystemDomainMask = 8,     // provided by Apple
+   NSAllDomainsMask = 0x0ffff  // all domains: all of the above and more, future items
+} NSSearchPathDomainMask;
+
+typedef unsigned int NSSearchPathEnumerationState;
+
+/* Enumeration
+ Call NSStartSearchPathEnumeration() once, then call NSGetNextSearchPathEnumeration() one or more times with the returned state.
+ The return value of NSGetNextSearchPathEnumeration() should be used as the state next time around.
+ When NSGetNextSearchPathEnumeration() returns 0, you're done.
+*/
+extern NSSearchPathEnumerationState NSStartSearchPathEnumeration(NSSearchPathDirectory dir, NSSearchPathDomainMask domainMask);
+
+extern NSSearchPathEnumerationState NSGetNextSearchPathEnumeration(NSSearchPathEnumerationState state, char *path);
+
+#endif /* __NS_SYSTEM_DIRECTORIES_H__ */
diff --git a/headers.subproj/PB.project b/headers.subproj/PB.project
new file mode 100644 (file)
index 0000000..c329ba0
--- /dev/null
@@ -0,0 +1,41 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (
+            asm.h, 
+            crt_externs.h, 
+            libc.h, 
+            monitor.h, 
+            NSSystemDirectories.h, 
+            standards.h 
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        PRECOMPILED_HEADERS = (); 
+        PROJECT_HEADERS = (); 
+        PUBLIC_HEADERS = (
+            crt_externs.h, 
+            libc.h, 
+            monitor.h, 
+            NSSystemDirectories.h, 
+            standards.h 
+        ); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/SandBox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = headers; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/headers.subproj/asm.h b/headers.subproj/asm.h
new file mode 100644 (file)
index 0000000..d21a6b5
--- /dev/null
@@ -0,0 +1,415 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+#ifndef        _PPC_ASM_H_
+#define        _PPC_ASM_H_
+
+#ifdef __ELF__
+#define __NO_UNDERSCORES__ 1
+#define        __ASMNL__       ;
+#else
+#define        __ASMNL__       @
+#endif
+
+#ifdef ASSEMBLER
+
+#ifdef __ELF__
+#define r0 0
+#define r1 1
+#define r2 2
+#define r3 3
+#define r4 4
+#define r5 5
+#define r6 6
+#define r7 7
+#define r8 8
+#define r9 9
+#define r10 10
+#define r11 11
+#define r12 12
+#define r13 13
+#define r14 14
+#define r15 15
+#define r16 16
+#define r17 17
+#define r18 18
+#define r19 19
+#define r20 20
+#define r21 21
+#define r22 22
+#define r23 23
+#define r24 24
+#define r25 25
+#define r26 26
+#define r27 27
+#define r28 28
+#define r29 29
+#define r30 30
+#define r31 31
+
+#define f0 0
+#define f1 1
+#define f2 2
+#define f3 3
+#define f4 4
+#define f5 5
+#define f6 6
+#define f7 7
+#define f8 8
+#define f9 9
+#define f10 10
+#define f11 11
+#define f12 12
+#define f13 13
+#define f14 14
+#define f15 15
+#define f16 16
+#define f17 17
+#define f18 18
+#define f19 19
+#define f20 20
+#define f21 21
+#define f22 22
+#define f23 23
+#define f24 24
+#define f25 25
+#define f26 26
+#define f27 27
+#define f28 28
+#define f29 29
+#define f30 30
+#define f31 31
+
+#define sr0 0
+#define sr1 1
+#define sr2 2
+#define sr3 3
+#define sr4 4
+#define sr5 5
+#define sr6 6
+#define sr7 7
+#define sr8 8
+#define sr9 9
+#define sr10 10
+#define sr11 11
+#define sr12 12
+#define sr13 13
+#define sr14 14
+#define sr15 15
+#define sr16 16
+#define sr17 17
+#define sr18 18
+#define sr19 19
+#define sr20 20
+#define sr21 21
+#define sr22 22
+#define sr23 23
+#define sr24 24
+#define sr25 25
+#define sr26 26
+#define sr27 27
+#define sr28 28
+#define sr29 29
+#define sr30 30
+#define sr31 31
+#endif
+
+#define ARG0 r3
+#define ARG1 r4
+#define ARG2 r5
+#define ARG3 r6
+#define ARG4 r7
+#define ARG5 r8
+#define ARG6 r9
+#define ARG7 r10
+
+#define tmp0   r0      /* Temporary GPR remapping (603e specific) */
+#define tmp1   r1
+#define tmp2   r2
+#define tmp3   r3
+
+/* SPR registers */
+
+#define dmiss  976             /* ea that missed */
+#define dcmp   977             /* compare value for the va that missed */
+#define hash1  978             /* pointer to first hash pteg */
+#define        hash2   979             /* pointer to second hash pteg */
+#define imiss  980             /* ea that missed */
+#define icmp   981             /* compare value for the va that missed */
+#define rpa    982             /* required physical address register */
+
+#define iabr   1010            /* instruction address breakpoint register */
+#define pir    1023            /* Processor ID Register */
+
+/* MQ register on the 601 */
+#define mq     0               /* spr number for mq register on 601 */
+
+#define IBAT0U 528
+#define IBAT0L 529
+#define IBAT1U 530
+#define IBAT1L 531
+#define IBAT2U 532
+#define IBAT2L 533
+#define IBAT3U 534
+#define IBAT3L 535
+#define ibat0u 528
+#define ibat0l 529
+#define ibat1u 530
+#define ibat1l 531
+#define ibat2u 532
+#define ibat2l 533
+#define ibat3u 534
+#define ibat3l 535
+
+#define DBAT0U 536
+#define DBAT0L 537
+#define DBAT1U 538
+#define DBAT1L 539
+#define DBAT2U 540
+#define DBAT2L 541
+#define DBAT3U 542
+#define DBAT3L 543
+#define dbat0u 536
+#define dbat0l 537
+#define dbat1u 538
+#define dbat1l 539
+#define dbat2u 540
+#define dbat2l 541
+#define dbat3u 542
+#define dbat3l 543
+
+#define HID0   1008
+#define hid0   1008
+#define HID1   1009
+#define hid1   1009
+#define SDR1   25
+#define sprg0  272
+#define sprg1  273
+#define sprg2  274
+#define sprg3  275
+#define ppcDAR 19
+#define ppcdar 19
+#define srr0   26
+#define srr1   27
+
+#define CR0 0
+#define CR1 1
+#define CR2 2
+#define CR3 3
+#define CR4 4
+#define CR5 5
+#define CR6 6
+#define CR7 7
+
+#ifdef __ELF__
+#define cr0 0
+#define cr1 1
+#define cr2 2
+#define cr3 3
+#define cr4 4
+#define cr5 5
+#define cr6 6
+#define cr7 7
+#endif
+
+#define cr0_lt 0
+#define cr0_gt 1
+#define cr0_eq 2
+#define cr0_so 3
+#define cr0_un 3
+
+/*
+ * Macros to access high and low word values of an address
+ */
+
+#ifndef        __ELF__
+#define        HIGH_CADDR(x)   ha16(x)
+#define        HIGH_ADDR(x)    hi16(x)
+#define        LOW_ADDR(x)     lo16(x)
+#else
+#define        HIGH_CADDR(x)   x@ha
+#define        HIGH_ADDR(x)    x@h
+#define        LOW_ADDR(x)     x@l
+#endif /* __ELF__ */
+
+#endif /* ASSEMBLER */
+
+/* Tags are placed before Immediately Following Code (IFC) for the debugger
+ * to be able to deduce where to find various registers when backtracing
+ * 
+ * We only define the values as we use them, see SVR4 ABI PowerPc Supplement
+ * for more details (defined in ELF spec).
+ */
+
+#define TAG_NO_FRAME_USED 0x00000000
+
+/* (should use genassym to get these offsets) */
+
+#define FM_BACKPTR 0
+/* TODO NMGS FM_SIZE 8 is ok according to EABI specs, but gcc uses 16 */
+#ifdef __ELF__
+#define FM_LR_SAVE 4  /* gcc 2.7.1 is now following eabi spec correctly */
+#define FM_SIZE    16   /* minimum frame contents, backptr and LR save */
+#define FM_ARG0           8
+#else
+#define        FM_CR_SAVE 4
+#define FM_LR_SAVE 8 /* Rhapsody iS NOT following the ABI at the moment.. */
+#define FM_SIZE    72   /* minimum frame contents, backptr and LR save */
+#define FM_ARG0           56
+#endif
+
+#define        FM_ELF_ARG0             8
+#define        FM_MACHO_ARG0           56
+#define        MACHO_SYSCALL_BEGIN     0x2000
+#define        PK_SYSCALL_BEGIN        0x7000
+
+
+/* redzone is the area under the stack pointer which must be preserved
+ * when taking a trap, interrupt etc. This is no longer needed as gcc
+ * (2.7.2 and above) now follows ELF spec correctly and never loads/stores
+ * below the frame pointer
+ */
+#ifdef __ELF__
+#define FM_REDZONE 0                           /* was ((32-14+1)*4) */
+#else
+#define FM_REDZONE 224                         /* is ((32-14+1)*4) */
+#endif
+
+#define COPYIN_ARG0_OFFSET FM_ARG0
+
+#ifdef MACH_KERNEL_BUILD
+#include <mach_kdb.h>
+#else  /* MACH_KERNEL */
+#define MACH_KDB 0
+#endif /* MACH_KERNEL */
+
+#define BREAKPOINT_TRAP twge   r2,r2
+
+/* There is another definition of ALIGN for .c sources */
+#ifndef __LANGUAGE_ASSEMBLY
+#define ALIGN 2
+#endif /* __LANGUAGE_ASSEMBLY */
+
+#ifndef FALIGN
+#define FALIGN 2 /* Align functions on words for now. Cachelines is better */
+#endif
+
+#define LB(x,n) n
+#if    __STDC__
+#ifndef __NO_UNDERSCORES__
+#define        LCL(x)  L ## x
+#define EXT(x) _ ## x
+#define LEXT(x) _ ## x ## :
+#else
+#define        LCL(x)  .L ## x
+#define EXT(x) x
+#define LEXT(x) x ## :
+#endif
+#define LBc(x,n) n ## :
+#define LBb(x,n) n ## b
+#define LBf(x,n) n ## f
+#else /* __STDC__ */
+#ifndef __NO_UNDERSCORES__
+#define LCL(x) L/**/x
+#define EXT(x) _/**/x
+#define LEXT(x) _/**/x/**/:
+#else /* __NO_UNDERSCORES__ */
+#define        LCL(x)  .L/**/x
+#define EXT(x) x
+#define LEXT(x) x/**/:
+#endif /* __NO_UNDERSCORES__ */
+#define LBc(x,n) n/**/:
+#define LBb(x,n) n/**/b
+#define LBf(x,n) n/**/f
+#endif /* __STDC__ */
+
+#define String .asciz
+#define Value  .word
+#define Times(a,b) (a*b)
+#define Divide(a,b) (a/b)
+
+#define data16 .byte 0x66
+#define addr16 .byte 0x67
+
+#if !GPROF
+#define MCOUNT
+
+#elif defined(__SHARED__)
+#define MCOUNT         ; .data;\
+                       .align ALIGN;\
+                       LBc(x, 8) .long 0;\
+                       .text;\
+                       Gpush;\
+                       Gload;\
+                       leal Gotoff(LBb(x,8)),%edx;\
+                       Egaddr(%eax,_mcount_ptr);\
+                       Gpop;\
+                       call *(%eax);
+
+#else  /* !GPROF, !__SHARED__ */
+#define MCOUNT         ; .data;\
+                       .align ALIGN;\
+                       LBc(x, 8) .long 0;\
+                       .text;\
+                       movl $LBb(x,8),%edx;\
+                       call *EXT(_mcount_ptr);
+
+#endif /* GPROF */
+
+#ifdef __ELF__
+#define ELF_FUNC(x)    .type x,@function
+#define ELF_DATA(x)    .type x,@object
+#define ELF_SIZE(x,s)  .size x,s
+#else
+#define ELF_FUNC(x)
+#define ELF_DATA(x)
+#define ELF_SIZE(x,s)
+#endif
+
+#ifdef __ELF__
+#define        Entry(x,tag)    .globl EXT(x); ELF_FUNC(EXT(x)); .long tag;.align FALIGN; LEXT(x)
+#define        ENTRY(x,tag)    Entry(x,tag) MCOUNT
+#define        ENTRY2(x,y,tag) .globl EXT(x); .globl EXT(y); \
+                       ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \
+                       .align FALIGN; LEXT(x); LEXT(y) \
+                       MCOUNT
+#if __STDC__
+#define        ASENTRY(x)      .globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
+#else
+#define        ASENTRY(x)      .globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT
+#endif /* __STDC__ */
+#define        DATA(x)         .globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
+
+#else  /* __ELF__ */
+
+#define        Entry(x,tag)    .text@.align FALIGN@ .globl EXT(x)@ LEXT(x)
+#define        ENTRY(x,tag)    Entry(x,tag)@MCOUNT
+#define        ENTRY2(x,y,tag) .text@ .align FALIGN@ .globl EXT(x)@ .globl EXT(y)@ \
+                       LEXT(x)@ LEXT(y) @\
+                       MCOUNT
+#if __STDC__
+#define        ASENTRY(x)      .globl x @ .align FALIGN; x ## @ MCOUNT
+#else
+#define        ASENTRY(x)      .globl x @ .align FALIGN; x @ MCOUNT
+#endif /* __STDC__ */
+#define        DATA(x)         .globl EXT(x) @ .align ALIGN @ LEXT(x)
+#endif
+
+
+
+#define End(x)         ELF_SIZE(x,.-x)
+#define END(x)         End(EXT(x))
+#define ENDDATA(x)     END(x)
+#define Enddata(x)     End(x)
+
+/* These defines are here for .c files that wish to reference global symbols
+ * within __asm__ statements. 
+ */
+#ifndef __NO_UNDERSCORES__
+#define CC_SYM_PREFIX "_"
+#else
+#define CC_SYM_PREFIX ""
+#endif /* __NO_UNDERSCORES__ */
+
+#endif /* _PPC_ASM_H_ */
diff --git a/headers.subproj/crt_externs.h b/headers.subproj/crt_externs.h
new file mode 100644 (file)
index 0000000..9434878
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+
+/*
+** Prototypes for the functions to get environment information in
+** the world of dynamic libraries. Lifted from .c file of same name.
+** Fri Jun 23 12:56:47 PDT 1995
+** AOF (afreier@next.com)
+*/
+
+extern char ***_NSGetArgv(void);
+extern int *_NSGetArgc(void);
+extern char ***_NSGetEnviron(void);
+extern struct mach_header *_NSGetMachExecuteHeader(void);
diff --git a/headers.subproj/libc.h b/headers.subproj/libc.h
new file mode 100644 (file)
index 0000000..9125b3c
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+
+#ifndef LIBC_H
+#define LIBC_H
+
+#include <stdio.h>
+#include <standards.h>
+#include <unistd.h>
+
+#ifdef __STRICT_BSD__
+#include <strings.h>
+#include <varargs.h>
+#else
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <stdarg.h>
+#endif
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <sys/resource.h>
+#include <sys/param.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <mach/machine/vm_types.h>
+#include <mach/boolean.h>
+#include <mach/kern_return.h>
+
+struct qelem {
+        struct qelem *q_forw;
+        struct qelem *q_back;
+        char *q_data;
+};
+
+extern kern_return_t map_fd(int fd, vm_offset_t offset,
+        vm_offset_t *addr, boolean_t find_space, vm_size_t numbytes);
+
+
+#endif  /* _LIBC_H */
diff --git a/headers.subproj/monitor.h b/headers.subproj/monitor.h
new file mode 100644 (file)
index 0000000..d9c14f3
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Copyright (c) 1988 NeXT, Inc.
+ *
+ * HISTORY
+ *  04-May-90 Created
+ */
+
+#ifndef __MONITOR_HEADER__
+#define __MONITOR_HEADER__
+
+extern void monstartup (char *lowpc, char *highpc);
+
+extern void monitor (char *lowpc, char *highpc, char *buf, int bufsiz, int cntsiz);
+
+extern void moncontrol (int mode);
+
+extern void monoutput (const char *filename);
+
+extern void moninit (void);
+
+extern void monreset (void);
+
+#endif /* __MONITOR_HEADER__ */
diff --git a/headers.subproj/standards.h b/headers.subproj/standards.h
new file mode 100644 (file)
index 0000000..934b381
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+
+#ifndef _STANDARDS_H
+#define _STANDARDS_H
+
+#ifdef _POSIX_SOURCE
+        #ifndef __STRICT_ANSI__
+                #define __STRICT_ANSI__
+        #endif
+        #undef __STRICT_BSD__
+#endif /* _POSIX_SOURCE */
+
+#endif /* _STANDARDS_H */
diff --git a/internat.subproj/Makefile b/internat.subproj/Makefile
new file mode 100644 (file)
index 0000000..e1ea59d
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = internat
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = NXCType.h
+
+CFILES = NXCType.c NXIsAlNum.c NXIsAlpha.c NXIsAscii.c NXIsCntrl.c\
+         NXIsDigit.c NXIsGraph.c NXIsLower.c NXIsPrint.c NXIsPunct.c\
+         NXIsSpace.c NXIsUpper.c NXIsXDigit.c NXToAscii.c NXToLower.c\
+         _NXToLower.c NXToUpper.c _NXToUpper.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/internat.subproj/Makefile.postamble b/internat.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..df76c31
--- /dev/null
@@ -0,0 +1,5 @@
+$(DSTROOT)$(PRIVATE_HDR_INSTALLDIR)$(MY_PRIVATE_HEADER_DIR_SUFFIX):
+       $(MKDIRS) $@
+
+my_installhdrs: $(DSTROOT)$(PRIVATE_HDR_INSTALLDIR)$(MY_PRIVATE_HEADER_DIR_SUFFIX)
+       $(SILENT) $(FASTCP) $(MY_PRIVATE_HEADERS)  $(DSTROOT)$(PRIVATE_HDR_INSTALLDIR)$(MY_PRIVATE_HEADER_DIR_SUFFIX)
diff --git a/internat.subproj/Makefile.preamble b/internat.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..ab01f68
--- /dev/null
@@ -0,0 +1,3 @@
+MY_PRIVATE_HEADERS = NXCType.h
+MY_PRIVATE_HEADER_DIR_SUFFIX = /objc
+AFTER_INSTALLHDRS += my_installhdrs
diff --git a/internat.subproj/NXCType.c b/internat.subproj/NXCType.c
new file mode 100644 (file)
index 0000000..a9932b1
--- /dev/null
@@ -0,0 +1,598 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#pragma CC_NO_MACH_TEXT_SECTIONS
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+/*
+ * This file contains global data and the size of the global data can NOT
+ * change or otherwise it would make the shared library incompatable.  This
+ * file has NOT been padded to allow more data to be added to it because the
+ * sizeof(char) is not expected to change.
+ */
+#include "NXCType.h"
+
+const unsigned int _NX_CTypeTable_[1 + 256] = {
+
+/* One extra char in table: */ 0,
+/*    0        .notdef */      _C,
+/*    1        .notdef */      _C,
+/*    2        .notdef */      _C,
+/*    3        .notdef */      _C,
+/*    4        .notdef */      _C,
+/*    5        .notdef */      _C,
+/*    6        .notdef */      _C,
+/*    7        .notdef */      _C,
+
+/*    8        .notdef */      _C,
+/*    9        .notdef */      _C|_S,
+/*   10        .notdef */      _C|_S,
+/*   11        .notdef */      _C|_S,
+/*   12        .notdef */      _C|_S,
+/*   13        .notdef */      _C|_S,
+/*   14        .notdef */      _C,
+/*   15        .notdef */      _C,
+
+/*   16        .notdef */      _C,
+/*   17        .notdef */      _C,
+/*   18        .notdef */      _C,
+/*   19        .notdef */      _C,
+/*   20        .notdef */      _C,
+/*   21        .notdef */      _C,
+/*   22        .notdef */      _C,
+/*   23        .notdef */      _C,
+
+/*   24        .notdef */      _C,
+/*   25        .notdef */      _C,
+/*   26        .notdef */      _C,
+/*   27        .notdef */      _C,
+/*   28        .notdef */      _C,
+/*   29        .notdef */      _C,
+/*   30        .notdef */      _C,
+/*   31        .notdef */      _C,
+
+/*   32        space */        _S|_B,
+/*   33        exclam */       _P,
+/*   34        quotedbl */     _P,
+/*   35        numbersign */   _P,
+/*   36        dollar */       _P,
+/*   37        percent */      _P,
+/*   38        ampersand */    _P,
+/*   39        quoteright */   _P,
+
+/*   40        parenleft */    _P,
+/*   41        parenright */   _P,
+/*   42        asterisk */     _P,
+/*   43        plus */         _P,
+/*   44        comma */        _P,
+/*   45        hyphen */       _P,
+/*   46        period */       _P,
+/*   47        slash */        _P,
+
+/*   48        zero */         _D,
+/*   49        one */          _D,
+/*   50        two */          _D,
+/*   51        three */        _D,
+/*   52        four */         _D,
+/*   53        five */         _D,
+/*   54        six */          _D,
+/*   55        seven */        _D,
+
+/*   56        eight */        _D,
+/*   57        nine */         _D,
+/*   58        colon */        _P,
+/*   59        semicolon */    _P,
+/*   60        less */         _P,
+/*   61        equal */        _P,
+/*   62        greater */      _P,
+/*   63        question */     _P,
+
+/*   64        at */           _P,
+/*   65        A */            _U|_X,
+/*   66        B */            _U|_X,
+/*   67        C */            _U|_X,
+/*   68        D */            _U|_X,
+/*   69        E */            _U|_X,
+/*   70        F */            _U|_X,
+/*   71        G */            _U,
+
+/*   72        H */    _U,
+/*   73        I */    _U,
+/*   74        J */    _U,
+/*   75        K */    _U,
+/*   76        L */    _U,
+/*   77        M */    _U,
+/*   78        N */    _U,
+/*   79        O */    _U,
+
+/*   80        P */    _U,
+/*   81        Q */    _U,
+/*   82        R */    _U,
+/*   83        S */    _U,
+/*   84        T */    _U,
+/*   85        U */    _U,
+/*   86        V */    _U,
+/*   87        W */    _U,
+
+/*   88        X */    _U,
+/*   89        Y */    _U,
+/*   90        Z */    _U,
+/*   91        bracketleft */  _P,
+/*   92        backslash */    _P,
+/*   93        bracketright */ _P,
+/*   94        asciicircum */  _P,
+/*   95        underscore */   _P,
+
+/*   96        quoteleft */    _P,
+/*   97        a */    _L|_X,
+/*   98        b */    _L|_X,
+/*   99        c */    _L|_X,
+/*  100        d */    _L|_X,
+/*  101        e */    _L|_X,
+/*  102        f */    _L|_X,
+/*  103        g */    _L,
+
+/*  104        h */    _L,
+/*  105        i */    _L,
+/*  106        j */    _L,
+/*  107        k */    _L,
+/*  108        l */    _L,
+/*  109        m */    _L,
+/*  110        n */    _L,
+/*  111        o */    _L,
+
+/*  112        p */    _L,
+/*  113        q */    _L,
+/*  114        r */    _L,
+/*  115        s */    _L,
+/*  116        t */    _L,
+/*  117        u */    _L,
+/*  118        v */    _L,
+/*  119        w */    _L,
+
+/*  120        x */    _L,
+/*  121        y */    _L,
+/*  122        z */    _L,
+/*  123        braceleft */    _P,
+/*  124        bar */          _P,
+/*  125        braceright */   _P,
+/*  126        asciitilde */   _P,
+/*  127        .notdef */      _C,
+
+/*  128        .notdef */      _C,
+/*  129        Agrave */       _U,
+/*  130        Aacute */       _U,
+/*  131        Acircumflex */  _U,
+/*  132        Atilde */       _U,
+/*  133        Adieresis */    _U,
+/*  134        Aring */        _U,
+/*  135        Ccedilla */     _U,
+
+/*  136        Egrave */       _U,
+/*  137        Eacute */       _U,
+/*  138        Ecircumflex */  _U,
+/*  139        Edieresis */    _U,
+/*  140        Igrave */       _U,
+/*  141        Iacute */       _U,
+/*  142        Icircumflex */  _U,
+/*  143        Idieresis */    _U,
+
+/*  144        Eth */          _U,
+/*  145        Ntilde */       _U,
+/*  146        Ograve */       _U,
+/*  147        Oacute */       _U,
+/*  148        Ocircumflex */  _U,
+/*  149        Otilde */       _U,
+/*  150        Odieresis */    _U,
+/*  151        Ugrave */       _U,
+
+/*  152        Uacute */       _U,
+/*  153        Ucircumflex */  _U,
+/*  154        Udieresis */    _U,
+/*  155        Yacute */       _U,
+/*  156        Thorn */        _U,
+/*  157        mu */           _P,
+/*  158        multiply */     _P,
+/*  159        divide */       _P,
+
+/*  160        copyright */    _P,
+/*  161        exclamdown */   _P,
+/*  162        cent */         _P,
+/*  163        sterling */     _P,
+/*  164        fraction */     _P,
+/*  165        yen */          _P,
+/*  166        florin */       _P,
+/*  167        section */      _P,
+
+/*  168        currency */     _P,
+/*  169        quotesingle */  _P,
+/*  170        quotedblleft */ _P,
+/*  171        guillemotleft */ _P,
+/*  172        guilsinglleft */ _P,
+/*  173        guilsinglright */ _P,
+/*  174        fi */           _L,
+/*  175        fl */           _L,
+
+/*  176        registered */   _P,
+/*  177        endash */       _P,
+/*  178        dagger */       _P,
+/*  179        daggerdbl */    _P,
+/*  180        periodcentered */ _P,
+/*  181        brokenbar */    _P,
+/*  182        paragraph */    _P,
+/*  183        bullet */       _P,
+
+/*  184        quotesinglbase */ _P,
+/*  185        quotedblbase */ _P,
+/*  186        quotedblright */ _P,
+/*  187        guillemotright */ _P,
+/*  188        ellipsis */     _P,
+/*  189        perthousand */  _P,
+/*  190        logicalnot */   _P,
+/*  191        questiondown */ _P,
+
+/*  192        onesuperior */  _P,
+/*  193        grave */        _P,
+/*  194        acute */        _P,
+/*  195        circumflex */   _P,
+/*  196        tilde */        _P,
+/*  197        macron */       _P,
+/*  198        breve */        _P,
+/*  199        dotaccent */    _P,
+
+/*  200        dieresis */     _P,
+/*  201        twosuperior */  _P,
+/*  202        ring */         _P,
+/*  203        cedilla */      _P,
+/*  204        threesuperior */ _P,
+/*  205        hungarumlaut */ _P,
+/*  206        ogonek */       _P,
+/*  207        caron */        _P,
+
+/*  208        emdash */       _P,
+/*  209        plusminus */    _P,
+/*  210        onequarter */   _P,
+/*  211        onehalf */      _P,
+/*  212        threequarters */ _P,
+/*  213        agrave */       _L,
+/*  214        aacute */       _L,
+/*  215        acircumflex */  _L,
+
+/*  216        atilde */       _L,
+/*  217        adieresis */    _L,
+/*  218        aring */        _L,
+/*  219        ccedilla */     _L,
+/*  220        egrave */       _L,
+/*  221        eacute */       _L,
+/*  222        ecircumflex */  _L,
+/*  223        edieresis */    _L,
+
+/*  224        igrave */       _L,
+/*  225        AE */           _U,
+/*  226        iacute */       _L,
+/*  227        ordfeminine */  _P,
+/*  228        icircumflex */  _L,
+/*  229        idieresis */    _L,
+/*  230        eth */          _L,
+/*  231        ntilde */       _L,
+
+/*  232        Lslash */       _U,
+/*  233        Oslash */       _U,
+/*  234        OE */           _U,
+/*  235        ordmasculine */ _P,
+/*  236        ograve */       _L,
+/*  237        oacute */       _L,
+/*  238        ocircumflex */  _L,
+/*  239        otilde */       _L,
+
+/*  240        odieresis */    _L,
+/*  241        ae */           _L,
+/*  242        ugrave */       _L,
+/*  243        uacute */       _L,
+/*  244        ucircumflex */  _L,
+/*  245        dotlessi */     _L,
+/*  246        udieresis */    _L,
+/*  247        yacute */       _L,
+
+/*  248        lslash */       _L,
+/*  249        oslash */       _L,
+/*  250        oe */           _L,
+/*  251        germandbls */   _L,
+/*  252        thorn */        _L,
+/*  253        ydieresis */    _L,
+/*  254        .notdef */      _C,
+/*  255        .notdef */      _C,
+};
+
+/*
+ * Upper to lower and lower to upper table for NeXTStep encoding (256
+ * characters).  An entry of zero means it's not an upper or lower case
+ * thing (i.e., isn't alphabetic).  Otherwise, the value at a given
+ * position is the opposite case equivalent.  E.g., the entry for the
+ * "A" position is "a" and the entry for position "a" is "A".
+ *
+ * There are some pathological cases: ydieresis, germandbls, and the
+ * fi & fl ligatures don't have "other case" equivalents; therefore
+ * they're entered as themselves because they are in fact "lower case"
+ * and the Type table lists them as _L.
+ */
+const unsigned char _NX_ULTable_[256] = {
+/*    0        .notdef */      0,
+/*    1        .notdef */      0,
+/*    2        .notdef */      0,
+/*    3        .notdef */      0,
+/*    4        .notdef */      0,
+/*    5        .notdef */      0,
+/*    6        .notdef */      0,
+/*    7        .notdef */      0,
+/*    8        .notdef */      0,
+/*    9        .notdef */      0,
+/*   10        .notdef */      0,
+/*   11        .notdef */      0,
+/*   12        .notdef */      0,
+/*   13        .notdef */      0,
+/*   14        .notdef */      0,
+/*   15        .notdef */      0,
+/*   16        .notdef */      0,
+/*   17        .notdef */      0,
+/*   18        .notdef */      0,
+/*   19        .notdef */      0,
+/*   20        .notdef */      0,
+/*   21        .notdef */      0,
+/*   22        .notdef */      0,
+/*   23        .notdef */      0,
+/*   24        .notdef */      0,
+/*   25        .notdef */      0,
+/*   26        .notdef */      0,
+/*   27        .notdef */      0,
+/*   28        .notdef */      0,
+/*   29        .notdef */      0,
+/*   30        .notdef */      0,
+/*   31        .notdef */      0,
+/*   32        space */        0,
+/*   33        exclam */       0,
+/*   34        quotedbl */     0,
+/*   35        numbersign */   0,
+/*   36        dollar */       0,
+/*   37        percent */      0,
+/*   38        ampersand */    0,
+/*   39        quoteright */   0,
+/*   40        parenleft */    0,
+/*   41        parenright */   0,
+/*   42        asterisk */     0,
+/*   43        plus */         0,
+/*   44        comma */        0,
+/*   45        hyphen */       0,
+/*   46        period */       0,
+/*   47        slash */        0,
+/*   48        zero */         0,
+/*   49        one */          0,
+/*   50        two */          0,
+/*   51        three */        0,
+/*   52        four */         0,
+/*   53        five */         0,
+/*   54        six */          0,
+/*   55        seven */        0,
+/*   56        eight */        0,
+/*   57        nine */         0,
+/*   58        colon */        0,
+/*   59        semicolon */    0,
+/*   60        less */         0,
+/*   61        equal */        0,
+/*   62        greater */      0,
+/*   63        question */     0,
+/*   64        at */           0,
+/*   65        A */            97,
+/*   66        B */            98,
+/*   67        C */            99,
+/*   68        D */            100,
+/*   69        E */            101,
+/*   70        F */            102,
+/*   71        G */            103,
+/*   72        H */            104,
+/*   73        I */    105,
+/*   74        J */    106,
+/*   75        K */    107,
+/*   76        L */    108,
+/*   77        M */    109,
+/*   78        N */    110,
+/*   79        O */    111,
+/*   80        P */    112,
+/*   81        Q */    113,
+/*   82        R */    114,
+/*   83        S */    115,
+/*   84        T */    116,
+/*   85        U */    117,
+/*   86        V */    118,
+/*   87        W */    119,
+/*   88        X */    120,
+/*   89        Y */    121,
+/*   90        Z */    122,
+/*   91        bracketleft */  0,
+/*   92        backslash */    0,
+/*   93        bracketright */ 0,
+/*   94        asciicircum */  0,
+/*   95        underscore */   0,
+/*   96        quoteleft */    0,
+/*   97        a */    65,
+/*   98        b */    66,
+/*   99        c */    67,
+/*  100        d */    68,
+/*  101        e */    69,
+/*  102        f */    70,
+/*  103        g */    71,
+/*  104        h */    72,
+/*  105        i */    73,
+/*  106        j */    74,
+/*  107        k */    75,
+/*  108        l */    76,
+/*  109        m */    77,
+/*  110        n */    78,
+/*  111        o */    79,
+/*  112        p */    80,
+/*  113        q */    81,
+/*  114        r */    82,
+/*  115        s */    83,
+/*  116        t */    84,
+/*  117        u */    85,
+/*  118        v */    86,
+/*  119        w */    87,
+/*  120        x */    88,
+/*  121        y */    89,
+/*  122        z */    90,
+/*  123        braceleft */    0,
+/*  124        bar */          0,
+/*  125        braceright */   0,
+/*  126        asciitilde */   0,
+/*  127        .notdef */      0,
+/*  128        .notdef */      0,
+/*  129        Agrave */       213,
+/*  130        Aacute */       214,
+/*  131        Acircumflex */  215,
+/*  132        Atilde */       216,
+/*  133        Adieresis */    217,
+/*  134        Aring */        218,
+/*  135        Ccedilla */     219,
+/*  136        Egrave */       220,
+/*  137        Eacute */       221,
+/*  138        Ecircumflex */  222,
+/*  139        Edieresis */    223,
+/*  140        Igrave */       224,
+/*  141        Iacute */       226,
+/*  142        Icircumflex */  228,
+/*  143        Idieresis */    229,
+/*  144        Eth */          230,
+/*  145        Ntilde */       231,
+/*  146        Ograve */       236,
+/*  147        Oacute */       237,
+/*  148        Ocircumflex */  238,
+/*  149        Otilde */       239,
+/*  150        Odieresis */    240,
+/*  151        Ugrave */       242,
+/*  152        Uacute */       243,
+/*  153        Ucircumflex */  244,
+/*  154        Udieresis */    246,
+/*  155        Yacute */       247,
+/*  156        Thorn */        252,
+/*  157        mu */           0,
+/*  158        multiply */     0,
+/*  159        divide */       0,
+/*  160        copyright */    0,
+/*  161        exclamdown */   0,
+/*  162        cent */         0,
+/*  163        sterling */     0,
+/*  164        fraction */     0,
+/*  165        yen */          0,
+/*  166        florin */       0,
+/*  167        section */      0,
+/*  168        currency */     0,
+/*  169        quotesingle */  0,
+/*  170        quotedblleft */ 0,
+/*  171        guillemotleft */ 0,
+/*  172        guilsinglleft */ 0,
+/*  173        guilsinglright */ 0,
+/*  174        fi */           174,    /* is self */
+/*  175        fl */           175,    /* is self */
+/*  176        registered */   0,
+/*  177        endash */       0,
+/*  178        dagger */       0,
+/*  179        daggerdbl */    0,
+/*  180        periodcentered */ 0,
+/*  181        brokenbar */    0,
+/*  182        paragraph */    0,
+/*  183        bullet */       0,
+/*  184        quotesinglbase */ 0,
+/*  185        quotedblbase */ 0,
+/*  186        quotedblright */ 0,
+/*  187        guillemotright */ 0,
+/*  188        ellipsis */     0,
+/*  189        perthousand */  0,
+/*  190        logicalnot */   0,
+/*  191        questiondown */ 0,
+/*  192        onesuperior */  0,
+/*  193        grave */        0,
+/*  194        acute */        0,
+/*  195        circumflex */   0,
+/*  196        tilde */        0,
+/*  197        macron */       0,
+/*  198        breve */        0,
+/*  199        dotaccent */    0,
+/*  200        dieresis */     0,
+/*  201        twosuperior */  0,
+/*  202        ring */         0,
+/*  203        cedilla */      0,
+/*  204        threesuperior */ 0,
+/*  205        hungarumlaut */ 0,
+/*  206        ogonek */       0,
+/*  207        caron */        0,
+/*  208        emdash */       0,
+/*  209        plusminus */    0,
+/*  210        onequarter */   0,
+/*  211        onehalf */      0,
+/*  212        threequarters */ 0,
+/*  213        agrave */       129,
+/*  214        aacute */       130,
+/*  215        acircumflex */  131,
+/*  216        atilde */       132,
+/*  217        adieresis */    133,
+/*  218        aring */        134,
+/*  219        ccedilla */     135,
+/*  220        egrave */       136,
+/*  221        eacute */       137,
+/*  222        ecircumflex */  138,
+/*  223        edieresis */    139,
+/*  224        igrave */       140,
+/*  225        AE */           241,
+/*  226        iacute */       141,
+/*  227        ordfeminine */  0,
+/*  228        icircumflex */  142,
+/*  229        idieresis */    143,
+/*  230        eth */          144,
+/*  231        ntilde */       145,
+/*  232        Lslash */       248,
+/*  233        Oslash */       249,
+/*  234        OE */           250,
+/*  235        ordmasculine */ 0,
+/*  236        ograve */       146,
+/*  237        oacute */       147,
+/*  238        ocircumflex */  148,
+/*  239        otilde */       149,
+/*  240        odieresis */    150,
+/*  241        ae */           225,
+/*  242        ugrave */       151,
+/*  243        uacute */       152,
+/*  244        ucircumflex */  153,
+/*  245        dotlessi */     245,    /* is self */
+/*  246        udieresis */    154,
+/*  247        yacute */       155,
+/*  248        lslash */       232,
+/*  249        oslash */       233,
+/*  250        oe */           234,
+/*  251        germandbls */   251,    /* is self */
+/*  252        thorn */        156,
+/*  253        ydieresis */    253,    /* is self */
+/*  254        .notdef */      0,
+/*  255        .notdef */      0
+};
+
diff --git a/internat.subproj/NXCType.h b/internat.subproj/NXCType.h
new file mode 100644 (file)
index 0000000..3c5407e
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*     NXCType.h */
+
+/* Copyright (c) 1990 NeXT, Inc. - 8/21/90 RM */
+/* patterned after ctype.h ; for 8-bit encoding, Europe only */
+
+#ifndef _NXCTYPE_H
+#define _NXCTYPE_H
+
+#include <ctype.h>
+
+extern int NXIsAlNum(unsigned c);
+extern int NXIsAlpha(unsigned c);
+extern int NXIsCntrl(unsigned c);
+extern int NXIsDigit(unsigned c);
+extern int NXIsGraph(unsigned c);
+extern int NXIsLower(unsigned c);
+extern int NXIsPrint(unsigned c);
+extern int NXIsPunct(unsigned c);
+extern int NXIsSpace(unsigned c);
+extern int NXIsUpper(unsigned c);
+extern int NXIsXDigit(unsigned c);
+extern int _NXToLower(unsigned c);
+extern int _NXToUpper(unsigned c);
+extern int NXToLower(unsigned c);
+extern int NXToUpper(unsigned c);
+extern int NXIsAscii(unsigned c);
+extern unsigned char *NXToAscii(unsigned c);
+
+/*
+ * Data structures used by the internationized NX... versions of the
+ * ctype(3) routines.  These structures are private to the above routines
+ * and should NOT be referenced by the application.
+ */
+extern const unsigned int _NX_CTypeTable_[];   /* char types */
+extern const unsigned char _NX_ULTable_[];     /* case conversion table */
+
+#endif /* _NXCTYPE_H */
diff --git a/internat.subproj/NXIsAlNum.c b/internat.subproj/NXIsAlNum.c
new file mode 100644 (file)
index 0000000..65e15e0
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsAlNum(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_U|_L|_D)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsAlpha.c b/internat.subproj/NXIsAlpha.c
new file mode 100644 (file)
index 0000000..b946d95
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+
+int NXIsAlpha(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_U|_L)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsAscii.c b/internat.subproj/NXIsAscii.c
new file mode 100644 (file)
index 0000000..f2545d4
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+NXIsAscii(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       return (c <= 0177);
+}
diff --git a/internat.subproj/NXIsCntrl.c b/internat.subproj/NXIsCntrl.c
new file mode 100644 (file)
index 0000000..71e154d
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsCntrl(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_C)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsDigit.c b/internat.subproj/NXIsDigit.c
new file mode 100644 (file)
index 0000000..1ead0b3
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsDigit(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_D)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsGraph.c b/internat.subproj/NXIsGraph.c
new file mode 100644 (file)
index 0000000..39545d1
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsGraph(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_P|_U|_L|_D)));
+       return 1;
+               /* NOTE: for 3.0, everything > 256 is probably Kanji, so say is graphic */
+}
diff --git a/internat.subproj/NXIsLower.c b/internat.subproj/NXIsLower.c
new file mode 100644 (file)
index 0000000..1074676
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsLower(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_L)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsPrint.c b/internat.subproj/NXIsPrint.c
new file mode 100644 (file)
index 0000000..29154e1
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsPrint(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_P|_U|_L|_D|_B)));
+       return 1;
+               /* NOTE: for 3.0, everything > 255 is probably Kanji, so say printable... */
+}
diff --git a/internat.subproj/NXIsPunct.c b/internat.subproj/NXIsPunct.c
new file mode 100644 (file)
index 0000000..188d694
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsPunct(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_P)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsSpace.c b/internat.subproj/NXIsSpace.c
new file mode 100644 (file)
index 0000000..35c6d50
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsSpace(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_S)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsUpper.c b/internat.subproj/NXIsUpper.c
new file mode 100644 (file)
index 0000000..e23a927
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsUpper(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_U)));
+       return 0;
+}
diff --git a/internat.subproj/NXIsXDigit.c b/internat.subproj/NXIsXDigit.c
new file mode 100644 (file)
index 0000000..785ca3f
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+int NXIsXDigit(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if (c < 256)
+               return ((unsigned int)((_NX_CTypeTable_ + 1)[c] & (_D|_X)));
+       return 0;
+}
diff --git a/internat.subproj/NXToAscii.c b/internat.subproj/NXToAscii.c
new file mode 100644 (file)
index 0000000..b089fb2
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+unsigned char *
+NXToAscii(c)
+       unsigned int c;
+{
+       static unsigned char woops[] = " ";
+
+       FIXSIGNEDCHAR(c);
+       if (c < 128) {          /* handle stuff already ASCII */
+               woops[0] = c;
+               return (unsigned char *) woops;
+       }
+       switch (c) {
+               case 128:       /* Figspace */
+                       return (unsigned char *) " ";
+               case 129:       /* Agrave */
+               case 130:       /* Aacute */
+               case 131:       /* Acircumflex */
+               case 132:       /* Atilde */
+               case 133:       /* Adieresis */
+               case 134:       /* Aring */
+                       return (unsigned char *) "A";
+               case 135:       /* Ccedilla */
+                       return (unsigned char *) "C";
+               case 136:       /* Egrave */
+               case 137:       /* Eacute */
+               case 138:       /* Ecircumflex */
+               case 139:       /* Edieresis */
+                       return (unsigned char *) "E";
+               case 140:       /* Igrave */
+               case 141:       /* Iacute */
+               case 142:       /* Icircumflex */
+               case 143:       /* Idieresis */
+                       return (unsigned char *) "I";
+               case 145:       /* Ntilde */
+                       return (unsigned char *) "N";
+               case 146:       /* Ograve */
+               case 147:       /* Oacute */
+               case 148:       /* Ocircumflex */
+               case 149:       /* Otilde */
+               case 150:       /* Odieresis */
+               case 233:       /* Oslash */
+                       return (unsigned char *) "O";
+               case 151:       /* Ugrave */
+               case 152:       /* Uacute */
+               case 153:       /* Ucircumflex */
+               case 154:       /* Udieresis */
+                       return (unsigned char *) "U";
+               case 155:       /* Yacute */
+                       return (unsigned char *) "Y";
+               case 230:       /* eth */
+               case 144:       /* Eth */
+                       return (unsigned char *) "TH";
+               case 156:       /* Thorn */
+               case 252:       /* thorn */
+                       return (unsigned char *) "th";
+
+               case 174:       /* fi */
+                       return (unsigned char *) "fi";
+               case 175:       /* fl */
+                       return (unsigned char *) "fl";
+
+               case 213:       /* agrave */
+               case 214:       /* aacute */
+               case 215:       /* acircumflex */
+               case 216:       /* atilde */
+               case 217:       /* adieresis */
+               case 218:       /* aring */
+                       return (unsigned char *) "a";
+               case 219:       /* ccedilla */
+                       return (unsigned char *) "c";
+               case 220:       /* egrave */
+               case 221:       /* eacute */
+               case 222:       /* ecircumflex */
+               case 223:       /* edieresis */
+                       return (unsigned char *) "e";
+               case 225:       /* AE */
+                       return (unsigned char *) "AE";
+               case 224:       /* igrave */
+               case 226:       /* iacute */
+               case 228:       /* icircumflex */
+               case 229:       /* idieresis */
+                       return (unsigned char *) "i";
+               case 231:       /* ntilde */
+                       return (unsigned char *) "n";
+               case 232:       /* Lslash */
+                       return (unsigned char *) "L";
+               case 234:       /* OE */
+                       return (unsigned char *) "OE";
+               case 236:       /* ograve */
+               case 237:       /* oacute */
+               case 238:       /* ocircumflex */
+               case 239:       /* otilde */
+               case 240:       /* odieresis */
+               case 249:       /* oslash */
+                       return (unsigned char *) "o";
+               case 241:       /* ae */
+                       return (unsigned char *) "ae";
+               case 242:       /* ugrave */
+               case 243:       /* uacute */
+               case 244:       /* ucircumflex */
+               case 246:       /* udieresis */
+                       return (unsigned char *) "u";
+               case 245:       /* dotlessi */
+                       return (unsigned char *) "i";
+               case 247:       /* yacute */
+               case 253:       /* ydieresis */
+                       return (unsigned char *) "y";
+               case 248:       /* lslash */
+                       return (unsigned char *) "l";
+               case 250:       /* oe */
+                       return (unsigned char *) "oe";
+               case 251:       /* germandbls */
+                       return (unsigned char *) "ss";
+               /*
+                * non-letter cases:
+                */
+               case 158:       /* multiply */          
+                       return (unsigned char *) "x";
+               case 159:       /* divide */            
+                       return (unsigned char *) "/";
+
+               case 161:       /* exclamdown */        
+                       return (unsigned char *) "!";
+               case 169:       /* quotesingle */       
+                       return (unsigned char *) "'";
+
+               case 170:       /* quotedblleft */
+               case 186:       /* quotedblright */
+               case 185:       /* quotedblbase */
+                       return (unsigned char *) "\"";
+               case 171:       /* guillemotleft */
+                       return (unsigned char *) "<<";
+               case 187:       /* guillemotright */
+                       return (unsigned char *) ">>";
+               case 184:       /* quotesinglbase */
+                       return (unsigned char *) "'";
+               case 172:       /* guilsinglleft */
+                       return (unsigned char *) "<";
+               case 173:       /* guilsinglright */
+                       return (unsigned char *) ">";
+               case 180:       /* periodcentered */
+                       return (unsigned char *) ".";
+               case 181:       /* brokenbar */
+                       return (unsigned char *) "|";
+               case 183:       /* bullet */
+                       return (unsigned char *) "*";
+               case 188:       /* ellipsis */
+                       return (unsigned char *) "...";
+               case 191:       /* questiondown */
+                       return (unsigned char *) "?";
+               case 192:       /* onesuperior */
+                       return (unsigned char *) "1";
+               case 201:       /* twosuperior */
+                       return (unsigned char *) "2";
+               case 204:       /* threesuperior */
+                       return (unsigned char *) "3";
+               case 208:       /* emdash */
+                       return (unsigned char *) "--";
+               case 209:       /* plusminus */
+                       return (unsigned char *) "+-";
+               case 210:       /* onequarter */
+                       return (unsigned char *) "1/4";
+               case 211:       /* onehalf */
+                       return (unsigned char *) "1/2";
+               case 212:       /* threequarters */
+                       return (unsigned char *) "3/4";
+               case 227:       /* ordfeminine */
+                       return (unsigned char *) "a";
+               case 235:       /* ordmasculine */
+                       return (unsigned char *) "o";
+               case 157:       /* mu */
+                       return (unsigned char *) "u";
+               case 160:       /* copyright */
+                       return (unsigned char *) "(C)";
+               case 163:       /* sterling */
+                       return (unsigned char *) "L";
+               case 164:       /* fraction */
+                       return (unsigned char *) "/";
+               case 165:       /* yen */
+                       return (unsigned char *) "Y";
+               case 166:       /* florin */
+                       return (unsigned char *) "f";
+               case 176:       /* registered */
+                       return (unsigned char *) "(R)";
+               case 190:       /* logicalnot */
+               case 177:       /* endash */
+                       return (unsigned char *) "-";
+               case 178:       /* dagger */
+                       return (unsigned char *) "+";
+               case 179:       /* daggerdbl */
+                       return (unsigned char *) "++";
+               case 189:       /* perthousand */
+                       return (unsigned char *) "0/00";
+               case 193:       /* grave */
+                       return (unsigned char *) "`";
+               case 194:       /* acute */
+                       return (unsigned char *) "'";
+               case 195:       /* circumflex */
+                       return (unsigned char *) "^";
+               case 196:       /* tilde */
+                       return (unsigned char *) "~";
+
+               /*
+                * Default & fallback cases:
+                */
+               case 162:       /* cent */
+               case 167:       /* section */
+               case 168:       /* currency */
+               case 182:       /* paragraph */
+               case 197:       /* macron */
+               case 198:       /* breve */
+               case 199:       /* dotaccent */
+               case 200:       /* dieresis */
+               case 202:       /* ring */
+               case 203:       /* cedilla */
+               case 205:       /* hungarumlaut */
+               case 206:       /* ogonek */
+               case 207:       /* caron */
+               default:
+                       return (unsigned char *) "_";
+       }
+}
diff --git a/internat.subproj/NXToLower.c b/internat.subproj/NXToLower.c
new file mode 100644 (file)
index 0000000..90ddc12
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+NXToLower(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       return (NXIsUpper(c) ? ((unsigned int )(_NX_ULTable_)[c]) : c);
+}
diff --git a/internat.subproj/NXToUpper.c b/internat.subproj/NXToUpper.c
new file mode 100644 (file)
index 0000000..db23e6b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+NXToUpper(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       return (NXIsLower(c) ? ((unsigned int )(_NX_ULTable_)[c]) : c);
+}
diff --git a/internat.subproj/PB.project b/internat.subproj/PB.project
new file mode 100644 (file)
index 0000000..67c5990
--- /dev/null
@@ -0,0 +1,42 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (NXCType.h); 
+        OTHER_LINKED = (
+            NXCType.c, 
+            NXIsAlNum.c, 
+            NXIsAlpha.c, 
+            NXIsAscii.c, 
+            NXIsCntrl.c, 
+            NXIsDigit.c, 
+            NXIsGraph.c, 
+            NXIsLower.c, 
+            NXIsPrint.c, 
+            NXIsPunct.c, 
+            NXIsSpace.c, 
+            NXIsUpper.c, 
+            NXIsXDigit.c, 
+            NXToAscii.c, 
+            NXToLower.c, 
+            _NXToLower.c, 
+            NXToUpper.c, 
+            _NXToUpper.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = internat; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/internat.subproj/_NXToLower.c b/internat.subproj/_NXToLower.c
new file mode 100644 (file)
index 0000000..0b10647
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+_NXToLower(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if ((c < 256) && NXIsUpper(c))
+               return ((unsigned int )(_NX_ULTable_)[c]);
+       return c;
+}
diff --git a/internat.subproj/_NXToUpper.c b/internat.subproj/_NXToUpper.c
new file mode 100644 (file)
index 0000000..e30b2ab
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright 1990, NeXT, Inc.
+ */
+
+#include "NXCType.h"
+#define FIXSIGNEDCHAR(i) if ((i & 0xFFFFFF80) == 0xFFFFFF80) i &= 0x000000FF
+
+_NXToUpper(c)
+       unsigned int c;
+{
+       FIXSIGNEDCHAR(c);
+       if ((c < 256) && NXIsLower(c))
+               return ((unsigned int )(_NX_ULTable_)[c]);
+       return c;
+}
diff --git a/locale.subproj/Makefile b/locale.subproj/Makefile
new file mode 100644 (file)
index 0000000..f126176
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = locale
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = ansi.c ctype.c euc.c frune.c isctype.c lconv.c localeconv.c\
+         mbrune.c none.c rune.c runetable.c setlocale.c utf2.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/locale.subproj/Makefile.postamble b/locale.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/locale.subproj/Makefile.preamble b/locale.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/locale.subproj/PB.project b/locale.subproj/PB.project
new file mode 100644 (file)
index 0000000..25515a8
--- /dev/null
@@ -0,0 +1,37 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (
+            ansi.c, 
+            ctype.c, 
+            euc.c, 
+            frune.c, 
+            isctype.c, 
+            lconv.c, 
+            localeconv.c, 
+            mbrune.c, 
+            none.c, 
+            rune.c, 
+            runetable.c, 
+            setlocale.c, 
+            utf2.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = locale; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/locale.subproj/ansi.c b/locale.subproj/ansi.c
new file mode 100644 (file)
index 0000000..cba06a3
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+#include <limits.h>
+#include <stddef.h>
+#include <rune.h>
+
+int
+mblen(s, n)
+       const char *s;
+       size_t n;
+{
+       char const *e;
+
+       if (s == 0 || *s == 0)
+               return (0);     /* No support for state dependent encodings. */
+
+       if (sgetrune(s, (int)n, &e) == _INVALID_RUNE)
+               return (s - e);
+       return (e - s);
+}
+
+int
+mbtowc(pwc, s, n)
+       wchar_t *pwc;
+       const char *s;
+       size_t n;
+{
+       char const *e;
+       rune_t r;
+
+       if (s == 0 || *s == 0)
+               return (0);     /* No support for state dependent encodings. */
+
+       if ((r = sgetrune(s, (int)n, &e)) == _INVALID_RUNE)
+               return (s - e);
+       if (pwc)
+               *pwc = r;
+       return (e - s);
+}
+
+int
+wctomb(s, wchar)
+       char *s;
+       wchar_t wchar;
+{
+       char *e;
+
+       if (s == 0)
+               return (0);     /* No support for state dependent encodings. */
+
+       if (wchar == 0) {
+               *s = 0;
+               return (1);
+       }
+
+       sputrune(wchar, s, MB_CUR_MAX, &e);
+       return (e ? e - s : -1);
+}
+
+size_t
+mbstowcs(pwcs, s, n)
+       wchar_t *pwcs;
+       const char *s;
+       size_t n;
+{
+       char const *e;
+       int cnt = 0;
+
+       if (!pwcs || !s)
+               return (-1);
+
+       while (n-- > 0) {
+               *pwcs = sgetrune(s, MB_LEN_MAX, &e);
+               if (*pwcs == _INVALID_RUNE)
+                       return (-1);
+               if (*pwcs++ == 0)
+                       break;
+               s = e;
+               ++cnt;
+       }
+       return (cnt);
+}
+
+size_t
+wcstombs(s, pwcs, n)
+       char *s;
+       const wchar_t *pwcs;
+       size_t n;
+{
+       char *e;
+       int cnt = 0;
+
+       if (!pwcs || !s)
+               return (-1);
+
+       while (n > 0) {
+               if (*pwcs == 0) {
+                       *s = 0;
+                       break;
+               }
+               if (!sputrune(*pwcs++, s, (int)n, &e))
+                       return (-1);            /* encoding error */
+               if (!e)                 /* too long */
+                       return (cnt);
+               cnt += e - s;
+               s = e;
+       }
+       return (cnt);
+}
diff --git a/locale.subproj/ctype.c b/locale.subproj/ctype.c
new file mode 100644 (file)
index 0000000..7dec737
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#define        _U      0x01
+#define        _L      0x02
+#define        _N      0x04
+#define        _S      0x08
+#define        _P      0x10
+#define        _C      0x20
+#define        _X      0x40
+#define        _B      0x80
+
+const char __ctype[1 + 256] = {
+       0,
+       _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C,
+       _C,     _C|_S,  _C|_S,  _C|_S,  _C|_S,  _C|_S,  _C,     _C,
+       _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C,
+       _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C,
+       _S|_B,  _P,     _P,     _P,     _P,     _P,     _P,     _P,
+       _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P,
+       _N,     _N,     _N,     _N,     _N,     _N,     _N,     _N,
+       _N,     _N,     _P,     _P,     _P,     _P,     _P,     _P,
+       _P,     _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U,
+       _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U,
+       _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U,
+       _U,     _U,     _U,     _P,     _P,     _P,     _P,     _P,
+       _P,     _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L,
+       _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L,
+       _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L,
+       _L,     _L,     _L,     _P,     _P,     _P,     _P,     _C
+};
+
+char *_ctype_ = __ctype;               /* Backward compatibility. */
diff --git a/locale.subproj/euc.c b/locale.subproj/euc.c
new file mode 100644 (file)
index 0000000..41394b9
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <rune.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+rune_t _EUC_sgetrune __P((const char *, size_t, char const **));
+int    _EUC_sputrune __P((rune_t, char *, size_t, char **));
+
+typedef struct {
+       int     count[4];
+       rune_t  bits[4];
+       rune_t  mask;
+} _EucInfo;
+
+int
+_EUC_init(rl)
+       _RuneLocale *rl;
+{
+       _EucInfo *ei;
+       int x;
+       char *v, *e;
+
+       rl->sgetrune = _EUC_sgetrune;
+       rl->sputrune = _EUC_sputrune;
+
+       if (!rl->variable) {
+               free(rl);
+               return (EFTYPE);
+       }
+       v = (char *) rl->variable;
+
+       while (*v == ' ' || *v == '\t')
+               ++v;
+
+       if ((ei = malloc(sizeof(_EucInfo))) == NULL) {
+               free(rl);
+               return (ENOMEM);
+       }
+       for (x = 0; x < 4; ++x) {
+               ei->count[x] = (int) strtol(v, &e, 0);
+               if (v == e || !(v = e)) {
+                       free(rl);
+                       free(ei);
+                       return (EFTYPE);
+               }
+               while (*v == ' ' || *v == '\t')
+                       ++v;
+               ei->bits[x] = (int) strtol(v, &e, 0);
+               if (v == e || !(v = e)) {
+                       free(rl);
+                       free(ei);
+                       return (EFTYPE);
+               }
+               while (*v == ' ' || *v == '\t')
+                       ++v;
+       }
+       ei->mask = (int)strtol(v, &e, 0);
+       if (v == e || !(v = e)) {
+               free(rl);
+               free(ei);
+               return (EFTYPE);
+       }
+       if (sizeof(_EucInfo) <= rl->variable_len) {
+               memcpy(rl->variable, ei, sizeof(_EucInfo));
+               free(ei);
+       } else {
+               rl->variable = &ei;
+       }
+       rl->variable_len = sizeof(_EucInfo);
+       _CurrentRuneLocale = rl;
+       __mb_cur_max = 3;
+       return (0);
+}
+
+#define        CEI     ((_EucInfo *)(_CurrentRuneLocale->variable))
+
+#define        _SS2    0x008e
+#define        _SS3    0x008f
+
+static inline int
+_euc_set(c)
+       u_int c;
+{
+       c &= 0xff;
+
+       return ((c & 0x80) ? c == _SS3 ? 3 : c == _SS2 ? 2 : 1 : 0);
+}
+rune_t
+_EUC_sgetrune(string, n, result)
+       const char *string;
+       size_t n;
+       char const **result;
+{
+       rune_t rune = 0;
+       int len, set;
+
+       if (n < 1 || (len = CEI->count[set = _euc_set(*string)]) > n) {
+               if (result)
+                       *result = string;
+               return (_INVALID_RUNE);
+       }
+       switch (set) {
+       case 3:
+       case 2:
+               --len;
+               ++string;
+               /* FALLTHROUGH */
+       case 1:
+       case 0:
+               while (len-- > 0)
+                       rune = (rune << 8) | ((u_int)(*string++) & 0xff);
+               break;
+       }
+       if (result)
+               *result = string;
+       return ((rune & ~CEI->mask) | CEI->bits[set]);
+}
+
+int
+_EUC_sputrune(c, string, n, result)
+       rune_t c;
+       char *string, **result;
+       size_t n;
+{
+       rune_t m = c & CEI->mask;
+       rune_t nm = c & ~m;
+       int i, len;
+
+       if (m == CEI->bits[1]) {
+CodeSet1:
+               /* Codeset 1: The first byte must have 0x80 in it. */
+               i = len = CEI->count[1];
+               if (n >= len) {
+                       if (result)
+                               *result = string + len;
+                       while (i-- > 0)
+                               *string++ = (nm >> (i << 3)) | 0x80;
+               } else
+                       if (result)
+                               *result = (char *) 0;
+       } else {
+               if (m == CEI->bits[0]) {
+                       i = len = CEI->count[0];
+                       if (n < len) {
+                               if (result)
+                                       *result = NULL;
+                               return (len);
+                       }
+               } else
+                       if (m == CEI->bits[2]) {
+                               i = len = CEI->count[2];
+                               if (n < len) {
+                                       if (result)
+                                               *result = NULL;
+                                       return (len);
+                               }
+                               *string++ = _SS2;
+                               --i;
+                       } else
+                               if (m == CEI->bits[3]) {
+                                       i = len = CEI->count[3];
+                                       if (n < len) {
+                                               if (result)
+                                                       *result = NULL;
+                                               return (len);
+                                       }
+                                       *string++ = _SS3;
+                                       --i;
+                               } else
+                                       goto CodeSet1;  /* Bletch */
+               while (i-- > 0)
+                       *string++ = (nm >> (i << 3)) & 0xff;
+               if (result)
+                       *result = string;
+       }
+       return (len);
+}
diff --git a/locale.subproj/frune.c b/locale.subproj/frune.c
new file mode 100644 (file)
index 0000000..a6adad9
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <limits.h>
+#include <rune.h>
+#include <stddef.h>
+#include <stdio.h>
+
+long
+fgetrune(fp)
+       FILE *fp;
+{
+       rune_t  r;
+       int c, len;
+       char buf[MB_LEN_MAX];
+       char const *result;
+
+       len = 0;
+       do {
+               if ((c = getc(fp)) == EOF) {
+                       if (len)
+                               break;
+                       return (EOF);
+               }
+               buf[len++] = c;
+
+               if ((r = sgetrune(buf, len, &result)) != _INVALID_RUNE)
+                       return (r);
+       } while (result == buf && len < MB_LEN_MAX);
+
+       while (--len > 0)
+               ungetc(buf[len], fp);
+       return (_INVALID_RUNE);
+}
+
+int
+fungetrune(r, fp)
+       rune_t r;
+       FILE* fp;
+{
+       int len;
+       char buf[MB_LEN_MAX];
+
+       len = sputrune(r, buf, MB_LEN_MAX, 0);
+       while (len-- > 0)
+               if (ungetc(buf[len], fp) == EOF)
+                       return (EOF);
+       return (0);
+}
+
+int
+fputrune(r, fp)
+       rune_t r;
+       FILE *fp;
+{
+       int i, len;
+       char buf[MB_LEN_MAX];
+
+       len = sputrune(r, buf, MB_LEN_MAX, 0);
+
+       for (i = 0; i < len; ++i)
+               if (putc(buf[i], fp) == EOF)
+                       return (EOF);
+
+       return (0);
+}
diff --git a/locale.subproj/isctype.c b/locale.subproj/isctype.c
new file mode 100644 (file)
index 0000000..593b8ed
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#define _ANSI_LIBRARY
+#include <ctype.h>
+
+#undef isalnum
+int
+isalnum(c)
+       int c;
+{
+       return(__istype((c), (_A|_D)));
+}
+
+#undef isalpha
+int
+isalpha(c)
+       int c;
+{
+       return (__istype((c), _A));
+}
+
+#undef isascii
+int
+isascii(c)
+       int c;
+{
+       return((c & ~0x7F) == 0);
+}
+
+#undef isblank
+int
+isblank(c)
+       int c;
+{
+       return (__istype((c), _B));
+}
+
+#undef iscntrl
+int
+iscntrl(c)
+       int c;
+{
+       return (__istype((c), _C));
+}
+
+#undef isdigit
+int
+isdigit(c)
+       int c;
+{
+       return (__isctype((c), _D));
+}
+
+#undef isgraph
+int
+isgraph(c)
+       int c;
+{
+       return (__istype((c), _G));
+}
+
+#undef islower
+int
+islower(c)
+       int c;
+{
+       return (__istype((c), _L));
+}
+
+#undef isprint
+int
+isprint(c)
+       int c;
+{
+       return (__istype((c), _R));
+}
+
+#undef ispunct
+int
+ispunct(c)
+       int c;
+{
+       return (__istype((c), _P));
+}
+
+#undef isspace
+int
+isspace(c)
+       int c;
+{
+       return (__istype((c), _S));
+}
+
+#undef isupper
+int
+isupper(c)
+       int c;
+{
+       return (__istype((c), _U));
+}
+
+#undef isxdigit
+int
+isxdigit(c)
+       int c;
+{
+       return (__isctype((c), _X));
+}
+
+#undef toascii
+int
+toascii(c)
+       int c;
+{
+       return (c & 0177);
+}
+
+#undef tolower
+int
+tolower(c)
+       int c;
+{
+        return((c & _CRMASK) ? ___tolower(c) : _CurrentRuneLocale->maplower[c]);
+}
+
+#undef toupper
+int
+toupper(c)
+       int c;
+{
+        return((c & _CRMASK) ? ___toupper(c) : _CurrentRuneLocale->mapupper[c]);
+}
diff --git a/locale.subproj/lconv.c b/locale.subproj/lconv.c
new file mode 100644 (file)
index 0000000..786ca4a
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <limits.h>
+#include <locale.h>
+
+static char empty[] = "";
+
+/*
+ * Default (C) locale conversion.
+ */
+static struct lconv C_lconv = {
+       ".",                    /* decimal_point */
+       empty,                  /* thousands_sep */
+       empty,                  /* grouping */
+       empty,                  /* int_curr_symbol */
+       empty,                  /* currency_symbol */
+       empty,                  /* mon_decimal_point */
+       empty,                  /* mon_thousands_sep */
+       empty,                  /* mon_grouping */
+       empty,                  /* positive_sign */
+       empty,                  /* negative_sign */
+       CHAR_MAX,               /* int_frac_digits */
+       CHAR_MAX,               /* frac_digits */
+       CHAR_MAX,               /* p_cs_precedes */
+       CHAR_MAX,               /* p_sep_by_space */
+       CHAR_MAX,               /* n_cs_precedes */
+       CHAR_MAX,               /* n_sep_by_space */
+       CHAR_MAX,               /* p_sign_posn */
+       CHAR_MAX,               /* n_sign_posn */
+};
+
+/*
+ * Current locale conversion.
+ */
+struct lconv *__lconv = &C_lconv;
diff --git a/locale.subproj/localeconv.c b/locale.subproj/localeconv.c
new file mode 100644 (file)
index 0000000..4393c9c
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <locale.h>
+
+/*
+ * Return the current locale conversion.
+ */
+struct lconv *
+localeconv()
+{
+       extern struct lconv *__lconv;
+
+       return (__lconv);
+}
diff --git a/locale.subproj/mbrune.c b/locale.subproj/mbrune.c
new file mode 100644 (file)
index 0000000..105c4a7
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <limits.h>
+#include <rune.h>
+#include <stddef.h>
+#include <string.h>
+
+char *
+mbrune(string, c)
+       const char *string;
+       rune_t c;
+{
+       char const *result;
+       rune_t r;
+
+       while ((r = sgetrune(string, MB_LEN_MAX, &result))) {
+               if (r == c)
+                       return ((char *)string);
+               string = result == string ? string + 1 : result;
+       }
+
+       return (c == *string ? (char *)string : NULL);
+}
+
+char *
+mbrrune(string, c)
+       const char *string;
+       rune_t c;
+{
+       const char *last = 0;
+       char const *result;
+       rune_t  r;
+
+       while ((r = sgetrune(string, MB_LEN_MAX, &result))) {
+               if (r == c)
+                       last = string;
+               string = result == string ? string + 1 : result;
+       }
+       return (c == *string ? (char *)string : (char *)last);
+}
+
+char *
+mbmb(string, pattern)
+       const char *string;
+       char *pattern;
+{
+       rune_t first, r;
+       size_t plen, slen;
+       char const *result;
+
+       plen = strlen(pattern);
+       slen = strlen(string);
+       if (plen > slen)
+               return (0);
+
+       first = sgetrune(pattern, plen, &result);
+       if (result == string)
+               return (0);
+
+       while (slen >= plen && (r = sgetrune(string, slen, &result))) {
+               if (r == first) {
+                       if (strncmp(string, pattern, slen) == 0)
+                               return ((char *) string);
+               }
+               if (result == string) {
+                       --slen;
+                       ++string;
+               } else {
+                       slen -= result - string;
+                       string = result;
+               }
+       }
+       return (0);
+}
diff --git a/locale.subproj/none.c b/locale.subproj/none.c
new file mode 100644 (file)
index 0000000..8c8c442
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stddef.h>
+#include <stdio.h>
+#include <rune.h>
+#include <errno.h>
+#include <stdlib.h>
+
+rune_t _none_sgetrune __P((const char *, size_t, char const **));
+int    _none_sputrune __P((rune_t, char *, size_t, char **));
+
+int
+_none_init(rl)
+       _RuneLocale *rl;
+{
+       rl->sgetrune = _none_sgetrune;
+       rl->sputrune = _none_sputrune;
+       _CurrentRuneLocale = rl;
+       __mb_cur_max = 1;
+       return(0);
+}
+
+rune_t
+_none_sgetrune(string, n, result)
+       const char *string;
+       size_t n;
+       char const **result;
+{
+       int c;
+
+       if (n < 1) {
+               if (result)
+                       *result = string;
+               return(_INVALID_RUNE);
+       }
+       if (result)
+               *result = string + 1;
+       return(*string & 0xff);
+}
+
+int
+_none_sputrune(c, string, n, result)
+       rune_t c;
+       char *string, **result;
+       size_t n;
+{
+       if (n >= 1) {
+               if (string)
+                       *string = c;
+               if (result)
+                       *result = string + 1;
+       } else if (result)
+               *result = (char *)0;
+       return(1);
+}
diff --git a/locale.subproj/rune.c b/locale.subproj/rune.c
new file mode 100644 (file)
index 0000000..2325a7e
--- /dev/null
@@ -0,0 +1,352 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <rune.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int             _none_init __P((_RuneLocale *));
+extern int             _UTF2_init __P((_RuneLocale *));
+extern int             _EUC_init __P((_RuneLocale *));
+static _RuneLocale     *_Read_RuneMagi __P((FILE *));
+
+static char *PathLocale = 0;
+
+int
+setrunelocale(encoding)
+       char *encoding;
+{
+       FILE *fp;
+       char name[PATH_MAX];
+       _RuneLocale *rl;
+
+       if (!encoding)
+           return(EFAULT);
+
+       /*
+        * The "C" and "POSIX" locale are always here.
+        */
+       if (!strcmp(encoding, "C") || !strcmp(encoding, "POSIX")) {
+               _CurrentRuneLocale = &_DefaultRuneLocale;
+               return(0);
+       }
+
+       if (!PathLocale && !(PathLocale = getenv("PATH_LOCALE")))
+               PathLocale = _PATH_LOCALE;
+
+       sprintf(name, "%s/%s/LC_CTYPE", PathLocale, encoding);
+
+       if ((fp = fopen(name, "r")) == NULL)
+               return(ENOENT);
+
+       if ((rl = _Read_RuneMagi(fp)) == 0) {
+               fclose(fp);
+               return(EFTYPE);
+       }
+
+       if (!rl->encoding[0] || !strcmp(rl->encoding, "UTF2")) {
+               return(_UTF2_init(rl));
+       } else if (!strcmp(rl->encoding, "NONE")) {
+               return(_none_init(rl));
+       } else if (!strcmp(rl->encoding, "EUC")) {
+               return(_EUC_init(rl));
+       } else
+               return(EINVAL);
+}
+
+void
+setinvalidrune(ir)
+       rune_t ir;
+{
+       _INVALID_RUNE = ir;
+}
+
+static _RuneLocale *
+_Read_RuneMagi(fp)
+       FILE *fp;
+{
+       char *data;
+       void *np;
+       void *lastp;
+       _RuneLocale *rl;
+       _RuneEntry *rr;
+       struct stat sb;
+       int x;
+
+       if (fstat(fileno(fp), &sb) < 0)
+               return(0);
+
+       if (sb.st_size < sizeof(_RuneLocale))
+               return(0);
+
+       if ((data = malloc(sb.st_size)) == NULL)
+               return(0);
+
+       rewind(fp); /* Someone might have read the magic number once already */
+
+       if (fread(data, sb.st_size, 1, fp) != 1) {
+               free(data);
+               return(0);
+       }
+
+       rl = (_RuneLocale *)data;
+       lastp = data + sb.st_size;
+
+       rl->variable = rl + 1;
+
+       if (memcmp(rl->magic, _RUNE_MAGIC_1, sizeof(rl->magic))) {
+               free(data);
+               return(0);
+       }
+
+       rl->invalid_rune = ntohl(rl->invalid_rune);
+       rl->variable_len = ntohl(rl->variable_len);
+       rl->runetype_ext.nranges = ntohl(rl->runetype_ext.nranges);
+       rl->maplower_ext.nranges = ntohl(rl->maplower_ext.nranges);
+       rl->mapupper_ext.nranges = ntohl(rl->mapupper_ext.nranges);
+
+       for (x = 0; x < _CACHED_RUNES; ++x) {
+               rl->runetype[x] = ntohl(rl->runetype[x]);
+               rl->maplower[x] = ntohl(rl->maplower[x]);
+               rl->mapupper[x] = ntohl(rl->mapupper[x]);
+       }
+
+       rl->runetype_ext.ranges = (_RuneEntry *)rl->variable;
+       rl->variable = rl->runetype_ext.ranges + rl->runetype_ext.nranges;
+       if (rl->variable > lastp) {
+               free(data);
+               return(0);
+       }
+
+       rl->maplower_ext.ranges = (_RuneEntry *)rl->variable;
+       rl->variable = rl->maplower_ext.ranges + rl->maplower_ext.nranges;
+       if (rl->variable > lastp) {
+               free(data);
+               return(0);
+       }
+
+       rl->mapupper_ext.ranges = (_RuneEntry *)rl->variable;
+       rl->variable = rl->mapupper_ext.ranges + rl->mapupper_ext.nranges;
+       if (rl->variable > lastp) {
+               free(data);
+               return(0);
+       }
+
+       for (x = 0; x < rl->runetype_ext.nranges; ++x) {
+               rr = rl->runetype_ext.ranges;
+
+               rr[x].min = ntohl(rr[x].min);
+               rr[x].max = ntohl(rr[x].max);
+               if ((rr[x].map = ntohl(rr[x].map)) == 0) {
+                       int len = rr[x].max - rr[x].min + 1;
+                       rr[x].types = rl->variable;
+                       rl->variable = rr[x].types + len;
+                       if (rl->variable > lastp) {
+                               free(data);
+                               return(0);
+                       }
+                       while (len-- > 0)
+                               rr[x].types[len] = ntohl(rr[x].types[len]);
+               } else
+                       rr[x].types = 0;
+       }
+
+       for (x = 0; x < rl->maplower_ext.nranges; ++x) {
+               rr = rl->maplower_ext.ranges;
+
+               rr[x].min = ntohl(rr[x].min);
+               rr[x].max = ntohl(rr[x].max);
+               rr[x].map = ntohl(rr[x].map);
+       }
+
+       for (x = 0; x < rl->mapupper_ext.nranges; ++x) {
+               rr = rl->mapupper_ext.ranges;
+
+               rr[x].min = ntohl(rr[x].min);
+               rr[x].max = ntohl(rr[x].max);
+               rr[x].map = ntohl(rr[x].map);
+       }
+       if (((char *)rl->variable) + rl->variable_len > (char *)lastp) {
+               free(data);
+               return(0);
+       }
+
+       /*
+        * Go out and zero pointers that should be zero.
+        */
+       if (!rl->variable_len)
+               rl->variable = 0;
+
+       if (!rl->runetype_ext.nranges)
+               rl->runetype_ext.ranges = 0;
+
+       if (!rl->maplower_ext.nranges)
+               rl->maplower_ext.ranges = 0;
+
+       if (!rl->mapupper_ext.nranges)
+               rl->mapupper_ext.ranges = 0;
+           
+       return(rl);
+}
+
+unsigned long
+___runetype(c)
+       _BSD_RUNE_T_ c;
+{
+       int x;
+       _RuneRange *rr = &_CurrentRuneLocale->runetype_ext;
+       _RuneEntry *re = rr->ranges;
+
+       if (c == EOF)
+               return(0);
+       for (x = 0; x < rr->nranges; ++x, ++re) {
+               if (c < re->min)
+                       return(0L);
+               if (c <= re->max) {
+                       if (re->types)
+                           return(re->types[c - re->min]);
+                       else
+                           return(re->map);
+               }
+       }
+       return(0L);
+}
+
+_BSD_RUNE_T_
+___toupper(c)
+       _BSD_RUNE_T_ c;
+{
+       int x;
+       _RuneRange *rr = &_CurrentRuneLocale->mapupper_ext;
+       _RuneEntry *re = rr->ranges;
+
+       if (c == EOF)
+               return(EOF);
+       for (x = 0; x < rr->nranges; ++x, ++re) {
+               if (c < re->min)
+                       return(c);
+               if (c <= re->max)
+                       return(re->map + c - re->min);
+       }
+       return(c);
+}
+
+_BSD_RUNE_T_
+___tolower(c)
+       _BSD_RUNE_T_ c;
+{
+       int x;
+       _RuneRange *rr = &_CurrentRuneLocale->maplower_ext;
+       _RuneEntry *re = rr->ranges;
+
+       if (c == EOF)
+               return(EOF);
+       for (x = 0; x < rr->nranges; ++x, ++re) {
+               if (c < re->min)
+                       return(c);
+               if (c <= re->max)
+                       return(re->map + c - re->min);
+       }
+       return(c);
+}
+
+
+#if !defined(_USE_CTYPE_INLINE_) && !defined(_USE_CTYPE_MACROS_)
+/*
+ * See comments in <machine/ansi.h>
+ */
+int
+__istype(c, f)
+       _BSD_RUNE_T_ c;
+       unsigned long f;
+{
+       return ((((c & _CRMASK) ? ___runetype(c)
+           : _CurrentRuneLocale->runetype[c]) & f) ? 1 : 0);
+}
+
+int
+__isctype(_BSD_RUNE_T_ c, unsigned long f)
+       _BSD_RUNE_T_ c;
+       unsigned long f;
+{
+       return ((((c & _CRMASK) ? 0
+           : _DefaultRuneLocale.runetype[c]) & f) ? 1 : 0);
+}
+
+_BSD_RUNE_T_
+toupper(c)
+       _BSD_RUNE_T_ c;
+{
+       return ((c & _CRMASK) ?
+           ___toupper(c) : _CurrentRuneLocale->mapupper[c]);
+}
+
+_BSD_RUNE_T_
+tolower(c)
+       _BSD_RUNE_T_ c;
+{
+       return ((c & _CRMASK) ?
+           ___tolower(c) : _CurrentRuneLocale->maplower[c]);
+}
+#endif
diff --git a/locale.subproj/runetable.c b/locale.subproj/runetable.c
new file mode 100644 (file)
index 0000000..3d6df8a
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <rune.h>
+
+extern rune_t  _none_sgetrune __P((const char *, size_t, char const **));
+extern int     _none_sputrune __P((rune_t, char *, size_t, char **));
+extern int     _none_init __P((char *, char **));
+
+const _RuneLocale _DefaultRuneLocale = {
+    _RUNE_MAGIC_1,
+    "none",
+    _none_sgetrune,
+    _none_sputrune,
+    0xFFFD,
+
+    {  /*00*/  _C,             _C,             _C,             _C,
+               _C,             _C,             _C,             _C,
+       /*08*/  _C,             _C|_S|_B,       _C|_S,          _C|_S,
+               _C|_S,          _C|_S,          _C,             _C,
+       /*10*/  _C,             _C,             _C,             _C,
+               _C,             _C,             _C,             _C,
+       /*18*/  _C,             _C,             _C,             _C,
+               _C,             _C,             _C,             _C,
+       /*20*/  _S|_B|_R,       _P|_R|_G,       _P|_R|_G,       _P|_R|_G,
+               _P|_R|_G,       _P|_R|_G,       _P|_R|_G,       _P|_R|_G,
+       /*28*/  _P|_R|_G,       _P|_R|_G,       _P|_R|_G,       _P|_R|_G,
+               _P|_R|_G,       _P|_R|_G,       _P|_R|_G,       _P|_R|_G,
+       /*30*/  _D|_R|_G|_X|0,  _D|_R|_G|_X|1,  _D|_R|_G|_X|2,  _D|_R|_G|_X|3,
+               _D|_R|_G|_X|4,  _D|_R|_G|_X|5,  _D|_R|_G|_X|6,  _D|_R|_G|_X|7,
+       /*38*/  _D|_R|_G|_X|8,  _D|_R|_G|_X|9,  _P|_R|_G,       _P|_R|_G,
+               _P|_R|_G,       _P|_R|_G,       _P|_R|_G,       _P|_R|_G,
+       /*40*/  _P|_R|_G, _U|_X|_R|_G|_A|10, _U|_X|_R|_G|_A|11, _U|_X|_R|_G|_A|12,
+               _U|_X|_R|_G|_A|13, _U|_X|_R|_G|_A|14, _U|_X|_R|_G|_A|15, _U|_R|_G|_A,
+       /*48*/  _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,
+               _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,
+       /*50*/  _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,
+               _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,
+       /*58*/  _U|_R|_G|_A,    _U|_R|_G|_A,    _U|_R|_G|_A,    _P|_R|_G,
+               _P|_R|_G,       _P|_R|_G,       _P|_R|_G,       _P|_R|_G,
+       /*60*/  _P|_R|_G, _L|_X|_R|_G|_A|10, _L|_X|_R|_G|_A|11, _L|_X|_R|_G|_A|12,
+               _L|_X|_R|_G|_A|13, _L|_X|_R|_G|_A|14, _L|_X|_R|_G|_A|15, _L|_R|_G|_A,
+       /*68*/  _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,
+               _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,
+       /*70*/  _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,
+               _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,
+       /*78*/  _L|_R|_G|_A,    _L|_R|_G|_A,    _L|_R|_G|_A,    _P|_R|_G,
+               _P|_R|_G,       _P|_R|_G,       _P|_R|_G,       _C,
+    },
+    {  0x00,   0x01,   0x02,   0x03,   0x04,   0x05,   0x06,   0x07,
+       0x08,   0x09,   0x0a,   0x0b,   0x0c,   0x0d,   0x0e,   0x0f,
+       0x10,   0x11,   0x12,   0x13,   0x14,   0x15,   0x16,   0x17,
+       0x18,   0x19,   0x1a,   0x1b,   0x1c,   0x1d,   0x1e,   0x1f,
+       0x20,   0x21,   0x22,   0x23,   0x24,   0x25,   0x26,   0x27,
+       0x28,   0x29,   0x2a,   0x2b,   0x2c,   0x2d,   0x2e,   0x2f,
+       0x30,   0x31,   0x32,   0x33,   0x34,   0x35,   0x36,   0x37,
+       0x38,   0x39,   0x3a,   0x3b,   0x3c,   0x3d,   0x3e,   0x3f,
+       0x40,   'a',    'b',    'c',    'd',    'e',    'f',    'g',
+       'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
+       'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
+       'x',    'y',    'z',    0x5b,   0x5c,   0x5d,   0x5e,   0x5f,
+       0x60,   'a',    'b',    'c',    'd',    'e',    'f',    'g',
+       'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
+       'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
+       'x',    'y',    'z',    0x7b,   0x7c,   0x7d,   0x7e,   0x7f,
+       0x80,   0x81,   0x82,   0x83,   0x84,   0x85,   0x86,   0x87,
+       0x88,   0x89,   0x8a,   0x8b,   0x8c,   0x8d,   0x8e,   0x8f,
+       0x90,   0x91,   0x92,   0x93,   0x94,   0x95,   0x96,   0x97,
+       0x98,   0x99,   0x9a,   0x9b,   0x9c,   0x9d,   0x9e,   0x9f,
+       0xa0,   0xa1,   0xa2,   0xa3,   0xa4,   0xa5,   0xa6,   0xa7,
+       0xa8,   0xa9,   0xaa,   0xab,   0xac,   0xad,   0xae,   0xaf,
+       0xb0,   0xb1,   0xb2,   0xb3,   0xb4,   0xb5,   0xb6,   0xb7,
+       0xb8,   0xb9,   0xba,   0xbb,   0xbc,   0xbd,   0xbe,   0xbf,
+       0xc0,   0xc1,   0xc2,   0xc3,   0xc4,   0xc5,   0xc6,   0xc7,
+       0xc8,   0xc9,   0xca,   0xcb,   0xcc,   0xcd,   0xce,   0xcf,
+       0xd0,   0xd1,   0xd2,   0xd3,   0xd4,   0xd5,   0xd6,   0xd7,
+       0xd8,   0xd9,   0xda,   0xdb,   0xdc,   0xdd,   0xde,   0xdf,
+       0xe0,   0xe1,   0xe2,   0xe3,   0xe4,   0xe5,   0xe6,   0xe7,
+       0xe8,   0xe9,   0xea,   0xeb,   0xec,   0xed,   0xee,   0xef,
+       0xf0,   0xf1,   0xf2,   0xf3,   0xf4,   0xf5,   0xf6,   0xf7,
+       0xf8,   0xf9,   0xfa,   0xfb,   0xfc,   0xfd,   0xfe,   0xff,
+    },
+    {  0x00,   0x01,   0x02,   0x03,   0x04,   0x05,   0x06,   0x07,
+       0x08,   0x09,   0x0a,   0x0b,   0x0c,   0x0d,   0x0e,   0x0f,
+       0x10,   0x11,   0x12,   0x13,   0x14,   0x15,   0x16,   0x17,
+       0x18,   0x19,   0x1a,   0x1b,   0x1c,   0x1d,   0x1e,   0x1f,
+       0x20,   0x21,   0x22,   0x23,   0x24,   0x25,   0x26,   0x27,
+       0x28,   0x29,   0x2a,   0x2b,   0x2c,   0x2d,   0x2e,   0x2f,
+       0x30,   0x31,   0x32,   0x33,   0x34,   0x35,   0x36,   0x37,
+       0x38,   0x39,   0x3a,   0x3b,   0x3c,   0x3d,   0x3e,   0x3f,
+       0x40,   'A',    'B',    'C',    'D',    'E',    'F',    'G',
+       'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
+       'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
+       'X',    'Y',    'Z',    0x5b,   0x5c,   0x5d,   0x5e,   0x5f,
+       0x60,   'A',    'B',    'C',    'D',    'E',    'F',    'G',
+       'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
+       'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
+       'X',    'Y',    'Z',    0x7b,   0x7c,   0x7d,   0x7e,   0x7f,
+       0x80,   0x81,   0x82,   0x83,   0x84,   0x85,   0x86,   0x87,
+       0x88,   0x89,   0x8a,   0x8b,   0x8c,   0x8d,   0x8e,   0x8f,
+       0x90,   0x91,   0x92,   0x93,   0x94,   0x95,   0x96,   0x97,
+       0x98,   0x99,   0x9a,   0x9b,   0x9c,   0x9d,   0x9e,   0x9f,
+       0xa0,   0xa1,   0xa2,   0xa3,   0xa4,   0xa5,   0xa6,   0xa7,
+       0xa8,   0xa9,   0xaa,   0xab,   0xac,   0xad,   0xae,   0xaf,
+       0xb0,   0xb1,   0xb2,   0xb3,   0xb4,   0xb5,   0xb6,   0xb7,
+       0xb8,   0xb9,   0xba,   0xbb,   0xbc,   0xbd,   0xbe,   0xbf,
+       0xc0,   0xc1,   0xc2,   0xc3,   0xc4,   0xc5,   0xc6,   0xc7,
+       0xc8,   0xc9,   0xca,   0xcb,   0xcc,   0xcd,   0xce,   0xcf,
+       0xd0,   0xd1,   0xd2,   0xd3,   0xd4,   0xd5,   0xd6,   0xd7,
+       0xd8,   0xd9,   0xda,   0xdb,   0xdc,   0xdd,   0xde,   0xdf,
+       0xe0,   0xe1,   0xe2,   0xe3,   0xe4,   0xe5,   0xe6,   0xe7,
+       0xe8,   0xe9,   0xea,   0xeb,   0xec,   0xed,   0xee,   0xef,
+       0xf0,   0xf1,   0xf2,   0xf3,   0xf4,   0xf5,   0xf6,   0xf7,
+       0xf8,   0xf9,   0xfa,   0xfb,   0xfc,   0xfd,   0xfe,   0xff,
+    },
+};
+
+_RuneLocale *_CurrentRuneLocale = &_DefaultRuneLocale;
+
+int __mb_cur_max = 1;
diff --git a/locale.subproj/setlocale.c b/locale.subproj/setlocale.c
new file mode 100644 (file)
index 0000000..8011e68
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <limits.h>
+#include <locale.h>
+#include <rune.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * Category names for getenv()
+ */
+static char *categories[_LC_LAST] = {
+    "LC_ALL",
+    "LC_COLLATE",
+    "LC_CTYPE",
+    "LC_MONETARY",
+    "LC_NUMERIC",
+    "LC_TIME",
+};
+
+/*
+ * Current locales for each category
+ */
+static char current_categories[_LC_LAST][32] = {
+    "C",
+    "C",
+    "C",
+    "C",
+    "C",
+    "C",
+};
+
+/*
+ * The locales we are going to try and load
+ */
+static char new_categories[_LC_LAST][32];
+
+static char current_locale_string[_LC_LAST * 33];
+static char *PathLocale;
+
+static char    *currentlocale __P((void));
+static char    *loadlocale __P((int));
+
+char *
+setlocale(category, locale)
+       int category;
+       const char *locale;
+{
+       int found, i, len;
+       char *env, *r;
+
+       if (!PathLocale && !(PathLocale = getenv("PATH_LOCALE")))
+               PathLocale = _PATH_LOCALE;
+
+       if (category < 0 || category >= _LC_LAST)
+               return (NULL);
+
+       if (!locale)
+               return (category ?
+                   current_categories[category] : currentlocale());
+
+       /*
+        * Default to the current locale for everything.
+        */
+       for (i = 1; i < _LC_LAST; ++i)
+               (void)strcpy(new_categories[i], current_categories[i]);
+
+       /*
+        * Now go fill up new_categories from the locale argument
+        */
+       if (!*locale) {
+               env = getenv(categories[category]);
+
+               if (!env)
+                       env = getenv(categories[0]);
+
+               if (!env)
+                       env = getenv("LANG");
+
+               if (!env)
+                       env = "C";
+
+               (void) strncpy(new_categories[category], env, 31);
+               new_categories[category][31] = 0;
+               if (!category) {
+                       for (i = 1; i < _LC_LAST; ++i) {
+                               if (!(env = getenv(categories[i])))
+                                       env = new_categories[0];
+                               (void)strncpy(new_categories[i], env, 31);
+                               new_categories[i][31] = 0;
+                       }
+               }
+       } else if (category)  {
+               (void)strncpy(new_categories[category], locale, 31);
+               new_categories[category][31] = 0;
+       } else {
+               if ((r = strchr(locale, '/')) == 0) {
+                       for (i = 1; i < _LC_LAST; ++i) {
+                               (void)strncpy(new_categories[i], locale, 31);
+                               new_categories[i][31] = 0;
+                       }
+               } else {
+                       for (i = 1; r[1] == '/'; ++r);
+                       if (!r[1])
+                               return (NULL);  /* Hmm, just slashes... */
+                       do {
+                               len = r - locale > 31 ? 31 : r - locale;
+                               (void)strncpy(new_categories[i++], locale, len);
+                               new_categories[i++][len] = 0;
+                               locale = r;
+                               while (*locale == '/')
+                                   ++locale;
+                               while (*++r && *r != '/');
+                       } while (*locale);
+                       while (i < _LC_LAST)
+                               (void)strcpy(new_categories[i],
+                                   new_categories[i-1]);
+               }
+       }
+
+       if (category)
+               return (loadlocale(category));
+
+       found = 0;
+       for (i = 1; i < _LC_LAST; ++i)
+               if (loadlocale(i) != NULL)
+                       found = 1;
+       if (found)
+           return (currentlocale());
+       return (NULL);
+}
+
+static char *
+currentlocale()
+{
+       int i;
+
+       (void)strcpy(current_locale_string, current_categories[1]);
+
+       for (i = 2; i < _LC_LAST; ++i)
+               if (strcmp(current_categories[1], current_categories[i])) {
+                       (void)snprintf(current_locale_string,
+                           sizeof(current_locale_string), "%s/%s/%s/%s/%s",
+                           current_categories[1], current_categories[2],
+                           current_categories[3], current_categories[4],
+                           current_categories[5]);
+                       break;
+               }
+       return (current_locale_string);
+}
+
+static char *
+loadlocale(category)
+       int category;
+{
+       char name[PATH_MAX];
+
+       if (strcmp(new_categories[category],
+           current_categories[category]) == 0)
+               return (current_categories[category]);
+
+       if (category == LC_CTYPE) {
+               if (setrunelocale(new_categories[LC_CTYPE]))
+                       return (NULL);
+               (void)strcpy(current_categories[LC_CTYPE],
+                   new_categories[LC_CTYPE]);
+               return (current_categories[LC_CTYPE]);
+       }
+
+       if (!strcmp(new_categories[category], "C") ||
+               !strcmp(new_categories[category], "POSIX")) {
+
+               /*
+                * Some day this will need to reset the locale to the default
+                * C locale.  Since we have no way to change them as of yet,
+                * there is no need to reset them.
+                */
+               (void)strcpy(current_categories[category],
+                   new_categories[category]);
+               return (current_categories[category]);
+       }
+
+       /*
+        * Some day we will actually look at this file.
+        */
+       (void)snprintf(name, sizeof(name), "%s/%s/%s",
+           PathLocale, new_categories[category], categories[category]);
+
+       switch (category) {
+               case LC_COLLATE:
+               case LC_MONETARY:
+               case LC_NUMERIC:
+               case LC_TIME:
+                       return (NULL);
+       }
+}
diff --git a/locale.subproj/utf2.c b/locale.subproj/utf2.c
new file mode 100644 (file)
index 0000000..1d4a69f
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Paul Borman at Krystal Technologies.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <rune.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+rune_t _UTF2_sgetrune __P((const char *, size_t, char const **));
+int    _UTF2_sputrune __P((rune_t, char *, size_t, char **));
+
+static _utf_count[16] = {
+       1, 1, 1, 1, 1, 1, 1, 1,
+       0, 0, 0, 0, 2, 2, 3, 0,
+};
+
+int
+_UTF2_init(rl)
+       _RuneLocale *rl;
+{
+       rl->sgetrune = _UTF2_sgetrune;
+       rl->sputrune = _UTF2_sputrune;
+       _CurrentRuneLocale = rl;
+       __mb_cur_max = 3;
+       return (0);
+}
+
+rune_t
+_UTF2_sgetrune(string, n, result)
+       const char *string;
+       size_t n;
+       char const **result;
+{
+       int c;
+
+       if (n < 1 || (c = _utf_count[(*string >> 4) & 0xf]) > n) {
+               if (result)
+                       *result = string;
+               return (_INVALID_RUNE);
+       }
+       switch (c) {
+       case 1:
+               if (result)
+                       *result = string + 1;
+               return (*string & 0xff);
+       case 2:
+               if ((string[1] & 0xC0) != 0x80)
+                       goto encoding_error;
+               if (result)
+                       *result = string + 2;
+               return (((string[0] & 0x1F) << 6) | (string[1] & 0x3F));
+       case 3:
+               if ((string[1] & 0xC0) != 0x80 || (string[2] & 0xC0) != 0x80)
+                       goto encoding_error;
+               if (result)
+                       *result = string + 3;
+               return (((string[0] & 0x1F) << 12) | ((string[1] & 0x3F) << 6)
+                   | (string[2] & 0x3F));
+       default:
+encoding_error:        if (result)
+                       *result = string + 1;
+               return (_INVALID_RUNE);
+       }
+}
+
+int
+_UTF2_sputrune(c, string, n, result)
+       rune_t c;
+       char *string, **result;
+       size_t n;
+{
+       if (c & 0xF800) {
+               if (n >= 3) {
+                       if (string) {
+                               string[0] = 0xE0 | ((c >> 12) & 0x0F);
+                               string[1] = 0x80 | ((c >> 6) & 0x3F);
+                               string[2] = 0x80 | ((c) & 0x3F);
+                       }
+                       if (result)
+                               *result = string + 3;
+               } else
+                       if (result)
+                               *result = NULL;
+
+               return (3);
+       } else
+               if (c & 0x0780) {
+                       if (n >= 2) {
+                               if (string) {
+                                       string[0] = 0xC0 | ((c >> 6) & 0x1F);
+                                       string[1] = 0x80 | ((c) & 0x3F);
+                               }
+                               if (result)
+                                       *result = string + 2;
+                       } else
+                               if (result)
+                                       *result = NULL;
+                       return (2);
+               } else {
+                       if (n >= 1) {
+                               if (string)
+                                       string[0] = c;
+                               if (result)
+                                       *result = string + 1;
+                       } else
+                               if (result)
+                                       *result = NULL;
+                       return (1);
+               }
+}
diff --git a/mach.subproj/Makefile b/mach.subproj/Makefile
new file mode 100644 (file)
index 0000000..68ed0b6
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = mach
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = externs.h
+
+OTHERLINKED = mach_traps.s
+
+CFILES = clock_sleep.c error_codes.c exc_catcher.c exc_catcher_state.c\
+         exc_catcher_state_identity.c fprintf_stderr.c mach_error.c\
+         mach_error_string.c mach_init.c mach_init_ports.c mach_msg.c\
+         mach_msg_destroy.c mach_msg_receive.c mach_msg_send.c\
+         mach_msg_server.c mach_subsystem_join.c mig_allocate.c\
+         mig_deallocate.c mig_reply_setup.c mig_strncpy.c\
+         ms_thread_switch.c panic.c port_obj.c sbrk.c semaphore.c\
+         slot_name.c mach_absolute_time.c
+
+SUBPROJECTS = headers.subproj servers.subproj
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble\
+            bootstrap.defs clock.defs clock_reply.defs err_ipc.sub\
+            err_kern.sub err_mach_ipc.sub err_server.sub err_us.sub\
+            exc.defs ledger.defs mach_port.defs notify.defs\
+            clock_priv.defs host_priv.defs host_security.defs\
+            lock_set.defs processor.defs processor_set.defs task.defs\
+            thread_act.defs vm_map.defs mach_host.defs
+
+OTHERLINKEDOFILES = mach_traps.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/mach.subproj/Makefile.postamble b/mach.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/mach.subproj/Makefile.preamble b/mach.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c8f3ba4
--- /dev/null
@@ -0,0 +1,37 @@
+PUBLIC_HDR_INSTALL_DIR = /usr/include
+PRIVATE_HDR_INSTALL_DIR = $(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/Versions/B/PrivateHeaders
+PUBLIC_HEADER_DIR_SUFFIX = /mach
+PRIVATE_HEADER_DIR_SUFFIX = /mach
+OTHER_PUBLIC_HEADERS = bootstrap.h \
+                       clock.h \
+                       clock_priv.h \
+                       mach_host.h \
+                       host_priv.h \
+                       host_security.h \
+                       ledger.h \
+                       lock_set.h \
+                       processor.h \
+                       processor_set.h \
+                       task.h \
+                       thread_act.h \
+                       vm_map.h \
+                       mach_port.h
+OTHER_PROJECT_HEADERS = lock_set.h vm_map.h
+OTHER_OFILES =  excUser.o \
+               excServer.o \
+               ledgerUser.o \
+               notifyUser.o \
+               processorUser.o \
+               processor_setUser.o \
+               taskUser.o \
+               vm_mapUser.o \
+               thread_actUser.o \
+               bootstrapUser.o \
+               lock_setUser.o \
+               mach_portUser.o \
+               clockUser.o \
+               clock_privUser.o \
+               mach_hostUser.o \
+               host_privUser.o \
+               host_securityUser.o
+
diff --git a/mach.subproj/PB.project b/mach.subproj/PB.project
new file mode 100644 (file)
index 0000000..9a4126c
--- /dev/null
@@ -0,0 +1,78 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (externs.h); 
+        OTHER_LINKED = (
+            clock_sleep.c, 
+            error_codes.c, 
+            exc_catcher.c, 
+            exc_catcher_state.c, 
+            exc_catcher_state_identity.c, 
+            fprintf_stderr.c, 
+            mach_error.c, 
+            mach_error_string.c, 
+            mach_init.c, 
+            mach_init_ports.c, 
+            mach_msg.c, 
+            mach_msg_destroy.c, 
+            mach_msg_receive.c, 
+            mach_msg_send.c, 
+            mach_msg_server.c, 
+            mach_subsystem_join.c, 
+            mach_traps.s, 
+            mig_allocate.c, 
+            mig_deallocate.c, 
+            mig_reply_setup.c, 
+            mig_strncpy.c, 
+            ms_thread_switch.c, 
+            panic.c, 
+            port_obj.c, 
+            sbrk.c, 
+            semaphore.c, 
+            slot_name.c,
+           mach_absolute_time.c
+        ); 
+        OTHER_SOURCES = (
+            Makefile.preamble, 
+            Makefile, 
+            Makefile.postamble, 
+            bootstrap.defs, 
+            clock.defs, 
+            clock_reply.defs, 
+            err_ipc.sub, 
+            err_kern.sub, 
+            err_mach_ipc.sub, 
+            err_server.sub, 
+            err_us.sub, 
+            exc.defs, 
+            ledger.defs, 
+            mach_port.defs, 
+            notify.defs, 
+            clock_priv.defs, 
+            host_priv.defs, 
+            host_security.defs, 
+            lock_set.defs, 
+            processor.defs, 
+            processor_set.defs, 
+            task.defs, 
+            thread_act.defs, 
+            vm_map.defs, 
+            mach_host.defs
+        ); 
+        SUBPROJECTS = (headers.subproj, servers.subproj); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = mach; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/mach.subproj/bootstrap.defs b/mach.subproj/bootstrap.defs
new file mode 100644 (file)
index 0000000..8f57322
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <mach/bootstrap.defs>
diff --git a/mach.subproj/clock.defs b/mach.subproj/clock.defs
new file mode 100644 (file)
index 0000000..1695171
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/clock.defs>
diff --git a/mach.subproj/clock_priv.defs b/mach.subproj/clock_priv.defs
new file mode 100644 (file)
index 0000000..d419faf
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/clock_priv.defs>
diff --git a/mach.subproj/clock_reply.defs b/mach.subproj/clock_reply.defs
new file mode 100644 (file)
index 0000000..b0e0f5b
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <mach/clock_reply.defs>
diff --git a/mach.subproj/clock_sleep.c b/mach.subproj/clock_sleep.c
new file mode 100644 (file)
index 0000000..e96fcc2
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <mach/message.h>
+#include <mach/mach_syscalls.h>
+#include <mach/clock_types.h>
+
+kern_return_t clock_sleep(mach_port_t clock_name,
+                          sleep_type_t clock_type,
+                          mach_timespec_t sleep_time,
+                          mach_timespec_t *wake_time) {
+
+    return clock_sleep_trap(clock_name, clock_type, sleep_time.tv_sec, sleep_time.tv_nsec, wake_time);
+}
diff --git a/mach.subproj/err_ipc.sub b/mach.subproj/err_ipc.sub
new file mode 100644 (file)
index 0000000..9c763cc
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   err_ipc.sub
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar, 1988
+ *
+ *     Definitions of error strings for original IPC
+ */
+
+static const char * err_codes_send[] = {
+       "(ipc/send) unknown error",             /* -100 */
+       "(ipc/send) invalid memory",            /* -101 */
+       "(ipc/send) invalid port",              /* -102 */
+       "(ipc/send) timed out",                 /* -103 */
+       "(ipc/send) unused error",              /* -104 */
+       "(ipc/send) will notify",               /* -105 */
+       "(ipc/send) notify in progress",        /* -106 */      
+       "(ipc/send) kernel refused message",    /* -107 */
+       "(ipc/send) send interrupted",          /* -108 */
+       "(ipc/send) send message too large",    /* -109 */
+       "(ipc/send) send message too small",    /* -110 */
+       "(ipc/send) message size changed while being copied",   /* -111 */
+};
+
+static const char * err_codes_rcv[] = {
+       "(ipc/rcv) unknown error",                      /* -200 */
+       "(ipc/rcv) invalid memory",                     /* -201 */
+       "(ipc/rcv) invalid port",                       /* -202 */
+       "(ipc/rcv) receive timed out",                  /* -203 */
+       "(ipc/rcv) message too large",                  /* -204 */
+       "(ipc/rcv) no space for message data",          /* -205 */
+       "(ipc/rcv) only sender remaining",              /* -206 */
+       "(ipc/rcv) receive interrupted",                /* -207 */
+       "(ipc/rcv) port receiver changed or port became enabled", /* -208 */
+};
+
+static const char      * err_codes_mig[] = {
+       "(ipc/mig) type check failure in message interface",    /* 0 (-300) */
+       "(ipc/mig) wrong return message ID",                    /* 1 */
+       "(ipc/mig) server detected error",                      /* 2 */
+       "(ipc/mig) bad message ID",                             /* 3 */
+       "(ipc/mig) server found wrong arguments",               /* 4 */
+       "(ipc/mig) no reply should be sent",                    /* 5 */
+       "(ipc/mig) server raised exception",                    /* 6 */
+       "(ipc/mig) user specified array not large enough for return info",      /* 7 */
+};
+
+/*     err_ipc subsystems              */
+static struct error_subsystem err_ipc_sub[] = {
+       /* ipc/0; */
+       {
+               (char *)"(ipc/send)",
+               errlib_count(err_codes_send),
+               (char **)err_codes_send,
+       },
+       /* ipc/1; */
+       {
+               (char *)"(ipc/rcv)",
+               errlib_count(err_codes_rcv),
+               (char **)err_codes_rcv,
+
+       },
+       /* ipc/2 */
+       {
+               (char *)"(ipc/mig)",
+               errlib_count(err_codes_mig),
+               (char **)err_codes_mig,
+       },
+
+};
diff --git a/mach.subproj/err_kern.sub b/mach.subproj/err_kern.sub
new file mode 100644 (file)
index 0000000..5103603
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   err_kern.sub
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar, 1988
+ *
+ *     error codes for Mach and Unix kernels
+ */
+
+static const char * err_codes_kern[] = {
+       "(os/kern) successful",                 /* 0 */
+       "(os/kern) invalid address",
+       "(os/kern) protection failure",
+       "(os/kern) no space available",
+       "(os/kern) invalid argument",
+       "(os/kern) failure",                    /* 5 */
+       "(os/kern) resource shortage",
+       "(os/kern) not receiver",
+       "(os/kern) no access",
+       "(os/kern) memory failure",
+       "(os/kern) memory error",               /* 10 */
+       "(os/kern) already in set",
+       "(os/kern) not in set",
+       "(os/kern) name exists",
+       "(os/kern) aborted",
+       "(os/kern) invalid name",               /* 15 */
+       "(os/kern) invalid task",
+       "(os/kern) invalid right",
+       "(os/kern) invalid value",
+       "(os/kern) urefs overflow",
+       "(os/kern) invalid capability",         /* 20 */
+       "(os/kern) right exists",
+       "(os/kern) invalid host",
+       "(os/kern) memory present",
+       "(os/kern) memory data moved",
+       "(os/kern) memory restart copy",        /* 25 */
+       "(os/kern) invalid processor set",
+       "(os/kern) policy limit",
+       "(os/kern) invalid policy",
+       "(os/kern) invalid object",
+       "(os/kern) already waiting",            /* 30 */
+       "(os/kern) default set",
+       "(os/kern) exception protected",
+       "(os/kern) invalid ledger",
+       "(os/kern) invalid memory control",
+       "(os/kern) invalid security",           /* 35 */
+       "(os/kern) not depressed",
+       "(os/kern) object terminated",
+       "(os/kern) lock set destroyed",
+       "(os/kern) lock unstable",
+       "(os/kern) lock owned by another",      /* 40 */
+       "(os/kern) lock owned by self",
+       "(os/kern) semaphore destroyed",
+       "(os/kern) RPC terminated",
+       "(os/kern) terminate orphan",
+       "(os/kern) let orphan continue",        /* 45 */
+       "(os/kern) service not supported",
+       "(os/kern) remote node down",
+};
+
+static const char * err_codes_unix[] = {
+       NO_SUCH_ERROR,
+       "(os/unix) no rights to object",
+       "(os/unix) file or directory does not exist",
+       "(os/unix) no such process",
+       "(os/unix) interrupted system call",
+       "(os/unix) i/o error",
+       "(os/unix) device does not exist",
+       "(os/unix) argument list is too long",
+       "(os/unix) invalid executable object format",
+       "(os/unix) bad file descriptor number",
+       "(os/unix) no child processes are present",
+       "(os/unix) no more processes are available",
+       "(os/unix) insufficient memory",
+       "(os/unix) access denied",
+       "(os/unix) memory access fault",
+       "(os/unix) block device required for operation",
+       "(os/unix) mount device busy",
+       "(os/unix) file already exists",
+       "(os/unix) cross device link",
+       "(os/unix) device does not exist",
+       "(os/unix) object is not a directory",
+       "(os/unix) object is a directory",
+       "(os/unix) invalid argument",
+       "(os/unix) internal file table overflow",
+       "(os/unix) maximum number of open files reached",
+       "(os/unix) object is not a tty-like device",
+       "(os/unix) executable object is in use",
+       "(os/unix) file is too large",
+       "(os/unix) no space is left on device",
+       "(os/unix) illegal seek attempt",
+       "(os/unix) read-only file system",
+       "(os/unix) too many links",
+       "(os/unix) broken pipe",
+       "(os/unix) argument is too large",
+       "(os/unix) result is out of range",
+       "(os/unix) operation on device would block",
+       "(os/unix) operation is now in progress",
+       "(os/unix) operation is already in progress",   
+       "(os/unix) socket operation attempted on non-socket object",
+       "(os/unix) destination address is required",
+       "(os/unix) message is too long",
+       "(os/unix) protocol type is incorrect for socket",
+       "(os/unix) protocol type is not availaible",
+       "(os/unix) protocol type is not supported",
+       "(os/unix) socket type is not supported",
+       "(os/unix) operation is not supported on sockets",
+       "(os/unix) protocol family is not supported",
+       "(os/unix) address family is not supported by protocol family",
+       "(os/unix) address is already in use",
+       "(os/unix) can't assign requested address",
+       "(os/unix) network is down",
+       "(os/unix) network is unreachable",
+       "(os/unix) network dropped connection on reset",
+       "(os/unix) software aborted connection",
+       "(os/unix) connection reset by peer",
+       "(os/unix) no buffer space is available",
+       "(os/unix) socket is already connected",
+       "(os/unix) socket is not connected",
+       "(os/unix) can't send after socket shutdown",
+       "(os/unix) too many references; can't splice",
+       "(os/unix) connection timed out",
+       "(os/unix) connection was refused",
+       "(os/unix) too many levels of symbolic links",
+       "(os/unix) file name exceeds system maximum limit",
+       "(os/unix) host is down",
+       "(os/unix) there is no route to host",
+       "(os/unix) directory is not empty",
+       "(os/unix) quota on number of processes exceeded",
+       "(os/unix) quota on number of users exceeded",
+       "(os/unix) quota on available disk space exceeded",
+};
+
+static struct error_subsystem err_os_sub[] = {
+       {
+       (char *)"(os/kern)",
+       errlib_count(err_codes_kern),
+       (char **)err_codes_kern,
+       },
+       {
+       (char *)"(os/?)",
+       0,
+       },
+       {
+       (char *)"(os/?)",
+       0,
+       },
+       {
+       (char *)"(os/unix)",
+       errlib_count(err_codes_unix),
+       (char **)err_codes_unix,
+       },
+};
diff --git a/mach.subproj/err_mach_ipc.sub b/mach.subproj/err_mach_ipc.sub
new file mode 100644 (file)
index 0000000..6db64fb
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   err_mach_ipc.sub
+ *     Author: Richard Draves, Carnegie Mellon University
+ *     Date:   Jan, 1990
+ *
+ *     Error string definitions for the new Mach IPC
+ */
+
+static const char * err_codes_mach_send[] = {
+       /* 0 */ "(ipc/send) no error",
+       /* 1 */ "(ipc/send) send in progress",
+       /* 2 */ "(ipc/send) invalid data",
+       /* 3 */ "(ipc/send) invalid destination port",
+       /* 4 */ "(ipc/send) timed out",
+       /* 5 */ "(ipc/send) will notify",
+       /* 6 */ "(ipc/send) notify in progress",
+       /* 7 */ "(ipc/send) interrupted",
+       /* 8 */ "(ipc/send) msg too small",
+       /* 9 */ "(ipc/send) invalid reply port",
+       /* 10 */        "(ipc/send) invalid port right",
+       /* 11 */        "(ipc/send) invalid notify port",
+       /* 12 */        "(ipc/send) invalid memory",
+       /* 13 */        "(ipc/send) no msg buffer",
+       /* 14 */        "(ipc/send) no notify possible",
+       /* 15 */        "(ipc/send) invalid msg-type",
+       /* 16 */        "(ipc/send) invalid msg-header",
+       /* 17 */ "(ipc/send) invalid msg-trailer",
+       /* 18 */ "(ipc/send) DIPC transport failure",
+       /* 19 */ "(ipc/send) DIPC port migrated",
+       /* 20 */ "(ipc/send) DIPC resend failed",
+       /* 21 */ "(ipc/send) out-of-line buffer too large",
+};
+
+static const char * err_codes_mach_rcv[] = {
+       /* 0 */ "(ipc/rcv) no error",
+       /* 1 */ "(ipc/rcv) receive in progress",
+       /* 2 */ "(ipc/rcv) invalid name",
+       /* 3 */ "(ipc/rcv) timed out",
+       /* 4 */ "(ipc/rcv) msg too large",
+       /* 5 */ "(ipc/rcv) interrupted",
+       /* 6 */ "(ipc/rcv) port changed",
+       /* 7 */ "(ipc/rcv) invalid notify port",
+       /* 8 */ "(ipc/rcv) invalid data",
+       /* 9 */ "(ipc/rcv) port died",
+       /* 10 */        "(ipc/rcv) port in set",
+       /* 11 */        "(ipc/rcv) header error",
+       /* 12 */        "(ipc/rcv) body error",
+       /* 13 */        "(ipc/rcv) invalid scatter list entry",
+       /* 14 */        "(ipc/rcv) overwrite region too small",
+       /* 15 */ "(ipc/rcv) invalid msg-trailer",
+       /* 16 */ "(ipc/rcv) DIPC transport error",
+};
+
+static const char      * err_codes_mach_mig[] = {
+       /* 0 */ "(ipc/mig) client type check failure",
+       /* 1 */ "(ipc/mig) wrong reply message ID",
+       /* 2 */ "(ipc/mig) server detected error",
+       /* 3 */ "(ipc/mig) bad request message ID",
+       /* 4 */ "(ipc/mig) server type check failure",
+       /* 5 */ "(ipc/mig) no reply should be sent",
+       /* 6 */ "(ipc/mig) server raised exception",
+       /* 7 */ "(ipc/mig) array not large enough",
+       /* 8 */ "(ipc/mig) server died",
+       /* 9 */ "(ipc/mig) unknown trailer format",
+};
+
+/*     err_mach_ipc subsystems         */
+static struct error_subsystem err_mach_ipc_sub[] = {
+       /* ipc/0; */
+       {
+               (char *)"(ipc/send)",
+               errlib_count(err_codes_mach_send),
+               (char **)err_codes_mach_send,
+       },
+       /* ipc/1; */
+       {
+               (char *)"(ipc/rcv)",
+               errlib_count(err_codes_mach_rcv),
+               (char **)err_codes_mach_rcv,
+
+       },
+       /* ipc/2 */
+       {
+               (char *)"(ipc/mig)",
+               errlib_count(err_codes_mach_mig),
+               (char **)err_codes_mach_mig,
+       },
+
+};
diff --git a/mach.subproj/err_server.sub b/mach.subproj/err_server.sub
new file mode 100644 (file)
index 0000000..fcbe91b
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   err_server.sub
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar, 1988
+ *
+ *     Definitions of Servers error strings
+ */
+
+static const char * err_codes_netname[] = {                    /* 0 */
+               "(server/netname) name is not yours",
+               "(server/netname) name not checked in",
+               "(server/netname) no such host",
+               "(server/netname) host not found",
+};
+static const char * err_codes_env_mgr[] = {                    /* 1 */
+               NO_SUCH_ERROR,
+               "(server/env_mgr) variable not found",
+               "(server/env_mgr) wrong type of variable",
+               "(server/env_mgr) unknown port",
+               "(server/env_mgr) read only environment",
+               "(server/env_mgr) no more connections available",
+               "(server/env_mgr) port table full",
+               "(server/env_mgr) attempting to enter a null port ",
+};
+static const char * err_codes_execd[] = {                      /* 2 */
+               NO_SUCH_ERROR,
+               "(server/execd) could not find file to run",
+               "(server/execd) userid or password incorrect",
+               "(server/execd) fork failed",
+};
+static const char * err_codes_netmemory[] = {                  /* 3 */
+               "(server/netmemory) successful",
+               "(server/netmemory) invalid argument",
+               "(server/netmemory) resource shortage",
+};
+static const char * err_codes_ufs[] = {                                /* 4 */
+               NO_SUCH_ERROR,
+/* XXX         "(server/ufs) invalid port", */
+};
+
+static const char * err_codes_task_master[] = {                        /* 5 */
+               "(server/task_master) GENERIC ERROR",
+               "(server/task_master) invalid tm_task port",
+               "(server/task_master) invalid task id",
+               "(server/task_master) invalid kernel port",
+               "(server/task_master) invalid job group",
+               "(server/task_master) invalid action",
+};
+
+static const char * err_codes_ns[] = {                         /* 6 */
+               "(server/ns) GENERIC ERROR",
+               "(server/ns) invalid handle",
+               "(server/ns) name not found",
+               "(server/ns) name already exists",
+               "(server/ns) name too long",
+               "(server/ns) path too long",
+               "(server/ns) invalid name",
+               "(server/ns) not a directory",
+               "(server/ns) is a directory",
+               "(server/ns) directory not empty",
+               "(server/ns) infinite retry loop in resolver",
+               "(server/ns) infinite forwarding loop in resolver",
+               "(server/ns) invalid prefix",
+               "(server/ns) prefix table overflow",
+               "(server/ns) bad format for directory",
+               "(server/ns) unknown entry type",
+               "(server/ns) invalid generation",
+               "(server/ns) entry not reserved",
+};
+
+static const char      * err_codes_io[] = {                    /* 7 */
+               "(server/io) GENERIC ERROR",
+               "(server/io) invalid offset",
+               "(server/io) invalid size",
+               "(server/io) invalid mode",
+               "(server/io) invalid strategy",
+               "(server/io) operation rejected under current I/O strategy",
+};
+
+static const char * err_codes_auth[] = {                       /* 8 */
+               "(server/auth) GENERIC ERROR",
+               "(server/auth) bad private port",
+               "(server/auth) bad name",
+               "(server/auth) not primary",
+               "(server/auth) bad pauthsword",
+               "(server/auth) bad group",
+               "(server/auth) duplicate id",
+               "(server/auth) duplicate name",
+               "(server/auth) not secondary",
+};
+
+static const char * err_codes_us[] = {                         /* 9 */
+               "(server/us) GENERIC ERROR",
+               "(server/us) unknown error",
+               "(server/us) object not found",
+               "(server/us) object exists",
+               "(server/us) object busy",
+               "(server/us) object not started",
+               "(server/us) object dead",
+               "(server/us) invalid args",
+               "(server/us) invalid access",
+               "(server/us) invalid format",
+               "(server/us) invalid buffer size",
+               "(server/us) access denied",
+               "(server/us) resource exhausted",
+               "(server/us) quota exceeded",
+               "(server/us) limit exceeded",
+               "(server/us) not implemented",
+               "(server/us) not supported",
+               "(server/us) hardware error",
+               "(server/us) retry required",
+               "(server/us) not authenticated",
+               "(server/us) exclusive access",
+               "(server/us) timeout",
+               "(server/us) bad reference count",
+               "(server/us) internal error",
+};
+
+static const char * err_codes_sunrpc[] = {                     /* 10 */
+               "(server/sunrpc) GENERIC ERROR",
+               "(server/sunrpc) cannot encode arguments",
+               "(server/sunrpc) cannot decode results",
+               "(server/sunrpc) failure in sending call",
+               "(server/sunrpc) failure in receiving result",
+               "(server/sunrpc) call timed out",
+               "(server/sunrpc) rpc versions not compatible",
+               "(server/sunrpc) authentication error",
+               "(server/sunrpc) program not available",
+               "(server/sunrpc) program version mismatched",
+               "(server/sunrpc) procedure unavailable",
+               "(server/sunrpc) decode arguments error",
+               "(server/sunrpc) generic other problem",
+               "(server/sunrpc) unknown host name",
+               "(server/sunrpc) portmapper failed",
+               "(server/sunrpc) remote program not registered",
+               "(server/sunrpc) unspecified error",
+               "(server/sunrpc) unknown protocol",
+};
+
+static const char      * err_codes_machobj[] = {               /* 11 */
+               "(server/object system) GENERIC ERROR",
+               "(server/object system) object not found",
+               "(server/object system) no such operation",
+               "(server/object system) undefined ipc method arguments",
+               "(server/object system) too many arguments to method",
+               "(server/object system) bad ipc message format",
+};
+
+static const char      * err_codes_loader[] = {                /* 12 */
+               "(server/loader) GENERIC ERROR",
+               "(server/loader) object file not relocated",
+               "(server/loader) unknown file type",
+               "(server/loader) symbol not found",
+               "(server/loader) symbol multiply defined",
+               "(server/loader) memory region overlap",
+};
+
+
+static const char      * err_codes_exception[] = {             /* 13 */
+       "(server/exception) GENERIC ERROR",
+       "(server/exception) invalid access",
+       "(server/exception) invalid instruction",
+       "(server/exception) arithmetic exception",
+       "(server/exception) emulation exception",
+       "(server/exception) software exception",
+       "(server/exception) breakpoint exception",
+};
+
+static const char      * err_codes_ux_signal[] = {             /* 14 */
+       "(server/unix-signal) GENERIC ERROR",
+       "(server/unix-signal) hangup",
+       "(server/unix-signal) interrupt",
+       "(server/unix-signal) quit",
+       "(server/unix-signal) undefined",
+       "(server/unix-signal) undefined",
+       "(server/unix-signal) undefined",
+       "(server/unix-signal) undefined",
+       "(server/unix-signal) kill",
+       "(server/unix-signal) undefined",
+       "(server/unix-signal) undefined",
+       "(server/unix-signal) system error",
+       "(server/unix-signal) pipe signal",
+       "(server/unix-signal) alarm",
+       "(server/unix-signal) terminate",
+       "(server/unix-signal) urgent i/o",
+       "(server/unix-signal) stop",
+       "(server/unix-signal) terminal stop",
+       "(server/unix-signal) continue",
+       "(server/unix-signal) child death",
+       "(server/unix-signal) tty input",
+       "(server/unix-signal) tty output",
+       "(server/unix-signal) i/o signal",
+       "(server/unix-signal) cpu time limit exceeded",
+       "(server/unix-signal) file size exceeded",
+       "(server/unix-signal) virtual alarm",
+       "(server/unix-signal) profile signal",
+       "(server/unix-signal) window size change",
+       "(server/unix-signal) user-defined signal 1",
+       "(server/unix-signal) user-defined signal 2",
+};
+
+static const char      * err_codes_xkernel[] = {               /* 15 */
+       "(server/xkernel) GENERIC ERROR",
+       "(server/xkernel) map full",
+       "(server/xkernel) inconsistent bind",
+       "(server/xkernel) cannot resolve",
+       "(server/xkernel) cannot unbind",
+       "(server/xkernel) invalid type",
+       "(server/xkernel) invalid opcode",
+       "(server/xkernel) buffer too small",
+       "(server/xkernel) invalid ev code",
+       "(server/xkernel) event not registered",
+       "(server/xkernel) invalid open",
+       "(server/xkernel) already open",
+       "(server/xkernel) bad addr",
+};
+
+
+/*     err_server subsystems           */
+static struct error_subsystem err_server_sub[] = {
+       /* server/0; */
+       {
+               (char *)"(server/netname)",
+               errlib_count(err_codes_netname),
+               (char **)err_codes_netname,
+       },
+       /* server/1; */
+       {
+               (char *)"(server/env_mgr)",
+               errlib_count(err_codes_env_mgr),
+               (char **)err_codes_env_mgr,
+       },
+       /* server/2; */
+       {
+               (char *)"(server/execd)",
+               errlib_count(err_codes_execd),
+               (char **)err_codes_execd,
+       },
+       /* server/3; */
+       {
+               (char *)"(server/netmemory)",
+               errlib_count(err_codes_netmemory),
+               (char **)err_codes_netmemory,
+       },
+       /* server/4; */
+       {
+               (char *)"(server/ufs)",
+               errlib_count(err_codes_ufs),
+               (char **)err_codes_ufs,
+       },
+       /* server/5; */
+       {
+               (char *)"(server/task_master)",
+               errlib_count(err_codes_task_master),
+               (char **)err_codes_task_master,
+       },
+       /* server/6; */
+       {
+               (char *)"(server/ns)",
+               errlib_count(err_codes_ns),
+               (char **)err_codes_ns,
+       },
+
+       /* server/7; i/o subsystem */
+       {
+               (char *)"(server/io)",
+               errlib_count(err_codes_io),
+               (char **)err_codes_io,
+       },
+
+       /* server/8; authentication server */
+       {
+               (char *)"(server/auth)",
+               errlib_count(err_codes_auth),
+               (char **)err_codes_auth,
+       },
+
+       /* server/9; generic US system */
+       {
+               (char *)"(server/us)",
+               errlib_count(err_codes_us),
+               (char **)err_codes_us,
+       },
+
+       /* server/10; SUN RPC package */
+       {
+               (char *)"(server/sunrpc)",
+               errlib_count(err_codes_sunrpc),
+               (char **)err_codes_sunrpc,
+       },
+
+       /* server/11; MachObject system */
+       {
+               (char *)"(server/object system)",
+               errlib_count(err_codes_machobj),
+               (char **)err_codes_machobj,
+       },
+
+       /* server/12; loader */
+       {
+               (char *)"(server/loader)",
+               errlib_count(err_codes_loader),
+               (char **)err_codes_loader,
+       },
+
+       /* server/13; mach exception */
+       {
+               (char *)"(server/exception)",
+               errlib_count(err_codes_exception),
+               (char **)err_codes_exception,
+       },
+
+       /* server/14; unix signal */
+       {
+               (char *)"(server/unix-signal)",
+               errlib_count(err_codes_ux_signal),
+               (char **)err_codes_ux_signal,
+       },
+
+       /* server/15; xkernel */
+       {
+               (char *)"(server/xkernel)",
+               errlib_count(err_codes_xkernel),
+               (char **)err_codes_xkernel,
+       },
+
+};
diff --git a/mach.subproj/err_us.sub b/mach.subproj/err_us.sub
new file mode 100644 (file)
index 0000000..8db68f6
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   err_us.sub
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar, 1988
+ *
+ *     A place to define User errors
+ */
+
+
+/*     err_us subsystems       */
+static struct error_subsystem err_us_sub[] = {
+       {
+               (char *)0,
+       },
+};
diff --git a/mach.subproj/error_codes.c b/mach.subproj/error_codes.c
new file mode 100644 (file)
index 0000000..b46cd61
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   error_codes.c
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar, 1988
+ *
+ *      Generic error code interface
+ */
+
+#include <mach/error.h>
+#include <mach/errorlib.h>
+#include "err_kern.sub"
+#include "err_us.sub"
+#include "err_server.sub"
+#include "err_ipc.sub"
+#include "err_mach_ipc.sub"
+
+struct error_system errors[err_max_system+1] = {
+       /* 0; err_kern */
+       {
+               errlib_count(err_os_sub),
+               (char *)"(operating system/?) unknown subsystem error",
+               err_os_sub,
+       },
+       /* 1; err_us */
+       {
+               errlib_count(err_us_sub),
+               (char *)"(user space/?) unknown subsystem error",
+               err_us_sub,
+       },
+       /* 2; err_server */
+       {
+               errlib_count(err_server_sub),
+               (char *)"(server/?) unknown subsystem error",
+               err_server_sub,
+       },
+       /* 3 (& 3f); err_ipc */
+       {
+               errlib_count(err_ipc_sub),
+               (char *)"(ipc/?) unknown subsystem error",
+               err_ipc_sub,
+       },
+       /* 4; err_mach_ipc */
+       {
+               errlib_count(err_mach_ipc_sub),
+               (char *)"(ipc/?) unknown subsystem error",
+               err_mach_ipc_sub,
+       },
+};
+
+int error_system_count = errlib_count(errors);
diff --git a/mach.subproj/exc.defs b/mach.subproj/exc.defs
new file mode 100644 (file)
index 0000000..9bdb234
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#define catch_ internal_catch_
+#include <mach/exc.defs>
diff --git a/mach.subproj/exc_catcher.c b/mach.subproj/exc_catcher.c
new file mode 100644 (file)
index 0000000..1125ed3
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * catch_exception_raise will be implemented by user programs
+ * This implementation is provided to resolve the reference in
+ * exc_server().
+ */
+
+#include <mach/boolean.h>
+#include <mach/message.h>
+#include <mach/exception.h>
+#include <mach/mig_errors.h>
+#include <mach-o/dyld.h>
+
+__private_extern__ kern_return_t internal_catch_exception_raise (
+    mach_port_t exception_port,
+    mach_port_t thread,
+    mach_port_t task,
+    exception_type_t exception,
+    exception_data_t code,
+    mach_msg_type_number_t codeCnt)
+{
+#if defined(__DYNAMIC__)
+    static int checkForFunction = 0;
+    /* This will be non-zero if the user has defined this function */
+    static kern_return_t (*func)(mach_port_t, mach_port_t, mach_port_t, exception_type_t, exception_data_t, mach_msg_type_number_t);
+    if (checkForFunction == 0) {
+        checkForFunction = 1;
+        _dyld_lookup_and_bind("_catch_exception_raise", (unsigned long *)&func, (void **)0);
+    }
+    if (func == 0) {
+        /* The user hasn't defined catch_exception_raise in their binary */
+        abort();
+    }
+    return (*func)(exception_port, thread, task, exception, code, codeCnt);
+#else
+    extern kern_return_t catch_exception_raise(mach_port_t, mach_port_t, mach_port_t, exception_type_t, exception_data_t, mach_msg_type_number_t);
+    return catch_exception_raise(exception_port, thread, task, exception, code, codeCnt);
+#endif
+}
+
diff --git a/mach.subproj/exc_catcher_state.c b/mach.subproj/exc_catcher_state.c
new file mode 100644 (file)
index 0000000..61cefb3
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * catch_exception_raise_state will be implemented by user programs
+ * This implementation is provided to resolve the reference in
+ * exc_server().
+ */
+
+#include <mach/boolean.h>
+#include <mach/message.h>
+#include <mach/exception.h>
+#include <mach/mig_errors.h>
+#include <mach-o/dyld.h>
+
+__private_extern__ kern_return_t internal_catch_exception_raise_state (
+        mach_port_t exception_port,
+        exception_type_t exception,
+        exception_data_t code,
+        mach_msg_type_number_t codeCnt,
+        int *flavor,
+        thread_state_t old_state,
+        mach_msg_type_number_t old_stateCnt,
+        thread_state_t new_state,
+        mach_msg_type_number_t *new_stateCnt)
+{
+#if defined(__DYNAMIC__)
+    static int checkForFunction = 0;
+    /* This will be non-zero if the user has defined this function */
+    static kern_return_t (*func)(mach_port_t, exception_type_t, exception_data_t, mach_msg_type_number_t, int *, thread_state_t, mach_msg_type_number_t, thread_state_t, mach_msg_type_number_t *);
+    if (checkForFunction == 0) {
+        checkForFunction = 1;
+        _dyld_lookup_and_bind("_catch_exception_raise_state", (unsigned long *)&func, (void **)0);
+    }
+    if (func == 0) {
+        /* The user hasn't defined catch_exception_raise in their binary */
+        abort();
+    }
+    return (*func)(exception_port, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt);
+#else
+    extern kern_return_t catch_exception_raise_state(mach_port_t, exception_type_t, exception_data_t, mach_msg_type_number_t, int *, thread_state_t, mach_msg_type_number_t, thread_state_t, mach_msg_type_number_t *);
+    return catch_exception_raise_state(exception_port, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt);
+#endif
+}
diff --git a/mach.subproj/exc_catcher_state_identity.c b/mach.subproj/exc_catcher_state_identity.c
new file mode 100644 (file)
index 0000000..ac2ea37
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * catch_exception_raise_state_identity will be implemented by user programs
+ * This implementation is provided to resolve the reference in
+ * exc_server().
+ */
+
+#include <mach/boolean.h>
+#include <mach/message.h>
+#include <mach/exception.h>
+#include <mach/mig_errors.h>
+#include <mach-o/dyld.h>
+
+__private_extern__ kern_return_t internal_catch_exception_raise_state_identity (
+        mach_port_t exception_port,
+        mach_port_t thread,
+        mach_port_t task,
+        exception_type_t exception,
+        exception_data_t code,
+        mach_msg_type_number_t codeCnt,
+        int *flavor,
+        thread_state_t old_state,
+        mach_msg_type_number_t old_stateCnt,
+        thread_state_t new_state,
+        mach_msg_type_number_t *new_stateCnt)
+{
+#if defined(__DYNAMIC__)
+    static int checkForFunction = 0;
+    /* This will be non-zero if the user has defined this function */
+    static kern_return_t (*func)(mach_port_t, mach_port_t, mach_port_t, exception_type_t, exception_data_t, mach_msg_type_number_t, int *, thread_state_t, mach_msg_type_number_t, thread_state_t, mach_msg_type_number_t *);
+    if (checkForFunction == 0) {
+        checkForFunction = 1;
+        _dyld_lookup_and_bind("_catch_exception_raise_state_identity", (unsigned long *)&func, (void **)0);
+    }
+    if (func == 0) {
+        /* The user hasn't defined catch_exception_raise in their binary */
+        abort();
+    }
+    return (*func)(exception_port, thread, task, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt);
+#else
+    extern kern_return_t catch_exception_raise_state_identity(mach_port_t, mach_port_t, mach_port_t, exception_type_t, exception_data_t, mach_msg_type_number_t, int *, thread_state_t, mach_msg_type_number_t, thread_state_t, mach_msg_type_number_t *);
+    return catch_exception_raise_state_identity(exception_port, thread, task, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt);
+#endif
+}
diff --git a/mach.subproj/externs.h b/mach.subproj/externs.h
new file mode 100644 (file)
index 0000000..0110179
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+#include <mach/boolean.h>
+#include <mach/error.h>
+#include <mach/message.h>
+#include <mach/vm_types.h>
+
+extern void mig_init(void *);
+extern void mach_init_ports(void);
+extern void mig_allocate(vm_address_t *, vm_size_t);
+extern void mig_deallocate(vm_address_t, vm_size_t);
+
+extern char *mach_error_string_int(mach_error_t, boolean_t *);
diff --git a/mach.subproj/fprintf_stderr.c b/mach.subproj/fprintf_stderr.c
new file mode 100644 (file)
index 0000000..a2f70f7
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * @OSF_FREE_COPYRIGHT@
+ * 
+ */
+
+#include <mach/mach.h>
+#include <mach/mach_init.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+int (*vprintf_stderr_func)(const char *format, va_list ap);
+
+
+/* This function allows the writing of a mach error message to an
+ * application-controllable output method, the default being to
+ * use printf if no other method is specified by the application.
+ *
+ * To override, set the global (static) function pointer vprintf_stderr to
+ * a function which takes the same parameters as vprintf.
+ */
+
+int fprintf_stderr(const char *format, ...)
+{
+        va_list args;
+       int retval;
+
+       va_start(args, format);
+       if (vprintf_stderr_func == NULL)
+               retval = vprintf(format, args);
+       else
+               retval = (*vprintf_stderr_func)(format, args);
+       va_end(args);
+
+       return retval;
+}
diff --git a/mach.subproj/headers.subproj/Makefile b/mach.subproj/headers.subproj/Makefile
new file mode 100644 (file)
index 0000000..f82584e
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = headers
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = errorlib.h mach.h mach_error.h mach_init.h mach_interface.h\
+         mig_errors.h port_obj.h sync.h vm_task.h
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+PUBLIC_HEADERS = errorlib.h mach.h mach_error.h mach_init.h\
+                 mig_errors.h port_obj.h mach_interface.h sync.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/Sandbox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/mach.subproj/headers.subproj/Makefile.postamble b/mach.subproj/headers.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/mach.subproj/headers.subproj/Makefile.preamble b/mach.subproj/headers.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..817860a
--- /dev/null
@@ -0,0 +1 @@
+PUBLIC_HEADER_DIR_SUFFIX = /mach
diff --git a/mach.subproj/headers.subproj/PB.project b/mach.subproj/headers.subproj/PB.project
new file mode 100644 (file)
index 0000000..7448712
--- /dev/null
@@ -0,0 +1,45 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (
+            errorlib.h, 
+            mach.h, 
+            mach_error.h, 
+            mach_init.h, 
+            mach_interface.h, 
+            mig_errors.h, 
+            port_obj.h, 
+            sync.h, 
+            vm_task.h
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        PUBLIC_HEADERS = (
+            errorlib.h, 
+            mach.h, 
+            mach_error.h, 
+            mach_init.h, 
+            mig_errors.h, 
+            port_obj.h, 
+            mach_interface.h, 
+            sync.h
+        ); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/Sandbox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = headers; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/mach.subproj/headers.subproj/errorlib.h b/mach.subproj/headers.subproj/errorlib.h
new file mode 100644 (file)
index 0000000..aa270da
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   errorlib.h
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar. 1988
+ *
+ *     Error bases for subsytems errors.
+ */
+
+#include <mach/error.h>
+
+#define        MACH_IPC_SEND_MOD       (err_mach_ipc|err_sub(0))
+#define        MACH_IPC_RCV_MOD        (err_mach_ipc|err_sub(1))
+#define        MACH_IPC_MIG_MOD        (err_mach_ipc|err_sub(2))
+
+#define        IPC_SEND_MOD            (err_ipc|err_sub(0))
+#define        IPC_RCV_MOD             (err_ipc|err_sub(1))
+#define        IPC_MIG_MOD             (err_ipc|err_sub(2))
+
+#define        SERV_NETNAME_MOD        (err_server|err_sub(0))
+#define        SERV_ENV_MOD            (err_server|err_sub(1))
+#define        SERV_EXECD_MOD          (err_server|err_sub(2))
+
+
+#define        NO_SUCH_ERROR           "unknown error code"
+
+struct error_subsystem {
+       char                    * subsys_name;
+       int                     max_code;
+       char                    * * codes;
+};
+
+struct error_system {
+       int                     max_sub;
+       char                    * bad_sub;
+       struct error_subsystem  * subsystem;
+};
+
+extern struct error_system     errors[err_max_system+1];
+
+#define        errlib_count(s)         (sizeof(s)/sizeof(s[0]))
diff --git a/mach.subproj/headers.subproj/mach.h b/mach.subproj/headers.subproj/mach.h
new file mode 100644 (file)
index 0000000..9fa02f3
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+/* 
+ *  Includes all the types that a normal user
+ *  of Mach programs should need
+ */
+
+#ifndef        _MACH_H_
+#define        _MACH_H_
+
+#define __MACH30__
+#define MACH_IPC_FLAVOR UNTYPED
+
+#include <mach/mach_types.h>
+#include <mach/mach_interface.h>
+#include <mach/mach_port.h>
+#include <mach/mach_init.h>
+#include <mach/mach_host.h>
+#include <mach/thread_switch.h>
+/*
+ * Standard prototypes
+ */
+extern void                    panic_init(mach_port_t);
+extern void                    panic(const char *, ...);
+
+extern void                    safe_gets(char *,
+                                         char *,
+                                         int);
+
+extern void                    slot_name(cpu_type_t,
+                                         cpu_subtype_t,
+                                         char **,
+                                         char **);
+
+extern void                    mig_reply_setup(mach_msg_header_t *,
+                                               mach_msg_header_t *);
+
+extern void                    mach_msg_destroy(mach_msg_header_t *);
+
+extern mach_msg_return_t       mach_msg_receive(mach_msg_header_t *);
+
+extern mach_msg_return_t       mach_msg_send(mach_msg_header_t *);
+
+extern mach_msg_return_t       mach_msg_server_once(boolean_t (*)
+                                                    (mach_msg_header_t *,
+                                                     mach_msg_header_t *),
+                                                    mach_msg_size_t,
+                                                    mach_port_t,
+                                                    mach_msg_options_t);
+extern mach_msg_return_t       mach_msg_server(boolean_t (*)
+                                               (mach_msg_header_t *,
+                                                mach_msg_header_t *),
+                                               mach_msg_size_t,
+                                               mach_port_t,
+                                               mach_msg_options_t);
+
+#ifdef MACH_KERNEL
+extern void                    *sbrk(int);
+
+extern int                      brk(void *);
+
+#endif
+/*
+ * Prototypes for compatibility
+ */
+extern kern_return_t   clock_get_res(mach_port_t,
+                                     clock_res_t *);
+extern kern_return_t   clock_set_res(mach_port_t,
+                                     clock_res_t);
+
+extern kern_return_t   clock_sleep(mach_port_t,
+                                   int,
+                                   mach_timespec_t,
+                                   mach_timespec_t *);
+#endif /* _MACH_H_ */
diff --git a/mach.subproj/headers.subproj/mach_error.h b/mach.subproj/headers.subproj/mach_error.h
new file mode 100644 (file)
index 0000000..b60fcf9
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+
+/*
+ *     File:   mach_error.h
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar. 1988
+ *
+ *     Definitions of routines in mach_error.c
+ */
+
+#ifndef        _MACH_ERROR_
+#define        _MACH_ERROR_    1
+
+#include <mach/error.h>
+
+char           *mach_error_string(
+/*
+ *     Returns a string appropriate to the error argument given
+ */
+       mach_error_t error_value
+                               );
+
+void           mach_error(
+/*
+ *     Prints an appropriate message on the standard error stream
+ */
+       char            *str,
+       mach_error_t    error_value
+                               );
+
+char           *mach_error_type(
+/*
+ *     Returns a string with the error system, subsystem and code
+ */
+       mach_error_t    error_value
+                               );
+
+#endif /* _MACH_ERROR_ */
diff --git a/mach.subproj/headers.subproj/mach_init.h b/mach.subproj/headers.subproj/mach_init.h
new file mode 100644 (file)
index 0000000..c9521cf
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987,1986 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+/*
+ *     Items provided by the Mach environment initialization.
+ */
+
+#ifndef        _MACH_INIT_
+#define        _MACH_INIT_     1
+
+#include <mach/mach_types.h>
+#include <stdarg.h>
+
+/*
+ *     Kernel-related ports; how a task/thread controls itself
+ */
+
+extern mach_port_t     mach_task_self_;
+
+extern mach_port_t mach_task_self(void);
+extern mach_port_t mach_host_self(void);
+extern mach_port_t mach_thread_self(void);
+
+#define        mach_task_self() mach_task_self_
+
+#define        current_task()  mach_task_self()
+
+#include <mach/mach_traps.h>
+/*
+ *     Other important ports in the Mach user environment
+ */
+
+extern mach_port_t     bootstrap_port;
+extern mach_port_t     name_server_port;
+extern mach_port_t     environment_port;
+extern mach_port_t     service_port;
+
+/*
+ *     Where these ports occur in the "mach_ports_register"
+ *     collection... only servers or the runtime library need know.
+ */
+
+#define        NAME_SERVER_SLOT        0
+#define        ENVIRONMENT_SLOT        1
+#define SERVICE_SLOT           2
+
+#define        MACH_PORTS_SLOTS_USED   3
+
+/*
+ *     Globally interesting numbers.
+ *     These macros assume vm_page_size is a power-of-2.
+ */
+
+extern vm_size_t       vm_page_size;
+
+#define trunc_page(x)  ((x) & (~(vm_page_size - 1)))
+#define round_page(x)  trunc_page((x) + (vm_page_size - 1))
+
+/*
+ *     fprintf_stderr uses vprintf_stderr_func to produce
+ *     error messages, this can be overridden by a user
+ *     application to point to a user-specified output function
+ */
+
+extern int (*vprintf_stderr_func)(const char *format, va_list ap);
+
+
+#endif /* _MACH_INIT_ */
diff --git a/mach.subproj/headers.subproj/mach_interface.h b/mach.subproj/headers.subproj/mach_interface.h
new file mode 100644 (file)
index 0000000..6373e90
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) Apple Computer 1998
+ * ALL Rights Reserved
+ */
+/*
+ * This file represents the interfaces that used to come
+ * from creating the user headers from the mach.defs file.
+ * Because mach.defs was decomposed, this file now just
+ * wraps up all the new interface headers generated from
+ * each of the new .defs resulting from that decomposition.
+ */
+#ifndef        _MACH_INTERFACE_H_
+#define _MACH_INTERFACE_H_
+
+#include <mach/clock_priv.h>
+#include <mach/host_priv.h>
+#include <mach/host_security.h>
+#include <mach/ledger.h>
+#include <mach/lock_set.h>
+#include <mach/processor.h>
+#include <mach/processor_set.h>
+#include <mach/semaphore.h>
+#include <mach/task.h>
+#include <mach/thread_act.h>
+#include <mach/vm_map.h>
+
+#endif /* _MACH_INTERFACE_H_ */
diff --git a/mach.subproj/headers.subproj/mig_errors.h b/mach.subproj/headers.subproj/mig_errors.h
new file mode 100644 (file)
index 0000000..2344e84
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ */
+
+/*
+ * MkLinux
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+/*
+ * Mach Interface Generator errors
+ *
+ */
+
+#ifndef        _MACH_MIG_ERRORS_H_
+#define _MACH_MIG_ERRORS_H_
+
+#include <mach/kern_return.h>
+#include <mach/message.h>
+#include <mach/rpc.h>
+#include <mach/vm_types.h>
+
+/*
+ *     These error codes should be specified as system 4, subsytem 2.
+ *     But alas backwards compatibility makes that impossible.
+ *     The problem is old clients of new servers (eg, the kernel)
+ *     which get strange large error codes when there is a Mig problem
+ *     in the server.  Unfortunately, the IPC system doesn't have
+ *     the knowledge to convert the codes in this situation.
+ */
+
+#define MIG_TYPE_ERROR         -300    /* client type check failure */
+#define MIG_REPLY_MISMATCH     -301    /* wrong reply message ID */
+#define MIG_REMOTE_ERROR       -302    /* server detected error */
+#define MIG_BAD_ID             -303    /* bad request message ID */
+#define MIG_BAD_ARGUMENTS      -304    /* server type check failure */
+#define MIG_NO_REPLY           -305    /* no reply should be send */
+#define MIG_EXCEPTION          -306    /* server raised exception */
+#define MIG_ARRAY_TOO_LARGE    -307    /* array not large enough */
+#define MIG_SERVER_DIED                -308    /* server died */
+#define MIG_TRAILER_ERROR       -309    /* trailer has an unknown format */
+
+#include <mach/ndr.h>
+
+typedef struct {
+       mach_msg_header_t       Head;
+       NDR_record_t            NDR;
+       kern_return_t           RetCode;
+} mig_reply_error_t;
+
+typedef struct mig_symtab {
+       char    *ms_routine_name;
+       int     ms_routine_number;
+       void    (*ms_routine)(void);    /* Since the functions in the
+                                        * symbol table have unknown
+                                        * signatures, this is the best
+                                        * we can do...
+                                        */
+} mig_symtab_t;
+
+/* Client side reply port allocate */
+extern mach_port_t mig_get_reply_port(void);
+
+/* Client side reply port deallocate */
+extern void mig_dealloc_reply_port(mach_port_t reply_port);
+
+/* Client side reply port "deallocation" */
+extern void mig_put_reply_port(mach_port_t reply_port);
+
+/* Allocate memory for out-of-stack mig structures */
+extern char *mig_user_allocate(vm_size_t size);
+
+/* Deallocate memory used for out-of-stack mig structures */
+extern void mig_user_deallocate(char *data, vm_size_t size);
+
+/* Bounded string copy */
+extern int mig_strncpy(
+       char    *dest,
+       char    *src,
+       int     len);
+
+#endif /* _MACH_MIG_ERRORS_H_ */
diff --git a/mach.subproj/headers.subproj/port_obj.h b/mach.subproj/headers.subproj/port_obj.h
new file mode 100644 (file)
index 0000000..796972c
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/*
+ * Define a service to map from a kernel-generated port name
+ * to server-defined "type" and "value" data to be associated
+ * with the port.
+ */
+
+#ifndef PORT_OBJ_H
+#define PORT_OBJ_H
+
+#include <mach/port.h>
+
+struct port_obj_tentry {
+       void *pos_value;
+       int pos_type;
+};
+
+extern void port_obj_init(int);
+extern struct port_obj_tentry *port_obj_table;
+extern int port_obj_table_size;
+
+#ifndef PORT_OBJ_ASSERT
+
+#define port_set_obj_value_type(pname, value, type)    \
+do {                                                   \
+       int ndx;                                        \
+                                                       \
+       if (!port_obj_table)                            \
+               port_obj_init(port_obj_table_size);     \
+       ndx = MACH_PORT_INDEX(pname);                   \
+       port_obj_table[ndx].pos_value = (value);        \
+       port_obj_table[ndx].pos_type = (type);          \
+} while (0)
+
+#define port_get_obj_value(pname)                      \
+       (port_obj_table[MACH_PORT_INDEX(pname)].pos_value)
+
+#define port_get_obj_type(pname)                       \
+       (port_obj_table[MACH_PORT_INDEX(pname)].pos_type)
+
+#else  /* PORT_OBJ_ASSERT */
+
+#define port_set_obj_value_type(pname, value, type)    \
+do {                                                   \
+       int ndx;                                        \
+                                                       \
+       if (!port_obj_table)                            \
+               port_obj_init(port_obj_table_size);     \
+       ndx = MACH_PORT_INDEX(pname);                   \
+       assert(ndx > 0);                                \
+       assert(ndx < port_obj_table_size);              \
+       port_obj_table[ndx].pos_value = (value);        \
+       port_obj_table[ndx].pos_type = (type);          \
+} while (0)
+
+#define port_get_obj_value(pname)                              \
+       ((MACH_PORT_INDEX(pname) < (unsigned)port_obj_table_size) ?     \
+       port_obj_table[MACH_PORT_INDEX(pname)].pos_value :      \
+       (panic("port_get_obj_value: index too big"), (void *)-1))
+
+#define port_get_obj_type(pname)                               \
+       ((MACH_PORT_INDEX(pname) < (unsigned)port_obj_table_size) ?     \
+       port_obj_table[MACH_PORT_INDEX(pname)].pos_type :       \
+       (panic("port_get_obj_type: index too big"), -1))
+
+#endif /* PORT_OBJ_ASSERT */
+
+#endif /* PORT_OBJ_H */
diff --git a/mach.subproj/headers.subproj/sync.h b/mach.subproj/headers.subproj/sync.h
new file mode 100644 (file)
index 0000000..e327d10
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+** This file contains compatibilty wrapper header for things that used
+** to be generated from mach/sync.defs.  Now that code is split into two
+** different interface generator files, so include the two resulting
+** headers here.
+*/
+#include <mach/semaphore.h>
+#include <mach/lock_set.h>
diff --git a/mach.subproj/headers.subproj/vm_task.h b/mach.subproj/headers.subproj/vm_task.h
new file mode 100644 (file)
index 0000000..8ae7856
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+** This file contains compatibilty wrapper header for things that are
+** generated from mach/vm_map.defs into mach/vm_map.h. 
+** 
+** This file will go away eventually - please switch.
+*/
+#include <mach/vm_map.h>
diff --git a/mach.subproj/host_priv.defs b/mach.subproj/host_priv.defs
new file mode 100644 (file)
index 0000000..060900d
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/host_priv.defs>
diff --git a/mach.subproj/host_security.defs b/mach.subproj/host_security.defs
new file mode 100644 (file)
index 0000000..96999e5
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/host_security.defs>
diff --git a/mach.subproj/ledger.defs b/mach.subproj/ledger.defs
new file mode 100644 (file)
index 0000000..c7e9270
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/ledger.defs>
diff --git a/mach.subproj/lock_set.defs b/mach.subproj/lock_set.defs
new file mode 100644 (file)
index 0000000..c62bb42
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/lock_set.defs>
diff --git a/mach.subproj/mach_absolute_time.c b/mach.subproj/mach_absolute_time.c
new file mode 100644 (file)
index 0000000..04491ef
--- /dev/null
@@ -0,0 +1,19 @@
+#include <stdint.h>
+#include <mach/clock.h>
+
+extern mach_port_t clock_port;
+
+uint64_t mach_absolute_time(void) {
+#if defined(__ppc__)
+       __asm__ volatile("0: mftbu r3");
+       __asm__ volatile("mftb r4");
+       __asm__ volatile("mftbu r0");
+       __asm__ volatile("cmpw r0,r3");
+       __asm__ volatile("bne- 0b");
+#else
+       mach_timespec_t now;
+       (void)clock_get_time(clock_port, &now);
+       return (uint64_t)now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
+#endif
+}
+
diff --git a/mach.subproj/mach_error.c b/mach.subproj/mach_error.c
new file mode 100644 (file)
index 0000000..df35b48
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+/*
+ *     File:   mach_error.c
+ *     Author: Douglas Orr, Carnegie Mellon University
+ *     Date:   Mar 1988
+ *
+ *      interprets structured mach error codes and prints
+ *      or returns a descriptive string.
+ */
+
+#include <stdio.h>
+#include <mach/mach_error.h>
+#include <mach/boolean.h>
+#include "externs.h"
+
+void
+mach_error( str, err ) 
+       char    *str;
+       mach_error_t            err;
+{
+       char * err_str;
+       char buf[1024];
+       boolean_t diag;
+
+       err_str=mach_error_string_int(err, &diag);
+
+       if ( diag ) {
+               sprintf( buf, "%s %s (%x)", mach_error_type(err), err_str, err );
+               err_str = buf;
+       }
+
+       fprintf_stderr("%s %s\n", str, err_str);
+}
diff --git a/mach.subproj/mach_error_string.c b/mach.subproj/mach_error_string.c
new file mode 100644 (file)
index 0000000..846d2b8
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/boolean.h>
+#include <mach/error.h>
+#include <mach/mach_error.h>
+#include <mach/errorlib.h>
+#include "externs.h"
+
+static void do_compat(mach_error_t *);
+
+static void
+do_compat(mach_error_t *org_err)
+{
+       mach_error_t            err = *org_err;
+
+       /* 
+        * map old error numbers to 
+        * to new error sys & subsystem 
+        */
+
+       if ((-200 < err) && (err <= -100))
+               err = -(err + 100) | IPC_SEND_MOD;
+       else if ((-300 < err) && (err <= -200))
+               err = -(err + 200) | IPC_RCV_MOD;
+       else if ((-400 < err) && (err <= -300))
+               err = -(err + 300) | MACH_IPC_MIG_MOD;
+       else if ((1000 <= err) && (err < 1100))
+               err = (err - 1000) | SERV_NETNAME_MOD;
+       else if ((1600 <= err) && (err < 1700))
+               err = (err - 1600) | SERV_ENV_MOD;
+       else if ((27600 <= err) && (err < 27700))
+               err = (err - 27600) | SERV_EXECD_MOD;
+
+       *org_err = err;
+}
+
+char *
+mach_error_type(mach_error_t err)
+{
+       int sub, system;
+
+       do_compat( &err );
+
+       sub = err_get_sub(err);
+       system = err_get_system(err);
+
+       if (system > err_max_system || sub >= errors[system].max_sub)
+           return((char *)"(?/?)");
+       return(errors[system].subsystem[sub].subsys_name);
+}
+
+boolean_t mach_error_full_diag = FALSE;
+
+char *
+mach_error_string_int(mach_error_t err, boolean_t *diag)
+{
+       int sub, system, code;
+
+       do_compat( &err );
+
+       sub = err_get_sub(err);
+       system = err_get_system(err);
+       code = err_get_code(err);
+
+       *diag = TRUE;
+
+       if (system > err_max_system)
+           return((char *)"(?/?) unknown error system");
+       if (sub >= errors[system].max_sub)
+           return(errors[system].bad_sub);
+       if (code >= errors[system].subsystem[sub].max_code)
+           return ((char *)NO_SUCH_ERROR);
+
+       *diag = mach_error_full_diag;
+       return( errors[system].subsystem[sub].codes[code] );
+}
+
+char *
+mach_error_string(mach_error_t err)
+{
+       boolean_t diag;
+
+       return mach_error_string_int( err, &diag );
+
+}
diff --git a/mach.subproj/mach_host.defs b/mach.subproj/mach_host.defs
new file mode 100644 (file)
index 0000000..e3d6c22
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <mach/mach_host.defs>
diff --git a/mach.subproj/mach_init.c b/mach.subproj/mach_init.c
new file mode 100644 (file)
index 0000000..6fac3a0
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include <mach/boolean.h>
+#include <mach/machine/ndr_def.h>
+#include <mach/mach_traps.h>
+#include <mach/mach_host.h>
+#include <mach/mach_init.h>
+#include "externs.h"
+
+mach_port_t    mach_task_self_ = MACH_PORT_NULL;
+mach_port_t     mach_host_self_ = MACH_PORT_NULL;
+kern_return_t  _host_semaphore_traps_return_ = KERN_SUCCESS;
+
+vm_size_t      vm_page_size;
+
+/*
+ * Forward internal declarations for automatic mach_init during
+ * fork() implementation.
+ */
+/* fork() calls through atfork_child_routine */
+void (*_atfork_child_routine)(void);
+
+static void mach_atfork_child_routine(void);
+static boolean_t first = TRUE;
+static void (*previous_atfork_child_routine)(void);
+extern int mach_init(void);
+extern void _pthread_set_self(void *);
+extern void cthread_set_self(void *);
+
+
+static void mach_atfork_child_routine(void)
+{
+       /*
+        * If an (*_atfork_child_routine)() was registered when
+        * mach_init was first called, then call that routine
+        * prior to performing our re-initialization. This ensures
+        * that the post-fork handlers are called in exactly the
+        * same order as the crt0 (exec) handlers. Any library 
+        * that makes use of the _atfork_child_routine must follow
+        * the same technique.
+        */
+       if (previous_atfork_child_routine) {
+               (*previous_atfork_child_routine)();
+       }
+       mach_init();
+}
+
+mach_port_t
+mach_host_self()
+{
+        return(host_self_trap());
+}
+
+int mach_init_doit(int forkchild)
+{
+       mach_msg_type_number_t host_info_size = 0;
+
+       /*
+        *      Get the important ports into the cached values,
+        *      as required by "mach_init.h".
+        */
+        
+       mach_task_self_ = task_self_trap();
+       mach_host_self_ = host_self_trap();
+
+
+       if (!forkchild) {
+               /*
+                * Set up the post-fork child handler in the libc stub
+                * to invoke this routine if this process forks. Save the
+                * previous value in order that we can call that handler
+                * prior to performing our postfork work.
+                */
+            
+               first = FALSE;
+               previous_atfork_child_routine = _atfork_child_routine;
+               _atfork_child_routine = mach_atfork_child_routine;
+                _pthread_set_self(0);
+                cthread_set_self(0);
+       }
+
+       /*
+        *      Initialize the single mig reply port
+        */
+
+       mig_init(0);
+
+       /*
+        *      Cache some other valuable system constants
+        */
+        _host_semaphore_traps_return_ = host_info(mach_host_self_,
+                                           HOST_SEMAPHORE_TRAPS,
+                                           0,
+                                           &host_info_size);
+
+       (void)host_page_size(mach_host_self_, &vm_page_size);
+
+       mach_init_ports();
+
+#if WE_REALLY_NEED_THIS_GDB_HACK
+       /*
+        * Check to see if GDB wants us to stop
+        */
+       {
+         task_user_data_data_t user_data;
+         mach_msg_type_number_t        user_data_count = TASK_USER_DATA_COUNT;
+         
+       user_data.user_data = 0;
+       (void)task_info(mach_task_self_, TASK_USER_DATA,
+               (task_info_t)&user_data, &user_data_count);
+#define MACH_GDB_RUN_MAGIC_NUMBER 1
+#ifdef MACH_GDB_RUN_MAGIC_NUMBER       
+         /* This magic number is set in mach-aware gdb 
+          *  for RUN command to allow us to suspend user's
+          *  executable (linked with this libmach!) 
+          *  with the code below.
+       * This hack should disappear when gdb improves.
+       */
+       if ((int)user_data.user_data == MACH_GDB_RUN_MAGIC_NUMBER) {
+           kern_return_t ret;
+           user_data.user_data = 0;
+           
+           ret = task_suspend (mach_task_self_);
+           if (ret != KERN_SUCCESS) {
+               while(1) (void)task_terminate(mach_task_self_);
+           }
+       }
+#undef MACH_GDB_RUN_MAGIC_NUMBER  
+#endif /* MACH_GDB_RUN_MAGIC_NUMBER */
+       }
+#endif /* WE_REALLY_NEED_THIS_GDB_HACK */
+
+       /*
+         * Reserve page 0 so that the program doesn't get it as
+        * the result of a vm_allocate() or whatever.
+        */
+       {
+               vm_offset_t zero_page_start;
+
+               zero_page_start = 0;
+               (void)vm_map(mach_task_self_, &zero_page_start, vm_page_size,
+                            0, FALSE, MEMORY_OBJECT_NULL, 0, TRUE,
+                            VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_COPY);
+               /* ignore result, we don't care if it failed */
+       }
+       return(0);
+}
+
+int mach_init(void)
+{
+        return(mach_init_doit(0));
+}
+
+int    (*mach_init_routine)(void) = mach_init;
+int fork_mach_init()
+{
+       /* called only from child */
+       return(mach_init_doit(1));
+}
+
+#undef mach_task_self
+
+mach_port_t
+mach_task_self()
+{
+       return(mach_task_self_);
+}
+
+mach_port_t
+mach_thread_self()
+{
+       return(thread_self_trap());
+}
\ No newline at end of file
diff --git a/mach.subproj/mach_init_ports.c b/mach.subproj/mach_init_ports.c
new file mode 100644 (file)
index 0000000..8853ef7
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include "externs.h"
+
+mach_port_t    bootstrap_port = MACH_PORT_NULL;
+mach_port_t    name_server_port = MACH_PORT_NULL;
+mach_port_t    environment_port = MACH_PORT_NULL;
+mach_port_t    service_port = MACH_PORT_NULL;
+mach_port_t    clock_port = MACH_PORT_NULL;
+mach_port_t thread_recycle_port = MACH_PORT_NULL;
+
+void
+mach_init_ports(void)
+{
+       mach_port_array_t       ports;
+       mach_msg_type_number_t  ports_count;
+       kern_return_t           kr;
+
+       /*
+        *      Find those ports important to every task.
+        */
+       kr = task_get_special_port(mach_task_self(),
+                                  TASK_BOOTSTRAP_PORT,
+                                  &bootstrap_port);
+       if (kr != KERN_SUCCESS)
+           return;
+
+       kr = mach_ports_lookup(mach_task_self(), &ports,
+                              &ports_count);
+       if ((kr != KERN_SUCCESS) ||
+           (ports_count < MACH_PORTS_SLOTS_USED))
+           return;
+
+       name_server_port = ports[NAME_SERVER_SLOT];
+       environment_port = ports[ENVIRONMENT_SLOT];
+       service_port     = ports[SERVICE_SLOT];
+
+       /* get rid of out-of-line data so brk has a chance of working */
+
+       (void) vm_deallocate(mach_task_self(),
+                            (vm_offset_t) ports,
+                            (vm_size_t) (ports_count * sizeof *ports));
+
+        /* Get the clock service port for nanosleep */
+        kr = host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &clock_port);
+        if (kr != KERN_SUCCESS) {
+            abort();
+        }
+        kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &thread_recycle_port);
+        if (kr != KERN_SUCCESS) {
+            abort();
+        }
+        kr = mach_port_insert_right(mach_task_self(), thread_recycle_port, thread_recycle_port, MACH_MSG_TYPE_MAKE_SEND);
+        if (kr != KERN_SUCCESS) {
+            abort();
+        }
+}
+
+#ifdef notdef
+/* will have problems with dylib build --> not needed anyway */
+#ifndef        lint
+/*
+ *     Routines which our library must suck in, to avoid
+ *     a later library from referencing them and getting
+ *     the wrong version.
+ */
+extern void _replacements(void);
+
+void
+_replacements(void)
+{
+       (void)sbrk(0);                  /* Pull in our sbrk/brk */
+       (void)malloc(0);                /* Pull in our malloc package */
+}
+#endif /* lint */
+#endif /* notdef */
diff --git a/mach.subproj/mach_msg.c b/mach.subproj/mach_msg.c
new file mode 100644 (file)
index 0000000..d7a1d92
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/port.h>
+#include <mach/message.h>
+
+#define LIBMACH_OPTIONS        (MACH_SEND_INTERRUPT|MACH_RCV_INTERRUPT)
+
+mach_msg_return_t
+mach_msg(msg, option, send_size, rcv_size, rcv_name, timeout, notify)
+       mach_msg_header_t *msg;
+       mach_msg_option_t option;
+       mach_msg_size_t send_size;
+       mach_msg_size_t rcv_size;
+       mach_port_t rcv_name;
+       mach_msg_timeout_t timeout;
+       mach_port_t notify;
+{
+       mach_msg_return_t mr;
+
+       /*
+        * Consider the following cases:
+        *      1) Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
+        *      plus special bits).
+        *      2) Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
+        *      3) RPC calls with interruptions in one/both halves.
+        *
+        * We refrain from passing the option bits that we implement
+        * to the kernel.  This prevents their presence from inhibiting
+        * the kernel's fast paths (when it checks the option value).
+        */
+
+       mr = mach_msg_overwrite_trap(msg, option &~ LIBMACH_OPTIONS,
+                          send_size, rcv_size, rcv_name,
+                          timeout, notify, MACH_MSG_NULL, 0);
+       if (mr == MACH_MSG_SUCCESS)
+               return MACH_MSG_SUCCESS;
+
+       if ((option & MACH_SEND_INTERRUPT) == 0)
+               while (mr == MACH_SEND_INTERRUPTED)
+                       mr = mach_msg_overwrite_trap(msg,
+                               option &~ LIBMACH_OPTIONS,
+                               send_size, rcv_size, rcv_name,
+                               timeout, notify, MACH_MSG_NULL, 0);
+
+       if ((option & MACH_RCV_INTERRUPT) == 0)
+               while (mr == MACH_RCV_INTERRUPTED)
+                       mr = mach_msg_overwrite_trap(msg,
+                               option &~ (LIBMACH_OPTIONS|MACH_SEND_MSG),
+                               0, rcv_size, rcv_name,
+                               timeout, notify, MACH_MSG_NULL, 0);
+
+       return mr;
+}
+
+mach_msg_return_t
+mach_msg_overwrite(msg, option, send_size, rcv_limit, rcv_name, timeout, 
+                  notify, rcv_msg, rcv_msg_size)
+       mach_msg_header_t *msg;
+       mach_msg_option_t option;
+       mach_msg_size_t send_size;
+       mach_msg_size_t rcv_limit;
+       mach_port_t rcv_name;
+       mach_msg_timeout_t timeout;
+       mach_port_t notify;
+       mach_msg_header_t *rcv_msg;
+       mach_msg_size_t rcv_msg_size;
+{
+       mach_msg_return_t mr;
+
+       /*
+        * Consider the following cases:
+        *      1) Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
+        *      plus special bits).
+        *      2) Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
+        *      3) RPC calls with interruptions in one/both halves.
+        *
+        * We refrain from passing the option bits that we implement
+        * to the kernel.  This prevents their presence from inhibiting
+        * the kernel's fast paths (when it checks the option value).
+        */
+
+       mr = mach_msg_overwrite_trap(msg, option &~ LIBMACH_OPTIONS,
+                          send_size, rcv_limit, rcv_name,
+                          timeout, notify, rcv_msg, rcv_msg_size);
+       if (mr == MACH_MSG_SUCCESS)
+               return MACH_MSG_SUCCESS;
+
+       if ((option & MACH_SEND_INTERRUPT) == 0)
+               while (mr == MACH_SEND_INTERRUPTED)
+                       mr = mach_msg_overwrite_trap(msg,
+                               option &~ LIBMACH_OPTIONS,
+                               send_size, rcv_limit, rcv_name,
+                               timeout, notify, rcv_msg, rcv_msg_size);
+
+       if ((option & MACH_RCV_INTERRUPT) == 0)
+               while (mr == MACH_RCV_INTERRUPTED)
+                       mr = mach_msg_overwrite_trap(msg,
+                               option &~ (LIBMACH_OPTIONS|MACH_SEND_MSG),
+                               0, rcv_limit, rcv_name,
+                               timeout, notify, rcv_msg, rcv_msg_size);
+
+       return mr;
+}
diff --git a/mach.subproj/mach_msg_destroy.c b/mach.subproj/mach_msg_destroy.c
new file mode 100644 (file)
index 0000000..008ee99
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include <mach/message.h>
+#include <mach/mach_init.h>
+
+static void mach_msg_destroy_port(mach_port_t, mach_msg_type_name_t);
+static void mach_msg_destroy_memory(vm_offset_t, vm_size_t);
+
+/*
+ *     Routine:        mach_msg_destroy
+ *     Purpose:
+ *             mach_msg_destroy is useful in two contexts.
+ *
+ *             First, it can deallocate all port rights and
+ *             out-of-line memory in a received message.
+ *             When a server receives a request it doesn't want,
+ *             it needs this functionality.
+ *
+ *             Second, it can mimic the side-effects of a msg-send
+ *             operation.  The effect is as if the message were sent
+ *             and then destroyed inside the kernel.  When a server
+ *             can't send a reply (because the client died),
+ *             it needs this functionality.
+ */
+void
+mach_msg_destroy(mach_msg_header_t *msg)
+{
+    mach_msg_bits_t mbits = msg->msgh_bits;
+
+    /*
+     * The msgh_local_port field doesn't hold a port right.
+     * The receive operation consumes the destination port right.
+     */
+
+    mach_msg_destroy_port(msg->msgh_remote_port, MACH_MSGH_BITS_REMOTE(mbits));
+
+    if (mbits & MACH_MSGH_BITS_COMPLEX) {
+       mach_msg_body_t         *body;
+       mach_msg_descriptor_t   *saddr, *eaddr;
+       
+       body = (mach_msg_body_t *) (msg + 1);
+       saddr = (mach_msg_descriptor_t *) 
+                       ((mach_msg_base_t *) msg + 1);
+       eaddr =  saddr + body->msgh_descriptor_count;
+
+       for  ( ; saddr < eaddr; saddr++) {
+           switch (saddr->type.type) {
+           
+               case MACH_MSG_PORT_DESCRIPTOR: {
+                   mach_msg_port_descriptor_t *dsc;
+
+                   /* 
+                    * Destroy port rights carried in the message 
+                    */
+                   dsc = &saddr->port;
+                   mach_msg_destroy_port(dsc->name, dsc->disposition);         
+                   break;
+               }
+
+               case MACH_MSG_OOL_DESCRIPTOR : {
+                   mach_msg_ool_descriptor_t *dsc;
+
+                   /* 
+                    * Destroy memory carried in the message 
+                    */
+                   dsc = &saddr->out_of_line;
+                   if (dsc->deallocate) {
+                       mach_msg_destroy_memory((vm_offset_t)dsc->address,
+                                               dsc->size);
+                   }
+                   break;
+               }
+
+               case MACH_MSG_OOL_PORTS_DESCRIPTOR : {
+                   mach_port_t                         *ports;
+                   mach_msg_ool_ports_descriptor_t     *dsc;
+                   mach_msg_type_number_t              j;
+
+                   /*
+                    * Destroy port rights carried in the message 
+                    */
+                   dsc = &saddr->ool_ports;
+                   ports = (mach_port_t *) dsc->address;
+                   for (j = 0; j < dsc->count; j++, ports++)  {
+                       mach_msg_destroy_port(*ports, dsc->disposition);
+                   }
+
+                   /* 
+                    * Destroy memory carried in the message 
+                    */
+                   if (dsc->deallocate) {
+                       mach_msg_destroy_memory((vm_offset_t)dsc->address, 
+                                       dsc->count * sizeof(mach_port_t));
+                   }
+                   break;
+               }
+           }
+       }
+    }
+}
+
+static void
+mach_msg_destroy_port(mach_port_t port, mach_msg_type_name_t type)
+{
+    if (MACH_PORT_VALID(port)) switch (type) {
+      case MACH_MSG_TYPE_MOVE_SEND:
+      case MACH_MSG_TYPE_MOVE_SEND_ONCE:
+       /* destroy the send/send-once right */
+       (void) mach_port_deallocate(mach_task_self(), port);
+       break;
+
+      case MACH_MSG_TYPE_MOVE_RECEIVE:
+       /* destroy the receive right */
+       (void) mach_port_mod_refs(mach_task_self(), port,
+                                 MACH_PORT_RIGHT_RECEIVE, -1);
+       break;
+
+      case MACH_MSG_TYPE_MAKE_SEND:
+       /* create a send right and then destroy it */
+       (void) mach_port_insert_right(mach_task_self(), port,
+                                     port, MACH_MSG_TYPE_MAKE_SEND);
+       (void) mach_port_deallocate(mach_task_self(), port);
+       break;
+
+      case MACH_MSG_TYPE_MAKE_SEND_ONCE:
+       /* create a send-once right and then destroy it */
+       (void) mach_port_extract_right(mach_task_self(), port,
+                                      MACH_MSG_TYPE_MAKE_SEND_ONCE,
+                                      &port, &type);
+       (void) mach_port_deallocate(mach_task_self(), port);
+       break;
+    }
+}
+
+static void
+mach_msg_destroy_memory(vm_offset_t addr, vm_size_t size)
+{
+    if (size != 0)
+       (void) vm_deallocate(mach_task_self(), addr, size);
+}
diff --git a/mach.subproj/mach_msg_receive.c b/mach.subproj/mach_msg_receive.c
new file mode 100644 (file)
index 0000000..8d7f260
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include <mach/message.h>
+
+mach_msg_return_t
+mach_msg_receive(mach_msg_header_t *msg)
+{
+       return mach_msg(msg, MACH_RCV_MSG,
+                       0, msg->msgh_size, msg->msgh_local_port,
+                       MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+}
diff --git a/mach.subproj/mach_msg_send.c b/mach.subproj/mach_msg_send.c
new file mode 100644 (file)
index 0000000..80180dd
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include <mach/message.h>
+
+mach_msg_return_t
+mach_msg_send(mach_msg_header_t *msg)
+{
+       return mach_msg(msg, MACH_SEND_MSG,
+                       msg->msgh_size, 0, MACH_PORT_NULL,
+                       MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+}
diff --git a/mach.subproj/mach_msg_server.c b/mach.subproj/mach_msg_server.c
new file mode 100644 (file)
index 0000000..4144c7a
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <stdlib.h>
+#include <mach/mach.h>
+#include <mach/boolean.h>
+#include <mach/kern_return.h>
+#include <mach/message.h>
+#include <mach/mig_errors.h>
+#include <mach/vm_statistics.h>
+
+/*
+ *     Routine:        mach_msg_server_once
+ *     Purpose:
+ *             A simple generic server function.  It allows more flexibility
+ *             than mach_msg_server by processing only one message request
+ *             and then returning to the user.  Note that more in the way
+ *             of error codes are returned to the user; specifically, any
+ *             failing error from mach_msg_overwrite_trap will be returned
+ *             (though errors from the demux routine or the routine it calls
+ *             will not be).
+ */
+mach_msg_return_t
+mach_msg_server_once(
+    boolean_t (*demux)(mach_msg_header_t *, mach_msg_header_t *),
+    mach_msg_size_t max_size,
+    mach_port_t rcv_name,
+    mach_msg_options_t options)
+{
+    mig_reply_error_t *bufRequest = 0, *bufReply = 0, *bufTemp;
+    register mach_msg_return_t mr;
+    register kern_return_t kr;
+
+    if ((kr = vm_allocate(mach_task_self(),
+                    (vm_address_t *)&bufRequest,
+                    max_size + MAX_TRAILER_SIZE,
+                    VM_MAKE_TAG(VM_MEMORY_MACH_MSG)|TRUE)) != KERN_SUCCESS)
+      return kr;    
+    if ((kr = vm_allocate(mach_task_self(),
+                    (vm_address_t *)&bufReply,
+                    max_size + MAX_TRAILER_SIZE,
+                    VM_MAKE_TAG(VM_MEMORY_MACH_MSG)|TRUE)) != KERN_SUCCESS)
+      return kr;    
+
+    mr = mach_msg_overwrite_trap(&bufRequest->Head, MACH_RCV_MSG|options,
+                                0, max_size, rcv_name,
+                                MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL,
+                                (mach_msg_header_t *) 0, 0);
+    if (mr == MACH_MSG_SUCCESS) {
+       /* we have a request message */
+
+       (void) (*demux)(&bufRequest->Head, &bufReply->Head);
+
+       if (!(bufReply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) &&
+           bufReply->RetCode != KERN_SUCCESS) {
+           if (bufReply->RetCode == MIG_NO_REPLY)
+               /*
+                * This return code is a little tricky--
+                * it appears that the demux routine found an
+                * error of some sort, but since that error
+                * would not normally get returned either to
+                * the local user or the remote one, we pretend it's
+                * ok.
+                */
+               return KERN_SUCCESS;
+
+           /* don't destroy the reply port right,
+              so we can send an error message */
+           bufRequest->Head.msgh_remote_port = MACH_PORT_NULL;
+           mach_msg_destroy(&bufRequest->Head);
+       }
+
+       if (bufReply->Head.msgh_remote_port == MACH_PORT_NULL) {
+           /* no reply port, so destroy the reply */
+           if (bufReply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)
+               mach_msg_destroy(&bufReply->Head);
+
+           return KERN_SUCCESS;
+       }
+
+       /* send reply.  */
+
+       bufTemp = bufRequest;
+       bufRequest = bufReply;
+       bufReply = bufTemp;
+
+       /*
+        *      We don't want to block indefinitely because the client
+        *      isn't receiving messages from the reply port.
+        *      If we have a send-once right for the reply port, then
+        *      this isn't a concern because the send won't block.
+        *      If we have a send right, we need to use MACH_SEND_TIMEOUT.
+        *      To avoid falling off the kernel's fast RPC path unnecessarily,
+        *      we only supply MACH_SEND_TIMEOUT when absolutely necessary.
+        */
+
+       mr = mach_msg_overwrite_trap(&bufRequest->Head,
+                        (MACH_MSGH_BITS_REMOTE(bufRequest->Head.msgh_bits) ==
+                         MACH_MSG_TYPE_MOVE_SEND_ONCE) ?
+                        MACH_SEND_MSG|options :
+                        MACH_SEND_MSG|MACH_SEND_TIMEOUT|options,
+                        bufRequest->Head.msgh_size, 0, MACH_PORT_NULL,
+                        0, MACH_PORT_NULL, (mach_msg_header_t *) 0, 0);
+    }
+    /* Has a message error occurred? */
+
+    switch (mr) {
+      case MACH_SEND_INVALID_DEST:
+      case MACH_SEND_TIMED_OUT:
+       /* the reply can't be delivered, so destroy it */
+       mach_msg_destroy(&bufRequest->Head);
+       return KERN_SUCCESS;    /* Matches error hiding behavior in
+                                  mach_msg_server.  */
+
+      case MACH_RCV_TOO_LARGE:
+       return KERN_SUCCESS;    /* Matches error hiding behavior in
+                                  mach_msg_server.  */
+
+      default:
+       /* Includes success case.  */
+       (void)vm_deallocate(mach_task_self(),
+                           (vm_address_t) bufRequest,
+                           max_size + MAX_TRAILER_SIZE);
+       (void)vm_deallocate(mach_task_self(),
+                           (vm_address_t) bufReply,
+                           max_size + MAX_TRAILER_SIZE);
+       return mr;
+    }
+}
+
+/*
+ *     Routine:        mach_msg_server
+ *     Purpose:
+ *             A simple generic server function.  Note that changes here
+ *             should be considered for duplication above.
+ */
+mach_msg_return_t
+mach_msg_server(
+    boolean_t (*demux)(mach_msg_header_t *, mach_msg_header_t *),
+    mach_msg_size_t max_size,
+    mach_port_t rcv_name,
+    mach_msg_options_t options)
+{
+    mig_reply_error_t *bufRequest = 0, *bufReply = 0, *bufTemp;
+    register mach_msg_return_t mr;
+    register kern_return_t kr;
+
+    if ((kr = vm_allocate(mach_task_self(),
+                    (vm_address_t *)&bufRequest,
+                    max_size + MAX_TRAILER_SIZE,
+                    VM_MAKE_TAG(VM_MEMORY_MACH_MSG)|TRUE)) != KERN_SUCCESS)
+      return kr;    
+    if ((kr = vm_allocate(mach_task_self(),
+                    (vm_address_t *)&bufReply,
+                    max_size + MAX_TRAILER_SIZE,
+                    VM_MAKE_TAG(VM_MEMORY_MACH_MSG)|TRUE)) != KERN_SUCCESS)
+      return kr;    
+
+    for (;;) {
+      get_request:
+       mr = mach_msg_overwrite_trap(&bufRequest->Head, MACH_RCV_MSG|options,
+                     0, max_size, rcv_name,
+                     MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL,
+                     (mach_msg_header_t *) 0, 0);
+       while (mr == MACH_MSG_SUCCESS) {
+           /* we have a request message */
+
+           (void) (*demux)(&bufRequest->Head, &bufReply->Head);
+
+           if (!(bufReply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) &&
+               bufReply->RetCode != KERN_SUCCESS) {
+                   if (bufReply->RetCode == MIG_NO_REPLY)
+                       goto get_request;
+
+                   /* don't destroy the reply port right,
+                       so we can send an error message */
+                   bufRequest->Head.msgh_remote_port = MACH_PORT_NULL;
+                   mach_msg_destroy(&bufRequest->Head);
+           }
+
+           if (bufReply->Head.msgh_remote_port == MACH_PORT_NULL) {
+               /* no reply port, so destroy the reply */
+               if (bufReply->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)
+                   mach_msg_destroy(&bufReply->Head);
+
+               goto get_request;
+           }
+
+           /* send reply and get next request */
+
+           bufTemp = bufRequest;
+           bufRequest = bufReply;
+           bufReply = bufTemp;
+
+           /*
+            *  We don't want to block indefinitely because the client
+            *  isn't receiving messages from the reply port.
+            *  If we have a send-once right for the reply port, then
+            *  this isn't a concern because the send won't block.
+            *  If we have a send right, we need to use MACH_SEND_TIMEOUT.
+            *  To avoid falling off the kernel's fast RPC path unnecessarily,
+            *  we only supply MACH_SEND_TIMEOUT when absolutely necessary.
+            */
+
+           mr = mach_msg_overwrite_trap(&bufRequest->Head,
+                         (MACH_MSGH_BITS_REMOTE(bufRequest->Head.msgh_bits) ==
+                                               MACH_MSG_TYPE_MOVE_SEND_ONCE) ?
+                         MACH_SEND_MSG|MACH_RCV_MSG|options :
+                         MACH_SEND_MSG|MACH_SEND_TIMEOUT|MACH_RCV_MSG|options,
+                         bufRequest->Head.msgh_size, max_size, rcv_name,
+                         0, MACH_PORT_NULL, (mach_msg_header_t *) 0, 0);
+       }
+
+       /* a message error occurred */
+
+       switch (mr) {
+         case MACH_SEND_INVALID_DEST:
+         case MACH_SEND_TIMED_OUT:
+           /* the reply can't be delivered, so destroy it */
+           mach_msg_destroy(&bufRequest->Head);
+           break;
+
+         case MACH_RCV_TOO_LARGE:
+           /* the kernel destroyed the request */
+           break;
+
+         default:
+           /* should only happen if the server is buggy */
+           (void)vm_deallocate(mach_task_self(),
+                               (vm_address_t) bufRequest,
+                               max_size + MAX_TRAILER_SIZE);
+           (void)vm_deallocate(mach_task_self(),
+                               (vm_address_t) bufReply,
+                               max_size + MAX_TRAILER_SIZE);
+           return mr;
+       }
+    }
+}
diff --git a/mach.subproj/mach_port.defs b/mach.subproj/mach_port.defs
new file mode 100644 (file)
index 0000000..935d58f
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <mach/mach_port.defs>
diff --git a/mach.subproj/mach_subsystem_join.c b/mach.subproj/mach_subsystem_join.c
new file mode 100644 (file)
index 0000000..a22504a
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+#include <string.h>    /* To get NULL */
+#include <mach/boolean.h>
+#include <mach/kern_return.h>
+#include <mach/rpc.h>
+
+#if    0
+#      include <stdio.h>
+#      define debug(x) printf x
+#else
+#      define debug(x)
+#endif
+
+/*
+ *     Routine:        mach_subsystem_join
+ *     Purpose:
+ *             Create a new subsystem, suitable for registering with
+ *             mach_subsystem_create, that consists of the union of
+ *             the routines of subsys_1 and subsys_2.
+ *
+ *     Warning:
+ *             If there is a big gap between the routine numbers of
+ *             the two subsystems, a correspondingly large amount of
+ *             space will be wasted in the new subsystem.
+ */
+rpc_subsystem_t
+mach_subsystem_join(rpc_subsystem_t subsys_1,  /* First input subsystem */
+                   rpc_subsystem_t subsys_2,   /* Second input subsystem */
+                   unsigned int *num_bytes_p,  /* Size of output subsystem */
+                   void *(*malloc_func)(int)   /* Allocation routine to use */
+               )
+{
+       rpc_subsystem_t                 sp, subsys_new;
+       int                             num_routines, num_args, num_bytes;
+       int                             i, j;
+       struct routine_arg_descriptor   *ap;
+       struct routine_descriptor       *rp;
+
+       /* Make sure the two routine number ranges do not overlap:
+        */
+       if (subsys_1->start <= subsys_2->start && subsys_1->end > subsys_2->start
+                                       ||
+           subsys_2->start <= subsys_1->start && subsys_2->end > subsys_1->start)
+               return NULL;
+
+       /* Arrange that subsys_1 is the subsystem with the lower numbered
+        * routines:
+        */
+       if (subsys_2->start < subsys_1->start ||
+                                       subsys_2->end < subsys_1->end) {
+               /* Exchange the two input subsystem pointers: */
+               sp = subsys_2; subsys_2 = subsys_1; subsys_1 = sp;
+       }
+
+       debug(("subys_join: Lower subsys: (%d, %d); Higher subsys: (%d, %d)\n",
+               subsys_1->start, subsys_1->end, subsys_2->start, subsys_2->end));
+
+       /*
+        * Calculate size needed for new subsystem and allocate it:
+        */
+       num_args = 0;
+       sp = subsys_1;
+       do {
+               int     nr;
+
+               nr = sp->end - sp->start;
+               num_routines += nr;
+
+               for (rp = &sp->routine[0]; rp < &sp->routine[nr]; rp++) {
+                       /* Make sure this routine is non-null: */
+                       if (rp->impl_routine != NULL)
+                               num_args += rp->descr_count;
+               }
+               if (sp == subsys_2)
+                       break;
+               sp = subsys_2;
+       } while (1);
+       num_routines = subsys_2->end - subsys_1->start;
+
+       /* A struct rpc_subsystem, which is just a template for a real
+        * subsystem descriptor, has one dummy routine descriptor in it
+        * and one arg descriptor, so we have to subtract these out, when
+        * calculating room for the routine and arg arrays:
+        */
+       num_bytes = sizeof(struct rpc_subsystem) +
+                   (num_routines - 1) * sizeof(struct routine_descriptor) +
+                   (num_args - 1) * sizeof(struct routine_arg_descriptor);
+
+       debug(("subys_new: %x; #routines: %d; #args: %d; #bytes: %d\n",
+                           subsys_new, num_routines, num_args, num_bytes));
+
+       subsys_new = (rpc_subsystem_t) (*malloc_func)(num_bytes);
+       if (subsys_new == NULL)
+               return NULL;
+
+       /* Initialize the new subsystem, then copy the lower-numbered
+        * subsystem into the new subsystem, then the higher-numbered one:
+        */
+
+       subsys_new->subsystem = NULL;   /* Reserved for system use */
+       subsys_new->start = subsys_1->start;
+       subsys_new->end = subsys_2->end;
+       subsys_new->maxsize = subsys_1->maxsize > subsys_2->maxsize ?
+                               subsys_1->maxsize : subsys_2->maxsize;
+       subsys_new->base_addr = (vm_address_t)subsys_new;
+
+       /* Point ap at the beginning of the arg_descriptors for the
+        * joined subystem, i.e. just after the end of the combined
+        * array of routine descriptors:
+        */
+       ap = (struct routine_arg_descriptor *)
+                               &(subsys_new->routine[num_routines]);
+       rp = &(subsys_new->routine[0]);
+
+       /* Copy subsys_1 into subsys_new: */
+       debug(("subys_join: Copying lower subsys: rp=%x, ap=%x\n", rp, ap));
+       for (i = 0; i < subsys_1->end - subsys_1->start; i++, rp++) {
+               *rp = subsys_1->routine[i];
+               if (rp->impl_routine != NULL) {
+                       rp->arg_descr = ap;
+                       for (j = 0; j < rp->descr_count; j++)
+                               *ap++ = subsys_1->routine[i].arg_descr[j];
+               } else
+                       rp->arg_descr = NULL;
+       }
+
+       /* Fill in the gap, if any, between subsys_1 routine numbers
+        * and subsys_2 routine numbers:
+        */
+       for (i = subsys_1->end; i < subsys_2->start; i++, rp++) {
+               rp->impl_routine = NULL;
+               rp->arg_descr = NULL;
+       }
+
+       /* Copy subsys_2 into subsys_new: */
+       debug(("subys_join: Copying higher subsys: rp=%x, ap=%x\n", rp, ap));
+       for (i = 0; i < subsys_2->end - subsys_2->start; i++, rp++) {
+               *rp = subsys_2->routine[i];
+               if (rp->impl_routine != NULL) {
+                       rp->arg_descr = ap;
+                       for (j = 0; j < rp->descr_count; j++)
+                               *ap++ = subsys_2->routine[i].arg_descr[j];
+               } else
+                       rp->arg_descr = NULL;
+       }
+       debug(("subys_join: Done: rp=%x, ap=%x\n", rp, ap));
+
+       *num_bytes_p = num_bytes;
+       return subsys_new;
+}
diff --git a/mach.subproj/mach_traps.s b/mach.subproj/mach_traps.s
new file mode 100644 (file)
index 0000000..59c9b0a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989,1988,1987,1986 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/syscall_sw.h>
diff --git a/mach.subproj/mig_allocate.c b/mach.subproj/mig_allocate.c
new file mode 100644 (file)
index 0000000..38db1ac
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon 
+ * the rights to redistribute these changes.
+ */
+
+/*
+ * Memory allocation routine for MiG interfaces.
+ */
+#include <mach/mach.h>
+#include <mach/vm_statistics.h>
+#include "externs.h"
+
+void
+mig_allocate(vm_address_t *addr_p, vm_size_t size)
+{
+       if (vm_allocate(mach_task_self(),
+                       addr_p,
+                       size,
+                       VM_MAKE_TAG(VM_MEMORY_MACH_MSG)|TRUE)
+           != KERN_SUCCESS)
+               *addr_p = 0;
+}
diff --git a/mach.subproj/mig_deallocate.c b/mach.subproj/mig_deallocate.c
new file mode 100644 (file)
index 0000000..5ee1c3f
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon 
+ * the rights to redistribute these changes.
+ */
+
+/*
+ * Memory deallocation routine for MiG interfaces.
+ */
+#include <mach/mach.h>
+#include "externs.h"
+
+void
+mig_deallocate(vm_address_t addr, vm_size_t size)
+{
+       (void) vm_deallocate(mach_task_self(),
+                       addr,
+                       size);
+}
diff --git a/mach.subproj/mig_reply_setup.c b/mach.subproj/mig_reply_setup.c
new file mode 100644 (file)
index 0000000..b18ec76
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon 
+ * the rights to redistribute these changes.
+ */
+
+/*
+ * Routine to set up a MiG reply message from a request message.
+ *
+ * Knows about the MiG reply message ID convention:
+ *     reply_id = request_id + 100
+ *
+ * For typed IPC sets up the RetCode type field.  Does NOT set a
+ * return code value.
+ */
+
+#include <mach/mach.h>
+#include <mach/message.h>
+#include <mach/mig_errors.h>
+
+void
+mig_reply_setup(mach_msg_header_t *request, mach_msg_header_t *reply)
+{
+#define        InP     (request)
+#define        OutP    ((mig_reply_error_t *) reply)
+
+       OutP->Head.msgh_bits =
+               MACH_MSGH_BITS(MACH_MSGH_BITS_LOCAL(InP->msgh_bits), 0);
+       OutP->Head.msgh_size = sizeof(mig_reply_error_t);
+       OutP->Head.msgh_remote_port = InP->msgh_local_port;
+       OutP->Head.msgh_local_port  = MACH_PORT_NULL;
+       OutP->Head.msgh_id = InP->msgh_id + 100;
+       OutP->NDR = NDR_record;
+}
diff --git a/mach.subproj/mig_strncpy.c b/mach.subproj/mig_strncpy.c
new file mode 100644 (file)
index 0000000..fe2a314
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+/*
+ * mig_strncpy.c - by Joshua Block
+ *
+ * mig_strncpy -- Bounded string copy.  Does what the library routine strncpy
+ * OUGHT to do:  Copies the (null terminated) string in src into dest, a 
+ * buffer of length len.  Assures that the copy is still null terminated
+ * and doesn't overflow the buffer, truncating the copy if necessary.
+ *
+ * Parameters:
+ * 
+ *     dest - Pointer to destination buffer.
+ * 
+ *     src - Pointer to source string.
+ * 
+ *     len - Length of destination buffer.
+ *
+ * Result:
+ *     length of string copied, INCLUDING the trailing 0.
+ */
+#include <mach/mig_errors.h>
+
+int
+mig_strncpy(
+    register char *dest,
+    register char *src,
+    register int len)
+{
+    register int i;
+
+    if (len <= 0)
+       return 0;
+
+    for (i=1; i<len; i++)
+       if (! (*dest++ = *src++))
+           return i;
+
+    *dest = '\0';
+    return i;
+}
diff --git a/mach.subproj/ms_thread_switch.c b/mach.subproj/ms_thread_switch.c
new file mode 100644 (file)
index 0000000..2f6a6d6
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include <mach/message.h>
+#include <mach/rpc.h>
+#include <mach/mach_syscalls.h>
+#include <mach/thread_switch.h>
+
+kern_return_t
+thread_switch(
+       mach_port_t             thread,
+       int                     option,
+       mach_msg_timeout_t      option_time)
+{
+       kern_return_t result;
+       
+               result = syscall_thread_switch(thread, option, option_time);
+       return (result);
+}
diff --git a/mach.subproj/notify.defs b/mach.subproj/notify.defs
new file mode 100644 (file)
index 0000000..2014be5
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/notify.defs>
diff --git a/mach.subproj/panic.c b/mach.subproj/panic.c
new file mode 100644 (file)
index 0000000..2411d52
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/* 
+ * Mach Operating System
+ * Copyright (c) 1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ * 
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ * 
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ * 
+ * Carnegie Mellon requests users of this software to return to
+ * 
+ *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
+ *  School of Computer Science
+ *  Carnegie Mellon University
+ *  Pittsburgh PA 15213-3890
+ * 
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+
+#include <mach/mach.h>
+#include <mach/mach_host.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+static mach_port_t master_host_port;
+
+void
+panic_init(mach_port_t port)
+{
+       master_host_port = port;
+}
+
+/*VARARGS1*/
+void
+panic(const char *s, ...)
+{
+       va_list listp;
+
+       printf("panic: ");
+       va_start(listp, s);
+       vprintf(s, listp);
+       va_end(listp);
+       printf("\n");
+
+#define RB_DEBUGGER    0x1000  /* enter debugger NOW */
+       (void) host_reboot(master_host_port, RB_DEBUGGER);
+}
diff --git a/mach.subproj/port_obj.c b/mach.subproj/port_obj.c
new file mode 100644 (file)
index 0000000..4d63221
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * @OSF_COPYRIGHT@
+ */
+
+/*
+ * Define a service to map from a kernel-generated port name
+ * to server-defined "type" and "value" data to be associated
+ * with the port.
+ */
+#include <mach/port_obj.h>
+#include <mach/mach.h>
+
+#define DEFAULT_TABLE_SIZE     (64 * 1024)
+
+struct port_obj_tentry *port_obj_table;
+int port_obj_table_size = DEFAULT_TABLE_SIZE;
+
+void port_obj_init(
+       int maxsize)
+{
+       kern_return_t kr;
+
+       kr = vm_allocate(mach_task_self(),
+               (vm_offset_t *)&port_obj_table,
+               (vm_size_t)(maxsize * sizeof (*port_obj_table)),
+               TRUE);
+       if (kr != KERN_SUCCESS)
+               panic("port_obj_init: can't vm_allocate");
+}
diff --git a/mach.subproj/processor.defs b/mach.subproj/processor.defs
new file mode 100644 (file)
index 0000000..bc58140
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/processor.defs>
diff --git a/mach.subproj/processor_set.defs b/mach.subproj/processor_set.defs
new file mode 100644 (file)
index 0000000..5504bc9
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/processor_set.defs>
\ No newline at end of file
diff --git a/mach.subproj/sbrk.c b/mach.subproj/sbrk.c
new file mode 100644 (file)
index 0000000..5b47642
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ *     File:   sbrk.c
+ *
+ *     Unix compatibility for sbrk system call.
+ *
+ * HISTORY
+ * 09-Mar-90  Gregg Kellogg (gk) at NeXT.
+ *     include <kern/mach_interface.h> instead of <kern/mach.h>
+ *
+ * 14-Feb-89  Avadis Tevanian (avie) at NeXT.
+ *     Total rewrite using a fixed area of VM from break region.
+ */
+
+#include <mach/mach.h>         /* for vm_allocate, vm_offset_t */
+#include <mach/vm_statistics.h>
+#include <sys/types.h>         /* for caddr_t */
+
+static int sbrk_needs_init = TRUE;
+static vm_size_t sbrk_region_size = 4*1024*1024; /* Well, what should it be? */
+static vm_address_t sbrk_curbrk;
+
+caddr_t sbrk(size)
+       int     size;
+{
+       vm_offset_t     addr;
+       kern_return_t   ret;
+       caddr_t         ocurbrk;
+       extern int      end;
+
+       if (sbrk_needs_init) {
+               sbrk_needs_init = FALSE;
+               /*
+                *      Allocate a big region to simulate break region.
+                */
+               ret =  vm_allocate(mach_task_self(), &sbrk_curbrk, sbrk_region_size,
+                                 VM_MAKE_TAG(VM_MEMORY_SBRK)|TRUE);
+               if (ret != KERN_SUCCESS)
+                       return((caddr_t)-1);
+       }
+       
+       if (size <= 0)
+               return((caddr_t)sbrk_curbrk);
+       sbrk_curbrk += size;
+       sbrk_region_size -= size;
+       if (sbrk_region_size < 0)
+               return((caddr_t)-1);
+       return((caddr_t)(sbrk_curbrk - size));
+}
+
+caddr_t brk(x)
+       caddr_t x;
+{
+       return((caddr_t)-1);
+}
+
diff --git a/mach.subproj/semaphore.c b/mach.subproj/semaphore.c
new file mode 100644 (file)
index 0000000..e0ac63b
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * catch_exception_raise will be implemented by user programs
+ * This implementation is provided to resolve the reference in
+ * exc_server().
+ */
+
+#include <mach/boolean.h>
+#include <mach/message.h>
+#include <mach/kern_return.h>
+#include <mach/mach_traps.h>
+#include <mach/mach_types.h>
+#include <mach/clock_types.h>
+
+extern kern_return_t _host_semaphore_traps_return_;
+                                       
+kern_return_t semaphore_signal(
+    mach_port_t signal_semaphore)
+{
+        return semaphore_signal_trap(signal_semaphore);
+}
+
+kern_return_t semaphore_signal_all(
+    mach_port_t signal_semaphore)
+{
+        return semaphore_signal_all_trap(signal_semaphore);
+}
+
+kern_return_t semaphore_signal_thread(
+    mach_port_t signal_semaphore,
+    mach_port_t thread_act)
+{
+        return semaphore_signal_thread_trap(signal_semaphore, thread_act);
+}
+
+kern_return_t semaphore_wait (
+    mach_port_t wait_semaphore)
+{
+        return semaphore_wait_trap(wait_semaphore);
+}
+
+kern_return_t semaphore_timedwait (
+    mach_port_t wait_semaphore,
+    mach_timespec_t wait_time)
+{
+        return semaphore_timedwait_trap(wait_semaphore,
+                                        wait_time.tv_sec,
+                                        wait_time.tv_nsec);
+}
+
+kern_return_t semaphore_wait_signal (
+    mach_port_t wait_semaphore,
+    mach_port_t signal_semaphore)
+{
+        return semaphore_wait_signal_trap(wait_semaphore, signal_semaphore);
+}
+
+kern_return_t semaphore_timedwait_signal (
+    mach_port_t wait_semaphore,
+    mach_port_t signal_semaphore,
+    mach_timespec_t wait_time)
+{
+        return semaphore_timedwait_signal_trap(wait_semaphore,
+                                               signal_semaphore,
+                                               wait_time.tv_sec,
+                                               wait_time.tv_nsec);
+}
diff --git a/mach.subproj/servers.subproj/Makefile b/mach.subproj/servers.subproj/Makefile
new file mode 100644 (file)
index 0000000..e00ee97
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = servers
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = bootstrap_defs.h key_defs.h ls_defs.h netname_defs.h\
+         nm_defs.h
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble\
+            bootstrap.defs netname.defs
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+PUBLIC_HEADERS = bootstrap_defs.h key_defs.h ls_defs.h netname_defs.h\
+                 nm_defs.h
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/mach.subproj/servers.subproj/Makefile.postamble b/mach.subproj/servers.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/mach.subproj/servers.subproj/Makefile.preamble b/mach.subproj/servers.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..5cee34d
--- /dev/null
@@ -0,0 +1,3 @@
+OTHER_PUBLIC_HEADERS = bootstrap.h netname.h
+OTHER_OFILES = bootstrapUser.o netnameUser.o
+PUBLIC_HEADER_DIR_SUFFIX = /servers
diff --git a/mach.subproj/servers.subproj/PB.project b/mach.subproj/servers.subproj/PB.project
new file mode 100644 (file)
index 0000000..d9b8447
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (bootstrap_defs.h, key_defs.h, ls_defs.h, netname_defs.h, nm_defs.h); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble, bootstrap.defs, netname.defs); 
+        PUBLIC_HEADERS = (bootstrap_defs.h, key_defs.h, ls_defs.h, netname_defs.h, nm_defs.h); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = servers; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/mach.subproj/servers.subproj/bootstrap.defs b/mach.subproj/servers.subproj/bootstrap.defs
new file mode 100644 (file)
index 0000000..0daa753
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * bootstrap -- fundamental service initiator and port server
+ * Mike DeMoney, NeXT, Inc.
+ * Copyright, 1990.  All rights reserved.
+ *
+ * bootstrap.defs -- Mig interface definition
+ */
+
+subsystem bootstrap 400;
+
+/*
+ *     Interface:      Bootstrap server
+ *
+ *  The bootstrap server is the first user-mode task initiated by the Mach
+ *  kernel at system boot time.  The bootstrap server provides two services,
+ *  it initiates other system tasks, and manages a table of name-port bindings
+ *  for fundamental system services  (e.g. the NetMsgServer, and the Unix
+ *  emulation service).
+ *
+ *  The file /etc/bootstrap.conf is read by bootstrap to determine other system
+ *  services to initiate at system boot time.  The format of this file is
+ *  described later.
+ *
+ *  Name-port bindings can be established with the bootstrap server by either 
+ *  of two mechanisms:
+ *
+ *  1.  The binding can be indicated in the file /etc/bootstrap.conf.  In this
+ *  case, bootstrap will immediately create a port and bind the indicated name
+ *  with that port.  At a later time, a service may "checkin" for the name-port
+ *  binding and will be returned receive rights for the bound port.  Lookup's
+ *  on bindings created by this mechanism will return send rights to the port,
+ *  even if no service has "checked-in".  In this case, requests sent to the
+ *  bound port will be queued until a server has checked-in and can satisfy the
+ *  request.
+ *
+ *  2.  Bindings can be established dynamically via a "register" request.  In
+ *  this case, the register request provides bootstrap with a name and send
+ *  rights for a port.  Bootstrap will provide send rights for the bound port
+ *  to any requestor via the lookup request.
+ *
+ *  Bootstrap provides its service port to descendant tasks via the Mach
+ *  "bootstrap" special task port.  All direct descendants of bootstrap receive
+ *  a "privileged" bootstrap service port.  System services that initiate
+ *  untrusted tasks should replace the Mach bootstrap task special port with
+ *  a subset bootstrap port to prevent them from infecting the namespace.
+ *
+ *  The bootstrap server creates a "backup" port for each service that it
+ *  creates.  This is used to detect when a checked out service is no longer
+ *  being served.  The bootstrap server regains all rights to the port and
+ *  it is marked available for check-out again.  This allows crashed servers to 
+ *  resume service to previous clients.  Lookup's on this named port will 
+ *  continue to be serviced by bootstrap while holding receive rights for the 
+ *  bound port.  A client may detect that the service is inactive via the.
+ *  bootstrap status request.  If the service re-registers rather than
+ *  "checking-in" the original bound port is destroyed.
+ *
+ *  The status of a named service may be obtained via the "status" request.
+ *  A service is "active" if a name-port binding exists and receive rights
+ *  to the bound port are held by a task other than bootstrap.
+ *
+ *  Bootstrap initiates server tasks and creates initial name-port bindings as
+ *  directed by the configuration file /etc/bootstrap.conf.  This file has
+ *  entries with the following formats:
+ *
+ *     services [ SERVICE_NAME ]+ ;
+ *
+ *             E.g:
+ *             services OldService=1 SomeService;
+ *
+ *             Creates a port and binds the name "OldService" to it.
+ *             For compatability, assigns the port via mach_ports_register to
+ *             slot 1.  Also creates a port and binds the name "SomeService".
+ *
+ *     self [ SERVICE_NAME ]+ ;
+ *
+ *             E.g:
+ *             self BootStrapService;
+ *
+ *             Provides a binding to bootstrap's own service port named
+ *             "BootStrapService".
+ *
+ *     [restartable] server SERVER_FILE_AND_ARGS [ services ... ] ;
+ *
+ *             E.g:
+ *             server "/usr/etc/sigserver -i" services UnixSignalService;
+ *
+ *             Initiates the server task "/usr/etc/sigserver" with
+ *             command-line argument "-i", and also creates a name-port
+ *             binding for the name UnixSignalService.  Checkin requests for
+ *             UnixSignalService are only accepted via the bootstrap service
+ *             port passed to/usr/etc/sigserver.  If the "restartable" option
+ *             had been specified, bootstrap will reinitiate the server task
+ *             if it receives notification that all of the server's service
+ *             ports have been destroyed or deallocated.  The server command
+ *             may be specified without surrounding quotes if it does not
+ *             include blanks.
+ *
+ *     init SERVER_FILE_AND_ARGS [ services ... ] ;
+ *
+ *             E.g:
+ *             init /etc/init services NetMsgService=0 PSWindowService=4;
+ *
+ *             Functions like "server" request above, except process is
+ *             started as pid 1.  Illegal if bootstrap itself was not
+ *             initiated as pid 1.
+ *
+ *     forward;
+ *
+ *             If present, bootstrap will forward unknown lookup requests to
+ *             its bootstrap service port (if not PORT_NULL), and forward any
+ *             reply to the original requester.
+ *
+ *     # Comment string up to end of line.
+ *
+ *             A line terminated comment starts with a sharp sign (#).
+ *
+ *  Lexical notes:  Strings are either enclosed in double quotes ("), or must
+ *  start with a letter or underscore (_) and followed by a string of
+ *  alphanumerics and underscores; backslash (\) escapes the following
+ *  character.  Strings are limited to a (large) length.  Numbers must be
+ *  decimal.  Blanks and newlines may be freely used outside of strings.
+ */
+
+#include <mach/std_types.defs>
+import <servers/bootstrap_defs.h>;
+
+type name_t            = c_string[128];
+type name_array_t      = ^array [] of name_t;
+type bool_array_t      = ^array [] of boolean_t;
+
+serverprefix x_;
+
+/*  old service_checkin */
+skip;
+/*  old service_status */
+skip;
+
+/*
+ * kern_return_t
+ * bootstrap_check_in(mach_port_t bootstrap_port,
+ *                  name_t service_name,
+ *                  port_all_t *service_port)
+ *
+ * Returns all rights to service_port of service named by service_name.
+ *
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ *             Returns BOOTSTRAP_UNKNOWN_SERVICE, if service does not exist.
+ *             Returns BOOTSTRAP_NOT_PRIVILEGED, if request directed to
+ *                     bootstrap port without privilege.
+ *             Returns BOOTSTRAP_SERVICE_ACTIVE, if service has already been
+ *                     registered or checked-in.
+ */
+routine bootstrap_check_in(
+                       bootstrap_port  : mach_port_t;
+                       service_name    : name_t;
+               out     service_port    : mach_port_move_receive_t);
+
+/*
+ * kern_return_t
+ * bootstrap_register(mach_port_t bootstrap_port,
+ *                   name_t service_name,
+ *                   mach_port_t service_port)
+ *
+ * Registers send rights for the port service_port for the service named by
+ * service_name.  Attempts to registering a service where an active binding
+ * already exists are rejected.  On the otherhand, registering a service where
+ * and inactive binding exists (i.e. bootstrap currently holds receive rights
+ * for the service port) is allowed; in this case the previous service port
+ * will be deallocated.  Restarting services wishing to resume service for
+ * previous clients must first attempt to checkin to the service in order to
+ * recover the previous service port.
+ *
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ *             Returns BOOTSTRAP_NOT_PRIVILEGED, if request directed to
+ *                     bootstrap port without privilege.
+ *             Returns BOOTSTRAP_NAME_IN_USE, if service has already been
+ *                     register or checked-in.
+ */
+routine bootstrap_register(
+               bootstrap_port  : mach_port_t;
+               service_name    : name_t;
+               service_port    : mach_port_t);
+
+/*
+ * kern_return_t
+ * bootstrap_look_up(mach_port_t bootstrap_port,
+ *                 name_t service_name,
+ *                 mach_port_t *service_port)
+ *
+ * Returns send rights for the service port of the service named by
+ * service_name in service_port.  Service is not guaranteed to be active.
+ *
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ *             Returns BOOTSTRAP_UNKNOWN_SERVICE, if service does not exist.
+ */
+routine bootstrap_look_up(
+               bootstrap_port  : mach_port_t;
+               service_name    : name_t;
+       out     service_port    : mach_port_t);
+
+/*
+ * kern_return_t
+ * bootstrap_look_up_array(mach_port_t bootstrap_port,
+ *                       name_array_t service_names,
+ *                       int service_names_cnt,
+ *                       port_array_t *service_port,
+ *                       int *service_ports_cnt,
+ *                       boolean_t *all_services_known)
+ *
+ * Returns port send rights in corresponding entries of the array service_ports
+ * for all services named in the array service_names.  Service_ports_cnt is
+ * returned and will always equal service_names_cnt (assuming service_names_cnt
+ * is greater than or equal to zero).
+ *
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ *             Returns BOOTSTRAP_NO_MEMORY, if server couldn't obtain memory
+ *                     for response.
+ *             Unknown service names have the corresponding service port set
+ *                     to PORT_NULL.
+ *             If all services are known, all_services_known is true on
+ *                     return, if any service is unknown, it's false.
+ */
+routine bootstrap_look_up_array(
+               bootstrap_port  : mach_port_t;
+               service_names   : name_array_t;
+       out     service_ports   : mach_port_array_t;
+       out     all_services_known: boolean_t);
+
+/*  old bootstrap_get_unpriv_port */
+skip;
+
+/*
+ * kern_return_t
+ * bootstrap_status(mach_port_t bootstrap_port,
+ *                 name_t service_name,
+ *                 boolean_t *service_active);
+ *
+ * Returns: service_active is true if service is available.
+ *                     
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ *             Returns BOOTSTRAP_UNKNOWN_SERVICE, if service does not exist.
+ */
+routine bootstrap_status(
+               bootstrap_port  :       mach_port_t;
+               service_name    :       name_t;
+       out     service_active  :       boolean_t);
+
+/*
+ * kern_return_t
+ * bootstrap_info(port_t bootstrap_port,
+ *               name_array_t *service_names,
+ *               int *service_names_cnt,
+ *               name_array_t *server_names,
+ *               int *server_names_cnt,
+ *               bool_array_t *service_active,
+ *               int *service_active_cnt);
+ *                     
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ */
+routine bootstrap_info(
+               bootstrap_port  : mach_port_t;
+       out     service_names   : name_array_t, dealloc;
+       out server_names        : name_array_t, dealloc;
+       out service_active      : bool_array_t, dealloc);
+
+/*
+ * kern_return_t
+ * bootstrap_subset(mach_port_t bootstrap_port,
+ *                 mach_port_t requestor_port,
+ *                 mach_port_t *subset_port);
+ *
+ * Returns a new port to use as a bootstrap port.  This port behaves
+ * exactly like the previous bootstrap_port, except that ports dynamically
+ * registered via bootstrap_register() are available only to users of this
+ * specific subset_port.  Lookups on the subset_port will return ports
+ * registered with this port specifically, and ports registered with
+ * ancestors of this subset_port.  Duplications of services already
+ * registered with an ancestor port may be registered with the subset port
+ * are allowed.  Services already advertised may then be effectively removed
+ * by registering PORT_NULL for the service.
+ * When it is detected that the requestor_port is destroied the subset
+ * port and all services advertized by it are destroied as well.
+ *
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ */
+routine bootstrap_subset(
+               bootstrap_port  : mach_port_t;
+               requestor_port  : mach_port_t;
+       out     subset_port     : mach_port_t);
+
+/*
+ * kern_return_t
+ * bootstrap_create_service(mach_port_t bootstrap_port,
+ *                   name_t service_name,
+ *                   mach_port_t *service_port)
+ *
+ * Creates a service named "service_name" and returns send rights to that
+ * port in "service_port."  The port may later be checked in as if this
+ * port were configured in the bootstrap configuration file.
+ *
+ * Errors:     Returns appropriate kernel errors on rpc failure.
+ *             Returns BOOTSTRAP_SERVICE_ACTIVE, if service already exists.
+ */
+routine bootstrap_create_service(
+               bootstrap_port  : mach_port_t;
+               service_name    : name_t;
+       out     service_port    : mach_port_t);
diff --git a/mach.subproj/servers.subproj/bootstrap_defs.h b/mach.subproj/servers.subproj/bootstrap_defs.h
new file mode 100644 (file)
index 0000000..18a8ca8
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * bootstrap -- fundamental service initiator and port server
+ * Mike DeMoney, NeXT, Inc.
+ * Copyright, 1990.  All rights reserved.
+ *
+ * bootstrap_defs.h -- bootstrap service data types and constants
+ * See bootstrap.defs for description of bootstrap services.
+ */
+
+#ifndef _BOOTSTRAP_DEFS_
+#define        _BOOTSTRAP_DEFS_
+#import <mach/boolean.h>
+
+#define        BOOTSTRAP_MAX_NAME_LEN                  128
+#define        BOOTSTRAP_MAX_CMD_LEN                   512
+
+typedef char name_t[BOOTSTRAP_MAX_NAME_LEN];
+typedef char cmd_t[BOOTSTRAP_MAX_CMD_LEN];
+typedef name_t *name_array_t;
+typedef boolean_t *bool_array_t;
+
+#define        BOOTSTRAP_MAX_LOOKUP_COUNT              20
+
+#define        BOOTSTRAP_SUCCESS                               0
+#define        BOOTSTRAP_NOT_PRIVILEGED                        1100
+#define        BOOTSTRAP_NAME_IN_USE                           1101
+#define        BOOTSTRAP_UNKNOWN_SERVICE                       1102
+#define        BOOTSTRAP_SERVICE_ACTIVE                        1103
+#define        BOOTSTRAP_BAD_COUNT                             1104
+#define        BOOTSTRAP_NO_MEMORY                             1105
+
+#endif /* _BOOTSTRAP_DEFS_ */
diff --git a/mach.subproj/servers.subproj/key_defs.h b/mach.subproj/servers.subproj/key_defs.h
new file mode 100644 (file)
index 0000000..a44d526
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * Definitions of encryption keys etc..
+ */
+
+/*
+ * HISTORY:
+ *  5-Jun-87  Robert Sansom (rds) at Carnegie Mellon University
+ *     Added macros to convert keys between network and host order.
+ *
+ * 12-Apr-87  Robert Sansom (rds) at Carnegie Mellon University
+ *     Added KEY_IS_NULL.
+ *
+ *  2-Feb-87  Robert Sansom (rds) at Carnegie Mellon University
+ *     Added KEY_EQUAL.
+ *
+ *  5-Nov-86  Robert Sansom (rds) at Carnegie-Mellon University
+ *     Started.
+ *
+ */
+
+#ifndef        _KEY_DEFS_
+#define        _KEY_DEFS_
+
+/*
+ * An encrytion key.
+ */
+typedef union {
+    unsigned char      key_bytes[16];
+    unsigned long      key_longs[4];
+} key_t, *key_ptr_t;
+
+#define KEY_EQUAL(key1, key2)                                  \
+    ((key1.key_longs[0] == key2.key_longs[0])                  \
+       && (key1.key_longs[1] == key2.key_longs[1])             \
+       && (key1.key_longs[2] == key2.key_longs[2])             \
+       && (key1.key_longs[3] == key2.key_longs[3]))
+
+#define KEY_IS_NULL(key)                                       \
+    (((key).key_longs[0] == 0) && ((key).key_longs[1] == 0)    \
+       && ((key).key_longs[2] == 0) && ((key).key_longs[3] == 0))
+
+
+/*
+ * Macros to convert keys between network and host byte order.
+ */
+#define NTOH_KEY(key) {                                                        \
+    (key).key_longs[0] = ntohl((key).key_longs[0]);                    \
+    (key).key_longs[1] = ntohl((key).key_longs[1]);                    \
+    (key).key_longs[2] = ntohl((key).key_longs[2]);                    \
+    (key).key_longs[3] = ntohl((key).key_longs[3]);                    \
+}
+
+#define HTON_KEY(key) {                                                        \
+    (key).key_longs[0] = htonl((key).key_longs[0]);                    \
+    (key).key_longs[1] = htonl((key).key_longs[1]);                    \
+    (key).key_longs[2] = htonl((key).key_longs[2]);                    \
+    (key).key_longs[3] = htonl((key).key_longs[3]);                    \
+}
+
+/*
+ * Structure used to transmit or store a token or a key.
+ */
+typedef union {
+    key_t      si_key;
+    key_t      si_token;
+} secure_info_t, *secure_info_ptr_t;
+
+/*
+ * Security Level of ports and messages.
+ */
+#define PORT_NOT_SECURE                0
+#define MESSAGE_NOT_SECURE     0
+
+#endif /* _KEY_DEFS_ */
diff --git a/mach.subproj/servers.subproj/ls_defs.h b/mach.subproj/servers.subproj/ls_defs.h
new file mode 100644 (file)
index 0000000..9dc2fe7
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * Copyright (c) 1988 Carnegie-Mellon University
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * Definitions for the logstat module.
+ */
+
+
+#ifndef        _LS_DEFS_
+#define        _LS_DEFS_
+
+#include <sys/types.h>
+
+/*
+ * Definition for a log record.
+ */
+typedef        struct  {
+       long    code;
+       long    thread;
+       long    a1;
+       long    a2;
+       long    a3;
+       long    a4;
+       long    a5;
+       long    a6;
+} log_rec_t;
+
+typedef        log_rec_t       *log_ptr_t;
+
+/*
+ * Statistics record.
+ */
+typedef        struct {
+       int     datagram_pkts_sent;
+       int     datagram_pkts_rcvd;
+       int     srr_requests_sent;
+       int     srr_bcasts_sent;
+       int     srr_requests_rcvd;
+       int     srr_bcasts_rcvd;
+       int     srr_replies_sent;
+       int     srr_replies_rcvd;
+       int     srr_retries_sent;
+       int     srr_retries_rcvd;
+       int     srr_cfailures_sent;
+       int     srr_cfailures_rcvd;
+       int     deltat_dpkts_sent;
+       int     deltat_acks_rcvd;
+       int     deltat_dpkts_rcvd;
+       int     deltat_acks_sent;
+       int     deltat_oldpkts_rcvd;
+       int     deltat_oospkts_rcvd;
+       int     deltat_retries_sent;
+       int     deltat_retries_rcvd;
+       int     deltat_cfailures_sent;
+       int     deltat_cfailures_rcvd;
+       int     deltat_aborts_sent;
+       int     deltat_aborts_rcvd;
+       int     vmtp_requests_sent;
+       int     vmtp_requests_rcvd;
+       int     vmtp_replies_sent;
+       int     vmtp_replies_rcvd;
+       int     ipc_in_messages;
+       int     ipc_out_messages;
+       int     ipc_unblocks_sent;
+       int     ipc_unblocks_rcvd;
+       int     pc_requests_sent;
+       int     pc_requests_rcvd;
+       int     pc_replies_rcvd;
+       int     pc_startups_rcvd;
+       int     nn_requests_sent;
+       int     nn_requests_rcvd;
+       int     nn_replies_rcvd;
+       int     po_ro_hints_sent;
+       int     po_ro_hints_rcvd;
+       int     po_token_requests_sent;
+       int     po_token_requests_rcvd;
+       int     po_token_replies_rcvd;
+       int     po_xfer_requests_sent;
+       int     po_xfer_requests_rcvd;
+       int     po_xfer_replies_rcvd;
+       int     po_deaths_sent;
+       int     po_deaths_rcvd;
+       int     ps_requests_sent;
+       int     ps_requests_rcvd;
+       int     ps_replies_rcvd;
+       int     ps_auth_requests_sent;
+       int     ps_auth_requests_rcvd;
+       int     ps_auth_replies_rcvd;
+       int     mallocs_or_vm_allocates;
+       int     mem_allocs;
+       int     mem_deallocs;
+       int     mem_allocobjs;
+       int     mem_deallocobjs;
+       int     pkts_encrypted;
+       int     pkts_decrypted;
+       int     vmtp_segs_encrypted;
+       int     vmtp_segs_decrypted;
+       int     tcp_requests_sent;
+       int     tcp_replies_sent;
+       int     tcp_requests_rcvd;
+       int     tcp_replies_rcvd;
+       int     tcp_send;
+       int     tcp_recv;
+       int     tcp_connect;
+       int     tcp_accept;
+       int     tcp_close;
+} stat_t;
+
+typedef        stat_t  *stat_ptr_t;
+
+
+/*
+ * Debugging flags record.
+ */
+typedef        struct {
+       int     print_level;
+       int     ipc_in;
+       int     ipc_out;
+       int     tracing;
+       int     vmtp;
+       int     netname;
+       int     deltat;
+       int     tcp;
+       int     mem;
+} debug_t;
+
+typedef        debug_t *debug_ptr_t;
+
+
+/*
+ * Parameters record.
+ */
+typedef struct {
+       int     srr_max_tries;
+       int     srr_retry_sec;
+       int     srr_retry_usec;
+       int     deltat_max_tries;
+       int     deltat_retry_sec;
+       int     deltat_retry_usec;
+       int     deltat_msg_life;
+       int     pc_checkup_interval;
+       int     crypt_algorithm;
+       int     transport_default;
+       int     conf_network;
+       int     conf_netport;
+       int     timer_quantum;
+       int     tcp_conn_steady;
+       int     tcp_conn_opening;
+       int     tcp_conn_max;
+       int     compat;
+       int     syslog;
+       int     old_nmmonitor;
+} param_t;
+
+typedef param_t *param_ptr_t;
+
+
+/*
+ * Port statistics record.
+ */
+typedef struct {
+       u_int   port_id;
+       u_int   alive;
+       u_int   nport_id_high;
+       u_int   nport_id_low;
+       u_int   nport_receiver;
+       u_int   nport_owner;
+       u_int   messages_sent;
+       u_int   messages_rcvd;
+       u_int   send_rights_sent;
+       u_int   send_rights_rcvd_sender;
+       u_int   send_rights_rcvd_recown;
+       u_int   rcv_rights_xferd;
+       u_int   own_rights_xferd;
+       u_int   all_rights_xferd;
+       u_int   tokens_sent;
+       u_int   tokens_requested;
+       u_int   xfer_hints_sent;
+       u_int   xfer_hints_rcvd;
+} port_stat_t, *port_stat_ptr_t;
+
+extern port_stat_ptr_t port_stat_cur;
+extern port_stat_ptr_t port_stat_end;
+extern struct mutex    port_stat_lock;
+
+
+/*
+ * Types for the mem_list operation.
+ *
+ * XXX These must be faked, because we cannot include mem.h here
+ * (mutual includes).
+ */
+typedef char                   *mem_class_ptr_t;
+typedef char                   *mem_nam_ptr_t;
+typedef int                    *mem_bucket_ptr_t;
+
+       
+/*
+ * Definitions for print_level.
+ */
+#define        LS_PRINT_NEVER          5
+#define        LS_PRINT_LOG            3
+#define        LS_PRINT_ALWAYS         0
+
+#endif /* _LS_DEFS_ */
diff --git a/mach.subproj/servers.subproj/netname.defs b/mach.subproj/servers.subproj/netname.defs
new file mode 100644 (file)
index 0000000..264495c
--- /dev/null
@@ -0,0 +1,49 @@
+/* 
+ * Mach Operating System
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * Mig definitions for Network Name Service.
+ */
+
+/*
+ * HISTORY:
+ * 30-May-87  Robert Sansom (rds) at Carnegie Mellon University
+ *     Changes for the new mig.
+ *
+ * 20-Oct-86  Robert Sansom (rds) at Carnegie Mellon University
+ *     New network name service interface.
+ *     Added a serverprefix.
+ */
+
+#include <mach/std_types.defs>
+
+import <servers/netname_defs.h>;
+
+subsystem netname 1040;
+
+serverprefix _;
+
+
+type netname_name_t    = c_string[*:80];
+
+routine netname_check_in(server_port   : mach_port_t;
+                       port_name       : netname_name_t;
+                       signature       : mach_port_t;
+                       port_id         : mach_port_t);
+
+routine netname_look_up(server_port    : mach_port_t;
+                       host_name       : netname_name_t;
+                       port_name       : netname_name_t;
+                   out port_id         : mach_port_t);
+
+routine netname_check_out(server_port  : mach_port_t;
+                       port_name       : netname_name_t;
+                       signature       : mach_port_t);
+
+routine netname_version(server_port    : mach_port_t;
+                   out version         : netname_name_t);
+
diff --git a/mach.subproj/servers.subproj/netname_defs.h b/mach.subproj/servers.subproj/netname_defs.h
new file mode 100644 (file)
index 0000000..8dcffcb
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * Definitions for the mig interface to the network name service.
+ */
+
+/*
+ * HISTORY:
+ * 28-Jul-88  Mary R. Thompson (mrt) at Carnegie Mellon
+ *     Copied definitions of NAME_NOT_YOURS and NAME_NOT_CHECKED_IN
+ *     from the old netname_defs.h so that old code would not break
+ *
+ *  8-Mar-88  Daniel Julin (dpj) at Carnegie-Mellon University
+ *     Added NETNAME_INVALID_PORT.
+ *
+ * 28-Feb-88  Daniel Julin (dpj) at Carnegie-Mellon University
+ *     Added NETNAME_PENDING.
+ *
+ * 23-Dec-86  Robert Sansom (rds) at Carnegie Mellon University
+ *     Copied from the previous version of the network server.
+ *
+ */
+
+#ifndef        _NETNAME_DEFS_
+#define        _NETNAME_DEFS_
+
+#define NETNAME_SUCCESS                (0)
+#define        NETNAME_PENDING         (-1)
+#define NETNAME_NOT_YOURS      (1000)
+#define NAME_NOT_YOURS         (1000)
+#define NETNAME_NOT_CHECKED_IN (1001)
+#define NAME_NOT_CHECKED_IN    (1001)
+#define NETNAME_NO_SUCH_HOST   (1002)
+#define NETNAME_HOST_NOT_FOUND (1003)
+#define        NETNAME_INVALID_PORT    (1004)
+
+typedef char netname_name_t[80];
+
+#endif /* NETNAME_DEFS_ */
diff --git a/mach.subproj/servers.subproj/nm_defs.h b/mach.subproj/servers.subproj/nm_defs.h
new file mode 100644 (file)
index 0000000..641a2e7
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1987 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * Random definitions for the network service that everyone needs!
+ */
+
+/*
+ * HISTORY:
+ * 27-Mar-90  Gregg Kellogg (gk) at NeXT
+ *     include <sys/netport.h> rather than <sys/ipc_netport.h>
+ *
+ * 24-Aug-88  Daniel Julin (dpj) at Carnegie-Mellon University
+ *     Replace sys/mach_ipc_netport.h with kern/ipc_netport.h. Sigh.
+ *
+ * 24-May-88  Daniel Julin (dpj) at Carnegie-Mellon University
+ *     Replace mach_ipc_vmtp.h with mach_ipc_netport.h.
+ *
+ *  4-Sep-87  Daniel Julin (dpj) at Carnegie-Mellon University
+ *     Fixed for new kernel include files which declare a lot
+ *     of network server stuff internally, because of the NETPORT
+ *     option.
+ *
+ *  5-Nov-86  Robert Sansom (rds) at Carnegie-Mellon University
+ *     Started.
+ *
+ */
+
+#ifndef        _NM_DEFS_
+#define        _NM_DEFS_
+
+/*
+ * netaddr_t is declared with the kernel files,
+ * in <sys/netport.h>.
+ */
+#include       <sys/netport.h>
+
+#ifdef notdef
+typedef unsigned long  netaddr_t;
+#endif /* notdef */
+
+typedef union {
+    struct {
+       unsigned char ia_net_owner;
+       unsigned char ia_net_node_type;
+       unsigned char ia_host_high;
+       unsigned char ia_host_low;
+    } ia_bytes;
+    netaddr_t ia_netaddr;
+} ip_addr_t;
+
+#endif /* _NM_DEFS_ */
+
diff --git a/mach.subproj/slot_name.c b/mach.subproj/slot_name.c
new file mode 100644 (file)
index 0000000..814ea0a
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ *     File:   slot_name.c
+ *     Author: Avadis Tevanian, Jr.
+ *
+ *     Copyright (C) 1987, Avadis Tevanian, Jr.
+ *
+ *     Convert machine slot values to human readable strings.
+ *
+ * HISTORY
+ * 26-Jan-88  Mary Thompson (mrt) at Carnegie Mellon
+ *     added case for CUP_SUBTYPE_RT_APC
+ *
+ * 28-Feb-87  Avadis Tevanian (avie) at Carnegie-Mellon University
+ *     Created.
+ *
+ */
+
+#include <mach/mach.h>
+#include <mach-o/arch.h>
+#include <stddef.h>
+
+/*
+ *     Convert the specified cpu_type/cpu_subtype pair to their
+ *     human readable form.
+ */
+void slot_name(cpu_type, cpu_subtype, cpu_name, cpu_subname)
+        cpu_type_t     cpu_type;
+        cpu_subtype_t  cpu_subtype;
+        char           **cpu_name, **cpu_subname;
+{
+        register char  *name = "Unknown CPU";
+        register char  *subname = "";
+        const NXArchInfo *ai = NXGetArchInfoFromCpuType(cpu_type, cpu_subtype);
+        if (ai != NULL) {
+            name = ai->name;
+            subname = ai->description;
+        }
+        *cpu_name = name;
+        *cpu_subname = subname;
+}
+
+kern_return_t msg_rpc(void) {
+       return KERN_FAILURE;
+}
+
+kern_return_t msg_send(void) {
+       return KERN_FAILURE;
+}
+
+kern_return_t msg_receive(void) {
+       return KERN_FAILURE;
+}
+
+mach_port_t task_self_(void) {
+       return mach_task_self();
+}
+
+mach_port_t host_self(void) {
+       return mach_host_self();
+}
diff --git a/mach.subproj/task.defs b/mach.subproj/task.defs
new file mode 100644 (file)
index 0000000..af6399f
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/task.defs>
\ No newline at end of file
diff --git a/mach.subproj/thread_act.defs b/mach.subproj/thread_act.defs
new file mode 100644 (file)
index 0000000..8c515f8
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/thread_act.defs>
\ No newline at end of file
diff --git a/mach.subproj/vm_map.defs b/mach.subproj/vm_map.defs
new file mode 100644 (file)
index 0000000..36aa954
--- /dev/null
@@ -0,0 +1 @@
+#include <mach/vm_map.defs>
diff --git a/net.subproj/Makefile b/net.subproj/Makefile
new file mode 100644 (file)
index 0000000..7417017
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = net
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = inet_addr.c inet_lnaof.c inet_makeaddr.c inet_netof.c\
+         inet_network.c inet_ntoa.c iso_addr.c linkaddr.c ns_addr.c\
+         ns_ntoa.c nsap_addr.c recv.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/net.subproj/Makefile.postamble b/net.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/net.subproj/Makefile.preamble b/net.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/net.subproj/PB.project b/net.subproj/PB.project
new file mode 100644 (file)
index 0000000..172eb9c
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (
+            inet_addr.c, 
+            inet_lnaof.c, 
+            inet_makeaddr.c, 
+            inet_netof.c, 
+            inet_network.c, 
+            inet_ntoa.c, 
+            iso_addr.c, 
+            linkaddr.c, 
+            ns_addr.c, 
+            ns_ntoa.c, 
+            nsap_addr.c, 
+            recv.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = net; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/net.subproj/inet_addr.c b/net.subproj/inet_addr.c
new file mode 100644 (file)
index 0000000..646a95d
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+
+/*
+ * Ascii internet address interpretation routine.
+ * The value returned is in network order.
+ */
+u_long
+inet_addr(cp)
+       register const char *cp;
+{
+       struct in_addr val;
+
+       if (inet_aton(cp, &val))
+               return (val.s_addr);
+       return (INADDR_NONE);
+}
+
+/* 
+ * Check whether "cp" is a valid ascii representation
+ * of an Internet address and convert to a binary address.
+ * Returns 1 if the address is valid, 0 if not.
+ * This replaces inet_addr, the return value from which
+ * cannot distinguish between failure and a local broadcast address.
+ */
+int
+inet_aton(cp, addr)
+       register const char *cp;
+       struct in_addr *addr;
+{
+       register u_long val;
+       register int base, n;
+       register char c;
+       u_int parts[4];
+       register u_int *pp = parts;
+
+       for (;;) {
+               /*
+                * Collect number up to ``.''.
+                * Values are specified as for C:
+                * 0x=hex, 0=octal, other=decimal.
+                */
+               val = 0; base = 10;
+               if (*cp == '0') {
+                       if (*++cp == 'x' || *cp == 'X')
+                               base = 16, cp++;
+                       else
+                               base = 8;
+               }
+               while ((c = *cp) != '\0') {
+                       if (isascii(c) && isdigit(c)) {
+                               val = (val * base) + (c - '0');
+                               cp++;
+                               continue;
+                       }
+                       if (base == 16 && isascii(c) && isxdigit(c)) {
+                               val = (val << 4) + 
+                                       (c + 10 - (islower(c) ? 'a' : 'A'));
+                               cp++;
+                               continue;
+                       }
+                       break;
+               }
+               if (*cp == '.') {
+                       /*
+                        * Internet format:
+                        *      a.b.c.d
+                        *      a.b.c   (with c treated as 16-bits)
+                        *      a.b     (with b treated as 24 bits)
+                        */
+                       if (pp >= parts + 3 || val > 0xff)
+                               return (0);
+                       *pp++ = val, cp++;
+               } else
+                       break;
+       }
+       /*
+        * Check for trailing characters.
+        */
+       if (*cp && (!isascii(*cp) || !isspace(*cp)))
+               return (0);
+       /*
+        * Concoct the address according to
+        * the number of parts specified.
+        */
+       n = pp - parts + 1;
+       switch (n) {
+
+       case 1:                         /* a -- 32 bits */
+               break;
+
+       case 2:                         /* a.b -- 8.24 bits */
+               if (val > 0xffffff)
+                       return (0);
+               val |= parts[0] << 24;
+               break;
+
+       case 3:                         /* a.b.c -- 8.8.16 bits */
+               if (val > 0xffff)
+                       return (0);
+               val |= (parts[0] << 24) | (parts[1] << 16);
+               break;
+
+       case 4:                         /* a.b.c.d -- 8.8.8.8 bits */
+               if (val > 0xff)
+                       return (0);
+               val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
+               break;
+       }
+       if (addr)
+               addr->s_addr = htonl(val);
+       return (1);
+}
diff --git a/net.subproj/inet_lnaof.c b/net.subproj/inet_lnaof.c
new file mode 100644 (file)
index 0000000..99e72ba
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Return the local network address portion of an
+ * internet address; handles class a/b/c network
+ * number formats.
+ */
+u_long
+inet_lnaof(in)
+       struct in_addr in;
+{
+       register u_long i = ntohl(in.s_addr);
+
+       if (IN_CLASSA(i))
+               return ((i)&IN_CLASSA_HOST);
+       else if (IN_CLASSB(i))
+               return ((i)&IN_CLASSB_HOST);
+       else
+               return ((i)&IN_CLASSC_HOST);
+}
diff --git a/net.subproj/inet_makeaddr.c b/net.subproj/inet_makeaddr.c
new file mode 100644 (file)
index 0000000..8789c19
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Formulate an Internet address from network + host.  Used in
+ * building addresses stored in the ifnet structure.
+ */
+struct in_addr
+inet_makeaddr(net, host)
+       u_long net, host;
+{
+       u_long addr;
+
+       if (net < 128)
+               addr = (net << IN_CLASSA_NSHIFT) | (host & IN_CLASSA_HOST);
+       else if (net < 65536)
+               addr = (net << IN_CLASSB_NSHIFT) | (host & IN_CLASSB_HOST);
+       else if (net < 16777216L)
+               addr = (net << IN_CLASSC_NSHIFT) | (host & IN_CLASSC_HOST);
+       else
+               addr = net | host;
+       addr = htonl(addr);
+       return (*(struct in_addr *)&addr);
+}
diff --git a/net.subproj/inet_netof.c b/net.subproj/inet_netof.c
new file mode 100644 (file)
index 0000000..c371654
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Return the network number from an internet
+ * address; handles class a/b/c network #'s.
+ */
+u_long
+inet_netof(in)
+       struct in_addr in;
+{
+       register u_long i = ntohl(in.s_addr);
+
+       if (IN_CLASSA(i))
+               return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
+       else if (IN_CLASSB(i))
+               return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
+       else
+               return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+}
diff --git a/net.subproj/inet_network.c b/net.subproj/inet_network.c
new file mode 100644 (file)
index 0000000..07d6e7f
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+
+/*
+ * Internet network address interpretation routine.
+ * The library routines call this routine to interpret
+ * network numbers.
+ */
+u_long
+inet_network(cp)
+       register const char *cp;
+{
+       register u_long val, base, n;
+       register char c;
+       u_long parts[4], *pp = parts;
+       register int i;
+
+again:
+       val = 0; base = 10;
+       if (*cp == '0')
+               base = 8, cp++;
+       if (*cp == 'x' || *cp == 'X')
+               base = 16, cp++;
+       while (c = *cp) {
+               if (isdigit(c)) {
+                       val = (val * base) + (c - '0');
+                       cp++;
+                       continue;
+               }
+               if (base == 16 && isxdigit(c)) {
+                       val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
+                       cp++;
+                       continue;
+               }
+               break;
+       }
+       if (*cp == '.') {
+               if (pp >= parts + 4)
+                       return (INADDR_NONE);
+               *pp++ = val, cp++;
+               goto again;
+       }
+       if (*cp && !isspace(*cp))
+               return (INADDR_NONE);
+       *pp++ = val;
+       n = pp - parts;
+       if (n > 4)
+               return (INADDR_NONE);
+       for (val = 0, i = 0; i < n; i++) {
+               val <<= 8;
+               val |= parts[i] & 0xff;
+       }
+       return (val);
+}
diff --git a/net.subproj/inet_ntoa.c b/net.subproj/inet_ntoa.c
new file mode 100644 (file)
index 0000000..e91f1ea
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Convert network-format internet address
+ * to base 256 d.d.d.d representation.
+ */
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+
+char *
+inet_ntoa(in)
+       struct in_addr in;
+{
+       static char b[18];
+       register char *p;
+
+       p = (char *)&in;
+#define        UC(b)   (((int)b)&0xff)
+       (void)snprintf(b, sizeof(b),
+           "%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3]));
+       return (b);
+}
diff --git a/net.subproj/iso_addr.c b/net.subproj/iso_addr.c
new file mode 100644 (file)
index 0000000..3267fa8
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <netiso/iso.h>
+#include <string.h>
+
+/* States*/
+#define VIRGIN 0
+#define GOTONE 1
+#define GOTTWO 2
+/* Inputs */
+#define        DIGIT   (4*0)
+#define        END     (4*1)
+#define DELIM  (4*2)
+
+struct iso_addr *
+iso_addr(addr)
+       register const char *addr;
+{
+       static struct iso_addr out_addr;
+       register char *cp = out_addr.isoa_genaddr;
+       char *cplim = cp + sizeof(out_addr.isoa_genaddr);
+       register int byte = 0, state = VIRGIN, new;
+
+       bzero((char *)&out_addr, sizeof(out_addr));
+       do {
+               if ((*addr >= '0') && (*addr <= '9')) {
+                       new = *addr - '0';
+               } else if ((*addr >= 'a') && (*addr <= 'f')) {
+                       new = *addr - 'a' + 10;
+               } else if ((*addr >= 'A') && (*addr <= 'F')) {
+                       new = *addr - 'A' + 10;
+               } else if (*addr == 0) 
+                       state |= END;
+               else
+                       state |= DELIM;
+               addr++;
+               switch (state /* | INPUT */) {
+               case GOTTWO | DIGIT:
+                       *cp++ = byte; /*FALLTHROUGH*/
+               case VIRGIN | DIGIT:
+                       state = GOTONE; byte = new; continue;
+               case GOTONE | DIGIT:
+                       state = GOTTWO; byte = new + (byte << 4); continue;
+               default: /* | DELIM */
+                       state = VIRGIN; *cp++ = byte; byte = 0; continue;
+               case GOTONE | END:
+               case GOTTWO | END:
+                       *cp++ = byte; /* FALLTHROUGH */
+               case VIRGIN | END:
+                       break;
+               }
+               break;
+       } while (cp < cplim); 
+       out_addr.isoa_len = cp - out_addr.isoa_genaddr;
+       return (&out_addr);
+}
+static char hexlist[] = "0123456789abcdef";
+
+char *
+iso_ntoa(isoa)
+       const struct iso_addr *isoa;
+{
+       static char obuf[64];
+       register char *out = obuf; 
+       register int i;
+       register u_char *in = (u_char *)isoa->isoa_genaddr;
+       u_char *inlim = in + isoa->isoa_len;
+
+       out[1] = 0;
+       while (in < inlim) {
+               i = *in++;
+               *out++ = '.';
+               if (i > 0xf) {
+                       out[1] = hexlist[i & 0xf];
+                       i >>= 4;
+                       out[0] = hexlist[i];
+                       out += 2;
+               } else
+                       *out++ = hexlist[i];
+       }
+       *out = 0;
+       return(obuf + 1);
+}
diff --git a/net.subproj/linkaddr.c b/net.subproj/linkaddr.c
new file mode 100644 (file)
index 0000000..ffaafff
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if_dl.h>
+#include <string.h>
+
+/* States*/
+#define NAMING 0
+#define GOTONE 1
+#define GOTTWO 2
+#define RESET  3
+/* Inputs */
+#define        DIGIT   (4*0)
+#define        END     (4*1)
+#define DELIM  (4*2)
+#define LETTER (4*3)
+
+void
+link_addr(addr, sdl)
+       register const char *addr;
+       register struct sockaddr_dl *sdl;
+{
+       register char *cp = sdl->sdl_data;
+       char *cplim = sdl->sdl_len + (char *)sdl;
+       register int byte = 0, state = NAMING, new;
+
+       bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1);
+       sdl->sdl_family = AF_LINK;
+       do {
+               state &= ~LETTER;
+               if ((*addr >= '0') && (*addr <= '9')) {
+                       new = *addr - '0';
+               } else if ((*addr >= 'a') && (*addr <= 'f')) {
+                       new = *addr - 'a' + 10;
+               } else if ((*addr >= 'A') && (*addr <= 'F')) {
+                       new = *addr - 'A' + 10;
+               } else if (*addr == 0) {
+                       state |= END;
+               } else if (state == NAMING &&
+                          (((*addr >= 'A') && (*addr <= 'Z')) ||
+                          ((*addr >= 'a') && (*addr <= 'z'))))
+                       state |= LETTER;
+               else
+                       state |= DELIM;
+               addr++;
+               switch (state /* | INPUT */) {
+               case NAMING | DIGIT:
+               case NAMING | LETTER:
+                       *cp++ = addr[-1];
+                       continue;
+               case NAMING | DELIM:
+                       state = RESET;
+                       sdl->sdl_nlen = cp - sdl->sdl_data;
+                       continue;
+               case GOTTWO | DIGIT:
+                       *cp++ = byte;
+                       /* FALLTHROUGH */
+               case RESET | DIGIT:
+                       state = GOTONE;
+                       byte = new;
+                       continue;
+               case GOTONE | DIGIT:
+                       state = GOTTWO;
+                       byte = new + (byte << 4);
+                       continue;
+               default: /* | DELIM */
+                       state = RESET;
+                       *cp++ = byte;
+                       byte = 0;
+                       continue;
+               case GOTONE | END:
+               case GOTTWO | END:
+                       *cp++ = byte;
+                       /* FALLTHROUGH */
+               case RESET | END:
+                       break;
+               }
+               break;
+       } while (cp < cplim); 
+       sdl->sdl_alen = cp - LLADDR(sdl);
+       new = cp - (char *)sdl;
+       if (new > sizeof(*sdl))
+               sdl->sdl_len = new;
+       return;
+}
+
+static char hexlist[] = "0123456789abcdef";
+
+char *
+link_ntoa(sdl)
+       register const struct sockaddr_dl *sdl;
+{
+       static char obuf[64];
+       register char *out = obuf; 
+       register int i;
+       register u_char *in = (u_char *)LLADDR(sdl);
+       u_char *inlim = in + sdl->sdl_alen;
+       int firsttime = 1;
+
+       if (sdl->sdl_nlen) {
+               bcopy(sdl->sdl_data, obuf, sdl->sdl_nlen);
+               out += sdl->sdl_nlen;
+               if (sdl->sdl_alen)
+                       *out++ = ':';
+       }
+       while (in < inlim) {
+               if (firsttime)
+                       firsttime = 0;
+               else
+                       *out++ = '.';
+               i = *in++;
+               if (i > 0xf) {
+                       out[1] = hexlist[i & 0xf];
+                       i >>= 4;
+                       out[0] = hexlist[i];
+                       out += 2;
+               } else
+                       *out++ = hexlist[i];
+       }
+       *out = 0;
+       return (obuf);
+}
diff --git a/net.subproj/ns_addr.c b/net.subproj/ns_addr.c
new file mode 100644 (file)
index 0000000..7e98719
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1986, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * J.Q. Johnson.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <netns/ns.h>
+#include <stdio.h>
+#include <string.h>
+
+static struct ns_addr addr, zero_addr;
+
+static void Field(), cvtbase();
+
+struct ns_addr 
+ns_addr(name)
+       const char *name;
+{
+       char separator;
+       char *hostname, *socketname, *cp;
+       char buf[50];
+
+       (void)strncpy(buf, name, sizeof(buf) - 1);
+       buf[sizeof(buf) - 1] = '\0';
+
+       /*
+        * First, figure out what he intends as a field separtor.
+        * Despite the way this routine is written, the prefered
+        * form  2-272.AA001234H.01777, i.e. XDE standard.
+        * Great efforts are made to insure backward compatability.
+        */
+       if (hostname = strchr(buf, '#'))
+               separator = '#';
+       else {
+               hostname = strchr(buf, '.');
+               if ((cp = strchr(buf, ':')) &&
+                   ((hostname && cp < hostname) || (hostname == 0))) {
+                       hostname = cp;
+                       separator = ':';
+               } else
+                       separator = '.';
+       }
+       if (hostname)
+               *hostname++ = 0;
+
+       addr = zero_addr;
+       Field(buf, addr.x_net.c_net, 4);
+       if (hostname == 0)
+               return (addr);  /* No separator means net only */
+
+       socketname = strchr(hostname, separator);
+       if (socketname) {
+               *socketname++ = 0;
+               Field(socketname, (u_char *)&addr.x_port, 2);
+       }
+
+       Field(hostname, addr.x_host.c_host, 6);
+
+       return (addr);
+}
+
+static void
+Field(buf, out, len)
+       char *buf;
+       u_char *out;
+       int len;
+{
+       register char *bp = buf;
+       int i, ibase, base16 = 0, base10 = 0, clen = 0;
+       int hb[6], *hp;
+       char *fmt;
+
+       /*
+        * first try 2-273#2-852-151-014#socket
+        */
+       if ((*buf != '-') &&
+           (1 < (i = sscanf(buf, "%d-%d-%d-%d-%d",
+                       &hb[0], &hb[1], &hb[2], &hb[3], &hb[4])))) {
+               cvtbase(1000L, 256, hb, i, out, len);
+               return;
+       }
+       /*
+        * try form 8E1#0.0.AA.0.5E.E6#socket
+        */
+       if (1 < (i = sscanf(buf,"%x.%x.%x.%x.%x.%x",
+                       &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
+               cvtbase(256L, 256, hb, i, out, len);
+               return;
+       }
+       /*
+        * try form 8E1#0:0:AA:0:5E:E6#socket
+        */
+       if (1 < (i = sscanf(buf,"%x:%x:%x:%x:%x:%x",
+                       &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
+               cvtbase(256L, 256, hb, i, out, len);
+               return;
+       }
+       /*
+        * This is REALLY stretching it but there was a
+        * comma notation separting shorts -- definitely non standard
+        */
+       if (1 < (i = sscanf(buf,"%x,%x,%x",
+                       &hb[0], &hb[1], &hb[2]))) {
+               hb[0] = htons(hb[0]); hb[1] = htons(hb[1]);
+               hb[2] = htons(hb[2]);
+               cvtbase(65536L, 256, hb, i, out, len);
+               return;
+       }
+
+       /* Need to decide if base 10, 16 or 8 */
+       while (*bp) switch (*bp++) {
+
+       case '0': case '1': case '2': case '3': case '4': case '5':
+       case '6': case '7': case '-':
+               break;
+
+       case '8': case '9':
+               base10 = 1;
+               break;
+
+       case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+               base16 = 1;
+               break;
+       
+       case 'x': case 'X':
+               *--bp = '0';
+               base16 = 1;
+               break;
+
+       case 'h': case 'H':
+               base16 = 1;
+               /* fall into */
+
+       default:
+               *--bp = 0; /* Ends Loop */
+       }
+       if (base16) {
+               fmt = "%3x";
+               ibase = 4096;
+       } else if (base10 == 0 && *buf == '0') {
+               fmt = "%3o";
+               ibase = 512;
+       } else {
+               fmt = "%3d";
+               ibase = 1000;
+       }
+
+       for (bp = buf; *bp++; ) clen++;
+       if (clen == 0) clen++;
+       if (clen > 18) clen = 18;
+       i = ((clen - 1) / 3) + 1;
+       bp = clen + buf - 3;
+       hp = hb + i - 1;
+
+       while (hp > hb) {
+               (void)sscanf(bp, fmt, hp);
+               bp[0] = 0;
+               hp--;
+               bp -= 3;
+       }
+       (void)sscanf(buf, fmt, hp);
+       cvtbase((long)ibase, 256, hb, i, out, len);
+}
+
+static void
+cvtbase(oldbase,newbase,input,inlen,result,reslen)
+       long oldbase;
+       int newbase;
+       int input[];
+       int inlen;
+       unsigned char result[];
+       int reslen;
+{
+       int d, e;
+       long sum;
+
+       e = 1;
+       while (e > 0 && reslen > 0) {
+               d = 0; e = 0; sum = 0;
+               /* long division: input=input/newbase */
+               while (d < inlen) {
+                       sum = sum*oldbase + (long) input[d];
+                       e += (sum > 0);
+                       input[d++] = sum / newbase;
+                       sum %= newbase;
+               }
+               result[--reslen] = sum; /* accumulate remainder */
+       }
+       for (d=0; d < reslen; d++)
+               result[d] = 0;
+}
diff --git a/net.subproj/ns_ntoa.c b/net.subproj/ns_ntoa.c
new file mode 100644 (file)
index 0000000..e038815
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1986, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <netns/ns.h>
+#include <stdio.h>
+
+char *
+ns_ntoa(addr)
+       struct ns_addr addr;
+{
+       static char obuf[40];
+       union { union ns_net net_e; u_long long_e; } net;
+       u_short port = htons(addr.x_port);
+       register char *cp;
+       char *cp2;
+       register u_char *up = addr.x_host.c_host;
+       u_char *uplim = up + 6;
+       static char *spectHex();
+
+       net.net_e = addr.x_net;
+       sprintf(obuf, "%lx", ntohl(net.long_e));
+       cp = spectHex(obuf);
+       cp2 = cp + 1;
+       while (*up==0 && up < uplim) up++;
+       if (up == uplim) {
+               if (port) {
+                       sprintf(cp, ".0");
+                       cp += 2;
+               }
+       } else {
+               sprintf(cp, ".%x", *up++);
+               while (up < uplim) {
+                       while (*cp) cp++;
+                       sprintf(cp, "%02x", *up++);
+               }
+               cp = spectHex(cp2);
+       }
+       if (port) {
+               sprintf(cp, ".%x", port);
+               spectHex(cp + 1);
+       }
+       return (obuf);
+}
+
+static char *
+spectHex(p0)
+       char *p0;
+{
+       int ok = 0;
+       int nonzero = 0;
+       register char *p = p0;
+       for (; *p; p++) switch (*p) {
+
+       case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+               *p += ('A' - 'a');
+               /* fall into . . . */
+       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+               ok = 1;
+       case '1': case '2': case '3': case '4': case '5':
+       case '6': case '7': case '8': case '9':
+               nonzero = 1;
+       }
+       if (nonzero && !ok) { *p++ = 'H'; *p = 0; }
+       return (p);
+}
diff --git a/net.subproj/nsap_addr.c b/net.subproj/nsap_addr.c
new file mode 100644 (file)
index 0000000..2c5ebaa
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$Id: nsap_addr.c,v 1.3 2000/06/09 04:01:52 wsanchez Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <ctype.h>
+#include <resolv.h>
+
+#if !defined(isxdigit) /* XXX - could be a function */
+static int
+isxdigit(c)
+       register int c;
+{
+       return ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'F'));
+}
+#endif
+
+static char
+xtob(c)
+       register int c;
+{
+       return (c - (((c >= '0') && (c <= '9')) ? '0' : '7'));
+}
+
+u_int
+inet_nsap_addr(ascii, binary, maxlen)
+       const char *ascii;
+       u_char *binary;
+       int maxlen;
+{
+       register u_char c, nib;
+       u_int len = 0;
+
+       while ((c = *ascii++) != '\0' && len < maxlen) {
+               if (c == '.' || c == '+' || c == '/')
+                       continue;
+               if (!isascii(c))
+                       return (0);
+               if (islower(c))
+                       c = toupper(c);
+               if (isxdigit(c)) {
+                       nib = xtob(c);
+                       if (c = *ascii++) {
+                               c = toupper(c);
+                               if (isxdigit(c)) {
+                                       *binary++ = (nib << 4) | xtob(c);
+                                       len++;
+                               } else
+                                       return (0);
+                       }
+                       else
+                               return (0);
+               }
+               else
+                       return (0);
+       }
+       return (len);
+}
+
+char *
+inet_nsap_ntoa(binlen, binary, ascii)
+       int binlen;
+       register const u_char *binary;
+       register char *ascii;
+{
+       register int nib;
+       int i;
+       static char tmpbuf[255*3];
+       char *start;
+
+       if (ascii)
+               start = ascii;
+       else {
+               ascii = tmpbuf;
+               start = tmpbuf;
+       }
+
+       if (binlen > 255)
+               binlen = 255;
+
+       for (i = 0; i < binlen; i++) {
+               nib = *binary >> 4;
+               *ascii++ = nib + (nib < 10 ? '0' : '7');
+               nib = *binary++ & 0x0f;
+               *ascii++ = nib + (nib < 10 ? '0' : '7');
+               if (((i % 2) == 0 && (i + 1) < binlen))
+                       *ascii++ = '.';
+       }
+       *ascii = '\0';
+       return (start);
+}
diff --git a/net.subproj/recv.c b/net.subproj/recv.c
new file mode 100644 (file)
index 0000000..42645fa
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stddef.h>
+
+ssize_t recv(s, buf, len, flags)
+       int s, flags;
+       size_t len;
+       void *buf;
+{
+       return (recvfrom(s, buf, len, flags, NULL, 0));
+}
diff --git a/pthreads.subproj/Makefile b/pthreads.subproj/Makefile
new file mode 100644 (file)
index 0000000..5aaeca9
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = pthreads
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = posix_sched.h pthread.h pthread_impl.h pthread_internals.h\
+         pthread_machdep.h sched.h
+
+OTHERLINKED = lock.s stack.s
+
+CFILES = pthread.c pthread_cond.c pthread_mutex.c pthread_tsd.c\
+         thread_setup.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble\
+            mk_pthread_impl.c
+
+OTHERLINKEDOFILES = lock.o stack.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -D__POSIX_LIB__
+PUBLIC_HEADERS = sched.h pthread_impl.h pthread.h
+
+PROJECT_HEADERS = pthread_internals.h sched.h pthread_impl.h pthread.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/Sandbox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/pthreads.subproj/Makefile.postamble b/pthreads.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/pthreads.subproj/Makefile.preamble b/pthreads.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/pthreads.subproj/PB.project b/pthreads.subproj/PB.project
new file mode 100644 (file)
index 0000000..cb9a7f3
--- /dev/null
@@ -0,0 +1,44 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (
+            posix_sched.h, 
+            pthread.h, 
+            pthread_impl.h, 
+            pthread_internals.h, 
+            pthread_machdep.h, 
+            sched.h
+        ); 
+        OTHER_LINKED = (
+            lock.s, 
+            pthread.c, 
+            pthread_cond.c, 
+            pthread_mutex.c, 
+            pthread_tsd.c, 
+            stack.s, 
+            thread_setup.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble, mk_pthread_impl.c); 
+        PROJECT_HEADERS = (pthread_internals.h, sched.h, pthread_impl.h, pthread.h); 
+        PUBLIC_HEADERS = (sched.h, pthread_impl.h, pthread.h); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/Sandbox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-D__POSIX_LIB__"; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = pthreads; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/pthreads.subproj/lock.s b/pthreads.subproj/lock.s
new file mode 100644 (file)
index 0000000..baac7af
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+#if defined(__ppc__)
+
+#import        <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+
+/* void spin_lock(int *p);
+ *
+ * Lock the lock pointed to by `p'.  Spin (possibly forever) until
+ * the lock is available.  Test and test and set logic used.
+ */
+
+.text
+
+LEAF(__spin_lock_try)
+1:
+       lwarx   r5,0,r3         // Read the lock
+       addi    r4,0,0x1        // Lock value
+       cmpwi   r5,0x0          // Is it busy?
+       bne-    2f              // Yes, return 0
+       stwcx.  r4,0,r3         // Try to lock the lock
+       bne-    1b              // Lost reservation, try again
+        addi   r3,0,1          // Got the lock
+       isync                   // Sync instruction stream 
+       blr                     // Return 1
+2:     addi    r3,0,0          // Could not get the lock
+       blr                     // Return 0
+END(__spin_lock_try)
+
+.globl _spin_lock
+LEAF(__spin_lock)
+_spin_lock:
+       addi    r4,0,0x1        // Lock value
+1:
+       lwarx   r5,0,r3         // Read the lock
+       cmpwi   r5,0x0          // Is it busy?
+       bne-    1b              // Yes, spin
+       stwcx.  r4,0,r3         // Try to lock the lock
+       bne-    1b              // Lost reservation, try again
+       isync                   // Sync instruction stream 
+       blr                     // Got it, return
+END(__spin_lock)
+
+/* void spin_unlock(int *p);
+ *
+ *     Unlock the lock pointed to by p.
+ */
+.globl _spin_unlock
+LEAF(__spin_unlock)
+_spin_unlock:
+       sync
+       li32    r4,0
+       stw     r4,0(r3)
+       blr
+END(__spin_unlock)
+
+#elif defined(__i386__)
+
+#include <architecture/i386/asm_help.h>  
+
+/*    
+ * void
+ * _spin_lock(p)
+ *      int *p;
+ *
+ * Lock the lock pointed to by p.  Spin (possibly forever) until the next
+ * lock is available.
+ */
+        TEXT
+
+.globl _spin_lock_try
+LEAF(__spin_lock_try, 0)
+_spin_lock_try:
+        movl    4(%esp),%ecx
+        movl    $1,%eax
+        xchgl   (%ecx),%eax
+        xorl    $1,%eax
+END(__spin_lock_try)
+
+.globl _spin_lock
+LEAF(__spin_lock, 0)
+_spin_lock:
+        movl    4(%esp), %ecx
+1:
+        movl    (%ecx), %eax
+        orl     %eax, %eax
+        jnz     1b
+        movl    $0xFFFFFFFF, %eax
+        xchgl   %eax, (%ecx)
+        orl     %eax, %eax
+        jnz     1b
+END(__spin_lock)
+
+
+/*
+ * void
+ * _spin_unlock(p)
+ *      int *p;
+ *
+ * Unlock the lock pointed to by p.
+ */
+.globl _spin_unlock
+LEAF(__spin_unlock, 0)
+_spin_unlock:
+        movl    $0, %eax
+        movl    4(%esp), %ecx
+        xchgl   %eax, (%ecx)
+END(__spin_unlock)
+
+#else
+#error spin_locks not defined for this architecture
+#endif
diff --git a/pthreads.subproj/mk_pthread_impl.c b/pthreads.subproj/mk_pthread_impl.c
new file mode 100644 (file)
index 0000000..67b8c1b
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * This program will generate the stuff necessary to "publish" the POSIX
+ * header <pthread.h> in a machine dependent fashion.
+ */
+
+#include <pthread_internals.h>
+#include <stdio.h>
+
+int
+main(void)
+{
+       printf("#ifndef _PTHREAD_IMPL_H_\n");
+        printf("#define _PTHREAD_IMPL_H_\n");
+        printf("/*\n");
+       printf(" * Internal implementation details\n");
+       printf(" */\n");
+       printf("\n");
+       printf("#define __PTHREAD_SIZE__           %ld\n", (long) sizeof(struct _pthread)-sizeof(long));
+       printf("#define __PTHREAD_ATTR_SIZE__      %ld\n", (long) sizeof(pthread_attr_t)-sizeof(long));
+       printf("#define __PTHREAD_MUTEXATTR_SIZE__ %ld\n", (long) sizeof(pthread_mutexattr_t)-sizeof(long));
+       printf("#define __PTHREAD_MUTEX_SIZE__     %ld\n", (long) sizeof(pthread_mutex_t)-sizeof(long));
+       printf("#define __PTHREAD_CONDATTR_SIZE__  %ld\n", (long) sizeof(pthread_condattr_t)-sizeof(long));
+       printf("#define __PTHREAD_COND_SIZE__      %ld\n", (long) sizeof(pthread_cond_t)-sizeof(long));
+       printf("#define __PTHREAD_ONCE_SIZE__      %ld\n", (long) sizeof(pthread_once_t)-sizeof(long));
+       printf("/*\n");
+       printf(" * [Internal] data structure signatures\n");
+       printf(" */\n");
+       printf("#define _PTHREAD_MUTEX_SIG_init         0x%08X\n", _PTHREAD_MUTEX_SIG_init);
+       printf("#define _PTHREAD_COND_SIG_init          0x%08X\n", _PTHREAD_COND_SIG_init);
+       printf("#define _PTHREAD_ONCE_SIG_init          0x%08X\n", _PTHREAD_ONCE_SIG_init);
+       printf("/*\n");
+       printf(" * POSIX scheduling policies \n");
+       printf(" */\n");
+        printf("#define SCHED_OTHER                %d\n", SCHED_OTHER);
+        printf("#define SCHED_FIFO                 %d\n", SCHED_FIFO);
+        printf("#define SCHED_RR                   %d\n", SCHED_RR);
+       printf("\n");
+       printf("#define __SCHED_PARAM_SIZE__       %ld\n", (long) sizeof(struct sched_param)-sizeof(int));
+        printf("\n");
+        printf("#endif _PTHREAD_IMPL_H_\n");
+
+       exit(0);
+} 
diff --git a/pthreads.subproj/posix_sched.h b/pthreads.subproj/posix_sched.h
new file mode 100644 (file)
index 0000000..b9badf1
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Realtime Scheduling Framework - IEEE 1003.1b
+ */
+
+#ifndef _POSIX_SCHED_H
+#define _POSIX_SCHED_H
+
+struct sched_param
+{
+       int sched_priority;
+       int quantum;
+};
+
+/*
+ * POSIX scheduling policies 
+ */
+
+#define SCHED_OTHER      POLICY_TIMESHARE
+#define SCHED_FIFO       POLICY_FIFO
+#define SCHED_RR         POLICY_RR
+
+#endif /* _POSIX_SCHED_H */
diff --git a/pthreads.subproj/pthread.c b/pthreads.subproj/pthread.c
new file mode 100644 (file)
index 0000000..ddf28a8
--- /dev/null
@@ -0,0 +1,1278 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Pthread Library
+ */
+
+#define __POSIX_LIB__
+#include <assert.h>
+#include <stdio.h>     /* For printf(). */
+#include <stdlib.h>
+#include <errno.h>     /* For __mach_errno_addr() prototype. */
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/sysctl.h>
+#include <machine/vmparam.h>
+#include <mach/vm_statistics.h>
+
+#include "pthread_internals.h"
+
+/* Per-thread kernel support */
+extern void _pthread_set_self(pthread_t);
+extern void mig_init(int);
+
+/* Needed to tell the malloc subsystem we're going multithreaded */
+extern void set_malloc_singlethreaded(int);
+
+/* Used when we need to call into the kernel with no reply port */
+extern pthread_lock_t reply_port_lock;
+
+/*
+ * [Internal] stack support
+ */
+
+size_t _pthread_stack_size = 0;
+int _spin_tries = 1;
+int _cpu_has_altivec = 0;
+
+/* This global should be used (carefully) by anyone needing to know if a pthread has been
+** created.
+*/
+int __is_threaded = 0;
+
+/* These are used to keep track of a semaphore pool shared by mutexes and condition
+** variables.
+*/
+
+static semaphore_t *sem_pool = NULL;
+static int sem_pool_count = 0;
+static int sem_pool_current = 0;
+static pthread_lock_t sem_pool_lock = LOCK_INITIALIZER;
+
+static int default_priority;
+static int max_priority;
+static int min_priority;
+
+extern mach_port_t thread_recycle_port;
+
+#define STACK_LOWEST(sp)       ((sp) & ~__pthread_stack_mask)
+#define STACK_RESERVED         (sizeof (struct _pthread))
+
+#ifdef STACK_GROWS_UP
+
+/* The stack grows towards higher addresses:
+   |struct _pthread|user stack---------------->|
+   ^STACK_BASE     ^STACK_START
+   ^STACK_SELF
+   ^STACK_LOWEST  */
+#define STACK_BASE(sp)         STACK_LOWEST(sp)
+#define STACK_START(stack_low) (STACK_BASE(stack_low) + STACK_RESERVED)
+#define STACK_SELF(sp)         STACK_BASE(sp)
+
+#else
+
+/* The stack grows towards lower addresses:
+   |<----------------user stack|struct _pthread|
+   ^STACK_LOWEST               ^STACK_START    ^STACK_BASE
+                              ^STACK_SELF  */
+
+#define STACK_BASE(sp)         (((sp) | __pthread_stack_mask) + 1)
+#define STACK_START(stack_low) (STACK_BASE(stack_low) - STACK_RESERVED)
+#define STACK_SELF(sp)         STACK_START(sp)
+
+#endif
+
+/* This is the struct used to recycle (or terminate) a thread */
+/* We stash the thread port into the reply port of the message */
+
+typedef struct {
+       mach_msg_header_t header;
+       mach_msg_trailer_t trailer;
+} recycle_msg_t;
+
+/* Set the base address to use as the stack pointer, before adjusting due to the ABI */
+
+static int
+_pthread_allocate_stack(pthread_attr_t *attrs, vm_address_t *stack)
+{
+    kern_return_t kr;
+#if 1
+    assert(attrs->stacksize >= PTHREAD_STACK_MIN);
+    if (attrs->stackaddr != NULL) {
+        assert(((vm_offset_t)(attrs->stackaddr) & (vm_page_size - 1)) == 0);
+        *stack = (vm_address_t)attrs->stackaddr;
+        return 0;
+    }
+    kr = vm_allocate(mach_task_self(), stack, attrs->stacksize + vm_page_size, VM_MAKE_TAG(VM_MEMORY_STACK)| TRUE);
+    if (kr != KERN_SUCCESS) {
+        return EAGAIN;
+    }
+#ifdef STACK_GROWS_UP
+    /* The guard page is the page one higher than the stack */
+    /* The stack base is at the lowest address */
+    kr = vm_protect(mach_task_self(), *stack + attrs->stacksize, vm_page_size, FALSE, VM_PROT_NONE);
+#else
+    /* The guard page is at the lowest address */
+    /* The stack base is the highest address */
+    kr = vm_protect(mach_task_self(), *stack, vm_page_size, FALSE, VM_PROT_NONE);
+    *stack += attrs->stacksize + vm_page_size;
+#endif
+
+#else
+    vm_address_t cur_stack = (vm_address_t)0;
+       if (free_stacks == 0)
+       {
+           /* Allocating guard pages is done by doubling
+            * the actual stack size, since STACK_BASE() needs
+            * to have stacks aligned on stack_size. Allocating just 
+            * one page takes as much memory as allocating more pages
+            * since it will remain one entry in the vm map.
+            * Besides, allocating more than one page allows tracking the
+            * overflow pattern when the overflow is bigger than one page.
+            */
+#ifndef        NO_GUARD_PAGES
+# define       GUARD_SIZE(a)   (2*(a))
+# define       GUARD_MASK(a)   (((a)<<1) | 1)
+#else
+# define       GUARD_SIZE(a)   (a)
+# define       GUARD_MASK(a)   (a)
+#endif
+               while (lowest_stack > GUARD_SIZE(__pthread_stack_size))
+               {
+                       lowest_stack -= GUARD_SIZE(__pthread_stack_size);
+                       /* Ensure stack is there */
+                       kr = vm_allocate(mach_task_self(),
+                                        &lowest_stack,
+                                        GUARD_SIZE(__pthread_stack_size),
+                                        FALSE);
+#ifndef        NO_GUARD_PAGES
+                       if (kr == KERN_SUCCESS) {
+# ifdef        STACK_GROWS_UP
+                           kr = vm_protect(mach_task_self(),
+                                           lowest_stack+__pthread_stack_size,
+                                           __pthread_stack_size,
+                                           FALSE, VM_PROT_NONE);
+# else /* STACK_GROWS_UP */
+                           kr = vm_protect(mach_task_self(),
+                                           lowest_stack,
+                                           __pthread_stack_size,
+                                           FALSE, VM_PROT_NONE);
+                           lowest_stack += __pthread_stack_size;
+# endif        /* STACK_GROWS_UP */
+                           if (kr == KERN_SUCCESS)
+                               break;
+                       }
+#else
+                       if (kr == KERN_SUCCESS)
+                           break;
+#endif
+               }
+               if (lowest_stack > 0)
+                       free_stacks = (vm_address_t *)lowest_stack;
+               else
+               {
+                       /* Too bad.  We'll just have to take what comes.
+                          Use vm_map instead of vm_allocate so we can
+                          specify alignment.  */
+                       kr = vm_map(mach_task_self(), &lowest_stack,
+                                   GUARD_SIZE(__pthread_stack_size),
+                                   GUARD_MASK(__pthread_stack_mask),
+                                   TRUE /* anywhere */, MEMORY_OBJECT_NULL,
+                                   0, FALSE, VM_PROT_DEFAULT, VM_PROT_ALL,
+                                   VM_INHERIT_DEFAULT);
+                       /* This really shouldn't fail and if it does I don't
+                          know what to do.  */
+#ifndef        NO_GUARD_PAGES
+                       if (kr == KERN_SUCCESS) {
+# ifdef        STACK_GROWS_UP
+                           kr = vm_protect(mach_task_self(),
+                                           lowest_stack+__pthread_stack_size,
+                                           __pthread_stack_size,
+                                           FALSE, VM_PROT_NONE);
+# else /* STACK_GROWS_UP */
+                           kr = vm_protect(mach_task_self(),
+                                           lowest_stack,
+                                           __pthread_stack_size,
+                                           FALSE, VM_PROT_NONE);
+                           lowest_stack += __pthread_stack_size;
+# endif        /* STACK_GROWS_UP */
+                       }
+#endif
+                       free_stacks = (vm_address_t *)lowest_stack;
+                       lowest_stack = 0;
+               }
+               *free_stacks = 0; /* No other free stacks */
+       }
+       cur_stack = STACK_START((vm_address_t) free_stacks);
+       free_stacks = (vm_address_t *)*free_stacks;
+       cur_stack = _adjust_sp(cur_stack); /* Machine dependent stack fudging */
+#endif
+        return 0;
+}
+
+/*
+ * Destroy a thread attribute structure
+ */
+int       
+pthread_attr_destroy(pthread_attr_t *attr)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               return (ESUCCESS);
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Get the 'detach' state from a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_getdetachstate(const pthread_attr_t *attr, 
+                           int *detachstate)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               *detachstate = attr->detached;
+               return (ESUCCESS);
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Get the 'inherit scheduling' info from a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_getinheritsched(const pthread_attr_t *attr, 
+                            int *inheritsched)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               *inheritsched = attr->inherit;
+               return (ESUCCESS);
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Get the scheduling parameters from a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_getschedparam(const pthread_attr_t *attr, 
+                          struct sched_param *param)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               *param = attr->param;
+               return (ESUCCESS);
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Get the scheduling policy from a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_getschedpolicy(const pthread_attr_t *attr, 
+                           int *policy)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               *policy = attr->policy;
+               return (ESUCCESS);
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+static const size_t DEFAULT_STACK_SIZE = DFLSSIZ;
+/*
+ * Initialize a thread attribute structure to default values.
+ */
+int       
+pthread_attr_init(pthread_attr_t *attr)
+{
+        attr->stacksize = DEFAULT_STACK_SIZE;
+        attr->stackaddr = NULL;
+       attr->sig = _PTHREAD_ATTR_SIG;
+       attr->policy = _PTHREAD_DEFAULT_POLICY;
+       attr->param.sched_priority = default_priority;
+       attr->param.quantum = 10; /* quantum isn't public yet */
+       attr->inherit = _PTHREAD_DEFAULT_INHERITSCHED;
+       attr->detached = PTHREAD_CREATE_JOINABLE;
+        attr->freeStackOnExit = TRUE;
+       return (ESUCCESS);
+}
+
+/*
+ * Set the 'detach' state in a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_setdetachstate(pthread_attr_t *attr, 
+                           int detachstate)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               if ((detachstate == PTHREAD_CREATE_JOINABLE) ||
+                   (detachstate == PTHREAD_CREATE_DETACHED))
+               {
+                       attr->detached = detachstate;
+                       return (ESUCCESS);
+               } else
+               {
+                       return (EINVAL);
+               }
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Set the 'inherit scheduling' state in a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_setinheritsched(pthread_attr_t *attr, 
+                            int inheritsched)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               if ((inheritsched == PTHREAD_INHERIT_SCHED) ||
+                   (inheritsched == PTHREAD_EXPLICIT_SCHED))
+               {
+                       attr->inherit = inheritsched;
+                       return (ESUCCESS);
+               } else
+               {
+                       return (EINVAL);
+               }
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Set the scheduling paramters in a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_setschedparam(pthread_attr_t *attr, 
+                          const struct sched_param *param)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               /* TODO: Validate sched_param fields */
+               attr->param = *param;
+               return (ESUCCESS);
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Set the scheduling policy in a thread attribute structure.
+ * Note: written as a helper function for info hiding
+ */
+int       
+pthread_attr_setschedpolicy(pthread_attr_t *attr, 
+                           int policy)
+{
+       if (attr->sig == _PTHREAD_ATTR_SIG)
+       {
+               if ((policy == SCHED_OTHER) ||
+                   (policy == SCHED_RR) ||
+                   (policy == SCHED_FIFO))
+               {
+                       attr->policy = policy;
+                       return (ESUCCESS);
+               } else
+               {
+                       return (EINVAL);
+               }
+       } else
+       {
+               return (EINVAL); /* Not an attribute structure! */
+       }
+}
+
+/*
+ * Set the scope for the thread.
+ * We currently only provide PTHREAD_SCOPE_SYSTEM
+ */
+int
+pthread_attr_setscope(pthread_attr_t *attr,
+                            int scope)
+{
+    if (attr->sig == _PTHREAD_ATTR_SIG) {
+        if (scope == PTHREAD_SCOPE_SYSTEM) {
+            /* No attribute yet for the scope */
+            return (ESUCCESS);
+        } else if (scope == PTHREAD_SCOPE_PROCESS) {
+            return (ENOTSUP);
+        }
+    }
+    return (EINVAL); /* Not an attribute structure! */
+}
+
+/*
+ * Get the scope for the thread.
+ * We currently only provide PTHREAD_SCOPE_SYSTEM
+ */
+int
+pthread_attr_getscope(pthread_attr_t *attr,
+                            int *scope)
+{
+    if (attr->sig == _PTHREAD_ATTR_SIG) {
+        *scope = PTHREAD_SCOPE_SYSTEM;
+        return (ESUCCESS);
+    }
+    return (EINVAL); /* Not an attribute structure! */
+}
+
+/* Get the base stack address of the given thread */
+int
+pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr)
+{
+    if (attr->sig == _PTHREAD_ATTR_SIG) {
+        *stackaddr = attr->stackaddr;
+        return (ESUCCESS);
+    } else {
+        return (EINVAL); /* Not an attribute structure! */
+    }
+}
+
+int
+pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr)
+{
+    if ((attr->sig == _PTHREAD_ATTR_SIG) && (((vm_offset_t)stackaddr & (vm_page_size - 1)) == 0)) {
+        attr->stackaddr = stackaddr;
+        attr->freeStackOnExit = FALSE;
+        return (ESUCCESS);
+    } else {
+        return (EINVAL); /* Not an attribute structure! */
+    }
+}
+
+int
+pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize)
+{
+    if (attr->sig == _PTHREAD_ATTR_SIG) {
+        *stacksize = attr->stacksize;
+        return (ESUCCESS);
+    } else {
+        return (EINVAL); /* Not an attribute structure! */
+    }
+}
+
+int
+pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
+{
+    if ((attr->sig == _PTHREAD_ATTR_SIG) && ((stacksize % vm_page_size) == 0) && (stacksize >= PTHREAD_STACK_MIN)) {
+        attr->stacksize = stacksize;
+        return (ESUCCESS);
+    } else {
+        return (EINVAL); /* Not an attribute structure! */
+    }
+}
+
+pthread_t _cachedThread = (pthread_t)0;
+
+void _clear_thread_cache(void) {
+    _cachedThread = (pthread_t)0;
+}
+
+/*
+ * Create and start execution of a new thread.
+ */
+
+static void
+_pthread_body(pthread_t self)
+{
+    _clear_thread_cache();
+    _pthread_set_self(self);
+    pthread_exit((self->fun)(self->arg));
+}
+
+int
+_pthread_create(pthread_t t,
+               const pthread_attr_t *attrs,
+                vm_address_t stack,
+               const mach_port_t kernel_thread)
+{
+       int res;
+       kern_return_t kern_res;
+       res = ESUCCESS;
+       do
+       {
+               memset(t, 0, sizeof(*t));
+               t->stacksize = attrs->stacksize;
+                t->stackaddr = (void *)stack;
+                t->kernel_thread = kernel_thread;
+               t->detached = attrs->detached;
+               t->inherit = attrs->inherit;
+               t->policy = attrs->policy;
+               t->param = attrs->param;
+                t->freeStackOnExit = attrs->freeStackOnExit;
+               t->mutexes = (struct _pthread_mutex *)NULL;
+               t->sig = _PTHREAD_SIG;
+                t->reply_port = MACH_PORT_NULL;
+                t->cthread_self = NULL;
+               LOCK_INIT(t->lock);
+               t->cancel_state = PTHREAD_CANCEL_ENABLE | PTHREAD_CANCEL_DEFERRED;
+               t->cleanup_stack = (struct _pthread_handler_rec *)NULL;
+               pthread_setschedparam(t, t->policy, &t->param);
+               /* Create control semaphores */
+               if (t->detached == PTHREAD_CREATE_JOINABLE)
+               {
+                       PTHREAD_MACH_CALL(semaphore_create(mach_task_self(), 
+                                                  &t->death, 
+                                                  SYNC_POLICY_FIFO, 
+                                                  0), kern_res);
+                       if (kern_res != KERN_SUCCESS)
+                       {
+                               printf("Can't create 'death' semaphore: %d\n", kern_res);
+                               res = EINVAL; /* Need better error here? */
+                               break;
+                       }
+                       PTHREAD_MACH_CALL(semaphore_create(mach_task_self(), 
+                                                  &t->joiners, 
+                                                  SYNC_POLICY_FIFO, 
+                                                  0), kern_res);
+                       if (kern_res != KERN_SUCCESS)
+                       {
+                               printf("Can't create 'joiners' semaphore: %d\n", kern_res);
+                               res = EINVAL; /* Need better error here? */
+                               break;
+                       }
+                       t->num_joiners = 0;
+               } else
+               {
+                       t->death = MACH_PORT_NULL;
+               }
+       } while (0);
+       return (res);
+}
+
+int
+_pthread_is_threaded(void)
+{
+    return __is_threaded;
+}
+
+mach_port_t
+pthread_mach_thread_np(pthread_t t)
+{
+    return t->kernel_thread;
+}
+
+size_t
+pthread_get_stacksize_np(pthread_t t)
+{
+    return t->stacksize;
+}
+
+void *
+pthread_get_stackaddr_np(pthread_t t)
+{
+    return t->stackaddr;
+}
+
+mach_port_t
+_pthread_reply_port(pthread_t t)
+{
+    return t->reply_port;
+}
+
+static int       
+_pthread_create_suspended(pthread_t *thread, 
+              const pthread_attr_t *attr,
+              void *(*start_routine)(void *), 
+              void *arg,
+           int suspended)
+{
+       pthread_attr_t _attr, *attrs;
+       vm_address_t stack;
+       int res;
+       pthread_t t;
+       kern_return_t kern_res;
+       mach_port_t kernel_thread;
+       if ((attrs = (pthread_attr_t *)attr) == (pthread_attr_t *)NULL)
+       {                       /* Set up default paramters */
+               attrs = &_attr;
+               pthread_attr_init(attrs);
+        } else if (attrs->sig != _PTHREAD_ATTR_SIG) {
+            return EINVAL;
+        }
+       res = ESUCCESS;
+       do
+       {
+               /* Allocate a stack for the thread */
+                if ((res = _pthread_allocate_stack(attrs, &stack)) != 0) {
+                    break;
+                }
+               t = (pthread_t)malloc(sizeof(struct _pthread));
+               *thread = t;
+               /* Create the Mach thread for this thread */
+               PTHREAD_MACH_CALL(thread_create(mach_task_self(), &kernel_thread), kern_res);
+               if (kern_res != KERN_SUCCESS)
+               {
+                       printf("Can't create thread: %d\n", kern_res);
+                       res = EINVAL; /* Need better error here? */
+                       break;
+               }
+                if ((res = _pthread_create(t, attrs, stack, kernel_thread)) != 0)
+               {
+                       break;
+               }
+               t->arg = arg;
+               t->fun = start_routine;
+               /* Now set it up to execute */
+               _pthread_setup(t, _pthread_body, stack);
+               /* Send it on it's way */
+                set_malloc_singlethreaded(0);
+               __is_threaded = 1;
+        if (suspended == 0) {
+            PTHREAD_MACH_CALL(thread_resume(kernel_thread), kern_res);
+        }
+               if (kern_res != KERN_SUCCESS)
+               {
+                       printf("Can't resume thread: %d\n", kern_res);
+                       res = EINVAL; /* Need better error here? */
+                       break;
+               }
+       } while (0);
+       return (res);
+}
+
+int
+pthread_create(pthread_t *thread,
+           const pthread_attr_t *attr,
+           void *(*start_routine)(void *),
+           void *arg)
+{
+    return _pthread_create_suspended(thread, attr, start_routine, arg, 0);
+}
+
+int
+pthread_create_suspended_np(pthread_t *thread,
+           const pthread_attr_t *attr,
+           void *(*start_routine)(void *),
+           void *arg)
+{
+    return _pthread_create_suspended(thread, attr, start_routine, arg, 1);
+}
+
+/*
+ * Make a thread 'undetached' - no longer 'joinable' with other threads.
+ */
+int       
+pthread_detach(pthread_t thread)
+{
+       kern_return_t kern_res;
+       int num_joiners;
+       mach_port_t death;
+       if (thread->sig == _PTHREAD_SIG)
+       {
+               LOCK(thread->lock);
+               if (thread->detached == PTHREAD_CREATE_JOINABLE)
+               {
+                       thread->detached = PTHREAD_CREATE_DETACHED;
+                       num_joiners = thread->num_joiners;
+                       death = thread->death;
+                       thread->death = MACH_PORT_NULL;
+                       UNLOCK(thread->lock);
+                       if (num_joiners > 0)
+                       { /* Have to tell these guys this thread can't be joined with */
+                               swtch_pri(0);
+                               PTHREAD_MACH_CALL(semaphore_signal_all(thread->joiners), kern_res);
+                       }
+                       /* Destroy 'control' semaphores */
+                       PTHREAD_MACH_CALL(semaphore_destroy(mach_task_self(),
+                                                   thread->joiners), kern_res);
+                       PTHREAD_MACH_CALL(semaphore_destroy(mach_task_self(),
+                                                   death), kern_res);
+                       return (ESUCCESS);
+               } else
+               {
+                       UNLOCK(thread->lock);
+                       return (EINVAL);
+               }
+       } else
+       {
+               return (ESRCH); /* Not a valid thread */
+       }
+}
+
+/* Announce that there is a thread ready to be reclaimed for pthread_create */
+/* or terminated by pthread_exit. If the thread is reused, it will have its */
+/* thread state set and will continue in the thread body function. If it is */
+/* terminated, it will be yanked out from under the mach_msg() call. */
+
+static void _pthread_become_available(pthread_t thread) {
+       recycle_msg_t msg = { { 0 } };
+       kern_return_t ret;
+
+       msg.header.msgh_size = sizeof msg - sizeof msg.trailer;
+       msg.header.msgh_remote_port = thread_recycle_port;
+       msg.header.msgh_local_port = MACH_PORT_NULL; 
+       msg.header.msgh_id = (int)thread;
+       msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
+       ret = mach_msg(&msg.header, MACH_SEND_MSG, msg.header.msgh_size, 0,
+                       MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE,
+                       MACH_PORT_NULL);
+       while (1) {
+               ret = thread_suspend(thread->kernel_thread);
+       }
+       /* We should never get here */
+}
+
+/* Check to see if any threads are available. Return immediately */
+
+static kern_return_t _pthread_check_for_available_threads(recycle_msg_t *msg) {
+       return mach_msg(&msg->header, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0,
+                       sizeof(recycle_msg_t), thread_recycle_port, 0,
+                       MACH_PORT_NULL);
+}
+
+/* Terminate all available threads and deallocate their stacks */
+static void _pthread_reap_threads(void) {
+       kern_return_t ret;
+       recycle_msg_t msg = { { 0 } };
+       while(_pthread_check_for_available_threads(&msg) == KERN_SUCCESS) {
+               pthread_t th = (pthread_t)msg.header.msgh_id;
+               mach_port_t kernel_thread = th->kernel_thread;
+               mach_port_t reply_port = th->reply_port; 
+               vm_size_t size = (vm_size_t)th->stacksize + vm_page_size;
+               vm_address_t addr = (vm_address_t)th->stackaddr;
+#if !defined(STACK_GROWS_UP)
+               addr -= size;
+#endif
+               ret = thread_terminate(kernel_thread);
+               if (ret != KERN_SUCCESS) {
+                       fprintf(stderr, "thread_terminate() failed: %s\n",
+                               mach_error_string(ret));
+               }
+               ret = mach_port_destroy(mach_task_self(), reply_port);
+               if (ret != KERN_SUCCESS) {
+                       fprintf(stderr,
+                               "mach_port_destroy(thread_reply) failed: %s\n",
+                               mach_error_string(ret));
+               }
+               if (th->freeStackOnExit) {
+                       ret = vm_deallocate(mach_task_self(), addr, size);
+                       if (ret != KERN_SUCCESS) {
+                               fprintf(stderr,
+                                       "vm_deallocate(stack) failed: %s\n",
+                                       mach_error_string(ret));
+                       }
+               }
+               free(th);
+       }
+}
+
+
+static void *
+stackAddress(void)
+{
+    unsigned dummy;
+    return (void *)((unsigned)&dummy & ~ (PTHREAD_STACK_MIN - 1));
+}
+
+extern pthread_t _pthread_self(void);
+
+pthread_t
+pthread_self(void)
+{
+    void * myStack = (void *)0;
+    pthread_t cachedThread = _cachedThread;
+    if (cachedThread) {
+        myStack = stackAddress();
+        if ((void *)((unsigned)(cachedThread->stackaddr - 1) & ~ (PTHREAD_STACK_MIN - 1)) == myStack) {
+            return cachedThread;
+        }
+    }
+    _cachedThread = _pthread_self();
+    return _cachedThread;
+}
+
+/*
+ * Terminate a thread.
+ */
+void 
+pthread_exit(void *value_ptr)
+{
+       pthread_t self = pthread_self();
+        struct _pthread_handler_rec *handler;
+       kern_return_t kern_res;
+       int num_joiners;
+    _clear_thread_cache();
+       while ((handler = self->cleanup_stack) != 0)
+       {
+               (handler->routine)(handler->arg);
+               self->cleanup_stack = handler->next;
+       }
+       _pthread_tsd_cleanup(self);
+       LOCK(self->lock);
+       if (self->detached == PTHREAD_CREATE_JOINABLE)
+       {
+               self->detached = _PTHREAD_EXITED;
+               self->exit_value = value_ptr;
+               num_joiners = self->num_joiners;
+               UNLOCK(self->lock);
+               if (num_joiners > 0)
+               {
+                       swtch_pri(0);
+                       PTHREAD_MACH_CALL(semaphore_signal_all(self->joiners), kern_res);
+               }
+               PTHREAD_MACH_CALL(semaphore_wait(self->death), kern_res);
+       } else
+               UNLOCK(self->lock);
+       /* Destroy thread & reclaim resources */
+       if (self->death)
+       {
+               PTHREAD_MACH_CALL(semaphore_destroy(mach_task_self(), self->joiners), kern_res);
+               PTHREAD_MACH_CALL(semaphore_destroy(mach_task_self(), self->death), kern_res);
+       }
+        if (self->detached == _PTHREAD_CREATE_PARENT) {
+               exit((int)(self->exit_value));
+       }
+
+       _pthread_reap_threads();
+        
+       _pthread_become_available(self);
+}
+
+/*
+ * Wait for a thread to terminate and obtain its exit value.
+ */
+int       
+pthread_join(pthread_t thread, 
+            void **value_ptr)
+{
+       kern_return_t kern_res;
+       if (thread->sig == _PTHREAD_SIG)
+       {
+               LOCK(thread->lock);
+               if (thread->detached == PTHREAD_CREATE_JOINABLE)
+               {
+                       thread->num_joiners++;
+                       UNLOCK(thread->lock);
+                       PTHREAD_MACH_CALL(semaphore_wait(thread->joiners), kern_res);
+                       LOCK(thread->lock);
+                       thread->num_joiners--;
+               }
+               if (thread->detached == _PTHREAD_EXITED)
+               {
+                       if (thread->num_joiners == 0)
+                       {       /* Give the result to this thread */
+                               if (value_ptr)
+                               {
+                                       *value_ptr = thread->exit_value;
+                               }
+                               UNLOCK(thread->lock);
+                               swtch_pri(0);
+                               PTHREAD_MACH_CALL(semaphore_signal(thread->death), kern_res);
+                               return (ESUCCESS);
+                       } else
+                       {       /* This 'joiner' missed the catch! */
+                               UNLOCK(thread->lock);
+                               return (ESRCH);
+                       }
+               } else
+               {               /* The thread has become anti-social! */
+                       UNLOCK(thread->lock);
+                       return (EINVAL);
+               }
+       } else
+       {
+               return (ESRCH); /* Not a valid thread */
+       }
+}
+
+/*
+ * Get the scheduling policy and scheduling paramters for a thread.
+ */
+int       
+pthread_getschedparam(pthread_t thread, 
+                     int *policy,
+                     struct sched_param *param)
+{
+       if (thread->sig == _PTHREAD_SIG)
+       {
+            *policy = thread->policy;
+            *param = thread->param;
+            return (ESUCCESS);
+       } else
+       {
+               return (ESRCH);  /* Not a valid thread structure */
+       }
+}
+
+/*
+ * Set the scheduling policy and scheduling paramters for a thread.
+ */
+int       
+pthread_setschedparam(pthread_t thread, 
+                     int policy,
+                     const struct sched_param *param)
+{
+       policy_base_data_t bases;
+       policy_base_t base;
+       mach_msg_type_number_t count;
+       kern_return_t ret;
+
+       if (thread->sig == _PTHREAD_SIG)
+       {
+               switch (policy)
+               {
+               case SCHED_OTHER:
+                       bases.ts.base_priority = param->sched_priority;
+                       base = (policy_base_t)&bases.ts;
+                       count = POLICY_TIMESHARE_BASE_COUNT;
+                       break;
+               case SCHED_FIFO:
+                       bases.fifo.base_priority = param->sched_priority;
+                       base = (policy_base_t)&bases.fifo;
+                       count = POLICY_FIFO_BASE_COUNT;
+                       break;
+               case SCHED_RR:
+                       bases.rr.base_priority = param->sched_priority;
+                       /* quantum isn't public yet */
+                       bases.rr.quantum = param->quantum;
+                       base = (policy_base_t)&bases.rr;
+                       count = POLICY_RR_BASE_COUNT;
+                       break;
+               default:
+                       return (EINVAL);
+               }
+            thread->policy = policy;
+            thread->param = *param;
+               ret = thread_policy(thread->kernel_thread, policy, base, count, TRUE);
+               if (ret != KERN_SUCCESS)
+               {
+                       return (EINVAL);
+               }
+               return (ESUCCESS);
+       } else
+       {
+               return (ESRCH);  /* Not a valid thread structure */
+       }
+}
+
+/*
+ * Get the minimum priority for the given policy
+ */
+int
+sched_get_priority_min(int policy)
+{
+    return default_priority - 16;
+}
+
+/*
+ * Get the maximum priority for the given policy
+ */
+int
+sched_get_priority_max(int policy)
+{
+    return default_priority + 16;
+}
+
+/*
+ * Determine if two thread identifiers represent the same thread.
+ */
+int       
+pthread_equal(pthread_t t1, 
+             pthread_t t2)
+{
+       return (t1 == t2);
+}
+
+void 
+cthread_set_self(void *cself)
+{
+    pthread_t self = pthread_self();
+    if ((self == (pthread_t)NULL) || (self->sig != _PTHREAD_SIG)) {
+        _pthread_set_self(cself);
+        return;
+    }
+    self->cthread_self = cself;
+}
+
+void *
+ur_cthread_self(void) {
+    pthread_t self = pthread_self();
+    if ((self == (pthread_t)NULL) || (self->sig != _PTHREAD_SIG)) {
+        return (void *)self;
+    }
+    return self->cthread_self;
+}
+
+/*
+ * Execute a function exactly one time in a thread-safe fashion.
+ */
+int       
+pthread_once(pthread_once_t *once_control, 
+            void (*init_routine)(void))
+{
+       LOCK(once_control->lock);
+       if (once_control->sig == _PTHREAD_ONCE_SIG_init)
+       {
+               (*init_routine)();
+               once_control->sig = _PTHREAD_ONCE_SIG;
+       }
+       UNLOCK(once_control->lock);
+       return (ESUCCESS);  /* Spec defines no possible errors! */
+}
+
+/*
+ * Cancel a thread
+ */
+int
+pthread_cancel(pthread_t thread)
+{
+       if (thread->sig == _PTHREAD_SIG)
+       {
+               thread->cancel_state |= _PTHREAD_CANCEL_PENDING;
+               return (ESUCCESS);
+       } else
+       {
+               return (ESRCH);
+       }
+}
+
+/*
+ * Insert a cancellation point in a thread.
+ */
+static void
+_pthread_testcancel(pthread_t thread)
+{
+       LOCK(thread->lock);
+       if ((thread->cancel_state & (PTHREAD_CANCEL_ENABLE|_PTHREAD_CANCEL_PENDING)) == 
+           (PTHREAD_CANCEL_ENABLE|_PTHREAD_CANCEL_PENDING))
+       {
+               UNLOCK(thread->lock);
+               pthread_exit(0);
+       }
+       UNLOCK(thread->lock);
+}
+
+void
+pthread_testcancel(void)
+{
+       pthread_t self = pthread_self();
+       _pthread_testcancel(self);
+}
+
+/*
+ * Query/update the cancelability 'state' of a thread
+ */
+int
+pthread_setcancelstate(int state, int *oldstate)
+{
+       pthread_t self = pthread_self();
+       int err = ESUCCESS;
+       LOCK(self->lock);
+       *oldstate = self->cancel_state & _PTHREAD_CANCEL_STATE_MASK;
+       if ((state == PTHREAD_CANCEL_ENABLE) || (state == PTHREAD_CANCEL_DISABLE))
+       {
+               self->cancel_state = (self->cancel_state & _PTHREAD_CANCEL_STATE_MASK) | state;
+       } else
+       {
+               err = EINVAL;
+       }
+       UNLOCK(self->lock);
+       _pthread_testcancel(self);  /* See if we need to 'die' now... */
+       return (err);
+}
+
+/*
+ * Query/update the cancelability 'type' of a thread
+ */
+int
+pthread_setcanceltype(int type, int *oldtype)
+{
+       pthread_t self = pthread_self();
+       int err = ESUCCESS;
+       LOCK(self->lock);
+       *oldtype = self->cancel_state & _PTHREAD_CANCEL_TYPE_MASK;
+       if ((type == PTHREAD_CANCEL_DEFERRED) || (type == PTHREAD_CANCEL_ASYNCHRONOUS))
+       {
+               self->cancel_state = (self->cancel_state & _PTHREAD_CANCEL_TYPE_MASK) | type;
+       } else
+       {
+               err = EINVAL;
+       }
+       UNLOCK(self->lock);
+       _pthread_testcancel(self);  /* See if we need to 'die' now... */
+       return (err);
+}
+
+/*
+ * Perform package initialization - called automatically when application starts
+ */
+
+/* We'll implement this when the main thread is a pthread */
+/* Use the local _pthread struct to avoid malloc before our MiG reply port is set */
+
+static struct _pthread _thread = {0};
+
+static int
+pthread_init(void)
+{
+       pthread_attr_t _attr, *attrs;
+        pthread_t thread;
+       kern_return_t kr;
+       host_basic_info_data_t basic_info;
+       host_priority_info_data_t priority_info;
+       host_info_t info;
+       host_flavor_t flavor;
+       mach_msg_type_number_t count;
+       int mib[2];
+       size_t len;
+       int hasvectorunit, numcpus;
+
+        count = HOST_PRIORITY_INFO_COUNT;
+       info = (host_info_t)&priority_info;
+       flavor = HOST_PRIORITY_INFO;
+       kr = host_info(mach_host_self(), flavor, info, &count);
+        if (kr != KERN_SUCCESS)
+                printf("host_info failed (%d); probably need privilege.\n", kr);
+        else {
+               default_priority = priority_info.user_priority;
+            min_priority = priority_info.minimum_priority;
+            max_priority = priority_info.maximum_priority;
+       }
+       attrs = &_attr;
+       pthread_attr_init(attrs);
+    _clear_thread_cache();
+    _pthread_set_self(&_thread);
+
+        _pthread_create(&_thread, attrs, USRSTACK, mach_thread_self());
+        thread = (pthread_t)malloc(sizeof(struct _pthread));
+       memcpy(thread, &_thread, sizeof(struct _pthread));
+    _clear_thread_cache();
+        _pthread_set_self(thread);
+        thread->detached = _PTHREAD_CREATE_PARENT;
+
+        /* See if we're on a multiprocessor and set _spin_tries if so.  */
+       mib[0] = CTL_HW;
+       mib[1] = HW_NCPU;
+       len = sizeof(numcpus);
+       if (sysctl(mib, 2, &numcpus, &len, NULL, 0) == 0) {
+               if (numcpus > 1) {
+                       _spin_tries = SPIN_TRIES;
+               }
+       } else {
+               count = HOST_BASIC_INFO_COUNT;
+               info = (host_info_t)&basic_info;
+               flavor = HOST_BASIC_INFO;
+               kr = host_info(mach_host_self(), flavor, info, &count);
+               if (kr != KERN_SUCCESS)
+                       printf("host_info failed (%d)\n", kr);
+               else {
+                       if (basic_info.avail_cpus > 1)
+                               _spin_tries = SPIN_TRIES;
+                       /* This is a crude test */
+                       if (basic_info.cpu_subtype >= CPU_SUBTYPE_POWERPC_7400) 
+                               _cpu_has_altivec = 1;
+               }
+       }
+       mib[0] = CTL_HW;
+       mib[1] = HW_VECTORUNIT;
+       len = sizeof(hasvectorunit);
+       if (sysctl(mib, 2, &hasvectorunit, &len, NULL, 0) == 0) {
+               _cpu_has_altivec = hasvectorunit;
+       }
+       mig_init(1);            /* enable multi-threaded mig interfaces */
+       return 0;
+}
+
+int sched_yield(void)
+{
+    swtch_pri(0);
+    return 0;
+}
+
+/* This is the "magic" that gets the initialization routine called when the application starts */
+int (*_cthread_init_routine)(void) = pthread_init;
+
+/* Get a semaphore from the pool, growing it if necessary */
+
+__private_extern__ semaphore_t new_sem_from_pool(void) {
+       kern_return_t res;
+       semaphore_t sem;
+        int i;
+        
+       LOCK(sem_pool_lock);
+       if (sem_pool_current == sem_pool_count) {
+               sem_pool_count += 16;
+               sem_pool = realloc(sem_pool, sem_pool_count * sizeof(semaphore_t));
+               for (i = sem_pool_current; i < sem_pool_count; i++) {
+                       PTHREAD_MACH_CALL(semaphore_create(mach_task_self(), &sem_pool[i], SYNC_POLICY_FIFO, 0), res);
+               }
+       }
+       sem = sem_pool[sem_pool_current++];
+       UNLOCK(sem_pool_lock);
+       return sem;
+}
+
+/* Put a semaphore back into the pool */
+__private_extern__ void restore_sem_to_pool(semaphore_t sem) {
+       LOCK(sem_pool_lock);
+       sem_pool[--sem_pool_current] = sem;
+       UNLOCK(sem_pool_lock);
+}
+
+static void sem_pool_reset(void) {
+       LOCK(sem_pool_lock);
+       sem_pool_count = 0;
+       sem_pool_current = 0;
+       sem_pool = NULL; 
+       UNLOCK(sem_pool_lock);
+}
+
+__private_extern__ void _pthread_fork_child(void) {
+       /* Just in case somebody had it locked... */
+       UNLOCK(sem_pool_lock);
+       sem_pool_reset();
+}
+
diff --git a/pthreads.subproj/pthread.h b/pthreads.subproj/pthread.h
new file mode 100644 (file)
index 0000000..0f1ea58
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Threads - IEEE 1003.1c
+ */
+
+#ifndef _POSIX_PTHREAD_H
+#define _POSIX_PTHREAD_H
+
+#ifndef __POSIX_LIB__
+#include <pthread_impl.h>
+#endif
+#include <errno.h>
+#include <sched.h>
+#include <time.h>
+#include <mach/mach_types.h>
+#include <unistd.h>
+#include <limits.h>
+
+/*
+ * These symbols indicate which [optional] features are available
+ * They can be tested at compile time via '#ifdef XXX'
+ * The way to check for pthreads is like so:
+ * #include <unistd.h>
+ * #ifdef _POSIX_THREADS
+ * #include <pthread.h>
+ * #endif
+
+ */
+
+/* These will be moved to unistd.h */
+
+
+/* These two should be defined also */
+#undef  _POSIX_THREAD_PROCESS_SHARED
+#undef  _POSIX_THREAD_SAFE_FUNCTIONS
+
+/*
+ * Note: These data structures are meant to be opaque.  Only enough
+ * structure is exposed to support initializers.
+ * All of the typedefs will be moved to <sys/types.h>
+ */
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+/*
+ * Threads
+ */
+
+
+/*
+ * Cancel cleanup handler management.  Note, since these are implemented as macros,
+ * they *MUST* occur in matched pairs!
+ */
+
+#define pthread_cleanup_push(func, val) \
+   { \
+            struct _pthread_handler_rec __handler; \
+            pthread_t __self = pthread_self(); \
+            __handler.routine = func; \
+            __handler.arg = val; \
+            __handler.next = __self->cleanup_stack; \
+            __self->cleanup_stack = &__handler;
+
+#define pthread_cleanup_pop(execute) \
+            /* Note: 'handler' must be in this same lexical context! */ \
+            __self->cleanup_stack = __handler.next; \
+            if (execute) (__handler.routine)(__handler.arg); \
+   }
+       
+/*
+ * Thread attributes
+ */
+
+#define PTHREAD_CREATE_JOINABLE      1
+#define PTHREAD_CREATE_DETACHED      2
+
+#define PTHREAD_INHERIT_SCHED        1
+#define PTHREAD_EXPLICIT_SCHED       2
+
+#define PTHREAD_CANCEL_ENABLE        0x01  /* Cancel takes place at next cancellation point */
+#define PTHREAD_CANCEL_DISABLE       0x00  /* Cancel postponed */
+#define PTHREAD_CANCEL_DEFERRED      0x02  /* Cancel waits until cancellation point */
+#define PTHREAD_CANCEL_ASYNCHRONOUS  0x00  /* Cancel occurs immediately */
+
+/* We only support PTHREAD_SCOPE_SYSTEM */
+#define PTHREAD_SCOPE_SYSTEM         1
+#define PTHREAD_SCOPE_PROCESS        2
+
+/* Who defines this? */
+
+#if !defined(ENOTSUP)
+#define ENOTSUP 89
+#endif
+/*
+ * Mutex attributes
+ */
+#define PTHREAD_PRIO_NONE            0
+#define PTHREAD_PRIO_INHERIT         1
+#define PTHREAD_PRIO_PROTECT         2
+
+/*
+ * Mutex variables
+ */
+
+#define PTHREAD_MUTEX_INITIALIZER {_PTHREAD_MUTEX_SIG_init}
+
+/*
+ * Condition variable attributes
+ */
+
+/*
+ * Condition variables
+ */
+
+#define PTHREAD_COND_INITIALIZER {_PTHREAD_COND_SIG_init}
+
+/*
+ * Initialization control (once) variables
+ */
+
+#define PTHREAD_ONCE_INIT {_PTHREAD_ONCE_SIG_init}
+
+/*
+ * Thread Specific Data - keys
+ */
+
+#include <sys/time.h>
+
+/*
+ * Prototypes for all PTHREAD interfaces
+ */
+int       pthread_attr_destroy __P((pthread_attr_t *attr));
+int       pthread_attr_getdetachstate __P((const pthread_attr_t *attr,
+                                     int *detachstate));
+int       pthread_attr_getinheritsched __P((const pthread_attr_t *attr, 
+                                      int *inheritsched));
+int       pthread_attr_getschedparam __P((const pthread_attr_t *attr, 
+                                     struct sched_param *param));
+int       pthread_attr_getschedpolicy __P((const pthread_attr_t *attr, 
+                                     int *policy));
+int       pthread_attr_getstackaddr __P((const pthread_attr_t *attr,
+                                      void **stackaddr));
+int       pthread_attr_getstacksize __P((const pthread_attr_t *attr,
+                                      size_t *stacksize));
+int       pthread_attr_init __P((pthread_attr_t *attr));
+int       pthread_attr_setdetachstate __P((pthread_attr_t *attr, 
+                                     int detachstate));
+int       pthread_attr_setinheritsched __P((pthread_attr_t *attr, 
+                                      int inheritsched));
+int       pthread_attr_setschedparam __P((pthread_attr_t *attr, 
+                                     const struct sched_param *param));
+int       pthread_attr_setschedpolicy __P((pthread_attr_t *attr, 
+                                     int policy));
+int       pthread_attr_setstackaddr __P((pthread_attr_t *attr,
+                                      void *stackaddr));
+int       pthread_attr_setstacksize __P((pthread_attr_t *attr,
+                                      size_t stacksize));
+int       pthread_cancel __P((pthread_t thread));
+int       pthread_setcancelstate __P((int state, int *oldstate));
+int       pthread_setcanceltype __P((int type, int *oldtype));
+void      pthread_testcancel __P((void));
+int       pthread_cond_broadcast __P((pthread_cond_t *cond));
+int       pthread_cond_destroy __P((pthread_cond_t *cond));
+int       pthread_cond_init __P((pthread_cond_t *cond,
+                            const pthread_condattr_t *attr));
+int       pthread_cond_signal __P((pthread_cond_t *cond));
+int       pthread_cond_wait __P((pthread_cond_t *cond, 
+                           pthread_mutex_t *mutex));
+int       pthread_cond_timedwait __P((pthread_cond_t *cond, 
+                                pthread_mutex_t *mutex,
+                                const struct timespec *abstime));
+int       pthread_cond_timedwait_relative_np __P((pthread_cond_t *cond, 
+                                pthread_mutex_t *mutex,
+                                const struct timespec *reltime));
+int       pthread_create __P((pthread_t *thread, 
+                         const pthread_attr_t *attr,
+                         void *(*start_routine)(void *), 
+                         void *arg));
+int       pthread_detach __P((pthread_t thread));
+int       pthread_equal __P((pthread_t t1, 
+                       pthread_t t2));
+void      pthread_exit __P((void *value_ptr));
+int       pthread_getschedparam __P((pthread_t thread, 
+                               int *policy,
+                                struct sched_param *param));
+int       pthread_join __P((pthread_t thread, 
+                      void **value_ptr));
+int       pthread_mutex_destroy __P((pthread_mutex_t *mutex));
+int       pthread_mutex_getprioceiling __P((const pthread_mutex_t *mutex, 
+                                       int *prioceiling));
+int       pthread_mutex_init __P((pthread_mutex_t *mutex, 
+                            const pthread_mutexattr_t *attr));
+int       pthread_mutex_lock __P((pthread_mutex_t *mutex));
+int       pthread_mutex_setprioceiling __P((pthread_mutex_t *mutex, 
+                                       int prioceiling, 
+                                       int *old_prioceiling));
+int       pthread_mutex_trylock __P((pthread_mutex_t *mutex));
+int       pthread_mutex_unlock __P((pthread_mutex_t *mutex));
+int       pthread_mutexattr_destroy __P((pthread_mutexattr_t *attr));
+int       pthread_mutexattr_getprioceiling __P((const pthread_mutexattr_t *attr, 
+                                           int *prioceiling));
+int       pthread_mutexattr_getprotocol __P((const pthread_mutexattr_t *attr, 
+                                        int *protocol));
+int       pthread_mutexattr_init __P((pthread_mutexattr_t *attr));
+int       pthread_mutexattr_setprioceiling __P((pthread_mutexattr_t *attr, 
+                                           int prioceiling));
+int       pthread_mutexattr_setprotocol __P((pthread_mutexattr_t *attr, 
+                                        int protocol));
+int       pthread_once __P((pthread_once_t *once_control, 
+                      void (*init_routine)(void)));
+pthread_t pthread_self __P((void));
+int       pthread_setschedparam __P((pthread_t thread, 
+                               int policy,
+                                const struct sched_param *param));
+int       pthread_key_create __P((pthread_key_t *key,
+                            void (*destructor)(void *)));
+int       pthread_key_delete __P((pthread_key_t key));
+int       pthread_setspecific __P((pthread_key_t key,
+                             const void *value));
+void     *pthread_getspecific __P((pthread_key_t key));
+int       pthread_attr_getscope __P((pthread_attr_t *, int *));
+int       pthread_attr_setscope __P((pthread_attr_t *, int));
+
+/* returns non-zero if pthread_create or cthread_fork have been called */
+int            pthread_is_threaded_np __P((void));
+
+/* return the mach thread bound to the pthread */
+mach_port_t    pthread_mach_thread_np __P((pthread_t));
+size_t         pthread_get_stacksize_np __P((pthread_t));
+void *         pthread_get_stackaddr_np __P((pthread_t));
+
+/* Like pthread_cond_signal(), but only wake up the specified pthread */
+int            pthread_cond_signal_thread_np __P((pthread_cond_t *, pthread_t));
+
+/* Like pthread_create(), but leaves the thread suspended */
+int       pthread_create_suspended_np __P((pthread_t *thread, 
+                         const pthread_attr_t *attr,
+                         void *(*start_routine)(void *), 
+                         void *arg));
+__END_DECLS
+#endif /* _POSIX_PTHREAD_H */
diff --git a/pthreads.subproj/pthread_cond.c b/pthreads.subproj/pthread_cond.c
new file mode 100644 (file)
index 0000000..49e4c36
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Pthread Library
+ */
+
+#include "pthread_internals.h"
+#include <sys/time.h>              /* For struct timespec and getclock(). */
+#include <stdio.h>
+    
+    /*
+ * Destroy a condition variable.
+ */
+int       
+pthread_cond_destroy(pthread_cond_t *cond)
+{
+       if (cond->sig == _PTHREAD_COND_SIG)
+       {
+               LOCK(cond->lock);
+               if (cond->busy != (pthread_mutex_t *)NULL)
+               {
+                       UNLOCK(cond->lock);
+                       return (EBUSY);
+               } else
+               {
+                       cond->sig = _PTHREAD_NO_SIG;
+                       UNLOCK(cond->lock);
+                        return (ESUCCESS);
+               }
+       } else
+               return (EINVAL); /* Not an initialized condition variable structure */
+}
+
+/*
+ * Initialize a condition variable.  Note: 'attr' is ignored.
+ */
+int       
+pthread_cond_init(pthread_cond_t *cond,
+                 const pthread_condattr_t *attr)
+{
+        LOCK_INIT(cond->lock);
+       cond->sig = _PTHREAD_COND_SIG;
+       cond->next = (pthread_cond_t *)NULL;
+       cond->prev = (pthread_cond_t *)NULL;
+       cond->busy = (pthread_mutex_t *)NULL;
+       cond->waiters = 0;
+       cond->sigspending = 0;
+       cond->sem = MACH_PORT_NULL;
+        return (ESUCCESS);
+}
+
+/*
+ * Signal a condition variable, waking up all threads waiting for it.
+ */
+int       
+pthread_cond_broadcast(pthread_cond_t *cond)
+{
+    kern_return_t kern_res;
+    int res, delta;
+    if (cond->sig == _PTHREAD_COND_SIG_init) {
+        if ((res = pthread_cond_init(cond, NULL)) != 0) {
+            return (res);
+        }
+    }
+    if (cond->sig != _PTHREAD_COND_SIG) {
+        /* Not a condition variable */
+        return (EINVAL);
+    }
+    LOCK(cond->lock);
+    delta = cond->waiters - cond->sigspending;
+    if (delta <= 0) {
+        /* Avoid kernel call since there are not enough waiters... */
+        UNLOCK(cond->lock);
+        return (ESUCCESS);
+    }
+    cond->sigspending += delta;
+    UNLOCK(cond->lock);
+    PTHREAD_MACH_CALL(semaphore_signal_all(cond->sem), kern_res);
+    LOCK(cond->lock);
+    cond->sigspending -= delta;
+    if (cond->waiters == 0 && cond->sigspending == 0) {
+        restore_sem_to_pool(cond->sem);
+        cond->sem = MACH_PORT_NULL;
+    }
+    UNLOCK(cond->lock);
+    if (kern_res != KERN_SUCCESS) {
+        return (EINVAL);
+    }
+    return (ESUCCESS);
+}
+
+/*
+ * Signal a condition variable, waking a specified thread.
+ */
+int       
+pthread_cond_signal_thread_np(pthread_cond_t *cond, pthread_t thread)
+{
+    kern_return_t kern_res;
+    if (cond->sig == _PTHREAD_COND_SIG_init) {
+        int res;
+        if ((res = pthread_cond_init(cond, NULL)) != 0) {
+            return (res);
+        }
+    }
+    if (cond->sig != _PTHREAD_COND_SIG) {
+        return (EINVAL); /* Not a condition variable */
+    }
+    LOCK(cond->lock);
+    if (cond->waiters <= cond->sigspending) {
+        /* Avoid kernel call since there are not enough waiters... */
+        UNLOCK(cond->lock);
+        return (ESUCCESS);
+    }
+    cond->sigspending++;
+    UNLOCK(cond->lock);
+    if (thread == (pthread_t)NULL) {
+        kern_res = semaphore_signal_thread(cond->sem, MACH_PORT_NULL);
+       if (kern_res == KERN_INVALID_ARGUMENT) {
+               PTHREAD_MACH_CALL(semaphore_signal(cond->sem), kern_res);
+        } else if (kern_res == KERN_NOT_WAITING) {
+               kern_res = KERN_SUCCESS;
+       }
+    } else if (thread->sig == _PTHREAD_SIG) {
+        PTHREAD_MACH_CALL(semaphore_signal_thread(cond->sem, thread->kernel_thread), kern_res);
+    } else {
+        kern_res = KERN_FAILURE;
+    }
+    LOCK(cond->lock);
+    cond->sigspending--;
+    if (cond->waiters == 0 && cond->sigspending == 0) {
+        restore_sem_to_pool(cond->sem);
+        cond->sem = MACH_PORT_NULL;
+    }
+    UNLOCK(cond->lock);
+    if (kern_res != KERN_SUCCESS)     {
+        return (EINVAL);
+    }
+    return (ESUCCESS);
+}
+
+/*
+ * Signal a condition variable, waking only one thread.
+ */
+int
+pthread_cond_signal(pthread_cond_t *cond)
+{
+    return pthread_cond_signal_thread_np(cond, NULL);
+}
+
+/*
+ * Manage a list of condition variables associated with a mutex
+ */
+
+static void
+_pthread_cond_add(pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+       pthread_cond_t *c;
+       LOCK(mutex->lock);
+       if ((c = mutex->busy) != (pthread_cond_t *)NULL)
+       {
+               c->prev = cond;
+       } 
+       cond->next = c;
+       cond->prev = (pthread_cond_t *)NULL;
+       mutex->busy = cond;
+       UNLOCK(mutex->lock);
+       if (cond->sem == MACH_PORT_NULL) {
+               cond->sem = new_sem_from_pool();
+       }
+}
+
+static void
+_pthread_cond_remove(pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+       pthread_cond_t *n, *p;
+       LOCK(mutex->lock);
+       if ((n = cond->next) != (pthread_cond_t *)NULL)
+       {
+               n->prev = cond->prev;
+       }
+       if ((p = cond->prev) != (pthread_cond_t *)NULL)
+       {
+               p->next = cond->next;
+       } else
+       { /* This is the first in the list */
+               mutex->busy = n;
+       }
+       UNLOCK(mutex->lock);
+       if (cond->sigspending == 0) {
+            restore_sem_to_pool(cond->sem);
+            cond->sem = MACH_PORT_NULL;
+       }
+}
+
+/*
+ * Suspend waiting for a condition variable.
+ * Note: we have to keep a list of condition variables which are using
+ * this same mutex variable so we can detect invalid 'destroy' sequences.
+ */
+static int       
+_pthread_cond_wait(pthread_cond_t *cond, 
+                  pthread_mutex_t *mutex,
+                  const struct timespec *abstime,
+                  int isRelative)
+{
+    int res;
+    kern_return_t kern_res;
+    pthread_mutex_t *busy;
+    mach_timespec_t then;
+    if (cond->sig == _PTHREAD_COND_SIG_init) {
+        if ((res = pthread_cond_init(cond, NULL)) != 0) {
+            return (res);
+        }
+    }
+    if (cond->sig != _PTHREAD_COND_SIG) {
+        /* Not a condition variable */
+        return (EINVAL);
+    }
+
+    if (abstime) {
+        if (isRelative == 0) {
+            struct timespec now;
+            struct timeval tv;
+            gettimeofday(&tv, NULL);
+            TIMEVAL_TO_TIMESPEC(&tv, &now);
+
+            /* Compute relative time to sleep */
+            then.tv_nsec = abstime->tv_nsec - now.tv_nsec;
+            then.tv_sec = abstime->tv_sec - now.tv_sec;
+            if (then.tv_nsec < 0) {
+                then.tv_nsec += 1000000000;  /* nsec/sec */
+                then.tv_sec--;
+            }
+            if (((int)then.tv_sec < 0) ||
+               ((then.tv_sec == 0) && (then.tv_nsec == 0))) {
+                return ETIMEDOUT;
+            }
+        } else {
+            then.tv_sec = abstime->tv_sec;
+            then.tv_nsec = abstime->tv_nsec;
+        }
+    }
+    LOCK(cond->lock);
+    busy = cond->busy;
+    if ((busy != (pthread_mutex_t *)NULL) && (busy != mutex)) {
+        /* Must always specify the same mutex! */
+        UNLOCK(cond->lock);
+        return (EINVAL);
+    }
+    cond->waiters++;
+    if (cond->waiters == 1) {
+        _pthread_cond_add(cond, mutex);
+        cond->busy = mutex;
+    }
+    UNLOCK(cond->lock);
+    LOCK(mutex->lock);
+    if (mutex->sem == MACH_PORT_NULL) {
+        mutex->sem = new_sem_from_pool();
+    }
+    mutex->cond_lock = 1;
+    UNLOCK(mutex->lock);
+    if (abstime) {
+        kern_res = semaphore_timedwait_signal(cond->sem, mutex->sem, then);
+    } else {
+        PTHREAD_MACH_CALL(semaphore_wait_signal(cond->sem, mutex->sem), kern_res);
+    }
+    LOCK(cond->lock);
+    cond->waiters--;
+    if (cond->waiters == 0) {
+        _pthread_cond_remove(cond, mutex);
+        cond->busy = (pthread_mutex_t *)NULL;
+    }
+    UNLOCK(cond->lock);
+    if ((res = pthread_mutex_lock(mutex)) != ESUCCESS) {
+        return (res);
+    }
+    if (kern_res == KERN_SUCCESS) {
+        return (ESUCCESS);
+    } else if (kern_res == KERN_OPERATION_TIMED_OUT) {
+        return (ETIMEDOUT);
+    } else {
+        return (EINVAL);
+    }
+}
+
+int       
+pthread_cond_wait(pthread_cond_t *cond, 
+                 pthread_mutex_t *mutex)
+{
+       return (_pthread_cond_wait(cond, mutex, (struct timespec *)NULL, 0));
+}
+
+int       
+pthread_cond_timedwait(pthread_cond_t *cond, 
+                      pthread_mutex_t *mutex,
+                      const struct timespec *abstime)
+{
+       return (_pthread_cond_wait(cond, mutex, abstime, 0));
+}
+
+int       
+pthread_cond_timedwait_relative_np(pthread_cond_t *cond, 
+                      pthread_mutex_t *mutex,
+                      const struct timespec *abstime)
+{
+       return (_pthread_cond_wait(cond, mutex, abstime, 1));
+}
+
diff --git a/pthreads.subproj/pthread_impl.h b/pthreads.subproj/pthread_impl.h
new file mode 100644 (file)
index 0000000..ef83dee
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _PTHREAD_IMPL_H_
+#define _PTHREAD_IMPL_H_
+/*
+ * Internal implementation details
+ */
+
+/* This whole header file will disappear, so don't depend on it... */
+
+#ifndef __POSIX_LIB__
+
+/*
+ * [Internal] data structure signatures
+ */
+#define _PTHREAD_MUTEX_SIG_init                0x32AAABA7
+#define _PTHREAD_COND_SIG_init         0x3CB0B1BB
+#define _PTHREAD_ONCE_SIG_init         0x30B1BCBA
+/*
+ * POSIX scheduling policies
+ */
+#define SCHED_OTHER                1
+#define SCHED_FIFO                 4
+#define SCHED_RR                   2
+
+#define __SCHED_PARAM_SIZE__       4
+
+#endif /* __POSIX_LIB__ */
+
+#endif /* _PTHREAD_IMPL_H_ */
diff --git a/pthreads.subproj/pthread_internals.h b/pthreads.subproj/pthread_internals.h
new file mode 100644 (file)
index 0000000..1e96b3c
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Threads - IEEE 1003.1c
+ */
+
+#ifndef _POSIX_PTHREAD_INTERNALS_H
+#define _POSIX_PTHREAD_INTERNALS_H
+
+
+#include <assert.h>
+#include <mach/port.h>
+#include <mach/mach_error.h>
+#include <mach/message.h>
+#include <mach/machine/vm_types.h>
+#include <mach/std_types.h>
+#include <mach/policy.h>
+#include <mach/sync.h>
+#include <mach/sync_policy.h>
+#include <mach/mach_traps.h>
+#include <mach/thread_switch.h>
+#include <mach/mach_host.h>
+#include <mach/mach.h>                 /* For generic MACH support */
+
+
+#ifndef __POSIX_LIB__
+#define __POSIX_LIB__
+#endif
+
+#include "posix_sched.h"               /* For POSIX scheduling policy & parameter */
+#include "pthread_machdep.h"           /* Machine-dependent definitions. */
+
+extern kern_return_t syscall_thread_switch(mach_port_name_t, int, mach_msg_timeout_t);
+
+/*
+ * Compiled-in limits
+ */
+#undef _POSIX_THREAD_KEYS_MAX
+#define _POSIX_THREAD_KEYS_MAX       128
+
+/*
+ * Threads
+ */
+typedef struct _pthread
+{
+       long           sig;           /* Unique signature for this structure */
+       struct _pthread_handler_rec *cleanup_stack;
+       pthread_lock_t lock;          /* Used for internal mutex on structure */
+       int            detached;
+       int            inherit;
+       int            policy;
+       struct sched_param param;
+       struct _pthread_mutex *mutexes;
+       mach_port_t    joiners;       /* pthread_join() uses this to wait for death's call */
+       int            num_joiners;
+       void           *exit_value;
+       mach_port_t    death;         /* pthread_exit() uses this to wait for the hearse */
+       mach_port_t    kernel_thread; /* kernel thread this thread is bound to */
+       void           *(*fun)(void*);/* Thread start routine */
+        void          *arg;          /* Argment for thread start routine */
+       int            cancel_state;  /* Whether thread can be cancelled */
+       int             err_no;         /* thread-local errno */
+       void           *tsd[_POSIX_THREAD_KEYS_MAX];  /* Thread specific data */
+        void           *stackaddr;     /* Base of the stack (is aligned on vm_page_size boundary */
+        size_t         stacksize;      /* Size of the stack (is a multiple of vm_page_size and >= PTHREAD_STACK_MIN) */
+       mach_port_t    reply_port;     /* Cached MiG reply port */
+        void           *cthread_self;  /* cthread_self() if somebody calls cthread_set_self() */
+        boolean_t      freeStackOnExit;/* Should we free the stack when we're done? */
+} *pthread_t;
+
+
+/*
+ * Thread attributes
+ */
+typedef struct 
+{
+       long           sig;           /* Unique signature for this structure */
+       pthread_lock_t lock;          /* Used for internal mutex on structure */
+       int            detached;
+       int            inherit;
+       int            policy;
+       struct sched_param param;
+        void           *stackaddr;     /* Base of the stack (is aligned on vm_page_size boundary */
+        size_t         stacksize;      /* Size of the stack (is a multiple of vm_page_size and >= PTHREAD_STACK_MIN) */
+       boolean_t      freeStackOnExit;/* Should we free the stack when we exit? */
+} pthread_attr_t;
+
+/*
+ * Mutex attributes
+ */
+typedef struct 
+{
+       long sig;                    /* Unique signature for this structure */
+       int prioceiling;
+       int protocol;
+} pthread_mutexattr_t;
+
+/*
+ * Mutex variables
+ */
+typedef struct _pthread_mutex
+{
+       long           sig;           /* Unique signature for this structure */
+       pthread_lock_t lock;          /* Used for internal mutex on structure */
+       int            prioceiling;
+       int            priority;      /* Priority to restore when mutex unlocked */
+       int            protocol;
+       pthread_t      owner;         /* Which thread has this mutex locked */
+       struct _pthread_mutex *next, *prev;  /* List of other mutexes he owns */
+       struct _pthread_cond *busy;   /* List of condition variables using this mutex */
+       int            waiters:31,            /* Count of threads waiting for this mutex */
+                       cond_lock:1;    /* Is there a condition locking me? */
+       mach_port_t    sem;           /* Semaphore used for waiting */
+} pthread_mutex_t;
+
+/*
+ * Condition variable attributes
+ */
+typedef struct 
+{
+       long           sig;          /* Unique signature for this structure */
+       int unsupported;
+} pthread_condattr_t;
+
+/*
+ * Condition variables
+ */
+typedef struct _pthread_cond
+{
+       long           sig;          /* Unique signature for this structure */
+       pthread_lock_t lock;         /* Used for internal mutex on structure */
+       mach_port_t    sem;          /* Kernel semaphore */
+       struct _pthread_cond *next, *prev;  /* List of condition variables using mutex */
+       struct _pthread_mutex *busy; /* mutex associated with variable */
+       int            waiters:16,      /* Number of threads waiting */
+                  sigspending:16;      /* Number of outstanding signals */
+} pthread_cond_t;
+
+/*
+ * Initialization control (once) variables
+ */
+typedef struct 
+{
+       long           sig;           /* Unique signature for this structure */
+       pthread_lock_t lock;          /* Used for internal mutex on structure */
+} pthread_once_t;
+
+#include "pthread.h"
+
+#define _PTHREAD_DEFAULT_INHERITSCHED  PTHREAD_INHERIT_SCHED
+#define _PTHREAD_DEFAULT_PROTOCOL      PTHREAD_PRIO_NONE
+#define _PTHREAD_DEFAULT_PRIOCEILING   0
+#define _PTHREAD_DEFAULT_POLICY                SCHED_OTHER
+#define _PTHREAD_DEFAULT_STACKSIZE     0x80000   /* 512K */
+
+#define _PTHREAD_NO_SIG                        0x00000000
+#define _PTHREAD_MUTEX_ATTR_SIG                0x4D545841  /* 'MTXA' */
+#define _PTHREAD_MUTEX_SIG             0x4D555458  /* 'MUTX' */
+#define _PTHREAD_MUTEX_SIG_init                0x32AAABA7  /* [almost] ~'MUTX' */
+#define _PTHREAD_COND_SIG              0x434F4E44  /* 'COND' */
+#define _PTHREAD_COND_SIG_init         0x3CB0B1BB  /* [almost] ~'COND' */
+#define _PTHREAD_ATTR_SIG              0x54484441  /* 'THDA' */
+#define _PTHREAD_ONCE_SIG              0x4F4E4345  /* 'ONCE' */
+#define _PTHREAD_ONCE_SIG_init         0x30B1BCBA  /* [almost] ~'ONCE' */
+#define _PTHREAD_SIG                   0x54485244  /* 'THRD' */
+
+#define _PTHREAD_EXITED                     3
+#define _PTHREAD_CREATE_PARENT      4
+
+#define _PTHREAD_CANCEL_STATE_MASK   0xFE
+#define _PTHREAD_CANCEL_TYPE_MASK    0xFD
+#define _PTHREAD_CANCEL_PENDING             0x10  /* pthread_cancel() has been called for this thread */
+
+extern boolean_t swtch_pri(int);
+
+/* Number of times to spin when the lock is unavailable and we are on a
+   multiprocessor.  On a uniprocessor we yield the processor immediately.  */
+#define SPIN_TRIES 10
+extern int _spin_tries;
+extern int __is_threaded;
+extern int _cpu_has_altivec;
+
+/* Internal mutex locks for data structures */
+#define TRY_LOCK(v) (!__is_threaded || _spin_lock_try((pthread_lock_t *)&v))
+#if 0
+#define LOCK(v) if (__is_threaded) _spin_lock((pthread_lock_t)&v)
+#else
+#define LOCK(v) \
+        if (__is_threaded) { \
+               while (!_spin_lock_try((pthread_lock_t *)&v)) { \
+                   syscall_thread_switch(THREAD_NULL, SWITCH_OPTION_WAIT, 1); \
+               } \
+       }
+#endif
+#define UNLOCK(v) if (__is_threaded) _spin_unlock((pthread_lock_t *)&v)
+#ifndef ESUCCESS
+#define ESUCCESS 0
+#endif
+
+#ifndef PTHREAD_MACH_CALL
+#define        PTHREAD_MACH_CALL(expr, ret) (ret) = (expr)
+#endif
+
+/* Prototypes. */
+
+/* Functions defined in machine-dependent files. */
+extern vm_address_t _sp(void);
+extern vm_address_t _adjust_sp(vm_address_t sp);
+extern void _spin_lock(pthread_lock_t *lockp);
+extern int  _spin_lock_try(pthread_lock_t *lockp);
+extern void _spin_unlock(pthread_lock_t *lockp);
+extern void _pthread_setup(pthread_t th, void (*f)(pthread_t), vm_address_t sp);
+
+extern void _pthread_tsd_cleanup(pthread_t self);
+
+__private_extern__ semaphore_t new_sem_from_pool(void);
+__private_extern__ void restore_sem_to_pool(semaphore_t);
+#endif /* _POSIX_PTHREAD_INTERNALS_H */
diff --git a/pthreads.subproj/pthread_machdep.h b/pthreads.subproj/pthread_machdep.h
new file mode 100644 (file)
index 0000000..57a3f24
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ */
+/*
+ * MkLinux
+ */
+
+/* Machine-dependent definitions for pthread internals. */
+
+typedef long pthread_lock_t;
+
+#define LOCK_INIT(l)   ((l) = 0)
+#define LOCK_INITIALIZER 0
+
+#undef STACK_GROWS_UP
diff --git a/pthreads.subproj/pthread_mutex.c b/pthreads.subproj/pthread_mutex.c
new file mode 100644 (file)
index 0000000..1276e60
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991
+ *              All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appears in all copies and
+ * that both the copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Pthread Library
+ * -- Mutex variable support
+ */
+
+#include "pthread_internals.h"
+
+/*
+ * Destroy a mutex variable.
+ */
+int
+pthread_mutex_destroy(pthread_mutex_t *mutex)
+{
+        if (mutex->sig != _PTHREAD_MUTEX_SIG)
+                return (EINVAL);
+        if ((mutex->owner != (pthread_t)NULL) ||
+            (mutex->busy != (pthread_cond_t *)NULL))
+                return (EBUSY);
+        mutex->sig = _PTHREAD_NO_SIG;
+       return (ESUCCESS);
+}
+
+/*
+ * Initialize a mutex variable, possibly with additional attributes.
+ */
+int
+pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
+{
+        LOCK_INIT(mutex->lock);
+        mutex->sig = _PTHREAD_MUTEX_SIG;
+        if (attr)
+        {
+                if (attr->sig != _PTHREAD_MUTEX_ATTR_SIG)
+                        return (EINVAL);
+                mutex->prioceiling = attr->prioceiling;
+                mutex->protocol = attr->protocol;
+        } else
+        {
+                mutex->prioceiling = _PTHREAD_DEFAULT_PRIOCEILING;
+                mutex->protocol = _PTHREAD_DEFAULT_PROTOCOL;
+        }
+        mutex->owner = (pthread_t)NULL;
+        mutex->next = (pthread_mutex_t *)NULL;
+        mutex->prev = (pthread_mutex_t *)NULL;
+        mutex->busy = (pthread_cond_t *)NULL;
+       mutex->waiters = 0;
+       mutex->cond_lock = 0;
+       mutex->sem = MACH_PORT_NULL;
+       return (ESUCCESS);
+}
+
+/*
+ * Manage a list of mutex variables owned by a thread
+ */
+#if defined(DEBUG)
+static void
+_pthread_mutex_add(pthread_mutex_t *mutex)
+{
+        pthread_mutex_t *m;
+        pthread_t self = pthread_self();
+        if (self != (pthread_t)0) {
+            mutex->owner = self;
+            if ((m = self->mutexes) != (pthread_mutex_t *)NULL)
+                { /* Add to list */
+                m->prev = mutex;
+                }
+            mutex->next = m;
+            mutex->prev = (pthread_mutex_t *)NULL;
+            self->mutexes = mutex;
+       }
+}
+
+static void
+_pthread_mutex_remove(pthread_mutex_t *mutex, pthread_t self)
+{
+        pthread_mutex_t *n, *prev;
+        if ((n = mutex->next) != (pthread_mutex_t *)NULL)
+        {
+                n->prev = mutex->prev;
+        }
+        if ((prev = mutex->prev) != (pthread_mutex_t *)NULL)
+        {
+                prev->next = mutex->next;
+        } else
+        { /* This is the first in the list */
+            if (self != (pthread_t)0) {
+                self->mutexes = n;
+            }
+        }
+        mutex->owner = (pthread_t)NULL;
+}
+#endif
+
+/*
+ * Lock a mutex.
+ * TODO: Priority inheritance stuff
+ */
+int
+pthread_mutex_lock(pthread_mutex_t *mutex)
+{
+        kern_return_t kern_res;
+
+        if (mutex->sig == _PTHREAD_MUTEX_SIG_init)
+        {
+                int res;
+                if (res = pthread_mutex_init(mutex, NULL))
+                        return (res);
+        }
+        if (mutex->sig != _PTHREAD_MUTEX_SIG)
+                return (EINVAL);        /* Not a mutex variable */
+        LOCK(mutex->lock);
+       if (mutex->waiters || (mutex->owner != (pthread_t)NULL))
+       {
+                mutex->waiters++;
+                if (mutex->sem == MACH_PORT_NULL) {
+                       mutex->sem = new_sem_from_pool();
+               }
+                UNLOCK(mutex->lock);
+               PTHREAD_MACH_CALL(semaphore_wait(mutex->sem), kern_res);
+                LOCK(mutex->lock);
+               mutex->waiters--;
+               if (mutex->waiters == 0) {
+                       restore_sem_to_pool(mutex->sem);
+                       mutex->sem = MACH_PORT_NULL;
+               }
+                if (mutex->cond_lock) {
+                    mutex->cond_lock = 0;
+                }
+        }
+#if defined(DEBUG)
+        _pthread_mutex_add(mutex);
+#else
+        mutex->owner = (pthread_t)0x12141968;
+#endif
+        UNLOCK(mutex->lock);
+        return (ESUCCESS);
+}
+
+/*
+ * Attempt to lock a mutex, but don't block if this isn't possible.
+ */
+int
+pthread_mutex_trylock(pthread_mutex_t *mutex)
+{
+        kern_return_t kern_res;
+       
+       if (mutex->sig == _PTHREAD_MUTEX_SIG_init)
+        {
+                int res;
+                if (res = pthread_mutex_init(mutex, NULL))
+                        return (res);
+        }
+        if (mutex->sig != _PTHREAD_MUTEX_SIG)
+                return (EINVAL);        /* Not a mutex variable */
+        if (!TRY_LOCK(mutex->lock)) {
+            return (EBUSY);
+        }
+        if (mutex->waiters ||
+               ((mutex->owner != (pthread_t)NULL) && (mutex->cond_lock == 0)))
+        {
+                UNLOCK(mutex->lock);
+                return (EBUSY);
+        } else
+        {
+#if defined(DEBUG)
+                _pthread_mutex_add(mutex);
+#else
+                mutex->owner = (pthread_t)0x12141968;
+#endif
+               if (mutex->cond_lock) {
+                    PTHREAD_MACH_CALL(semaphore_wait(mutex->sem), kern_res);
+                    mutex->cond_lock = 0;
+                    restore_sem_to_pool(mutex->sem);
+                    mutex->sem = MACH_PORT_NULL;
+               }
+                UNLOCK(mutex->lock);
+                return (ESUCCESS);
+        }
+}
+
+/*
+ * Unlock a mutex.
+ * TODO: Priority inheritance stuff
+ */
+int
+pthread_mutex_unlock(pthread_mutex_t *mutex)
+{
+        kern_return_t kern_res;
+        int waiters;
+        if (mutex->sig == _PTHREAD_MUTEX_SIG_init)
+        {
+                int res;
+                if (res = pthread_mutex_init(mutex, NULL))
+                        return (res);
+        }
+        if (mutex->sig != _PTHREAD_MUTEX_SIG)
+                return (EINVAL);        /* Not a mutex variable */
+        LOCK(mutex->lock);
+#if defined(DEBUG)
+        if (mutex->owner != pthread_self())
+        {
+                UNLOCK(mutex->lock);
+                abort();
+               return (EPERM);
+      } else
+#endif
+        {
+#if defined(DEBUG)
+                _pthread_mutex_remove(mutex, mutex->owner);
+#else
+                mutex->owner = (pthread_t)NULL;
+#endif
+                waiters = mutex->waiters;
+               UNLOCK(mutex->lock);
+                if (waiters)
+                {
+                   PTHREAD_MACH_CALL(semaphore_signal(mutex->sem), kern_res);
+                }
+                return (ESUCCESS);
+        }
+}
+
+/*
+ * Fetch the priority ceiling value from a mutex variable.
+ * Note: written as a 'helper' function to hide implementation details.
+ */
+int
+pthread_mutex_getprioceiling(const pthread_mutex_t *mutex,
+                             int *prioceiling)
+{
+        if (mutex->sig == _PTHREAD_MUTEX_SIG)
+        {
+                *prioceiling = mutex->prioceiling;
+                return (ESUCCESS);
+        } else
+        {
+                return (EINVAL); /* Not an initialized 'attribute' structure */
+        }
+}
+
+/*
+ * Set the priority ceiling for a mutex.
+ * Note: written as a 'helper' function to hide implementation details.
+ */
+int
+pthread_mutex_setprioceiling(pthread_mutex_t *mutex,
+                             int prioceiling,
+                             int *old_prioceiling)
+{
+        if (mutex->sig == _PTHREAD_MUTEX_SIG)
+        {
+                if ((prioceiling >= -999) ||
+                    (prioceiling <= 999))
+                {
+                        *old_prioceiling = mutex->prioceiling;
+                        mutex->prioceiling = prioceiling;
+                        return (ESUCCESS);
+                } else
+                {
+                        return (EINVAL); /* Invalid parameter */
+                }
+        } else
+        {
+                return (EINVAL); /* Not an initialized 'attribute' structure */
+        }
+}
+
+/*
+ * Destroy a mutex attribute structure.
+ */
+int
+pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
+{
+        attr->sig = _PTHREAD_NO_SIG;  /* Uninitialized */
+        return (ESUCCESS);
+}
+
+/*
+ * Get the priority ceiling value from a mutex attribute structure.
+ * Note: written as a 'helper' function to hide implementation details.
+ */
+int
+pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *attr,
+                                 int *prioceiling)
+{
+        if (attr->sig == _PTHREAD_MUTEX_ATTR_SIG)
+        {
+                *prioceiling = attr->prioceiling;
+                return (ESUCCESS);
+        } else
+        {
+                return (EINVAL); /* Not an initialized 'attribute' structure */
+        }
+}
+
+/*
+ * Get the mutex 'protocol' value from a mutex attribute structure.
+ * Note: written as a 'helper' function to hide implementation details.
+ */
+int
+pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr,
+                              int *protocol)
+{
+        if (attr->sig == _PTHREAD_MUTEX_ATTR_SIG)
+        {
+                *protocol = attr->protocol;
+                return (ESUCCESS);
+        } else
+        {
+                return (EINVAL); /* Not an initialized 'attribute' structure */
+        }
+}
+
+/*
+ * Initialize a mutex attribute structure to system defaults.
+ */
+int
+pthread_mutexattr_init(pthread_mutexattr_t *attr)
+{
+        attr->prioceiling = _PTHREAD_DEFAULT_PRIOCEILING;
+        attr->protocol = _PTHREAD_DEFAULT_PROTOCOL;
+        attr->sig = _PTHREAD_MUTEX_ATTR_SIG;
+        return (ESUCCESS);
+}
+
+/*
+ * Set the priority ceiling value in a mutex attribute structure.
+ * Note: written as a 'helper' function to hide implementation details.
+ */
+int
+pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr,
+                                 int prioceiling)
+{
+        if (attr->sig == _PTHREAD_MUTEX_ATTR_SIG)
+        {
+                if ((prioceiling >= -999) ||
+                    (prioceiling <= 999))
+                {
+                        attr->prioceiling = prioceiling;
+                        return (ESUCCESS);
+                } else
+                {
+                        return (EINVAL); /* Invalid parameter */
+                }
+        } else
+        {
+                return (EINVAL); /* Not an initialized 'attribute' structure */
+        }
+}
+
+/*
+ * Set the mutex 'protocol' value in a mutex attribute structure.
+ * Note: written as a 'helper' function to hide implementation details.
+ */
+int
+pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr,
+                              int protocol)
+{
+        if (attr->sig == _PTHREAD_MUTEX_ATTR_SIG)
+        {
+                if ((protocol == PTHREAD_PRIO_NONE) ||
+                    (protocol == PTHREAD_PRIO_INHERIT) ||
+                    (protocol == PTHREAD_PRIO_PROTECT))
+                {
+                        attr->protocol = protocol;
+                        return (ESUCCESS);
+                } else
+                {
+                        return (EINVAL); /* Invalid parameter */
+                }
+        } else
+        {
+                return (EINVAL); /* Not an initialized 'attribute' structure */
+        }
+}
+
+int mutex_try_lock(int *x) {
+        return _spin_lock_try((pthread_lock_t *)x);
+}
+
+void mutex_wait_lock(int *x) {
+        for (;;) {
+                if( _spin_lock_try((pthread_lock_t *)x)) {
+                        return;
+                }
+                swtch_pri(0);
+        }
+}
+
+void cthread_yield(void) {
+        sched_yield();
+}
+
diff --git a/pthreads.subproj/pthread_tsd.c b/pthreads.subproj/pthread_tsd.c
new file mode 100644 (file)
index 0000000..f8cfb6b
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * POSIX Pthread Library
+ *   Thread Specific Data support
+ */
+
+#include "pthread_internals.h"
+
+static struct
+{
+       int  created;    /* Set TRUE if 'create_key' used this slot */
+       void (*destructor)(void *);
+} _pthread_keys[_POSIX_THREAD_KEYS_MAX];
+static pthread_lock_t tds_lock = LOCK_INITIALIZER;
+
+/*
+ * Create a new key for thread specific data
+ */
+int       
+pthread_key_create(pthread_key_t *key,
+                  void (*destructor)(void *))
+{
+       int res, i;
+       LOCK(tds_lock);
+       res = ENOMEM;  /* No 'free' keys */
+       for (i = 0;  i < _POSIX_THREAD_KEYS_MAX;  i++)
+       {
+               if (_pthread_keys[i].created == FALSE)
+               {
+                       _pthread_keys[i].created = TRUE;
+                       _pthread_keys[i].destructor = destructor;
+                       *key = i+1;
+                       res = ESUCCESS;
+                       break;
+               }
+       }
+       UNLOCK(tds_lock);
+        return (res);
+}
+
+/*
+ * Destroy a thread specific data key
+ */
+int       
+pthread_key_delete(pthread_key_t key)
+{
+       int res;
+       LOCK(tds_lock);
+       if ((key >= 1) && (key <= _POSIX_THREAD_KEYS_MAX))
+       {
+               if (_pthread_keys[key-1].created)
+               {
+                       _pthread_keys[key-1].created = FALSE;
+                       res = ESUCCESS;
+               } else
+               {
+                       res = EINVAL;
+               }
+       } else
+       { /* Invalid key */
+               res = EINVAL;
+       }
+       UNLOCK(tds_lock);
+       return (res);
+}
+
+/*
+ * Set the thread private value for a given key.
+ * We do not take the spinlock for this or pthread_getspecific.
+ * The assignment to self->tsd[] is thread-safe because we never
+ * refer to the tsd[] of a thread other than pthread_self().
+ * The reference to _pthread_keys[...].created could race with a
+ * pthread_key_delete() but in this case the behaviour is allowed
+ * to be undefined.
+ */
+int       
+pthread_setspecific(pthread_key_t key,
+                   const void *value)
+{
+       int res;
+       pthread_t self;
+       if ((key >= 1) && (key <= _POSIX_THREAD_KEYS_MAX))
+       {
+               if (_pthread_keys[key-1].created)
+               {
+                       self = pthread_self();
+                       self->tsd[key-1] = (void *) value;
+                       res = ESUCCESS;
+               } else
+               {
+                       res = EINVAL;
+               }
+       } else
+       { /* Invalid key */
+               res = EINVAL;
+       }
+        return (res);
+}
+
+/*
+ * Fetch the thread private value for a given key.
+ * This is potentially a very heavily-used operation so we do only
+ * a minimum of checks.
+ */
+void *
+pthread_getspecific(pthread_key_t key)
+{
+       pthread_t self;
+       void *res;
+        if ((key >= 1) && (key <= _POSIX_THREAD_KEYS_MAX))
+       {
+               self = pthread_self();
+               res = self->tsd[key-1];
+       } else
+       { /* Invalid key - no error, just NULL */
+               res = (void *)NULL;
+       }
+       return (res);
+}
+
+/*
+ * Clean up thread specific data as thread 'dies'
+ */
+void
+_pthread_tsd_cleanup(pthread_t self)
+{
+       int i, j;
+       void *param;
+       for (j = 0;  j < PTHREAD_DESTRUCTOR_ITERATIONS;  j++)
+       {
+               for (i = 0;  i < _POSIX_THREAD_KEYS_MAX;  i++)
+               {
+                       if (_pthread_keys[i].created && (param = self->tsd[i]))
+                       {
+                               self->tsd[i] = (void *)NULL;
+                               if (_pthread_keys[i].destructor)
+                               {
+                                       (_pthread_keys[i].destructor)(param);
+                               }
+                       }
+               }
+       }
+}
diff --git a/pthreads.subproj/sched.h b/pthreads.subproj/sched.h
new file mode 100644 (file)
index 0000000..d67a482
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _SCHED_H_
+#define _SCHED_H_
+
+#include <pthread_impl.h>
+
+/*
+ * Scheduling paramters
+ */
+#ifndef __POSIX_LIB__
+struct sched_param { int sched_priority;  char opaque[__SCHED_PARAM_SIZE__]; };
+#endif
+
+extern int sched_yield(void);
+extern int sched_get_priority_min(int);
+extern int sched_get_priority_max(int);
+#endif /* _SCHED_H_ */
+
diff --git a/pthreads.subproj/stack.s b/pthreads.subproj/stack.s
new file mode 100644 (file)
index 0000000..7548bbf
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+.text
+
+#if defined(__ppc__)
+#import        <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+
+/*     
+ * void *_sp(void)
+ */
+
+LEAF(__sp)
+       mr      r3,r1
+       blr
+
+/*
+ * void *_adjust_sp(void *sp)
+ */
+LEAF(__adjust_sp)
+       subi    r3,r3,0x100             /* Stack frame padding */
+       blr     
+
+#elif defined(__i386__)
+
+#import        <architecture/i386/asm_help.h>
+/*     
+ * void *_sp(void)
+ */
+
+LEAF(__sp,0)
+       movl    %esp,%eax
+       ret
+
+/*
+ * void *_adjust_sp(void *sp)
+ */
+LEAF(__adjust_sp,0)
+       movl    4(%esp),%eax
+       subl    $0x100,%eax
+       ret
+
+#else
+#error sp functions not defined for this architecture
+#endif
+
diff --git a/pthreads.subproj/thread_setup.c b/pthreads.subproj/thread_setup.c
new file mode 100644 (file)
index 0000000..13502dc
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
+ *              All Rights Reserved 
+ *  
+ * Permission to use, copy, modify, and distribute this software and 
+ * its documentation for any purpose and without fee is hereby granted, 
+ * provided that the above copyright notice appears in all copies and 
+ * that both the copyright notice and this permission notice appear in 
+ * supporting documentation. 
+ *  
+ * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+ * FOR A PARTICULAR PURPOSE. 
+ *  
+ * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
+ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+ * 
+ */
+/*
+ * MkLinux
+ */
+
+/*
+ * Machine specific support for thread initialization
+ */
+
+#if defined(__ppc__)
+#include <architecture/ppc/cframe.h>
+#endif
+
+#include "pthread_internals.h"
+
+/*
+ * Set up the initial state of a MACH thread
+ */
+void
+_pthread_setup(pthread_t thread, 
+              void (*routine)(pthread_t), 
+              vm_address_t vsp)
+{
+        kern_return_t r;
+        unsigned int count;
+#if defined(__ppc__)
+        struct ppc_thread_state state;
+       struct ppc_thread_state *ts = &state;
+
+       /*
+        * Set up PowerPC registers.
+        */
+       count = PPC_THREAD_STATE_COUNT;
+       PTHREAD_MACH_CALL(thread_get_state(thread->kernel_thread,
+                                  PPC_THREAD_STATE,
+                                  (thread_state_t) &state,
+                                  &count),
+                 r);
+
+       ts->srr0 = (int) routine;
+        ts->r1 = vsp - C_ARGSAVE_LEN - C_RED_ZONE;
+       ts->r3 = (int)thread;
+       PTHREAD_MACH_CALL(thread_set_state(thread->kernel_thread,
+                                  PPC_THREAD_STATE,
+                                  (thread_state_t) &state,
+                                  PPC_THREAD_STATE_COUNT),
+                 r);
+#elif defined(__i386__)
+        i386_thread_state_t state;
+        i386_thread_state_t *ts = &state;
+        int *sp = (int *) vsp;
+
+        /*
+         * Set up i386 registers & function call.
+         */
+        count = i386_THREAD_STATE_COUNT;
+        PTHREAD_MACH_CALL(thread_get_state(thread->kernel_thread,
+                                   i386_THREAD_STATE,
+                                   (thread_state_t) &state,
+                                   &count),
+                  r);
+        ts->eip = (int) routine;
+        *--sp = (int) thread;  /* argument to function */
+        *--sp = 0;             /* fake return address */
+        ts->esp = (int) sp;    /* set stack pointer */
+        PTHREAD_MACH_CALL(thread_set_state(thread->kernel_thread,
+                                   i386_THREAD_STATE,
+                                   (thread_state_t) &state,
+                                   i386_THREAD_STATE_COUNT),
+                  r);
+
+#else
+#error _pthread_setup not defined for this architecture
+#endif
+}
diff --git a/regex.subproj/Makefile b/regex.subproj/Makefile
new file mode 100644 (file)
index 0000000..df9cdf6
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = regex
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = cclass.h cname.h regex2.h utils.h
+
+CFILES = regcomp.c regerror.c regexec.c regfree.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble engine.c
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/regex.subproj/Makefile.postamble b/regex.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/regex.subproj/Makefile.preamble b/regex.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/regex.subproj/PB.project b/regex.subproj/PB.project
new file mode 100644 (file)
index 0000000..2ef71b3
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (cclass.h, cname.h, regex2.h, utils.h); 
+        OTHER_LINKED = (regcomp.c, regerror.c, regexec.c, regfree.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble, engine.c); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = regex; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/regex.subproj/cclass.h b/regex.subproj/cclass.h
new file mode 100644 (file)
index 0000000..028b6ed
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* character-class table */
+static struct cclass {
+       char *name;
+       char *chars;
+       char *multis;
+} cclasses[] = {
+       "alnum",        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789",                           "",
+       "alpha",        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+                                       "",
+       "blank",        " \t",          "",
+       "cntrl",        "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
+\25\26\27\30\31\32\33\34\35\36\37\177",        "",
+       "digit",        "0123456789",   "",
+       "graph",        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+                                       "",
+       "lower",        "abcdefghijklmnopqrstuvwxyz",
+                                       "",
+       "print",        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
+                                       "",
+       "punct",        "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+                                       "",
+       "space",        "\t\n\v\f\r ",  "",
+       "upper",        "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+                                       "",
+       "xdigit",       "0123456789ABCDEFabcdef",
+                                       "",
+       NULL,           0,              ""
+};
diff --git a/regex.subproj/cname.h b/regex.subproj/cname.h
new file mode 100644 (file)
index 0000000..1abcd7c
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* character-name table */
+static const struct cname {
+       char *name;
+       char code;
+} cnames[] = {
+       "NUL",  '\0',
+       "SOH",  '\001',
+       "STX",  '\002',
+       "ETX",  '\003',
+       "EOT",  '\004',
+       "ENQ",  '\005',
+       "ACK",  '\006',
+       "BEL",  '\007',
+       "alert",        '\007',
+       "BS",           '\010',
+       "backspace",    '\b',
+       "HT",           '\011',
+       "tab",          '\t',
+       "LF",           '\012',
+       "newline",      '\n',
+       "VT",           '\013',
+       "vertical-tab", '\v',
+       "FF",           '\014',
+       "form-feed",    '\f',
+       "CR",           '\015',
+       "carriage-return",      '\r',
+       "SO",   '\016',
+       "SI",   '\017',
+       "DLE",  '\020',
+       "DC1",  '\021',
+       "DC2",  '\022',
+       "DC3",  '\023',
+       "DC4",  '\024',
+       "NAK",  '\025',
+       "SYN",  '\026',
+       "ETB",  '\027',
+       "CAN",  '\030',
+       "EM",   '\031',
+       "SUB",  '\032',
+       "ESC",  '\033',
+       "IS4",  '\034',
+       "FS",   '\034',
+       "IS3",  '\035',
+       "GS",   '\035',
+       "IS2",  '\036',
+       "RS",   '\036',
+       "IS1",  '\037',
+       "US",   '\037',
+       "space",                ' ',
+       "exclamation-mark",     '!',
+       "quotation-mark",       '"',
+       "number-sign",          '#',
+       "dollar-sign",          '$',
+       "percent-sign",         '%',
+       "ampersand",            '&',
+       "apostrophe",           '\'',
+       "left-parenthesis",     '(',
+       "right-parenthesis",    ')',
+       "asterisk",     '*',
+       "plus-sign",    '+',
+       "comma",        ',',
+       "hyphen",       '-',
+       "hyphen-minus", '-',
+       "period",       '.',
+       "full-stop",    '.',
+       "slash",        '/',
+       "solidus",      '/',
+       "zero",         '0',
+       "one",          '1',
+       "two",          '2',
+       "three",        '3',
+       "four",         '4',
+       "five",         '5',
+       "six",          '6',
+       "seven",        '7',
+       "eight",        '8',
+       "nine",         '9',
+       "colon",        ':',
+       "semicolon",    ';',
+       "less-than-sign",       '<',
+       "equals-sign",          '=',
+       "greater-than-sign",    '>',
+       "question-mark",        '?',
+       "commercial-at",        '@',
+       "left-square-bracket",  '[',
+       "backslash",            '\\',
+       "reverse-solidus",      '\\',
+       "right-square-bracket", ']',
+       "circumflex",           '^',
+       "circumflex-accent",    '^',
+       "underscore",           '_',
+       "low-line",             '_',
+       "grave-accent",         '`',
+       "left-brace",           '{',
+       "left-curly-bracket",   '{',
+       "vertical-line",        '|',
+       "right-brace",          '}',
+       "right-curly-bracket",  '}',
+       "tilde",                '~',
+       "DEL",  '\177',
+       NULL,   0,
+};
diff --git a/regex.subproj/engine.c b/regex.subproj/engine.c
new file mode 100644 (file)
index 0000000..3f7856a
--- /dev/null
@@ -0,0 +1,1109 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * The matching engine and friends.  This file is #included by regexec.c
+ * after suitable #defines of a variety of macros used herein, so that
+ * different state representations can be used without duplicating masses
+ * of code.
+ */
+
+#ifdef SNAMES
+#define        matcher smatcher
+#define        fast    sfast
+#define        slow    sslow
+#define        dissect sdissect
+#define        backref sbackref
+#define        step    sstep
+#define        print   sprint
+#define        at      sat
+#define        match   smat
+#endif
+#ifdef LNAMES
+#define        matcher lmatcher
+#define        fast    lfast
+#define        slow    lslow
+#define        dissect ldissect
+#define        backref lbackref
+#define        step    lstep
+#define        print   lprint
+#define        at      lat
+#define        match   lmat
+#endif
+
+/* another structure passed up and down to avoid zillions of parameters */
+struct match {
+       struct re_guts *g;
+       int eflags;
+       regmatch_t *pmatch;     /* [nsub+1] (0 element unused) */
+       char *offp;             /* offsets work from here */
+       char *beginp;           /* start of string -- virtual NUL precedes */
+       char *endp;             /* end of string -- virtual NUL here */
+       char *coldp;            /* can be no match starting before here */
+       char **lastpos;         /* [nplus+1] */
+       STATEVARS;
+       states st;              /* current states */
+       states fresh;           /* states for a fresh start */
+       states tmp;             /* temporary */
+       states empty;           /* empty set of states */
+};
+
+/* ========= begin header generated by ./mkh ========= */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* === engine.c === */
+static int matcher __P((struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags));
+static char *dissect __P((struct match *m, char *start, char *stop, sopno startst, sopno stopst));
+static char *backref __P((struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev));
+static char *fast __P((struct match *m, char *start, char *stop, sopno startst, sopno stopst));
+static char *slow __P((struct match *m, char *start, char *stop, sopno startst, sopno stopst));
+static states step __P((struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft));
+#define        BOL     (OUT+1)
+#define        EOL     (BOL+1)
+#define        BOLEOL  (BOL+2)
+#define        NOTHING (BOL+3)
+#define        BOW     (BOL+4)
+#define        EOW     (BOL+5)
+#define        CODEMAX (BOL+5)         /* highest code used */
+#define        NONCHAR(c)      ((c) > CHAR_MAX)
+#define        NNONCHAR        (CODEMAX-CHAR_MAX)
+#ifdef REDEBUG
+static void print __P((struct match *m, char *caption, states st, int ch, FILE *d));
+#endif
+#ifdef REDEBUG
+static void at __P((struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst));
+#endif
+#ifdef REDEBUG
+static char *pchar __P((int ch));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+/* ========= end header generated by ./mkh ========= */
+
+#ifdef REDEBUG
+#define        SP(t, s, c)     print(m, t, s, c, stdout)
+#define        AT(t, p1, p2, s1, s2)   at(m, t, p1, p2, s1, s2)
+#define        NOTE(str)       { if (m->eflags&REG_TRACE) printf("=%s\n", (str)); }
+#else
+#define        SP(t, s, c)     /* nothing */
+#define        AT(t, p1, p2, s1, s2)   /* nothing */
+#define        NOTE(s) /* nothing */
+#endif
+
+/*
+ - matcher - the actual matching engine
+ == static int matcher(register struct re_guts *g, char *string, \
+ ==    size_t nmatch, regmatch_t pmatch[], int eflags);
+ */
+static int                     /* 0 success, REG_NOMATCH failure */
+matcher(g, string, nmatch, pmatch, eflags)
+register struct re_guts *g;
+char *string;
+size_t nmatch;
+regmatch_t pmatch[];
+int eflags;
+{
+       register char *endp;
+       register int i;
+       struct match mv;
+       register struct match *m = &mv;
+       register char *dp;
+       const register sopno gf = g->firststate+1;      /* +1 for OEND */
+       const register sopno gl = g->laststate;
+       char *start;
+       char *stop;
+
+       /* simplify the situation where possible */
+       if (g->cflags&REG_NOSUB)
+               nmatch = 0;
+       if (eflags&REG_STARTEND) {
+               start = string + pmatch[0].rm_so;
+               stop = string + pmatch[0].rm_eo;
+       } else {
+               start = string;
+               stop = start + strlen(start);
+       }
+       if (stop < start)
+               return(REG_INVARG);
+
+       /* prescreening; this does wonders for this rather slow code */
+       if (g->must != NULL) {
+               for (dp = start; dp < stop; dp++)
+                       if (*dp == g->must[0] && stop - dp >= g->mlen &&
+                               memcmp(dp, g->must, (size_t)g->mlen) == 0)
+                               break;
+               if (dp == stop)         /* we didn't find g->must */
+                       return(REG_NOMATCH);
+       }
+
+       /* match struct setup */
+       m->g = g;
+       m->eflags = eflags;
+       m->pmatch = NULL;
+       m->lastpos = NULL;
+       m->offp = string;
+       m->beginp = start;
+       m->endp = stop;
+       STATESETUP(m, 4);
+       SETUP(m->st);
+       SETUP(m->fresh);
+       SETUP(m->tmp);
+       SETUP(m->empty);
+       CLEAR(m->empty);
+
+       /* this loop does only one repetition except for backrefs */
+       for (;;) {
+               endp = fast(m, start, stop, gf, gl);
+               if (endp == NULL) {             /* a miss */
+                       STATETEARDOWN(m);
+                       return(REG_NOMATCH);
+               }
+               if (nmatch == 0 && !g->backrefs)
+                       break;          /* no further info needed */
+
+               /* where? */
+               assert(m->coldp != NULL);
+               for (;;) {
+                       NOTE("finding start");
+                       endp = slow(m, m->coldp, stop, gf, gl);
+                       if (endp != NULL)
+                               break;
+                       assert(m->coldp < m->endp);
+                       m->coldp++;
+               }
+               if (nmatch == 1 && !g->backrefs)
+                       break;          /* no further info needed */
+
+               /* oh my, he wants the subexpressions... */
+               if (m->pmatch == NULL)
+                       m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) *
+                                                       sizeof(regmatch_t));
+               if (m->pmatch == NULL) {
+                       STATETEARDOWN(m);
+                       return(REG_ESPACE);
+               }
+               for (i = 1; i <= m->g->nsub; i++)
+                       m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
+               if (!g->backrefs && !(m->eflags&REG_BACKR)) {
+                       NOTE("dissecting");
+                       dp = dissect(m, m->coldp, endp, gf, gl);
+               } else {
+                       if (g->nplus > 0 && m->lastpos == NULL)
+                               m->lastpos = (char **)malloc((g->nplus+1) *
+                                                       sizeof(char *));
+                       if (g->nplus > 0 && m->lastpos == NULL) {
+                               free(m->pmatch);
+                               STATETEARDOWN(m);
+                               return(REG_ESPACE);
+                       }
+                       NOTE("backref dissect");
+                       dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+               }
+               if (dp != NULL)
+                       break;
+
+               /* uh-oh... we couldn't find a subexpression-level match */
+               assert(g->backrefs);    /* must be back references doing it */
+               assert(g->nplus == 0 || m->lastpos != NULL);
+               for (;;) {
+                       if (dp != NULL || endp <= m->coldp)
+                               break;          /* defeat */
+                       NOTE("backoff");
+                       endp = slow(m, m->coldp, endp-1, gf, gl);
+                       if (endp == NULL)
+                               break;          /* defeat */
+                       /* try it on a shorter possibility */
+#ifndef NDEBUG
+                       for (i = 1; i <= m->g->nsub; i++) {
+                               assert(m->pmatch[i].rm_so == -1);
+                               assert(m->pmatch[i].rm_eo == -1);
+                       }
+#endif
+                       NOTE("backoff dissect");
+                       dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+               }
+               assert(dp == NULL || dp == endp);
+               if (dp != NULL)         /* found a shorter one */
+                       break;
+
+               /* despite initial appearances, there is no match here */
+               NOTE("false alarm");
+               start = m->coldp + 1;   /* recycle starting later */
+               assert(start <= stop);
+       }
+
+       /* fill in the details if requested */
+       if (nmatch > 0) {
+               pmatch[0].rm_so = m->coldp - m->offp;
+               pmatch[0].rm_eo = endp - m->offp;
+       }
+       if (nmatch > 1) {
+               assert(m->pmatch != NULL);
+               for (i = 1; i < nmatch; i++)
+                       if (i <= m->g->nsub)
+                               pmatch[i] = m->pmatch[i];
+                       else {
+                               pmatch[i].rm_so = -1;
+                               pmatch[i].rm_eo = -1;
+                       }
+       }
+
+       if (m->pmatch != NULL)
+               free((char *)m->pmatch);
+       if (m->lastpos != NULL)
+               free((char *)m->lastpos);
+       STATETEARDOWN(m);
+       return(0);
+}
+
+/*
+ - dissect - figure out what matched what, no back references
+ == static char *dissect(register struct match *m, char *start, \
+ ==    char *stop, sopno startst, sopno stopst);
+ */
+static char *                  /* == stop (success) always */
+dissect(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+       register int i;
+       register sopno ss;      /* start sop of current subRE */
+       register sopno es;      /* end sop of current subRE */
+       register char *sp;      /* start of string matched by it */
+       register char *stp;     /* string matched by it cannot pass here */
+       register char *rest;    /* start of rest of string */
+       register char *tail;    /* string unmatched by rest of RE */
+       register sopno ssub;    /* start sop of subsubRE */
+       register sopno esub;    /* end sop of subsubRE */
+       register char *ssp;     /* start of string matched by subsubRE */
+       register char *sep;     /* end of string matched by subsubRE */
+       register char *oldssp;  /* previous ssp */
+       register char *dp;
+
+       AT("diss", start, stop, startst, stopst);
+       sp = start;
+       for (ss = startst; ss < stopst; ss = es) {
+               /* identify end of subRE */
+               es = ss;
+               switch (OP(m->g->strip[es])) {
+               case OPLUS_:
+               case OQUEST_:
+                       es += OPND(m->g->strip[es]);
+                       break;
+               case OCH_:
+                       while (OP(m->g->strip[es]) != O_CH)
+                               es += OPND(m->g->strip[es]);
+                       break;
+               }
+               es++;
+
+               /* figure out what it matched */
+               switch (OP(m->g->strip[ss])) {
+               case OEND:
+                       assert(nope);
+                       break;
+               case OCHAR:
+                       sp++;
+                       break;
+               case OBOL:
+               case OEOL:
+               case OBOW:
+               case OEOW:
+                       break;
+               case OANY:
+               case OANYOF:
+                       sp++;
+                       break;
+               case OBACK_:
+               case O_BACK:
+                       assert(nope);
+                       break;
+               /* cases where length of match is hard to find */
+               case OQUEST_:
+                       stp = stop;
+                       for (;;) {
+                               /* how long could this one be? */
+                               rest = slow(m, sp, stp, ss, es);
+                               assert(rest != NULL);   /* it did match */
+                               /* could the rest match the rest? */
+                               tail = slow(m, rest, stop, es, stopst);
+                               if (tail == stop)
+                                       break;          /* yes! */
+                               /* no -- try a shorter match for this one */
+                               stp = rest - 1;
+                               assert(stp >= sp);      /* it did work */
+                       }
+                       ssub = ss + 1;
+                       esub = es - 1;
+                       /* did innards match? */
+                       if (slow(m, sp, rest, ssub, esub) != NULL) {
+                               dp = dissect(m, sp, rest, ssub, esub);
+                               assert(dp == rest);
+                       } else          /* no */
+                               assert(sp == rest);
+                       sp = rest;
+                       break;
+               case OPLUS_:
+                       stp = stop;
+                       for (;;) {
+                               /* how long could this one be? */
+                               rest = slow(m, sp, stp, ss, es);
+                               assert(rest != NULL);   /* it did match */
+                               /* could the rest match the rest? */
+                               tail = slow(m, rest, stop, es, stopst);
+                               if (tail == stop)
+                                       break;          /* yes! */
+                               /* no -- try a shorter match for this one */
+                               stp = rest - 1;
+                               assert(stp >= sp);      /* it did work */
+                       }
+                       ssub = ss + 1;
+                       esub = es - 1;
+                       ssp = sp;
+                       oldssp = ssp;
+                       for (;;) {      /* find last match of innards */
+                               sep = slow(m, ssp, rest, ssub, esub);
+                               if (sep == NULL || sep == ssp)
+                                       break;  /* failed or matched null */
+                               oldssp = ssp;   /* on to next try */
+                               ssp = sep;
+                       }
+                       if (sep == NULL) {
+                               /* last successful match */
+                               sep = ssp;
+                               ssp = oldssp;
+                       }
+                       assert(sep == rest);    /* must exhaust substring */
+                       assert(slow(m, ssp, sep, ssub, esub) == rest);
+                       dp = dissect(m, ssp, sep, ssub, esub);
+                       assert(dp == sep);
+                       sp = rest;
+                       break;
+               case OCH_:
+                       stp = stop;
+                       for (;;) {
+                               /* how long could this one be? */
+                               rest = slow(m, sp, stp, ss, es);
+                               assert(rest != NULL);   /* it did match */
+                               /* could the rest match the rest? */
+                               tail = slow(m, rest, stop, es, stopst);
+                               if (tail == stop)
+                                       break;          /* yes! */
+                               /* no -- try a shorter match for this one */
+                               stp = rest - 1;
+                               assert(stp >= sp);      /* it did work */
+                       }
+                       ssub = ss + 1;
+                       esub = ss + OPND(m->g->strip[ss]) - 1;
+                       assert(OP(m->g->strip[esub]) == OOR1);
+                       for (;;) {      /* find first matching branch */
+                               if (slow(m, sp, rest, ssub, esub) == rest)
+                                       break;  /* it matched all of it */
+                               /* that one missed, try next one */
+                               assert(OP(m->g->strip[esub]) == OOR1);
+                               esub++;
+                               assert(OP(m->g->strip[esub]) == OOR2);
+                               ssub = esub + 1;
+                               esub += OPND(m->g->strip[esub]);
+                               if (OP(m->g->strip[esub]) == OOR2)
+                                       esub--;
+                               else
+                                       assert(OP(m->g->strip[esub]) == O_CH);
+                       }
+                       dp = dissect(m, sp, rest, ssub, esub);
+                       assert(dp == rest);
+                       sp = rest;
+                       break;
+               case O_PLUS:
+               case O_QUEST:
+               case OOR1:
+               case OOR2:
+               case O_CH:
+                       assert(nope);
+                       break;
+               case OLPAREN:
+                       i = OPND(m->g->strip[ss]);
+                       assert(0 < i && i <= m->g->nsub);
+                       m->pmatch[i].rm_so = sp - m->offp;
+                       break;
+               case ORPAREN:
+                       i = OPND(m->g->strip[ss]);
+                       assert(0 < i && i <= m->g->nsub);
+                       m->pmatch[i].rm_eo = sp - m->offp;
+                       break;
+               default:                /* uh oh */
+                       assert(nope);
+                       break;
+               }
+       }
+
+       assert(sp == stop);
+       return(sp);
+}
+
+/*
+ - backref - figure out what matched what, figuring in back references
+ == static char *backref(register struct match *m, char *start, \
+ ==    char *stop, sopno startst, sopno stopst, sopno lev);
+ */
+static char *                  /* == stop (success) or NULL (failure) */
+backref(m, start, stop, startst, stopst, lev)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+sopno lev;                     /* PLUS nesting level */
+{
+       register int i;
+       register sopno ss;      /* start sop of current subRE */
+       register char *sp;      /* start of string matched by it */
+       register sopno ssub;    /* start sop of subsubRE */
+       register sopno esub;    /* end sop of subsubRE */
+       register char *ssp;     /* start of string matched by subsubRE */
+       register char *dp;
+       register size_t len;
+       register int hard;
+       register sop s;
+       register regoff_t offsave;
+       register cset *cs;
+
+       AT("back", start, stop, startst, stopst);
+       sp = start;
+
+       /* get as far as we can with easy stuff */
+       hard = 0;
+       for (ss = startst; !hard && ss < stopst; ss++)
+               switch (OP(s = m->g->strip[ss])) {
+               case OCHAR:
+                       if (sp == stop || *sp++ != (char)OPND(s))
+                               return(NULL);
+                       break;
+               case OANY:
+                       if (sp == stop)
+                               return(NULL);
+                       sp++;
+                       break;
+               case OANYOF:
+                       cs = &m->g->sets[OPND(s)];
+                       if (sp == stop || !CHIN(cs, *sp++))
+                               return(NULL);
+                       break;
+               case OBOL:
+                       if ( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+                                       (sp < m->endp && *(sp-1) == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case OEOL:
+                       if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+                                       (sp < m->endp && *sp == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case OBOW:
+                       if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+                                       (sp < m->endp && *(sp-1) == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) ||
+                                       (sp > m->beginp &&
+                                                       !ISWORD(*(sp-1))) ) &&
+                                       (sp < m->endp && ISWORD(*sp)) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case OEOW:
+                       if (( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+                                       (sp < m->endp && *sp == '\n' &&
+                                               (m->g->cflags&REG_NEWLINE)) ||
+                                       (sp < m->endp && !ISWORD(*sp)) ) &&
+                                       (sp > m->beginp && ISWORD(*(sp-1))) )
+                               { /* yes */ }
+                       else
+                               return(NULL);
+                       break;
+               case O_QUEST:
+                       break;
+               case OOR1:      /* matches null but needs to skip */
+                       ss++;
+                       s = m->g->strip[ss];
+                       do {
+                               assert(OP(s) == OOR2);
+                               ss += OPND(s);
+                       } while (OP(s = m->g->strip[ss]) != O_CH);
+                       /* note that the ss++ gets us past the O_CH */
+                       break;
+               default:        /* have to make a choice */
+                       hard = 1;
+                       break;
+               }
+       if (!hard) {            /* that was it! */
+               if (sp != stop)
+                       return(NULL);
+               return(sp);
+       }
+       ss--;                   /* adjust for the for's final increment */
+
+       /* the hard stuff */
+       AT("hard", sp, stop, ss, stopst);
+       s = m->g->strip[ss];
+       switch (OP(s)) {
+       case OBACK_:            /* the vilest depths */
+               i = OPND(s);
+               assert(0 < i && i <= m->g->nsub);
+               if (m->pmatch[i].rm_eo == -1)
+                       return(NULL);
+               assert(m->pmatch[i].rm_so != -1);
+               len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;
+               assert(stop - m->beginp >= len);
+               if (sp > stop - len)
+                       return(NULL);   /* not enough left to match */
+               ssp = m->offp + m->pmatch[i].rm_so;
+               if (memcmp(sp, ssp, len) != 0)
+                       return(NULL);
+               while (m->g->strip[ss] != SOP(O_BACK, i))
+                       ss++;
+               return(backref(m, sp+len, stop, ss+1, stopst, lev));
+               break;
+       case OQUEST_:           /* to null or not */
+               dp = backref(m, sp, stop, ss+1, stopst, lev);
+               if (dp != NULL)
+                       return(dp);     /* not */
+               return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev));
+               break;
+       case OPLUS_:
+               assert(m->lastpos != NULL);
+               assert(lev+1 <= m->g->nplus);
+               m->lastpos[lev+1] = sp;
+               return(backref(m, sp, stop, ss+1, stopst, lev+1));
+               break;
+       case O_PLUS:
+               if (sp == m->lastpos[lev])      /* last pass matched null */
+                       return(backref(m, sp, stop, ss+1, stopst, lev-1));
+               /* try another pass */
+               m->lastpos[lev] = sp;
+               dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev);
+               if (dp == NULL)
+                       return(backref(m, sp, stop, ss+1, stopst, lev-1));
+               else
+                       return(dp);
+               break;
+       case OCH_:              /* find the right one, if any */
+               ssub = ss + 1;
+               esub = ss + OPND(s) - 1;
+               assert(OP(m->g->strip[esub]) == OOR1);
+               for (;;) {      /* find first matching branch */
+                       dp = backref(m, sp, stop, ssub, esub, lev);
+                       if (dp != NULL)
+                               return(dp);
+                       /* that one missed, try next one */
+                       if (OP(m->g->strip[esub]) == O_CH)
+                               return(NULL);   /* there is none */
+                       esub++;
+                       assert(OP(m->g->strip[esub]) == OOR2);
+                       ssub = esub + 1;
+                       esub += OPND(m->g->strip[esub]);
+                       if (OP(m->g->strip[esub]) == OOR2)
+                               esub--;
+                       else
+                               assert(OP(m->g->strip[esub]) == O_CH);
+               }
+               break;
+       case OLPAREN:           /* must undo assignment if rest fails */
+               i = OPND(s);
+               assert(0 < i && i <= m->g->nsub);
+               offsave = m->pmatch[i].rm_so;
+               m->pmatch[i].rm_so = sp - m->offp;
+               dp = backref(m, sp, stop, ss+1, stopst, lev);
+               if (dp != NULL)
+                       return(dp);
+               m->pmatch[i].rm_so = offsave;
+               return(NULL);
+               break;
+       case ORPAREN:           /* must undo assignment if rest fails */
+               i = OPND(s);
+               assert(0 < i && i <= m->g->nsub);
+               offsave = m->pmatch[i].rm_eo;
+               m->pmatch[i].rm_eo = sp - m->offp;
+               dp = backref(m, sp, stop, ss+1, stopst, lev);
+               if (dp != NULL)
+                       return(dp);
+               m->pmatch[i].rm_eo = offsave;
+               return(NULL);
+               break;
+       default:                /* uh oh */
+               assert(nope);
+               break;
+       }
+
+       /* "can't happen" */
+       assert(nope);
+       /* NOTREACHED */
+}
+
+/*
+ - fast - step through the string at top speed
+ == static char *fast(register struct match *m, char *start, \
+ ==    char *stop, sopno startst, sopno stopst);
+ */
+static char *                  /* where tentative match ended, or NULL */
+fast(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+       register states st = m->st;
+       register states fresh = m->fresh;
+       register states tmp = m->tmp;
+       register char *p = start;
+       register int c = (start == m->beginp) ? OUT : *(start-1);
+       register int lastc;     /* previous c */
+       register int flagch;
+       register int i;
+       register char *coldp;   /* last p after which no match was underway */
+
+       CLEAR(st);
+       SET1(st, startst);
+       st = step(m->g, startst, stopst, st, NOTHING, st);
+       ASSIGN(fresh, st);
+       SP("start", st, *p);
+       coldp = NULL;
+       for (;;) {
+               /* next character */
+               lastc = c;
+               c = (p == m->endp) ? OUT : *p;
+               if (EQ(st, fresh))
+                       coldp = p;
+
+               /* is there an EOL and/or BOL between lastc and c? */
+               flagch = '\0';
+               i = 0;
+               if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+                       flagch = BOL;
+                       i = m->g->nbol;
+               }
+               if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+                       flagch = (flagch == BOL) ? BOLEOL : EOL;
+                       i += m->g->neol;
+               }
+               if (i != 0) {
+                       for (; i > 0; i--)
+                               st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("boleol", st, c);
+               }
+
+               /* how about a word boundary? */
+               if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+                                       (c != OUT && ISWORD(c)) ) {
+                       flagch = BOW;
+               }
+               if ( (lastc != OUT && ISWORD(lastc)) &&
+                               (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+                       flagch = EOW;
+               }
+               if (flagch == BOW || flagch == EOW) {
+                       st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("boweow", st, c);
+               }
+
+               /* are we done? */
+               if (ISSET(st, stopst) || p == stop)
+                       break;          /* NOTE BREAK OUT */
+
+               /* no, we must deal with this character */
+               ASSIGN(tmp, st);
+               ASSIGN(st, fresh);
+               assert(c != OUT);
+               st = step(m->g, startst, stopst, tmp, c, st);
+               SP("aft", st, c);
+               assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+               p++;
+       }
+
+       assert(coldp != NULL);
+       m->coldp = coldp;
+       if (ISSET(st, stopst))
+               return(p+1);
+       else
+               return(NULL);
+}
+
+/*
+ - slow - step through the string more deliberately
+ == static char *slow(register struct match *m, char *start, \
+ ==    char *stop, sopno startst, sopno stopst);
+ */
+static char *                  /* where it ended */
+slow(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+       register states st = m->st;
+       register states empty = m->empty;
+       register states tmp = m->tmp;
+       register char *p = start;
+       register int c = (start == m->beginp) ? OUT : *(start-1);
+       register int lastc;     /* previous c */
+       register int flagch;
+       register int i;
+       register char *matchp;  /* last p at which a match ended */
+
+       AT("slow", start, stop, startst, stopst);
+       CLEAR(st);
+       SET1(st, startst);
+       SP("sstart", st, *p);
+       st = step(m->g, startst, stopst, st, NOTHING, st);
+       matchp = NULL;
+       for (;;) {
+               /* next character */
+               lastc = c;
+               c = (p == m->endp) ? OUT : *p;
+
+               /* is there an EOL and/or BOL between lastc and c? */
+               flagch = '\0';
+               i = 0;
+               if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+                       flagch = BOL;
+                       i = m->g->nbol;
+               }
+               if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+                               (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+                       flagch = (flagch == BOL) ? BOLEOL : EOL;
+                       i += m->g->neol;
+               }
+               if (i != 0) {
+                       for (; i > 0; i--)
+                               st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("sboleol", st, c);
+               }
+
+               /* how about a word boundary? */
+               if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+                                       (c != OUT && ISWORD(c)) ) {
+                       flagch = BOW;
+               }
+               if ( (lastc != OUT && ISWORD(lastc)) &&
+                               (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+                       flagch = EOW;
+               }
+               if (flagch == BOW || flagch == EOW) {
+                       st = step(m->g, startst, stopst, st, flagch, st);
+                       SP("sboweow", st, c);
+               }
+
+               /* are we done? */
+               if (ISSET(st, stopst))
+                       matchp = p;
+               if (EQ(st, empty) || p == stop)
+                       break;          /* NOTE BREAK OUT */
+
+               /* no, we must deal with this character */
+               ASSIGN(tmp, st);
+               ASSIGN(st, empty);
+               assert(c != OUT);
+               st = step(m->g, startst, stopst, tmp, c, st);
+               SP("saft", st, c);
+               assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+               p++;
+       }
+
+       return(matchp);
+}
+
+
+/*
+ - step - map set of states reachable before char to set reachable after
+ == static states step(register struct re_guts *g, sopno start, sopno stop, \
+ ==    register states bef, int ch, register states aft);
+ == #define    BOL     (OUT+1)
+ == #define    EOL     (BOL+1)
+ == #define    BOLEOL  (BOL+2)
+ == #define    NOTHING (BOL+3)
+ == #define    BOW     (BOL+4)
+ == #define    EOW     (BOL+5)
+ == #define    CODEMAX (BOL+5)         // highest code used
+ == #define    NONCHAR(c)      ((c) > CHAR_MAX)
+ == #define    NNONCHAR        (CODEMAX-CHAR_MAX)
+ */
+static states
+step(g, start, stop, bef, ch, aft)
+register struct re_guts *g;
+sopno start;                   /* start state within strip */
+sopno stop;                    /* state after stop state within strip */
+register states bef;           /* states reachable before */
+int ch;                                /* character or NONCHAR code */
+register states aft;           /* states already known reachable after */
+{
+       register cset *cs;
+       register sop s;
+       register sopno pc;
+       register onestate here;         /* note, macros know this name */
+       register sopno look;
+       register int i;
+
+       for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) {
+               s = g->strip[pc];
+               switch (OP(s)) {
+               case OEND:
+                       assert(pc == stop-1);
+                       break;
+               case OCHAR:
+                       /* only characters can match */
+                       assert(!NONCHAR(ch) || ch != (char)OPND(s));
+                       if (ch == (char)OPND(s))
+                               FWD(aft, bef, 1);
+                       break;
+               case OBOL:
+                       if (ch == BOL || ch == BOLEOL)
+                               FWD(aft, bef, 1);
+                       break;
+               case OEOL:
+                       if (ch == EOL || ch == BOLEOL)
+                               FWD(aft, bef, 1);
+                       break;
+               case OBOW:
+                       if (ch == BOW)
+                               FWD(aft, bef, 1);
+                       break;
+               case OEOW:
+                       if (ch == EOW)
+                               FWD(aft, bef, 1);
+                       break;
+               case OANY:
+                       if (!NONCHAR(ch))
+                               FWD(aft, bef, 1);
+                       break;
+               case OANYOF:
+                       cs = &g->sets[OPND(s)];
+                       if (!NONCHAR(ch) && CHIN(cs, ch))
+                               FWD(aft, bef, 1);
+                       break;
+               case OBACK_:            /* ignored here */
+               case O_BACK:
+                       FWD(aft, aft, 1);
+                       break;
+               case OPLUS_:            /* forward, this is just an empty */
+                       FWD(aft, aft, 1);
+                       break;
+               case O_PLUS:            /* both forward and back */
+                       FWD(aft, aft, 1);
+                       i = ISSETBACK(aft, OPND(s));
+                       BACK(aft, aft, OPND(s));
+                       if (!i && ISSETBACK(aft, OPND(s))) {
+                               /* oho, must reconsider loop body */
+                               pc -= OPND(s) + 1;
+                               INIT(here, pc);
+                       }
+                       break;
+               case OQUEST_:           /* two branches, both forward */
+                       FWD(aft, aft, 1);
+                       FWD(aft, aft, OPND(s));
+                       break;
+               case O_QUEST:           /* just an empty */
+                       FWD(aft, aft, 1);
+                       break;
+               case OLPAREN:           /* not significant here */
+               case ORPAREN:
+                       FWD(aft, aft, 1);
+                       break;
+               case OCH_:              /* mark the first two branches */
+                       FWD(aft, aft, 1);
+                       assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+                       FWD(aft, aft, OPND(s));
+                       break;
+               case OOR1:              /* done a branch, find the O_CH */
+                       if (ISSTATEIN(aft, here)) {
+                               for (look = 1;
+                                               OP(s = g->strip[pc+look]) != O_CH;
+                                               look += OPND(s))
+                                       assert(OP(s) == OOR2);
+                               FWD(aft, aft, look);
+                       }
+                       break;
+               case OOR2:              /* propagate OCH_'s marking */
+                       FWD(aft, aft, 1);
+                       if (OP(g->strip[pc+OPND(s)]) != O_CH) {
+                               assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+                               FWD(aft, aft, OPND(s));
+                       }
+                       break;
+               case O_CH:              /* just empty */
+                       FWD(aft, aft, 1);
+                       break;
+               default:                /* ooooops... */
+                       assert(nope);
+                       break;
+               }
+       }
+
+       return(aft);
+}
+
+#ifdef REDEBUG
+/*
+ - print - print a set of states
+ == #ifdef REDEBUG
+ == static void print(struct match *m, char *caption, states st, \
+ ==    int ch, FILE *d);
+ == #endif
+ */
+static void
+print(m, caption, st, ch, d)
+struct match *m;
+char *caption;
+states st;
+int ch;
+FILE *d;
+{
+       register struct re_guts *g = m->g;
+       register int i;
+       register int first = 1;
+
+       if (!(m->eflags&REG_TRACE))
+               return;
+
+       fprintf(d, "%s", caption);
+       if (ch != '\0')
+               fprintf(d, " %s", pchar(ch));
+       for (i = 0; i < g->nstates; i++)
+               if (ISSET(st, i)) {
+                       fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
+                       first = 0;
+               }
+       fprintf(d, "\n");
+}
+
+/* 
+ - at - print current situation
+ == #ifdef REDEBUG
+ == static void at(struct match *m, char *title, char *start, char *stop, \
+ ==                                            sopno startst, sopno stopst);
+ == #endif
+ */
+static void
+at(m, title, start, stop, startst, stopst)
+struct match *m;
+char *title;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+       if (!(m->eflags&REG_TRACE))
+               return;
+
+       printf("%s %s-", title, pchar(*start));
+       printf("%s ", pchar(*stop));
+       printf("%ld-%ld\n", (long)startst, (long)stopst);
+}
+
+#ifndef PCHARDONE
+#define        PCHARDONE       /* never again */
+/*
+ - pchar - make a character printable
+ == #ifdef REDEBUG
+ == static char *pchar(int ch);
+ == #endif
+ *
+ * Is this identical to regchar() over in debug.c?  Well, yes.  But a
+ * duplicate here avoids having a debugging-capable regexec.o tied to
+ * a matching debug.o, and this is convenient.  It all disappears in
+ * the non-debug compilation anyway, so it doesn't matter much.
+ */
+static char *                  /* -> representation */
+pchar(ch)
+int ch;
+{
+       static char pbuf[10];
+
+       if (isprint(ch) || ch == ' ')
+               sprintf(pbuf, "%c", ch);
+       else
+               sprintf(pbuf, "\\%o", ch);
+       return(pbuf);
+}
+#endif
+#endif
+
+#undef matcher
+#undef fast
+#undef slow
+#undef dissect
+#undef backref
+#undef step
+#undef print
+#undef at
+#undef match
diff --git a/regex.subproj/regcomp.c b/regex.subproj/regcomp.c
new file mode 100644 (file)
index 0000000..e2e0bf3
--- /dev/null
@@ -0,0 +1,1712 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+#include "cclass.h"
+#include "cname.h"
+
+/*
+ * parse structure, passed up and down to avoid global variables and
+ * other clumsinesses
+ */
+struct parse {
+       char *next;             /* next character in RE */
+       char *end;              /* end of string (-> NUL normally) */
+       int error;              /* has an error been seen? */
+       sop *strip;             /* malloced strip */
+       sopno ssize;            /* malloced strip size (allocated) */
+       sopno slen;             /* malloced strip length (used) */
+       int ncsalloc;           /* number of csets allocated */
+       struct re_guts *g;
+#      define  NPAREN  10      /* we need to remember () 1-9 for back refs */
+       sopno pbegin[NPAREN];   /* -> ( ([0] unused) */
+       sopno pend[NPAREN];     /* -> ) ([0] unused) */
+};
+
+/* ========= begin header generated by ./mkh ========= */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* === regcomp.c === */
+static void p_ere __P((struct parse *p, int stop));
+static void p_ere_exp __P((struct parse *p));
+static void p_str __P((struct parse *p));
+static void p_bre __P((struct parse *p, int end1, int end2));
+static int p_simp_re __P((struct parse *p, int starordinary));
+static int p_count __P((struct parse *p));
+static void p_bracket __P((struct parse *p));
+static void p_b_term __P((struct parse *p, cset *cs));
+static void p_b_cclass __P((struct parse *p, cset *cs));
+static void p_b_eclass __P((struct parse *p, cset *cs));
+static char p_b_symbol __P((struct parse *p));
+static char p_b_coll_elem __P((struct parse *p, int endc));
+static char othercase __P((int ch));
+static void bothcases __P((struct parse *p, int ch));
+static void ordinary __P((struct parse *p, int ch));
+static void nonnewline __P((struct parse *p));
+static void repeat __P((struct parse *p, sopno start, int from, int to));
+static int seterr __P((struct parse *p, int e));
+static cset *allocset __P((struct parse *p));
+static void freeset __P((struct parse *p, cset *cs));
+static int freezeset __P((struct parse *p, cset *cs));
+static int firstch __P((struct parse *p, cset *cs));
+static int nch __P((struct parse *p, cset *cs));
+static void mcadd __P((struct parse *p, cset *cs, char *cp));
+static void mcsub __P((cset *cs, char *cp));
+static int mcin __P((cset *cs, char *cp));
+static char *mcfind __P((cset *cs, char *cp));
+static void mcinvert __P((struct parse *p, cset *cs));
+static void mccase __P((struct parse *p, cset *cs));
+static int isinsets __P((struct re_guts *g, int c));
+static int samesets __P((struct re_guts *g, int c1, int c2));
+static void categorize __P((struct parse *p, struct re_guts *g));
+static sopno dupl __P((struct parse *p, sopno start, sopno finish));
+static void doemit __P((struct parse *p, sop op, size_t opnd));
+static void doinsert __P((struct parse *p, sop op, size_t opnd, sopno pos));
+static void dofwd __P((struct parse *p, sopno pos, sop value));
+static void enlarge __P((struct parse *p, sopno size));
+static void stripsnug __P((struct parse *p, struct re_guts *g));
+static void findmust __P((struct parse *p, struct re_guts *g));
+static sopno pluscount __P((struct parse *p, struct re_guts *g));
+
+#ifdef __cplusplus
+}
+#endif
+/* ========= end header generated by ./mkh ========= */
+
+static char nuls[10];          /* place to point scanner in event of error */
+
+/*
+ * macros for use with parse structure
+ * BEWARE:  these know that the parse structure is named `p' !!!
+ */
+#define        PEEK()  (*p->next)
+#define        PEEK2() (*(p->next+1))
+#define        MORE()  (p->next < p->end)
+#define        MORE2() (p->next+1 < p->end)
+#define        SEE(c)  (MORE() && PEEK() == (c))
+#define        SEETWO(a, b)    (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
+#define        EAT(c)  ((SEE(c)) ? (NEXT(), 1) : 0)
+#define        EATTWO(a, b)    ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
+#define        NEXT()  (p->next++)
+#define        NEXT2() (p->next += 2)
+#define        NEXTn(n)        (p->next += (n))
+#define        GETNEXT()       (*p->next++)
+#define        SETERROR(e)     seterr(p, (e))
+#define        REQUIRE(co, e)  ((co) || SETERROR(e))
+#define        MUSTSEE(c, e)   (REQUIRE(MORE() && PEEK() == (c), e))
+#define        MUSTEAT(c, e)   (REQUIRE(MORE() && GETNEXT() == (c), e))
+#define        MUSTNOTSEE(c, e)        (REQUIRE(!MORE() || PEEK() != (c), e))
+#define        EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
+#define        INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
+#define        AHEAD(pos)              dofwd(p, pos, HERE()-(pos))
+#define        ASTERN(sop, pos)        EMIT(sop, HERE()-pos)
+#define        HERE()          (p->slen)
+#define        THERE()         (p->slen - 1)
+#define        THERETHERE()    (p->slen - 2)
+#define        DROP(n) (p->slen -= (n))
+
+#ifndef NDEBUG
+static int never = 0;          /* for use in asserts; shuts lint up */
+#else
+#define        never   0               /* some <assert.h>s have bugs too */
+#endif
+
+/*
+ - regcomp - interface for parser and compilation
+ = extern int regcomp(regex_t *, const char *, int);
+ = #define     REG_BASIC       0000
+ = #define     REG_EXTENDED    0001
+ = #define     REG_ICASE       0002
+ = #define     REG_NOSUB       0004
+ = #define     REG_NEWLINE     0010
+ = #define     REG_NOSPEC      0020
+ = #define     REG_PEND        0040
+ = #define     REG_DUMP        0200
+ */
+int                            /* 0 success, otherwise REG_something */
+regcomp(preg, pattern, cflags)
+regex_t *preg;
+const char *pattern;
+int cflags;
+{
+       struct parse pa;
+       register struct re_guts *g;
+       register struct parse *p = &pa;
+       register int i;
+       register size_t len;
+#ifdef REDEBUG
+#      define  GOODFLAGS(f)    (f)
+#else
+#      define  GOODFLAGS(f)    ((f)&~REG_DUMP)
+#endif
+
+       cflags = GOODFLAGS(cflags);
+       if ((cflags&REG_EXTENDED) && (cflags&REG_NOSPEC))
+               return(REG_INVARG);
+
+       if (cflags&REG_PEND) {
+               if (preg->re_endp < pattern)
+                       return(REG_INVARG);
+               len = preg->re_endp - pattern;
+       } else
+               len = strlen((char *)pattern);
+
+       /* do the mallocs early so failure handling is easy */
+       g = (struct re_guts *)malloc(sizeof(struct re_guts) +
+                                                       (NC-1)*sizeof(cat_t));
+       if (g == NULL)
+               return(REG_ESPACE);
+       p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */
+       p->strip = (sop *)malloc(p->ssize * sizeof(sop));
+       p->slen = 0;
+       if (p->strip == NULL) {
+               free((char *)g);
+               return(REG_ESPACE);
+       }
+
+       /* set things up */
+       p->g = g;
+       p->next = (char *)pattern;      /* convenience; we do not modify it */
+       p->end = p->next + len;
+       p->error = 0;
+       p->ncsalloc = 0;
+       for (i = 0; i < NPAREN; i++) {
+               p->pbegin[i] = 0;
+               p->pend[i] = 0;
+       }
+       g->csetsize = NC;
+       g->sets = NULL;
+       g->setbits = NULL;
+       g->ncsets = 0;
+       g->cflags = cflags;
+       g->iflags = 0;
+       g->nbol = 0;
+       g->neol = 0;
+       g->must = NULL;
+       g->mlen = 0;
+       g->nsub = 0;
+       g->ncategories = 1;     /* category 0 is "everything else" */
+       g->categories = &g->catspace[-(CHAR_MIN)];
+       (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
+       g->backrefs = 0;
+
+       /* do it */
+       EMIT(OEND, 0);
+       g->firststate = THERE();
+       if (cflags&REG_EXTENDED)
+               p_ere(p, OUT);
+       else if (cflags&REG_NOSPEC)
+               p_str(p);
+       else
+               p_bre(p, OUT, OUT);
+       EMIT(OEND, 0);
+       g->laststate = THERE();
+
+       /* tidy up loose ends and fill things in */
+       categorize(p, g);
+       stripsnug(p, g);
+       findmust(p, g);
+       g->nplus = pluscount(p, g);
+       g->magic = MAGIC2;
+       preg->re_nsub = g->nsub;
+       preg->re_g = g;
+       preg->re_magic = MAGIC1;
+#ifndef REDEBUG
+       /* not debugging, so can't rely on the assert() in regexec() */
+       if (g->iflags&BAD)
+               SETERROR(REG_ASSERT);
+#endif
+
+       /* win or lose, we're done */
+       if (p->error != 0)      /* lose */
+               regfree(preg);
+       return(p->error);
+}
+
+/*
+ - p_ere - ERE parser top level, concatenation and alternation
+ == static void p_ere(register struct parse *p, int stop);
+ */
+static void
+p_ere(p, stop)
+register struct parse *p;
+int stop;                      /* character this ERE should end at */
+{
+       register char c;
+       register sopno prevback;
+       register sopno prevfwd;
+       register sopno conc;
+       register int first = 1;         /* is this the first alternative? */
+
+       for (;;) {
+               /* do a bunch of concatenated expressions */
+               conc = HERE();
+               while (MORE() && (c = PEEK()) != '|' && c != stop)
+                       p_ere_exp(p);
+               REQUIRE(HERE() != conc, REG_EMPTY);     /* require nonempty */
+
+               if (!EAT('|'))
+                       break;          /* NOTE BREAK OUT */
+
+               if (first) {
+                       INSERT(OCH_, conc);     /* offset is wrong */
+                       prevfwd = conc;
+                       prevback = conc;
+                       first = 0;
+               }
+               ASTERN(OOR1, prevback);
+               prevback = THERE();
+               AHEAD(prevfwd);                 /* fix previous offset */
+               prevfwd = HERE();
+               EMIT(OOR2, 0);                  /* offset is very wrong */
+       }
+
+       if (!first) {           /* tail-end fixups */
+               AHEAD(prevfwd);
+               ASTERN(O_CH, prevback);
+       }
+
+       assert(!MORE() || SEE(stop));
+}
+
+/*
+ - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op
+ == static void p_ere_exp(register struct parse *p);
+ */
+static void
+p_ere_exp(p)
+register struct parse *p;
+{
+       register char c;
+       register sopno pos;
+       register int count;
+       register int count2;
+       register sopno subno;
+       int wascaret = 0;
+
+       assert(MORE());         /* caller should have ensured this */
+       c = GETNEXT();
+
+       pos = HERE();
+       switch (c) {
+       case '(':
+               REQUIRE(MORE(), REG_EPAREN);
+               p->g->nsub++;
+               subno = p->g->nsub;
+               if (subno < NPAREN)
+                       p->pbegin[subno] = HERE();
+               EMIT(OLPAREN, subno);
+               if (!SEE(')'))
+                       p_ere(p, ')');
+               if (subno < NPAREN) {
+                       p->pend[subno] = HERE();
+                       assert(p->pend[subno] != 0);
+               }
+               EMIT(ORPAREN, subno);
+               MUSTEAT(')', REG_EPAREN);
+               break;
+#ifndef POSIX_MISTAKE
+       case ')':               /* happens only if no current unmatched ( */
+               /*
+                * You may ask, why the ifndef?  Because I didn't notice
+                * this until slightly too late for 1003.2, and none of the
+                * other 1003.2 regular-expression reviewers noticed it at
+                * all.  So an unmatched ) is legal POSIX, at least until
+                * we can get it fixed.
+                */
+               SETERROR(REG_EPAREN);
+               break;
+#endif
+       case '^':
+               EMIT(OBOL, 0);
+               p->g->iflags |= USEBOL;
+               p->g->nbol++;
+               wascaret = 1;
+               break;
+       case '$':
+               EMIT(OEOL, 0);
+               p->g->iflags |= USEEOL;
+               p->g->neol++;
+               break;
+       case '|':
+               SETERROR(REG_EMPTY);
+               break;
+       case '*':
+       case '+':
+       case '?':
+               SETERROR(REG_BADRPT);
+               break;
+       case '.':
+               if (p->g->cflags&REG_NEWLINE)
+                       nonnewline(p);
+               else
+                       EMIT(OANY, 0);
+               break;
+       case '[':
+               p_bracket(p);
+               break;
+       case '\\':
+               REQUIRE(MORE(), REG_EESCAPE);
+               c = GETNEXT();
+               ordinary(p, c);
+               break;
+       case '{':               /* okay as ordinary except if digit follows */
+               REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT);
+               /* FALLTHROUGH */
+       default:
+               ordinary(p, c);
+               break;
+       }
+
+       if (!MORE())
+               return;
+       c = PEEK();
+       /* we call { a repetition if followed by a digit */
+       if (!( c == '*' || c == '+' || c == '?' ||
+                               (c == '{' && MORE2() && isdigit(PEEK2())) ))
+               return;         /* no repetition, we're done */
+       NEXT();
+
+       REQUIRE(!wascaret, REG_BADRPT);
+       switch (c) {
+       case '*':       /* implemented as +? */
+               /* this case does not require the (y|) trick, noKLUDGE */
+               INSERT(OPLUS_, pos);
+               ASTERN(O_PLUS, pos);
+               INSERT(OQUEST_, pos);
+               ASTERN(O_QUEST, pos);
+               break;
+       case '+':
+               INSERT(OPLUS_, pos);
+               ASTERN(O_PLUS, pos);
+               break;
+       case '?':
+               /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+               INSERT(OCH_, pos);              /* offset slightly wrong */
+               ASTERN(OOR1, pos);              /* this one's right */
+               AHEAD(pos);                     /* fix the OCH_ */
+               EMIT(OOR2, 0);                  /* offset very wrong... */
+               AHEAD(THERE());                 /* ...so fix it */
+               ASTERN(O_CH, THERETHERE());
+               break;
+       case '{':
+               count = p_count(p);
+               if (EAT(',')) {
+                       if (isdigit(PEEK())) {
+                               count2 = p_count(p);
+                               REQUIRE(count <= count2, REG_BADBR);
+                       } else          /* single number with comma */
+                               count2 = INFINITY;
+               } else          /* just a single number */
+                       count2 = count;
+               repeat(p, pos, count, count2);
+               if (!EAT('}')) {        /* error heuristics */
+                       while (MORE() && PEEK() != '}')
+                               NEXT();
+                       REQUIRE(MORE(), REG_EBRACE);
+                       SETERROR(REG_BADBR);
+               }
+               break;
+       }
+
+       if (!MORE())
+               return;
+       c = PEEK();
+       if (!( c == '*' || c == '+' || c == '?' ||
+                               (c == '{' && MORE2() && isdigit(PEEK2())) ) )
+               return;
+       SETERROR(REG_BADRPT);
+}
+
+/*
+ - p_str - string (no metacharacters) "parser"
+ == static void p_str(register struct parse *p);
+ */
+static void
+p_str(p)
+register struct parse *p;
+{
+       REQUIRE(MORE(), REG_EMPTY);
+       while (MORE())
+               ordinary(p, GETNEXT());
+}
+
+/*
+ - p_bre - BRE parser top level, anchoring and concatenation
+ == static void p_bre(register struct parse *p, register int end1, \
+ ==    register int end2);
+ * Giving end1 as OUT essentially eliminates the end1/end2 check.
+ *
+ * This implementation is a bit of a kludge, in that a trailing $ is first
+ * taken as an ordinary character and then revised to be an anchor.  The
+ * only undesirable side effect is that '$' gets included as a character
+ * category in such cases.  This is fairly harmless; not worth fixing.
+ * The amount of lookahead needed to avoid this kludge is excessive.
+ */
+static void
+p_bre(p, end1, end2)
+register struct parse *p;
+register int end1;             /* first terminating character */
+register int end2;             /* second terminating character */
+{
+       register sopno start = HERE();
+       register int first = 1;                 /* first subexpression? */
+       register int wasdollar = 0;
+
+       if (EAT('^')) {
+               EMIT(OBOL, 0);
+               p->g->iflags |= USEBOL;
+               p->g->nbol++;
+       }
+       while (MORE() && !SEETWO(end1, end2)) {
+               wasdollar = p_simp_re(p, first);
+               first = 0;
+       }
+       if (wasdollar) {        /* oops, that was a trailing anchor */
+               DROP(1);
+               EMIT(OEOL, 0);
+               p->g->iflags |= USEEOL;
+               p->g->neol++;
+       }
+
+       REQUIRE(HERE() != start, REG_EMPTY);    /* require nonempty */
+}
+
+/*
+ - p_simp_re - parse a simple RE, an atom possibly followed by a repetition
+ == static int p_simp_re(register struct parse *p, int starordinary);
+ */
+static int                     /* was the simple RE an unbackslashed $? */
+p_simp_re(p, starordinary)
+register struct parse *p;
+int starordinary;              /* is a leading * an ordinary character? */
+{
+       register int c;
+       register int count;
+       register int count2;
+       register sopno pos;
+       register int i;
+       register sopno subno;
+#      define  BACKSL  (1<<CHAR_BIT)
+
+       pos = HERE();           /* repetion op, if any, covers from here */
+
+       assert(MORE());         /* caller should have ensured this */
+       c = GETNEXT();
+       if (c == '\\') {
+               REQUIRE(MORE(), REG_EESCAPE);
+               c = BACKSL | (unsigned char)GETNEXT();
+       }
+       switch (c) {
+       case '.':
+               if (p->g->cflags&REG_NEWLINE)
+                       nonnewline(p);
+               else
+                       EMIT(OANY, 0);
+               break;
+       case '[':
+               p_bracket(p);
+               break;
+       case BACKSL|'{':
+               SETERROR(REG_BADRPT);
+               break;
+       case BACKSL|'(':
+               p->g->nsub++;
+               subno = p->g->nsub;
+               if (subno < NPAREN)
+                       p->pbegin[subno] = HERE();
+               EMIT(OLPAREN, subno);
+               /* the MORE here is an error heuristic */
+               if (MORE() && !SEETWO('\\', ')'))
+                       p_bre(p, '\\', ')');
+               if (subno < NPAREN) {
+                       p->pend[subno] = HERE();
+                       assert(p->pend[subno] != 0);
+               }
+               EMIT(ORPAREN, subno);
+               REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
+               break;
+       case BACKSL|')':        /* should not get here -- must be user */
+       case BACKSL|'}':
+               SETERROR(REG_EPAREN);
+               break;
+       case BACKSL|'1':
+       case BACKSL|'2':
+       case BACKSL|'3':
+       case BACKSL|'4':
+       case BACKSL|'5':
+       case BACKSL|'6':
+       case BACKSL|'7':
+       case BACKSL|'8':
+       case BACKSL|'9':
+               i = (c&~BACKSL) - '0';
+               assert(i < NPAREN);
+               if (p->pend[i] != 0) {
+                       assert(i <= p->g->nsub);
+                       EMIT(OBACK_, i);
+                       assert(p->pbegin[i] != 0);
+                       assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
+                       assert(OP(p->strip[p->pend[i]]) == ORPAREN);
+                       (void) dupl(p, p->pbegin[i]+1, p->pend[i]);
+                       EMIT(O_BACK, i);
+               } else
+                       SETERROR(REG_ESUBREG);
+               p->g->backrefs = 1;
+               break;
+       case '*':
+               REQUIRE(starordinary, REG_BADRPT);
+               /* FALLTHROUGH */
+       default:
+               ordinary(p, c &~ BACKSL);
+               break;
+       }
+
+       if (EAT('*')) {         /* implemented as +? */
+               /* this case does not require the (y|) trick, noKLUDGE */
+               INSERT(OPLUS_, pos);
+               ASTERN(O_PLUS, pos);
+               INSERT(OQUEST_, pos);
+               ASTERN(O_QUEST, pos);
+       } else if (EATTWO('\\', '{')) {
+               count = p_count(p);
+               if (EAT(',')) {
+                       if (MORE() && isdigit(PEEK())) {
+                               count2 = p_count(p);
+                               REQUIRE(count <= count2, REG_BADBR);
+                       } else          /* single number with comma */
+                               count2 = INFINITY;
+               } else          /* just a single number */
+                       count2 = count;
+               repeat(p, pos, count, count2);
+               if (!EATTWO('\\', '}')) {       /* error heuristics */
+                       while (MORE() && !SEETWO('\\', '}'))
+                               NEXT();
+                       REQUIRE(MORE(), REG_EBRACE);
+                       SETERROR(REG_BADBR);
+               }
+       } else if (c == (unsigned char)'$')     /* $ (but not \$) ends it */
+               return(1);
+
+       return(0);
+}
+
+/*
+ - p_count - parse a repetition count
+ == static int p_count(register struct parse *p);
+ */
+static int                     /* the value */
+p_count(p)
+register struct parse *p;
+{
+       register int count = 0;
+       register int ndigits = 0;
+
+       while (MORE() && isdigit(PEEK()) && count <= DUPMAX) {
+               count = count*10 + (GETNEXT() - '0');
+               ndigits++;
+       }
+
+       REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
+       return(count);
+}
+
+/*
+ - p_bracket - parse a bracketed character list
+ == static void p_bracket(register struct parse *p);
+ *
+ * Note a significant property of this code:  if the allocset() did SETERROR,
+ * no set operations are done.
+ */
+static void
+p_bracket(p)
+register struct parse *p;
+{
+       register char c;
+       register cset *cs = allocset(p);
+       register int invert = 0;
+
+       /* Dept of Truly Sickening Special-Case Kludges */
+       if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) {
+               EMIT(OBOW, 0);
+               NEXTn(6);
+               return;
+       }
+       if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) {
+               EMIT(OEOW, 0);
+               NEXTn(6);
+               return;
+       }
+
+       if (EAT('^'))
+               invert++;       /* make note to invert set at end */
+       if (EAT(']'))
+               CHadd(cs, ']');
+       else if (EAT('-'))
+               CHadd(cs, '-');
+       while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
+               p_b_term(p, cs);
+       if (EAT('-'))
+               CHadd(cs, '-');
+       MUSTEAT(']', REG_EBRACK);
+
+       if (p->error != 0)      /* don't mess things up further */
+               return;
+
+       if (p->g->cflags&REG_ICASE) {
+               register int i;
+               register int ci;
+
+               for (i = p->g->csetsize - 1; i >= 0; i--)
+                       if (CHIN(cs, i) && isalpha(i)) {
+                               ci = othercase(i);
+                               if (ci != i)
+                                       CHadd(cs, ci);
+                       }
+               if (cs->multis != NULL)
+                       mccase(p, cs);
+       }
+       if (invert) {
+               register int i;
+
+               for (i = p->g->csetsize - 1; i >= 0; i--)
+                       if (CHIN(cs, i))
+                               CHsub(cs, i);
+                       else
+                               CHadd(cs, i);
+               if (p->g->cflags&REG_NEWLINE)
+                       CHsub(cs, '\n');
+               if (cs->multis != NULL)
+                       mcinvert(p, cs);
+       }
+
+       assert(cs->multis == NULL);             /* xxx */
+
+       if (nch(p, cs) == 1) {          /* optimize singleton sets */
+               ordinary(p, firstch(p, cs));
+               freeset(p, cs);
+       } else
+               EMIT(OANYOF, freezeset(p, cs));
+}
+
+/*
+ - p_b_term - parse one term of a bracketed character list
+ == static void p_b_term(register struct parse *p, register cset *cs);
+ */
+static void
+p_b_term(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register char c;
+       register char start, finish;
+       register int i;
+
+       /* classify what we've got */
+       switch ((MORE()) ? PEEK() : '\0') {
+       case '[':
+               c = (MORE2()) ? PEEK2() : '\0';
+               break;
+       case '-':
+               SETERROR(REG_ERANGE);
+               return;                 /* NOTE RETURN */
+               break;
+       default:
+               c = '\0';
+               break;
+       }
+
+       switch (c) {
+       case ':':               /* character class */
+               NEXT2();
+               REQUIRE(MORE(), REG_EBRACK);
+               c = PEEK();
+               REQUIRE(c != '-' && c != ']', REG_ECTYPE);
+               p_b_cclass(p, cs);
+               REQUIRE(MORE(), REG_EBRACK);
+               REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
+               break;
+       case '=':               /* equivalence class */
+               NEXT2();
+               REQUIRE(MORE(), REG_EBRACK);
+               c = PEEK();
+               REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
+               p_b_eclass(p, cs);
+               REQUIRE(MORE(), REG_EBRACK);
+               REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
+               break;
+       default:                /* symbol, ordinary character, or range */
+/* xxx revision needed for multichar stuff */
+               start = p_b_symbol(p);
+               if (SEE('-') && MORE2() && PEEK2() != ']') {
+                       /* range */
+                       NEXT();
+                       if (EAT('-'))
+                               finish = '-';
+                       else
+                               finish = p_b_symbol(p);
+               } else
+                       finish = start;
+/* xxx what about signed chars here... */
+               REQUIRE(start <= finish, REG_ERANGE);
+               for (i = start; i <= finish; i++)
+                       CHadd(cs, i);
+               break;
+       }
+}
+
+/*
+ - p_b_cclass - parse a character-class name and deal with it
+ == static void p_b_cclass(register struct parse *p, register cset *cs);
+ */
+static void
+p_b_cclass(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register char *sp = p->next;
+       register struct cclass *cp;
+       register size_t len;
+       register char *u;
+       register char c;
+
+       while (MORE() && isalpha(PEEK()))
+               NEXT();
+       len = p->next - sp;
+       for (cp = cclasses; cp->name != NULL; cp++)
+               if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
+                       break;
+       if (cp->name == NULL) {
+               /* oops, didn't find it */
+               SETERROR(REG_ECTYPE);
+               return;
+       }
+
+       u = cp->chars;
+       while ((c = *u++) != '\0')
+               CHadd(cs, c);
+       for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
+               MCadd(p, cs, u);
+}
+
+/*
+ - p_b_eclass - parse an equivalence-class name and deal with it
+ == static void p_b_eclass(register struct parse *p, register cset *cs);
+ *
+ * This implementation is incomplete. xxx
+ */
+static void
+p_b_eclass(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register char c;
+
+       c = p_b_coll_elem(p, '=');
+       CHadd(cs, c);
+}
+
+/*
+ - p_b_symbol - parse a character or [..]ed multicharacter collating symbol
+ == static char p_b_symbol(register struct parse *p);
+ */
+static char                    /* value of symbol */
+p_b_symbol(p)
+register struct parse *p;
+{
+       register char value;
+
+       REQUIRE(MORE(), REG_EBRACK);
+       if (!EATTWO('[', '.'))
+               return(GETNEXT());
+
+       /* collating symbol */
+       value = p_b_coll_elem(p, '.');
+       REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
+       return(value);
+}
+
+/*
+ - p_b_coll_elem - parse a collating-element name and look it up
+ == static char p_b_coll_elem(register struct parse *p, int endc);
+ */
+static char                    /* value of collating element */
+p_b_coll_elem(p, endc)
+register struct parse *p;
+int endc;                      /* name ended by endc,']' */
+{
+       register char *sp = p->next;
+       register struct cname *cp;
+       register int len;
+       register char c;
+
+       while (MORE() && !SEETWO(endc, ']'))
+               NEXT();
+       if (!MORE()) {
+               SETERROR(REG_EBRACK);
+               return(0);
+       }
+       len = p->next - sp;
+       for (cp = cnames; cp->name != NULL; cp++)
+               if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
+                       return(cp->code);       /* known name */
+       if (len == 1)
+               return(*sp);    /* single character */
+       SETERROR(REG_ECOLLATE);                 /* neither */
+       return(0);
+}
+
+/*
+ - othercase - return the case counterpart of an alphabetic
+ == static char othercase(int ch);
+ */
+static char                    /* if no counterpart, return ch */
+othercase(ch)
+int ch;
+{
+       assert(isalpha(ch));
+       if (isupper(ch))
+               return(tolower(ch));
+       else if (islower(ch))
+               return(toupper(ch));
+       else                    /* peculiar, but could happen */
+               return(ch);
+}
+
+/*
+ - bothcases - emit a dualcase version of a two-case character
+ == static void bothcases(register struct parse *p, int ch);
+ *
+ * Boy, is this implementation ever a kludge...
+ */
+static void
+bothcases(p, ch)
+register struct parse *p;
+int ch;
+{
+       register char *oldnext = p->next;
+       register char *oldend = p->end;
+       char bracket[3];
+
+       assert(othercase(ch) != ch);    /* p_bracket() would recurse */
+       p->next = bracket;
+       p->end = bracket+2;
+       bracket[0] = ch;
+       bracket[1] = ']';
+       bracket[2] = '\0';
+       p_bracket(p);
+       assert(p->next == bracket+2);
+       p->next = oldnext;
+       p->end = oldend;
+}
+
+/*
+ - ordinary - emit an ordinary character
+ == static void ordinary(register struct parse *p, register int ch);
+ */
+static void
+ordinary(p, ch)
+register struct parse *p;
+register int ch;
+{
+       register cat_t *cap = p->g->categories;
+
+       if ((p->g->cflags&REG_ICASE) && isalpha(ch) && othercase(ch) != ch)
+               bothcases(p, ch);
+       else {
+               EMIT(OCHAR, (unsigned char)ch);
+               if (cap[ch] == 0)
+                       cap[ch] = p->g->ncategories++;
+       }
+}
+
+/*
+ - nonnewline - emit REG_NEWLINE version of OANY
+ == static void nonnewline(register struct parse *p);
+ *
+ * Boy, is this implementation ever a kludge...
+ */
+static void
+nonnewline(p)
+register struct parse *p;
+{
+       register char *oldnext = p->next;
+       register char *oldend = p->end;
+       char bracket[4];
+
+       p->next = bracket;
+       p->end = bracket+3;
+       bracket[0] = '^';
+       bracket[1] = '\n';
+       bracket[2] = ']';
+       bracket[3] = '\0';
+       p_bracket(p);
+       assert(p->next == bracket+3);
+       p->next = oldnext;
+       p->end = oldend;
+}
+
+/*
+ - repeat - generate code for a bounded repetition, recursively if needed
+ == static void repeat(register struct parse *p, sopno start, int from, int to);
+ */
+static void
+repeat(p, start, from, to)
+register struct parse *p;
+sopno start;                   /* operand from here to end of strip */
+int from;                      /* repeated from this number */
+int to;                                /* to this number of times (maybe INFINITY) */
+{
+       register sopno finish = HERE();
+#      define  N       2
+#      define  INF     3
+#      define  REP(f, t)       ((f)*8 + (t))
+#      define  MAP(n)  (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
+       register sopno copy;
+
+       if (p->error != 0)      /* head off possible runaway recursion */
+               return;
+
+       assert(from <= to);
+
+       switch (REP(MAP(from), MAP(to))) {
+       case REP(0, 0):                 /* must be user doing this */
+               DROP(finish-start);     /* drop the operand */
+               break;
+       case REP(0, 1):                 /* as x{1,1}? */
+       case REP(0, N):                 /* as x{1,n}? */
+       case REP(0, INF):               /* as x{1,}? */
+               /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+               INSERT(OCH_, start);            /* offset is wrong... */
+               repeat(p, start+1, 1, to);
+               ASTERN(OOR1, start);
+               AHEAD(start);                   /* ... fix it */
+               EMIT(OOR2, 0);
+               AHEAD(THERE());
+               ASTERN(O_CH, THERETHERE());
+               break;
+       case REP(1, 1):                 /* trivial case */
+               /* done */
+               break;
+       case REP(1, N):                 /* as x?x{1,n-1} */
+               /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+               INSERT(OCH_, start);
+               ASTERN(OOR1, start);
+               AHEAD(start);
+               EMIT(OOR2, 0);                  /* offset very wrong... */
+               AHEAD(THERE());                 /* ...so fix it */
+               ASTERN(O_CH, THERETHERE());
+               copy = dupl(p, start+1, finish+1);
+               assert(copy == finish+4);
+               repeat(p, copy, 1, to-1);
+               break;
+       case REP(1, INF):               /* as x+ */
+               INSERT(OPLUS_, start);
+               ASTERN(O_PLUS, start);
+               break;
+       case REP(N, N):                 /* as xx{m-1,n-1} */
+               copy = dupl(p, start, finish);
+               repeat(p, copy, from-1, to-1);
+               break;
+       case REP(N, INF):               /* as xx{n-1,INF} */
+               copy = dupl(p, start, finish);
+               repeat(p, copy, from-1, to);
+               break;
+       default:                        /* "can't happen" */
+               SETERROR(REG_ASSERT);   /* just in case */
+               break;
+       }
+}
+
+/*
+ - seterr - set an error condition
+ == static int seterr(register struct parse *p, int e);
+ */
+static int                     /* useless but makes type checking happy */
+seterr(p, e)
+register struct parse *p;
+int e;
+{
+       if (p->error == 0)      /* keep earliest error condition */
+               p->error = e;
+       p->next = nuls;         /* try to bring things to a halt */
+       p->end = nuls;
+       return(0);              /* make the return value well-defined */
+}
+
+/*
+ - allocset - allocate a set of characters for []
+ == static cset *allocset(register struct parse *p);
+ */
+static cset *
+allocset(p)
+register struct parse *p;
+{
+       register int no = p->g->ncsets++;
+       register size_t nc;
+       register size_t nbytes;
+       register cset *cs;
+       register size_t css = (size_t)p->g->csetsize;
+       register int i;
+
+       if (no >= p->ncsalloc) {        /* need another column of space */
+               p->ncsalloc += CHAR_BIT;
+               nc = p->ncsalloc;
+               assert(nc % CHAR_BIT == 0);
+               nbytes = nc / CHAR_BIT * css;
+               if (p->g->sets == NULL)
+                       p->g->sets = (cset *)malloc(nc * sizeof(cset));
+               else
+                       p->g->sets = (cset *)realloc((char *)p->g->sets,
+                                                       nc * sizeof(cset));
+               if (p->g->setbits == NULL)
+                       p->g->setbits = (uch *)malloc(nbytes);
+               else {
+                       p->g->setbits = (uch *)realloc((char *)p->g->setbits,
+                                                               nbytes);
+                       /* xxx this isn't right if setbits is now NULL */
+                       for (i = 0; i < no; i++)
+                               p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
+               }
+               if (p->g->sets != NULL && p->g->setbits != NULL)
+                       (void) memset((char *)p->g->setbits + (nbytes - css),
+                                                               0, css);
+               else {
+                       no = 0;
+                       SETERROR(REG_ESPACE);
+                       /* caller's responsibility not to do set ops */
+               }
+       }
+
+       assert(p->g->sets != NULL);     /* xxx */
+       cs = &p->g->sets[no];
+       cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
+       cs->mask = 1 << ((no) % CHAR_BIT);
+       cs->hash = 0;
+       cs->smultis = 0;
+       cs->multis = NULL;
+
+       return(cs);
+}
+
+/*
+ - freeset - free a now-unused set
+ == static void freeset(register struct parse *p, register cset *cs);
+ */
+static void
+freeset(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register int i;
+       register cset *top = &p->g->sets[p->g->ncsets];
+       register size_t css = (size_t)p->g->csetsize;
+
+       for (i = 0; i < css; i++)
+               CHsub(cs, i);
+       if (cs == top-1)        /* recover only the easy case */
+               p->g->ncsets--;
+}
+
+/*
+ - freezeset - final processing on a set of characters
+ == static int freezeset(register struct parse *p, register cset *cs);
+ *
+ * The main task here is merging identical sets.  This is usually a waste
+ * of time (although the hash code minimizes the overhead), but can win
+ * big if REG_ICASE is being used.  REG_ICASE, by the way, is why the hash
+ * is done using addition rather than xor -- all ASCII [aA] sets xor to
+ * the same value!
+ */
+static int                     /* set number */
+freezeset(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register uch h = cs->hash;
+       register int i;
+       register cset *top = &p->g->sets[p->g->ncsets];
+       register cset *cs2;
+       register size_t css = (size_t)p->g->csetsize;
+
+       /* look for an earlier one which is the same */
+       for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
+               if (cs2->hash == h && cs2 != cs) {
+                       /* maybe */
+                       for (i = 0; i < css; i++)
+                               if (!!CHIN(cs2, i) != !!CHIN(cs, i))
+                                       break;          /* no */
+                       if (i == css)
+                               break;                  /* yes */
+               }
+
+       if (cs2 < top) {        /* found one */
+               freeset(p, cs);
+               cs = cs2;
+       }
+
+       return((int)(cs - p->g->sets));
+}
+
+/*
+ - firstch - return first character in a set (which must have at least one)
+ == static int firstch(register struct parse *p, register cset *cs);
+ */
+static int                     /* character; there is no "none" value */
+firstch(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register int i;
+       register size_t css = (size_t)p->g->csetsize;
+
+       for (i = 0; i < css; i++)
+               if (CHIN(cs, i))
+                       return((char)i);
+       assert(never);
+       return(0);              /* arbitrary */
+}
+
+/*
+ - nch - number of characters in a set
+ == static int nch(register struct parse *p, register cset *cs);
+ */
+static int
+nch(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       register int i;
+       register size_t css = (size_t)p->g->csetsize;
+       register int n = 0;
+
+       for (i = 0; i < css; i++)
+               if (CHIN(cs, i))
+                       n++;
+       return(n);
+}
+
+/*
+ - mcadd - add a collating element to a cset
+ == static void mcadd(register struct parse *p, register cset *cs, \
+ ==    register char *cp);
+ */
+static void
+mcadd(p, cs, cp)
+register struct parse *p;
+register cset *cs;
+register char *cp;
+{
+       register size_t oldend = cs->smultis;
+
+       cs->smultis += strlen(cp) + 1;
+       if (cs->multis == NULL)
+               cs->multis = malloc(cs->smultis);
+       else
+               cs->multis = realloc(cs->multis, cs->smultis);
+       if (cs->multis == NULL) {
+               SETERROR(REG_ESPACE);
+               return;
+       }
+
+       (void) strcpy(cs->multis + oldend - 1, cp);
+       cs->multis[cs->smultis - 1] = '\0';
+}
+
+/*
+ - mcsub - subtract a collating element from a cset
+ == static void mcsub(register cset *cs, register char *cp);
+ */
+static void
+mcsub(cs, cp)
+register cset *cs;
+register char *cp;
+{
+       register char *fp = mcfind(cs, cp);
+       register size_t len = strlen(fp);
+
+       assert(fp != NULL);
+       (void) memmove(fp, fp + len + 1,
+                               cs->smultis - (fp + len + 1 - cs->multis));
+       cs->smultis -= len;
+
+       if (cs->smultis == 0) {
+               free(cs->multis);
+               cs->multis = NULL;
+               return;
+       }
+
+       cs->multis = realloc(cs->multis, cs->smultis);
+       assert(cs->multis != NULL);
+}
+
+/*
+ - mcin - is a collating element in a cset?
+ == static int mcin(register cset *cs, register char *cp);
+ */
+static int
+mcin(cs, cp)
+register cset *cs;
+register char *cp;
+{
+       return(mcfind(cs, cp) != NULL);
+}
+
+/*
+ - mcfind - find a collating element in a cset
+ == static char *mcfind(register cset *cs, register char *cp);
+ */
+static char *
+mcfind(cs, cp)
+register cset *cs;
+register char *cp;
+{
+       register char *p;
+
+       if (cs->multis == NULL)
+               return(NULL);
+       for (p = cs->multis; *p != '\0'; p += strlen(p) + 1)
+               if (strcmp(cp, p) == 0)
+                       return(p);
+       return(NULL);
+}
+
+/*
+ - mcinvert - invert the list of collating elements in a cset
+ == static void mcinvert(register struct parse *p, register cset *cs);
+ *
+ * This would have to know the set of possibilities.  Implementation
+ * is deferred.
+ */
+static void
+mcinvert(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       assert(cs->multis == NULL);     /* xxx */
+}
+
+/*
+ - mccase - add case counterparts of the list of collating elements in a cset
+ == static void mccase(register struct parse *p, register cset *cs);
+ *
+ * This would have to know the set of possibilities.  Implementation
+ * is deferred.
+ */
+static void
+mccase(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+       assert(cs->multis == NULL);     /* xxx */
+}
+
+/*
+ - isinsets - is this character in any sets?
+ == static int isinsets(register struct re_guts *g, int c);
+ */
+static int                     /* predicate */
+isinsets(g, c)
+register struct re_guts *g;
+int c;
+{
+       register uch *col;
+       register int i;
+       register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
+       register unsigned uc = (unsigned char)c;
+
+       for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
+               if (col[uc] != 0)
+                       return(1);
+       return(0);
+}
+
+/*
+ - samesets - are these two characters in exactly the same sets?
+ == static int samesets(register struct re_guts *g, int c1, int c2);
+ */
+static int                     /* predicate */
+samesets(g, c1, c2)
+register struct re_guts *g;
+int c1;
+int c2;
+{
+       register uch *col;
+       register int i;
+       register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
+       register unsigned uc1 = (unsigned char)c1;
+       register unsigned uc2 = (unsigned char)c2;
+
+       for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
+               if (col[uc1] != col[uc2])
+                       return(0);
+       return(1);
+}
+
+/*
+ - categorize - sort out character categories
+ == static void categorize(struct parse *p, register struct re_guts *g);
+ */
+static void
+categorize(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+       register cat_t *cats = g->categories;
+       register int c;
+       register int c2;
+       register cat_t cat;
+
+       /* avoid making error situations worse */
+       if (p->error != 0)
+               return;
+
+       for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+               if (cats[c] == 0 && isinsets(g, c)) {
+                       cat = g->ncategories++;
+                       cats[c] = cat;
+                       for (c2 = c+1; c2 <= CHAR_MAX; c2++)
+                               if (cats[c2] == 0 && samesets(g, c, c2))
+                                       cats[c2] = cat;
+               }
+}
+
+/*
+ - dupl - emit a duplicate of a bunch of sops
+ == static sopno dupl(register struct parse *p, sopno start, sopno finish);
+ */
+static sopno                   /* start of duplicate */
+dupl(p, start, finish)
+register struct parse *p;
+sopno start;                   /* from here */
+sopno finish;                  /* to this less one */
+{
+       register sopno ret = HERE();
+       register sopno len = finish - start;
+
+       assert(finish >= start);
+       if (len == 0)
+               return(ret);
+       enlarge(p, p->ssize + len);     /* this many unexpected additions */
+       assert(p->ssize >= p->slen + len);
+       (void) memcpy((char *)(p->strip + p->slen),
+               (char *)(p->strip + start), (size_t)len*sizeof(sop));
+       p->slen += len;
+       return(ret);
+}
+
+/*
+ - doemit - emit a strip operator
+ == static void doemit(register struct parse *p, sop op, size_t opnd);
+ *
+ * It might seem better to implement this as a macro with a function as
+ * hard-case backup, but it's just too big and messy unless there are
+ * some changes to the data structures.  Maybe later.
+ */
+static void
+doemit(p, op, opnd)
+register struct parse *p;
+sop op;
+size_t opnd;
+{
+       /* avoid making error situations worse */
+       if (p->error != 0)
+               return;
+
+       /* deal with oversize operands ("can't happen", more or less) */
+       assert(opnd < 1<<OPSHIFT);
+
+       /* deal with undersized strip */
+       if (p->slen >= p->ssize)
+               enlarge(p, (p->ssize+1) / 2 * 3);       /* +50% */
+       assert(p->slen < p->ssize);
+
+       /* finally, it's all reduced to the easy case */
+       p->strip[p->slen++] = SOP(op, opnd);
+}
+
+/*
+ - doinsert - insert a sop into the strip
+ == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos);
+ */
+static void
+doinsert(p, op, opnd, pos)
+register struct parse *p;
+sop op;
+size_t opnd;
+sopno pos;
+{
+       register sopno sn;
+       register sop s;
+       register int i;
+
+       /* avoid making error situations worse */
+       if (p->error != 0)
+               return;
+
+       sn = HERE();
+       EMIT(op, opnd);         /* do checks, ensure space */
+       assert(HERE() == sn+1);
+       s = p->strip[sn];
+
+       /* adjust paren pointers */
+       assert(pos > 0);
+       for (i = 1; i < NPAREN; i++) {
+               if (p->pbegin[i] >= pos) {
+                       p->pbegin[i]++;
+               }
+               if (p->pend[i] >= pos) {
+                       p->pend[i]++;
+               }
+       }
+
+       memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos],
+                                               (HERE()-pos-1)*sizeof(sop));
+       p->strip[pos] = s;
+}
+
+/*
+ - dofwd - complete a forward reference
+ == static void dofwd(register struct parse *p, sopno pos, sop value);
+ */
+static void
+dofwd(p, pos, value)
+register struct parse *p;
+register sopno pos;
+sop value;
+{
+       /* avoid making error situations worse */
+       if (p->error != 0)
+               return;
+
+       assert(value < 1<<OPSHIFT);
+       p->strip[pos] = OP(p->strip[pos]) | value;
+}
+
+/*
+ - enlarge - enlarge the strip
+ == static void enlarge(register struct parse *p, sopno size);
+ */
+static void
+enlarge(p, size)
+register struct parse *p;
+register sopno size;
+{
+       register sop *sp;
+
+       if (p->ssize >= size)
+               return;
+
+       sp = (sop *)realloc(p->strip, size*sizeof(sop));
+       if (sp == NULL) {
+               SETERROR(REG_ESPACE);
+               return;
+       }
+       p->strip = sp;
+       p->ssize = size;
+}
+
+/*
+ - stripsnug - compact the strip
+ == static void stripsnug(register struct parse *p, register struct re_guts *g);
+ */
+static void
+stripsnug(p, g)
+register struct parse *p;
+register struct re_guts *g;
+{
+       g->nstates = p->slen;
+       g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
+       if (g->strip == NULL) {
+               SETERROR(REG_ESPACE);
+               g->strip = p->strip;
+       }
+}
+
+/*
+ - findmust - fill in must and mlen with longest mandatory literal string
+ == static void findmust(register struct parse *p, register struct re_guts *g);
+ *
+ * This algorithm could do fancy things like analyzing the operands of |
+ * for common subsequences.  Someday.  This code is simple and finds most
+ * of the interesting cases.
+ *
+ * Note that must and mlen got initialized during setup.
+ */
+static void
+findmust(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+       register sop *scan;
+       sop *start;
+       register sop *newstart;
+       register sopno newlen;
+       register sop s;
+       register char *cp;
+       register sopno i;
+
+       /* avoid making error situations worse */
+       if (p->error != 0)
+               return;
+
+       /* find the longest OCHAR sequence in strip */
+       newlen = 0;
+       scan = g->strip + 1;
+       do {
+               s = *scan++;
+               switch (OP(s)) {
+               case OCHAR:             /* sequence member */
+                       if (newlen == 0)                /* new sequence */
+                               newstart = scan - 1;
+                       newlen++;
+                       break;
+               case OPLUS_:            /* things that don't break one */
+               case OLPAREN:
+               case ORPAREN:
+                       break;
+               case OQUEST_:           /* things that must be skipped */
+               case OCH_:
+                       scan--;
+                       do {
+                               scan += OPND(s);
+                               s = *scan;
+                               /* assert() interferes w debug printouts */
+                               if (OP(s) != O_QUEST && OP(s) != O_CH &&
+                                                       OP(s) != OOR2) {
+                                       g->iflags |= BAD;
+                                       return;
+                               }
+                       } while (OP(s) != O_QUEST && OP(s) != O_CH);
+                       /* fallthrough */
+               default:                /* things that break a sequence */
+                       if (newlen > g->mlen) {         /* ends one */
+                               start = newstart;
+                               g->mlen = newlen;
+                       }
+                       newlen = 0;
+                       break;
+               }
+       } while (OP(s) != OEND);
+
+       if (g->mlen == 0)               /* there isn't one */
+               return;
+
+       /* turn it into a character string */
+       g->must = malloc((size_t)g->mlen + 1);
+       if (g->must == NULL) {          /* argh; just forget it */
+               g->mlen = 0;
+               return;
+       }
+       cp = g->must;
+       scan = start;
+       for (i = g->mlen; i > 0; i--) {
+               while (OP(s = *scan++) != OCHAR)
+                       continue;
+               assert(cp < g->must + g->mlen);
+               *cp++ = (char)OPND(s);
+       }
+       assert(cp == g->must + g->mlen);
+       *cp++ = '\0';           /* just on general principles */
+}
+
+/*
+ - pluscount - count + nesting
+ == static sopno pluscount(register struct parse *p, register struct re_guts *g);
+ */
+static sopno                   /* nesting depth */
+pluscount(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+       register sop *scan;
+       register sop s;
+       register sopno plusnest = 0;
+       register sopno maxnest = 0;
+
+       if (p->error != 0)
+               return(0);      /* there may not be an OEND */
+
+       scan = g->strip + 1;
+       do {
+               s = *scan++;
+               switch (OP(s)) {
+               case OPLUS_:
+                       plusnest++;
+                       break;
+               case O_PLUS:
+                       if (plusnest > maxnest)
+                               maxnest = plusnest;
+                       plusnest--;
+                       break;
+               }
+       } while (OP(s) != OEND);
+       if (plusnest != 0)
+               g->iflags |= BAD;
+       return(maxnest);
+}
diff --git a/regex.subproj/regerror.c b/regex.subproj/regerror.c
new file mode 100644 (file)
index 0000000..6d7da99
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+
+/* ========= begin header generated by ./mkh ========= */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* === regerror.c === */
+static char *regatoi __P((const regex_t *preg, char *localbuf));
+
+#ifdef __cplusplus
+}
+#endif
+/* ========= end header generated by ./mkh ========= */
+/*
+ = #define     REG_NOMATCH      1
+ = #define     REG_BADPAT       2
+ = #define     REG_ECOLLATE     3
+ = #define     REG_ECTYPE       4
+ = #define     REG_EESCAPE      5
+ = #define     REG_ESUBREG      6
+ = #define     REG_EBRACK       7
+ = #define     REG_EPAREN       8
+ = #define     REG_EBRACE       9
+ = #define     REG_BADBR       10
+ = #define     REG_ERANGE      11
+ = #define     REG_ESPACE      12
+ = #define     REG_BADRPT      13
+ = #define     REG_EMPTY       14
+ = #define     REG_ASSERT      15
+ = #define     REG_INVARG      16
+ = #define     REG_ATOI        255     // convert name to number (!)
+ = #define     REG_ITOA        0400    // convert number to name (!)
+ */
+static struct rerr {
+       int code;
+       char *name;
+       char *explain;
+} rerrs[] = {
+       REG_NOMATCH,    "REG_NOMATCH",  "regexec() failed to match",
+       REG_BADPAT,     "REG_BADPAT",   "invalid regular expression",
+       REG_ECOLLATE,   "REG_ECOLLATE", "invalid collating element",
+       REG_ECTYPE,     "REG_ECTYPE",   "invalid character class",
+       REG_EESCAPE,    "REG_EESCAPE",  "trailing backslash (\\)",
+       REG_ESUBREG,    "REG_ESUBREG",  "invalid backreference number",
+       REG_EBRACK,     "REG_EBRACK",   "brackets ([ ]) not balanced",
+       REG_EPAREN,     "REG_EPAREN",   "parentheses not balanced",
+       REG_EBRACE,     "REG_EBRACE",   "braces not balanced",
+       REG_BADBR,      "REG_BADBR",    "invalid repetition count(s)",
+       REG_ERANGE,     "REG_ERANGE",   "invalid character range",
+       REG_ESPACE,     "REG_ESPACE",   "out of memory",
+       REG_BADRPT,     "REG_BADRPT",   "repetition-operator operand invalid",
+       REG_EMPTY,      "REG_EMPTY",    "empty (sub)expression",
+       REG_ASSERT,     "REG_ASSERT",   "\"can't happen\" -- you found a bug",
+       REG_INVARG,     "REG_INVARG",   "invalid argument to regex routine",
+       0,              "",             "*** unknown regexp error code ***",
+};
+
+/*
+ - regerror - the interface to error numbers
+ = extern size_t regerror(int, const regex_t *, char *, size_t);
+ */
+/* ARGSUSED */
+size_t
+regerror(errcode, preg, errbuf, errbuf_size)
+int errcode;
+const regex_t *preg;
+char *errbuf;
+size_t errbuf_size;
+{
+       register struct rerr *r;
+       register size_t len;
+       register int target = errcode &~ REG_ITOA;
+       register char *s;
+       char convbuf[50];
+
+       if (errcode == REG_ATOI)
+               s = regatoi(preg, convbuf);
+       else {
+               for (r = rerrs; r->code != 0; r++)
+                       if (r->code == target)
+                               break;
+       
+               if (errcode&REG_ITOA) {
+                       if (r->code != 0)
+                               (void) strcpy(convbuf, r->name);
+                       else
+                               sprintf(convbuf, "REG_0x%x", target);
+                       assert(strlen(convbuf) < sizeof(convbuf));
+                       s = convbuf;
+               } else
+                       s = r->explain;
+       }
+
+       len = strlen(s) + 1;
+       if (errbuf_size > 0) {
+               if (errbuf_size > len)
+                       (void) strcpy(errbuf, s);
+               else {
+                       (void) strncpy(errbuf, s, errbuf_size-1);
+                       errbuf[errbuf_size-1] = '\0';
+               }
+       }
+
+       return(len);
+}
+
+/*
+ - regatoi - internal routine to implement REG_ATOI
+ == static char *regatoi(const regex_t *preg, char *localbuf);
+ */
+static char *
+regatoi(preg, localbuf)
+const regex_t *preg;
+char *localbuf;
+{
+       register struct rerr *r;
+       register size_t siz;
+       register char *p;
+
+       for (r = rerrs; r->code != 0; r++)
+               if (strcmp(r->name, preg->re_endp) == 0)
+                       break;
+       if (r->code == 0)
+               return("0");
+
+       sprintf(localbuf, "%d", r->code);
+       return(localbuf);
+}
diff --git a/regex.subproj/regex2.h b/regex.subproj/regex2.h
new file mode 100644 (file)
index 0000000..d68f62b
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * First, the stuff that ends up in the outside-world include file
+ = typedef off_t regoff_t;
+ = typedef struct {
+ =     int re_magic;
+ =     size_t re_nsub;         // number of parenthesized subexpressions
+ =     const char *re_endp;    // end pointer for REG_PEND
+ =     struct re_guts *re_g;   // none of your business :-)
+ = } regex_t;
+ = typedef struct {
+ =     regoff_t rm_so;         // start of match
+ =     regoff_t rm_eo;         // end of match
+ = } regmatch_t;
+ */
+/*
+ * internals of regex_t
+ */
+#define        MAGIC1  ((('r'^0200)<<8) | 'e')
+
+/*
+ * The internal representation is a *strip*, a sequence of
+ * operators ending with an endmarker.  (Some terminology etc. is a
+ * historical relic of earlier versions which used multiple strips.)
+ * Certain oddities in the representation are there to permit running
+ * the machinery backwards; in particular, any deviation from sequential
+ * flow must be marked at both its source and its destination.  Some
+ * fine points:
+ *
+ * - OPLUS_ and O_PLUS are *inside* the loop they create.
+ * - OQUEST_ and O_QUEST are *outside* the bypass they create.
+ * - OCH_ and O_CH are *outside* the multi-way branch they create, while
+ *   OOR1 and OOR2 are respectively the end and the beginning of one of
+ *   the branches.  Note that there is an implicit OOR2 following OCH_
+ *   and an implicit OOR1 preceding O_CH.
+ *
+ * In state representations, an operator's bit is on to signify a state
+ * immediately *preceding* "execution" of that operator.
+ */
+typedef unsigned long sop;     /* strip operator */
+typedef long sopno;
+#define        OPRMASK 0xf8000000
+#define        OPDMASK 0x07ffffff
+#define        OPSHIFT ((unsigned)27)
+#define        OP(n)   ((n)&OPRMASK)
+#define        OPND(n) ((n)&OPDMASK)
+#define        SOP(op, opnd)   ((op)|(opnd))
+/* operators                      meaning      operand                 */
+/*                                             (back, fwd are offsets) */
+#define        OEND    (1<<OPSHIFT)    /* endmarker    -                       */
+#define        OCHAR   (2<<OPSHIFT)    /* character    unsigned char           */
+#define        OBOL    (3<<OPSHIFT)    /* left anchor  -                       */
+#define        OEOL    (4<<OPSHIFT)    /* right anchor -                       */
+#define        OANY    (5<<OPSHIFT)    /* .            -                       */
+#define        OANYOF  (6<<OPSHIFT)    /* [...]        set number              */
+#define        OBACK_  (7<<OPSHIFT)    /* begin \d     paren number            */
+#define        O_BACK  (8<<OPSHIFT)    /* end \d       paren number            */
+#define        OPLUS_  (9<<OPSHIFT)    /* + prefix     fwd to suffix           */
+#define        O_PLUS  (10<<OPSHIFT)   /* + suffix     back to prefix          */
+#define        OQUEST_ (11<<OPSHIFT)   /* ? prefix     fwd to suffix           */
+#define        O_QUEST (12<<OPSHIFT)   /* ? suffix     back to prefix          */
+#define        OLPAREN (13<<OPSHIFT)   /* (            fwd to )                */
+#define        ORPAREN (14<<OPSHIFT)   /* )            back to (               */
+#define        OCH_    (15<<OPSHIFT)   /* begin choice fwd to OOR2             */
+#define        OOR1    (16<<OPSHIFT)   /* | pt. 1      back to OOR1 or OCH_    */
+#define        OOR2    (17<<OPSHIFT)   /* | pt. 2      fwd to OOR2 or O_CH     */
+#define        O_CH    (18<<OPSHIFT)   /* end choice   back to OOR1            */
+#define        OBOW    (19<<OPSHIFT)   /* begin word   -                       */
+#define        OEOW    (20<<OPSHIFT)   /* end word     -                       */
+
+/*
+ * Structure for [] character-set representation.  Character sets are
+ * done as bit vectors, grouped 8 to a byte vector for compactness.
+ * The individual set therefore has both a pointer to the byte vector
+ * and a mask to pick out the relevant bit of each byte.  A hash code
+ * simplifies testing whether two sets could be identical.
+ *
+ * This will get trickier for multicharacter collating elements.  As
+ * preliminary hooks for dealing with such things, we also carry along
+ * a string of multi-character elements, and decide the size of the
+ * vectors at run time.
+ */
+typedef struct {
+       uch *ptr;               /* -> uch [csetsize] */
+       uch mask;               /* bit within array */
+       uch hash;               /* hash code */
+       size_t smultis;
+       char *multis;           /* -> char[smulti]  ab\0cd\0ef\0\0 */
+} cset;
+/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
+#define        CHadd(cs, c)    ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c))
+#define        CHsub(cs, c)    ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c))
+#define        CHIN(cs, c)     ((cs)->ptr[(uch)(c)] & (cs)->mask)
+#define        MCadd(p, cs, cp)        mcadd(p, cs, cp)        /* regcomp() internal fns */
+#define        MCsub(p, cs, cp)        mcsub(p, cs, cp)
+#define        MCin(p, cs, cp) mcin(p, cs, cp)
+
+/* stuff for character categories */
+typedef unsigned char cat_t;
+
+/*
+ * main compiled-expression structure
+ */
+struct re_guts {
+       int magic;
+#              define  MAGIC2  ((('R'^0200)<<8)|'E')
+       sop *strip;             /* malloced area for strip */
+       int csetsize;           /* number of bits in a cset vector */
+       int ncsets;             /* number of csets in use */
+       cset *sets;             /* -> cset [ncsets] */
+       uch *setbits;           /* -> uch[csetsize][ncsets/CHAR_BIT] */
+       int cflags;             /* copy of regcomp() cflags argument */
+       sopno nstates;          /* = number of sops */
+       sopno firststate;       /* the initial OEND (normally 0) */
+       sopno laststate;        /* the final OEND */
+       int iflags;             /* internal flags */
+#              define  USEBOL  01      /* used ^ */
+#              define  USEEOL  02      /* used $ */
+#              define  BAD     04      /* something wrong */
+       int nbol;               /* number of ^ used */
+       int neol;               /* number of $ used */
+       int ncategories;        /* how many character categories */
+       cat_t *categories;      /* ->catspace[-CHAR_MIN] */
+       char *must;             /* match must contain this string */
+       int mlen;               /* length of must */
+       size_t nsub;            /* copy of re_nsub */
+       int backrefs;           /* does it use back references? */
+       sopno nplus;            /* how deep does it nest +s? */
+       /* catspace must be last */
+       cat_t catspace[1];      /* actually [NC] */
+};
+
+/* misc utilities */
+#define        OUT     (CHAR_MAX+1)    /* a non-character value */
+#define        ISWORD(c)       (isalnum(c) || (c) == '_')
diff --git a/regex.subproj/regexec.c b/regex.subproj/regexec.c
new file mode 100644 (file)
index 0000000..928e272
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * the outer shell of regexec()
+ *
+ * This file includes engine.c *twice*, after muchos fiddling with the
+ * macros that code uses.  This lets the same code operate on two different
+ * representations for state sets.
+ */
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+static int nope = 0;           /* for use in asserts; shuts lint up */
+
+/* macros for manipulating states, small version */
+#define        states  long
+#define        states1 states          /* for later use in regexec() decision */
+#define        CLEAR(v)        ((v) = 0)
+#define        SET0(v, n)      ((v) &= ~(1 << (n)))
+#define        SET1(v, n)      ((v) |= 1 << (n))
+#define        ISSET(v, n)     ((v) & (1 << (n)))
+#define        ASSIGN(d, s)    ((d) = (s))
+#define        EQ(a, b)        ((a) == (b))
+#define        STATEVARS       int dummy       /* dummy version */
+#define        STATESETUP(m, n)        /* nothing */
+#define        STATETEARDOWN(m)        /* nothing */
+#define        SETUP(v)        ((v) = 0)
+#define        onestate        int
+#define        INIT(o, n)      ((o) = (unsigned)1 << (n))
+#define        INC(o)  ((o) <<= 1)
+#define        ISSTATEIN(v, o) ((v) & (o))
+/* some abbreviations; note that some of these know variable names! */
+/* do "if I'm here, I can also be there" etc without branches */
+#define        FWD(dst, src, n)        ((dst) |= ((unsigned)(src)&(here)) << (n))
+#define        BACK(dst, src, n)       ((dst) |= ((unsigned)(src)&(here)) >> (n))
+#define        ISSETBACK(v, n) ((v) & ((unsigned)here >> (n)))
+/* function names */
+#define SNAMES                 /* engine.c looks after details */
+
+#include "engine.c"
+
+/* now undo things */
+#undef states
+#undef CLEAR
+#undef SET0
+#undef SET1
+#undef ISSET
+#undef ASSIGN
+#undef EQ
+#undef STATEVARS
+#undef STATESETUP
+#undef STATETEARDOWN
+#undef SETUP
+#undef onestate
+#undef INIT
+#undef INC
+#undef ISSTATEIN
+#undef FWD
+#undef BACK
+#undef ISSETBACK
+#undef SNAMES
+
+/* macros for manipulating states, large version */
+#define        states  char *
+#define        CLEAR(v)        memset(v, 0, m->g->nstates)
+#define        SET0(v, n)      ((v)[n] = 0)
+#define        SET1(v, n)      ((v)[n] = 1)
+#define        ISSET(v, n)     ((v)[n])
+#define        ASSIGN(d, s)    memcpy(d, s, m->g->nstates)
+#define        EQ(a, b)        (memcmp(a, b, m->g->nstates) == 0)
+#define        STATEVARS       int vn; char *space
+#define        STATESETUP(m, nv)       { (m)->space = malloc((nv)*(m)->g->nstates); \
+                               if ((m)->space == NULL) return(REG_ESPACE); \
+                               (m)->vn = 0; }
+#define        STATETEARDOWN(m)        { free((m)->space); }
+#define        SETUP(v)        ((v) = &m->space[m->vn++ * m->g->nstates])
+#define        onestate        int
+#define        INIT(o, n)      ((o) = (n))
+#define        INC(o)  ((o)++)
+#define        ISSTATEIN(v, o) ((v)[o])
+/* some abbreviations; note that some of these know variable names! */
+/* do "if I'm here, I can also be there" etc without branches */
+#define        FWD(dst, src, n)        ((dst)[here+(n)] |= (src)[here])
+#define        BACK(dst, src, n)       ((dst)[here-(n)] |= (src)[here])
+#define        ISSETBACK(v, n) ((v)[here - (n)])
+/* function names */
+#define        LNAMES                  /* flag */
+
+#include "engine.c"
+
+/*
+ - regexec - interface for matching
+ = extern int regexec(const regex_t *, const char *, size_t, \
+ =                                     regmatch_t [], int);
+ = #define     REG_NOTBOL      00001
+ = #define     REG_NOTEOL      00002
+ = #define     REG_STARTEND    00004
+ = #define     REG_TRACE       00400   // tracing of execution
+ = #define     REG_LARGE       01000   // force large representation
+ = #define     REG_BACKR       02000   // force use of backref code
+ *
+ * We put this here so we can exploit knowledge of the state representation
+ * when choosing which matcher to call.  Also, by this point the matchers
+ * have been prototyped.
+ */
+int                            /* 0 success, REG_NOMATCH failure */
+regexec(preg, string, nmatch, pmatch, eflags)
+const regex_t *preg;
+const char *string;
+size_t nmatch;
+regmatch_t pmatch[];
+int eflags;
+{
+       register struct re_guts *g = preg->re_g;
+#ifdef REDEBUG
+#      define  GOODFLAGS(f)    (f)
+#else
+#      define  GOODFLAGS(f)    ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
+#endif
+
+       if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
+               return(REG_BADPAT);
+       assert(!(g->iflags&BAD));
+       if (g->iflags&BAD)              /* backstop for no-debug case */
+               return(REG_BADPAT);
+       eflags = GOODFLAGS(eflags);
+
+       if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
+               return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
+       else
+               return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
+}
diff --git a/regex.subproj/regfree.c b/regex.subproj/regfree.c
new file mode 100644 (file)
index 0000000..9d81d4c
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)regfree.c  8.3 (Berkeley) 3/20/94";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+/*
+ - regfree - free everything
+ = extern void regfree(regex_t *);
+ */
+void
+regfree(preg)
+regex_t *preg;
+{
+       register struct re_guts *g;
+
+       if (preg->re_magic != MAGIC1)   /* oops */
+               return;                 /* nice to complain, but hard */
+
+       g = preg->re_g;
+       if (g == NULL || g->magic != MAGIC2)    /* oops again */
+               return;
+       preg->re_magic = 0;             /* mark it invalid */
+       g->magic = 0;                   /* mark it invalid */
+
+       if (g->strip != NULL)
+               free((char *)g->strip);
+       if (g->sets != NULL)
+               free((char *)g->sets);
+       if (g->setbits != NULL)
+               free((char *)g->setbits);
+       if (g->must != NULL)
+               free(g->must);
+       free((char *)g);
+}
diff --git a/regex.subproj/utils.h b/regex.subproj/utils.h
new file mode 100644 (file)
index 0000000..f18607b
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Henry Spencer.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* utility definitions */
+#define        DUPMAX          _POSIX2_RE_DUP_MAX      /* xxx is this right? */
+#define        INFINITY        (DUPMAX + 1)
+#define        NC              (CHAR_MAX - CHAR_MIN + 1)
+typedef unsigned char uch;
+
+/* switch off assertions (if not already off) if no REDEBUG */
+#ifndef REDEBUG
+#ifndef NDEBUG
+#define        NDEBUG  /* no assertions please */
+#endif
+#endif
+#include <assert.h>
+
+/* for old systems with bcopy() but no memmove() */
+#ifdef USEBCOPY
+#define        memmove(d, s, c)        bcopy(s, d, c)
+#endif
diff --git a/stdio.subproj/Makefile b/stdio.subproj/Makefile
new file mode 100644 (file)
index 0000000..4fc67ac
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = stdio
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = floatio.h fvwrite.h glue.h local.h
+
+CFILES = clrerr.c fclose.c fdopen.c feof.c ferror.c fflush.c fgetc.c\
+         fgetln.c fgetpos.c fgets.c fileno.c findfp.c flags.c\
+         fopen.c fprintf.c fpurge.c fputc.c fputs.c fread.c\
+         freopen.c fscanf.c fseek.c fsetpos.c ftell.c funopen.c\
+         fvwrite.c fwalk.c fwrite.c getc.c getchar.c gets.c getw.c\
+         makebuf.c mktemp.c perror.c printf.c putc.c putchar.c\
+         puts.c putw.c refill.c remove.c rewind.c rget.c scanf.c\
+         setbuf.c setbuffer.c setvbuf.c snprintf.c sprintf.c sscanf.c\
+         stdio.c tempnam.c tmpfile.c tmpnam.c ungetc.c vfprintf.c\
+         vfscanf.c vprintf.c vscanf.c vsnprintf.c vsprintf.c\
+         vsscanf.c wbuf.c wsetup.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/stdio.subproj/Makefile.postamble b/stdio.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/stdio.subproj/Makefile.preamble b/stdio.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/stdio.subproj/PB.project b/stdio.subproj/PB.project
new file mode 100644 (file)
index 0000000..5d739da
--- /dev/null
@@ -0,0 +1,89 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (floatio.h, fvwrite.h, glue.h, local.h); 
+        OTHER_LINKED = (
+            clrerr.c, 
+            fclose.c, 
+            fdopen.c, 
+            feof.c, 
+            ferror.c, 
+            fflush.c, 
+            fgetc.c, 
+            fgetln.c, 
+            fgetpos.c, 
+            fgets.c, 
+            fileno.c, 
+            findfp.c, 
+            flags.c, 
+            fopen.c, 
+            fprintf.c, 
+            fpurge.c, 
+            fputc.c, 
+            fputs.c, 
+            fread.c, 
+            freopen.c, 
+            fscanf.c, 
+            fseek.c, 
+            fsetpos.c, 
+            ftell.c, 
+            funopen.c, 
+            fvwrite.c, 
+            fwalk.c, 
+            fwrite.c, 
+            getc.c, 
+            getchar.c, 
+            gets.c, 
+            getw.c, 
+            makebuf.c, 
+            mktemp.c, 
+            perror.c, 
+            printf.c, 
+            putc.c, 
+            putchar.c, 
+            puts.c, 
+            putw.c, 
+            refill.c, 
+            remove.c, 
+            rewind.c, 
+            rget.c, 
+            scanf.c, 
+            setbuf.c, 
+            setbuffer.c, 
+            setvbuf.c, 
+            snprintf.c, 
+            sprintf.c, 
+            sscanf.c, 
+            stdio.c, 
+            tempnam.c, 
+            tmpfile.c, 
+            tmpnam.c, 
+            ungetc.c, 
+            vfprintf.c, 
+            vfscanf.c, 
+            vprintf.c, 
+            vscanf.c, 
+            vsnprintf.c, 
+            vsprintf.c, 
+            vsscanf.c, 
+            wbuf.c, 
+            wsetup.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = stdio; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/stdio.subproj/clrerr.c b/stdio.subproj/clrerr.c
new file mode 100644 (file)
index 0000000..610dae9
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#undef clearerr
+
+void
+clearerr(fp)
+       FILE *fp;
+{
+       __sclearerr(fp);
+}
diff --git a/stdio.subproj/fclose.c b/stdio.subproj/fclose.c
new file mode 100644 (file)
index 0000000..e7b1c97
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+int
+fclose(fp)
+       register FILE *fp;
+{
+       register int r;
+
+       if (fp->_flags == 0) {  /* not open! */
+               errno = EBADF;
+               return (EOF);
+       }
+       r = fp->_flags & __SWR ? __sflush(fp) : 0;
+       if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0)
+               r = EOF;
+       if (fp->_flags & __SMBF)
+               free((char *)fp->_bf._base);
+       if (HASUB(fp))
+               FREEUB(fp);
+       if (HASLB(fp))
+               FREELB(fp);
+       fp->_flags = 0;         /* Release this FILE for reuse. */
+       fp->_r = fp->_w = 0;    /* Mess up if reaccessed. */
+       return (r);
+}
diff --git a/stdio.subproj/fdopen.c b/stdio.subproj/fdopen.c
new file mode 100644 (file)
index 0000000..4bc1a94
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include "local.h"
+
+FILE *
+fdopen(fd, mode)
+       int fd;
+       const char *mode;
+{
+       register FILE *fp;
+       static int nofile;
+       int flags, oflags, fdflags, tmp;
+
+       if (nofile == 0)
+               nofile = getdtablesize();
+
+       if ((flags = __sflags(mode, &oflags)) == 0)
+               return (NULL);
+
+       /* Make sure the mode the user wants is a subset of the actual mode. */
+       if ((fdflags = fcntl(fd, F_GETFL, 0)) < 0)
+               return (NULL);
+       tmp = fdflags & O_ACCMODE;
+       if (tmp != O_RDWR && (tmp != (oflags & O_ACCMODE))) {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       if ((fp = __sfp()) == NULL)
+               return (NULL);
+       fp->_flags = flags;
+       /*
+        * If opened for appending, but underlying descriptor does not have
+        * O_APPEND bit set, assert __SAPP so that __swrite() will lseek to
+        * end before each write.
+        */
+       if ((oflags & O_APPEND) && !(fdflags & O_APPEND))
+               fp->_flags |= __SAPP;
+       fp->_file = fd;
+       fp->_cookie = fp;
+       fp->_read = __sread;
+       fp->_write = __swrite;
+       fp->_seek = __sseek;
+       fp->_close = __sclose;
+       return (fp);
+}
diff --git a/stdio.subproj/feof.c b/stdio.subproj/feof.c
new file mode 100644 (file)
index 0000000..756ff08
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+/*
+ * A subroutine version of the macro feof.
+ */
+#undef feof
+
+int
+feof(fp)
+       FILE *fp;
+{
+       return (__sfeof(fp));
+}
diff --git a/stdio.subproj/ferror.c b/stdio.subproj/ferror.c
new file mode 100644 (file)
index 0000000..ef590e5
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+/*
+ * A subroutine version of the macro ferror.
+ */
+#undef ferror
+
+int
+ferror(fp)
+       FILE *fp;
+{
+       return (__sferror(fp));
+}
diff --git a/stdio.subproj/fflush.c b/stdio.subproj/fflush.c
new file mode 100644 (file)
index 0000000..33793d4
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include "local.h"
+
+/* Flush a single file, or (if fp is NULL) all files.  */
+int
+fflush(fp)
+       register FILE *fp;
+{
+
+       if (fp == NULL)
+               return (_fwalk(__sflush));
+       if ((fp->_flags & (__SWR | __SRW)) == 0) {
+               errno = EBADF;
+               return (EOF);
+       }
+       return (__sflush(fp));
+}
+
+int
+__sflush(fp)
+       register FILE *fp;
+{
+       register unsigned char *p;
+       register int n, t;
+
+       t = fp->_flags;
+       if ((t & __SWR) == 0)
+               return (0);
+
+       if ((p = fp->_bf._base) == NULL)
+               return (0);
+
+       n = fp->_p - p;         /* write this much */
+
+       /*
+        * Set these immediately to avoid problems with longjmp and to allow
+        * exchange buffering (via setvbuf) in user write function.
+        */
+       fp->_p = p;
+       fp->_w = t & (__SLBF|__SNBF) ? 0 : fp->_bf._size;
+
+       for (; n > 0; n -= t, p += t) {
+               t = (*fp->_write)(fp->_cookie, (char *)p, n);
+               if (t <= 0) {
+                       fp->_flags |= __SERR;
+                       return (EOF);
+               }
+       }
+       return (0);
+}
diff --git a/stdio.subproj/fgetc.c b/stdio.subproj/fgetc.c
new file mode 100644 (file)
index 0000000..78a771b
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+fgetc(fp)
+       FILE *fp;
+{
+       return (__sgetc(fp));
+}
diff --git a/stdio.subproj/fgetln.c b/stdio.subproj/fgetln.c
new file mode 100644 (file)
index 0000000..d1ce9d5
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "local.h"
+
+/*
+ * Expand the line buffer.  Return -1 on error.
+#ifdef notdef
+ * The `new size' does not account for a terminating '\0',
+ * so we add 1 here.
+#endif
+ */
+int
+__slbexpand(fp, newsize)
+       FILE *fp;
+       size_t newsize;
+{
+       void *p;
+
+#ifdef notdef
+       ++newsize;
+#endif
+       if (fp->_lb._size >= newsize)
+               return (0);
+       if ((p = realloc(fp->_lb._base, newsize)) == NULL)
+               return (-1);
+       fp->_lb._base = p;
+       fp->_lb._size = newsize;
+       return (0);
+}
+
+/*
+ * Get an input line.  The returned pointer often (but not always)
+ * points into a stdio buffer.  Fgetln does not alter the text of
+ * the returned line (which is thus not a C string because it will
+ * not necessarily end with '\0'), but does allow callers to modify
+ * it if they wish.  Thus, we set __SMOD in case the caller does.
+ */
+char *
+fgetln(fp, lenp)
+       register FILE *fp;
+       size_t *lenp;
+{
+       register unsigned char *p;
+       register size_t len;
+       size_t off;
+
+       /* make sure there is input */
+       if (fp->_r <= 0 && __srefill(fp)) {
+               *lenp = 0;
+               return (NULL);
+       }
+
+       /* look for a newline in the input */
+       if ((p = memchr((void *)fp->_p, '\n', fp->_r)) != NULL) {
+               register char *ret;
+
+               /*
+                * Found one.  Flag buffer as modified to keep fseek from
+                * `optimising' a backward seek, in case the user stomps on
+                * the text.
+                */
+               p++;            /* advance over it */
+               ret = (char *)fp->_p;
+               *lenp = len = p - fp->_p;
+               fp->_flags |= __SMOD;
+               fp->_r -= len;
+               fp->_p = p;
+               return (ret);
+       }
+
+       /*
+        * We have to copy the current buffered data to the line buffer.
+        * As a bonus, though, we can leave off the __SMOD.
+        *
+        * OPTIMISTIC is length that we (optimistically) expect will
+        * accomodate the `rest' of the string, on each trip through the
+        * loop below.
+        */
+#define OPTIMISTIC 80
+
+       for (len = fp->_r, off = 0;; len += fp->_r) {
+               register size_t diff;
+
+               /*
+                * Make sure there is room for more bytes.  Copy data from
+                * file buffer to line buffer, refill file and look for
+                * newline.  The loop stops only when we find a newline.
+                */
+               if (__slbexpand(fp, len + OPTIMISTIC))
+                       goto error;
+               (void)memcpy((void *)(fp->_lb._base + off), (void *)fp->_p,
+                   len - off);
+               off = len;
+               if (__srefill(fp))
+                       break;  /* EOF or error: return partial line */
+               if ((p = memchr((void *)fp->_p, '\n', fp->_r)) == NULL)
+                       continue;
+
+               /* got it: finish up the line (like code above) */
+               p++;
+               diff = p - fp->_p;
+               len += diff;
+               if (__slbexpand(fp, len))
+                       goto error;
+               (void)memcpy((void *)(fp->_lb._base + off), (void *)fp->_p,
+                   diff);
+               fp->_r -= diff;
+               fp->_p = p;
+               break;
+       }
+       *lenp = len;
+#ifdef notdef
+       fp->_lb._base[len] = 0;
+#endif
+       return ((char *)fp->_lb._base);
+
+error:
+       *lenp = 0;              /* ??? */
+       return (NULL);          /* ??? */
+}
diff --git a/stdio.subproj/fgetpos.c b/stdio.subproj/fgetpos.c
new file mode 100644 (file)
index 0000000..0dfafd6
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+fgetpos(fp, pos)
+       FILE *fp;
+       fpos_t *pos;
+{
+       int retval;
+       /* FLOCKFILE(fp); */
+       retval = (*pos = ftello(fp)) == (fpos_t)-1;
+       /* FUNLOCKFILE(fp); */
+       return(retval);
+}
diff --git a/stdio.subproj/fgets.c b/stdio.subproj/fgets.c
new file mode 100644 (file)
index 0000000..45da44e
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * Read at most n-1 characters from the given file.
+ * Stop when a newline has been read, or the count runs out.
+ * Return first argument, or NULL if no characters were read.
+ */
+char *
+fgets(buf, n, fp)
+       char *buf;
+       register size_t n;
+       register FILE *fp;
+{
+       register size_t len;
+       register char *s;
+       register unsigned char *p, *t;
+
+       if (n == 0)             /* sanity check */
+               return (NULL);
+
+       s = buf;
+       n--;                    /* leave space for NUL */
+       while (n != 0) {
+               /*
+                * If the buffer is empty, refill it.
+                */
+               if ((len = fp->_r) <= 0) {
+                       if (__srefill(fp)) {
+                               /* EOF/error: stop with partial or no line */
+                               if (s == buf)
+                                       return (NULL);
+                               break;
+                       }
+                       len = fp->_r;
+               }
+               p = fp->_p;
+
+               /*
+                * Scan through at most n bytes of the current buffer,
+                * looking for '\n'.  If found, copy up to and including
+                * newline, and stop.  Otherwise, copy entire chunk
+                * and loop.
+                */
+               if (len > n)
+                       len = n;
+               t = memchr((void *)p, '\n', len);
+               if (t != NULL) {
+                       len = ++t - p;
+                       fp->_r -= len;
+                       fp->_p = t;
+                       (void)memcpy((void *)s, (void *)p, len);
+                       s[len] = 0;
+                       return (buf);
+               }
+               fp->_r -= len;
+               fp->_p += len;
+               (void)memcpy((void *)s, (void *)p, len);
+               s += len;
+               n -= len;
+       }
+       *s = 0;
+       return (buf);
+}
diff --git a/stdio.subproj/fileno.c b/stdio.subproj/fileno.c
new file mode 100644 (file)
index 0000000..b5d106a
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+/*
+ * A subroutine version of the macro fileno.
+ */
+#undef fileno
+
+int
+fileno(fp)
+       FILE *fp;
+{
+       return (__sfileno(fp));
+}
diff --git a/stdio.subproj/findfp.c b/stdio.subproj/findfp.c
new file mode 100644 (file)
index 0000000..405a911
--- /dev/null
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include "local.h"
+#include "glue.h"
+
+int    __sdidinit = 0;
+
+#define        NDYNAMIC 10             /* add ten more whenever necessary */
+
+#define        std(flags, file) \
+       {0,0,0,flags,file,{0},0,__sF+file,__sclose,__sread,__sseek,__swrite}
+/*      p r w flags file _bf z  cookie      close    read    seek    write */
+
+                               /* the usual - (stdin + stdout + stderr) */
+static FILE usual[FOPEN_MAX - 3];
+static struct glue uglue = { 0, FOPEN_MAX - 3, usual };
+
+FILE __sF[3] = {
+       std(__SRD, STDIN_FILENO),               /* stdin */
+       std(__SWR, STDOUT_FILENO),              /* stdout */
+       std(__SWR|__SNBF, STDERR_FILENO)        /* stderr */
+};
+struct glue __sglue = { &uglue, 3, __sF };
+
+static struct glue *
+moreglue(n)
+       register int n;
+{
+       register struct glue *g;
+       register FILE *p;
+       static FILE empty;
+
+       g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE));
+       if (g == NULL)
+               return (NULL);
+       p = (FILE *)ALIGN(g + 1);
+       g->next = NULL;
+       g->niobs = n;
+       g->iobs = p;
+       while (--n >= 0)
+               *p++ = empty;
+       return (g);
+}
+
+/*
+ * Find a free FILE for fopen et al.
+ */
+FILE *
+__sfp()
+{
+       register FILE *fp;
+       register int n;
+       register struct glue *g;
+
+       if (!__sdidinit)
+               __sinit();
+       for (g = &__sglue;; g = g->next) {
+               for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
+                       if (fp->_flags == 0)
+                               goto found;
+               if (g->next == NULL && (g->next = moreglue(NDYNAMIC)) == NULL)
+                       break;
+       }
+       return (NULL);
+found:
+       fp->_flags = 1;         /* reserve this slot; caller sets real flags */
+       fp->_p = NULL;          /* no current pointer */
+       fp->_w = 0;             /* nothing to read or write */
+       fp->_r = 0;
+       fp->_bf._base = NULL;   /* no buffer */
+       fp->_bf._size = 0;
+       fp->_lbfsize = 0;       /* not line buffered */
+       fp->_file = -1;         /* no file */
+/*     fp->_cookie = <any>; */ /* caller sets cookie, _read/_write etc */
+       fp->_ub._base = NULL;   /* no ungetc buffer */
+       fp->_ub._size = 0;
+       fp->_lb._base = NULL;   /* no line buffer */
+       fp->_lb._size = 0;
+       return (fp);
+}
+
+/*
+ * XXX.  Force immediate allocation of internal memory.  Not used by stdio,
+ * but documented historically for certain applications.  Bad applications.
+ */
+void
+f_prealloc()
+{
+       register struct glue *g;
+       int n;
+
+       n = getdtablesize() - FOPEN_MAX + 20;           /* 20 for slop. */
+       for (g = &__sglue; (n -= g->niobs) > 0 && g->next; g = g->next)
+               /* void */;
+       if (n > 0)
+               g->next = moreglue(n);
+}
+
+/*
+ * exit() calls _cleanup() through *__cleanup, set whenever we
+ * open or buffer a file.  This chicanery is done so that programs
+ * that do not use stdio need not link it all in.
+ *
+ * The name `_cleanup' is, alas, fairly well known outside stdio.
+ */
+void
+_cleanup()
+{
+       /* (void) _fwalk(fclose); */
+       (void) _fwalk(__sflush);                /* `cheating' */
+}
+
+/*
+ * __sinit() is called whenever stdio's internal variables must be set up.
+ */
+void
+__sinit()
+{
+       /* make sure we clean up on exit */
+       __cleanup = _cleanup;           /* conservative */
+       __sdidinit = 1;
+}
diff --git a/stdio.subproj/flags.c b/stdio.subproj/flags.c
new file mode 100644 (file)
index 0000000..22cc1e9
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <stdio.h>
+#include <errno.h>
+
+/*
+ * Return the (stdio) flags for a given mode.  Store the flags
+ * to be passed to an open() syscall through *optr.
+ * Return 0 on error.
+ */
+int
+__sflags(mode, optr)
+       register char *mode;
+       int *optr;
+{
+       register int ret, m, o;
+
+       switch (*mode++) {
+
+       case 'r':       /* open for reading */
+               ret = __SRD;
+               m = O_RDONLY;
+               o = 0;
+               break;
+
+       case 'w':       /* open for writing */
+               ret = __SWR;
+               m = O_WRONLY;
+               o = O_CREAT | O_TRUNC;
+               break;
+
+       case 'a':       /* open for appending */
+               ret = __SWR;
+               m = O_WRONLY;
+               o = O_CREAT | O_APPEND;
+               break;
+
+       default:        /* illegal mode */
+               errno = EINVAL;
+               return (0);
+       }
+
+       /* [rwa]\+ or [rwa]b\+ means read and write */
+       if (*mode == '+' || (*mode == 'b' && mode[1] == '+')) {
+               ret = __SRW;
+               m = O_RDWR;
+       }
+       *optr = m | o;
+       return (ret);
+}
diff --git a/stdio.subproj/floatio.h b/stdio.subproj/floatio.h
new file mode 100644 (file)
index 0000000..06be4a7
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Floating point scanf/printf (input/output) definitions.
+ */
+
+/* 11-bit exponent (VAX G floating point) is 308 decimal digits */
+#define        MAXEXP          308
+/* 128 bit fraction takes up 39 decimal digits; max reasonable precision */
+#define        MAXFRACT        39
diff --git a/stdio.subproj/fopen.c b/stdio.subproj/fopen.c
new file mode 100644 (file)
index 0000000..4f10f39
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include "local.h"
+
+FILE *
+fopen(file, mode)
+       const char *file;
+       const char *mode;
+{
+       register FILE *fp;
+       register int f;
+       int flags, oflags;
+
+       if ((flags = __sflags(mode, &oflags)) == 0)
+               return (NULL);
+       if ((fp = __sfp()) == NULL)
+               return (NULL);
+       if ((f = open(file, oflags, DEFFILEMODE)) < 0) {
+               fp->_flags = 0;                 /* release */
+               return (NULL);
+       }
+       fp->_file = f;
+       fp->_flags = flags;
+       fp->_cookie = fp;
+       fp->_read = __sread;
+       fp->_write = __swrite;
+       fp->_seek = __sseek;
+       fp->_close = __sclose;
+
+       /*
+        * When opening in append mode, even though we use O_APPEND,
+        * we need to seek to the end so that ftell() gets the right
+        * answer.  If the user then alters the seek pointer, or
+        * the file extends, this will fail, but there is not much
+        * we can do about this.  (We could set __SAPP and check in
+        * fseek and ftell.)
+        */
+       if (oflags & O_APPEND)
+               (void) __sseek((void *)fp, (fpos_t)0, SEEK_END);
+       return (fp);
+}
diff --git a/stdio.subproj/fprintf.c b/stdio.subproj/fprintf.c
new file mode 100644 (file)
index 0000000..761156d
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+int
+#if __STDC__
+fprintf(FILE *fp, const char *fmt, ...)
+#else
+fprintf(fp, fmt, va_alist)
+       FILE *fp;
+       char *fmt;
+       va_dcl
+#endif
+{
+       int ret;
+       va_list ap;
+
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       ret = vfprintf(fp, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
diff --git a/stdio.subproj/fpurge.c b/stdio.subproj/fpurge.c
new file mode 100644 (file)
index 0000000..65c0fad
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+/*
+ * fpurge: like fflush, but without writing anything: leave the
+ * given FILE's buffer empty.
+ */
+int
+fpurge(fp)
+       register FILE *fp;
+{
+       if (!fp->_flags) {
+               errno = EBADF;
+               return(EOF);
+       }
+
+       if (HASUB(fp))
+               FREEUB(fp);
+       fp->_p = fp->_bf._base;
+       fp->_r = 0;
+       fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : fp->_bf._size;
+       return (0);
+}
diff --git a/stdio.subproj/fputc.c b/stdio.subproj/fputc.c
new file mode 100644 (file)
index 0000000..2e31e22
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+fputc(c, fp)
+       int c;
+       register FILE *fp;
+{
+       return (putc(c, fp));
+}
diff --git a/stdio.subproj/fputs.c b/stdio.subproj/fputs.c
new file mode 100644 (file)
index 0000000..855db46
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include "fvwrite.h"
+
+/*
+ * Write the given string to the given file.
+ */
+int
+fputs(s, fp)
+       const char *s;
+       FILE *fp;
+{
+       struct __suio uio;
+       struct __siov iov;
+
+       iov.iov_base = (void *)s;
+       iov.iov_len = uio.uio_resid = strlen(s);
+       uio.uio_iov = &iov;
+       uio.uio_iovcnt = 1;
+       return (__sfvwrite(fp, &uio));
+}
diff --git a/stdio.subproj/fread.c b/stdio.subproj/fread.c
new file mode 100644 (file)
index 0000000..5d622ea
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+
+size_t
+fread(buf, size, count, fp)
+       void *buf;
+       size_t size, count;
+       register FILE *fp;
+{
+       register size_t resid;
+       register char *p;
+       register int r;
+       size_t total;
+
+       /*
+        * The ANSI standard requires a return value of 0 for a count
+        * or a size of 0.  Peculiarily, it imposes no such requirements
+        * on fwrite; it only requires fread to be broken.
+        */
+       if ((resid = count * size) == 0)
+               return (0);
+       if (fp->_r < 0)
+               fp->_r = 0;
+       total = resid;
+       p = buf;
+       while (resid > (r = fp->_r)) {
+               (void)memcpy((void *)p, (void *)fp->_p, (size_t)r);
+               fp->_p += r;
+               /* fp->_r = 0 ... done in __srefill */
+               p += r;
+               resid -= r;
+               if (__srefill(fp)) {
+                       /* no more input: return partial result */
+                       return ((total - resid) / size);
+               }
+       }
+       (void)memcpy((void *)p, (void *)fp->_p, resid);
+       fp->_r -= resid;
+       fp->_p += resid;
+       return (count);
+}
diff --git a/stdio.subproj/freopen.c b/stdio.subproj/freopen.c
new file mode 100644 (file)
index 0000000..9e38851
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+/* 
+ * Re-direct an existing, open (probably) file to some other file. 
+ * ANSI is written such that the original file gets closed if at
+ * all possible, no matter what.
+ */
+FILE *
+freopen(file, mode, fp)
+       const char *file, *mode;
+       register FILE *fp;
+{
+       register int f;
+       int flags, isopen, oflags, sverrno, wantfd;
+
+       if ((flags = __sflags(mode, &oflags)) == 0) {
+               (void) fclose(fp);
+               return (NULL);
+       }
+
+       if (!__sdidinit)
+               __sinit();
+
+       /*
+        * There are actually programs that depend on being able to "freopen"
+        * descriptors that weren't originally open.  Keep this from breaking.
+        * Remember whether the stream was open to begin with, and which file
+        * descriptor (if any) was associated with it.  If it was attached to
+        * a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin)
+        * should work.  This is unnecessary if it was not a Unix file.
+        */
+       if (fp->_flags == 0) {
+               fp->_flags = __SEOF;    /* hold on to it */
+               isopen = 0;
+               wantfd = -1;
+       } else {
+               /* flush the stream; ANSI doesn't require this. */
+               if (fp->_flags & __SWR)
+                       (void) __sflush(fp);
+               /* if close is NULL, closing is a no-op, hence pointless */
+               isopen = fp->_close != NULL;
+               if ((wantfd = fp->_file) < 0 && isopen) {
+                       (void) (*fp->_close)(fp->_cookie);
+                       isopen = 0;
+               }
+       }
+
+       /* Get a new descriptor to refer to the new file. */
+       f = open(file, oflags, DEFFILEMODE);
+       if (f < 0 && isopen) {
+               /* If out of fd's close the old one and try again. */
+               if (errno == ENFILE || errno == EMFILE) {
+                       (void) (*fp->_close)(fp->_cookie);
+                       isopen = 0;
+                       f = open(file, oflags, DEFFILEMODE);
+               }
+       }
+       sverrno = errno;
+
+       /*
+        * Finish closing fp.  Even if the open succeeded above, we cannot
+        * keep fp->_base: it may be the wrong size.  This loses the effect
+        * of any setbuffer calls, but stdio has always done this before.
+        */
+       if (isopen)
+               (void) (*fp->_close)(fp->_cookie);
+       if (fp->_flags & __SMBF)
+               free((char *)fp->_bf._base);
+       fp->_w = 0;
+       fp->_r = 0;
+       fp->_p = NULL;
+       fp->_bf._base = NULL;
+       fp->_bf._size = 0;
+       fp->_lbfsize = 0;
+       if (HASUB(fp))
+               FREEUB(fp);
+       fp->_ub._size = 0;
+       if (HASLB(fp))
+               FREELB(fp);
+       fp->_lb._size = 0;
+
+       if (f < 0) {                    /* did not get it after all */
+               fp->_flags = 0;         /* set it free */
+               errno = sverrno;        /* restore in case _close clobbered */
+               return (NULL);
+       }
+
+       /*
+        * If reopening something that was open before on a real file, try
+        * to maintain the descriptor.  Various C library routines (perror)
+        * assume stderr is always fd STDERR_FILENO, even if being freopen'd.
+        */
+       if (wantfd >= 0 && f != wantfd) {
+               if (dup2(f, wantfd) >= 0) {
+                       (void) close(f);
+                       f = wantfd;
+               }
+       }
+
+       fp->_flags = flags;
+       fp->_file = f;
+       fp->_cookie = fp;
+       fp->_read = __sread;
+       fp->_write = __swrite;
+       fp->_seek = __sseek;
+       fp->_close = __sclose;
+       return (fp);
+}
diff --git a/stdio.subproj/fscanf.c b/stdio.subproj/fscanf.c
new file mode 100644 (file)
index 0000000..27a3028
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+int
+#if __STDC__
+fscanf(FILE *fp, char const *fmt, ...) {
+       int ret;
+       va_list ap;
+
+       va_start(ap, fmt);
+#else
+fscanf(fp, fmt, va_alist)
+       FILE *fp;
+       char *fmt;
+       va_dcl
+{
+       int ret;
+       va_list ap;
+
+       va_start(ap);
+#endif
+       ret = __svfscanf(fp, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
diff --git a/stdio.subproj/fseek.c b/stdio.subproj/fseek.c
new file mode 100644 (file)
index 0000000..802e3cc
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "local.h"
+
+#define        POS_ERR (-(fpos_t)1)
+
+int
+fseek(fp, offset, whence)
+       register FILE *fp;
+       long offset;
+       int whence;
+{
+       return (fseeko(fp, offset, whence));
+}
+
+
+/*
+ * Seek the given file to the given offset.
+ * `Whence' must be one of the three SEEK_* macros.
+ */
+int
+fseeko(fp, offset, whence)
+       register FILE *fp;
+       off_t offset;
+       int whence;
+{
+       register fpos_t (*seekfn) __P((void *, fpos_t, int));
+       fpos_t target, curoff;
+       size_t n;
+       struct stat st;
+       int havepos;
+
+       /* make sure stdio is set up */
+       if (!__sdidinit)
+               __sinit();
+
+       /* FLOCKFILE(fp); */
+       /*
+        * Have to be able to seek.
+        */
+       if ((seekfn = fp->_seek) == NULL) {
+               errno = ESPIPE;                 /* historic practice */
+               /* FUNLOCKFILE(fp); */
+               return (EOF);
+       }
+
+       /*
+        * Change any SEEK_CUR to SEEK_SET, and check `whence' argument.
+        * After this, whence is either SEEK_SET or SEEK_END.
+        */
+       switch (whence) {
+
+       case SEEK_CUR:
+               /*
+                * In order to seek relative to the current stream offset,
+                * we have to first find the current stream offset a la
+                * ftell (see ftell for details).
+                */
+               if (fp->_flags & __SOFF)
+                       curoff = fp->_offset;
+               else {
+                       curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR);
+                       if (curoff == -1) {
+                               /* FUNLOCKFILE(fp); */
+                               return (EOF);
+                       }
+               }
+               if (fp->_flags & __SRD) {
+                       curoff -= fp->_r;
+                       if (HASUB(fp))
+                               curoff -= fp->_ur;
+               } else if (fp->_flags & __SWR && fp->_p != NULL)
+                       curoff += fp->_p - fp->_bf._base;
+
+               offset += curoff;
+               whence = SEEK_SET;
+               havepos = 1;
+               break;
+
+       case SEEK_SET:
+       case SEEK_END:
+               curoff = 0;             /* XXX just to keep gcc quiet */
+               havepos = 0;
+               break;
+
+       default:
+               errno = EINVAL;
+               /* FUNLOCKFILE(fp); */
+               return (EOF);
+       }
+
+       /*
+        * Can only optimise if:
+        *      reading (and not reading-and-writing);
+        *      not unbuffered; and
+        *      this is a `regular' Unix file (and hence seekfn==__sseek).
+        * We must check __NBF first, because it is possible to have __NBF
+        * and __SOPT both set.
+        */
+       if (fp->_bf._base == NULL)
+               __smakebuf(fp);
+       if (fp->_flags & (__SWR | __SRW | __SNBF | __SNPT))
+               goto dumb;
+       if ((fp->_flags & __SOPT) == 0) {
+               if (seekfn != __sseek ||
+                   fp->_file < 0 || fstat(fp->_file, &st) ||
+                   (st.st_mode & S_IFMT) != S_IFREG) {
+                       fp->_flags |= __SNPT;
+                       goto dumb;
+               }
+               fp->_blksize = st.st_blksize;
+               fp->_flags |= __SOPT;
+       }
+
+       /*
+        * We are reading; we can try to optimise.
+        * Figure out where we are going and where we are now.
+        */
+       if (whence == SEEK_SET)
+               target = offset;
+       else {
+               if (fstat(fp->_file, &st))
+                       goto dumb;
+               target = st.st_size + offset;
+       }
+
+       if (!havepos) {
+               if (fp->_flags & __SOFF)
+                       curoff = fp->_offset;
+               else {
+                       curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR);
+                       if (curoff == POS_ERR)
+                               goto dumb;
+               }
+               curoff -= fp->_r;
+               if (HASUB(fp))
+                       curoff -= fp->_ur;
+       }
+
+       /*
+        * Compute the number of bytes in the input buffer (pretending
+        * that any ungetc() input has been discarded).  Adjust current
+        * offset backwards by this count so that it represents the
+        * file offset for the first byte in the current input buffer.
+        */
+       if (HASUB(fp)) {
+               curoff += fp->_r;       /* kill off ungetc */
+               n = fp->_up - fp->_bf._base;
+               curoff -= n;
+               n += fp->_ur;
+       } else {
+               n = fp->_p - fp->_bf._base;
+               curoff -= n;
+               n += fp->_r;
+       }
+
+       /*
+        * If the target offset is within the current buffer,
+        * simply adjust the pointers, clear EOF, undo ungetc(),
+        * and return.  (If the buffer was modified, we have to
+        * skip this; see fgetln.c.)
+        */
+       if ((fp->_flags & __SMOD) == 0 &&
+           target >= curoff && target < curoff + n) {
+               register int o = target - curoff;
+
+               fp->_p = fp->_bf._base + o;
+               fp->_r = n - o;
+               if (HASUB(fp))
+                       FREEUB(fp);
+               fp->_flags &= ~__SEOF;
+               /* FUNLOCKFILE(fp); */
+               return (0);
+       }
+
+       /*
+        * The place we want to get to is not within the current buffer,
+        * but we can still be kind to the kernel copyout mechanism.
+        * By aligning the file offset to a block boundary, we can let
+        * the kernel use the VM hardware to map pages instead of
+        * copying bytes laboriously.  Using a block boundary also
+        * ensures that we only read one block, rather than two.
+        */
+       curoff = target & ~(fp->_blksize - 1);
+       if ((*seekfn)(fp->_cookie, curoff, SEEK_SET) == POS_ERR)
+               goto dumb;
+       fp->_r = 0;
+       fp->_p = fp->_bf._base;
+       if (HASUB(fp))
+               FREEUB(fp);
+       fp->_flags &= ~__SEOF;
+       n = target - curoff;
+       if (n) {
+               if (__srefill(fp) || fp->_r < n)
+                       goto dumb;
+               fp->_p += n;
+               fp->_r -= n;
+       }
+       /* FUNLOCKFILE(fp); */
+       return (0);
+
+       /*
+        * We get here if we cannot optimise the seek ... just
+        * do it.  Allow the seek function to change fp->_bf._base.
+        */
+dumb:
+       if (__sflush(fp) ||
+           (*seekfn)(fp->_cookie, (fpos_t)offset, whence) == POS_ERR) {
+               /* FUNLOCKFILE(fp); */
+               return (EOF);
+       }
+       /* success: clear EOF indicator and discard ungetc() data */
+       if (HASUB(fp))
+               FREEUB(fp);
+       fp->_p = fp->_bf._base;
+       fp->_r = 0;
+       /* fp->_w = 0; */       /* unnecessary (I think...) */
+       fp->_flags &= ~__SEOF;
+       /* FUNLOCKFILE(fp); */
+       return (0);
+}
diff --git a/stdio.subproj/fsetpos.c b/stdio.subproj/fsetpos.c
new file mode 100644 (file)
index 0000000..7397bb9
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+
+/*
+ * fsetpos: like fseek.
+ */
+int
+fsetpos(iop, pos)
+       FILE *iop;
+       const fpos_t *pos;
+{
+       return (fseeko(iop, (off_t)*pos, SEEK_SET));
+}
diff --git a/stdio.subproj/ftell.c b/stdio.subproj/ftell.c
new file mode 100644 (file)
index 0000000..b899c66
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <errno.h>
+#include "local.h"
+
+/*
+ * ftello: return current offset.
+ */
+off_t
+ftello(fp)
+       register FILE *fp;
+{
+       register fpos_t pos;
+
+       if (fp->_seek == NULL) {
+               errno = ESPIPE;                 /* historic practice */
+               return (-1L);
+       }
+
+       /* FLOCKFILE(fp); */
+       /*
+        * Find offset of underlying I/O object, then
+        * adjust for buffered bytes.
+        */
+       if (fp->_flags & __SOFF)
+               pos = fp->_offset;
+       else {
+               pos = (*fp->_seek)(fp->_cookie, (fpos_t)0, SEEK_CUR);
+               if (pos == -1) {
+                       /* FUNLOCKFILE(fp); */
+                       return (pos);
+               }
+       }
+       if (fp->_flags & __SRD) {
+               /*
+                * Reading.  Any unread characters (including
+                * those from ungetc) cause the position to be
+                * smaller than that in the underlying object.
+                */
+               pos -= fp->_r;
+               if (HASUB(fp))
+                       pos -= fp->_ur;
+       } else if (fp->_flags & __SWR && fp->_p != NULL) {
+               /*
+                * Writing.  Any buffered characters cause the
+                * position to be greater than that in the
+                * underlying object.
+                */
+               pos += fp->_p - fp->_bf._base;
+       }
+       /* FUNLOCKFILE(fp); */
+       return (pos);
+}
+
+/*
+ * standard ftell function.
+ */
+long
+ftell(fp)
+        register FILE *fp;
+{
+        register off_t rv;
+        rv = ftello(fp);
+        if ((long)rv != rv) {
+                errno = EOVERFLOW;
+                return (-1);
+        }
+        return (rv);
+}
diff --git a/stdio.subproj/funopen.c b/stdio.subproj/funopen.c
new file mode 100644 (file)
index 0000000..d96a23f
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <errno.h>
+#include "local.h"
+
+FILE *
+funopen(cookie, readfn, writefn, seekfn, closefn)
+       const void *cookie;
+       int (*readfn)(), (*writefn)();
+#if __STDC__
+       fpos_t (*seekfn)(void *cookie, fpos_t off, int whence);
+#else
+       fpos_t (*seekfn)();
+#endif
+       int (*closefn)();
+{
+       register FILE *fp;
+       int flags;
+
+       if (readfn == NULL) {
+               if (writefn == NULL) {          /* illegal */
+                       errno = EINVAL;
+                       return (NULL);
+               } else
+                       flags = __SWR;          /* write only */
+       } else {
+               if (writefn == NULL)
+                       flags = __SRD;          /* read only */
+               else
+                       flags = __SRW;          /* read-write */
+       }
+       if ((fp = __sfp()) == NULL)
+               return (NULL);
+       fp->_flags = flags;
+       fp->_file = -1;
+       fp->_cookie = (void *)cookie;
+       fp->_read = readfn;
+       fp->_write = writefn;
+       fp->_seek = seekfn;
+       fp->_close = closefn;
+       return (fp);
+}
diff --git a/stdio.subproj/fvwrite.c b/stdio.subproj/fvwrite.c
new file mode 100644 (file)
index 0000000..f7d2c86
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include "local.h"
+#include "fvwrite.h"
+
+/*
+ * Write some memory regions.  Return zero on success, EOF on error.
+ *
+ * This routine is large and unsightly, but most of the ugliness due
+ * to the three different kinds of output buffering is handled here.
+ */
+int
+__sfvwrite(fp, uio)
+       register FILE *fp;
+       register struct __suio *uio;
+{
+       register size_t len;
+       register char *p;
+       register struct __siov *iov;
+       register int w, s;
+       char *nl;
+       int nlknown, nldist;
+
+       if ((len = uio->uio_resid) == 0)
+               return (0);
+       /* make sure we can write */
+       if (cantwrite(fp))
+               return (EOF);
+
+#define        MIN(a, b) ((a) < (b) ? (a) : (b))
+#define        COPY(n)   (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n))
+
+       iov = uio->uio_iov;
+       p = iov->iov_base;
+       len = iov->iov_len;
+       iov++;
+#define GETIOV(extra_work) \
+       while (len == 0) { \
+               extra_work; \
+               p = iov->iov_base; \
+               len = iov->iov_len; \
+               iov++; \
+       }
+       if (fp->_flags & __SNBF) {
+               /*
+                * Unbuffered: write up to BUFSIZ bytes at a time.
+                */
+               do {
+                       GETIOV(;);
+                       w = (*fp->_write)(fp->_cookie, p, MIN(len, BUFSIZ));
+                       if (w <= 0)
+                               goto err;
+                       p += w;
+                       len -= w;
+               } while ((uio->uio_resid -= w) != 0);
+       } else if ((fp->_flags & __SLBF) == 0) {
+               /*
+                * Fully buffered: fill partially full buffer, if any,
+                * and then flush.  If there is no partial buffer, write
+                * one _bf._size byte chunk directly (without copying).
+                *
+                * String output is a special case: write as many bytes
+                * as fit, but pretend we wrote everything.  This makes
+                * snprintf() return the number of bytes needed, rather
+                * than the number used, and avoids its write function
+                * (so that the write function can be invalid).
+                */
+               do {
+                       GETIOV(;);
+                       w = fp->_w;
+                       if (fp->_flags & __SSTR) {
+                               if (len < w)
+                                       w = len;
+                               COPY(w);        /* copy MIN(fp->_w,len), */
+                               fp->_w -= w;
+                               fp->_p += w;
+                               w = len;        /* but pretend copied all */
+                       } else if (fp->_p > fp->_bf._base && len > w) {
+                               /* fill and flush */
+                               COPY(w);
+                               /* fp->_w -= w; */ /* unneeded */
+                               fp->_p += w;
+                               if (fflush(fp))
+                                       goto err;
+                       } else if (len >= (w = fp->_bf._size)) {
+                               /* write directly */
+                               w = (*fp->_write)(fp->_cookie, p, w);
+                               if (w <= 0)
+                                       goto err;
+                       } else {
+                               /* fill and done */
+                               w = len;
+                               COPY(w);
+                               fp->_w -= w;
+                               fp->_p += w;
+                       }
+                       p += w;
+                       len -= w;
+               } while ((uio->uio_resid -= w) != 0);
+       } else {
+               /*
+                * Line buffered: like fully buffered, but we
+                * must check for newlines.  Compute the distance
+                * to the first newline (including the newline),
+                * or `infinity' if there is none, then pretend
+                * that the amount to write is MIN(len,nldist).
+                */
+               nlknown = 0;
+               nldist = 0;     /* XXX just to keep gcc happy */
+               do {
+                       GETIOV(nlknown = 0);
+                       if (!nlknown) {
+                               nl = memchr((void *)p, '\n', len);
+                               nldist = nl ? nl + 1 - p : len + 1;
+                               nlknown = 1;
+                       }
+                       s = MIN(len, nldist);
+                       w = fp->_w + fp->_bf._size;
+                       if (fp->_p > fp->_bf._base && s > w) {
+                               COPY(w);
+                               /* fp->_w -= w; */
+                               fp->_p += w;
+                               if (fflush(fp))
+                                       goto err;
+                       } else if (s >= (w = fp->_bf._size)) {
+                               w = (*fp->_write)(fp->_cookie, p, w);
+                               if (w <= 0)
+                                       goto err;
+                       } else {
+                               w = s;
+                               COPY(w);
+                               fp->_w -= w;
+                               fp->_p += w;
+                       }
+                       if ((nldist -= w) == 0) {
+                               /* copied the newline: flush and forget */
+                               if (fflush(fp))
+                                       goto err;
+                               nlknown = 0;
+                       }
+                       p += w;
+                       len -= w;
+               } while ((uio->uio_resid -= w) != 0);
+       }
+       return (0);
+
+err:
+       fp->_flags |= __SERR;
+       return (EOF);
+}
diff --git a/stdio.subproj/fvwrite.h b/stdio.subproj/fvwrite.h
new file mode 100644 (file)
index 0000000..7b021ce
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * I/O descriptors for __sfvwrite().
+ */
+struct __siov {
+       void    *iov_base;
+       size_t  iov_len;
+};
+struct __suio {
+       struct  __siov *uio_iov;
+       int     uio_iovcnt;
+       int     uio_resid;
+};
+
+#if __STDC__ || c_plusplus
+extern int __sfvwrite(FILE *, struct __suio *);
+#else
+extern int __sfvwrite();
+#endif
diff --git a/stdio.subproj/fwalk.c b/stdio.subproj/fwalk.c
new file mode 100644 (file)
index 0000000..ddbf641
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include "local.h"
+#include "glue.h"
+
+int
+_fwalk(function)
+       register int (*function)();
+{
+       register FILE *fp;
+       register int n, ret;
+       register struct glue *g;
+
+       ret = 0;
+       for (g = &__sglue; g != NULL; g = g->next)
+               for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
+                       if (fp->_flags != 0)
+                               ret |= (*function)(fp);
+       return (ret);
+}
diff --git a/stdio.subproj/fwrite.c b/stdio.subproj/fwrite.c
new file mode 100644 (file)
index 0000000..7e4e82f
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include "local.h"
+#include "fvwrite.h"
+
+/*
+ * Write `count' objects (each size `size') from memory to the given file.
+ * Return the number of whole objects written.
+ */
+size_t
+fwrite(buf, size, count, fp)
+       const void *buf;
+       size_t size, count;
+       FILE *fp;
+{
+       size_t n;
+       struct __suio uio;
+       struct __siov iov;
+
+       iov.iov_base = (void *)buf;
+       uio.uio_resid = iov.iov_len = n = count * size;
+       uio.uio_iov = &iov;
+       uio.uio_iovcnt = 1;
+
+       /*
+        * The usual case is success (__sfvwrite returns 0);
+        * skip the divide if this happens, since divides are
+        * generally slow and since this occurs whenever size==0.
+        */
+       if (__sfvwrite(fp, &uio) == 0)
+               return (count);
+       return ((n - uio.uio_resid) / size);
+}
diff --git a/stdio.subproj/getc.c b/stdio.subproj/getc.c
new file mode 100644 (file)
index 0000000..b4af96a
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+/*
+ * A subroutine version of the macro getc.
+ */
+#undef getc
+
+int
+getc(fp)
+       register FILE *fp;
+{
+       return (__sgetc(fp));
+}
diff --git a/stdio.subproj/getchar.c b/stdio.subproj/getchar.c
new file mode 100644 (file)
index 0000000..e7d7e5a
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * A subroutine version of the macro getchar.
+ */
+#include <stdio.h>
+
+#undef getchar
+
+int
+getchar()
+{
+       return (getc(stdin));
+}
diff --git a/stdio.subproj/gets.c b/stdio.subproj/gets.c
new file mode 100644 (file)
index 0000000..ea8b1e5
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <unistd.h>
+#include <stdio.h>
+
+char *
+gets(buf)
+       char *buf;
+{
+       register int c;
+       register char *s;
+       static int warned;
+       static char w[] =
+           "warning: this program uses gets(), which is unsafe.\r\n";
+
+       if (!warned) {
+               (void) write(STDERR_FILENO, w, sizeof(w) - 1);
+               warned = 1;
+       }
+       for (s = buf; (c = getchar()) != '\n';)
+               if (c == EOF)
+                       if (s == buf)
+                               return (NULL);
+                       else
+                               break;
+               else
+                       *s++ = c;
+       *s = 0;
+       return (buf);
+}
diff --git a/stdio.subproj/getw.c b/stdio.subproj/getw.c
new file mode 100644 (file)
index 0000000..a2776b3
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+getw(fp)
+       FILE *fp;
+{
+       int x;
+
+       return (fread((void *)&x, sizeof(x), 1, fp) == 1 ? x : EOF);
+}
diff --git a/stdio.subproj/glue.h b/stdio.subproj/glue.h
new file mode 100644 (file)
index 0000000..4636067
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * The first few FILEs are statically allocated; others are dynamically
+ * allocated and linked in via this glue structure.
+ */
+struct glue {
+       struct  glue *next;
+       int     niobs;
+       FILE    *iobs;
+};
+
+extern struct glue __sglue;
diff --git a/stdio.subproj/local.h b/stdio.subproj/local.h
new file mode 100644 (file)
index 0000000..ae80de0
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Information local to this implementation of stdio,
+ * in particular, macros and private variables.
+ */
+
+extern int     __sflush __P((FILE *));
+extern FILE    *__sfp __P((void));
+extern int     __srefill __P((FILE *));
+extern int     __sread __P((void *, char *, int));
+extern int     __swrite __P((void *, char const *, int));
+extern fpos_t  __sseek __P((void *, fpos_t, int));
+extern int     __sclose __P((void *));
+extern void    __sinit __P((void));
+extern void    _cleanup __P((void));
+extern void    (*__cleanup) __P((void));
+extern void    __smakebuf __P((FILE *));
+extern int     __swhatbuf __P((FILE *, size_t *, int *));
+extern int     _fwalk __P((int (*)(FILE *)));
+extern int     __swsetup __P((FILE *));
+extern int     __sflags __P((const char *, int *));
+
+extern int __sdidinit;
+extern void (*__cleanup) __P((void));
+
+/*
+ * Return true iff the given FILE cannot be written now.
+ */
+#define        cantwrite(fp) \
+       ((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \
+        __swsetup(fp))
+
+/*
+ * Test whether the given stdio file has an active ungetc buffer;
+ * release such a buffer, without restoring ordinary unread data.
+ */
+#define        HASUB(fp) ((fp)->_ub._base != NULL)
+#define        FREEUB(fp) { \
+       if ((fp)->_ub._base != (fp)->_ubuf) \
+               free((char *)(fp)->_ub._base); \
+       (fp)->_ub._base = NULL; \
+}
+
+/*
+ * test for an fgetln() buffer.
+ */
+#define        HASLB(fp) ((fp)->_lb._base != NULL)
+#define        FREELB(fp) { \
+       free((char *)(fp)->_lb._base); \
+       (fp)->_lb._base = NULL; \
+}
diff --git a/stdio.subproj/makebuf.c b/stdio.subproj/makebuf.c
new file mode 100644 (file)
index 0000000..89c3bbb
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+/*
+ * Allocate a file buffer, or switch to unbuffered I/O.
+ * Per the ANSI C standard, ALL tty devices default to line buffered.
+ *
+ * As a side effect, we set __SOPT or __SNPT (en/dis-able fseek
+ * optimisation) right after the fstat() that finds the buffer size.
+ */
+void
+__smakebuf(fp)
+       register FILE *fp;
+{
+       register void *p;
+       register int flags;
+       size_t size;
+       int couldbetty;
+
+       if (fp->_flags & __SNBF) {
+               fp->_bf._base = fp->_p = fp->_nbuf;
+               fp->_bf._size = 1;
+               return;
+       }
+       flags = __swhatbuf(fp, &size, &couldbetty);
+       if ((p = malloc(size)) == NULL) {
+               fp->_flags |= __SNBF;
+               fp->_bf._base = fp->_p = fp->_nbuf;
+               fp->_bf._size = 1;
+               return;
+       }
+       __cleanup = _cleanup;
+       flags |= __SMBF;
+       fp->_bf._base = fp->_p = p;
+       fp->_bf._size = size;
+       if (couldbetty && isatty(fp->_file))
+               flags |= __SLBF;
+       fp->_flags |= flags;
+}
+
+/*
+ * Internal routine to determine `proper' buffering for a file.
+ */
+int
+__swhatbuf(fp, bufsize, couldbetty)
+       register FILE *fp;
+       size_t *bufsize;
+       int *couldbetty;
+{
+       struct stat st;
+
+       if (fp->_file < 0 || fstat(fp->_file, &st) < 0) {
+               *couldbetty = 0;
+               *bufsize = BUFSIZ;
+               return (__SNPT);
+       }
+
+       /* could be a tty iff it is a character device */
+       *couldbetty = (st.st_mode & S_IFMT) == S_IFCHR;
+       if (st.st_blksize <= 0) {
+               *bufsize = BUFSIZ;
+               return (__SNPT);
+       }
+
+       /*
+        * Optimise fseek() only if it is a regular file.  (The test for
+        * __sseek is mainly paranoia.)  It is safe to set _blksize
+        * unconditionally; it will only be used if __SOPT is also set.
+        */
+       *bufsize = st.st_blksize;
+       fp->_blksize = st.st_blksize;
+       return ((st.st_mode & S_IFMT) == S_IFREG && fp->_seek == __sseek ?
+           __SOPT : __SNPT);
+}
diff --git a/stdio.subproj/mktemp.c b/stdio.subproj/mktemp.c
new file mode 100644 (file)
index 0000000..e6e29eb
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+
+static int _gettemp();
+
+int
+mkstemp(path)
+       char *path;
+{
+       int fd;
+
+       return (_gettemp(path, &fd) ? fd : -1);
+}
+
+char *
+mktemp(path)
+       char *path;
+{
+       return(_gettemp(path, (int *)NULL) ? path : (char *)NULL);
+}
+
+static int
+_gettemp(path, doopen)
+       char *path;
+       register int *doopen;
+{
+       register char *start, *trv;
+       struct stat sbuf;
+       u_int pid;
+
+       pid = getpid();
+       for (trv = path; *trv; ++trv);          /* extra X's get set to 0's */
+       while (*--trv == 'X') {
+               *trv = (pid % 10) + '0';
+               pid /= 10;
+       }
+
+       /*
+        * check the target directory; if you have six X's and it
+        * doesn't exist this runs for a *very* long time.
+        */
+       for (start = trv + 1;; --trv) {
+               if (trv <= path)
+                       break;
+               if (*trv == '/') {
+                       *trv = '\0';
+                       if (stat(path, &sbuf))
+                               return(0);
+                       if (!S_ISDIR(sbuf.st_mode)) {
+                               errno = ENOTDIR;
+                               return(0);
+                       }
+                       *trv = '/';
+                       break;
+               }
+       }
+
+       for (;;) {
+               if (doopen) {
+                       if ((*doopen =
+                           open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)
+                               return(1);
+                       if (errno != EEXIST)
+                               return(0);
+               }
+               else if (stat(path, &sbuf))
+                       return(errno == ENOENT ? 1 : 0);
+
+               /* tricky little algorithm for backward compatibility */
+               for (trv = start;;) {
+                       if (!*trv)
+                               return(0);
+                       if (*trv == 'z')
+                               *trv++ = 'a';
+                       else {
+                               if (isdigit(*trv))
+                                       *trv = 'a';
+                               else
+                                       ++*trv;
+                               break;
+                       }
+               }
+       }
+       /*NOTREACHED*/
+}
diff --git a/stdio.subproj/perror.c b/stdio.subproj/perror.c
new file mode 100644 (file)
index 0000000..7a3c4f5
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+void
+perror(s)
+       const char *s;
+{
+       register struct iovec *v;
+       struct iovec iov[4];
+
+       v = iov;
+       if (s && *s) {
+               v->iov_base = (char *)s;
+               v->iov_len = strlen(s);
+               v++;
+               v->iov_base = ": ";
+               v->iov_len = 2;
+               v++;
+       }
+       v->iov_base = strerror(errno);
+       v->iov_len = strlen(v->iov_base);
+       v++;
+       v->iov_base = "\n";
+       v->iov_len = 1;
+       (void)writev(STDERR_FILENO, iov, (v - iov) + 1);
+}
diff --git a/stdio.subproj/printf.c b/stdio.subproj/printf.c
new file mode 100644 (file)
index 0000000..a7e2385
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+int
+#if __STDC__
+printf(char const *fmt, ...)
+#else
+printf(fmt, va_alist)
+       char *fmt;
+       va_dcl
+#endif
+{
+       int ret;
+       va_list ap;
+
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       ret = vfprintf(stdout, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
diff --git a/stdio.subproj/putc.c b/stdio.subproj/putc.c
new file mode 100644 (file)
index 0000000..f4ca592
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+/*
+ * A subroutine version of the macro putc.
+ */
+#undef putc
+
+int
+putc(c, fp)
+       int c;
+       register FILE *fp;
+{
+       return (__sputc(c, fp));
+}
diff --git a/stdio.subproj/putchar.c b/stdio.subproj/putchar.c
new file mode 100644 (file)
index 0000000..b69fabe
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+#undef putchar
+
+/*
+ * A subroutine version of the macro putchar
+ */
+int
+putchar(c)
+       int c;
+{
+       register FILE *so = stdout;
+
+       return (__sputc(c, so));
+}
diff --git a/stdio.subproj/puts.c b/stdio.subproj/puts.c
new file mode 100644 (file)
index 0000000..31ae510
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include "fvwrite.h"
+
+/*
+ * Write the given string to stdout, appending a newline.
+ */
+int
+puts(s)
+       char const *s;
+{
+       size_t c = strlen(s);
+       struct __suio uio;
+       struct __siov iov[2];
+
+       iov[0].iov_base = (void *)s;
+       iov[0].iov_len = c;
+       iov[1].iov_base = "\n";
+       iov[1].iov_len = 1;
+       uio.uio_resid = c + 1;
+       uio.uio_iov = &iov[0];
+       uio.uio_iovcnt = 2;
+       return (__sfvwrite(stdout, &uio) ? EOF : '\n');
+}
diff --git a/stdio.subproj/putw.c b/stdio.subproj/putw.c
new file mode 100644 (file)
index 0000000..225f916
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include "fvwrite.h"
+
+int
+putw(w, fp)
+       int w;
+       FILE *fp;
+{
+       struct __suio uio;
+       struct __siov iov;
+
+       iov.iov_base = &w;
+       iov.iov_len = uio.uio_resid = sizeof(w);
+       uio.uio_iov = &iov;
+       uio.uio_iovcnt = 1;
+       return (__sfvwrite(fp, &uio));
+}
diff --git a/stdio.subproj/refill.c b/stdio.subproj/refill.c
new file mode 100644 (file)
index 0000000..1af09b2
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+static int
+lflush(fp)
+       FILE *fp;
+{
+
+       if ((fp->_flags & (__SLBF|__SWR)) == __SLBF|__SWR)
+               return (__sflush(fp));
+       return (0);
+}
+
+/*
+ * Refill a stdio buffer.
+ * Return EOF on eof or error, 0 otherwise.
+ */
+int
+__srefill(fp)
+       register FILE *fp;
+{
+
+       /* make sure stdio is set up */
+       if (!__sdidinit)
+               __sinit();
+
+       fp->_r = 0;             /* largely a convenience for callers */
+
+       /* SysV does not make this test; take it out for compatibility */
+       if (fp->_flags & __SEOF)
+               return (EOF);
+
+       /* if not already reading, have to be reading and writing */
+       if ((fp->_flags & __SRD) == 0) {
+               if ((fp->_flags & __SRW) == 0) {
+                       errno = EBADF;
+                       return (EOF);
+               }
+               /* switch to reading */
+               if (fp->_flags & __SWR) {
+                       if (__sflush(fp))
+                               return (EOF);
+                       fp->_flags &= ~__SWR;
+                       fp->_w = 0;
+                       fp->_lbfsize = 0;
+               }
+               fp->_flags |= __SRD;
+       } else {
+               /*
+                * We were reading.  If there is an ungetc buffer,
+                * we must have been reading from that.  Drop it,
+                * restoring the previous buffer (if any).  If there
+                * is anything in that buffer, return.
+                */
+               if (HASUB(fp)) {
+                       FREEUB(fp);
+                       if ((fp->_r = fp->_ur) != 0) {
+                               fp->_p = fp->_up;
+                               return (0);
+                       }
+               }
+       }
+
+       if (fp->_bf._base == NULL)
+               __smakebuf(fp);
+
+       /*
+        * Before reading from a line buffered or unbuffered file,
+        * flush all line buffered output files, per the ANSI C
+        * standard.
+        */
+       if (fp->_flags & (__SLBF|__SNBF))
+               (void) _fwalk(lflush);
+       fp->_p = fp->_bf._base;
+       fp->_r = (*fp->_read)(fp->_cookie, (char *)fp->_p, fp->_bf._size);
+       fp->_flags &= ~__SMOD;  /* buffer contents are again pristine */
+       if (fp->_r <= 0) {
+               if (fp->_r == 0)
+                       fp->_flags |= __SEOF;
+               else {
+                       fp->_r = 0;
+                       fp->_flags |= __SERR;
+               }
+               return (EOF);
+       }
+       return (0);
+}
diff --git a/stdio.subproj/remove.c b/stdio.subproj/remove.c
new file mode 100644 (file)
index 0000000..f20237e
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)remove.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <unistd.h>
+#include <stdio.h>
+
+int
+remove(file)
+       const char *file;
+{
+       return (unlink(file));
+}
diff --git a/stdio.subproj/rewind.c b/stdio.subproj/rewind.c
new file mode 100644 (file)
index 0000000..f014fb6
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+
+void
+rewind(fp)
+       register FILE *fp;
+{
+       (void) fseek(fp, 0L, SEEK_SET);
+       clearerr(fp);
+       errno = 0;      /* not required, but seems reasonable */
+}
diff --git a/stdio.subproj/rget.c b/stdio.subproj/rget.c
new file mode 100644 (file)
index 0000000..7478d4f
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+/*
+ * Handle getc() when the buffer ran out:
+ * Refill, then return the first character
+ * in the newly-filled buffer.
+ */
+int
+__srget(fp)
+       register FILE *fp;
+{
+       if (__srefill(fp) == 0) {
+               fp->_r--;
+               return (*fp->_p++);
+       }
+       return (EOF);
+}
diff --git a/stdio.subproj/scanf.c b/stdio.subproj/scanf.c
new file mode 100644 (file)
index 0000000..d2f6ce5
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+int
+#if __STDC__
+scanf(char const *fmt, ...)
+#else
+scanf(fmt, va_alist)
+       char *fmt;
+       va_dcl
+#endif
+{
+       int ret;
+       va_list ap;
+
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       ret = __svfscanf(stdin, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
diff --git a/stdio.subproj/setbuf.c b/stdio.subproj/setbuf.c
new file mode 100644 (file)
index 0000000..1180f10
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include "local.h"
+
+void
+setbuf(fp, buf)
+       FILE *fp;
+       char *buf;
+{
+       (void) setvbuf(fp, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
+}
diff --git a/stdio.subproj/setbuffer.c b/stdio.subproj/setbuffer.c
new file mode 100644 (file)
index 0000000..1aa3e62
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+void
+setbuffer(fp, buf, size)
+       register FILE *fp;
+       char *buf;
+       int size;
+{
+
+       (void)setvbuf(fp, buf, buf ? _IOFBF : _IONBF, size);
+}
+
+/*
+ * set line buffering
+ */
+int
+setlinebuf(fp)
+       FILE *fp;
+{
+
+       return (setvbuf(fp, (char *)NULL, _IOLBF, (size_t)0));
+}
diff --git a/stdio.subproj/setvbuf.c b/stdio.subproj/setvbuf.c
new file mode 100644 (file)
index 0000000..25a8d52
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+/*
+ * Set one of the three kinds of buffering, optionally including
+ * a buffer.
+ */
+int
+setvbuf(fp, buf, mode, size)
+       register FILE *fp;
+       char *buf;
+       register int mode;
+       register size_t size;
+{
+       register int ret, flags;
+       size_t iosize;
+       int ttyflag;
+
+       /*
+        * Verify arguments.  The `int' limit on `size' is due to this
+        * particular implementation.  Note, buf and size are ignored
+        * when setting _IONBF.
+        */
+       if (mode != _IONBF)
+               if ((mode != _IOFBF && mode != _IOLBF) || (int)size < 0)
+                       return (EOF);
+
+       /*
+        * Write current buffer, if any.  Discard unread input (including
+        * ungetc data), cancel line buffering, and free old buffer if
+        * malloc()ed.  We also clear any eof condition, as if this were
+        * a seek.
+        */
+       ret = 0;
+       (void)__sflush(fp);
+       if (HASUB(fp))
+               FREEUB(fp);
+       fp->_r = fp->_lbfsize = 0;
+       flags = fp->_flags;
+       if (flags & __SMBF)
+               free((void *)fp->_bf._base);
+       flags &= ~(__SLBF | __SNBF | __SMBF | __SOPT | __SNPT | __SEOF);
+
+       /* If setting unbuffered mode, skip all the hard work. */
+       if (mode == _IONBF)
+               goto nbf;
+
+       /*
+        * Find optimal I/O size for seek optimization.  This also returns
+        * a `tty flag' to suggest that we check isatty(fd), but we do not
+        * care since our caller told us how to buffer.
+        */
+       flags |= __swhatbuf(fp, &iosize, &ttyflag);
+       if (size == 0) {
+               buf = NULL;     /* force local allocation */
+               size = iosize;
+       }
+
+       /* Allocate buffer if needed. */
+       if (buf == NULL) {
+               if ((buf = malloc(size)) == NULL) {
+                       /*
+                        * Unable to honor user's request.  We will return
+                        * failure, but try again with file system size.
+                        */
+                       ret = EOF;
+                       if (size != iosize) {
+                               size = iosize;
+                               buf = malloc(size);
+                       }
+               }
+               if (buf == NULL) {
+                       /* No luck; switch to unbuffered I/O. */
+nbf:
+                       fp->_flags = flags | __SNBF;
+                       fp->_w = 0;
+                       fp->_bf._base = fp->_p = fp->_nbuf;
+                       fp->_bf._size = 1;
+                       return (ret);
+               }
+               flags |= __SMBF;
+       }
+
+       /*
+        * Kill any seek optimization if the buffer is not the
+        * right size.
+        *
+        * SHOULD WE ALLOW MULTIPLES HERE (i.e., ok iff (size % iosize) == 0)?
+        */
+       if (size != iosize)
+               flags |= __SNPT;
+
+       /*
+        * Fix up the FILE fields, and set __cleanup for output flush on
+        * exit (since we are buffered in some way).
+        */
+       if (mode == _IOLBF)
+               flags |= __SLBF;
+       fp->_flags = flags;
+       fp->_bf._base = fp->_p = (unsigned char *)buf;
+       fp->_bf._size = size;
+       /* fp->_lbfsize is still 0 */
+       if (flags & __SWR) {
+               /*
+                * Begin or continue writing: see __swsetup().  Note
+                * that __SNBF is impossible (it was handled earlier).
+                */
+               if (flags & __SLBF) {
+                       fp->_w = 0;
+                       fp->_lbfsize = -fp->_bf._size;
+               } else
+                       fp->_w = size;
+       } else {
+               /* begin/continue reading, or stay in intermediate state */
+               fp->_w = 0;
+       }
+       __cleanup = _cleanup;
+
+       return (ret);
+}
diff --git a/stdio.subproj/snprintf.c b/stdio.subproj/snprintf.c
new file mode 100644 (file)
index 0000000..a9b6315
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+int
+#if __STDC__
+snprintf(char *str, size_t n, char const *fmt, ...)
+#else
+snprintf(str, n, fmt, va_alist)
+       char *str;
+       size_t n;
+       char *fmt;
+       va_dcl
+#endif
+{
+       int ret;
+       va_list ap;
+       FILE f;
+
+       if ((int)n < 1)
+               return (EOF);
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       f._flags = __SWR | __SSTR;
+       f._bf._base = f._p = (unsigned char *)str;
+       f._bf._size = f._w = n - 1;
+       ret = vfprintf(&f, fmt, ap);
+       *f._p = 0;
+       va_end(ap);
+       return (ret);
+}
diff --git a/stdio.subproj/sprintf.c b/stdio.subproj/sprintf.c
new file mode 100644 (file)
index 0000000..0cddde0
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include <limits.h>
+#include "local.h"
+
+int
+#if __STDC__
+sprintf(char *str, char const *fmt, ...)
+#else
+sprintf(str, fmt, va_alist)
+       char *str;
+       char *fmt;
+       va_dcl
+#endif
+{
+       int ret;
+       va_list ap;
+       FILE f;
+
+       f._flags = __SWR | __SSTR;
+       f._bf._base = f._p = (unsigned char *)str;
+       f._bf._size = f._w = INT_MAX;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       ret = vfprintf(&f, fmt, ap);
+       va_end(ap);
+       *f._p = 0;
+       return (ret);
+}
diff --git a/stdio.subproj/sscanf.c b/stdio.subproj/sscanf.c
new file mode 100644 (file)
index 0000000..92ccf56
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "local.h"
+
+/* ARGSUSED */
+static int
+eofread(cookie, buf, len)
+       void *cookie;
+       char *buf;
+       int len;
+{
+
+       return (0);
+}
+
+int
+#if __STDC__
+sscanf(const char *str, char const *fmt, ...)
+#else
+sscanf(str, fmt, va_alist)
+       char *str;
+       char *fmt;
+       va_dcl
+#endif
+{
+       int ret;
+       va_list ap;
+       FILE f;
+
+       f._flags = __SRD;
+       f._bf._base = f._p = (unsigned char *)str;
+       f._bf._size = f._r = strlen(str);
+       f._read = eofread;
+       f._ub._base = NULL;
+       f._lb._base = NULL;
+#if __STDC__
+       va_start(ap, fmt);
+#else
+       va_start(ap);
+#endif
+       ret = __svfscanf(&f, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
diff --git a/stdio.subproj/stdio.c b/stdio.subproj/stdio.c
new file mode 100644 (file)
index 0000000..dc8a702
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include "local.h"
+
+/*
+ * Small standard I/O/seek/close functions.
+ * These maintain the `known seek offset' for seek optimisation.
+ */
+int
+__sread(cookie, buf, n)
+       void *cookie;
+       char *buf;
+       int n;
+{
+       register FILE *fp = cookie;
+       register int ret;
+       
+       ret = read(fp->_file, buf, n);
+       /* if the read succeeded, update the current offset */
+       if (ret >= 0)
+               fp->_offset += ret;
+       else
+               fp->_flags &= ~__SOFF;  /* paranoia */
+       return (ret);
+}
+
+int
+__swrite(cookie, buf, n)
+       void *cookie;
+       char const *buf;
+       int n;
+{
+       register FILE *fp = cookie;
+
+       if (fp->_flags & __SAPP)
+               (void) lseek(fp->_file, (off_t)0, SEEK_END);
+       fp->_flags &= ~__SOFF;  /* in case FAPPEND mode is set */
+       return (write(fp->_file, buf, n));
+}
+
+fpos_t
+__sseek(cookie, offset, whence)
+       void *cookie;
+       fpos_t offset;
+       int whence;
+{
+       register FILE *fp = cookie;
+       register off_t ret;
+       
+       ret = lseek(fp->_file, (off_t)offset, whence);
+       if (ret == -1L)
+               fp->_flags &= ~__SOFF;
+       else {
+               fp->_flags |= __SOFF;
+               fp->_offset = ret;
+       }
+       return (ret);
+}
+
+int
+__sclose(cookie)
+       void *cookie;
+{
+
+       return (close(((FILE *)cookie)->_file));
+}
diff --git a/stdio.subproj/tempnam.c b/stdio.subproj/tempnam.c
new file mode 100644 (file)
index 0000000..ebbb84a
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/param.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <paths.h>
+
+char *
+tempnam(dir, pfx)
+       const char *dir, *pfx;
+{
+       int sverrno;
+       char *f, *name;
+
+       if (!(name = malloc(MAXPATHLEN)))
+               return(NULL);
+
+       if (!pfx)
+               pfx = "tmp.";
+
+       if (f = getenv("TMPDIR")) {
+               (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
+                   *(f + strlen(f) - 1) == '/'? "": "/", pfx);
+               if (f = mktemp(name))
+                       return(f);
+       }
+
+       if (f = (char *)dir) {
+               (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
+                   *(f + strlen(f) - 1) == '/'? "": "/", pfx);
+               if (f = mktemp(name))
+                       return(f);
+       }
+
+       f = P_tmpdir;
+       (void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
+       if (f = mktemp(name))
+               return(f);
+
+       f = _PATH_TMP;
+       (void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
+       if (f = mktemp(name))
+               return(f);
+
+       sverrno = errno;
+       free(name);
+       errno = sverrno;
+       return(NULL);
+}
diff --git a/stdio.subproj/tmpfile.c b/stdio.subproj/tmpfile.c
new file mode 100644 (file)
index 0000000..2924a9e
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <paths.h>
+
+FILE *
+tmpfile()
+{
+       sigset_t set, oset;
+       FILE *fp;
+       int fd, sverrno;
+#define        TRAILER "tmp.XXXXXX"
+       char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)];
+
+       (void)memcpy(buf, _PATH_TMP, sizeof(_PATH_TMP) - 1);
+       (void)memcpy(buf + sizeof(_PATH_TMP) - 1, TRAILER, sizeof(TRAILER));
+
+       sigfillset(&set);
+       (void)sigprocmask(SIG_BLOCK, &set, &oset);
+
+       fd = mkstemp(buf);
+       if (fd != -1)
+               (void)unlink(buf);
+
+       (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+
+       if (fd == -1)
+               return (NULL);
+
+       if ((fp = fdopen(fd, "w+")) == NULL) {
+               sverrno = errno;
+               (void)close(fd);
+               errno = sverrno;
+               return (NULL);
+       }
+       return (fp);
+}
diff --git a/stdio.subproj/tmpnam.c b/stdio.subproj/tmpnam.c
new file mode 100644 (file)
index 0000000..3ab71b1
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <unistd.h>
+
+char *
+tmpnam(s)
+       char *s;
+{
+       static u_long tmpcount;
+       static char buf[L_tmpnam];
+
+       if (s == NULL)
+               s = buf;
+       (void)snprintf(s, L_tmpnam, "%stmp.%lu.XXXXXX", P_tmpdir, tmpcount);
+       ++tmpcount;
+       return (mktemp(s));
+}
diff --git a/stdio.subproj/ungetc.c b/stdio.subproj/ungetc.c
new file mode 100644 (file)
index 0000000..ab92783
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "local.h"
+
+/*
+ * Expand the ungetc buffer `in place'.  That is, adjust fp->_p when
+ * the buffer moves, so that it points the same distance from the end,
+ * and move the bytes in the buffer around as necessary so that they
+ * are all at the end (stack-style).
+ */
+static int
+__submore(fp)
+       register FILE *fp;
+{
+       register int i;
+       register unsigned char *p;
+
+       if (fp->_ub._base == fp->_ubuf) {
+               /*
+                * Get a new buffer (rather than expanding the old one).
+                */
+               if ((p = malloc((size_t)BUFSIZ)) == NULL)
+                       return (EOF);
+               fp->_ub._base = p;
+               fp->_ub._size = BUFSIZ;
+               p += BUFSIZ - sizeof(fp->_ubuf);
+               for (i = sizeof(fp->_ubuf); --i >= 0;)
+                       p[i] = fp->_ubuf[i];
+               fp->_p = p;
+               return (0);
+       }
+       i = fp->_ub._size;
+       p = realloc(fp->_ub._base, i << 1);
+       if (p == NULL)
+               return (EOF);
+       /* no overlap (hence can use memcpy) because we doubled the size */
+       (void)memcpy((void *)(p + i), (void *)p, (size_t)i);
+       fp->_p = p + i;
+       fp->_ub._base = p;
+       fp->_ub._size = i << 1;
+       return (0);
+}
+
+int
+ungetc(c, fp)
+       int c;
+       register FILE *fp;
+{
+       if (c == EOF)
+               return (EOF);
+       if (!__sdidinit)
+               __sinit();
+       if ((fp->_flags & __SRD) == 0) {
+               /*
+                * Not already reading: no good unless reading-and-writing.
+                * Otherwise, flush any current write stuff.
+                */
+               if ((fp->_flags & __SRW) == 0)
+                       return (EOF);
+               if (fp->_flags & __SWR) {
+                       if (__sflush(fp))
+                               return (EOF);
+                       fp->_flags &= ~__SWR;
+                       fp->_w = 0;
+                       fp->_lbfsize = 0;
+               }
+               fp->_flags |= __SRD;
+       }
+       c = (unsigned char)c;
+
+       /*
+        * If we are in the middle of ungetc'ing, just continue.
+        * This may require expanding the current ungetc buffer.
+        */
+       if (HASUB(fp)) {
+               if (fp->_r >= fp->_ub._size && __submore(fp))
+                       return (EOF);
+               *--fp->_p = c;
+               fp->_r++;
+               return (c);
+       }
+       fp->_flags &= ~__SEOF;
+
+       /*
+        * If we can handle this by simply backing up, do so,
+        * but never replace the original character.
+        * (This makes sscanf() work when scanning `const' data.)
+        */
+       if (fp->_bf._base != NULL && fp->_p > fp->_bf._base &&
+           fp->_p[-1] == c) {
+               fp->_p--;
+               fp->_r++;
+               return (c);
+       }
+
+       /*
+        * Create an ungetc buffer.
+        * Initially, we will use the `reserve' buffer.
+        */
+       fp->_ur = fp->_r;
+       fp->_up = fp->_p;
+       fp->_ub._base = fp->_ubuf;
+       fp->_ub._size = sizeof(fp->_ubuf);
+       fp->_ubuf[sizeof(fp->_ubuf) - 1] = c;
+       fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1];
+       fp->_r = 1;
+       return (c);
+}
diff --git a/stdio.subproj/vfprintf.c b/stdio.subproj/vfprintf.c
new file mode 100644 (file)
index 0000000..f819e25
--- /dev/null
@@ -0,0 +1,1290 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ *
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Actual printf innards.
+ *
+ * This code is large and complicated...
+ */
+
+#include <sys/types.h>
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#include "local.h"
+#include "fvwrite.h"
+
+/* Define FLOATING_POINT to get floating point. */
+#define        FLOATING_POINT
+
+static int     __sprint __P((FILE *, struct __suio *));
+static int     __sbprintf __P((FILE *, const char *, va_list));
+static char *  __ultoa __P((u_long, char *, int, int, char *));
+static char *  __uqtoa __P((u_quad_t, char *, int, int, char *));
+static void    __find_arguments __P((const char *, va_list, void ***));
+static void    __grow_type_table __P((int, unsigned char **, int *));
+
+/*
+ * Flush out all the vectors defined by the given uio,
+ * then reset it so that it can be reused.
+ */
+static int
+__sprint(fp, uio)
+       FILE *fp;
+       register struct __suio *uio;
+{
+       register int err;
+
+       if (uio->uio_resid == 0) {
+               uio->uio_iovcnt = 0;
+               return (0);
+       }
+       err = __sfvwrite(fp, uio);
+       uio->uio_resid = 0;
+       uio->uio_iovcnt = 0;
+       return (err);
+}
+
+/*
+ * Helper function for `fprintf to unbuffered unix file': creates a
+ * temporary buffer.  We only work on write-only files; this avoids
+ * worries about ungetc buffers and so forth.
+ */
+static int
+__sbprintf(fp, fmt, ap)
+       register FILE *fp;
+       const char *fmt;
+       va_list ap;
+{
+       int ret;
+       FILE fake;
+       unsigned char buf[BUFSIZ];
+
+       /* copy the important variables */
+       fake._flags = fp->_flags & ~__SNBF;
+       fake._file = fp->_file;
+       fake._cookie = fp->_cookie;
+       fake._write = fp->_write;
+
+       /* set up the buffer */
+       fake._bf._base = fake._p = buf;
+       fake._bf._size = fake._w = sizeof(buf);
+       fake._lbfsize = 0;      /* not actually used, but Just In Case */
+
+       /* do the work, then copy any error status */
+       ret = vfprintf(&fake, fmt, ap);
+       if (ret >= 0 && fflush(&fake))
+               ret = EOF;
+       if (fake._flags & __SERR)
+               fp->_flags |= __SERR;
+       return (ret);
+}
+
+/*
+ * Macros for converting digits to letters and vice versa
+ */
+#define        to_digit(c)     ((c) - '0')
+#define is_digit(c)    ((unsigned)to_digit(c) <= 9)
+#define        to_char(n)      ((n) + '0')
+
+/*
+ * Convert an unsigned long to ASCII for printf purposes, returning
+ * a pointer to the first character of the string representation.
+ * Octal numbers can be forced to have a leading zero; hex numbers
+ * use the given digits.
+ */
+static char *
+__ultoa(val, endp, base, octzero, xdigs)
+       register u_long val;
+       char *endp;
+       int base, octzero;
+       char *xdigs;
+{
+       register char *cp = endp;
+       register long sval;
+
+       /*
+        * Handle the three cases separately, in the hope of getting
+        * better/faster code.
+        */
+       switch (base) {
+       case 10:
+               if (val < 10) { /* many numbers are 1 digit */
+                       *--cp = to_char(val);
+                       return (cp);
+               }
+               /*
+                * On many machines, unsigned arithmetic is harder than
+                * signed arithmetic, so we do at most one unsigned mod and
+                * divide; this is sufficient to reduce the range of
+                * the incoming value to where signed arithmetic works.
+                */
+               if (val > LONG_MAX) {
+                       *--cp = to_char(val % 10);
+                       sval = val / 10;
+               } else
+                       sval = val;
+               do {
+                       *--cp = to_char(sval % 10);
+                       sval /= 10;
+               } while (sval != 0);
+               break;
+
+       case 8:
+               do {
+                       *--cp = to_char(val & 7);
+                       val >>= 3;
+               } while (val);
+               if (octzero && *cp != '0')
+                       *--cp = '0';
+               break;
+
+       case 16:
+               do {
+                       *--cp = xdigs[val & 15];
+                       val >>= 4;
+               } while (val);
+               break;
+
+       default:                        /* oops */
+               abort();
+       }
+       return (cp);
+}
+
+/* Identical to __ultoa, but for quads. */
+static char *
+__uqtoa(val, endp, base, octzero, xdigs)
+       register u_quad_t val;
+       char *endp;
+       int base, octzero;
+       char *xdigs;
+{
+       register char *cp = endp;
+       register quad_t sval;
+
+       /* quick test for small values; __ultoa is typically much faster */
+       /* (perhaps instead we should run until small, then call __ultoa?) */
+       if (val <= ULONG_MAX)
+               return (__ultoa((u_long)val, endp, base, octzero, xdigs));
+       switch (base) {
+       case 10:
+               if (val < 10) {
+                       *--cp = to_char(val % 10);
+                       return (cp);
+               }
+               if (val > QUAD_MAX) {
+                       *--cp = to_char(val % 10);
+                       sval = val / 10;
+               } else
+                       sval = val;
+               do {
+                       *--cp = to_char(sval % 10);
+                       sval /= 10;
+               } while (sval != 0);
+               break;
+
+       case 8:
+               do {
+                       *--cp = to_char(val & 7);
+                       val >>= 3;
+               } while (val);
+               if (octzero && *cp != '0')
+                       *--cp = '0';
+               break;
+
+       case 16:
+               do {
+                       *--cp = xdigs[val & 15];
+                       val >>= 4;
+               } while (val);
+               break;
+
+       default:
+               abort();
+       }
+       return (cp);
+}
+
+#ifdef FLOATING_POINT
+#include <math.h>
+#include "floatio.h"
+
+#define        BUF             (MAXEXP+MAXFRACT+1)     /* + decimal point */
+#define        DEFPREC         6
+
+static char *cvt __P((double, int, int, char *, int *, int, int *));
+static int exponent __P((char *, int, int));
+
+#else /* no FLOATING_POINT */
+
+#define        BUF             68
+
+#endif /* FLOATING_POINT */
+
+#define STATIC_ARG_TBL_SIZE 8           /* Size of static argument table. */
+
+/*
+ * Flags used during conversion.
+ */
+#define        ALT             0x001           /* alternate form */
+#define        HEXPREFIX       0x002           /* add 0x or 0X prefix */
+#define        LADJUST         0x004           /* left adjustment */
+#define        LONGDBL         0x008           /* long double */
+#define        LONGINT         0x010           /* long integer */
+#define        QUADINT         0x020           /* quad integer */
+#define        SHORTINT        0x040           /* short integer */
+#define        ZEROPAD         0x080           /* zero (as opposed to blank) pad */
+#define FPT            0x100           /* Floating point number */
+int
+vfprintf(fp, fmt0, ap)
+       FILE *fp;
+       const char *fmt0;
+       va_list ap;
+{
+       register char *fmt;     /* format string */
+       register int ch;        /* character from fmt */
+       register int n, n2;     /* handy integer (short term usage) */
+       register char *cp;      /* handy char pointer (short term usage) */
+       register struct __siov *iovp;/* for PRINT macro */
+       register int flags;     /* flags as above */
+       int ret;                /* return value accumulator */
+       int width;              /* width from format (%8d), or 0 */
+       int prec;               /* precision from format (%.3d), or -1 */
+       char sign;              /* sign prefix (' ', '+', '-', or \0) */
+#ifdef FLOATING_POINT
+       char softsign;          /* temporary negative sign for floats */
+       double _double = 0;     /* double precision arguments %[eEfgG] */
+       int expt;               /* integer value of exponent */
+       int expsize = 0;        /* character count for expstr */
+       int ndig;               /* actual number of digits returned by cvt */
+       char expstr[7];         /* buffer for exponent string */
+#endif
+       u_long  ulval = 0;      /* integer arguments %[diouxX] */
+       u_quad_t uqval = 0;     /* %q integers */
+       int base;               /* base for [diouxX] conversion */
+       int dprec;              /* a copy of prec if [diouxX], 0 otherwise */
+       int realsz;             /* field size expanded by dprec, sign, etc */
+       int size;               /* size of converted field or string */
+       int prsize;             /* max size of printed field */
+       char *xdigs = NULL;     /* digits for [xX] conversion */
+#define NIOV 8
+       struct __suio uio;      /* output information: summary */
+       struct __siov iov[NIOV];/* ... and individual io vectors */
+       char buf[BUF];          /* space for %c, %[diouxX], %[eEfgG] */
+       char ox[2];             /* space for 0x hex-prefix */
+        void **argtable;        /* args, built due to positional arg */
+        void *statargtable [STATIC_ARG_TBL_SIZE];
+        int nextarg;            /* 1-based argument index */
+        va_list orgap;          /* original argument pointer */
+
+       /*
+        * Choose PADSIZE to trade efficiency vs. size.  If larger printf
+        * fields occur frequently, increase PADSIZE and make the initialisers
+        * below longer.
+        */
+#define        PADSIZE 16              /* pad chunk size */
+       static char blanks[PADSIZE] =
+        {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
+       static char zeroes[PADSIZE] =
+        {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
+
+       /*
+        * BEWARE, these `goto error' on error, and PAD uses `n'.
+        */
+#define        PRINT(ptr, len) { \
+       iovp->iov_base = (ptr); \
+       iovp->iov_len = (len); \
+       uio.uio_resid += (len); \
+       iovp++; \
+       if (++uio.uio_iovcnt >= NIOV) { \
+               if (__sprint(fp, &uio)) \
+                       goto error; \
+               iovp = iov; \
+       } \
+}
+#define        PAD(howmany, with) { \
+       if ((n = (howmany)) > 0) { \
+               while (n > PADSIZE) { \
+                       PRINT(with, PADSIZE); \
+                       n -= PADSIZE; \
+               } \
+               PRINT(with, n); \
+       } \
+}
+#define        FLUSH() { \
+       if (uio.uio_resid && __sprint(fp, &uio)) \
+               goto error; \
+       uio.uio_iovcnt = 0; \
+       iovp = iov; \
+}
+
+        /*
+         * Get the argument indexed by nextarg.   If the argument table is
+         * built, use it to get the argument.  If its not, get the next
+         * argument (and arguments must be gotten sequentially).
+         */
+#define GETARG(type) \
+        ((argtable != NULL) ? *((type*)(argtable[nextarg++])) : \
+            (nextarg++, va_arg(ap, type)))
+
+       /*
+        * To extend shorts properly, we need both signed and unsigned
+        * argument extraction methods.
+        */
+#define        SARG() \
+       (flags&LONGINT ? GETARG(long) : \
+           flags&SHORTINT ? (long)(short)GETARG(int) : \
+           (long)GETARG(int))
+#define        UARG() \
+       (flags&LONGINT ? GETARG(u_long) : \
+           flags&SHORTINT ? (u_long)(u_short)GETARG(int) : \
+           (u_long)GETARG(u_int))
+
+        /*
+         * Get * arguments, including the form *nn$.  Preserve the nextarg
+         * that the argument can be gotten once the type is determined.
+         */
+#define GETASTER(val) \
+        n2 = 0; \
+        cp = fmt; \
+        while (is_digit(*cp)) { \
+                n2 = 10 * n2 + to_digit(*cp); \
+                cp++; \
+        } \
+        if (*cp == '$') { \
+               int hold = nextarg; \
+                if (argtable == NULL) { \
+                        argtable = statargtable; \
+                        __find_arguments (fmt0, orgap, &argtable); \
+                } \
+                nextarg = n2; \
+                val = GETARG (int); \
+                nextarg = hold; \
+                fmt = ++cp; \
+        } else { \
+               val = GETARG (int); \
+        }
+        
+
+       /* FLOCKFILE(fp); */
+       /* sorry, fprintf(read_only_file, "") returns EOF, not 0 */
+       if (cantwrite(fp)) {
+               /* FUNLOCKFILE(fp); */
+               return (EOF);
+       }
+
+       /* optimise fprintf(stderr) (and other unbuffered Unix files) */
+       if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) &&
+           fp->_file >= 0) {
+               /* FUNLOCKFILE(fp); */
+               return (__sbprintf(fp, fmt0, ap));
+       }
+
+       fmt = (char *)fmt0;
+        argtable = NULL;
+        nextarg = 1;
+        orgap = ap;
+       uio.uio_iov = iovp = iov;
+       uio.uio_resid = 0;
+       uio.uio_iovcnt = 0;
+       ret = 0;
+
+       /*
+        * Scan the format for conversions (`%' character).
+        */
+       for (;;) {
+               for (cp = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++)
+                       /* void */;
+               if ((n = fmt - cp) != 0) {
+                       if ((unsigned)ret + n > INT_MAX) {
+                               ret = EOF;
+                               goto error;
+                       }
+                       PRINT(cp, n);
+                       ret += n;
+               }
+               if (ch == '\0')
+                       goto done;
+               fmt++;          /* skip over '%' */
+
+               flags = 0;
+               dprec = 0;
+               width = 0;
+               prec = -1;
+               sign = '\0';
+
+rflag:         ch = *fmt++;
+reswitch:      switch (ch) {
+               case ' ':
+                       /*
+                        * ``If the space and + flags both appear, the space
+                        * flag will be ignored.''
+                        *      -- ANSI X3J11
+                        */
+                       if (!sign)
+                               sign = ' ';
+                       goto rflag;
+               case '#':
+                       flags |= ALT;
+                       goto rflag;
+               case '*':
+                       /*
+                        * ``A negative field width argument is taken as a
+                        * - flag followed by a positive field width.''
+                        *      -- ANSI X3J11
+                        * They don't exclude field widths read from args.
+                        */
+                       GETASTER (width);
+                       if (width >= 0)
+                               goto rflag;
+                       width = -width;
+                       /* FALLTHROUGH */
+               case '-':
+                       flags |= LADJUST;
+                       goto rflag;
+               case '+':
+                       sign = '+';
+                       goto rflag;
+               case '.':
+                       if ((ch = *fmt++) == '*') {
+                               GETASTER (n);
+                               prec = n < 0 ? -1 : n;
+                               goto rflag;
+                       }
+                       n = 0;
+                       while (is_digit(ch)) {
+                               n = 10 * n + to_digit(ch);
+                               ch = *fmt++;
+                       }
+                       prec = n < 0 ? -1 : n;
+                       goto reswitch;
+               case '0':
+                       /*
+                        * ``Note that 0 is taken as a flag, not as the
+                        * beginning of a field width.''
+                        *      -- ANSI X3J11
+                        */
+                       flags |= ZEROPAD;
+                       goto rflag;
+               case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       n = 0;
+                       do {
+                               n = 10 * n + to_digit(ch);
+                               ch = *fmt++;
+                       } while (is_digit(ch));
+                       if (ch == '$') {
+                               nextarg = n;
+                               if (argtable == NULL) {
+                                       argtable = statargtable;
+                                       __find_arguments (fmt0, orgap,
+                                               &argtable);
+                               }
+                               goto rflag;
+                        }
+                       width = n;
+                       goto reswitch;
+#ifdef FLOATING_POINT
+               case 'L':
+                       flags |= LONGDBL;
+                       goto rflag;
+#endif
+               case 'h':
+                       flags |= SHORTINT;
+                       goto rflag;
+               case 'l':
+                       if (flags & LONGINT)
+                               flags |= QUADINT;
+                       else
+                               flags |= LONGINT;
+                       goto rflag;
+               case 'q':
+                       flags |= QUADINT;
+                       goto rflag;
+               case 'c':
+                       *(cp = buf) = GETARG(int);
+                       size = 1;
+                       sign = '\0';
+                       break;
+               case 'D':
+                       flags |= LONGINT;
+                       /*FALLTHROUGH*/
+               case 'd':
+               case 'i':
+                       if (flags & QUADINT) {
+                               uqval = GETARG(quad_t);
+                               if ((quad_t)uqval < 0) {
+                                       uqval = -uqval;
+                                       sign = '-';
+                               }
+                       } else {
+                               ulval = SARG();
+                               if ((long)ulval < 0) {
+                                       ulval = -ulval;
+                                       sign = '-';
+                               }
+                       }
+                       base = 10;
+                       goto number;
+#ifdef FLOATING_POINT
+               case 'e':
+               case 'E':
+               case 'f':
+                       goto fp_begin;
+               case 'g':
+               case 'G':
+                       if (prec == 0)
+                               prec = 1;
+fp_begin:              if (prec == -1)
+                               prec = DEFPREC;
+                       if (flags & LONGDBL)
+                               /* XXX this loses precision. */
+                               _double = (double)GETARG(long double);
+                       else
+                               _double = GETARG(double);
+                       /* do this before tricky precision changes */
+                       if (isinf(_double)) {
+                               if (_double < 0)
+                                       sign = '-';
+                               cp = "Inf";
+                               size = 3;
+                               break;
+                       }
+                       if (isnan(_double)) {
+                               cp = "NaN";
+                               size = 3;
+                               break;
+                       }
+                       flags |= FPT;
+                       cp = cvt(_double, prec, flags, &softsign,
+                               &expt, ch, &ndig);
+                       if (ch == 'g' || ch == 'G') {
+                               if (expt <= -4 || expt > prec)
+                                       ch = (ch == 'g') ? 'e' : 'E';
+                               else
+                                       ch = 'g';
+                       }
+                       if (ch <= 'e') {        /* 'e' or 'E' fmt */
+                               --expt;
+                               expsize = exponent(expstr, expt, ch);
+                               size = expsize + ndig;
+                               if (ndig > 1 || flags & ALT)
+                                       ++size;
+                       } else if (ch == 'f') {         /* f fmt */
+                               if (expt > 0) {
+                                       size = expt;
+                                       if (prec || flags & ALT)
+                                               size += prec + 1;
+                               } else  /* "0.X" */
+                                       size = prec + 2;
+                       } else if (expt >= ndig) {      /* fixed g fmt */
+                               size = expt;
+                               if (flags & ALT)
+                                       ++size;
+                       } else
+                               size = ndig + (expt > 0 ?
+                                       1 : 2 - expt);
+
+                       if (softsign)
+                               sign = '-';
+                       break;
+#endif /* FLOATING_POINT */
+               case 'n':
+                       if (flags & QUADINT)
+                               *GETARG(quad_t *) = ret;
+                       else if (flags & LONGINT)
+                               *GETARG(long *) = ret;
+                       else if (flags & SHORTINT)
+                               *GETARG(short *) = ret;
+                       else
+                               *GETARG(int *) = ret;
+                       continue;       /* no output */
+               case 'O':
+                       flags |= LONGINT;
+                       /*FALLTHROUGH*/
+               case 'o':
+                       if (flags & QUADINT)
+                               uqval = GETARG(u_quad_t);
+                       else
+                               ulval = UARG();
+                       base = 8;
+                       goto nosign;
+               case 'p':
+                       /*
+                        * ``The argument shall be a pointer to void.  The
+                        * value of the pointer is converted to a sequence
+                        * of printable characters, in an implementation-
+                        * defined manner.''
+                        *      -- ANSI X3J11
+                        */
+                       ulval = (u_long)GETARG(void *);
+                       base = 16;
+                       xdigs = "0123456789abcdef";
+                       flags = (flags & ~QUADINT) | HEXPREFIX;
+                       ch = 'x';
+                       goto nosign;
+               case 's':
+                       if ((cp = GETARG(char *)) == NULL)
+                               cp = "(null)";
+                       if (prec >= 0) {
+                               /*
+                                * can't use strlen; can only look for the
+                                * NUL in the first `prec' characters, and
+                                * strlen() will go further.
+                                */
+                               char *p = memchr(cp, 0, (size_t)prec);
+
+                               if (p != NULL) {
+                                       size = p - cp;
+                                       if (size > prec)
+                                               size = prec;
+                               } else
+                                       size = prec;
+                       } else
+                               size = strlen(cp);
+                       sign = '\0';
+                       break;
+               case 'U':
+                       flags |= LONGINT;
+                       /*FALLTHROUGH*/
+               case 'u':
+                       if (flags & QUADINT)
+                               uqval = GETARG(u_quad_t);
+                       else
+                               ulval = UARG();
+                       base = 10;
+                       goto nosign;
+               case 'X':
+                       xdigs = "0123456789ABCDEF";
+                       goto hex;
+               case 'x':
+                       xdigs = "0123456789abcdef";
+hex:                   if (flags & QUADINT)
+                               uqval = GETARG(u_quad_t);
+                       else
+                               ulval = UARG();
+                       base = 16;
+                       /* leading 0x/X only if non-zero */
+                       if (flags & ALT &&
+                           (flags & QUADINT ? uqval != 0 : ulval != 0))
+                               flags |= HEXPREFIX;
+
+                       /* unsigned conversions */
+nosign:                        sign = '\0';
+                       /*
+                        * ``... diouXx conversions ... if a precision is
+                        * specified, the 0 flag will be ignored.''
+                        *      -- ANSI X3J11
+                        */
+number:                        if ((dprec = prec) >= 0)
+                               flags &= ~ZEROPAD;
+
+                       /*
+                        * ``The result of converting a zero value with an
+                        * explicit precision of zero is no characters.''
+                        *      -- ANSI X3J11
+                        */
+                       cp = buf + BUF;
+                       if (flags & QUADINT) {
+                               if (uqval != 0 || prec != 0)
+                                       cp = __uqtoa(uqval, cp, base,
+                                           flags & ALT, xdigs);
+                       } else {
+                               if (ulval != 0 || prec != 0)
+                                       cp = __ultoa(ulval, cp, base,
+                                           flags & ALT, xdigs);
+                       }
+                       size = buf + BUF - cp;
+                       break;
+               default:        /* "%?" prints ?, unless ? is NUL */
+                       if (ch == '\0')
+                               goto done;
+                       /* pretend it was %c with argument ch */
+                       cp = buf;
+                       *cp = ch;
+                       size = 1;
+                       sign = '\0';
+                       break;
+               }
+
+               /*
+                * All reasonable formats wind up here.  At this point, `cp'
+                * points to a string which (if not flags&LADJUST) should be
+                * padded out to `width' places.  If flags&ZEROPAD, it should
+                * first be prefixed by any sign or other prefix; otherwise,
+                * it should be blank padded before the prefix is emitted.
+                * After any left-hand padding and prefixing, emit zeroes
+                * required by a decimal [diouxX] precision, then print the
+                * string proper, then emit zeroes required by any leftover
+                * floating precision; finally, if LADJUST, pad with blanks.
+                *
+                * Compute actual size, so we know how much to pad.
+                * size excludes decimal prec; realsz includes it.
+                */
+               realsz = dprec > size ? dprec : size;
+               if (sign)
+                       realsz++;
+               else if (flags & HEXPREFIX)
+                       realsz += 2;
+
+               prsize = width > realsz ? width : realsz;
+               if ((unsigned)ret + prsize > INT_MAX) {
+                       ret = EOF;
+                       goto error;
+               }
+
+               /* right-adjusting blank padding */
+               if ((flags & (LADJUST|ZEROPAD)) == 0)
+                       PAD(width - realsz, blanks);
+
+               /* prefix */
+               if (sign) {
+                       PRINT(&sign, 1);
+               } else if (flags & HEXPREFIX) {
+                       ox[0] = '0';
+                       ox[1] = ch;
+                       PRINT(ox, 2);
+               }
+
+               /* right-adjusting zero padding */
+               if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD)
+                       PAD(width - realsz, zeroes);
+
+               /* leading zeroes from decimal precision */
+               PAD(dprec - size, zeroes);
+
+               /* the string or number proper */
+#ifdef FLOATING_POINT
+               if ((flags & FPT) == 0) {
+                       PRINT(cp, size);
+               } else {        /* glue together f_p fragments */
+                       if (ch >= 'f') {        /* 'f' or 'g' */
+                               if (_double == 0) {
+                                       /* kludge for __dtoa irregularity */
+                                       if (expt >= ndig &&
+                                           (flags & ALT) == 0) {
+                                               PRINT("0", 1);
+                                       } else {
+                                               PRINT("0.", 2);
+                                               PAD(ndig - 1, zeroes);
+                                       }
+                               } else if (expt <= 0) {
+                                       PRINT("0.", 2);
+                                       PAD(-expt, zeroes);
+                                       PRINT(cp, ndig);
+                               } else if (expt >= ndig) {
+                                       PRINT(cp, ndig);
+                                       PAD(expt - ndig, zeroes);
+                                       if (flags & ALT)
+                                               PRINT(".", 1);
+                               } else {
+                                       PRINT(cp, expt);
+                                       cp += expt;
+                                       PRINT(".", 1);
+                                       PRINT(cp, ndig-expt);
+                               }
+                       } else {        /* 'e' or 'E' */
+                               if (ndig > 1 || flags & ALT) {
+                                       ox[0] = *cp++;
+                                       ox[1] = '.';
+                                       PRINT(ox, 2);
+                                       if (_double) {
+                                               PRINT(cp, ndig-1);
+                                       } else  /* 0.[0..] */
+                                               /* __dtoa irregularity */
+                                               PAD(ndig - 1, zeroes);
+                               } else  /* XeYYY */
+                                       PRINT(cp, 1);
+                               PRINT(expstr, expsize);
+                       }
+               }
+#else
+               PRINT(cp, size);
+#endif
+               /* left-adjusting padding (always blank) */
+               if (flags & LADJUST)
+                       PAD(width - realsz, blanks);
+
+               /* finally, adjust ret */
+               ret += prsize;
+
+               FLUSH();        /* copy out the I/O vectors */
+       }
+done:
+       FLUSH();
+error:
+       if (__sferror(fp))
+               ret = EOF;
+       /* FUNLOCKFILE(fp); */
+        if ((argtable != NULL) && (argtable != statargtable))
+                free (argtable);
+       return (ret);
+       /* NOTREACHED */
+}
+
+/*
+ * Type ids for argument type table.
+ */
+#define T_UNUSED       0
+#define T_SHORT                1
+#define T_U_SHORT      2
+#define TP_SHORT       3
+#define T_INT          4
+#define T_U_INT                5
+#define TP_INT         6
+#define T_LONG         7
+#define T_U_LONG       8
+#define TP_LONG                9
+#define T_QUAD         10
+#define T_U_QUAD       11
+#define TP_QUAD                12
+#define T_DOUBLE       13
+#define T_LONG_DOUBLE  14
+#define TP_CHAR                15
+#define TP_VOID                16
+
+/*
+ * Find all arguments when a positional parameter is encountered.  Returns a
+ * table, indexed by argument number, of pointers to each arguments.  The
+ * initial argument table should be an array of STATIC_ARG_TBL_SIZE entries.
+ * It will be replaces with a malloc-ed on if it overflows.
+ */ 
+static void
+__find_arguments (fmt0, ap, argtable)
+       const char *fmt0;
+       va_list ap;
+       void ***argtable;
+{
+       register char *fmt;     /* format string */
+       register int ch;        /* character from fmt */
+       register int n, n2;     /* handy integer (short term usage) */
+       register char *cp;      /* handy char pointer (short term usage) */
+       register int flags;     /* flags as above */
+       int width;              /* width from format (%8d), or 0 */
+       unsigned char *typetable; /* table of types */
+       unsigned char stattypetable [STATIC_ARG_TBL_SIZE];
+       int tablesize;          /* current size of type table */
+       int tablemax;           /* largest used index in table */
+       int nextarg;            /* 1-based argument index */
+
+       /*
+        * Add an argument type to the table, expanding if necessary.
+        */
+#define ADDTYPE(type) \
+       ((nextarg >= tablesize) ? \
+               __grow_type_table(nextarg, &typetable, &tablesize) : 0, \
+       typetable[nextarg++] = type, \
+       (nextarg > tablemax) ? tablemax = nextarg : 0)
+
+#define        ADDSARG() \
+       ((flags&LONGINT) ? ADDTYPE(T_LONG) : \
+               ((flags&SHORTINT) ? ADDTYPE(T_SHORT) : ADDTYPE(T_INT)))
+
+#define        ADDUARG() \
+       ((flags&LONGINT) ? ADDTYPE(T_U_LONG) : \
+               ((flags&SHORTINT) ? ADDTYPE(T_U_SHORT) : ADDTYPE(T_U_INT)))
+
+       /*
+        * Add * arguments to the type array.
+        */
+#define ADDASTER() \
+       n2 = 0; \
+       cp = fmt; \
+       while (is_digit(*cp)) { \
+               n2 = 10 * n2 + to_digit(*cp); \
+               cp++; \
+       } \
+       if (*cp == '$') { \
+               int hold = nextarg; \
+               nextarg = n2; \
+               ADDTYPE (T_INT); \
+               nextarg = hold; \
+               fmt = ++cp; \
+       } else { \
+               ADDTYPE (T_INT); \
+       }
+       fmt = (char *)fmt0;
+       typetable = stattypetable;
+       tablesize = STATIC_ARG_TBL_SIZE;
+       tablemax = 0; 
+       nextarg = 1;
+       memset (typetable, T_UNUSED, STATIC_ARG_TBL_SIZE);
+
+       /*
+        * Scan the format for conversions (`%' character).
+        */
+       for (;;) {
+               for (cp = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++)
+                       /* void */;
+               if (ch == '\0')
+                       goto done;
+               fmt++;          /* skip over '%' */
+
+               flags = 0;
+               width = 0;
+
+rflag:         ch = *fmt++;
+reswitch:      switch (ch) {
+               case ' ':
+               case '#':
+                       goto rflag;
+               case '*':
+                       ADDASTER ();
+                       goto rflag;
+               case '-':
+               case '+':
+                       goto rflag;
+               case '.':
+                       if ((ch = *fmt++) == '*') {
+                               ADDASTER ();
+                               goto rflag;
+                       }
+                       while (is_digit(ch)) {
+                               ch = *fmt++;
+                       }
+                       goto reswitch;
+               case '0':
+                       goto rflag;
+               case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       n = 0;
+                       do {
+                               n = 10 * n + to_digit(ch);
+                               ch = *fmt++;
+                       } while (is_digit(ch));
+                       if (ch == '$') {
+                               nextarg = n;
+                               goto rflag;
+                       }
+                       width = n;
+                       goto reswitch;
+#ifdef FLOATING_POINT
+               case 'L':
+                       flags |= LONGDBL;
+                       goto rflag;
+#endif
+               case 'h':
+                       flags |= SHORTINT;
+                       goto rflag;
+               case 'l':
+                       if (flags & LONGINT)
+                               flags |= QUADINT;
+                       else
+                               flags |= LONGINT;
+                       goto rflag;
+               case 'q':
+                       flags |= QUADINT;
+                       goto rflag;
+               case 'c':
+                       ADDTYPE(T_INT);
+                       break;
+               case 'D':
+                       flags |= LONGINT;
+                       /*FALLTHROUGH*/
+               case 'd':
+               case 'i':
+                       if (flags & QUADINT) {
+                               ADDTYPE(T_QUAD);
+                       } else {
+                               ADDSARG();
+                       }
+                       break;
+#ifdef FLOATING_POINT
+               case 'e':
+               case 'E':
+               case 'f':
+               case 'g':
+               case 'G':
+                       if (flags & LONGDBL)
+                               ADDTYPE(T_LONG_DOUBLE);
+                       else
+                               ADDTYPE(T_DOUBLE);
+                       break;
+#endif /* FLOATING_POINT */
+               case 'n':
+                       if (flags & QUADINT)
+                               ADDTYPE(TP_QUAD);
+                       else if (flags & LONGINT)
+                               ADDTYPE(TP_LONG);
+                       else if (flags & SHORTINT)
+                               ADDTYPE(TP_SHORT);
+                       else
+                               ADDTYPE(TP_INT);
+                       continue;       /* no output */
+               case 'O':
+                       flags |= LONGINT;
+                       /*FALLTHROUGH*/
+               case 'o':
+                       if (flags & QUADINT)
+                               ADDTYPE(T_U_QUAD);
+                       else
+                               ADDUARG();
+                       break;
+               case 'p':
+                       ADDTYPE(TP_VOID);
+                       break;
+               case 's':
+                       ADDTYPE(TP_CHAR);
+                       break;
+               case 'U':
+                       flags |= LONGINT;
+                       /*FALLTHROUGH*/
+               case 'u':
+                       if (flags & QUADINT)
+                               ADDTYPE(T_U_QUAD);
+                       else
+                               ADDUARG();
+                       break;
+               case 'X':
+               case 'x':
+                       if (flags & QUADINT)
+                               ADDTYPE(T_U_QUAD);
+                       else
+                               ADDUARG();
+                       break;
+               default:        /* "%?" prints ?, unless ? is NUL */
+                       if (ch == '\0')
+                               goto done;
+                       break;
+               }
+       }
+done:
+       /*
+        * Build the argument table.
+        */
+       if (tablemax >= STATIC_ARG_TBL_SIZE) {
+               *argtable = (void **)
+                   malloc (sizeof (void *) * (tablemax + 1));
+       }
+
+       (*argtable) [0] = NULL;
+       for (n = 1; n <= tablemax; n++) {
+               switch (typetable [n]) {
+                   case T_UNUSED:
+                       (*argtable) [n] = (void *) &va_arg (ap, int);
+                       break;
+                   case T_SHORT:
+                       (*argtable) [n] = (void *) &va_arg (ap, int);
+                       break;
+                   case T_U_SHORT:
+                       (*argtable) [n] = (void *) &va_arg (ap, int);
+                       break;
+                   case TP_SHORT:
+                       (*argtable) [n] = (void *) &va_arg (ap, short *);
+                       break;
+                   case T_INT:
+                       (*argtable) [n] = (void *) &va_arg (ap, int);
+                       break;
+                   case T_U_INT:
+                       (*argtable) [n] = (void *) &va_arg (ap, unsigned int);
+                       break;
+                   case TP_INT:
+                       (*argtable) [n] = (void *) &va_arg (ap, int *);
+                       break;
+                   case T_LONG:
+                       (*argtable) [n] = (void *) &va_arg (ap, long);
+                       break;
+                   case T_U_LONG:
+                       (*argtable) [n] = (void *) &va_arg (ap, unsigned long);
+                       break;
+                   case TP_LONG:
+                       (*argtable) [n] = (void *) &va_arg (ap, long *);
+                       break;
+                   case T_QUAD:
+                       (*argtable) [n] = (void *) &va_arg (ap, quad_t);
+                       break;
+                   case T_U_QUAD:
+                       (*argtable) [n] = (void *) &va_arg (ap, u_quad_t);
+                       break;
+                   case TP_QUAD:
+                       (*argtable) [n] = (void *) &va_arg (ap, quad_t *);
+                       break;
+                   case T_DOUBLE:
+                       (*argtable) [n] = (void *) &va_arg (ap, double);
+                       break;
+                   case T_LONG_DOUBLE:
+                       (*argtable) [n] = (void *) &va_arg (ap, long double);
+                       break;
+                   case TP_CHAR:
+                       (*argtable) [n] = (void *) &va_arg (ap, char *);
+                       break;
+                   case TP_VOID:
+                       (*argtable) [n] = (void *) &va_arg (ap, void *);
+                       break;
+               }
+       }
+
+       if ((typetable != NULL) && (typetable != stattypetable))
+               free (typetable);
+}
+
+/*
+ * Increase the size of the type table.
+ */
+static void
+__grow_type_table (nextarg, typetable, tablesize)
+       int nextarg;
+       unsigned char **typetable;
+       int *tablesize;
+{
+       unsigned char *oldtable = *typetable;
+       int newsize = *tablesize * 2;
+
+       if (*tablesize == STATIC_ARG_TBL_SIZE) {
+               *typetable = (unsigned char *)
+                   malloc (sizeof (unsigned char) * newsize);
+               bcopy (oldtable, *typetable, *tablesize);
+       } else {
+               *typetable = (unsigned char *)
+                   realloc (typetable, sizeof (unsigned char) * newsize);
+
+       }
+       memset (&typetable [*tablesize], T_UNUSED, (newsize - *tablesize));
+
+       *tablesize = newsize;
+}
+
+
+#ifdef FLOATING_POINT
+
+extern char *__dtoa __P((double, int, int, int *, int *, char **));
+
+static char *
+cvt(value, ndigits, flags, sign, decpt, ch, length)
+       double value;
+       int ndigits, flags, *decpt, ch, *length;
+       char *sign;
+{
+       int mode, dsgn;
+       char *digits, *bp, *rve;
+
+       if (ch == 'f')
+               mode = 3;               /* ndigits after the decimal point */
+       else {
+               /*
+                * To obtain ndigits after the decimal point for the 'e'
+                * and 'E' formats, round to ndigits + 1 significant
+                * figures.
+                */
+               if (ch == 'e' || ch == 'E')
+                       ndigits++;
+               mode = 2;               /* ndigits significant digits */
+       }
+       if (value < 0) {
+               value = -value;
+               *sign = '-';
+       } else
+               *sign = '\000';
+       digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve);
+       if ((ch != 'g' && ch != 'G') || flags & ALT) {
+               /* print trailing zeros */
+               bp = digits + ndigits;
+               if (ch == 'f') {
+                       if (*digits == '0' && value)
+                               *decpt = -ndigits + 1;
+                       bp += *decpt;
+               }
+               if (value == 0) /* kludge for __dtoa irregularity */
+                       rve = bp;
+               while (rve < bp)
+                       *rve++ = '0';
+       }
+       *length = rve - digits;
+       return (digits);
+}
+
+static int
+exponent(p0, exp, fmtch)
+       char *p0;
+       int exp, fmtch;
+{
+       register char *p, *t;
+       char expbuf[MAXEXP];
+
+       p = p0;
+       *p++ = fmtch;
+       if (exp < 0) {
+               exp = -exp;
+               *p++ = '-';
+       }
+       else
+               *p++ = '+';
+       t = expbuf + MAXEXP;
+       if (exp > 9) {
+               do {
+                       *--t = to_char(exp % 10);
+               } while ((exp /= 10) > 9);
+               *--t = to_char(exp);
+               for (; t < expbuf + MAXEXP; *p++ = *t++);
+       }
+       else {
+               *p++ = '0';
+               *p++ = to_char(exp);
+       }
+       return (p - p0);
+}
+#endif /* FLOATING_POINT */
diff --git a/stdio.subproj/vfscanf.c b/stdio.subproj/vfscanf.c
new file mode 100644 (file)
index 0000000..c245bfc
--- /dev/null
@@ -0,0 +1,767 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#if __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+#include "local.h"
+
+#define FLOATING_POINT
+
+#include "floatio.h"
+#define        BUF             513     /* Maximum length of numeric string. */
+
+/*
+ * Flags used during conversion.
+ */
+#define        LONG            0x01    /* l: long or double */
+#define        LONGDBL         0x02    /* L: long double; unimplemented */
+#define        SHORT           0x04    /* h: short */
+#define        SUPPRESS        0x08    /* suppress assignment */
+#define        POINTER         0x10    /* weird %p pointer (`fake hex') */
+#define        NOSKIP          0x20    /* do not skip blanks */
+
+/*
+ * The following are used in numeric conversions only:
+ * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point;
+ * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral.
+ */
+#define        SIGNOK          0x40    /* +/- is (still) legal */
+#define        NDIGITS         0x80    /* no digits detected */
+
+#define        DPTOK           0x100   /* (float) decimal point is still legal */
+#define        EXPOK           0x200   /* (float) exponent (e+3, etc) still legal */
+
+#define        PFXOK           0x100   /* 0x prefix is (still) legal */
+#define        NZDIGITS        0x200   /* no zero digits detected */
+
+/*
+ * Conversion types.
+ */
+#define        CT_CHAR         0       /* %c conversion */
+#define        CT_CCL          1       /* %[...] conversion */
+#define        CT_STRING       2       /* %s conversion */
+#define        CT_INT          3       /* integer, i.e., strtol or strtoul */
+#define        CT_FLOAT        4       /* floating, i.e., strtod */
+
+#define u_char unsigned char
+#define u_long unsigned long
+
+static u_char *__sccl();
+
+/*
+ * vfscanf
+ */
+int
+__svfscanf(fp, fmt0, ap)
+       register FILE *fp;
+       char const *fmt0;
+       va_list ap;
+{
+       register u_char *fmt = (u_char *)fmt0;
+       register int c;         /* character from format, or conversion */
+       register size_t width;  /* field width, or 0 */
+       register char *p;       /* points into all kinds of strings */
+       register int n;         /* handy integer */
+       register int flags;     /* flags as defined above */
+       register char *p0;      /* saves original value of p when necessary */
+       int nassigned;          /* number of fields assigned */
+       int nread;              /* number of characters consumed from fp */
+       int base;               /* base argument to strtol/strtoul */
+       u_long (*ccfn)();       /* conversion function (strtol/strtoul) */
+       char ccltab[256];       /* character class table for %[...] */
+       char buf[BUF];          /* buffer for numeric conversions */
+
+       /* `basefix' is used to avoid `if' tests in the integer scanner */
+       static short basefix[17] =
+               { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
+
+       nassigned = 0;
+       nread = 0;
+       base = 0;               /* XXX just to keep gcc happy */
+       ccfn = NULL;            /* XXX just to keep gcc happy */
+       for (;;) {
+               c = *fmt++;
+               if (c == 0)
+                       return (nassigned);
+               if (isspace(c)) {
+                       for (;;) {
+                               if (fp->_r <= 0 && __srefill(fp))
+                                       return (nassigned);
+                               if (!isspace(*fp->_p))
+                                       break;
+                               nread++, fp->_r--, fp->_p++;
+                       }
+                       continue;
+               }
+               if (c != '%')
+                       goto literal;
+               width = 0;
+               flags = 0;
+               /*
+                * switch on the format.  continue if done;
+                * break once format type is derived.
+                */
+again:         c = *fmt++;
+               switch (c) {
+               case '%':
+literal:
+                       if (fp->_r <= 0 && __srefill(fp))
+                               goto input_failure;
+                       if (*fp->_p != c)
+                               goto match_failure;
+                       fp->_r--, fp->_p++;
+                       nread++;
+                       continue;
+
+               case '*':
+                       flags |= SUPPRESS;
+                       goto again;
+               case 'l':
+                       flags |= LONG;
+                       goto again;
+               case 'L':
+                       flags |= LONGDBL;
+                       goto again;
+               case 'h':
+                       flags |= SHORT;
+                       goto again;
+
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       width = width * 10 + c - '0';
+                       goto again;
+
+               /*
+                * Conversions.
+                * Those marked `compat' are for 4.[123]BSD compatibility.
+                *
+                * (According to ANSI, E and X formats are supposed
+                * to the same as e and x.  Sorry about that.)
+                */
+               case 'D':       /* compat */
+                       flags |= LONG;
+                       /* FALLTHROUGH */
+               case 'd':
+                       c = CT_INT;
+                       ccfn = (u_long (*)())strtol;
+                       base = 10;
+                       break;
+
+               case 'i':
+                       c = CT_INT;
+                       ccfn = (u_long (*)())strtol;
+                       base = 0;
+                       break;
+
+               case 'O':       /* compat */
+                       flags |= LONG;
+                       /* FALLTHROUGH */
+               case 'o':
+                       c = CT_INT;
+                       ccfn = strtoul;
+                       base = 8;
+                       break;
+
+               case 'u':
+                       c = CT_INT;
+                       ccfn = strtoul;
+                       base = 10;
+                       break;
+
+               case 'X':       /* compat   XXX */
+                       flags |= LONG;
+                       /* FALLTHROUGH */
+               case 'x':
+                       flags |= PFXOK; /* enable 0x prefixing */
+                       c = CT_INT;
+                       ccfn = strtoul;
+                       base = 16;
+                       break;
+
+#ifdef FLOATING_POINT
+               case 'E':       /* compat   XXX */
+               case 'F':       /* compat */
+                       flags |= LONG;
+                       /* FALLTHROUGH */
+               case 'e': case 'f': case 'g':
+                       c = CT_FLOAT;
+                       break;
+#endif
+
+               case 's':
+                       c = CT_STRING;
+                       break;
+
+               case '[':
+                       fmt = __sccl(ccltab, fmt);
+                       flags |= NOSKIP;
+                       c = CT_CCL;
+                       break;
+
+               case 'c':
+                       flags |= NOSKIP;
+                       c = CT_CHAR;
+                       break;
+
+               case 'p':       /* pointer format is like hex */
+                       flags |= POINTER | PFXOK;
+                       c = CT_INT;
+                       ccfn = strtoul;
+                       base = 16;
+                       break;
+
+               case 'n':
+                       if (flags & SUPPRESS)   /* ??? */
+                               continue;
+                       if (flags & SHORT)
+                               *va_arg(ap, short *) = nread;
+                       else if (flags & LONG)
+                               *va_arg(ap, long *) = nread;
+                       else
+                               *va_arg(ap, int *) = nread;
+                       continue;
+
+               /*
+                * Disgusting backwards compatibility hacks.    XXX
+                */
+               case '\0':      /* compat */
+                       return (EOF);
+
+               default:        /* compat */
+                       if (isupper(c))
+                               flags |= LONG;
+                       c = CT_INT;
+                       ccfn = (u_long (*)())strtol;
+                       base = 10;
+                       break;
+               }
+
+               /*
+                * We have a conversion that requires input.
+                */
+               if (fp->_r <= 0 && __srefill(fp))
+                       goto input_failure;
+
+               /*
+                * Consume leading white space, except for formats
+                * that suppress this.
+                */
+               if ((flags & NOSKIP) == 0) {
+                       while (isspace(*fp->_p)) {
+                               nread++;
+                               if (--fp->_r > 0)
+                                       fp->_p++;
+                               else if (__srefill(fp))
+                                       goto input_failure;
+                       }
+                       /*
+                        * Note that there is at least one character in
+                        * the buffer, so conversions that do not set NOSKIP
+                        * ca no longer result in an input failure.
+                        */
+               }
+
+               /*
+                * Do the conversion.
+                */
+               switch (c) {
+
+               case CT_CHAR:
+                       /* scan arbitrary characters (sets NOSKIP) */
+                       if (width == 0)
+                               width = 1;
+                       if (flags & SUPPRESS) {
+                               size_t sum = 0;
+                               for (;;) {
+                                       if ((n = fp->_r) < width) {
+                                               sum += n;
+                                               width -= n;
+                                               fp->_p += n;
+                                               if (__srefill(fp)) {
+                                                       if (sum == 0)
+                                                           goto input_failure;
+                                                       break;
+                                               }
+                                       } else {
+                                               sum += width;
+                                               fp->_r -= width;
+                                               fp->_p += width;
+                                               break;
+                                       }
+                               }
+                               nread += sum;
+                       } else {
+                               size_t r = fread((void *)va_arg(ap, char *), 1,
+                                   width, fp);
+
+                               if (r == 0)
+                                       goto input_failure;
+                               nread += r;
+                               nassigned++;
+                       }
+                       break;
+
+               case CT_CCL:
+                       /* scan a (nonempty) character class (sets NOSKIP) */
+                       if (width == 0)
+                               width = ~0;     /* `infinity' */
+                       /* take only those things in the class */
+                       if (flags & SUPPRESS) {
+                               n = 0;
+                               while (ccltab[*fp->_p]) {
+                                       n++, fp->_r--, fp->_p++;
+                                       if (--width == 0)
+                                               break;
+                                       if (fp->_r <= 0 && __srefill(fp)) {
+                                               if (n == 0)
+                                                       goto input_failure;
+                                               break;
+                                       }
+                               }
+                               if (n == 0)
+                                       goto match_failure;
+                       } else {
+                               p0 = p = va_arg(ap, char *);
+                               while (ccltab[*fp->_p]) {
+                                       fp->_r--;
+                                       *p++ = *fp->_p++;
+                                       if (--width == 0)
+                                               break;
+                                       if (fp->_r <= 0 && __srefill(fp)) {
+                                               if (p == p0)
+                                                       goto input_failure;
+                                               break;
+                                       }
+                               }
+                               n = p - p0;
+                               if (n == 0)
+                                       goto match_failure;
+                               *p = 0;
+                               nassigned++;
+                       }
+                       nread += n;
+                       break;
+
+               case CT_STRING:
+                       /* like CCL, but zero-length string OK, & no NOSKIP */
+                       if (width == 0)
+                               width = ~0;
+                       if (flags & SUPPRESS) {
+                               n = 0;
+                               while (!isspace(*fp->_p)) {
+                                       n++, fp->_r--, fp->_p++;
+                                       if (--width == 0)
+                                               break;
+                                       if (fp->_r <= 0 && __srefill(fp))
+                                               break;
+                               }
+                               nread += n;
+                       } else {
+                               p0 = p = va_arg(ap, char *);
+                               while (!isspace(*fp->_p)) {
+                                       fp->_r--;
+                                       *p++ = *fp->_p++;
+                                       if (--width == 0)
+                                               break;
+                                       if (fp->_r <= 0 && __srefill(fp))
+                                               break;
+                               }
+                               *p = 0;
+                               nread += p - p0;
+                               nassigned++;
+                       }
+                       continue;
+
+               case CT_INT:
+                       /* scan an integer as if by strtol/strtoul */
+#ifdef hardway
+                       if (width == 0 || width > sizeof(buf) - 1)
+                               width = sizeof(buf) - 1;
+#else
+                       /* size_t is unsigned, hence this optimisation */
+                       if (--width > sizeof(buf) - 2)
+                               width = sizeof(buf) - 2;
+                       width++;
+#endif
+                       flags |= SIGNOK | NDIGITS | NZDIGITS;
+                       for (p = buf; width; width--) {
+                               c = *fp->_p;
+                               /*
+                                * Switch on the character; `goto ok'
+                                * if we accept it as a part of number.
+                                */
+                               switch (c) {
+
+                               /*
+                                * The digit 0 is always legal, but is
+                                * special.  For %i conversions, if no
+                                * digits (zero or nonzero) have been
+                                * scanned (only signs), we will have
+                                * base==0.  In that case, we should set
+                                * it to 8 and enable 0x prefixing.
+                                * Also, if we have not scanned zero digits
+                                * before this, do not turn off prefixing
+                                * (someone else will turn it off if we
+                                * have scanned any nonzero digits).
+                                */
+                               case '0':
+                                       if (base == 0) {
+                                               base = 8;
+                                               flags |= PFXOK;
+                                       }
+                                       if (flags & NZDIGITS)
+                                           flags &= ~(SIGNOK|NZDIGITS|NDIGITS);
+                                       else
+                                           flags &= ~(SIGNOK|PFXOK|NDIGITS);
+                                       goto ok;
+
+                               /* 1 through 7 always legal */
+                               case '1': case '2': case '3':
+                               case '4': case '5': case '6': case '7':
+                                       base = basefix[base];
+                                       flags &= ~(SIGNOK | PFXOK | NDIGITS);
+                                       goto ok;
+
+                               /* digits 8 and 9 ok iff decimal or hex */
+                               case '8': case '9':
+                                       base = basefix[base];
+                                       if (base <= 8)
+                                               break;  /* not legal here */
+                                       flags &= ~(SIGNOK | PFXOK | NDIGITS);
+                                       goto ok;
+
+                               /* letters ok iff hex */
+                               case 'A': case 'B': case 'C':
+                               case 'D': case 'E': case 'F':
+                               case 'a': case 'b': case 'c':
+                               case 'd': case 'e': case 'f':
+                                       /* no need to fix base here */
+                                       if (base <= 10)
+                                               break;  /* not legal here */
+                                       flags &= ~(SIGNOK | PFXOK | NDIGITS);
+                                       goto ok;
+
+                               /* sign ok only as first character */
+                               case '+': case '-':
+                                       if (flags & SIGNOK) {
+                                               flags &= ~SIGNOK;
+                                               goto ok;
+                                       }
+                                       break;
+
+                               /* x ok iff flag still set & 2nd char */
+                               case 'x': case 'X':
+                                       if (flags & PFXOK && p == buf + 1) {
+                                               base = 16;      /* if %i */
+                                               flags &= ~PFXOK;
+                                               goto ok;
+                                       }
+                                       break;
+                               }
+
+                               /*
+                                * If we got here, c is not a legal character
+                                * for a number.  Stop accumulating digits.
+                                */
+                               break;
+               ok:
+                               /*
+                                * c is legal: store it and look at the next.
+                                */
+                               *p++ = c;
+                               if (--fp->_r > 0)
+                                       fp->_p++;
+                               else if (__srefill(fp))
+                                       break;          /* EOF */
+                       }
+                       /*
+                        * If we had only a sign, it is no good; push
+                        * back the sign.  If the number ends in `x',
+                        * it was [sign] '0' 'x', so push back the x
+                        * and treat it as [sign] '0'.
+                        */
+                       if (flags & NDIGITS) {
+                               if (p > buf)
+                                       (void) ungetc(*(u_char *)--p, fp);
+                               goto match_failure;
+                       }
+                       c = ((u_char *)p)[-1];
+                       if (c == 'x' || c == 'X') {
+                               --p;
+                               (void) ungetc(c, fp);
+                       }
+                       if ((flags & SUPPRESS) == 0) {
+                               u_long res;
+
+                               *p = 0;
+                               res = (*ccfn)(buf, (char **)NULL, base);
+                               if (flags & POINTER)
+                                       *va_arg(ap, void **) = (void *)res;
+                               else if (flags & SHORT)
+                                       *va_arg(ap, short *) = res;
+                               else if (flags & LONG)
+                                       *va_arg(ap, long *) = res;
+                               else
+                                       *va_arg(ap, int *) = res;
+                               nassigned++;
+                       }
+                       nread += p - buf;
+                       break;
+
+#ifdef FLOATING_POINT
+               case CT_FLOAT:
+                       /* scan a floating point number as if by strtod */
+#ifdef hardway
+                       if (width == 0 || width > sizeof(buf) - 1)
+                               width = sizeof(buf) - 1;
+#else
+                       /* size_t is unsigned, hence this optimisation */
+                       if (--width > sizeof(buf) - 2)
+                               width = sizeof(buf) - 2;
+                       width++;
+#endif
+                       flags |= SIGNOK | NDIGITS | DPTOK | EXPOK;
+                       for (p = buf; width; width--) {
+                               c = *fp->_p;
+                               /*
+                                * This code mimicks the integer conversion
+                                * code, but is much simpler.
+                                */
+                               switch (c) {
+
+                               case '0': case '1': case '2': case '3':
+                               case '4': case '5': case '6': case '7':
+                               case '8': case '9':
+                                       flags &= ~(SIGNOK | NDIGITS);
+                                       goto fok;
+
+                               case '+': case '-':
+                                       if (flags & SIGNOK) {
+                                               flags &= ~SIGNOK;
+                                               goto fok;
+                                       }
+                                       break;
+                               case '.':
+                                       if (flags & DPTOK) {
+                                               flags &= ~(SIGNOK | DPTOK);
+                                               goto fok;
+                                       }
+                                       break;
+                               case 'e': case 'E':
+                                       /* no exponent without some digits */
+                                       if ((flags&(NDIGITS|EXPOK)) == EXPOK) {
+                                               flags =
+                                                   (flags & ~(EXPOK|DPTOK)) |
+                                                   SIGNOK | NDIGITS;
+                                               goto fok;
+                                       }
+                                       break;
+                               }
+                               break;
+               fok:
+                               *p++ = c;
+                               if (--fp->_r > 0)
+                                       fp->_p++;
+                               else if (__srefill(fp))
+                                       break;  /* EOF */
+                       }
+                       /*
+                        * If no digits, might be missing exponent digits
+                        * (just give back the exponent) or might be missing
+                        * regular digits, but had sign and/or decimal point.
+                        */
+                       if (flags & NDIGITS) {
+                               if (flags & EXPOK) {
+                                       /* no digits at all */
+                                       while (p > buf)
+                                               ungetc(*(u_char *)--p, fp);
+                                       goto match_failure;
+                               }
+                               /* just a bad exponent (e and maybe sign) */
+                               c = *(u_char *)--p;
+                               if (c != 'e' && c != 'E') {
+                                       (void) ungetc(c, fp);/* sign */
+                                       c = *(u_char *)--p;
+                               }
+                               (void) ungetc(c, fp);
+                       }
+                       if ((flags & SUPPRESS) == 0) {
+                               double res;
+
+                               *p = 0;
+                               res = strtod(buf,(char **) NULL);
+                               if (flags & LONG)
+                                       *va_arg(ap, double *) = res;
+                               else
+                                       *va_arg(ap, float *) = res;
+                               nassigned++;
+                       }
+                       nread += p - buf;
+                       break;
+#endif /* FLOATING_POINT */
+               }
+       }
+input_failure:
+       return (nassigned ? nassigned : -1);
+match_failure:
+       return (nassigned);
+}
+
+/*
+ * Fill in the given table from the scanset at the given format
+ * (just after `[').  Return a pointer to the character past the
+ * closing `]'.  The table has a 1 wherever characters should be
+ * considered part of the scanset.
+ */
+static u_char *
+__sccl(tab, fmt)
+       register char *tab;
+       register u_char *fmt;
+{
+       register int c, n, v;
+
+       /* first `clear' the whole table */
+       c = *fmt++;             /* first char hat => negated scanset */
+       if (c == '^') {
+               v = 1;          /* default => accept */
+               c = *fmt++;     /* get new first char */
+       } else
+               v = 0;          /* default => reject */
+       /* should probably use memset here */
+       for (n = 0; n < 256; n++)
+               tab[n] = v;
+       if (c == 0)
+               return (fmt - 1);/* format ended before closing ] */
+
+       /*
+        * Now set the entries corresponding to the actual scanset
+        * to the opposite of the above.
+        *
+        * The first character may be ']' (or '-') without being special;
+        * the last character may be '-'.
+        */
+       v = 1 - v;
+       for (;;) {
+               tab[c] = v;             /* take character c */
+doswitch:
+               n = *fmt++;             /* and examine the next */
+               switch (n) {
+
+               case 0:                 /* format ended too soon */
+                       return (fmt - 1);
+
+               case '-':
+                       /*
+                        * A scanset of the form
+                        *      [01+-]
+                        * is defined as `the digit 0, the digit 1,
+                        * the character +, the character -', but
+                        * the effect of a scanset such as
+                        *      [a-zA-Z0-9]
+                        * is implementation defined.  The V7 Unix
+                        * scanf treats `a-z' as `the letters a through
+                        * z', but treats `a-a' as `the letter a, the
+                        * character -, and the letter a'.
+                        *
+                        * For compatibility, the `-' is not considerd
+                        * to define a range if the character following
+                        * it is either a close bracket (required by ANSI)
+                        * or is not numerically greater than the character
+                        * we just stored in the table (c).
+                        */
+                       n = *fmt;
+                       if (n == ']' || n < c) {
+                               c = '-';
+                               break;  /* resume the for(;;) */
+                       }
+                       fmt++;
+                       do {            /* fill in the range */
+                               tab[++c] = v;
+                       } while (c < n);
+#if 1  /* XXX another disgusting compatibility hack */
+                       /*
+                        * Alas, the V7 Unix scanf also treats formats
+                        * such as [a-c-e] as `the letters a through e'.
+                        * This too is permitted by the standard....
+                        */
+                       goto doswitch;
+#else
+                       c = *fmt++;
+                       if (c == 0)
+                               return (fmt - 1);
+                       if (c == ']')
+                               return (fmt);
+#endif
+                       break;
+
+               case ']':               /* end of scanset */
+                       return (fmt);
+
+               default:                /* just another character */
+                       c = n;
+                       break;
+               }
+       }
+       /* NOTREACHED */
+}
diff --git a/stdio.subproj/vprintf.c b/stdio.subproj/vprintf.c
new file mode 100644 (file)
index 0000000..686deaf
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+vprintf(fmt, ap)
+       char const *fmt;
+       _BSD_VA_LIST_ ap;
+{
+       return (vfprintf(stdout, fmt, ap));
+}
diff --git a/stdio.subproj/vscanf.c b/stdio.subproj/vscanf.c
new file mode 100644 (file)
index 0000000..3b92a1c
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Donn Seeley at UUNET Technologies, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+vscanf(fmt, ap)
+       const char *fmt;
+       _BSD_VA_LIST_ ap;
+{
+
+       return (__svfscanf(stdin, fmt, ap));
+}
diff --git a/stdio.subproj/vsnprintf.c b/stdio.subproj/vsnprintf.c
new file mode 100644 (file)
index 0000000..3d2e6d1
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+
+int
+vsnprintf(str, n, fmt, ap)
+       char *str;
+       size_t n;
+       const char *fmt;
+       _BSD_VA_LIST_ ap;
+{
+       int ret;
+       FILE f;
+
+       if ((int)n < 1)
+               return (EOF);
+       f._flags = __SWR | __SSTR;
+       f._bf._base = f._p = (unsigned char *)str;
+       f._bf._size = f._w = n - 1;
+       ret = vfprintf(&f, fmt, ap);
+       *f._p = 0;
+       return (ret);
+}
diff --git a/stdio.subproj/vsprintf.c b/stdio.subproj/vsprintf.c
new file mode 100644 (file)
index 0000000..2e8e0ad
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <limits.h>
+
+int
+vsprintf(str, fmt, ap)
+       char *str;
+       const char *fmt;
+       _BSD_VA_LIST_ ap;
+{
+       int ret;
+       FILE f;
+
+       f._flags = __SWR | __SSTR;
+       f._bf._base = f._p = (unsigned char *)str;
+       f._bf._size = f._w = INT_MAX;
+       ret = vfprintf(&f, fmt, ap);
+       *f._p = 0;
+       return (ret);
+}
diff --git a/stdio.subproj/vsscanf.c b/stdio.subproj/vsscanf.c
new file mode 100644 (file)
index 0000000..59bbabf
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Donn Seeley at UUNET Technologies, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+
+/* ARGSUSED */
+static int
+eofread(cookie, buf, len)
+       void *cookie;
+       char *buf;
+       int len;
+{
+
+       return (0);
+}
+
+int
+vsscanf(str, fmt, ap)
+       const char *str;
+       const char *fmt;
+       _BSD_VA_LIST_ ap;
+{
+       FILE f;
+
+       f._flags = __SRD;
+       f._bf._base = f._p = (unsigned char *)str;
+       f._bf._size = f._r = strlen(str);
+       f._read = eofread;
+       f._ub._base = NULL;
+       f._lb._base = NULL;
+       return (__svfscanf(&f, fmt, ap));
+}
diff --git a/stdio.subproj/wbuf.c b/stdio.subproj/wbuf.c
new file mode 100644 (file)
index 0000000..78032d4
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include "local.h"
+
+/*
+ * Write the given character into the (probably full) buffer for
+ * the given file.  Flush the buffer out if it is or becomes full,
+ * or if c=='\n' and the file is line buffered.
+ */
+int
+__swbuf(c, fp)
+       register int c;
+       register FILE *fp;
+{
+       register int n;
+
+       /*
+        * In case we cannot write, or longjmp takes us out early,
+        * make sure _w is 0 (if fully- or un-buffered) or -_bf._size
+        * (if line buffered) so that we will get called again.
+        * If we did not do this, a sufficient number of putc()
+        * calls might wrap _w from negative to positive.
+        */
+       fp->_w = fp->_lbfsize;
+       if (cantwrite(fp))
+               return (EOF);
+       c = (unsigned char)c;
+
+       /*
+        * If it is completely full, flush it out.  Then, in any case,
+        * stuff c into the buffer.  If this causes the buffer to fill
+        * completely, or if c is '\n' and the file is line buffered,
+        * flush it (perhaps a second time).  The second flush will always
+        * happen on unbuffered streams, where _bf._size==1; fflush()
+        * guarantees that putc() will always call wbuf() by setting _w
+        * to 0, so we need not do anything else.
+        */
+       n = fp->_p - fp->_bf._base;
+       if (n >= fp->_bf._size) {
+               if (fflush(fp))
+                       return (EOF);
+               n = 0;
+       }
+       fp->_w--;
+       *fp->_p++ = c;
+       if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n'))
+               if (fflush(fp))
+                       return (EOF);
+       return (c);
+}
diff --git a/stdio.subproj/wsetup.c b/stdio.subproj/wsetup.c
new file mode 100644 (file)
index 0000000..758523d
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "local.h"
+
+/*
+ * Various output routines call wsetup to be sure it is safe to write,
+ * because either _flags does not include __SWR, or _buf is NULL.
+ * _wsetup returns 0 if OK to write, nonzero otherwise.
+ */
+int
+__swsetup(fp)
+       register FILE *fp;
+{
+       /* make sure stdio is set up */
+       if (!__sdidinit)
+               __sinit();
+
+       /*
+        * If we are not writing, we had better be reading and writing.
+        */
+       if ((fp->_flags & __SWR) == 0) {
+               if ((fp->_flags & __SRW) == 0)
+                       return (EOF);
+               if (fp->_flags & __SRD) {
+                       /* clobber any ungetc data */
+                       if (HASUB(fp))
+                               FREEUB(fp);
+                       fp->_flags &= ~(__SRD|__SEOF);
+                       fp->_r = 0;
+                       fp->_p = fp->_bf._base;
+               }
+               fp->_flags |= __SWR;
+       }
+
+       /*
+        * Make a buffer if necessary, then set _w.
+        */
+       if (fp->_bf._base == NULL)
+               __smakebuf(fp);
+       if (fp->_flags & __SLBF) {
+               /*
+                * It is line buffered, so make _lbfsize be -_bufsize
+                * for the putc() macro.  We will change _lbfsize back
+                * to 0 whenever we turn off __SWR.
+                */
+               fp->_w = 0;
+               fp->_lbfsize = -fp->_bf._size;
+       } else
+               fp->_w = fp->_flags & __SNBF ? 0 : fp->_bf._size;
+       return (0);
+}
diff --git a/stdlib.subproj/Makefile b/stdlib.subproj/Makefile
new file mode 100644 (file)
index 0000000..f952411
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = stdlib
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = atexit.h
+
+CFILES = abort.c atexit.c atof.c atoi.c atol.c bsearch.c div.c\
+         exit.c getenv.c getopt.c getsubopt.c heapsort.c labs.c\
+         ldiv.c merge.c putenv.c qsort.c radixsort.c rand.c random.c\
+         setenv.c strtod.c strtol.c strtoq.c strtoul.c strtouq.c\
+         system.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/stdlib.subproj/Makefile.postamble b/stdlib.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/stdlib.subproj/Makefile.preamble b/stdlib.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/stdlib.subproj/PB.project b/stdlib.subproj/PB.project
new file mode 100644 (file)
index 0000000..7480e6f
--- /dev/null
@@ -0,0 +1,51 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (atexit.h); 
+        OTHER_LINKED = (
+            abort.c, 
+            atexit.c, 
+            atof.c, 
+            atoi.c, 
+            atol.c, 
+            bsearch.c, 
+            div.c, 
+            exit.c, 
+            getenv.c, 
+            getopt.c, 
+            getsubopt.c, 
+            heapsort.c, 
+            labs.c, 
+            ldiv.c, 
+            merge.c, 
+            putenv.c, 
+            qsort.c, 
+            radixsort.c, 
+            rand.c, 
+            random.c, 
+            setenv.c, 
+            strtod.c, 
+            strtol.c, 
+            strtoq.c, 
+            strtoul.c, 
+            strtouq.c, 
+            system.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = stdlib; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/stdlib.subproj/abort.c b/stdlib.subproj/abort.c
new file mode 100644 (file)
index 0000000..df2ae6e
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/signal.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <unistd.h>
+
+void
+abort()
+{
+       sigset_t mask;
+
+       sigfillset(&mask);
+       /*
+        * don't block SIGABRT to give any handler a chance; we ignore
+        * any errors -- X311J doesn't allow abort to return anyway.
+        */
+       sigdelset(&mask, SIGABRT);
+       (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
+       (void)kill(getpid(), SIGABRT);
+
+       /*
+        * if SIGABRT ignored, or caught and the handler returns, do
+        * it again, only harder.
+        */
+       (void)signal(SIGABRT, SIG_DFL);
+       (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL);
+       (void)kill(getpid(), SIGABRT);
+       exit(1);
+}
diff --git a/stdlib.subproj/atexit.c b/stdlib.subproj/atexit.c
new file mode 100644 (file)
index 0000000..014fbce
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "atexit.h"
+
+struct atexit *__atexit = NULL;                /* points to head of LIFO stack */
+
+/*
+ * Register a function to be performed at exit.
+ */
+int
+atexit(fn)
+       void (*fn)();
+{
+       static struct atexit __atexit0; /* one guaranteed table */
+       register struct atexit *p;
+
+       if ((p = __atexit) == NULL)
+               __atexit = p = &__atexit0;
+       else if (p->ind >= ATEXIT_SIZE) {
+               if ((p = malloc(sizeof(*p))) == NULL)
+                       return (-1);
+               p->ind = 0;
+               p->next = __atexit;
+               __atexit = p;
+       }
+       p->fns[p->ind++] = fn;
+       return (0);
+}
diff --git a/stdlib.subproj/atexit.h b/stdlib.subproj/atexit.h
new file mode 100644 (file)
index 0000000..27a7fa5
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* must be at least 32 to guarantee ANSI conformance */
+#define        ATEXIT_SIZE     32
+
+struct atexit {
+       struct atexit *next;            /* next in list */
+       int ind;                        /* next index in this table */
+       void (*fns[ATEXIT_SIZE])();     /* the table itself */
+};
+
+extern struct atexit *__atexit;                /* points to head of LIFO stack */
+                                       /* storage allocated in atexit.c */
diff --git a/stdlib.subproj/atof.c b/stdlib.subproj/atof.c
new file mode 100644 (file)
index 0000000..49ad147
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+
+double
+atof(ascii)
+       const char *ascii;
+{
+       return (strtod(ascii, NULL));
+}
+
diff --git a/stdlib.subproj/atoi.c b/stdlib.subproj/atoi.c
new file mode 100644 (file)
index 0000000..c178b6a
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+#include <stddef.h>
+
+atoi(str)
+       const char *str;
+{
+       return((int)strtol(str, (char **)NULL, 10));
+}
diff --git a/stdlib.subproj/atol.c b/stdlib.subproj/atol.c
new file mode 100644 (file)
index 0000000..5aec484
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stddef.h>
+#include <stdlib.h>
+
+long
+atol(str)
+       const char *str;
+{
+       return(strtol(str, (char **)NULL, 10));
+}
diff --git a/stdlib.subproj/bsearch.c b/stdlib.subproj/bsearch.c
new file mode 100644 (file)
index 0000000..bb40138
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stddef.h>
+#include <stdlib.h>
+
+/*
+ * Perform a binary search.
+ *
+ * The code below is a bit sneaky.  After a comparison fails, we
+ * divide the work in half by moving either left or right. If lim
+ * is odd, moving left simply involves halving lim: e.g., when lim
+ * is 5 we look at item 2, so we change lim to 2 so that we will
+ * look at items 0 & 1.  If lim is even, the same applies.  If lim
+ * is odd, moving right again involes halving lim, this time moving
+ * the base up one item past p: e.g., when lim is 5 we change base
+ * to item 3 and make lim 2 so that we will look at items 3 and 4.
+ * If lim is even, however, we have to shrink it by one before
+ * halving: e.g., when lim is 4, we still looked at item 2, so we
+ * have to make lim 3, then halve, obtaining 1, so that we will only
+ * look at item 3.
+ */
+void *
+bsearch(key, base0, nmemb, size, compar)
+       register const void *key;
+       const void *base0;
+       size_t nmemb;
+       register size_t size;
+       register int (*compar) __P((const void *, const void *));
+{
+       register const char *base = base0;
+       register size_t lim;
+       register int cmp;
+       register const void *p;
+
+       for (lim = nmemb; lim != 0; lim >>= 1) {
+               p = base + (lim >> 1) * size;
+               cmp = (*compar)(key, p);
+               if (cmp == 0)
+                       return ((void *)p);
+               if (cmp > 0) {  /* key > p: move right */
+                       base = (char *)p + size;
+                       lim--;
+               }               /* else move left */
+       }
+       return (NULL);
+}
diff --git a/stdlib.subproj/div.c b/stdlib.subproj/div.c
new file mode 100644 (file)
index 0000000..c6594e6
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>            /* div_t */
+
+div_t
+div(num, denom)
+       int num, denom;
+{
+       div_t r;
+
+       r.quot = num / denom;
+       r.rem = num % denom;
+       /*
+        * The ANSI standard says that |r.quot| <= |n/d|, where
+        * n/d is to be computed in infinite precision.  In other
+        * words, we should always truncate the quotient towards
+        * 0, never -infinity.
+        *
+        * Machine division and remainer may work either way when
+        * one or both of n or d is negative.  If only one is
+        * negative and r.quot has been truncated towards -inf,
+        * r.rem will have the same sign as denom and the opposite
+        * sign of num; if both are negative and r.quot has been
+        * truncated towards -inf, r.rem will be positive (will
+        * have the opposite sign of num).  These are considered
+        * `wrong'.
+        *
+        * If both are num and denom are positive, r will always
+        * be positive.
+        *
+        * This all boils down to:
+        *      if num >= 0, but r.rem < 0, we got the wrong answer.
+        * In that case, to get the right answer, add 1 to r.quot and
+        * subtract denom from r.rem.
+        */
+       if (num >= 0 && r.rem < 0) {
+               r.quot++;
+               r.rem -= denom;
+       }
+       return (r);
+}
diff --git a/stdlib.subproj/exit.c b/stdlib.subproj/exit.c
new file mode 100644 (file)
index 0000000..133133d
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include "atexit.h"
+
+void (*__cleanup)() = NULL;
+
+/*
+ * Exit, flushing stdio buffers if necessary.
+ */
+void
+exit(status)
+       int status;
+{
+       register struct atexit *p;
+       register int n;
+
+       for (p = __atexit; p; p = p->next)
+               for (n = p->ind; --n >= 0;)
+                       (*p->fns[n])();
+       if (__cleanup)
+               (*__cleanup)();
+       _exit(status);
+}
diff --git a/stdlib.subproj/getenv.c b/stdlib.subproj/getenv.c
new file mode 100644 (file)
index 0000000..51d9073
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+#include <crt_externs.h>
+
+char *__findenv __P((const char *, int *));
+
+/*
+ * getenv --
+ *     Returns ptr to value associated with name, if any, else NULL.
+ */
+char *
+getenv(name)
+       const char *name;
+{
+       int offset;
+
+       return (__findenv(name, &offset));
+}
+
+/*
+ * __findenv --
+ *     Returns pointer to value associated with name, if any, else NULL.
+ *     Sets offset to be the offset of the name/value combination in the
+ *     environmental array, for use by setenv(3) and unsetenv(3).
+ *     Explicitly removes '=' in argument name.
+ *
+ *     This routine *should* be a static; don't use it.
+ */
+char *
+__findenv(name, offset)
+       register const char *name;
+       int *offset;
+{
+       register int len;
+       register const char *np;
+       register char **p, *c;
+
+        char **environ = *_NSGetEnviron();
+
+       if (name == NULL || environ == NULL)
+               return (NULL);
+       for (np = name; *np && *np != '='; ++np)
+               continue;
+       len = np - name;
+       for (p = environ; (c = *p) != NULL; ++p)
+               if (strncmp(c, name, len) == 0 && c[len] == '=') {
+                       *offset = p - environ;
+                       return (c + len + 1);
+               }
+       return (NULL);
+}
diff --git a/stdlib.subproj/getopt.c b/stdlib.subproj/getopt.c
new file mode 100644 (file)
index 0000000..d5075b7
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <crt_externs.h>
+
+int    opterr = 1,             /* if error message should be printed */
+       optind = 1,             /* index into parent argv vector */
+       optopt,                 /* character checked for validity */
+       optreset;               /* reset getopt */
+char   *optarg;                /* argument associated with option */
+
+#define        BADCH   (int)'?'
+#define        BADARG  (int)':'
+#define        EMSG    ""
+
+/*
+ * getopt --
+ *     Parse argc/argv argument vector.
+ */
+int
+getopt(nargc, nargv, ostr)
+       int nargc;
+       char * const *nargv;
+       const char *ostr;
+{
+       char *__progname = *(*_NSGetArgv());
+       static char *place = EMSG;              /* option letter processing */
+       char *oli;                              /* option letter list index */
+
+       if (optreset || !*place) {              /* update scanning pointer */
+               optreset = 0;
+               if (optind >= nargc || *(place = nargv[optind]) != '-') {
+                       place = EMSG;
+                       return (EOF);
+               }
+               if (place[1] && *++place == '-') {      /* found "--" */
+                       ++optind;
+                       place = EMSG;
+                       return (EOF);
+               }
+       }                                       /* option letter okay? */
+       if ((optopt = (int)*place++) == (int)':' ||
+           !(oli = strchr(ostr, optopt))) {
+               /*
+                * if the user didn't specify '-' as an option,
+                * assume it means EOF.
+                */
+               if (optopt == (int)'-')
+                       return (EOF);
+               if (!*place)
+                       ++optind;
+               if (opterr && *ostr != ':')
+                       (void)fprintf(stderr,
+                           "%s: illegal option -- %c\n", __progname, optopt);
+               return (BADCH);
+       }
+       if (*++oli != ':') {                    /* don't need argument */
+               optarg = NULL;
+               if (!*place)
+                       ++optind;
+       }
+       else {                                  /* need an argument */
+               if (*place)                     /* no white space */
+                       optarg = place;
+               else if (nargc <= ++optind) {   /* no arg */
+                       place = EMSG;
+                       if (*ostr == ':')
+                               return (BADARG);
+                       if (opterr)
+                               (void)fprintf(stderr,
+                                   "%s: option requires an argument -- %c\n",
+                                   __progname, optopt);
+                       return (BADCH);
+               }
+               else                            /* white space */
+                       optarg = nargv[optind];
+               place = EMSG;
+               ++optind;
+       }
+       return (optopt);                        /* dump back option letter */
+}
diff --git a/stdlib.subproj/getsubopt.c b/stdlib.subproj/getsubopt.c
new file mode 100644 (file)
index 0000000..d4d6813
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <unistd.h>
+#include <stdlib.h>
+
+/*
+ * The SVID interface to getsubopt provides no way of figuring out which
+ * part of the suboptions list wasn't matched.  This makes error messages
+ * tricky...  The extern variable suboptarg is a pointer to the token
+ * which didn't match.
+ */
+char *suboptarg;
+
+getsubopt(optionp, tokens, valuep)
+       register char **optionp, **valuep;
+       register char * const *tokens;
+{
+       register int cnt;
+       register char *p;
+
+       suboptarg = *valuep = NULL;
+
+       if (!optionp || !*optionp)
+               return(-1);
+
+       /* skip leading white-space, commas */
+       for (p = *optionp; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p);
+
+       if (!*p) {
+               *optionp = p;
+               return(-1);
+       }
+
+       /* save the start of the token, and skip the rest of the token. */
+       for (suboptarg = p;
+           *++p && *p != ',' && *p != '=' && *p != ' ' && *p != '\t';);
+
+       if (*p) {
+               /*
+                * If there's an equals sign, set the value pointer, and
+                * skip over the value part of the token.  Terminate the
+                * token.
+                */
+               if (*p == '=') {
+                       *p = '\0';
+                       for (*valuep = ++p;
+                           *p && *p != ',' && *p != ' ' && *p != '\t'; ++p);
+                       if (*p) 
+                               *p++ = '\0';
+               } else
+                       *p++ = '\0';
+               /* Skip any whitespace or commas after this token. */
+               for (; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p);
+       }
+
+       /* set optionp for next round. */
+       *optionp = p;
+
+       for (cnt = 0; *tokens; ++tokens, ++cnt)
+               if (!strcmp(suboptarg, *tokens))
+                       return(cnt);
+       return(-1);
+}
diff --git a/stdlib.subproj/heapsort.c b/stdlib.subproj/heapsort.c
new file mode 100644 (file)
index 0000000..0b8b1be
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ronnie Kon at Mindcraft Inc., Kevin Lew and Elmer Yglesias.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+/*
+ * Swap two areas of size number of bytes.  Although qsort(3) permits random
+ * blocks of memory to be sorted, sorting pointers is almost certainly the
+ * common case (and, were it not, could easily be made so).  Regardless, it
+ * isn't worth optimizing; the SWAP's get sped up by the cache, and pointer
+ * arithmetic gets lost in the time required for comparison function calls.
+ */
+#define        SWAP(a, b, count, size, tmp) { \
+       count = size; \
+       do { \
+               tmp = *a; \
+               *a++ = *b; \
+               *b++ = tmp; \
+       } while (--count); \
+}
+
+/* Copy one block of size size to another. */
+#define COPY(a, b, count, size, tmp1, tmp2) { \
+       count = size; \
+       tmp1 = a; \
+       tmp2 = b; \
+       do { \
+               *tmp1++ = *tmp2++; \
+       } while (--count); \
+}
+
+/*
+ * Build the list into a heap, where a heap is defined such that for
+ * the records K1 ... KN, Kj/2 >= Kj for 1 <= j/2 <= j <= N.
+ *
+ * There two cases.  If j == nmemb, select largest of Ki and Kj.  If
+ * j < nmemb, select largest of Ki, Kj and Kj+1.
+ */
+#define CREATE(initval, nmemb, par_i, child_i, par, child, size, count, tmp) { \
+       for (par_i = initval; (child_i = par_i * 2) <= nmemb; \
+           par_i = child_i) { \
+               child = base + child_i * size; \
+               if (child_i < nmemb && compar(child, child + size) < 0) { \
+                       child += size; \
+                       ++child_i; \
+               } \
+               par = base + par_i * size; \
+               if (compar(child, par) <= 0) \
+                       break; \
+               SWAP(par, child, count, size, tmp); \
+       } \
+}
+
+/*
+ * Select the top of the heap and 'heapify'.  Since by far the most expensive
+ * action is the call to the compar function, a considerable optimization
+ * in the average case can be achieved due to the fact that k, the displaced
+ * elememt, is ususally quite small, so it would be preferable to first
+ * heapify, always maintaining the invariant that the larger child is copied
+ * over its parent's record.
+ *
+ * Then, starting from the *bottom* of the heap, finding k's correct place,
+ * again maintianing the invariant.  As a result of the invariant no element
+ * is 'lost' when k is assigned its correct place in the heap.
+ *
+ * The time savings from this optimization are on the order of 15-20% for the
+ * average case. See Knuth, Vol. 3, page 158, problem 18.
+ *
+ * XXX Don't break the #define SELECT line, below.  Reiser cpp gets upset.
+ */
+#define SELECT(par_i, child_i, nmemb, par, child, size, k, count, tmp1, tmp2) { \
+       for (par_i = 1; (child_i = par_i * 2) <= nmemb; par_i = child_i) { \
+               child = base + child_i * size; \
+               if (child_i < nmemb && compar(child, child + size) < 0) { \
+                       child += size; \
+                       ++child_i; \
+               } \
+               par = base + par_i * size; \
+               COPY(par, child, count, size, tmp1, tmp2); \
+       } \
+       for (;;) { \
+               child_i = par_i; \
+               par_i = child_i / 2; \
+               child = base + child_i * size; \
+               par = base + par_i * size; \
+               if (child_i == 1 || compar(k, par) < 0) { \
+                       COPY(child, k, count, size, tmp1, tmp2); \
+                       break; \
+               } \
+               COPY(child, par, count, size, tmp1, tmp2); \
+       } \
+}
+
+/*
+ * Heapsort -- Knuth, Vol. 3, page 145.  Runs in O (N lg N), both average
+ * and worst.  While heapsort is faster than the worst case of quicksort,
+ * the BSD quicksort does median selection so that the chance of finding
+ * a data set that will trigger the worst case is nonexistent.  Heapsort's
+ * only advantage over quicksort is that it requires little additional memory.
+ */
+int
+heapsort(vbase, nmemb, size, compar)
+       void *vbase;
+       size_t nmemb, size;
+       int (*compar) __P((const void *, const void *));
+{
+       register int cnt, i, j, l;
+       register char tmp, *tmp1, *tmp2;
+       char *base, *k, *p, *t;
+
+       if (nmemb <= 1)
+               return (0);
+
+       if (!size) {
+               errno = EINVAL;
+               return (-1);
+       }
+
+       if ((k = malloc(size)) == NULL)
+               return (-1);
+
+       /*
+        * Items are numbered from 1 to nmemb, so offset from size bytes
+        * below the starting address.
+        */
+       base = (char *)vbase - size;
+
+       for (l = nmemb / 2 + 1; --l;)
+               CREATE(l, nmemb, i, j, t, p, size, cnt, tmp);
+
+       /*
+        * For each element of the heap, save the largest element into its
+        * final slot, save the displaced element (k), then recreate the
+        * heap.
+        */
+       while (nmemb > 1) {
+               COPY(k, base + nmemb * size, cnt, size, tmp1, tmp2);
+               COPY(base + nmemb * size, base + size, cnt, size, tmp1, tmp2);
+               --nmemb;
+               SELECT(i, j, nmemb, t, p, size, k, cnt, tmp1, tmp2);
+       }
+       free(k);
+       return (0);
+}
diff --git a/stdlib.subproj/labs.c b/stdlib.subproj/labs.c
new file mode 100644 (file)
index 0000000..5267e5d
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)labs.c     8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdlib.h>
+
+long
+labs(j)
+       long j;
+{
+       return(j < 0 ? -j : j);
+}
diff --git a/stdlib.subproj/ldiv.c b/stdlib.subproj/ldiv.c
new file mode 100644 (file)
index 0000000..83f63e4
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>            /* ldiv_t */
+
+ldiv_t
+ldiv(num, denom)
+       long num, denom;
+{
+       ldiv_t r;
+
+       /* see div.c for comments */
+
+       r.quot = num / denom;
+       r.rem = num % denom;
+       if (num >= 0 && r.rem < 0) {
+               r.quot++;
+               r.rem -= denom;
+       }
+       return (r);
+}
diff --git a/stdlib.subproj/merge.c b/stdlib.subproj/merge.c
new file mode 100644 (file)
index 0000000..c71e767
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Peter McIlroy.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Hybrid exponential search/linear search merge sort with hybrid
+ * natural/pairwise first pass.  Requires about .3% more comparisons
+ * for random data than LSMS with pairwise first pass alone.
+ * It works for objects as small as two bytes.
+ */
+
+#define NATURAL
+#define THRESHOLD 16   /* Best choice for natural merge cut-off. */
+
+/* #define NATURAL to get hybrid natural merge.
+ * (The default is pairwise merging.)
+ */
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+static void setup __P((u_char *, u_char *, size_t, size_t, int (*)()));
+static void insertionsort __P((u_char *, size_t, size_t, int (*)()));
+
+#define ISIZE sizeof(int)
+#define PSIZE sizeof(u_char *)
+#define ICOPY_LIST(src, dst, last)                             \
+       do                                                      \
+       *(int*)dst = *(int*)src, src += ISIZE, dst += ISIZE;    \
+       while(src < last)
+#define ICOPY_ELT(src, dst, i)                                 \
+       do                                                      \
+       *(int*) dst = *(int*) src, src += ISIZE, dst += ISIZE;  \
+       while (i -= ISIZE)
+
+#define CCOPY_LIST(src, dst, last)             \
+       do                                      \
+               *dst++ = *src++;                \
+       while (src < last)
+#define CCOPY_ELT(src, dst, i)                 \
+       do                                      \
+               *dst++ = *src++;                \
+       while (i -= 1)
+               
+/*
+ * Find the next possible pointer head.  (Trickery for forcing an array
+ * to do double duty as a linked list when objects do not align with word
+ * boundaries.
+ */
+/* Assumption: PSIZE is a power of 2. */
+#define EVAL(p) (u_char **)                                            \
+       ((u_char *)0 +                                                  \
+           (((u_char *)p + PSIZE - 1 - (u_char *) 0) & ~(PSIZE - 1)))
+
+/*
+ * Arguments are as for qsort.
+ */
+int
+mergesort(base, nmemb, size, cmp)
+       void *base;
+       size_t nmemb;
+       register size_t size;
+       int (*cmp) __P((const void *, const void *));
+{
+       register int i, sense;
+       int big, iflag;
+       register u_char *f1, *f2, *t, *b, *tp2, *q, *l1, *l2;
+       u_char *list2, *list1, *p2, *p, *last, **p1;
+
+       if (size < PSIZE / 2) {         /* Pointers must fit into 2 * size. */
+               errno = EINVAL;
+               return (-1);
+       }
+
+       /*
+        * XXX
+        * Stupid subtraction for the Cray.
+        */
+       iflag = 0;
+       if (!(size % ISIZE) && !(((char *)base - (char *)0) % ISIZE))
+               iflag = 1;
+
+       if ((list2 = malloc(nmemb * size + PSIZE)) == NULL)
+               return (-1);
+
+       list1 = base;
+       setup(list1, list2, nmemb, size, cmp);
+       last = list2 + nmemb * size;
+       i = big = 0;
+       while (*EVAL(list2) != last) {
+           l2 = list1;
+           p1 = EVAL(list1);
+           for (tp2 = p2 = list2; p2 != last; p1 = EVAL(l2)) {
+               p2 = *EVAL(p2);
+               f1 = l2;
+               f2 = l1 = list1 + (p2 - list2);
+               if (p2 != last)
+                       p2 = *EVAL(p2);
+               l2 = list1 + (p2 - list2);
+               while (f1 < l1 && f2 < l2) {
+                       if ((*cmp)(f1, f2) <= 0) {
+                               q = f2;
+                               b = f1, t = l1;
+                               sense = -1;
+                       } else {
+                               q = f1;
+                               b = f2, t = l2;
+                               sense = 0;
+                       }
+                       if (!big) {     /* here i = 0 */
+LINEAR:                                while ((b += size) < t && cmp(q, b) >sense)
+                                       if (++i == 6) {
+                                               big = 1;
+                                               goto EXPONENTIAL;
+                                       }
+                       } else {
+EXPONENTIAL:                   for (i = size; ; i <<= 1)
+                                       if ((p = (b + i)) >= t) {
+                                               if ((p = t - size) > b &&
+                                                   (*cmp)(q, p) <= sense)
+                                                       t = p;
+                                               else
+                                                       b = p;
+                                               break;
+                                       } else if ((*cmp)(q, p) <= sense) {
+                                               t = p;
+                                               if (i == size)
+                                                       big = 0; 
+                                               goto FASTCASE;
+                                       } else
+                                               b = p;
+SLOWCASE:                      while (t > b+size) {
+                                       i = (((t - b) / size) >> 1) * size;
+                                       if ((*cmp)(q, p = b + i) <= sense)
+                                               t = p;
+                                       else
+                                               b = p;
+                               }
+                               goto COPY;
+FASTCASE:                      while (i > size)
+                                       if ((*cmp)(q,
+                                               p = b + (i >>= 1)) <= sense)
+                                               t = p;
+                                       else
+                                               b = p;
+COPY:                          b = t;
+                       }
+                       i = size;
+                       if (q == f1) {
+                               if (iflag) {
+                                       ICOPY_LIST(f2, tp2, b);
+                                       ICOPY_ELT(f1, tp2, i);
+                               } else {
+                                       CCOPY_LIST(f2, tp2, b);
+                                       CCOPY_ELT(f1, tp2, i);
+                               }
+                       } else {
+                               if (iflag) {
+                                       ICOPY_LIST(f1, tp2, b);
+                                       ICOPY_ELT(f2, tp2, i);
+                               } else {
+                                       CCOPY_LIST(f1, tp2, b);
+                                       CCOPY_ELT(f2, tp2, i);
+                               }
+                       }
+               }
+               if (f2 < l2) {
+                       if (iflag)
+                               ICOPY_LIST(f2, tp2, l2);
+                       else
+                               CCOPY_LIST(f2, tp2, l2);
+               } else if (f1 < l1) {
+                       if (iflag)
+                               ICOPY_LIST(f1, tp2, l1);
+                       else
+                               CCOPY_LIST(f1, tp2, l1);
+               }
+               *p1 = l2;
+           }
+           tp2 = list1;        /* swap list1, list2 */
+           list1 = list2;
+           list2 = tp2;
+           last = list2 + nmemb*size;
+       }
+       if (base == list2) {
+               memmove(list2, list1, nmemb*size);
+               list2 = list1;
+       }
+       free(list2);
+       return (0);
+}
+
+#define        swap(a, b) {                                    \
+               s = b;                                  \
+               i = size;                               \
+               do {                                    \
+                       tmp = *a; *a++ = *s; *s++ = tmp; \
+               } while (--i);                          \
+               a -= size;                              \
+       }
+#define reverse(bot, top) {                            \
+       s = top;                                        \
+       do {                                            \
+               i = size;                               \
+               do {                                    \
+                       tmp = *bot; *bot++ = *s; *s++ = tmp; \
+               } while (--i);                          \
+               s -= size2;                             \
+       } while(bot < s);                               \
+}
+
+/*
+ * Optional hybrid natural/pairwise first pass.  Eats up list1 in runs of
+ * increasing order, list2 in a corresponding linked list.  Checks for runs
+ * when THRESHOLD/2 pairs compare with same sense.  (Only used when NATURAL
+ * is defined.  Otherwise simple pairwise merging is used.)
+ */
+void
+setup(list1, list2, n, size, cmp)
+       size_t n, size;
+       int (*cmp) __P((const void *, const void *));
+       u_char *list1, *list2;
+{
+       int i, length, size2, tmp, sense;
+       u_char *f1, *f2, *s, *l2, *last, *p2;
+
+       size2 = size*2;
+       if (n <= 5) {
+               insertionsort(list1, n, size, cmp);
+               *EVAL(list2) = (u_char*) list2 + n*size;
+               return;
+       }
+       /*
+        * Avoid running pointers out of bounds; limit n to evens
+        * for simplicity.
+        */
+       i = 4 + (n & 1);
+       insertionsort(list1 + (n - i) * size, i, size, cmp);
+       last = list1 + size * (n - i);
+       *EVAL(list2 + (last - list1)) = list2 + n * size;
+
+#ifdef NATURAL
+       p2 = list2;
+       f1 = list1;
+       sense = (cmp(f1, f1 + size) > 0);
+       for (; f1 < last; sense = !sense) {
+               length = 2;
+                                       /* Find pairs with same sense. */
+               for (f2 = f1 + size2; f2 < last; f2 += size2) {
+                       if ((cmp(f2, f2+ size) > 0) != sense)
+                               break;
+                       length += 2;
+               }
+               if (length < THRESHOLD) {               /* Pairwise merge */
+                       do {
+                               p2 = *EVAL(p2) = f1 + size2 - list1 + list2;
+                               if (sense > 0)
+                                       swap (f1, f1 + size);
+                       } while ((f1 += size2) < f2);
+               } else {                                /* Natural merge */
+                       l2 = f2;
+                       for (f2 = f1 + size2; f2 < l2; f2 += size2) {
+                               if ((cmp(f2-size, f2) > 0) != sense) {
+                                       p2 = *EVAL(p2) = f2 - list1 + list2;
+                                       if (sense > 0)
+                                               reverse(f1, f2-size);
+                                       f1 = f2;
+                               }
+                       }
+                       if (sense > 0)
+                               reverse (f1, f2-size);
+                       f1 = f2;
+                       if (f2 < last || cmp(f2 - size, f2) > 0)
+                               p2 = *EVAL(p2) = f2 - list1 + list2;
+                       else
+                               p2 = *EVAL(p2) = list2 + n*size;
+               }
+       }
+#else          /* pairwise merge only. */
+       for (f1 = list1, p2 = list2; f1 < last; f1 += size2) {
+               p2 = *EVAL(p2) = p2 + size2;
+               if (cmp (f1, f1 + size) > 0)
+                       swap(f1, f1 + size);
+       }
+#endif /* NATURAL */
+}
+
+/*
+ * This is to avoid out-of-bounds addresses in sorting the
+ * last 4 elements.
+ */
+static void
+insertionsort(a, n, size, cmp)
+       u_char *a;
+       size_t n, size;
+       int (*cmp) __P((const void *, const void *));
+{
+       u_char *ai, *s, *t, *u, tmp;
+       int i;
+
+       for (ai = a+size; --n >= 1; ai += size)
+               for (t = ai; t > a; t -= size) {
+                       u = t - size;
+                       if (cmp(u, t) <= 0)
+                               break;
+                       swap(u, t);
+               }
+}
diff --git a/stdlib.subproj/putenv.c b/stdlib.subproj/putenv.c
new file mode 100644 (file)
index 0000000..2fbe267
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdlib.h>
+#include <string.h>
+
+int
+putenv(str)
+       const char *str;
+{
+       char *p, *equal;
+       int rval;
+
+       if ((p = strdup(str)) == NULL)
+               return (-1);
+       if ((equal = index(p, '=')) == NULL) {
+               (void)free(p);
+               return (-1);
+       }
+       *equal = '\0';
+       rval = setenv(p, equal + 1, 1);
+       (void)free(p);
+       return (rval);
+}
diff --git a/stdlib.subproj/qsort.c b/stdlib.subproj/qsort.c
new file mode 100644 (file)
index 0000000..d0d2fc6
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+static inline char     *med3 __P((char *, char *, char *, int (*)()));
+static inline void      swapfunc __P((char *, char *, int, int));
+
+#define min(a, b)      (a) < (b) ? a : b
+
+/*
+ * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
+ */
+#define swapcode(TYPE, parmi, parmj, n) {              \
+       long i = (n) / sizeof (TYPE);                   \
+       register TYPE *pi = (TYPE *) (parmi);           \
+       register TYPE *pj = (TYPE *) (parmj);           \
+       do {                                            \
+               register TYPE   t = *pi;                \
+               *pi++ = *pj;                            \
+               *pj++ = t;                              \
+        } while (--i > 0);                             \
+}
+
+#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
+       es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
+
+static inline void
+swapfunc(a, b, n, swaptype)
+       char *a, *b;
+       int n, swaptype;
+{
+       if(swaptype <= 1) 
+               swapcode(long, a, b, n)
+       else
+               swapcode(char, a, b, n)
+}
+
+#define swap(a, b)                                     \
+       if (swaptype == 0) {                            \
+               long t = *(long *)(a);                  \
+               *(long *)(a) = *(long *)(b);            \
+               *(long *)(b) = t;                       \
+       } else                                          \
+               swapfunc(a, b, es, swaptype)
+
+#define vecswap(a, b, n)       if ((n) > 0) swapfunc(a, b, n, swaptype)
+
+static inline char *
+med3(a, b, c, cmp)
+       char *a, *b, *c;
+       int (*cmp)();
+{
+       return cmp(a, b) < 0 ?
+              (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
+              :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
+}
+
+void
+qsort(a, n, es, cmp)
+       void *a;
+       size_t n, es;
+       int (*cmp)();
+{
+       char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+       int d, r, swaptype, swap_cnt;
+
+loop:  SWAPINIT(a, es);
+       swap_cnt = 0;
+       if (n < 7) {
+               for (pm = a + es; pm < (char *) a + n * es; pm += es)
+                       for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
+                            pl -= es)
+                               swap(pl, pl - es);
+               return;
+       }
+       pm = a + (n / 2) * es;
+       if (n > 7) {
+               pl = a;
+               pn = a + (n - 1) * es;
+               if (n > 40) {
+                       d = (n / 8) * es;
+                       pl = med3(pl, pl + d, pl + 2 * d, cmp);
+                       pm = med3(pm - d, pm, pm + d, cmp);
+                       pn = med3(pn - 2 * d, pn - d, pn, cmp);
+               }
+               pm = med3(pl, pm, pn, cmp);
+       }
+       swap(a, pm);
+       pa = pb = a + es;
+
+       pc = pd = a + (n - 1) * es;
+       for (;;) {
+               while (pb <= pc && (r = cmp(pb, a)) <= 0) {
+                       if (r == 0) {
+                               swap_cnt = 1;
+                               swap(pa, pb);
+                               pa += es;
+                       }
+                       pb += es;
+               }
+               while (pb <= pc && (r = cmp(pc, a)) >= 0) {
+                       if (r == 0) {
+                               swap_cnt = 1;
+                               swap(pc, pd);
+                               pd -= es;
+                       }
+                       pc -= es;
+               }
+               if (pb > pc)
+                       break;
+               swap(pb, pc);
+               swap_cnt = 1;
+               pb += es;
+               pc -= es;
+       }
+       if (swap_cnt == 0) {  /* Switch to insertion sort */
+               for (pm = a + es; pm < (char *) a + n * es; pm += es)
+                       for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; 
+                            pl -= es)
+                               swap(pl, pl - es);
+               return;
+       }
+
+       pn = a + n * es;
+       r = min(pa - (char *)a, pb - pa);
+       vecswap(a, pb - r, r);
+       r = min(pd - pc, pn - pd - es);
+       vecswap(pb, pn - r, r);
+       if ((r = pb - pa) > es)
+               qsort(a, r / es, es, cmp);
+       if ((r = pd - pc) > es) { 
+               /* Iterate rather than recurse to save stack space */
+               a = pn - r;
+               n = r / es;
+               goto loop;
+       }
+/*             qsort(pn - r, r / es, es, cmp);*/
+}
diff --git a/stdlib.subproj/radixsort.c b/stdlib.subproj/radixsort.c
new file mode 100644 (file)
index 0000000..53a02b5
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Peter McIlroy and by Dan Bernstein at New York University, 
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+/*
+ * Radixsort routines.
+ * 
+ * Program r_sort_a() is unstable but uses O(logN) extra memory for a stack.
+ * Use radixsort(a, n, trace, endchar) for this case.
+ * 
+ * For stable sorting (using N extra pointers) use sradixsort(), which calls
+ * r_sort_b().
+ * 
+ * For a description of this code, see D. McIlroy, P. McIlroy, K. Bostic,
+ * "Engineering Radix Sort".
+ */
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <errno.h>
+
+typedef struct {
+       const u_char **sa;
+       int sn, si;
+} stack;
+
+static inline void simplesort
+           __P((const u_char **, int, int, const u_char *, u_int));
+static void r_sort_a __P((const u_char **, int, int, const u_char *, u_int));
+static void r_sort_b __P((const u_char **,
+           const u_char **, int, int, const u_char *, u_int));
+
+#define        THRESHOLD       20              /* Divert to simplesort(). */
+#define        SIZE            512             /* Default stack size. */
+
+#define SETUP {                                                                \
+       if (tab == NULL) {                                              \
+               tr = tr0;                                               \
+               for (c = 0; c < endch; c++)                             \
+                       tr0[c] = c + 1;                                 \
+               tr0[c] = 0;                                             \
+               for (c++; c < 256; c++)                                 \
+                       tr0[c] = c;                                     \
+               endch = 0;                                              \
+       } else {                                                        \
+               endch = tab[endch];                                     \
+               tr = tab;                                               \
+               if (endch != 0 && endch != 255) {                       \
+                       errno = EINVAL;                                 \
+                       return (-1);                                    \
+               }                                                       \
+       }                                                               \
+}
+
+int
+radixsort(a, n, tab, endch)
+       const u_char **a, *tab;
+       int n;
+       u_int endch;
+{
+       const u_char *tr;
+       int c;
+       u_char tr0[256];
+
+       SETUP;
+       r_sort_a(a, n, 0, tr, endch);
+       return (0);
+}
+
+int
+sradixsort(a, n, tab, endch)
+       const u_char **a, *tab;
+       int n;
+       u_int endch;
+{
+       const u_char *tr, **ta;
+       int c;
+       u_char tr0[256];
+
+       SETUP;
+       if (n < THRESHOLD)
+               simplesort(a, n, 0, tr, endch);
+       else {
+               if ((ta = malloc(n * sizeof(a))) == NULL)
+                       return (-1);
+               r_sort_b(a, ta, n, 0, tr, endch);
+               free(ta);
+       }
+       return (0);
+}
+
+#define empty(s)       (s >= sp)
+#define pop(a, n, i)   a = (--sp)->sa, n = sp->sn, i = sp->si
+#define push(a, n, i)  sp->sa = a, sp->sn = n, (sp++)->si = i
+#define swap(a, b, t)  t = a, a = b, b = t
+
+/* Unstable, in-place sort. */
+static void
+r_sort_a(a, n, i, tr, endch)
+       const u_char **a;
+       int n, i;
+       const u_char *tr;
+       u_int endch;
+{
+       static int count[256], nc, bmin;
+       register int c;
+       register const u_char **ak, *r;
+       stack s[SIZE], *sp, *sp0, *sp1, temp;
+       int *cp, bigc;
+       const u_char **an, *t, **aj, **top[256];
+
+       /* Set up stack. */
+       sp = s;
+       push(a, n, i);
+       while (!empty(s)) {
+               pop(a, n, i);
+               if (n < THRESHOLD) {
+                       simplesort(a, n, i, tr, endch);
+                       continue;
+               }
+               an = a + n;
+
+               /* Make character histogram. */
+               if (nc == 0) {
+                       bmin = 255;     /* First occupied bin, excluding eos. */
+                       for (ak = a; ak < an;) {
+                               c = tr[(*ak++)[i]];
+                               if (++count[c] == 1 && c != endch) {
+                                       if (c < bmin)
+                                               bmin = c;
+                                       nc++;
+                               }
+                       }
+                       if (sp + nc > s + SIZE) {       /* Get more stack. */
+                               r_sort_a(a, n, i, tr, endch);
+                               continue;
+                       }
+               }
+
+               /*
+                * Set top[]; push incompletely sorted bins onto stack.
+                * top[] = pointers to last out-of-place element in bins.
+                * count[] = counts of elements in bins.
+                * Before permuting: top[c-1] + count[c] = top[c];
+                * during deal: top[c] counts down to top[c-1].
+                */
+               sp0 = sp1 = sp;         /* Stack position of biggest bin. */
+               bigc = 2;               /* Size of biggest bin. */
+               if (endch == 0)         /* Special case: set top[eos]. */
+                       top[0] = ak = a + count[0];
+               else {
+                       ak = a;
+                       top[255] = an;
+               }
+               for (cp = count + bmin; nc > 0; cp++) {
+                       while (*cp == 0)        /* Find next non-empty pile. */
+                               cp++;
+                       if (*cp > 1) {
+                               if (*cp > bigc) {
+                                       bigc = *cp;
+                                       sp1 = sp;
+                               }
+                               push(ak, *cp, i+1);
+                       }
+                       top[cp-count] = ak += *cp;
+                       nc--;
+               }
+               swap(*sp0, *sp1, temp); /* Play it safe -- biggest bin last. */
+
+               /*
+                * Permute misplacements home.  Already home: everything
+                * before aj, and in bin[c], items from top[c] on.
+                * Inner loop:
+                *      r = next element to put in place;
+                *      ak = top[r[i]] = location to put the next element.
+                *      aj = bottom of 1st disordered bin.
+                * Outer loop:
+                *      Once the 1st disordered bin is done, ie. aj >= ak,
+                *      aj<-aj + count[c] connects the bins in a linked list;
+                *      reset count[c].
+                */
+               for (aj = a; aj < an;  *aj = r, aj += count[c], count[c] = 0)
+                       for (r = *aj;  aj < (ak = --top[c = tr[r[i]]]);)
+                               swap(*ak, r, t);
+       }
+}
+
+/* Stable sort, requiring additional memory. */
+static void
+r_sort_b(a, ta, n, i, tr, endch)
+       const u_char **a, **ta;
+       int n, i;
+       const u_char *tr;
+       u_int endch;
+{
+       static int count[256], nc, bmin;
+       register int c;
+       register const u_char **ak, **ai;
+       stack s[512], *sp, *sp0, *sp1, temp;
+       const u_char **top[256];
+       int *cp, bigc;
+
+       sp = s;
+       push(a, n, i);
+       while (!empty(s)) {
+               pop(a, n, i);
+               if (n < THRESHOLD) {
+                       simplesort(a, n, i, tr, endch);
+                       continue;
+               }
+
+               if (nc == 0) {
+                       bmin = 255;
+                       for (ak = a + n; --ak >= a;) {
+                               c = tr[(*ak)[i]];
+                               if (++count[c] == 1 && c != endch) {
+                                       if (c < bmin)
+                                               bmin = c;
+                                       nc++;
+                               }
+                       }
+                       if (sp + nc > s + SIZE) {
+                               r_sort_b(a, ta, n, i, tr, endch);
+                               continue;
+                       }
+               }
+
+               sp0 = sp1 = sp;
+               bigc = 2;
+               if (endch == 0) {
+                       top[0] = ak = a + count[0];
+                       count[0] = 0;
+               } else {
+                       ak = a;
+                       top[255] = a + n;
+                       count[255] = 0;
+               }
+               for (cp = count + bmin; nc > 0; cp++) {
+                       while (*cp == 0)
+                               cp++;
+                       if ((c = *cp) > 1) {
+                               if (c > bigc) {
+                                       bigc = c;
+                                       sp1 = sp;
+                               }
+                               push(ak, c, i+1);
+                       }
+                       top[cp-count] = ak += c;
+                       *cp = 0;                        /* Reset count[]. */
+                       nc--;
+               }
+               swap(*sp0, *sp1, temp);
+
+               for (ak = ta + n, ai = a+n; ak > ta;)   /* Copy to temp. */
+                       *--ak = *--ai;
+               for (ak = ta+n; --ak >= ta;)            /* Deal to piles. */
+                       *--top[tr[(*ak)[i]]] = *ak;
+       }
+}
+               
+static inline void
+simplesort(a, n, b, tr, endch) /* insertion sort */
+       register const u_char **a;
+       int n, b;
+       register const u_char *tr;
+       u_int endch;
+{
+       register u_char ch;
+       const u_char  **ak, **ai, *s, *t;
+
+       for (ak = a+1; --n >= 1; ak++)
+               for (ai = ak; ai > a; ai--) {
+                       for (s = ai[0] + b, t = ai[-1] + b;
+                           (ch = tr[*s]) != endch; s++, t++)
+                               if (ch != tr[*t])
+                                       break;
+                       if (ch >= tr[*t])
+                               break;
+                       swap(ai[0], ai[-1], s);
+               }
+}
diff --git a/stdlib.subproj/rand.c b/stdlib.subproj/rand.c
new file mode 100644 (file)
index 0000000..0379c8f
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+static u_long next = 1;
+
+int
+rand()
+{
+       return ((next = next * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
+}
+
+void
+srand(seed)
+u_int seed;
+{
+       next = seed;
+}
diff --git a/stdlib.subproj/random.c b/stdlib.subproj/random.c
new file mode 100644 (file)
index 0000000..722e805
--- /dev/null
@@ -0,0 +1,399 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+ * random.c:
+ *
+ * An improved random number generation package.  In addition to the standard
+ * rand()/srand() like interface, this package also has a special state info
+ * interface.  The initstate() routine is called with a seed, an array of
+ * bytes, and a count of how many bytes are being passed in; this array is
+ * then initialized to contain information for random number generation with
+ * that much state information.  Good sizes for the amount of state
+ * information are 32, 64, 128, and 256 bytes.  The state can be switched by
+ * calling the setstate() routine with the same array as was initiallized
+ * with initstate().  By default, the package runs with 128 bytes of state
+ * information and generates far better random numbers than a linear
+ * congruential generator.  If the amount of state information is less than
+ * 32 bytes, a simple linear congruential R.N.G. is used.
+ *
+ * Internally, the state information is treated as an array of longs; the
+ * zeroeth element of the array is the type of R.N.G. being used (small
+ * integer); the remainder of the array is the state information for the
+ * R.N.G.  Thus, 32 bytes of state information will give 7 longs worth of
+ * state information, which will allow a degree seven polynomial.  (Note:
+ * the zeroeth word of state information also has some other information
+ * stored in it -- see setstate() for details).
+ * 
+ * The random number generation technique is a linear feedback shift register
+ * approach, employing trinomials (since there are fewer terms to sum up that
+ * way).  In this approach, the least significant bit of all the numbers in
+ * the state table will act as a linear feedback shift register, and will
+ * have period 2^deg - 1 (where deg is the degree of the polynomial being
+ * used, assuming that the polynomial is irreducible and primitive).  The
+ * higher order bits will have longer periods, since their values are also
+ * influenced by pseudo-random carries out of the lower bits.  The total
+ * period of the generator is approximately deg*(2**deg - 1); thus doubling
+ * the amount of state information has a vast influence on the period of the
+ * generator.  Note: the deg*(2**deg - 1) is an approximation only good for
+ * large deg, when the period of the shift register is the dominant factor.
+ * With deg equal to seven, the period is actually much longer than the
+ * 7*(2**7 - 1) predicted by this formula.
+ */
+
+/*
+ * For each of the currently supported random number generators, we have a
+ * break value on the amount of state information (you need at least this
+ * many bytes of state info to support this random number generator), a degree
+ * for the polynomial (actually a trinomial) that the R.N.G. is based on, and
+ * the separation between the two lower order coefficients of the trinomial.
+ */
+#define        TYPE_0          0               /* linear congruential */
+#define        BREAK_0         8
+#define        DEG_0           0
+#define        SEP_0           0
+
+#define        TYPE_1          1               /* x**7 + x**3 + 1 */
+#define        BREAK_1         32
+#define        DEG_1           7
+#define        SEP_1           3
+
+#define        TYPE_2          2               /* x**15 + x + 1 */
+#define        BREAK_2         64
+#define        DEG_2           15
+#define        SEP_2           1
+
+#define        TYPE_3          3               /* x**31 + x**3 + 1 */
+#define        BREAK_3         128
+#define        DEG_3           31
+#define        SEP_3           3
+
+#define        TYPE_4          4               /* x**63 + x + 1 */
+#define        BREAK_4         256
+#define        DEG_4           63
+#define        SEP_4           1
+
+/*
+ * Array versions of the above information to make code run faster --
+ * relies on fact that TYPE_i == i.
+ */
+#define        MAX_TYPES       5               /* max number of types above */
+
+static long degrees[MAX_TYPES] =       { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 };
+static long seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 };
+
+/*
+ * Initially, everything is set up as if from:
+ *
+ *     initstate(1, &randtbl, 128);
+ *
+ * Note that this initialization takes advantage of the fact that srandom()
+ * advances the front and rear pointers 10*rand_deg times, and hence the
+ * rear pointer which starts at 0 will also end up at zero; thus the zeroeth
+ * element of the state information, which contains info about the current
+ * position of the rear pointer is just
+ *
+ *     MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3.
+ */
+
+static long randtbl[DEG_3 + 1] = {
+       TYPE_3,
+       0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5,
+       0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd,
+       0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88,
+       0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
+       0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b,
+       0x27fb47b9,
+};
+
+/*
+ * fptr and rptr are two pointers into the state info, a front and a rear
+ * pointer.  These two pointers are always rand_sep places aparts, as they
+ * cycle cyclically through the state information.  (Yes, this does mean we
+ * could get away with just one pointer, but the code for random() is more
+ * efficient this way).  The pointers are left positioned as they would be
+ * from the call
+ *
+ *     initstate(1, randtbl, 128);
+ *
+ * (The position of the rear pointer, rptr, is really 0 (as explained above
+ * in the initialization of randtbl) because the state table pointer is set
+ * to point to randtbl[1] (as explained below).
+ */
+static long *fptr = &randtbl[SEP_3 + 1];
+static long *rptr = &randtbl[1];
+
+/*
+ * The following things are the pointer to the state information table, the
+ * type of the current generator, the degree of the current polynomial being
+ * used, and the separation between the two pointers.  Note that for efficiency
+ * of random(), we remember the first location of the state information, not
+ * the zeroeth.  Hence it is valid to access state[-1], which is used to
+ * store the type of the R.N.G.  Also, we remember the last location, since
+ * this is more efficient than indexing every time to find the address of
+ * the last element to see if the front and rear pointers have wrapped.
+ */
+static long *state = &randtbl[1];
+static long rand_type = TYPE_3;
+static long rand_deg = DEG_3;
+static long rand_sep = SEP_3;
+static long *end_ptr = &randtbl[DEG_3 + 1];
+
+/*
+ * srandom:
+ *
+ * Initialize the random number generator based on the given seed.  If the
+ * type is the trivial no-state-information type, just remember the seed.
+ * Otherwise, initializes state[] based on the given "seed" via a linear
+ * congruential generator.  Then, the pointers are set to known locations
+ * that are exactly rand_sep places apart.  Lastly, it cycles the state
+ * information a given number of times to get rid of any initial dependencies
+ * introduced by the L.C.R.N.G.  Note that the initialization of randtbl[]
+ * for default usage relies on values produced by this routine.
+ */
+void
+srandom(x)
+       unsigned long x;
+{
+       register long i;
+
+       if (rand_type == TYPE_0)
+               state[0] = x;
+       else {
+               state[0] = x;
+               for (i = 1; i < rand_deg; i++)
+                       state[i] = 1103515245 * state[i - 1] + 12345;
+               fptr = &state[rand_sep];
+               rptr = &state[0];
+               for (i = 0; i < 10 * rand_deg; i++)
+                       (void)random();
+       }
+}
+
+/*
+ * initstate:
+ *
+ * Initialize the state information in the given array of n bytes for future
+ * random number generation.  Based on the number of bytes we are given, and
+ * the break values for the different R.N.G.'s, we choose the best (largest)
+ * one we can and set things up for it.  srandom() is then called to
+ * initialize the state information.
+ * 
+ * Note that on return from srandom(), we set state[-1] to be the type
+ * multiplexed with the current value of the rear pointer; this is so
+ * successive calls to initstate() won't lose this information and will be
+ * able to restart with setstate().
+ * 
+ * Note: the first thing we do is save the current state, if any, just like
+ * setstate() so that it doesn't matter when initstate is called.
+ *
+ * Returns a pointer to the old state.
+ *
+ * Note: The Sparc platform requires that arg_state begin on a long
+ * word boundary; otherwise a bus error will occur. Even so, lint will
+ * complain about mis-alignment, but you should disregard these messages.
+ */
+char *
+initstate(seed, arg_state, n)
+       unsigned long seed;             /* seed for R.N.G. */
+       char *arg_state;                /* pointer to state array */
+       long n;                         /* # bytes of state info */
+{
+       register char *ostate = (char *)(&state[-1]);
+       register long *long_arg_state = (long *) arg_state;
+
+       if (rand_type == TYPE_0)
+               state[-1] = rand_type;
+       else
+               state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+       if (n < BREAK_0) {
+               (void)fprintf(stderr,
+                   "random: not enough state (%ld bytes); ignored.\n", n);
+               return(0);
+       }
+       if (n < BREAK_1) {
+               rand_type = TYPE_0;
+               rand_deg = DEG_0;
+               rand_sep = SEP_0;
+       } else if (n < BREAK_2) {
+               rand_type = TYPE_1;
+               rand_deg = DEG_1;
+               rand_sep = SEP_1;
+       } else if (n < BREAK_3) {
+               rand_type = TYPE_2;
+               rand_deg = DEG_2;
+               rand_sep = SEP_2;
+       } else if (n < BREAK_4) {
+               rand_type = TYPE_3;
+               rand_deg = DEG_3;
+               rand_sep = SEP_3;
+       } else {
+               rand_type = TYPE_4;
+               rand_deg = DEG_4;
+               rand_sep = SEP_4;
+       }
+       state = (long *) (long_arg_state + 1); /* first location */
+       end_ptr = &state[rand_deg];     /* must set end_ptr before srandom */
+       srandom(seed);
+       if (rand_type == TYPE_0)
+               long_arg_state[0] = rand_type;
+       else
+               long_arg_state[0] = MAX_TYPES * (rptr - state) + rand_type;
+       return(ostate);
+}
+
+/*
+ * setstate:
+ *
+ * Restore the state from the given state array.
+ *
+ * Note: it is important that we also remember the locations of the pointers
+ * in the current state information, and restore the locations of the pointers
+ * from the old state information.  This is done by multiplexing the pointer
+ * location into the zeroeth word of the state information.
+ *
+ * Note that due to the order in which things are done, it is OK to call
+ * setstate() with the same state as the current state.
+ *
+ * Returns a pointer to the old state information.
+ *
+ * Note: The Sparc platform requires that arg_state begin on a long
+ * word boundary; otherwise a bus error will occur. Even so, lint will
+ * complain about mis-alignment, but you should disregard these messages.
+ */
+char *
+setstate(arg_state)
+       char *arg_state;                /* pointer to state array */
+{
+       register long *new_state = (long *) arg_state;
+       register long type = new_state[0] % MAX_TYPES;
+       register long rear = new_state[0] / MAX_TYPES;
+       char *ostate = (char *)(&state[-1]);
+
+       if (rand_type == TYPE_0)
+               state[-1] = rand_type;
+       else
+               state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+       switch(type) {
+       case TYPE_0:
+       case TYPE_1:
+       case TYPE_2:
+       case TYPE_3:
+       case TYPE_4:
+               rand_type = type;
+               rand_deg = degrees[type];
+               rand_sep = seps[type];
+               break;
+       default:
+               (void)fprintf(stderr,
+                   "random: state info corrupted; not changed.\n");
+       }
+       state = (long *) (new_state + 1);
+       if (rand_type != TYPE_0) {
+               rptr = &state[rear];
+               fptr = &state[(rear + rand_sep) % rand_deg];
+       }
+       end_ptr = &state[rand_deg];             /* set end_ptr too */
+       return(ostate);
+}
+
+/*
+ * random:
+ *
+ * If we are using the trivial TYPE_0 R.N.G., just do the old linear
+ * congruential bit.  Otherwise, we do our fancy trinomial stuff, which is
+ * the same in all the other cases due to all the global variables that have
+ * been set up.  The basic operation is to add the number at the rear pointer
+ * into the one at the front pointer.  Then both pointers are advanced to
+ * the next location cyclically in the table.  The value returned is the sum
+ * generated, reduced to 31 bits by throwing away the "least random" low bit.
+ *
+ * Note: the code takes advantage of the fact that both the front and
+ * rear pointers can't wrap on the same call by not testing the rear
+ * pointer if the front one has wrapped.
+ *
+ * Returns a 31-bit random number.
+ */
+long
+random()
+{
+       register long i;
+       register long *f, *r;
+
+       if (rand_type == TYPE_0) {
+               i = state[0];
+               state[0] = i = (i * 1103515245 + 12345) & 0x7fffffff;
+       } else {
+               /*
+                * Use local variables rather than static variables for speed.
+                */
+               f = fptr; r = rptr;
+               *f += *r;
+               i = (*f >> 1) & 0x7fffffff;     /* chucking least random bit */
+               if (++f >= end_ptr) {
+                       f = state;
+                       ++r;
+               }
+               else if (++r >= end_ptr) {
+                       r = state;
+               }
+
+               fptr = f; rptr = r;
+       }
+       return(i);
+}
diff --git a/stdlib.subproj/setenv.c b/stdlib.subproj/setenv.c
new file mode 100644 (file)
index 0000000..e74a41f
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <crt_externs.h>
+
+char *__findenv __P((const char *, int *)); 
+
+/*
+ * setenv --
+ *     Set the value of the environmental variable "name" to be
+ *     "value".  If rewrite is set, replace any current value.
+ */
+int
+setenv(name, value, rewrite)
+       register const char *name;
+       register const char *value;
+       int rewrite;
+{
+       static int alloced;                     /* if allocated space before */
+       register char *c;
+       int l_value, offset;
+        char ***environp = _NSGetEnviron();
+
+       if (*value == '=')                      /* no `=' in value */
+               ++value;
+       l_value = strlen(value);
+       if ((c = __findenv(name, &offset))) {   /* find if already exists */
+               if (!rewrite)
+                       return (0);
+               if (strlen(c) >= l_value) {     /* old larger; copy over */
+                       while (*c++ = *value++);
+                       return (0);
+               }
+       } else {                                        /* create new slot */
+               register int cnt;
+               register char **p;
+
+               for (p = *environp, cnt = 0; *p; ++p, ++cnt);
+               if (alloced) {                  /* just increase size */
+                       *environp = (char **)realloc((char *)*environp,
+                           (size_t)(sizeof(char *) * (cnt + 2)));
+                       if (!*environp)
+                               return (-1);
+               }
+               else {                          /* get new space */
+                       alloced = 1;            /* copy old entries into it */
+                       p = malloc((size_t)(sizeof(char *) * (cnt + 2)));
+                       if (!p)
+                               return (-1);
+                       bcopy(*environp, p, cnt * sizeof(char *));
+                       *environp = p;
+               }
+               (*environp)[cnt + 1] = NULL;
+               offset = cnt;
+       }
+       for (c = (char *)name; *c && *c != '='; ++c);   /* no `=' in name */
+       if (!((*environp)[offset] =                     /* name + `=' + value */
+           malloc((size_t)((int)(c - name) + l_value + 2))))
+               return (-1);
+       for (c = (*environp)[offset]; (*c = *name++) && *c != '='; ++c);
+       for (*c++ = '='; *c++ = *value++;);
+       return (0);
+}
+
+/*
+ * unsetenv(name) --
+ *     Delete environmental variable "name".
+ */
+void
+unsetenv(name)
+       const char *name;
+{
+       char **environ = *_NSGetEnviron();
+       register char **p;
+       int offset;
+
+       while (__findenv(name, &offset))        /* if set multiple times */
+               for (p = &environ[offset];; ++p)
+                       if (!(*p = *(p + 1)))
+                               break;
+}
diff --git a/stdlib.subproj/strtod.c b/stdlib.subproj/strtod.c
new file mode 100644 (file)
index 0000000..0ed39d8
--- /dev/null
@@ -0,0 +1,2530 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/****************************************************************
+ *
+ * The author of this software is David M. Gay.
+ *
+ * Copyright (c) 1991 by AT&T.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ *
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ *
+ ***************************************************************/
+
+/* Please send bug reports to
+       David M. Gay
+       AT&T Bell Laboratories, Room 2C-463
+       600 Mountain Avenue
+       Murray Hill, NJ 07974-2070
+       U.S.A.
+       dmg@research.att.com or research!dmg
+ */
+
+/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
+ *
+ * This strtod returns a nearest machine number to the input decimal
+ * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
+ * broken by the IEEE round-even rule.  Otherwise ties are broken by
+ * biased rounding (add half and chop).
+ *
+ * Inspired loosely by William D. Clinger's paper "How to Read Floating
+ * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
+ *
+ * Modifications:
+ *
+ *     1. We only require IEEE, IBM, or VAX double-precision
+ *             arithmetic (not IEEE double-extended).
+ *     2. We get by with floating-point arithmetic in a case that
+ *             Clinger missed -- when we're computing d * 10^n
+ *             for a small integer d and the integer n is not too
+ *             much larger than 22 (the maximum integer k for which
+ *             we can represent 10^k exactly), we may be able to
+ *             compute (d*10^k) * 10^(e-k) with just one roundoff.
+ *     3. Rather than a bit-at-a-time adjustment of the binary
+ *             result in the hard case, we use floating-point
+ *             arithmetic to determine the adjustment to within
+ *             one bit; only in really hard cases do we need to
+ *             compute a second residual.
+ *     4. Because of 3., we don't need a large table of powers of 10
+ *             for ten-to-e (just some small tables, e.g. of 10^k
+ *             for 0 <= k <= 22).
+ */
+
+/*
+ * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least
+ *     significant byte has the lowest address.
+ * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most
+ *     significant byte has the lowest address.
+ * #define Long int on machines with 32-bit ints and 64-bit longs.
+ * #define Sudden_Underflow for IEEE-format machines without gradual
+ *     underflow (i.e., that flush to zero on underflow).
+ * #define IBM for IBM mainframe-style floating-point arithmetic.
+ * #define VAX for VAX-style floating-point arithmetic.
+ * #define Unsigned_Shifts if >> does treats its left operand as unsigned.
+ * #define No_leftright to omit left-right logic in fast floating-point
+ *     computation of dtoa.
+ * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
+ * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
+ *     that use extended-precision instructions to compute rounded
+ *     products and quotients) with IBM.
+ * #define ROUND_BIASED for IEEE-format with biased rounding.
+ * #define Inaccurate_Divide for IEEE-format with correctly rounded
+ *     products but inaccurate quotients, e.g., for Intel i860.
+ * #define Just_16 to store 16 bits per 32-bit Long when doing high-precision
+ *     integer arithmetic.  Whether this speeds things up or slows things
+ *     down depends on the machine and the number being converted.
+ * #define KR_headers for old-style C function headers.
+ * #define Bad_float_h if your system lacks a float.h or if it does not
+ *     define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
+ *     FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
+ *     if memory is available and otherwise does something you deem
+ *     appropriate.  If MALLOC is undefined, malloc will be invoked
+ *     directly -- and assumed always to succeed.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: strtod.c,v 1.9 1997/03/25 17:07:30 rahnds Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \
+    defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
+    defined(__powerpc__) || defined(__m88k__) || defined(__ppc__)
+#include <sys/types.h>
+#if BYTE_ORDER == BIG_ENDIAN
+#define IEEE_BIG_ENDIAN
+#else
+#define IEEE_LITTLE_ENDIAN
+#endif
+#endif
+
+#ifdef __arm32__
+/*
+ * Although the CPU is little endian the FP has different
+ * byte and word endianness. The byte order is still little endian
+ * but the word order is big endian.
+ */
+#define IEEE_BIG_ENDIAN
+#endif
+
+#ifdef vax
+#define VAX
+#endif
+
+#define Long   int32_t
+#define ULong  u_int32_t
+
+#ifdef DEBUG
+#include "stdio.h"
+#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
+#endif
+
+#ifdef __cplusplus
+#include "malloc.h"
+#include "memory.h"
+#else
+#ifndef KR_headers
+#include "stdlib.h"
+#include "string.h"
+#include "locale.h"
+#else
+#include "malloc.h"
+#include "memory.h"
+#endif
+#endif
+
+#ifdef MALLOC
+#ifdef KR_headers
+extern char *MALLOC();
+#else
+extern void *MALLOC(size_t);
+#endif
+#else
+#define MALLOC malloc
+#endif
+
+#include "ctype.h"
+#include "errno.h"
+
+#ifdef Bad_float_h
+#undef __STDC__
+#ifdef IEEE_BIG_ENDIAN
+#define IEEE_ARITHMETIC
+#endif
+#ifdef IEEE_LITTLE_ENDIAN
+#define IEEE_ARITHMETIC
+#endif
+
+#ifdef IEEE_ARITHMETIC
+#define DBL_DIG 15
+#define DBL_MAX_10_EXP 308
+#define DBL_MAX_EXP 1024
+#define FLT_RADIX 2
+#define FLT_ROUNDS 1
+#define DBL_MAX 1.7976931348623157e+308
+#endif
+
+#ifdef IBM
+#define DBL_DIG 16
+#define DBL_MAX_10_EXP 75
+#define DBL_MAX_EXP 63
+#define FLT_RADIX 16
+#define FLT_ROUNDS 0
+#define DBL_MAX 7.2370055773322621e+75
+#endif
+
+#ifdef VAX
+#define DBL_DIG 16
+#define DBL_MAX_10_EXP 38
+#define DBL_MAX_EXP 127
+#define FLT_RADIX 2
+#define FLT_ROUNDS 1
+#define DBL_MAX 1.7014118346046923e+38
+#endif
+
+#ifndef LONG_MAX
+#define LONG_MAX 2147483647
+#endif
+#else
+#include "float.h"
+#endif
+#ifndef __MATH_H__
+#include "math.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef CONST
+#ifdef KR_headers
+#define CONST /* blank */
+#else
+#define CONST const
+#endif
+#endif
+
+#ifdef Unsigned_Shifts
+#define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000;
+#else
+#define Sign_Extend(a,b) /*no-op*/
+#endif
+
+#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + \
+    defined(IBM) != 1
+Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
+IBM should be defined.
+#endif
+
+#ifdef IEEE_LITTLE_ENDIAN
+#define word0(x) ((ULong *)&x)[1]
+#define word1(x) ((ULong *)&x)[0]
+#else
+#define word0(x) ((ULong *)&x)[0]
+#define word1(x) ((ULong *)&x)[1]
+#endif
+
+/* The following definition of Storeinc is appropriate for MIPS processors.
+ * An alternative that might be better on some machines is
+ * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
+ */
+#if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) + defined(__arm32__)
+#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
+((unsigned short *)a)[0] = (unsigned short)c, a++)
+#else
+#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
+((unsigned short *)a)[1] = (unsigned short)c, a++)
+#endif
+
+/* #define P DBL_MANT_DIG */
+/* Ten_pmax = floor(P*log(2)/log(5)) */
+/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
+/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
+/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
+
+#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN)
+#define Exp_shift  20
+#define Exp_shift1 20
+#define Exp_msk1    0x100000
+#define Exp_msk11   0x100000
+#define Exp_mask  0x7ff00000
+#define P 53
+#define Bias 1023
+#define IEEE_Arith
+#define Emin (-1022)
+#define Exp_1  0x3ff00000
+#define Exp_11 0x3ff00000
+#define Ebits 11
+#define Frac_mask  0xfffff
+#define Frac_mask1 0xfffff
+#define Ten_pmax 22
+#define Bletch 0x10
+#define Bndry_mask  0xfffff
+#define Bndry_mask1 0xfffff
+#define LSB 1
+#define Sign_bit 0x80000000
+#define Log2P 1
+#define Tiny0 0
+#define Tiny1 1
+#define Quick_max 14
+#define Int_max 14
+#define Infinite(x) (word0(x) == 0x7ff00000) /* sufficient test for here */
+#else
+#undef  Sudden_Underflow
+#define Sudden_Underflow
+#ifdef IBM
+#define Exp_shift  24
+#define Exp_shift1 24
+#define Exp_msk1   0x1000000
+#define Exp_msk11  0x1000000
+#define Exp_mask  0x7f000000
+#define P 14
+#define Bias 65
+#define Exp_1  0x41000000
+#define Exp_11 0x41000000
+#define Ebits 8        /* exponent has 7 bits, but 8 is the right value in b2d */
+#define Frac_mask  0xffffff
+#define Frac_mask1 0xffffff
+#define Bletch 4
+#define Ten_pmax 22
+#define Bndry_mask  0xefffff
+#define Bndry_mask1 0xffffff
+#define LSB 1
+#define Sign_bit 0x80000000
+#define Log2P 4
+#define Tiny0 0x100000
+#define Tiny1 0
+#define Quick_max 14
+#define Int_max 15
+#else /* VAX */
+#define Exp_shift  23
+#define Exp_shift1 7
+#define Exp_msk1    0x80
+#define Exp_msk11   0x800000
+#define Exp_mask  0x7f80
+#define P 56
+#define Bias 129
+#define Exp_1  0x40800000
+#define Exp_11 0x4080
+#define Ebits 8
+#define Frac_mask  0x7fffff
+#define Frac_mask1 0xffff007f
+#define Ten_pmax 24
+#define Bletch 2
+#define Bndry_mask  0xffff007f
+#define Bndry_mask1 0xffff007f
+#define LSB 0x10000
+#define Sign_bit 0x8000
+#define Log2P 1
+#define Tiny0 0x80
+#define Tiny1 0
+#define Quick_max 15
+#define Int_max 15
+#endif
+#endif
+
+#ifndef IEEE_Arith
+#define ROUND_BIASED
+#endif
+
+#ifdef RND_PRODQUOT
+#define rounded_product(a,b) a = rnd_prod(a, b)
+#define rounded_quotient(a,b) a = rnd_quot(a, b)
+#ifdef KR_headers
+extern double rnd_prod(), rnd_quot();
+#else
+extern double rnd_prod(double, double), rnd_quot(double, double);
+#endif
+#else
+#define rounded_product(a,b) a *= b
+#define rounded_quotient(a,b) a /= b
+#endif
+
+#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
+#define Big1 0xffffffff
+
+#ifndef Just_16
+/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
+ * This makes some inner loops simpler and sometimes saves work
+ * during multiplications, but it often seems to make things slightly
+ * slower.  Hence the default is now to store 32 bits per Long.
+ */
+#ifndef Pack_32
+#define Pack_32
+#endif
+#endif
+
+#define Kmax 15
+
+#ifdef __cplusplus
+extern "C" double strtod(const char *s00, char **se);
+extern "C" char *__dtoa(double d, int mode, int ndigits,
+                       int *decpt, int *sign, char **rve);
+#endif
+
+ struct
+Bigint {
+       struct Bigint *next;
+       int k, maxwds, sign, wds;
+       ULong x[1];
+       };
+
+ typedef struct Bigint Bigint;
+
+ static Bigint *freelist[Kmax+1];
+
+ static Bigint *
+Balloc
+#ifdef KR_headers
+       (k) int k;
+#else
+       (int k)
+#endif
+{
+       int x;
+       Bigint *rv;
+
+       if (rv = freelist[k]) {
+               freelist[k] = rv->next;
+               }
+       else {
+               x = 1 << k;
+               rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long));
+               rv->k = k;
+               rv->maxwds = x;
+               }
+       rv->sign = rv->wds = 0;
+       return rv;
+       }
+
+ static void
+Bfree
+#ifdef KR_headers
+       (v) Bigint *v;
+#else
+       (Bigint *v)
+#endif
+{
+       if (v) {
+               v->next = freelist[v->k];
+               freelist[v->k] = v;
+               }
+       }
+
+#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
+y->wds*sizeof(Long) + 2*sizeof(int))
+
+ static Bigint *
+multadd
+#ifdef KR_headers
+       (b, m, a) Bigint *b; int m, a;
+#else
+       (Bigint *b, int m, int a)       /* multiply by m and add a */
+#endif
+{
+       int i, wds;
+       ULong *x, y;
+#ifdef Pack_32
+       ULong xi, z;
+#endif
+       Bigint *b1;
+
+       wds = b->wds;
+       x = b->x;
+       i = 0;
+       do {
+#ifdef Pack_32
+               xi = *x;
+               y = (xi & 0xffff) * m + a;
+               z = (xi >> 16) * m + (y >> 16);
+               a = (int)(z >> 16);
+               *x++ = (z << 16) + (y & 0xffff);
+#else
+               y = *x * m + a;
+               a = (int)(y >> 16);
+               *x++ = y & 0xffff;
+#endif
+               }
+               while(++i < wds);
+       if (a) {
+               if (wds >= b->maxwds) {
+                       b1 = Balloc(b->k+1);
+                       Bcopy(b1, b);
+                       Bfree(b);
+                       b = b1;
+                       }
+               b->x[wds++] = a;
+               b->wds = wds;
+               }
+       return b;
+       }
+
+ static Bigint *
+s2b
+#ifdef KR_headers
+       (s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9;
+#else
+       (CONST char *s, int nd0, int nd, ULong y9)
+#endif
+{
+       Bigint *b;
+       int i, k;
+       Long x, y;
+
+       x = (nd + 8) / 9;
+       for(k = 0, y = 1; x > y; y <<= 1, k++) ;
+#ifdef Pack_32
+       b = Balloc(k);
+       b->x[0] = y9;
+       b->wds = 1;
+#else
+       b = Balloc(k+1);
+       b->x[0] = y9 & 0xffff;
+       b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
+#endif
+
+       i = 9;
+       if (9 < nd0) {
+               s += 9;
+               do b = multadd(b, 10, *s++ - '0');
+                       while(++i < nd0);
+               s++;
+               }
+       else
+               s += 10;
+       for(; i < nd; i++)
+               b = multadd(b, 10, *s++ - '0');
+       return b;
+       }
+
+ static int
+hi0bits
+#ifdef KR_headers
+       (x) register ULong x;
+#else
+       (register ULong x)
+#endif
+{
+       register int k = 0;
+
+       if (!(x & 0xffff0000)) {
+               k = 16;
+               x <<= 16;
+               }
+       if (!(x & 0xff000000)) {
+               k += 8;
+               x <<= 8;
+               }
+       if (!(x & 0xf0000000)) {
+               k += 4;
+               x <<= 4;
+               }
+       if (!(x & 0xc0000000)) {
+               k += 2;
+               x <<= 2;
+               }
+       if (!(x & 0x80000000)) {
+               k++;
+               if (!(x & 0x40000000))
+                       return 32;
+               }
+       return k;
+       }
+
+ static int
+lo0bits
+#ifdef KR_headers
+       (y) ULong *y;
+#else
+       (ULong *y)
+#endif
+{
+       register int k;
+       register ULong x = *y;
+
+       if (x & 7) {
+               if (x & 1)
+                       return 0;
+               if (x & 2) {
+                       *y = x >> 1;
+                       return 1;
+                       }
+               *y = x >> 2;
+               return 2;
+               }
+       k = 0;
+       if (!(x & 0xffff)) {
+               k = 16;
+               x >>= 16;
+               }
+       if (!(x & 0xff)) {
+               k += 8;
+               x >>= 8;
+               }
+       if (!(x & 0xf)) {
+               k += 4;
+               x >>= 4;
+               }
+       if (!(x & 0x3)) {
+               k += 2;
+               x >>= 2;
+               }
+       if (!(x & 1)) {
+               k++;
+               x >>= 1;
+               if (!x & 1)
+                       return 32;
+               }
+       *y = x;
+       return k;
+       }
+
+ static Bigint *
+i2b
+#ifdef KR_headers
+       (i) int i;
+#else
+       (int i)
+#endif
+{
+       Bigint *b;
+
+       b = Balloc(1);
+       b->x[0] = i;
+       b->wds = 1;
+       return b;
+       }
+
+ static Bigint *
+mult
+#ifdef KR_headers
+       (a, b) Bigint *a, *b;
+#else
+       (Bigint *a, Bigint *b)
+#endif
+{
+       Bigint *c;
+       int k, wa, wb, wc;
+       ULong carry, y, z;
+       ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
+#ifdef Pack_32
+       ULong z2;
+#endif
+
+       if (a->wds < b->wds) {
+               c = a;
+               a = b;
+               b = c;
+               }
+       k = a->k;
+       wa = a->wds;
+       wb = b->wds;
+       wc = wa + wb;
+       if (wc > a->maxwds)
+               k++;
+       c = Balloc(k);
+       for(x = c->x, xa = x + wc; x < xa; x++)
+               *x = 0;
+       xa = a->x;
+       xae = xa + wa;
+       xb = b->x;
+       xbe = xb + wb;
+       xc0 = c->x;
+#ifdef Pack_32
+       for(; xb < xbe; xb++, xc0++) {
+               if (y = *xb & 0xffff) {
+                       x = xa;
+                       xc = xc0;
+                       carry = 0;
+                       do {
+                               z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
+                               carry = z >> 16;
+                               z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
+                               carry = z2 >> 16;
+                               Storeinc(xc, z2, z);
+                               }
+                               while(x < xae);
+                       *xc = carry;
+                       }
+               if (y = *xb >> 16) {
+                       x = xa;
+                       xc = xc0;
+                       carry = 0;
+                       z2 = *xc;
+                       do {
+                               z = (*x & 0xffff) * y + (*xc >> 16) + carry;
+                               carry = z >> 16;
+                               Storeinc(xc, z, z2);
+                               z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
+                               carry = z2 >> 16;
+                               }
+                               while(x < xae);
+                       *xc = z2;
+                       }
+               }
+#else
+       for(; xb < xbe; xc0++) {
+               if (y = *xb++) {
+                       x = xa;
+                       xc = xc0;
+                       carry = 0;
+                       do {
+                               z = *x++ * y + *xc + carry;
+                               carry = z >> 16;
+                               *xc++ = z & 0xffff;
+                               }
+                               while(x < xae);
+                       *xc = carry;
+                       }
+               }
+#endif
+       for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
+       c->wds = wc;
+       return c;
+       }
+
+ static Bigint *p5s;
+
+ static Bigint *
+pow5mult
+#ifdef KR_headers
+       (b, k) Bigint *b; int k;
+#else
+       (Bigint *b, int k)
+#endif
+{
+       Bigint *b1, *p5, *p51;
+       int i;
+       static int p05[3] = { 5, 25, 125 };
+
+       if (i = k & 3)
+               b = multadd(b, p05[i-1], 0);
+
+       if (!(k >>= 2))
+               return b;
+       if (!(p5 = p5s)) {
+               /* first time */
+               p5 = p5s = i2b(625);
+               p5->next = 0;
+               }
+       for(;;) {
+               if (k & 1) {
+                       b1 = mult(b, p5);
+                       Bfree(b);
+                       b = b1;
+                       }
+               if (!(k >>= 1))
+                       break;
+               if (!(p51 = p5->next)) {
+                       p51 = p5->next = mult(p5,p5);
+                       p51->next = 0;
+                       }
+               p5 = p51;
+               }
+       return b;
+       }
+
+ static Bigint *
+lshift
+#ifdef KR_headers
+       (b, k) Bigint *b; int k;
+#else
+       (Bigint *b, int k)
+#endif
+{
+       int i, k1, n, n1;
+       Bigint *b1;
+       ULong *x, *x1, *xe, z;
+
+#ifdef Pack_32
+       n = k >> 5;
+#else
+       n = k >> 4;
+#endif
+       k1 = b->k;
+       n1 = n + b->wds + 1;
+       for(i = b->maxwds; n1 > i; i <<= 1)
+               k1++;
+       b1 = Balloc(k1);
+       x1 = b1->x;
+       for(i = 0; i < n; i++)
+               *x1++ = 0;
+       x = b->x;
+       xe = x + b->wds;
+#ifdef Pack_32
+       if (k &= 0x1f) {
+               k1 = 32 - k;
+               z = 0;
+               do {
+                       *x1++ = *x << k | z;
+                       z = *x++ >> k1;
+                       }
+                       while(x < xe);
+               if (*x1 = z)
+                       ++n1;
+               }
+#else
+       if (k &= 0xf) {
+               k1 = 16 - k;
+               z = 0;
+               do {
+                       *x1++ = *x << k  & 0xffff | z;
+                       z = *x++ >> k1;
+                       }
+                       while(x < xe);
+               if (*x1 = z)
+                       ++n1;
+               }
+#endif
+       else do
+               *x1++ = *x++;
+               while(x < xe);
+       b1->wds = n1 - 1;
+       Bfree(b);
+       return b1;
+       }
+
+ static int
+cmp
+#ifdef KR_headers
+       (a, b) Bigint *a, *b;
+#else
+       (Bigint *a, Bigint *b)
+#endif
+{
+       ULong *xa, *xa0, *xb, *xb0;
+       int i, j;
+
+       i = a->wds;
+       j = b->wds;
+#ifdef DEBUG
+       if (i > 1 && !a->x[i-1])
+               Bug("cmp called with a->x[a->wds-1] == 0");
+       if (j > 1 && !b->x[j-1])
+               Bug("cmp called with b->x[b->wds-1] == 0");
+#endif
+       if (i -= j)
+               return i;
+       xa0 = a->x;
+       xa = xa0 + j;
+       xb0 = b->x;
+       xb = xb0 + j;
+       for(;;) {
+               if (*--xa != *--xb)
+                       return *xa < *xb ? -1 : 1;
+               if (xa <= xa0)
+                       break;
+               }
+       return 0;
+       }
+
+ static Bigint *
+diff
+#ifdef KR_headers
+       (a, b) Bigint *a, *b;
+#else
+       (Bigint *a, Bigint *b)
+#endif
+{
+       Bigint *c;
+       int i, wa, wb;
+       Long borrow, y; /* We need signed shifts here. */
+       ULong *xa, *xae, *xb, *xbe, *xc;
+#ifdef Pack_32
+       Long z;
+#endif
+
+       i = cmp(a,b);
+       if (!i) {
+               c = Balloc(0);
+               c->wds = 1;
+               c->x[0] = 0;
+               return c;
+               }
+       if (i < 0) {
+               c = a;
+               a = b;
+               b = c;
+               i = 1;
+               }
+       else
+               i = 0;
+       c = Balloc(a->k);
+       c->sign = i;
+       wa = a->wds;
+       xa = a->x;
+       xae = xa + wa;
+       wb = b->wds;
+       xb = b->x;
+       xbe = xb + wb;
+       xc = c->x;
+       borrow = 0;
+#ifdef Pack_32
+       do {
+               y = (*xa & 0xffff) - (*xb & 0xffff) + borrow;
+               borrow = y >> 16;
+               Sign_Extend(borrow, y);
+               z = (*xa++ >> 16) - (*xb++ >> 16) + borrow;
+               borrow = z >> 16;
+               Sign_Extend(borrow, z);
+               Storeinc(xc, z, y);
+               }
+               while(xb < xbe);
+       while(xa < xae) {
+               y = (*xa & 0xffff) + borrow;
+               borrow = y >> 16;
+               Sign_Extend(borrow, y);
+               z = (*xa++ >> 16) + borrow;
+               borrow = z >> 16;
+               Sign_Extend(borrow, z);
+               Storeinc(xc, z, y);
+               }
+#else
+       do {
+               y = *xa++ - *xb++ + borrow;
+               borrow = y >> 16;
+               Sign_Extend(borrow, y);
+               *xc++ = y & 0xffff;
+               }
+               while(xb < xbe);
+       while(xa < xae) {
+               y = *xa++ + borrow;
+               borrow = y >> 16;
+               Sign_Extend(borrow, y);
+               *xc++ = y & 0xffff;
+               }
+#endif
+       while(!*--xc)
+               wa--;
+       c->wds = wa;
+       return c;
+       }
+
+ static double
+ulp
+#ifdef KR_headers
+       (x) double x;
+#else
+       (double x)
+#endif
+{
+       register Long L;
+       double a;
+
+       L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
+#ifndef Sudden_Underflow
+       if (L > 0) {
+#endif
+#ifdef IBM
+               L |= Exp_msk1 >> 4;
+#endif
+               word0(a) = L;
+               word1(a) = 0;
+#ifndef Sudden_Underflow
+               }
+       else {
+               L = -L >> Exp_shift;
+               if (L < Exp_shift) {
+                       word0(a) = 0x80000 >> L;
+                       word1(a) = 0;
+                       }
+               else {
+                       word0(a) = 0;
+                       L -= Exp_shift;
+                       word1(a) = L >= 31 ? 1 : 1 << 31 - L;
+                       }
+               }
+#endif
+       return a;
+       }
+
+ static double
+b2d
+#ifdef KR_headers
+       (a, e) Bigint *a; int *e;
+#else
+       (Bigint *a, int *e)
+#endif
+{
+       ULong *xa, *xa0, w, y, z;
+       int k;
+       double d;
+#ifdef VAX
+       ULong d0, d1;
+#else
+#define d0 word0(d)
+#define d1 word1(d)
+#endif
+
+       xa0 = a->x;
+       xa = xa0 + a->wds;
+       y = *--xa;
+#ifdef DEBUG
+       if (!y) Bug("zero y in b2d");
+#endif
+       k = hi0bits(y);
+       *e = 32 - k;
+#ifdef Pack_32
+       if (k < Ebits) {
+               d0 = Exp_1 | y >> Ebits - k;
+               w = xa > xa0 ? *--xa : 0;
+               d1 = y << (32-Ebits) + k | w >> Ebits - k;
+               goto ret_d;
+               }
+       z = xa > xa0 ? *--xa : 0;
+       if (k -= Ebits) {
+               d0 = Exp_1 | y << k | z >> 32 - k;
+               y = xa > xa0 ? *--xa : 0;
+               d1 = z << k | y >> 32 - k;
+               }
+       else {
+               d0 = Exp_1 | y;
+               d1 = z;
+               }
+#else
+       if (k < Ebits + 16) {
+               z = xa > xa0 ? *--xa : 0;
+               d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
+               w = xa > xa0 ? *--xa : 0;
+               y = xa > xa0 ? *--xa : 0;
+               d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
+               goto ret_d;
+               }
+       z = xa > xa0 ? *--xa : 0;
+       w = xa > xa0 ? *--xa : 0;
+       k -= Ebits + 16;
+       d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
+       y = xa > xa0 ? *--xa : 0;
+       d1 = w << k + 16 | y << k;
+#endif
+ ret_d:
+#ifdef VAX
+       word0(d) = d0 >> 16 | d0 << 16;
+       word1(d) = d1 >> 16 | d1 << 16;
+#else
+#undef d0
+#undef d1
+#endif
+       return d;
+       }
+
+ static Bigint *
+d2b
+#ifdef KR_headers
+       (d, e, bits) double d; int *e, *bits;
+#else
+       (double d, int *e, int *bits)
+#endif
+{
+       Bigint *b;
+       int de, i, k;
+       ULong *x, y, z;
+#ifdef VAX
+       ULong d0, d1;
+       d0 = word0(d) >> 16 | word0(d) << 16;
+       d1 = word1(d) >> 16 | word1(d) << 16;
+#else
+#define d0 word0(d)
+#define d1 word1(d)
+#endif
+
+#ifdef Pack_32
+       b = Balloc(1);
+#else
+       b = Balloc(2);
+#endif
+       x = b->x;
+
+       z = d0 & Frac_mask;
+       d0 &= 0x7fffffff;       /* clear sign bit, which we ignore */
+#ifdef Sudden_Underflow
+       de = (int)(d0 >> Exp_shift);
+#ifndef IBM
+       z |= Exp_msk11;
+#endif
+#else
+       if (de = (int)(d0 >> Exp_shift))
+               z |= Exp_msk1;
+#endif
+#ifdef Pack_32
+       if (y = d1) {
+               if (k = lo0bits(&y)) {
+                       x[0] = y | z << 32 - k;
+                       z >>= k;
+                       }
+               else
+                       x[0] = y;
+               i = b->wds = (x[1] = z) ? 2 : 1;
+               }
+       else {
+#ifdef DEBUG
+               if (!z)
+                       Bug("Zero passed to d2b");
+#endif
+               k = lo0bits(&z);
+               x[0] = z;
+               i = b->wds = 1;
+               k += 32;
+               }
+#else
+       if (y = d1) {
+               if (k = lo0bits(&y))
+                       if (k >= 16) {
+                               x[0] = y | z << 32 - k & 0xffff;
+                               x[1] = z >> k - 16 & 0xffff;
+                               x[2] = z >> k;
+                               i = 2;
+                               }
+                       else {
+                               x[0] = y & 0xffff;
+                               x[1] = y >> 16 | z << 16 - k & 0xffff;
+                               x[2] = z >> k & 0xffff;
+                               x[3] = z >> k+16;
+                               i = 3;
+                               }
+               else {
+                       x[0] = y & 0xffff;
+                       x[1] = y >> 16;
+                       x[2] = z & 0xffff;
+                       x[3] = z >> 16;
+                       i = 3;
+                       }
+               }
+       else {
+#ifdef DEBUG
+               if (!z)
+                       Bug("Zero passed to d2b");
+#endif
+               k = lo0bits(&z);
+               if (k >= 16) {
+                       x[0] = z;
+                       i = 0;
+                       }
+               else {
+                       x[0] = z & 0xffff;
+                       x[1] = z >> 16;
+                       i = 1;
+                       }
+               k += 32;
+               }
+       while(!x[i])
+               --i;
+       b->wds = i + 1;
+#endif
+#ifndef Sudden_Underflow
+       if (de) {
+#endif
+#ifdef IBM
+               *e = (de - Bias - (P-1) << 2) + k;
+               *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
+#else
+               *e = de - Bias - (P-1) + k;
+               *bits = P - k;
+#endif
+#ifndef Sudden_Underflow
+               }
+       else {
+               *e = de - Bias - (P-1) + 1 + k;
+#ifdef Pack_32
+               *bits = 32*i - hi0bits(x[i-1]);
+#else
+               *bits = (i+2)*16 - hi0bits(x[i]);
+#endif
+               }
+#endif
+       return b;
+       }
+#undef d0
+#undef d1
+
+ static double
+ratio
+#ifdef KR_headers
+       (a, b) Bigint *a, *b;
+#else
+       (Bigint *a, Bigint *b)
+#endif
+{
+       double da, db;
+       int k, ka, kb;
+
+       da = b2d(a, &ka);
+       db = b2d(b, &kb);
+#ifdef Pack_32
+       k = ka - kb + 32*(a->wds - b->wds);
+#else
+       k = ka - kb + 16*(a->wds - b->wds);
+#endif
+#ifdef IBM
+       if (k > 0) {
+               word0(da) += (k >> 2)*Exp_msk1;
+               if (k &= 3)
+                       da *= 1 << k;
+               }
+       else {
+               k = -k;
+               word0(db) += (k >> 2)*Exp_msk1;
+               if (k &= 3)
+                       db *= 1 << k;
+               }
+#else
+       if (k > 0)
+               word0(da) += k*Exp_msk1;
+       else {
+               k = -k;
+               word0(db) += k*Exp_msk1;
+               }
+#endif
+       return da / db;
+       }
+
+static CONST double
+tens[] = {
+               1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+               1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
+               1e20, 1e21, 1e22
+#ifdef VAX
+               , 1e23, 1e24
+#endif
+               };
+
+#ifdef IEEE_Arith
+static CONST double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
+static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
+#define n_bigtens 5
+#else
+#ifdef IBM
+static CONST double bigtens[] = { 1e16, 1e32, 1e64 };
+static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };
+#define n_bigtens 3
+#else
+static CONST double bigtens[] = { 1e16, 1e32 };
+static CONST double tinytens[] = { 1e-16, 1e-32 };
+#define n_bigtens 2
+#endif
+#endif
+
+ double
+strtod
+#ifdef KR_headers
+       (s00, se) CONST char *s00; char **se;
+#else
+       (CONST char *s00, char **se)
+#endif
+{
+       int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
+                e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
+       CONST char *s, *s0, *s1;
+       double aadj, aadj1, adj, rv, rv0;
+       Long L;
+       ULong y, z;
+       Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
+
+#ifndef KR_headers
+       CONST char decimal_point = localeconv()->decimal_point[0];
+#else
+       CONST char decimal_point = '.';
+#endif
+
+       sign = nz0 = nz = 0;
+       rv = 0.;
+
+
+       for(s = s00; isspace((unsigned char) *s); s++)
+               ;
+
+       if (*s == '-') {
+               sign = 1;
+               s++;
+       } else if (*s == '+') {
+               s++;
+       }
+
+       if (*s == '\0') {
+               s = s00;
+               goto ret;
+       }
+
+       if (*s == '0') {
+               nz0 = 1;
+               while(*++s == '0') ;
+               if (!*s)
+                       goto ret;
+               }
+       s0 = s;
+       y = z = 0;
+       for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
+               if (nd < 9)
+                       y = 10*y + c - '0';
+               else if (nd < 16)
+                       z = 10*z + c - '0';
+       nd0 = nd;
+       if (c == decimal_point) {
+               c = *++s;
+               if (!nd) {
+                       for(; c == '0'; c = *++s)
+                               nz++;
+                       if (c > '0' && c <= '9') {
+                               s0 = s;
+                               nf += nz;
+                               nz = 0;
+                               goto have_dig;
+                               }
+                       goto dig_done;
+                       }
+               for(; c >= '0' && c <= '9'; c = *++s) {
+ have_dig:
+                       nz++;
+                       if (c -= '0') {
+                               nf += nz;
+                               for(i = 1; i < nz; i++)
+                                       if (nd++ < 9)
+                                               y *= 10;
+                                       else if (nd <= DBL_DIG + 1)
+                                               z *= 10;
+                               if (nd++ < 9)
+                                       y = 10*y + c;
+                               else if (nd <= DBL_DIG + 1)
+                                       z = 10*z + c;
+                               nz = 0;
+                               }
+                       }
+               }
+ dig_done:
+       e = 0;
+       if (c == 'e' || c == 'E') {
+               if (!nd && !nz && !nz0) {
+                       s = s00;
+                       goto ret;
+                       }
+               s00 = s;
+               esign = 0;
+               switch(c = *++s) {
+                       case '-':
+                               esign = 1;
+                       case '+':
+                               c = *++s;
+                       }
+               if (c >= '0' && c <= '9') {
+                       while(c == '0')
+                               c = *++s;
+                       if (c > '0' && c <= '9') {
+                               L = c - '0';
+                               s1 = s;
+                               while((c = *++s) >= '0' && c <= '9')
+                                       L = 10*L + c - '0';
+                               if (s - s1 > 8 || L > 19999)
+                                       /* Avoid confusion from exponents
+                                        * so large that e might overflow.
+                                        */
+                                       e = 19999; /* safe for 16 bit ints */
+                               else
+                                       e = (int)L;
+                               if (esign)
+                                       e = -e;
+                               }
+                       else
+                               e = 0;
+                       }
+               else
+                       s = s00;
+               }
+       if (!nd) {
+               if (!nz && !nz0)
+                       s = s00;
+               goto ret;
+               }
+       e1 = e -= nf;
+
+       /* Now we have nd0 digits, starting at s0, followed by a
+        * decimal point, followed by nd-nd0 digits.  The number we're
+        * after is the integer represented by those digits times
+        * 10**e */
+
+       if (!nd0)
+               nd0 = nd;
+       k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
+       rv = y;
+       if (k > 9)
+               rv = tens[k - 9] * rv + z;
+       bd0 = 0;
+       if (nd <= DBL_DIG
+#ifndef RND_PRODQUOT
+               && FLT_ROUNDS == 1
+#endif
+                       ) {
+               if (!e)
+                       goto ret;
+               if (e > 0) {
+                       if (e <= Ten_pmax) {
+#ifdef VAX
+                               goto vax_ovfl_check;
+#else
+                               /* rv = */ rounded_product(rv, tens[e]);
+                               goto ret;
+#endif
+                               }
+                       i = DBL_DIG - nd;
+                       if (e <= Ten_pmax + i) {
+                               /* A fancier test would sometimes let us do
+                                * this for larger i values.
+                                */
+                               e -= i;
+                               rv *= tens[i];
+#ifdef VAX
+                               /* VAX exponent range is so narrow we must
+                                * worry about overflow here...
+                                */
+ vax_ovfl_check:
+                               word0(rv) -= P*Exp_msk1;
+                               /* rv = */ rounded_product(rv, tens[e]);
+                               if ((word0(rv) & Exp_mask)
+                                > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
+                                       goto ovfl;
+                               word0(rv) += P*Exp_msk1;
+#else
+                               /* rv = */ rounded_product(rv, tens[e]);
+#endif
+                               goto ret;
+                               }
+                       }
+#ifndef Inaccurate_Divide
+               else if (e >= -Ten_pmax) {
+                       /* rv = */ rounded_quotient(rv, tens[-e]);
+                       goto ret;
+                       }
+#endif
+               }
+       e1 += nd - k;
+
+       /* Get starting approximation = rv * 10**e1 */
+
+       if (e1 > 0) {
+               if (i = e1 & 15)
+                       rv *= tens[i];
+               if (e1 &= ~15) {
+                       if (e1 > DBL_MAX_10_EXP) {
+ ovfl:
+                               errno = ERANGE;
+#ifdef __STDC__
+                               rv = HUGE_VAL;
+#else
+                               /* Can't trust HUGE_VAL */
+#ifdef IEEE_Arith
+                               word0(rv) = Exp_mask;
+                               word1(rv) = 0;
+#else
+                               word0(rv) = Big0;
+                               word1(rv) = Big1;
+#endif
+#endif
+                               if (bd0)
+                                       goto retfree;
+                               goto ret;
+                               }
+                       if (e1 >>= 4) {
+                               for(j = 0; e1 > 1; j++, e1 >>= 1)
+                                       if (e1 & 1)
+                                               rv *= bigtens[j];
+                       /* The last multiplication could overflow. */
+                               word0(rv) -= P*Exp_msk1;
+                               rv *= bigtens[j];
+                               if ((z = word0(rv) & Exp_mask)
+                                > Exp_msk1*(DBL_MAX_EXP+Bias-P))
+                                       goto ovfl;
+                               if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
+                                       /* set to largest number */
+                                       /* (Can't trust DBL_MAX) */
+                                       word0(rv) = Big0;
+                                       word1(rv) = Big1;
+                                       }
+                               else
+                                       word0(rv) += P*Exp_msk1;
+                               }
+
+                       }
+               }
+       else if (e1 < 0) {
+               e1 = -e1;
+               if (i = e1 & 15)
+                       rv /= tens[i];
+               if (e1 &= ~15) {
+                       e1 >>= 4;
+                       if (e1 >= 1 << n_bigtens)
+                               goto undfl;
+                       for(j = 0; e1 > 1; j++, e1 >>= 1)
+                               if (e1 & 1)
+                                       rv *= tinytens[j];
+                       /* The last multiplication could underflow. */
+                       rv0 = rv;
+                       rv *= tinytens[j];
+                       if (!rv) {
+                               rv = 2.*rv0;
+                               rv *= tinytens[j];
+                               if (!rv) {
+ undfl:
+                                       rv = 0.;
+                                       errno = ERANGE;
+                                       if (bd0)
+                                               goto retfree;
+                                       goto ret;
+                                       }
+                               word0(rv) = Tiny0;
+                               word1(rv) = Tiny1;
+                               /* The refinement below will clean
+                                * this approximation up.
+                                */
+                               }
+                       }
+               }
+
+       /* Now the hard part -- adjusting rv to the correct value.*/
+
+       /* Put digits into bd: true value = bd * 10^e */
+
+       bd0 = s2b(s0, nd0, nd, y);
+
+       for(;;) {
+               bd = Balloc(bd0->k);
+               Bcopy(bd, bd0);
+               bb = d2b(rv, &bbe, &bbbits);    /* rv = bb * 2^bbe */
+               bs = i2b(1);
+
+               if (e >= 0) {
+                       bb2 = bb5 = 0;
+                       bd2 = bd5 = e;
+                       }
+               else {
+                       bb2 = bb5 = -e;
+                       bd2 = bd5 = 0;
+                       }
+               if (bbe >= 0)
+                       bb2 += bbe;
+               else
+                       bd2 -= bbe;
+               bs2 = bb2;
+#ifdef Sudden_Underflow
+#ifdef IBM
+               j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
+#else
+               j = P + 1 - bbbits;
+#endif
+#else
+               i = bbe + bbbits - 1;   /* logb(rv) */
+               if (i < Emin)   /* denormal */
+                       j = bbe + (P-Emin);
+               else
+                       j = P + 1 - bbbits;
+#endif
+               bb2 += j;
+               bd2 += j;
+               i = bb2 < bd2 ? bb2 : bd2;
+               if (i > bs2)
+                       i = bs2;
+               if (i > 0) {
+                       bb2 -= i;
+                       bd2 -= i;
+                       bs2 -= i;
+                       }
+               if (bb5 > 0) {
+                       bs = pow5mult(bs, bb5);
+                       bb1 = mult(bs, bb);
+                       Bfree(bb);
+                       bb = bb1;
+                       }
+               if (bb2 > 0)
+                       bb = lshift(bb, bb2);
+               if (bd5 > 0)
+                       bd = pow5mult(bd, bd5);
+               if (bd2 > 0)
+                       bd = lshift(bd, bd2);
+               if (bs2 > 0)
+                       bs = lshift(bs, bs2);
+               delta = diff(bb, bd);
+               dsign = delta->sign;
+               delta->sign = 0;
+               i = cmp(delta, bs);
+               if (i < 0) {
+                       /* Error is less than half an ulp -- check for
+                        * special case of mantissa a power of two.
+                        */
+                       if (dsign || word1(rv) || word0(rv) & Bndry_mask)
+                               break;
+                       delta = lshift(delta,Log2P);
+                       if (cmp(delta, bs) > 0)
+                               goto drop_down;
+                       break;
+                       }
+               if (i == 0) {
+                       /* exactly half-way between */
+                       if (dsign) {
+                               if ((word0(rv) & Bndry_mask1) == Bndry_mask1
+                                &&  word1(rv) == 0xffffffff) {
+                                       /*boundary case -- increment exponent*/
+                                       word0(rv) = (word0(rv) & Exp_mask)
+                                               + Exp_msk1
+#ifdef IBM
+                                               | Exp_msk1 >> 4
+#endif
+                                               ;
+                                       word1(rv) = 0;
+                                       break;
+                                       }
+                               }
+                       else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
+ drop_down:
+                               /* boundary case -- decrement exponent */
+#ifdef Sudden_Underflow
+                               L = word0(rv) & Exp_mask;
+#ifdef IBM
+                               if (L <  Exp_msk1)
+#else
+                               if (L <= Exp_msk1)
+#endif
+                                       goto undfl;
+                               L -= Exp_msk1;
+#else
+                               L = (word0(rv) & Exp_mask) - Exp_msk1;
+#endif
+                               word0(rv) = L | Bndry_mask1;
+                               word1(rv) = 0xffffffff;
+#ifdef IBM
+                               goto cont;
+#else
+                               break;
+#endif
+                               }
+#ifndef ROUND_BIASED
+                       if (!(word1(rv) & LSB))
+                               break;
+#endif
+                       if (dsign)
+                               rv += ulp(rv);
+#ifndef ROUND_BIASED
+                       else {
+                               rv -= ulp(rv);
+#ifndef Sudden_Underflow
+                               if (!rv)
+                                       goto undfl;
+#endif
+                               }
+#endif
+                       break;
+                       }
+               if ((aadj = ratio(delta, bs)) <= 2.) {
+                       if (dsign)
+                               aadj = aadj1 = 1.;
+                       else if (word1(rv) || word0(rv) & Bndry_mask) {
+#ifndef Sudden_Underflow
+                               if (word1(rv) == Tiny1 && !word0(rv))
+                                       goto undfl;
+#endif
+                               aadj = 1.;
+                               aadj1 = -1.;
+                               }
+                       else {
+                               /* special case -- power of FLT_RADIX to be */
+                               /* rounded down... */
+
+                               if (aadj < 2./FLT_RADIX)
+                                       aadj = 1./FLT_RADIX;
+                               else
+                                       aadj *= 0.5;
+                               aadj1 = -aadj;
+                               }
+                       }
+               else {
+                       aadj *= 0.5;
+                       aadj1 = dsign ? aadj : -aadj;
+#ifdef Check_FLT_ROUNDS
+                       switch(FLT_ROUNDS) {
+                               case 2: /* towards +infinity */
+                                       aadj1 -= 0.5;
+                                       break;
+                               case 0: /* towards 0 */
+                               case 3: /* towards -infinity */
+                                       aadj1 += 0.5;
+                               }
+#else
+                       if (FLT_ROUNDS == 0)
+                               aadj1 += 0.5;
+#endif
+                       }
+               y = word0(rv) & Exp_mask;
+
+               /* Check for overflow */
+
+               if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
+                       rv0 = rv;
+                       word0(rv) -= P*Exp_msk1;
+                       adj = aadj1 * ulp(rv);
+                       rv += adj;
+                       if ((word0(rv) & Exp_mask) >=
+                                       Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
+                               if (word0(rv0) == Big0 && word1(rv0) == Big1)
+                                       goto ovfl;
+                               word0(rv) = Big0;
+                               word1(rv) = Big1;
+                               goto cont;
+                               }
+                       else
+                               word0(rv) += P*Exp_msk1;
+                       }
+               else {
+#ifdef Sudden_Underflow
+                       if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
+                               rv0 = rv;
+                               word0(rv) += P*Exp_msk1;
+                               adj = aadj1 * ulp(rv);
+                               rv += adj;
+#ifdef IBM
+                               if ((word0(rv) & Exp_mask) <  P*Exp_msk1)
+#else
+                               if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
+#endif
+                                       {
+                                       if (word0(rv0) == Tiny0
+                                        && word1(rv0) == Tiny1)
+                                               goto undfl;
+                                       word0(rv) = Tiny0;
+                                       word1(rv) = Tiny1;
+                                       goto cont;
+                                       }
+                               else
+                                       word0(rv) -= P*Exp_msk1;
+                               }
+                       else {
+                               adj = aadj1 * ulp(rv);
+                               rv += adj;
+                               }
+#else
+                       /* Compute adj so that the IEEE rounding rules will
+                        * correctly round rv + adj in some half-way cases.
+                        * If rv * ulp(rv) is denormalized (i.e.,
+                        * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
+                        * trouble from bits lost to denormalization;
+                        * example: 1.2e-307 .
+                        */
+                       if (y <= (P-1)*Exp_msk1 && aadj >= 1.) {
+                               aadj1 = (double)(int)(aadj + 0.5);
+                               if (!dsign)
+                                       aadj1 = -aadj1;
+                               }
+                       adj = aadj1 * ulp(rv);
+                       rv += adj;
+#endif
+                       }
+               z = word0(rv) & Exp_mask;
+               if (y == z) {
+                       /* Can we stop now? */
+                       L = aadj;
+                       aadj -= L;
+                       /* The tolerances below are conservative. */
+                       if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
+                               if (aadj < .4999999 || aadj > .5000001)
+                                       break;
+                               }
+                       else if (aadj < .4999999/FLT_RADIX)
+                               break;
+                       }
+ cont:
+               Bfree(bb);
+               Bfree(bd);
+               Bfree(bs);
+               Bfree(delta);
+               }
+ retfree:
+       Bfree(bb);
+       Bfree(bd);
+       Bfree(bs);
+       Bfree(bd0);
+       Bfree(delta);
+ ret:
+       if (se)
+               *se = (char *)s;
+       return sign ? -rv : rv;
+       }
+
+ static int
+quorem
+#ifdef KR_headers
+       (b, S) Bigint *b, *S;
+#else
+       (Bigint *b, Bigint *S)
+#endif
+{
+       int n;
+       Long borrow, y;
+       ULong carry, q, ys;
+       ULong *bx, *bxe, *sx, *sxe;
+#ifdef Pack_32
+       Long z;
+       ULong si, zs;
+#endif
+
+       n = S->wds;
+#ifdef DEBUG
+       /*debug*/ if (b->wds > n)
+       /*debug*/       Bug("oversize b in quorem");
+#endif
+       if (b->wds < n)
+               return 0;
+       sx = S->x;
+       sxe = sx + --n;
+       bx = b->x;
+       bxe = bx + n;
+       q = *bxe / (*sxe + 1);  /* ensure q <= true quotient */
+#ifdef DEBUG
+       /*debug*/ if (q > 9)
+       /*debug*/       Bug("oversized quotient in quorem");
+#endif
+       if (q) {
+               borrow = 0;
+               carry = 0;
+               do {
+#ifdef Pack_32
+                       si = *sx++;
+                       ys = (si & 0xffff) * q + carry;
+                       zs = (si >> 16) * q + (ys >> 16);
+                       carry = zs >> 16;
+                       y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
+                       borrow = y >> 16;
+                       Sign_Extend(borrow, y);
+                       z = (*bx >> 16) - (zs & 0xffff) + borrow;
+                       borrow = z >> 16;
+                       Sign_Extend(borrow, z);
+                       Storeinc(bx, z, y);
+#else
+                       ys = *sx++ * q + carry;
+                       carry = ys >> 16;
+                       y = *bx - (ys & 0xffff) + borrow;
+                       borrow = y >> 16;
+                       Sign_Extend(borrow, y);
+                       *bx++ = y & 0xffff;
+#endif
+                       }
+                       while(sx <= sxe);
+               if (!*bxe) {
+                       bx = b->x;
+                       while(--bxe > bx && !*bxe)
+                               --n;
+                       b->wds = n;
+                       }
+               }
+       if (cmp(b, S) >= 0) {
+               q++;
+               borrow = 0;
+               carry = 0;
+               bx = b->x;
+               sx = S->x;
+               do {
+#ifdef Pack_32
+                       si = *sx++;
+                       ys = (si & 0xffff) + carry;
+                       zs = (si >> 16) + (ys >> 16);
+                       carry = zs >> 16;
+                       y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
+                       borrow = y >> 16;
+                       Sign_Extend(borrow, y);
+                       z = (*bx >> 16) - (zs & 0xffff) + borrow;
+                       borrow = z >> 16;
+                       Sign_Extend(borrow, z);
+                       Storeinc(bx, z, y);
+#else
+                       ys = *sx++ + carry;
+                       carry = ys >> 16;
+                       y = *bx - (ys & 0xffff) + borrow;
+                       borrow = y >> 16;
+                       Sign_Extend(borrow, y);
+                       *bx++ = y & 0xffff;
+#endif
+                       }
+                       while(sx <= sxe);
+               bx = b->x;
+               bxe = bx + n;
+               if (!*bxe) {
+                       while(--bxe > bx && !*bxe)
+                               --n;
+                       b->wds = n;
+                       }
+               }
+       return q;
+       }
+
+/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
+ *
+ * Inspired by "How to Print Floating-Point Numbers Accurately" by
+ * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
+ *
+ * Modifications:
+ *     1. Rather than iterating, we use a simple numeric overestimate
+ *        to determine k = floor(log10(d)).  We scale relevant
+ *        quantities using O(log2(k)) rather than O(k) multiplications.
+ *     2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
+ *        try to generate digits strictly left to right.  Instead, we
+ *        compute with fewer bits and propagate the carry if necessary
+ *        when rounding the final digit up.  This is often faster.
+ *     3. Under the assumption that input will be rounded nearest,
+ *        mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
+ *        That is, we allow equality in stopping tests when the
+ *        round-nearest rule will give the same floating-point value
+ *        as would satisfaction of the stopping test with strict
+ *        inequality.
+ *     4. We remove common factors of powers of 2 from relevant
+ *        quantities.
+ *     5. When converting floating-point integers less than 1e16,
+ *        we use floating-point arithmetic rather than resorting
+ *        to multiple-precision integers.
+ *     6. When asked to produce fewer than 15 digits, we first try
+ *        to get by with floating-point arithmetic; we resort to
+ *        multiple-precision integer arithmetic only if we cannot
+ *        guarantee that the floating-point calculation has given
+ *        the correctly rounded result.  For k requested digits and
+ *        "uniformly" distributed input, the probability is
+ *        something like 10^(k-15) that we must resort to the Long
+ *        calculation.
+ */
+
+ char *
+__dtoa
+#ifdef KR_headers
+       (d, mode, ndigits, decpt, sign, rve)
+       double d; int mode, ndigits, *decpt, *sign; char **rve;
+#else
+       (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+#endif
+{
+ /*    Arguments ndigits, decpt, sign are similar to those
+       of ecvt and fcvt; trailing zeros are suppressed from
+       the returned string.  If not null, *rve is set to point
+       to the end of the return value.  If d is +-Infinity or NaN,
+       then *decpt is set to 9999.
+
+       mode:
+               0 ==> shortest string that yields d when read in
+                       and rounded to nearest.
+               1 ==> like 0, but with Steele & White stopping rule;
+                       e.g. with IEEE P754 arithmetic , mode 0 gives
+                       1e23 whereas mode 1 gives 9.999999999999999e22.
+               2 ==> max(1,ndigits) significant digits.  This gives a
+                       return value similar to that of ecvt, except
+                       that trailing zeros are suppressed.
+               3 ==> through ndigits past the decimal point.  This
+                       gives a return value similar to that from fcvt,
+                       except that trailing zeros are suppressed, and
+                       ndigits can be negative.
+               4-9 should give the same return values as 2-3, i.e.,
+                       4 <= mode <= 9 ==> same return as mode
+                       2 + (mode & 1).  These modes are mainly for
+                       debugging; often they run slower but sometimes
+                       faster than modes 2-3.
+               4,5,8,9 ==> left-to-right digit generation.
+               6-9 ==> don't try fast floating-point estimate
+                       (if applicable).
+
+               Values of mode other than 0-9 are treated as mode 0.
+
+               Sufficient space is allocated to the return value
+               to hold the suppressed trailing zeros.
+       */
+
+       int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
+               j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
+               spec_case, try_quick;
+       Long L;
+#ifndef Sudden_Underflow
+       int denorm;
+       ULong x;
+#endif
+       Bigint *b, *b1, *delta, *mlo, *mhi, *S;
+       double d2, ds, eps;
+       char *s, *s0;
+       static Bigint *result;
+       static int result_k;
+
+       if (result) {
+               result->k = result_k;
+               result->maxwds = 1 << result_k;
+               Bfree(result);
+               result = 0;
+               }
+
+       if (word0(d) & Sign_bit) {
+               /* set sign for everything, including 0's and NaNs */
+               *sign = 1;
+               word0(d) &= ~Sign_bit;  /* clear sign bit */
+               }
+       else
+               *sign = 0;
+
+#if defined(IEEE_Arith) + defined(VAX)
+#ifdef IEEE_Arith
+       if ((word0(d) & Exp_mask) == Exp_mask)
+#else
+       if (word0(d)  == 0x8000)
+#endif
+               {
+               /* Infinity or NaN */
+               *decpt = 9999;
+               s =
+#ifdef IEEE_Arith
+                       !word1(d) && !(word0(d) & 0xfffff) ? "Infinity" :
+#endif
+                               "NaN";
+               if (rve)
+                       *rve =
+#ifdef IEEE_Arith
+                               s[3] ? s + 8 :
+#endif
+                                               s + 3;
+               return s;
+               }
+#endif
+#ifdef IBM
+       d += 0; /* normalize */
+#endif
+       if (!d) {
+               *decpt = 1;
+               s = "0";
+               if (rve)
+                       *rve = s + 1;
+               return s;
+               }
+
+       b = d2b(d, &be, &bbits);
+#ifdef Sudden_Underflow
+       i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
+#else
+       if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) {
+#endif
+               d2 = d;
+               word0(d2) &= Frac_mask1;
+               word0(d2) |= Exp_11;
+#ifdef IBM
+               if (j = 11 - hi0bits(word0(d2) & Frac_mask))
+                       d2 /= 1 << j;
+#endif
+
+               /* log(x)       ~=~ log(1.5) + (x-1.5)/1.5
+                * log10(x)      =  log(x) / log(10)
+                *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
+                * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
+                *
+                * This suggests computing an approximation k to log10(d) by
+                *
+                * k = (i - Bias)*0.301029995663981
+                *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
+                *
+                * We want k to be too large rather than too small.
+                * The error in the first-order Taylor series approximation
+                * is in our favor, so we just round up the constant enough
+                * to compensate for any error in the multiplication of
+                * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
+                * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
+                * adding 1e-13 to the constant term more than suffices.
+                * Hence we adjust the constant term to 0.1760912590558.
+                * (We could get a more accurate k by invoking log10,
+                *  but this is probably not worthwhile.)
+                */
+
+               i -= Bias;
+#ifdef IBM
+               i <<= 2;
+               i += j;
+#endif
+#ifndef Sudden_Underflow
+               denorm = 0;
+               }
+       else {
+               /* d is denormalized */
+
+               i = bbits + be + (Bias + (P-1) - 1);
+               x = i > 32  ? word0(d) << 64 - i | word1(d) >> i - 32
+                           : word1(d) << 32 - i;
+               d2 = x;
+               word0(d2) -= 31*Exp_msk1; /* adjust exponent */
+               i -= (Bias + (P-1) - 1) + 1;
+               denorm = 1;
+               }
+#endif
+       ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
+       k = (int)ds;
+       if (ds < 0. && ds != k)
+               k--;    /* want k = floor(ds) */
+       k_check = 1;
+       if (k >= 0 && k <= Ten_pmax) {
+               if (d < tens[k])
+                       k--;
+               k_check = 0;
+               }
+       j = bbits - i - 1;
+       if (j >= 0) {
+               b2 = 0;
+               s2 = j;
+               }
+       else {
+               b2 = -j;
+               s2 = 0;
+               }
+       if (k >= 0) {
+               b5 = 0;
+               s5 = k;
+               s2 += k;
+               }
+       else {
+               b2 -= k;
+               b5 = -k;
+               s5 = 0;
+               }
+       if (mode < 0 || mode > 9)
+               mode = 0;
+       try_quick = 1;
+       if (mode > 5) {
+               mode -= 4;
+               try_quick = 0;
+               }
+       leftright = 1;
+       switch(mode) {
+               case 0:
+               case 1:
+                       ilim = ilim1 = -1;
+                       i = 18;
+                       ndigits = 0;
+                       break;
+               case 2:
+                       leftright = 0;
+                       /* no break */
+               case 4:
+                       if (ndigits <= 0)
+                               ndigits = 1;
+                       ilim = ilim1 = i = ndigits;
+                       break;
+               case 3:
+                       leftright = 0;
+                       /* no break */
+               case 5:
+                       i = ndigits + k + 1;
+                       ilim = i;
+                       ilim1 = i - 1;
+                       if (i <= 0)
+                               i = 1;
+               }
+       j = sizeof(ULong);
+       for(result_k = 0; sizeof(Bigint) - sizeof(ULong) + j <= i;
+               j <<= 1) result_k++;
+       result = Balloc(result_k);
+       s = s0 = (char *)result;
+
+       if (ilim >= 0 && ilim <= Quick_max && try_quick) {
+
+               /* Try to get by with floating-point arithmetic. */
+
+               i = 0;
+               d2 = d;
+               k0 = k;
+               ilim0 = ilim;
+               ieps = 2; /* conservative */
+               if (k > 0) {
+                       ds = tens[k&0xf];
+                       j = k >> 4;
+                       if (j & Bletch) {
+                               /* prevent overflows */
+                               j &= Bletch - 1;
+                               d /= bigtens[n_bigtens-1];
+                               ieps++;
+                               }
+                       for(; j; j >>= 1, i++)
+                               if (j & 1) {
+                                       ieps++;
+                                       ds *= bigtens[i];
+                                       }
+                       d /= ds;
+                       }
+               else if (j1 = -k) {
+                       d *= tens[j1 & 0xf];
+                       for(j = j1 >> 4; j; j >>= 1, i++)
+                               if (j & 1) {
+                                       ieps++;
+                                       d *= bigtens[i];
+                                       }
+                       }
+               if (k_check && d < 1. && ilim > 0) {
+                       if (ilim1 <= 0)
+                               goto fast_failed;
+                       ilim = ilim1;
+                       k--;
+                       d *= 10.;
+                       ieps++;
+                       }
+               eps = ieps*d + 7.;
+               word0(eps) -= (P-1)*Exp_msk1;
+               if (ilim == 0) {
+                       S = mhi = 0;
+                       d -= 5.;
+                       if (d > eps)
+                               goto one_digit;
+                       if (d < -eps)
+                               goto no_digits;
+                       goto fast_failed;
+                       }
+#ifndef No_leftright
+               if (leftright) {
+                       /* Use Steele & White method of only
+                        * generating digits needed.
+                        */
+                       eps = 0.5/tens[ilim-1] - eps;
+                       for(i = 0;;) {
+                               L = d;
+                               d -= L;
+                               *s++ = '0' + (int)L;
+                               if (d < eps)
+                                       goto ret1;
+                               if (1. - d < eps)
+                                       goto bump_up;
+                               if (++i >= ilim)
+                                       break;
+                               eps *= 10.;
+                               d *= 10.;
+                               }
+                       }
+               else {
+#endif
+                       /* Generate ilim digits, then fix them up. */
+                       eps *= tens[ilim-1];
+                       for(i = 1;; i++, d *= 10.) {
+                               L = d;
+                               d -= L;
+                               *s++ = '0' + (int)L;
+                               if (i == ilim) {
+                                       if (d > 0.5 + eps)
+                                               goto bump_up;
+                                       else if (d < 0.5 - eps) {
+                                               while(*--s == '0');
+                                               s++;
+                                               goto ret1;
+                                               }
+                                       break;
+                                       }
+                               }
+#ifndef No_leftright
+                       }
+#endif
+ fast_failed:
+               s = s0;
+               d = d2;
+               k = k0;
+               ilim = ilim0;
+               }
+
+       /* Do we have a "small" integer? */
+
+       if (be >= 0 && k <= Int_max) {
+               /* Yes. */
+               ds = tens[k];
+               if (ndigits < 0 && ilim <= 0) {
+                       S = mhi = 0;
+                       if (ilim < 0 || d <= 5*ds)
+                               goto no_digits;
+                       goto one_digit;
+                       }
+               for(i = 1;; i++) {
+                       L = d / ds;
+                       d -= L*ds;
+#ifdef Check_FLT_ROUNDS
+                       /* If FLT_ROUNDS == 2, L will usually be high by 1 */
+                       if (d < 0) {
+                               L--;
+                               d += ds;
+                               }
+#endif
+                       *s++ = '0' + (int)L;
+                       if (i == ilim) {
+                               d += d;
+                               if (d > ds || d == ds && L & 1) {
+ bump_up:
+                                       while(*--s == '9')
+                                               if (s == s0) {
+                                                       k++;
+                                                       *s = '0';
+                                                       break;
+                                                       }
+                                       ++*s++;
+                                       }
+                               break;
+                               }
+                       if (!(d *= 10.))
+                               break;
+                       }
+               goto ret1;
+               }
+
+       m2 = b2;
+       m5 = b5;
+       mhi = mlo = 0;
+       if (leftright) {
+               if (mode < 2) {
+                       i =
+#ifndef Sudden_Underflow
+                               denorm ? be + (Bias + (P-1) - 1 + 1) :
+#endif
+#ifdef IBM
+                               1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
+#else
+                               1 + P - bbits;
+#endif
+                       }
+               else {
+                       j = ilim - 1;
+                       if (m5 >= j)
+                               m5 -= j;
+                       else {
+                               s5 += j -= m5;
+                               b5 += j;
+                               m5 = 0;
+                               }
+                       if ((i = ilim) < 0) {
+                               m2 -= i;
+                               i = 0;
+                               }
+                       }
+               b2 += i;
+               s2 += i;
+               mhi = i2b(1);
+               }
+       if (m2 > 0 && s2 > 0) {
+               i = m2 < s2 ? m2 : s2;
+               b2 -= i;
+               m2 -= i;
+               s2 -= i;
+               }
+       if (b5 > 0) {
+               if (leftright) {
+                       if (m5 > 0) {
+                               mhi = pow5mult(mhi, m5);
+                               b1 = mult(mhi, b);
+                               Bfree(b);
+                               b = b1;
+                               }
+                       if (j = b5 - m5)
+                               b = pow5mult(b, j);
+                       }
+               else
+                       b = pow5mult(b, b5);
+               }
+       S = i2b(1);
+       if (s5 > 0)
+               S = pow5mult(S, s5);
+
+       /* Check for special case that d is a normalized power of 2. */
+
+       if (mode < 2) {
+               if (!word1(d) && !(word0(d) & Bndry_mask)
+#ifndef Sudden_Underflow
+                && word0(d) & Exp_mask
+#endif
+                               ) {
+                       /* The special case */
+                       b2 += Log2P;
+                       s2 += Log2P;
+                       spec_case = 1;
+                       }
+               else
+                       spec_case = 0;
+               }
+
+       /* Arrange for convenient computation of quotients:
+        * shift left if necessary so divisor has 4 leading 0 bits.
+        *
+        * Perhaps we should just compute leading 28 bits of S once
+        * and for all and pass them and a shift to quorem, so it
+        * can do shifts and ors to compute the numerator for q.
+        */
+#ifdef Pack_32
+       if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f)
+               i = 32 - i;
+#else
+       if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
+               i = 16 - i;
+#endif
+       if (i > 4) {
+               i -= 4;
+               b2 += i;
+               m2 += i;
+               s2 += i;
+               }
+       else if (i < 4) {
+               i += 28;
+               b2 += i;
+               m2 += i;
+               s2 += i;
+               }
+       if (b2 > 0)
+               b = lshift(b, b2);
+       if (s2 > 0)
+               S = lshift(S, s2);
+       if (k_check) {
+               if (cmp(b,S) < 0) {
+                       k--;
+                       b = multadd(b, 10, 0);  /* we botched the k estimate */
+                       if (leftright)
+                               mhi = multadd(mhi, 10, 0);
+                       ilim = ilim1;
+                       }
+               }
+       if (ilim <= 0 && mode > 2) {
+               if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
+                       /* no digits, fcvt style */
+ no_digits:
+                       k = -1 - ndigits;
+                       goto ret;
+                       }
+ one_digit:
+               *s++ = '1';
+               k++;
+               goto ret;
+               }
+       if (leftright) {
+               if (m2 > 0)
+                       mhi = lshift(mhi, m2);
+
+               /* Compute mlo -- check for special case
+                * that d is a normalized power of 2.
+                */
+
+               mlo = mhi;
+               if (spec_case) {
+                       mhi = Balloc(mhi->k);
+                       Bcopy(mhi, mlo);
+                       mhi = lshift(mhi, Log2P);
+                       }
+
+               for(i = 1;;i++) {
+                       dig = quorem(b,S) + '0';
+                       /* Do we yet have the shortest decimal string
+                        * that will round to d?
+                        */
+                       j = cmp(b, mlo);
+                       delta = diff(S, mhi);
+                       j1 = delta->sign ? 1 : cmp(b, delta);
+                       Bfree(delta);
+#ifndef ROUND_BIASED
+                       if (j1 == 0 && !mode && !(word1(d) & 1)) {
+                               if (dig == '9')
+                                       goto round_9_up;
+                               if (j > 0)
+                                       dig++;
+                               *s++ = dig;
+                               goto ret;
+                               }
+#endif
+                       if (j < 0 || j == 0 && !mode
+#ifndef ROUND_BIASED
+                                                       && !(word1(d) & 1)
+#endif
+                                       ) {
+                               if (j1 > 0) {
+                                       b = lshift(b, 1);
+                                       j1 = cmp(b, S);
+                                       if ((j1 > 0 || j1 == 0 && dig & 1)
+                                       && dig++ == '9')
+                                               goto round_9_up;
+                                       }
+                               *s++ = dig;
+                               goto ret;
+                               }
+                       if (j1 > 0) {
+                               if (dig == '9') { /* possible if i == 1 */
+ round_9_up:
+                                       *s++ = '9';
+                                       goto roundoff;
+                                       }
+                               *s++ = dig + 1;
+                               goto ret;
+                               }
+                       *s++ = dig;
+                       if (i == ilim)
+                               break;
+                       b = multadd(b, 10, 0);
+                       if (mlo == mhi)
+                               mlo = mhi = multadd(mhi, 10, 0);
+                       else {
+                               mlo = multadd(mlo, 10, 0);
+                               mhi = multadd(mhi, 10, 0);
+                               }
+                       }
+               }
+       else
+               for(i = 1;; i++) {
+                       *s++ = dig = quorem(b,S) + '0';
+                       if (i >= ilim)
+                               break;
+                       b = multadd(b, 10, 0);
+                       }
+
+       /* Round off last digit */
+
+       b = lshift(b, 1);
+       j = cmp(b, S);
+       if (j > 0 || j == 0 && dig & 1) {
+ roundoff:
+               while(*--s == '9')
+                       if (s == s0) {
+                               k++;
+                               *s++ = '1';
+                               goto ret;
+                               }
+               ++*s++;
+               }
+       else {
+               while(*--s == '0');
+               s++;
+               }
+ ret:
+       Bfree(S);
+       if (mhi) {
+               if (mlo && mlo != mhi)
+                       Bfree(mlo);
+               Bfree(mhi);
+               }
+ ret1:
+       Bfree(b);
+       if (s == s0) {                          /* don't return empty string */
+               *s++ = '0';
+               k = 0;
+       }
+       *s = 0;
+       *decpt = k + 1;
+       if (rve)
+               *rve = s;
+       return s0;
+       }
+#ifdef __cplusplus
+}
+#endif
diff --git a/stdlib.subproj/strtol.c b/stdlib.subproj/strtol.c
new file mode 100644 (file)
index 0000000..ad8302d
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <limits.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+
+
+/*
+ * Convert a string to a long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+long
+strtol(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s = nptr;
+       register unsigned long acc;
+       register int c;
+       register unsigned long cutoff;
+       register int neg = 0, any, cutlim;
+
+       /*
+        * Skip white space and pick up leading +/- sign if any.
+        * If base is 0, allow 0x for hex and 0 for octal, else
+        * assume decimal; if base is already 16, allow 0x.
+        */
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else if (c == '+')
+               c = *s++;
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+
+       /*
+        * Compute the cutoff value between legal numbers and illegal
+        * numbers.  That is the largest legal value, divided by the
+        * base.  An input number that is greater than this value, if
+        * followed by a legal input character, is too big.  One that
+        * is equal to this value may be valid or not; the limit
+        * between valid and invalid numbers is then based on the last
+        * digit.  For instance, if the range for longs is
+        * [-2147483648..2147483647] and the input base is 10,
+        * cutoff will be set to 214748364 and cutlim to either
+        * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
+        * a value > 214748364, or equal but the next digit is > 7 (or 8),
+        * the number is too big, and we will return a range error.
+        *
+        * Set any if any `digits' consumed; make it negative to indicate
+        * overflow.
+        */
+       cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
+       cutlim = cutoff % (unsigned long)base;
+       cutoff /= (unsigned long)base;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= base;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = neg ? LONG_MIN : LONG_MAX;
+               errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = (char *)(any ? s - 1 : nptr);
+       return (acc);
+}
diff --git a/stdlib.subproj/strtoq.c b/stdlib.subproj/strtoq.c
new file mode 100644 (file)
index 0000000..c099ba1
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+/*
+ * Convert a string to a quad integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+quad_t
+strtoq(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s;
+       register u_quad_t acc;
+       register int c;
+       register u_quad_t qbase, cutoff;
+       register int neg, any, cutlim;
+
+       /*
+        * Skip white space and pick up leading +/- sign if any.
+        * If base is 0, allow 0x for hex and 0 for octal, else
+        * assume decimal; if base is already 16, allow 0x.
+        */
+       s = nptr;
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else {
+               neg = 0;
+               if (c == '+')
+                       c = *s++;
+       }
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+
+       /*
+        * Compute the cutoff value between legal numbers and illegal
+        * numbers.  That is the largest legal value, divided by the
+        * base.  An input number that is greater than this value, if
+        * followed by a legal input character, is too big.  One that
+        * is equal to this value may be valid or not; the limit
+        * between valid and invalid numbers is then based on the last
+        * digit.  For instance, if the range for quads is
+        * [-9223372036854775808..9223372036854775807] and the input base
+        * is 10, cutoff will be set to 922337203685477580 and cutlim to
+        * either 7 (neg==0) or 8 (neg==1), meaning that if we have
+        * accumulated a value > 922337203685477580, or equal but the
+        * next digit is > 7 (or 8), the number is too big, and we will
+        * return a range error.
+        *
+        * Set any if any `digits' consumed; make it negative to indicate
+        * overflow.
+        */
+       qbase = (unsigned)base;
+       cutoff = neg ? -(u_quad_t)QUAD_MIN : QUAD_MAX;
+       cutlim = cutoff % qbase;
+       cutoff /= qbase;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= qbase;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = neg ? QUAD_MIN : QUAD_MAX;
+               errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = (char *)(any ? s - 1 : nptr);
+       return (acc);
+}
diff --git a/stdlib.subproj/strtoul.c b/stdlib.subproj/strtoul.c
new file mode 100644 (file)
index 0000000..e0ccb4d
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <limits.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/*
+ * Convert a string to an unsigned long integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+unsigned long
+strtoul(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s = nptr;
+       register unsigned long acc;
+       register int c;
+       register unsigned long cutoff;
+       register int neg = 0, any, cutlim;
+
+       /*
+        * See strtol for comments as to the logic used.
+        */
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else if (c == '+')
+               c = *s++;
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+       cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
+       cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= base;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = ULONG_MAX;
+               errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = (char *)(any ? s - 1 : nptr);
+       return (acc);
+}
diff --git a/stdlib.subproj/strtouq.c b/stdlib.subproj/strtouq.c
new file mode 100644 (file)
index 0000000..1fefc54
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+/*
+ * Convert a string to an unsigned quad integer.
+ *
+ * Ignores `locale' stuff.  Assumes that the upper and lower case
+ * alphabets and digits are each contiguous.
+ */
+u_quad_t
+strtouq(nptr, endptr, base)
+       const char *nptr;
+       char **endptr;
+       register int base;
+{
+       register const char *s = nptr;
+       register u_quad_t acc;
+       register int c;
+       register u_quad_t qbase, cutoff;
+       register int neg, any, cutlim;
+
+       /*
+        * See strtoq for comments as to the logic used.
+        */
+       s = nptr;
+       do {
+               c = *s++;
+       } while (isspace(c));
+       if (c == '-') {
+               neg = 1;
+               c = *s++;
+       } else { 
+               neg = 0;
+               if (c == '+')
+                       c = *s++;
+       }
+       if ((base == 0 || base == 16) &&
+           c == '0' && (*s == 'x' || *s == 'X')) {
+               c = s[1];
+               s += 2;
+               base = 16;
+       }
+       if (base == 0)
+               base = c == '0' ? 8 : 10;
+       qbase = (unsigned)base;
+       cutoff = (u_quad_t)UQUAD_MAX / qbase;
+       cutlim = (u_quad_t)UQUAD_MAX % qbase;
+       for (acc = 0, any = 0;; c = *s++) {
+               if (isdigit(c))
+                       c -= '0';
+               else if (isalpha(c))
+                       c -= isupper(c) ? 'A' - 10 : 'a' - 10;
+               else
+                       break;
+               if (c >= base)
+                       break;
+               if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
+                       any = -1;
+               else {
+                       any = 1;
+                       acc *= qbase;
+                       acc += c;
+               }
+       }
+       if (any < 0) {
+               acc = UQUAD_MAX;
+               errno = ERANGE;
+       } else if (neg)
+               acc = -acc;
+       if (endptr != 0)
+               *endptr = (char *)(any ? s - 1 : nptr);
+       return (acc);
+}
diff --git a/stdlib.subproj/system.c b/stdlib.subproj/system.c
new file mode 100644 (file)
index 0000000..f31e4db
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <paths.h>
+
+system(command)
+       const char *command;
+{
+       union wait pstat;
+       pid_t pid;
+       int omask;
+       sig_t intsave, quitsave;
+
+       if (!command)           /* just checking... */
+               return(1);
+
+       omask = sigblock(sigmask(SIGCHLD));
+       switch(pid = vfork()) {
+       case -1:                        /* error */
+               (void)sigsetmask(omask);
+               pstat.w_status = 0;
+               pstat.w_retcode = 127;
+               return(pstat.w_status);
+       case 0:                         /* child */
+               (void)sigsetmask(omask);
+               execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL);
+               _exit(127);
+       }
+       intsave = signal(SIGINT, SIG_IGN);
+       quitsave = signal(SIGQUIT, SIG_IGN);
+       pid = waitpid(pid, (int *)&pstat, 0);
+       (void)sigsetmask(omask);
+       (void)signal(SIGINT, intsave);
+       (void)signal(SIGQUIT, quitsave);
+       return(pid == -1 ? -1 : pstat.w_status);
+}
diff --git a/string.subproj/Makefile b/string.subproj/Makefile
new file mode 100644 (file)
index 0000000..85018cc
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = string
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+OTHERLINKED = strcmp.s
+
+CFILES = index.c memccpy.c memchr.c memcmp.c memset.c rindex.c\
+         rindix.c strcasecmp.c strchr.c strcoll.c strcspn.c strdup.c\
+         strerror.c strftime.c strmode.c strpbrk.c strsep.c strspn.c\
+         strstr.c strtok.c strxfrm.c swab.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+OTHERLINKEDOFILES = strcmp.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/string.subproj/Makefile.postamble b/string.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/string.subproj/Makefile.preamble b/string.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/string.subproj/PB.project b/string.subproj/PB.project
new file mode 100644 (file)
index 0000000..78cb76d
--- /dev/null
@@ -0,0 +1,47 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (
+            index.c, 
+            memccpy.c, 
+            memchr.c, 
+            memcmp.c, 
+            memset.c, 
+            rindex.c, 
+            rindix.c, 
+            strcasecmp.c, 
+            strchr.c, 
+            strcmp.s, 
+            strcoll.c, 
+            strcspn.c, 
+            strdup.c, 
+            strerror.c, 
+            strftime.c, 
+            strmode.c, 
+            strpbrk.c, 
+            strsep.c, 
+            strspn.c, 
+            strstr.c, 
+            strtok.c, 
+            strxfrm.c, 
+            swab.c
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = string; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/string.subproj/index.c b/string.subproj/index.c
new file mode 100644 (file)
index 0000000..673fa55
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <string.h>
+#include <stddef.h>
+
+char *
+#ifdef STRCHR
+strchr(p, ch)
+#else
+index(p, ch)
+#endif
+       register const char *p, ch;
+{
+       for (;; ++p) {
+               if (*p == ch)
+                       return((char *)p);
+               if (!*p)
+                       return((char *)NULL);
+       }
+       /* NOTREACHED */
+}
diff --git a/string.subproj/memccpy.c b/string.subproj/memccpy.c
new file mode 100644 (file)
index 0000000..d925f12
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+void *
+memccpy(t, f, c, n)
+       void *t;
+       const void *f;
+       int c;
+       register size_t n;
+{
+
+       if (n) {
+               register unsigned char *tp = t;
+               register const unsigned char *fp = f;
+               do {
+                       if ((*tp++ = *fp++) == c)
+                               return (t);
+               } while (--n != 0);
+       }
+       return (0);
+}
diff --git a/string.subproj/memchr.c b/string.subproj/memchr.c
new file mode 100644 (file)
index 0000000..000bf02
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)memchr.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+void *
+memchr(s, c, n)
+       const void *s;
+       register unsigned char c;
+       register size_t n;
+{
+       if (n != 0) {
+               register const unsigned char *p = s;
+
+               do {
+                       if (*p++ == c)
+                               return ((void *)(p - 1));
+               } while (--n != 0);
+       }
+       return (NULL);
+}
diff --git a/string.subproj/memcmp.c b/string.subproj/memcmp.c
new file mode 100644 (file)
index 0000000..a54399d
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Compare memory regions.
+ */
+int
+memcmp(s1, s2, n)
+       const void *s1, *s2;
+       size_t n;
+{
+       if (n != 0) {
+               register const unsigned char *p1 = s1, *p2 = s2;
+
+               do {
+                       if (*p1++ != *p2++)
+                               return (*--p1 - *--p2);
+               } while (--n != 0);
+       }
+       return (0);
+}
diff --git a/string.subproj/memset.c b/string.subproj/memset.c
new file mode 100644 (file)
index 0000000..6b0b3d8
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Mike Hibler and Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)memset.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+
+#include <limits.h>
+#include <string.h>
+
+#define        wsize   sizeof(u_int)
+#define        wmask   (wsize - 1)
+
+#ifdef BZERO
+#define        RETURN  return
+#define        VAL     0
+#define        WIDEVAL 0
+
+void
+bzero(dst0, length)
+       void *dst0;
+       register size_t length;
+#else
+#define        RETURN  return (dst0)
+#define        VAL     c0
+#define        WIDEVAL c
+
+void *
+memset(dst0, c0, length)
+       void *dst0;
+       register int c0;
+       register size_t length;
+#endif
+{
+       register size_t t;
+       register u_int c;
+       register u_char *dst;
+
+       dst = dst0;
+       /*
+        * If not enough words, just fill bytes.  A length >= 2 words
+        * guarantees that at least one of them is `complete' after
+        * any necessary alignment.  For instance:
+        *
+        *      |-----------|-----------|-----------|
+        *      |00|01|02|03|04|05|06|07|08|09|0A|00|
+        *                ^---------------------^
+        *               dst             dst+length-1
+        *
+        * but we use a minimum of 3 here since the overhead of the code
+        * to do word writes is substantial.
+        */ 
+       if (length < 3 * wsize) {
+               while (length != 0) {
+                       *dst++ = VAL;
+                       --length;
+               }
+               RETURN;
+       }
+
+#ifndef BZERO
+       if ((c = (u_char)c0) != 0) {    /* Fill the word. */
+               c = (c << 8) | c;       /* u_int is 16 bits. */
+#if UINT_MAX > 0xffff
+               c = (c << 16) | c;      /* u_int is 32 bits. */
+#endif
+#if UINT_MAX > 0xffffffff
+               c = (c << 32) | c;      /* u_int is 64 bits. */
+#endif
+       }
+#endif
+       /* Align destination by filling in bytes. */
+       if ((t = (int)dst & wmask) != 0) {
+               t = wsize - t;
+               length -= t;
+               do {
+                       *dst++ = VAL;
+               } while (--t != 0);
+       }
+
+       /* Fill words.  Length was >= 2*words so we know t >= 1 here. */
+       t = length / wsize;
+       do {
+               *(u_int *)dst = WIDEVAL;
+               dst += wsize;
+       } while (--t != 0);
+
+       /* Mop up trailing bytes, if any. */
+       t = length & wmask;
+       if (t != 0)
+               do {
+                       *dst++ = VAL;
+               } while (--t != 0);
+       RETURN;
+}
diff --git a/string.subproj/rindex.c b/string.subproj/rindex.c
new file mode 100644 (file)
index 0000000..c5eb97a
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stddef.h>
+#include <string.h>
+
+/* consider #define rindex strrchr */
+
+char *strrchr(p, ch)
+       register const char *p;
+       register int ch;
+{
+       register char *save;
+
+       for (save = NULL;; ++p) {
+               if (*p == ch)
+                       save = (char *)p;
+               if (!*p)
+                       return(save);
+       }
+       /* NOTREACHED */
+}
+
diff --git a/string.subproj/rindix.c b/string.subproj/rindix.c
new file mode 100644 (file)
index 0000000..ae1ae04
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/string/rindex.c
+ */
+
+#import        <string.h>
+
+#undef rindex
+
+char *rindex(const char *s, int c)
+{
+    return strrchr(s, c);
+}
+
+
+
diff --git a/string.subproj/strcasecmp.c b/string.subproj/strcasecmp.c
new file mode 100644 (file)
index 0000000..ab1b078
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1987, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strcasecmp.c       8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+typedef unsigned char u_char;
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static const u_char charmap[] = {
+       '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+       '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+       '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+       '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+       '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+       '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+       '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+       '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+       '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+       '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+       '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+       '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+       '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+       '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+       '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+       '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+       '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+       '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+       '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+       '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+       '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+       '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+       '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+       '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+       '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
+       '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
+       '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
+       '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
+       '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+       '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+       '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+       '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+int
+strcasecmp(s1, s2)
+       const char *s1, *s2;
+{
+       register const u_char *cm = charmap,
+                       *us1 = (const u_char *)s1,
+                       *us2 = (const u_char *)s2;
+
+       while (cm[*us1] == cm[*us2++])
+               if (*us1++ == '\0')
+                       return (0);
+       return (cm[*us1] - cm[*--us2]);
+}
+
+int
+strncasecmp(s1, s2, n)
+       const char *s1, *s2;
+       register size_t n;
+{
+       if (n != 0) {
+               register const u_char *cm = charmap,
+                               *us1 = (const u_char *)s1,
+                               *us2 = (const u_char *)s2;
+
+               do {
+                       if (cm[*us1] != cm[*us2++])
+                               return (cm[*us1] - cm[*--us2]);
+                       if (*us1++ == '\0')
+                               break;
+               } while (--n != 0);
+       }
+       return (0);
+}
diff --git a/string.subproj/strchr.c b/string.subproj/strchr.c
new file mode 100644 (file)
index 0000000..b99e5c9
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/string/strchr.c
+ *
+ *     This file contains machine independent code for string index
+ *
+ * HISTORY
+ * 24-Nov-92  Derek B Clegg (dclegg@next.com)
+ *     Created.
+ */
+#import <string.h>
+
+/* This routine needs to be optimized. */
+
+char *strchr(const char *s, int c)
+{
+    const char ch = c;
+
+    for ( ; *s != ch; s++)
+        if (*s == '\0')
+            return 0;
+    return (char *)s;
+}
diff --git a/string.subproj/strcmp.s b/string.subproj/strcmp.s
new file mode 100644 (file)
index 0000000..556ec2d
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+.text
+.globl _strcmp
+_strcmp:
+#if defined(__i386__)
+        movl    0x04(%esp),%eax
+        movl    0x08(%esp),%edx
+        jmp     L2                      /* Jump into the loop! */
+
+        .align  2,0x90
+L1:     incl    %eax
+        incl    %edx
+L2:     movb    (%eax),%cl
+        testb   %cl,%cl                 /* null terminator??? */
+        jz      L3
+        cmpb    %cl,(%edx)              /* chars match??? */
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        jne     L3
+        incl    %eax
+        incl    %edx
+        movb    (%eax),%cl
+        testb   %cl,%cl
+        jz      L3
+        cmpb    %cl,(%edx)
+        je      L1
+        .align 2, 0x90
+L3:     movzbl  (%eax),%eax             /* unsigned comparison */
+        movzbl  (%edx),%edx
+        subl    %edx,%eax
+        ret
+#elif defined(__ppc__)
+       mr      r5,r3
+1:     lbz     r3,0(r5)
+       addi    r5,r5,1
+       cmpwi   cr1,r3,0
+       lbz     r0,0(r4)
+       addi    r4,r4,1
+       subf.   r3,r0,r3
+       beqlr+  cr1
+       beq-    1b
+       blr
+#else
+#error strcmp is not defined for this architecture
+#endif
diff --git a/string.subproj/strcoll.c b/string.subproj/strcoll.c
new file mode 100644 (file)
index 0000000..e0d1ef1
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Compare strings according to LC_COLLATE category of current locale.
+ */
+int
+strcoll(s1, s2)
+       const char *s1, *s2;
+{
+       /* LC_COLLATE is unimplemented, hence always "C" */
+       return (strcmp(s1, s2));
+}
diff --git a/string.subproj/strcspn.c b/string.subproj/strcspn.c
new file mode 100644 (file)
index 0000000..61f7f9b
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Span the complement of string s2.
+ */
+size_t
+strcspn(s1, s2)
+       const char *s1;
+       register const char *s2;
+{
+       register const char *p, *spanp;
+       register char c, sc;
+
+       /*
+        * Stop as soon as we find any character from s2.  Note that there
+        * must be a NUL in s2; it suffices to stop when we find that, too.
+        */
+       for (p = s1;;) {
+               c = *p++;
+               spanp = s2;
+               do {
+                       if ((sc = *spanp++) == c)
+                               return (p - 1 - s1);
+               } while (sc != 0);
+       }
+       /* NOTREACHED */
+}
diff --git a/string.subproj/strdup.c b/string.subproj/strdup.c
new file mode 100644 (file)
index 0000000..a238f53
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *
+strdup(str)
+       const char *str;
+{
+       size_t len;
+       char *copy;
+
+       len = strlen(str) + 1;
+       if (!(copy = malloc((u_int)len)))
+               return (NULL);
+       bcopy(str, copy, len);
+       return (copy);
+}
diff --git a/string.subproj/strerror.c b/string.subproj/strerror.c
new file mode 100644 (file)
index 0000000..d0b5693
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <string.h>
+
+#define        UPREFIX "Unknown error: "
+static char ebuf[40] = UPREFIX;                /* 64-bit number + slop */
+
+char *
+strerror(num)
+       int num;
+{
+       extern const int sys_nerr;
+       extern const char *const sys_errlist[];
+       register unsigned int errnum;
+       register char *p, *t;
+       char tmp[40];
+
+       errnum = num;                           /* convert to unsigned */
+       if (errnum < sys_nerr)
+               return((char*)sys_errlist[errnum]);
+
+       /* Do this by hand, so we don't include stdio(3). */
+       t = tmp;
+       do {
+               *t++ = "0123456789"[errnum % 10];
+       } while (errnum /= 10);
+       for (p = ebuf + sizeof(UPREFIX) - 1;;) {
+               *p++ = *--t;
+               if (t <= tmp)
+                       break;
+       }
+       return(ebuf);
+}
diff --git a/string.subproj/strftime.c b/string.subproj/strftime.c
new file mode 100644 (file)
index 0000000..beff35e
--- /dev/null
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <tzfile.h>
+#include <string.h>
+
+static char *afmt[] = {
+       "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
+};
+static char *Afmt[] = {
+       "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
+       "Saturday",
+};
+static char *bfmt[] = {
+       "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
+       "Oct", "Nov", "Dec",
+};
+static char *Bfmt[] = {
+       "January", "February", "March", "April", "May", "June", "July",
+       "August", "September", "October", "November", "December",
+};
+
+static size_t gsize;
+static char *pt;
+static int _add __P((char *));
+static int _conv __P((int, int, int));
+static int _secs __P((const struct tm *));
+static size_t _fmt __P((const char *, const struct tm *));
+
+size_t
+strftime(s, maxsize, format, t)
+       char *s;
+       size_t maxsize;
+       const char *format;
+       const struct tm *t;
+{
+
+       pt = s;
+       if ((gsize = maxsize) < 1)
+               return(0);
+       if (_fmt(format, t)) {
+               *pt = '\0';
+               return(maxsize - gsize);
+       }
+       return(0);
+}
+
+static size_t
+_fmt(format, t)
+       register const char *format;
+       const struct tm *t;
+{
+       for (; *format; ++format) {
+               if (*format == '%')
+                       switch(*++format) {
+                       case '\0':
+                               --format;
+                               break;
+                       case 'A':
+                               if (t->tm_wday < 0 || t->tm_wday > 6)
+                                       return(0);
+                               if (!_add(Afmt[t->tm_wday]))
+                                       return(0);
+                               continue;
+                       case 'a':
+                               if (t->tm_wday < 0 || t->tm_wday > 6)
+                                       return(0);
+                               if (!_add(afmt[t->tm_wday]))
+                                       return(0);
+                               continue;
+                       case 'B':
+                               if (t->tm_mon < 0 || t->tm_mon > 11)
+                                       return(0);
+                               if (!_add(Bfmt[t->tm_mon]))
+                                       return(0);
+                               continue;
+                       case 'b':
+                       case 'h':
+                               if (t->tm_mon < 0 || t->tm_mon > 11)
+                                       return(0);
+                               if (!_add(bfmt[t->tm_mon]))
+                                       return(0);
+                               continue;
+                       case 'C':
+                               if (!_fmt("%a %b %e %H:%M:%S %Y", t))
+                                       return(0);
+                               continue;
+                       case 'c':
+                               if (!_fmt("%m/%d/%y %H:%M:%S", t))
+                                       return(0);
+                               continue;
+                       case 'D':
+                               if (!_fmt("%m/%d/%y", t))
+                                       return(0);
+                               continue;
+                       case 'd':
+                               if (!_conv(t->tm_mday, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'e':
+                               if (!_conv(t->tm_mday, 2, ' '))
+                                       return(0);
+                               continue;
+                       case 'H':
+                               if (!_conv(t->tm_hour, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'I':
+                               if (!_conv(t->tm_hour % 12 ?
+                                   t->tm_hour % 12 : 12, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'j':
+                               if (!_conv(t->tm_yday + 1, 3, '0'))
+                                       return(0);
+                               continue;
+                       case 'k':
+                               if (!_conv(t->tm_hour, 2, ' '))
+                                       return(0);
+                               continue;
+                       case 'l':
+                               if (!_conv(t->tm_hour % 12 ?
+                                   t->tm_hour % 12 : 12, 2, ' '))
+                                       return(0);
+                               continue;
+                       case 'M':
+                               if (!_conv(t->tm_min, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'm':
+                               if (!_conv(t->tm_mon + 1, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'n':
+                               if (!_add("\n"))
+                                       return(0);
+                               continue;
+                       case 'p':
+                               if (!_add(t->tm_hour >= 12 ? "PM" : "AM"))
+                                       return(0);
+                               continue;
+                       case 'R':
+                               if (!_fmt("%H:%M", t))
+                                       return(0);
+                               continue;
+                       case 'r':
+                               if (!_fmt("%I:%M:%S %p", t))
+                                       return(0);
+                               continue;
+                       case 'S':
+                               if (!_conv(t->tm_sec, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 's':
+                               if (!_secs(t))
+                                       return(0);
+                               continue;
+                       case 'T':
+                       case 'X':
+                               if (!_fmt("%H:%M:%S", t))
+                                       return(0);
+                               continue;
+                       case 't':
+                               if (!_add("\t"))
+                                       return(0);
+                               continue;
+                       case 'U':
+                               if (!_conv((t->tm_yday + 7 - t->tm_wday) / 7,
+                                   2, '0'))
+                                       return(0);
+                               continue;
+                       case 'W':
+                               if (!_conv((t->tm_yday + 7 -
+                                   (t->tm_wday ? (t->tm_wday - 1) : 6))
+                                   / 7, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'w':
+                               if (!_conv(t->tm_wday, 1, '0'))
+                                       return(0);
+                               continue;
+                       case 'x':
+                               if (!_fmt("%m/%d/%y", t))
+                                       return(0);
+                               continue;
+                       case 'y':
+                               if (!_conv((t->tm_year + TM_YEAR_BASE)
+                                   % 100, 2, '0'))
+                                       return(0);
+                               continue;
+                       case 'Y':
+                               if (!_conv(t->tm_year + TM_YEAR_BASE, 4, '0'))
+                                       return(0);
+                               continue;
+                       case 'Z':
+                               if (!t->tm_zone || !_add(t->tm_zone))
+                                       return(0);
+                               continue;
+                       case '%':
+                       /*
+                        * X311J/88-090 (4.12.3.5): if conversion char is
+                        * undefined, behavior is undefined.  Print out the
+                        * character itself as printf(3) does.
+                        */
+                       default:
+                               break;
+               }
+               if (!gsize--)
+                       return(0);
+               *pt++ = *format;
+       }
+       return(gsize);
+}
+
+static int
+_secs(t)
+       const struct tm *t;
+{
+       static char buf[15];
+       register time_t s;
+       register char *p;
+       struct tm tmp;
+
+       /* Make a copy, mktime(3) modifies the tm struct. */
+       tmp = *t;
+       s = mktime(&tmp);
+       for (p = buf + sizeof(buf) - 2; s > 0 && p > buf; s /= 10)
+               *p-- = s % 10 + '0';
+       return(_add(++p));
+}
+
+static int
+_conv(n, digits, pad)
+       int n, digits, pad;
+{
+       static char buf[10];
+       register char *p;
+
+       for (p = buf + sizeof(buf) - 2; n > 0 && p > buf; n /= 10, --digits)
+               *p-- = n % 10 + '0';
+       while (p > buf && digits-- > 0)
+               *p-- = pad;
+       return(_add(++p));
+}
+
+static int
+_add(str)
+       register char *str;
+{
+       for (;; ++pt, --gsize) {
+               if (!gsize)
+                       return(0);
+               if (!(*pt = *str++))
+                       return(1);
+       }
+}
diff --git a/string.subproj/strmode.c b/string.subproj/strmode.c
new file mode 100644 (file)
index 0000000..462b945
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+
+void
+strmode(mode, p)
+       register mode_t mode;
+       register char *p;
+{
+        /* print type */
+       switch (mode & S_IFMT) {
+       case S_IFDIR:                   /* directory */
+               *p++ = 'd';
+               break;
+       case S_IFCHR:                   /* character special */
+               *p++ = 'c';
+               break;
+       case S_IFBLK:                   /* block special */
+               *p++ = 'b';
+               break;
+       case S_IFREG:                   /* regular */
+               *p++ = '-';
+               break;
+       case S_IFLNK:                   /* symbolic link */
+               *p++ = 'l';
+               break;
+       case S_IFSOCK:                  /* socket */
+               *p++ = 's';
+               break;
+#ifdef S_IFIFO
+       case S_IFIFO:                   /* fifo */
+               *p++ = 'p';
+               break;
+#endif
+#ifdef S_IFWHT
+       case S_IFWHT:                   /* whiteout */
+               *p++ = 'w';
+               break;
+#endif
+       default:                        /* unknown */
+               *p++ = '?';
+               break;
+       }
+       /* usr */
+       if (mode & S_IRUSR)
+               *p++ = 'r';
+       else
+               *p++ = '-';
+       if (mode & S_IWUSR)
+               *p++ = 'w';
+       else
+               *p++ = '-';
+       switch (mode & (S_IXUSR | S_ISUID)) {
+       case 0:
+               *p++ = '-';
+               break;
+       case S_IXUSR:
+               *p++ = 'x';
+               break;
+       case S_ISUID:
+               *p++ = 'S';
+               break;
+       case S_IXUSR | S_ISUID:
+               *p++ = 's';
+               break;
+       }
+       /* group */
+       if (mode & S_IRGRP)
+               *p++ = 'r';
+       else
+               *p++ = '-';
+       if (mode & S_IWGRP)
+               *p++ = 'w';
+       else
+               *p++ = '-';
+       switch (mode & (S_IXGRP | S_ISGID)) {
+       case 0:
+               *p++ = '-';
+               break;
+       case S_IXGRP:
+               *p++ = 'x';
+               break;
+       case S_ISGID:
+               *p++ = 'S';
+               break;
+       case S_IXGRP | S_ISGID:
+               *p++ = 's';
+               break;
+       }
+       /* other */
+       if (mode & S_IROTH)
+               *p++ = 'r';
+       else
+               *p++ = '-';
+       if (mode & S_IWOTH)
+               *p++ = 'w';
+       else
+               *p++ = '-';
+       switch (mode & (S_IXOTH | S_ISVTX)) {
+       case 0:
+               *p++ = '-';
+               break;
+       case S_IXOTH:
+               *p++ = 'x';
+               break;
+       case S_ISVTX:
+               *p++ = 'T';
+               break;
+       case S_IXOTH | S_ISVTX:
+               *p++ = 't';
+               break;
+       }
+       *p++ = ' ';             /* will be a '+' if ACL's implemented */
+       *p = '\0';
+}
diff --git a/string.subproj/strpbrk.c b/string.subproj/strpbrk.c
new file mode 100644 (file)
index 0000000..7a68733
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1985, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Find the first occurrence in s1 of a character in s2 (excluding NUL).
+ */
+char *
+strpbrk(s1, s2)
+       register const char *s1, *s2;
+{
+       register const char *scanp;
+       register int c, sc;
+
+       while ((c = *s1++) != 0) {
+               for (scanp = s2; (sc = *scanp++) != 0;)
+                       if (sc == c)
+                               return ((char *)(s1 - 1));
+       }
+       return (NULL);
+}
diff --git a/string.subproj/strsep.c b/string.subproj/strsep.c
new file mode 100644 (file)
index 0000000..8b43f33
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <string.h>
+#include <stdio.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strsep.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * Get next token from string *stringp, where tokens are possibly-empty
+ * strings separated by characters from delim.  
+ *
+ * Writes NULs into the string at *stringp to end tokens.
+ * delim need not remain constant from call to call.
+ * On return, *stringp points past the last NUL written (if there might
+ * be further tokens), or is NULL (if there are definitely no more tokens).
+ *
+ * If *stringp is NULL, strsep returns NULL.
+ */
+char *
+strsep(stringp, delim)
+       register char **stringp;
+       register const char *delim;
+{
+       register char *s;
+       register const char *spanp;
+       register int c, sc;
+       char *tok;
+
+       if ((s = *stringp) == NULL)
+               return (NULL);
+       for (tok = s;;) {
+               c = *s++;
+               spanp = delim;
+               do {
+                       if ((sc = *spanp++) == c) {
+                               if (c == 0)
+                                       s = NULL;
+                               else
+                                       s[-1] = 0;
+                               *stringp = s;
+                               return (tok);
+                       }
+               } while (sc != 0);
+       }
+       /* NOTREACHED */
+}
diff --git a/string.subproj/strspn.c b/string.subproj/strspn.c
new file mode 100644 (file)
index 0000000..5e496f2
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Span the string s2 (skip characters that are in s2).
+ */
+size_t
+strspn(s1, s2)
+       const char *s1;
+       register const char *s2;
+{
+       register const char *p = s1, *spanp;
+       register char c, sc;
+
+       /*
+        * Skip any characters in s2, excluding the terminating \0.
+        */
+cont:
+       c = *p++;
+       for (spanp = s2; (sc = *spanp++) != 0;)
+               if (sc == c)
+                       goto cont;
+       return (p - 1 - s1);
+}
diff --git a/string.subproj/strstr.c b/string.subproj/strstr.c
new file mode 100644 (file)
index 0000000..6ec3d6d
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Find the first occurrence of find in s.
+ */
+char *
+strstr(s, find)
+       register const char *s, *find;
+{
+       register char c, sc;
+       register size_t len;
+
+       if ((c = *find++) != 0) {
+               len = strlen(find);
+               do {
+                       do {
+                               if ((sc = *s++) == 0)
+                                       return (NULL);
+                       } while (sc != c);
+               } while (strncmp(s, find, len) != 0);
+               s--;
+       }
+       return ((char *)s);
+}
diff --git a/string.subproj/strtok.c b/string.subproj/strtok.c
new file mode 100644 (file)
index 0000000..16521c3
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stddef.h>
+#include <string.h>
+
+char *
+strtok(s, delim)
+       register char *s;
+       register const char *delim;
+{
+       register char *spanp;
+       register int c, sc;
+       char *tok;
+       static char *last;
+
+
+       if (s == NULL && (s = last) == NULL)
+               return (NULL);
+
+       /*
+        * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
+        */
+cont:
+       c = *s++;
+       for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
+               if (c == sc)
+                       goto cont;
+       }
+
+       if (c == 0) {           /* no non-delimiter characters */
+               last = NULL;
+               return (NULL);
+       }
+       tok = s - 1;
+
+       /*
+        * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
+        * Note that delim must have one NUL; we stop if we see that, too.
+        */
+       for (;;) {
+               c = *s++;
+               spanp = (char *)delim;
+               do {
+                       if ((sc = *spanp++) == c) {
+                               if (c == 0)
+                                       s = NULL;
+                               else
+                                       s[-1] = 0;
+                               last = s;
+                               return (tok);
+                       }
+               } while (sc != 0);
+       }
+       /* NOTREACHED */
+}
diff --git a/string.subproj/strxfrm.c b/string.subproj/strxfrm.c
new file mode 100644 (file)
index 0000000..0153076
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/cdefs.h>
+#include <string.h>
+
+/*
+ * Transform src, storing the result in dst, such that
+ * strcmp() on transformed strings returns what strcoll()
+ * on the original untransformed strings would return.
+ */
+size_t
+strxfrm(dst, src, n)
+       register char *dst;
+       const char *src;
+       size_t n;
+{
+       register size_t srclen, copysize;
+
+       /*
+        * Since locales are unimplemented, this is just a copy.
+        */
+       srclen = strlen(src);
+       if (n != 0) {
+               copysize = srclen < n ? srclen : n - 1;
+               (void)memcpy(dst, src, copysize);
+               dst[copysize] = 0;
+       }
+       return (srclen);
+}
diff --git a/string.subproj/swab.c b/string.subproj/swab.c
new file mode 100644 (file)
index 0000000..e229855
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Jeffrey Mogul.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <string.h>
+
+void
+swab(from, to, len)
+       const void *from;
+       void *to;
+       size_t len;
+{
+       register unsigned long temp;
+       register int n;
+       register char *fp, *tp;
+
+       n = (len >> 1) + 1;
+       fp = (char *)from;
+       tp = (char *)to;
+#define        STEP    temp = *fp++,*tp++ = *fp++,*tp++ = temp
+       /* round to multiple of 8 */
+       while ((--n) & 07)
+               STEP;
+       n >>= 3;
+       while (--n >= 0) {
+               STEP; STEP; STEP; STEP;
+               STEP; STEP; STEP; STEP;
+       }
+}
diff --git a/sys.subproj/Makefile b/sys.subproj/Makefile
new file mode 100644 (file)
index 0000000..705fdfa
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = sys
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = sigcatch.h
+
+CFILES = errno.c getdtablesize.c gettimeofday.c sigaction.c sigcatch.c\
+         sigprocmask.c sigsuspend.c sigtramp.c
+
+SUBPROJECTS = i386.subproj ppc.subproj
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble msync.2\
+            sem_close.2 sem_open.2 sem_post.2 sem_trywait.2\
+            sem_unlink.2 sem_wait.2 shm_open.2 shm_unlink.2
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/sys.subproj/Makefile.postamble b/sys.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..6b33f70
--- /dev/null
@@ -0,0 +1,106 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
+
+MAN2DIR=/usr/share/man/man2
+
+install-man:
+       install -m 755 -d $(DSTROOT)$(MAN2DIR)
+       install -m 444 -c *.2 $(DSTROOT)$(MAN2DIR)
diff --git a/sys.subproj/Makefile.preamble b/sys.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..eda7efc
--- /dev/null
@@ -0,0 +1,139 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+AFTER_POSTINSTALL = install-man
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/sys.subproj/PB.project b/sys.subproj/PB.project
new file mode 100644 (file)
index 0000000..d57c398
--- /dev/null
@@ -0,0 +1,45 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (sigcatch.h); 
+        OTHER_LINKED = (
+            errno.c, 
+            getdtablesize.c, 
+            gettimeofday.c, 
+            sigaction.c, 
+            sigcatch.c, 
+            sigprocmask.c, 
+            sigsuspend.c, 
+            sigtramp.c
+        ); 
+        OTHER_SOURCES = (
+            Makefile.preamble, 
+            Makefile, 
+            Makefile.postamble, 
+            msync.2, 
+            sem_close.2, 
+            sem_open.2, 
+            sem_post.2, 
+            sem_trywait.2, 
+            sem_unlink.2, 
+            sem_wait.2, 
+            shm_open.2, 
+            shm_unlink.2
+        ); 
+        SUBPROJECTS = (i386.subproj, ppc.subproj); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = sys; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/sys.subproj/errno.c b/sys.subproj/errno.c
new file mode 100644 (file)
index 0000000..9539d89
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
+ * Reserved.  This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+ * Source License Version 1.1 (the "License").  You may not use this file
+ * except in compliance with the License.  Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+/*
+ * The world-renowned global variable
+ */
+#include <pthread_internals.h>
+
+#undef errno
+extern int errno;
+int *__error(void) {
+    pthread_t self = pthread_self();
+    /* If we're not a detached pthread, just return the global errno */
+    if ((self == (pthread_t)0) || (self->sig != _PTHREAD_SIG) || (self->detached == _PTHREAD_CREATE_PARENT)) {
+        return &errno;
+    }
+    return &self->err_no;
+}
+
+int cthread_errno(void) {
+        return *__error();
+}
+
diff --git a/sys.subproj/getdtablesize.c b/sys.subproj/getdtablesize.c
new file mode 100644 (file)
index 0000000..c25bf90
--- /dev/null
@@ -0,0 +1,5 @@
+#include <unistd.h>
+
+int getdtablesize() {
+    return sysconf(_SC_OPEN_MAX);
+}
diff --git a/sys.subproj/gettimeofday.c b/sys.subproj/gettimeofday.c
new file mode 100644 (file)
index 0000000..d07239b
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ *
+ *     File:   libc/sys/gettimeofday.c
+ */
+
+#include <time.h>
+#include <tzfile.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+int gettimeofday (struct timeval *tp, struct timezone *tzp)
+{
+        static int validtz = 0;
+        static struct timezone cached_tz = {0};
+
+        if (syscall (SYS_gettimeofday, tp, tzp) < 0) {
+                return (-1);
+        }
+        if (validtz == 0)  {
+               struct tm *localtm = localtime ((time_t *)&tp->tv_sec);
+                cached_tz.tz_dsttime = localtm->tm_isdst;
+                cached_tz.tz_minuteswest =
+                        (-localtm->tm_gmtoff / SECSPERMIN) +
+                        (localtm->tm_isdst * MINSPERHOUR);
+                validtz = 1;
+        }
+        if (tzp) {
+          tzp->tz_dsttime = cached_tz.tz_dsttime;
+          tzp->tz_minuteswest = cached_tz.tz_minuteswest;
+        }
+        return (0);
+}
diff --git a/sys.subproj/i386.subproj/ATPgetreq.s b/sys.subproj/i386.subproj/ATPgetreq.s
new file mode 100644 (file)
index 0000000..3e47b64
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATPgetreq, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/ATPgetrsp.s b/sys.subproj/i386.subproj/ATPgetrsp.s
new file mode 100644 (file)
index 0000000..4f995b5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATPgetrsp, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/ATPsndreq.s b/sys.subproj/i386.subproj/ATPsndreq.s
new file mode 100644 (file)
index 0000000..7f35022
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATPsndreq, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/ATPsndrsp.s b/sys.subproj/i386.subproj/ATPsndrsp.s
new file mode 100644 (file)
index 0000000..1207b67
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATPsndrsp, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/ATgetmsg.s b/sys.subproj/i386.subproj/ATgetmsg.s
new file mode 100644 (file)
index 0000000..9bc673a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATgetmsg, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/ATputmsg.s b/sys.subproj/i386.subproj/ATputmsg.s
new file mode 100644 (file)
index 0000000..648d0a7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATputmsg, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/ATsocket.s b/sys.subproj/i386.subproj/ATsocket.s
new file mode 100644 (file)
index 0000000..682c64c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ATsocket, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/Makefile b/sys.subproj/i386.subproj/Makefile
new file mode 100644 (file)
index 0000000..fd962c5
--- /dev/null
@@ -0,0 +1,127 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = i386
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = SYS.h
+
+OTHERLINKED = ATsocket.s ATgetmsg.s ATputmsg.s ATPsndreq.s ATPsndrsp.s\
+              ATPgetreq.s ATPgetrsp.s accept.s access.s acct.s\
+              add_profil.s adjtime.s bind.s cerror.s chdir.s\
+              checkuseraccess.s chflags.s chmod.s chown.s chroot.s\
+              close.s connect.s dup.s dup2.s exchangedata.s execve.s\
+              _exit.s fchdir.s fchflags.s fchmod.s fchown.s fcntl.s\
+              flock.s fork.s fpathconf.s fstat.s fstatfs.s fstatv.s\
+              fsync.s ftruncate.s getattrlist.s getdirentries.s\
+              getdirentriesattr.s getegid.s geteuid.s getfh.s\
+              getfsstat.s getgid.s getgroups.s getitimer.s _getlogin.s\
+              getpeername.s getpgrp.s getpid.s getppid.s getpriority.s\
+              getrlimit.s getrusage.s getsockname.s getsockopt.s\
+              getuid.s ioctl.s kill.s ktrace.s lfs_bmapv.s\
+              lfs_markv.s lfs_segclean.s lfs_segwait.s link.s listen.s\
+              lseek.s lstat.s lstatv.s madvise.s mincore.s minherit.s\
+              mkcomplex.s mkdir.s mkfifo.s mknod.s mlock.s mlockall.s\
+              mmap.s mount.s mprotect.s msgctl.s msgget.s msgrcv.s\
+              msgsnd.s msgsys.s msync.s munlock.s munlockall.s\
+              munmap.s nfssvc.s open.s pathconf.s pipe.s profil.s\
+              ptrace.s quota.s quotactl.s read.s readlink.s readv.s\
+              reboot.s recvfrom.s recvmsg.s rename.s revoke.s rmdir.s\
+              searchfs.s select.s semconfig.s semctl.s semget.s\
+              semop.s semsys.s sendmsg.s sendto.s setattrlist.s\
+              setegid.s seteuid.s setgid.s setgroups.s setitimer.s\
+              setjmp.s _setjmp.s _setlogin.s setpgid.s setpriority.s\
+              setprivexec.s setquota.s setrlimit.s setsid.s\
+              setsockopt.s settimeofday.s setuid.s shmat.s shmctl.s\
+              shmdt.s shmget.s shmsys.s shm_open.s shm_unlink.s\
+              shutdown.s sigaltstack.s sigpending.s sigreturn.s\
+              socket.s socketpair.s stat.s statfs.s statv.s swapon.s\
+              symlink.s sync.s syscall.s _sysctl.s table.s truncate.s\
+              umask.s undelete.s unlink.s unmount.s utimes.s vfork.s\
+              wait4.s write.s writev.s sem_close.s sem_destroy.s\
+              sem_getvalue.s sem_init.s sem_open.s sem_post.s\
+              sem_trywait.s sem_unlink.s sem_wait.s load_shared_file.s\
+             reset_shared_file.s
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+OTHERLINKEDOFILES = ATsocket.o ATgetmsg.o ATputmsg.o ATPsndreq.o\
+                    ATPsndrsp.o ATPgetreq.o ATPgetrsp.o accept.o\
+                    access.o acct.o add_profil.o adjtime.o bind.o\
+                    cerror.o chdir.o checkuseraccess.o chflags.o\
+                    chmod.o chown.o chroot.o close.o connect.o dup.o\
+                    dup2.o exchangedata.o execve.o _exit.o fchdir.o\
+                    fchflags.o fchmod.o fchown.o fcntl.o flock.o\
+                    fork.o fpathconf.o fstat.o fstatfs.o fstatv.o\
+                    fsync.o ftruncate.o getattrlist.o getdirentries.o\
+                    getdirentriesattr.o getegid.o geteuid.o getfh.o\
+                    getfsstat.o getgid.o getgroups.o getitimer.o\
+                    _getlogin.o getpeername.o getpgrp.o getpid.o\
+                    getppid.o getpriority.o getrlimit.o getrusage.o\
+                    getsockname.o getsockopt.o getuid.o ioctl.o kill.o\
+                    ktrace.o lfs_bmapv.o lfs_markv.o lfs_segclean.o\
+                    lfs_segwait.o link.o listen.o lseek.o lstat.o\
+                    lstatv.o madvise.o mincore.o minherit.o\
+                    mkcomplex.o mkdir.o mkfifo.o mknod.o mlock.o\
+                    mlockall.o mmap.o mount.o mprotect.o msgctl.o\
+                    msgget.o msgrcv.o msgsnd.o msgsys.o msync.o\
+                    munlock.o munlockall.o munmap.o nfssvc.o open.o\
+                    pathconf.o pipe.o profil.o ptrace.o quota.o\
+                    quotactl.o read.o readlink.o readv.o reboot.o\
+                    recvfrom.o recvmsg.o rename.o revoke.o rmdir.o\
+                    searchfs.o select.o semconfig.o semctl.o semget.o\
+                    semop.o semsys.o sendmsg.o sendto.o setattrlist.o\
+                    setegid.o seteuid.o setgid.o setgroups.o\
+                    setitimer.o setjmp.o _setjmp.o _setlogin.o\
+                    setpgid.o setpriority.o setprivexec.o setquota.o\
+                    setrlimit.o setsid.o setsockopt.o settimeofday.o\
+                    setuid.o shmat.o shmctl.o shmdt.o shmget.o\
+                    shmsys.o shm_open.o shm_unlink.o shutdown.o\
+                    sigaltstack.o sigpending.o sigreturn.o socket.o\
+                    socketpair.o stat.o statfs.o statv.o swapon.o\
+                    symlink.o sync.o syscall.o _sysctl.o table.o\
+                    truncate.o umask.o undelete.o unlink.o unmount.o\
+                    utimes.o vfork.o wait4.o write.o writev.o\
+                    sem_close.o sem_destroy.o sem_getvalue.o sem_init.o\
+                    sem_open.o sem_post.o sem_trywait.o sem_unlink.o\
+                    sem_wait.o load_shared_file.o reset_shared_file.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/SandBox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/sys.subproj/i386.subproj/Makefile.postamble b/sys.subproj/i386.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/sys.subproj/i386.subproj/Makefile.preamble b/sys.subproj/i386.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..6544e5f
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+INCLUDED_ARCHS = i386
diff --git a/sys.subproj/i386.subproj/PB.project b/sys.subproj/i386.subproj/PB.project
new file mode 100644 (file)
index 0000000..2e0da04
--- /dev/null
@@ -0,0 +1,211 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (SYS.h); 
+        OTHER_LINKED = (
+            ATsocket.s, 
+            ATgetmsg.s, 
+            ATputmsg.s, 
+            ATPsndreq.s, 
+            ATPsndrsp.s, 
+            ATPgetreq.s, 
+            ATPgetrsp.s, 
+            accept.s, 
+            access.s, 
+            acct.s, 
+            add_profil.s, 
+            adjtime.s, 
+            bind.s, 
+            cerror.s, 
+            chdir.s, 
+            checkuseraccess.s, 
+            chflags.s, 
+            chmod.s, 
+            chown.s, 
+            chroot.s, 
+            close.s, 
+            connect.s, 
+            dup.s, 
+            dup2.s, 
+            exchangedata.s, 
+            execve.s, 
+            _exit.s, 
+            fchdir.s, 
+            fchflags.s, 
+            fchmod.s, 
+            fchown.s, 
+            fcntl.s, 
+            flock.s, 
+            fork.s, 
+            fpathconf.s, 
+            fstat.s, 
+            fstatfs.s, 
+            fstatv.s, 
+            fsync.s, 
+            ftruncate.s, 
+            getattrlist.s, 
+            getdirentries.s, 
+            getdirentriesattr.s, 
+            getegid.s, 
+            geteuid.s, 
+            getfh.s, 
+            getfsstat.s, 
+            getgid.s, 
+            getgroups.s, 
+            getitimer.s, 
+            _getlogin.s, 
+            getpeername.s, 
+            getpgrp.s, 
+            getpid.s, 
+            getppid.s, 
+            getpriority.s, 
+            getrlimit.s, 
+            getrusage.s, 
+            getsockname.s, 
+            getsockopt.s, 
+            getuid.s, 
+            ioctl.s, 
+            kill.s, 
+            ktrace.s, 
+            lfs_bmapv.s, 
+            lfs_markv.s, 
+            lfs_segclean.s, 
+            lfs_segwait.s, 
+            link.s, 
+            listen.s, 
+            lseek.s, 
+            lstat.s, 
+            lstatv.s, 
+            madvise.s, 
+            mincore.s, 
+            minherit.s, 
+            mkcomplex.s, 
+            mkdir.s, 
+            mkfifo.s, 
+            mknod.s, 
+            mlock.s, 
+            mlockall.s, 
+            mmap.s, 
+            mount.s, 
+            mprotect.s, 
+            msgctl.s, 
+            msgget.s, 
+            msgrcv.s, 
+            msgsnd.s, 
+            msgsys.s, 
+            msync.s, 
+            munlock.s, 
+            munlockall.s, 
+            munmap.s, 
+            nfssvc.s, 
+            open.s, 
+            pathconf.s, 
+            pipe.s, 
+            profil.s, 
+            ptrace.s, 
+            quota.s, 
+            quotactl.s, 
+            read.s, 
+            readlink.s, 
+            readv.s, 
+            reboot.s, 
+            recvfrom.s, 
+            recvmsg.s, 
+            rename.s, 
+            revoke.s, 
+            rmdir.s, 
+            searchfs.s, 
+            select.s, 
+            semconfig.s, 
+            semctl.s, 
+            semget.s, 
+            semop.s, 
+            semsys.s, 
+            sendmsg.s, 
+            sendto.s, 
+            setattrlist.s, 
+            setegid.s, 
+            seteuid.s, 
+            setgid.s, 
+            setgroups.s, 
+            setitimer.s, 
+            setjmp.s, 
+            _setjmp.s, 
+            _setlogin.s, 
+            setpgid.s, 
+            setpriority.s, 
+            setprivexec.s, 
+            setquota.s, 
+            setrlimit.s, 
+            setsid.s, 
+            setsockopt.s, 
+            settimeofday.s, 
+            setuid.s, 
+            shmat.s, 
+            shmctl.s, 
+            shmdt.s, 
+            shmget.s, 
+            shmsys.s, 
+            shm_open.s, 
+            shm_unlink.s, 
+            shutdown.s, 
+            sigaltstack.s, 
+            sigpending.s, 
+            sigreturn.s, 
+            socket.s, 
+            socketpair.s, 
+            stat.s, 
+            statfs.s, 
+            statv.s, 
+            swapon.s, 
+            symlink.s, 
+            sync.s, 
+            syscall.s, 
+            _sysctl.s, 
+            table.s, 
+            truncate.s, 
+            umask.s, 
+            undelete.s, 
+            unlink.s, 
+            unmount.s, 
+            utimes.s, 
+            vfork.s, 
+            wait4.s, 
+            write.s, 
+            writev.s, 
+            sem_close.s, 
+            sem_destroy.s, 
+            sem_getvalue.s, 
+            sem_init.s, 
+            sem_open.s, 
+            sem_post.s, 
+            sem_trywait.s, 
+            sem_unlink.s, 
+            sem_wait.s, 
+            load_shared_file.s,
+            reset_shared_file.s
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        PRECOMPILED_HEADERS = (); 
+        PROJECT_HEADERS = (); 
+        PUBLIC_HEADERS = (); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/SandBox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = i386; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/sys.subproj/i386.subproj/SYS.h b/sys.subproj/i386.subproj/SYS.h
new file mode 100644 (file)
index 0000000..c35bf0c
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ *
+ *     File:   SYS.h
+ *
+ *     Definition of the user side of the UNIX system call interface
+ *     for i386.
+ *
+ * HISTORY
+ *  12-3-92    Bruce Martin (Bruce_Martin@next.com)
+ *     Created.
+ */
+#define KERNEL_PRIVATE 1
+/*
+ * Headers
+ */
+#include <sys/syscall.h>
+#include <architecture/i386/asm_help.h>
+#include <mach/i386/syscall_sw.h>
+
+
+#define UNIX_SYSCALL_TRAP      lcall   $0x2b, $0
+#define MACHDEP_SYSCALL_TRAP   lcall   $0x7, $0
+
+
+#define UNIX_SYSCALL(name, nargs)                      \
+       .globl  cerror                                  ;\
+LEAF(_##name, 0)                                       ;\
+       movl    $SYS_##name, %eax                       ;\
+       UNIX_SYSCALL_TRAP                               ;\
+       jnb     2f                                      ;\
+       BRANCH_EXTERN(cerror)                           ;\
+2:
+
+#define UNIX_SYSCALL_NONAME(name, nargs)               \
+       .globl  cerror                                  ;\
+       movl    $SYS_##name, %eax                       ;\
+       UNIX_SYSCALL_TRAP                               ;\
+       jnb     2f                                      ;\
+       BRANCH_EXTERN(cerror)                           ;\
+2:
+
+#define PSEUDO(pseudo, name, nargs)                    \
+LEAF(_##pseudo, 0)                                     ;\
+       UNIX_SYSCALL_NONAME(name, nargs)
+
+#if !defined(SYS_getdirentriesattr)
+#define SYS_getdirentriesattr 222
+#endif
+
+#if !defined(SYS_semsys)
+#define SYS_semsys      251
+#define SYS_msgsys      252
+#define SYS_shmsys      253
+#define SYS_semctl      254
+#define SYS_semget      255
+#define SYS_semop       256
+#define SYS_semconfig   257
+#define SYS_msgctl      258
+#define SYS_msgget      259
+#define SYS_msgsnd      260
+#define SYS_msgrcv      261
+#define SYS_shmat       262
+#define SYS_shmctl      263
+#define SYS_shmdt       264
+#define SYS_shmget      265
+#endif
+
diff --git a/sys.subproj/i386.subproj/_exit.s b/sys.subproj/i386.subproj/_exit.s
new file mode 100644 (file)
index 0000000..f8c2d1e
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+PSEUDO(_exit, exit, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/_getlogin.s b/sys.subproj/i386.subproj/_getlogin.s
new file mode 100644 (file)
index 0000000..1d2a47a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+PSEUDO(_getlogin, getlogin, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/_setjmp.s b/sys.subproj/i386.subproj/_setjmp.s
new file mode 100644 (file)
index 0000000..bbec3f8
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ *
+ * HISTORY
+ *  20-Apr-92    Bruce Martin (bmartin@next.com)
+ *      Created from M68K sources.
+ */
+
+/*
+ * C library -- _setjmp, _longjmp
+ *
+ *     _longjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ *     _setjmp(a)
+ * by restoring registers from the stack,
+ * The previous signal state is NOT restored.
+ *
+ */
+
+#include <architecture/i386/asm_help.h>
+
+#define JB_ONSTACK      0
+#define JB_MASK         4
+#define JB_EAX          8
+#define JB_EBX          12
+#define JB_ECX          16
+#define JB_EDX          20
+#define JB_EDI          24
+#define JB_ESI          28
+#define JB_EBP          32
+#define JB_ESP          36
+#define JB_SS           40
+#define JB_EFLAGS       44
+#define JB_EIP          48
+#define JB_CS           52
+#define JB_DS           56
+#define JB_ES           60
+#define JB_FS           64
+#define JB_GS           68
+
+
+LEAF(__setjmp, 0)
+        movl    4(%esp), %ecx           // jmp_buf (struct sigcontext *)
+
+        // now build sigcontext
+        movl    %ebx, JB_EBX(%ecx)
+        movl    %edi, JB_EDI(%ecx)
+        movl    %esi, JB_ESI(%ecx)
+        movl    %ebp, JB_EBP(%ecx)
+
+        // EIP is set to the frame return address value
+        movl    (%esp), %eax
+        movl    %eax, JB_EIP(%ecx)
+        // ESP is set to the frame return address plus 4
+        movl    %esp, %eax
+        addl    $4, %eax
+        movl    %eax, JB_ESP(%ecx)
+
+#if SAVE_SEG_REGS
+        // segment registers
+        mov     %ss, JB_SS(%ecx)
+        mov     %cs, JB_CS(%ecx)
+        mov     %ds, JB_DS(%ecx)
+        mov     %es, JB_ES(%ecx)
+        mov     %fs, JB_FS(%ecx)
+        mov     %gs, JB_GS(%ecx)
+#endif
+
+        // save eflags - you can't use movl
+        pushf
+        popl    %eax
+        movl    %eax, JB_EFLAGS(%ecx)
+
+        // return 0
+        xorl    %eax, %eax
+        ret
+
+
+LEAF(__longjmp, 0)
+       subl    $2,%esp
+       fnstcw  (%esp)                  // save FP control word
+       fninit                          // reset FP coprocessor
+       fldcw   (%esp)                  // restore FP control word
+       addl    $2,%esp
+
+        movl    4(%esp), %ecx           // jmp_buf (struct sigcontext *)
+       movl    8(%esp), %eax           // return value
+       testl   %eax, %eax
+       jnz 1f
+       incl %eax
+
+       // general registers
+1:     movl    JB_EBX(%ecx), %ebx
+       movl    JB_ESI(%ecx), %esi
+       movl    JB_EDI(%ecx), %edi
+       movl    JB_EBP(%ecx), %ebp
+       movl    JB_ESP(%ecx), %esp
+
+#if SAVE_SEG_REGS
+       // segment registers
+       mov     JB_SS(%ecx), %ss
+       mov     JB_CS(%ecx), %cs
+       mov     JB_DS(%ecx), %ds
+       mov     JB_ES(%ecx), %es
+       mov     JB_FS(%ecx), %fs
+       mov     JB_GS(%ecx), %gs
+#endif
+
+       // eflags
+       pushl   JB_EFLAGS(%ecx)
+       popf
+
+       jmp     *JB_EIP(%ecx)
diff --git a/sys.subproj/i386.subproj/_setlogin.s b/sys.subproj/i386.subproj/_setlogin.s
new file mode 100644 (file)
index 0000000..d8d2359
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+PSEUDO(_setlogin, setlogin, 0)
+       ret
+
diff --git a/sys.subproj/i386.subproj/_sysctl.s b/sys.subproj/i386.subproj/_sysctl.s
new file mode 100644 (file)
index 0000000..1d174f8
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(__sysctl, 6)
+       ret
diff --git a/sys.subproj/i386.subproj/accept.s b/sys.subproj/i386.subproj/accept.s
new file mode 100644 (file)
index 0000000..6e0dc76
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(accept, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/access.s b/sys.subproj/i386.subproj/access.s
new file mode 100644 (file)
index 0000000..4d031b1
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(access, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/acct.s b/sys.subproj/i386.subproj/acct.s
new file mode 100644 (file)
index 0000000..83074c5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(acct, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/add_profil.s b/sys.subproj/i386.subproj/add_profil.s
new file mode 100644 (file)
index 0000000..02e610f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(add_profil, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/adjtime.s b/sys.subproj/i386.subproj/adjtime.s
new file mode 100644 (file)
index 0000000..4496a62
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(adjtime, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/bind.s b/sys.subproj/i386.subproj/bind.s
new file mode 100644 (file)
index 0000000..cbe58e1
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(bind, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/cerror.s b/sys.subproj/i386.subproj/cerror.s
new file mode 100644 (file)
index 0000000..e1ab9cc
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+       .globl  _errno
+
+LABEL(cerror)
+       REG_TO_EXTERN(%eax, _errno)
+       pushl   %eax
+       CALL_EXTERN(_cthread_set_errno_self)
+       addl    $4,%esp
+       movl    $-1,%eax
+       movl    $-1,%edx /* in case a 64-bit value is returned */
+       ret
diff --git a/sys.subproj/i386.subproj/chdir.s b/sys.subproj/i386.subproj/chdir.s
new file mode 100644 (file)
index 0000000..b862cb4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(chdir, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/checkuseraccess.s b/sys.subproj/i386.subproj/checkuseraccess.s
new file mode 100644 (file)
index 0000000..a49371b
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(checkuseraccess, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/chflags.s b/sys.subproj/i386.subproj/chflags.s
new file mode 100644 (file)
index 0000000..2436f67
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(chflags, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/chmod.s b/sys.subproj/i386.subproj/chmod.s
new file mode 100644 (file)
index 0000000..6bc417a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(chmod, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/chown.s b/sys.subproj/i386.subproj/chown.s
new file mode 100644 (file)
index 0000000..05686ec
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(chown, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/chroot.s b/sys.subproj/i386.subproj/chroot.s
new file mode 100644 (file)
index 0000000..79c27c7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(chroot, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/close.s b/sys.subproj/i386.subproj/close.s
new file mode 100644 (file)
index 0000000..33d4a42
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(close, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/connect.s b/sys.subproj/i386.subproj/connect.s
new file mode 100644 (file)
index 0000000..96719ab
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(connect, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/dup.s b/sys.subproj/i386.subproj/dup.s
new file mode 100644 (file)
index 0000000..9116c62
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(dup, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/dup2.s b/sys.subproj/i386.subproj/dup2.s
new file mode 100644 (file)
index 0000000..6f0fb01
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(dup2, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/exchangedata.s b/sys.subproj/i386.subproj/exchangedata.s
new file mode 100644 (file)
index 0000000..dcd757f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(exchangedata, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/execve.s b/sys.subproj/i386.subproj/execve.s
new file mode 100644 (file)
index 0000000..44e4ecb
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(execve, 3)
+       ret                     // execve(file, argv, arge)
diff --git a/sys.subproj/i386.subproj/fchdir.s b/sys.subproj/i386.subproj/fchdir.s
new file mode 100644 (file)
index 0000000..8040919
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fchdir, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/fchflags.s b/sys.subproj/i386.subproj/fchflags.s
new file mode 100644 (file)
index 0000000..7189e7e
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fchflags, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/fchmod.s b/sys.subproj/i386.subproj/fchmod.s
new file mode 100644 (file)
index 0000000..a48a89a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fchmod, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/fchown.s b/sys.subproj/i386.subproj/fchown.s
new file mode 100644 (file)
index 0000000..d410dca
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fchown, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/fcntl.s b/sys.subproj/i386.subproj/fcntl.s
new file mode 100644 (file)
index 0000000..f788e03
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fcntl, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/flock.s b/sys.subproj/i386.subproj/flock.s
new file mode 100644 (file)
index 0000000..f490a4a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(flock, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/fork.s b/sys.subproj/i386.subproj/fork.s
new file mode 100644 (file)
index 0000000..74b278d
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+LEAF(_fork, 0) 
+       CALL_EXTERN(__cthread_fork_prepare)
+#if defined(__DYNAMIC__)
+// Just like __cthread_fork_prepare we need to prevent threads on the child's
+// side from doing a mach call in the dynamic linker until __dyld_fork_child
+// is run (see below).  So we call __dyld_fork_prepare which takes out the dyld
+// lock to prevent all other threads but this one from entering dyld.
+.cstring
+LC1:
+       .ascii "__dyld_fork_prepare\0"
+.text
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC1-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_prepare indirectly
+#endif
+
+       movl    $SYS_fork,%eax;         // code for fork -> eax
+       UNIX_SYSCALL_TRAP;              // do the system call
+       jnc     L1                      // jump if CF==0
+
+#if defined(__DYNAMIC__)
+// __dyld_fork_parent() is called by the parent process after a fork syscall.
+// This releases the dyld lock acquired by __dyld_fork_prepare().  In this case
+// we just use it to clean up after a fork error so the parent process can 
+// dyld after fork() errors without deadlocking.
+.cstring
+LC2:
+       .ascii "__dyld_fork_parent\0"
+.text
+       pushl   %eax            // save the return value (errno)
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC2-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_parent indirectly
+       popl    %eax            // restore the return value (errno)
+#endif
+       CALL_EXTERN(cerror)
+       CALL_EXTERN(__cthread_fork_parent)
+       movl    $-1,%eax
+       ret
+       
+L1:
+       orl     %edx,%edx       // CF=OF=0,  ZF set if zero result      
+       jz      L2              // parent, since r1 == 0 in parent, 1 in child
+       
+       //child here...
+#if defined(__DYNAMIC__)
+// Here on the child side of the fork we need to tell the dynamic linker that
+// we have forked.  To do this we call __dyld_fork_child in the dyanmic
+// linker.  But since we can't dynamicly bind anything until this is done we
+// do this by using the private extern __dyld_func_lookup() function to get the
+// address of __dyld_fork_child (the 'C' code equivlent):
+//
+//     _dyld_func_lookup("__dyld_fork_child", &address);
+//     address();
+//
+.cstring
+LC0:
+       .ascii "__dyld_fork_child\0"
+
+.text
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC0-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_child indirectly
+#endif
+       CALL_EXTERN(_fork_mach_init)
+       CALL_EXTERN(__cthread_fork_child)
+#if    defined(__DYNAMIC__)
+.cstring
+LC10:
+       .ascii "__dyld_fork_child_final\0"
+
+.text
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC10-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_child_final indirectly
+#endif
+       xorl    %eax,%eax       // zero eax
+       ret
+
+       //parent here...
+L2:
+       push    %eax            // save pid
+#if    defined(__DYNAMIC__)
+// __dyld_fork_parent() is called by the parent process after a fork syscall.
+// This releases the dyld lock acquired by __dyld_fork_prepare().
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC2-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_parent indirectly
+#endif
+       CALL_EXTERN_AGAIN(__cthread_fork_parent)
+       pop     %eax
+       ret             
+
diff --git a/sys.subproj/i386.subproj/fpathconf.s b/sys.subproj/i386.subproj/fpathconf.s
new file mode 100644 (file)
index 0000000..12f71ee
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fpathconf, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/fstat.s b/sys.subproj/i386.subproj/fstat.s
new file mode 100644 (file)
index 0000000..1a72abb
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fstat, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/fstatfs.s b/sys.subproj/i386.subproj/fstatfs.s
new file mode 100644 (file)
index 0000000..b9a8cdf
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fstatfs, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/fstatv.s b/sys.subproj/i386.subproj/fstatv.s
new file mode 100644 (file)
index 0000000..69ee4c9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fstatv, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/fsync.s b/sys.subproj/i386.subproj/fsync.s
new file mode 100644 (file)
index 0000000..38d8f62
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(fsync, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/ftruncate.s b/sys.subproj/i386.subproj/ftruncate.s
new file mode 100644 (file)
index 0000000..1522750
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ftruncate, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/getattrlist.s b/sys.subproj/i386.subproj/getattrlist.s
new file mode 100644 (file)
index 0000000..4e051b4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getattrlist, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/getdirentries.s b/sys.subproj/i386.subproj/getdirentries.s
new file mode 100644 (file)
index 0000000..3592e4a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getdirentries, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/getdirentriesattr.s b/sys.subproj/i386.subproj/getdirentriesattr.s
new file mode 100644 (file)
index 0000000..4840434
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getdirentriesattr, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/getegid.s b/sys.subproj/i386.subproj/getegid.s
new file mode 100644 (file)
index 0000000..5be6771
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+PSEUDO(getegid, getgid, 0)
+       movl    %edx, %eax
+       ret                             // egid = getegid();
diff --git a/sys.subproj/i386.subproj/geteuid.s b/sys.subproj/i386.subproj/geteuid.s
new file mode 100644 (file)
index 0000000..132c7a2
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+PSEUDO(geteuid, getuid, 0)
+       movl    %edx, %eax
+       ret                     // euid = geteuid();
diff --git a/sys.subproj/i386.subproj/getfh.s b/sys.subproj/i386.subproj/getfh.s
new file mode 100644 (file)
index 0000000..a81c0e3
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getfh, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/getfsstat.s b/sys.subproj/i386.subproj/getfsstat.s
new file mode 100644 (file)
index 0000000..665b3a3
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getfsstat, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/getgid.s b/sys.subproj/i386.subproj/getgid.s
new file mode 100644 (file)
index 0000000..ba2aac4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getgid, 0)
+       ret                     // gid = getgid();
diff --git a/sys.subproj/i386.subproj/getgroups.s b/sys.subproj/i386.subproj/getgroups.s
new file mode 100644 (file)
index 0000000..8d255a5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getgroups, 2)
+       ret             // ngroups = getgroups(gidsetsize, gidset)
diff --git a/sys.subproj/i386.subproj/getitimer.s b/sys.subproj/i386.subproj/getitimer.s
new file mode 100644 (file)
index 0000000..3e24bbf
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getitimer, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/getpeername.s b/sys.subproj/i386.subproj/getpeername.s
new file mode 100644 (file)
index 0000000..8a30166
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getpeername, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/getpgrp.s b/sys.subproj/i386.subproj/getpgrp.s
new file mode 100644 (file)
index 0000000..e1c3858
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getpgrp, 1)
+       ret             // pgrp = getpgrp(pid);
diff --git a/sys.subproj/i386.subproj/getpid.s b/sys.subproj/i386.subproj/getpid.s
new file mode 100644 (file)
index 0000000..beab7f7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getpid, 0)
+       ret             // pid = getpid();
diff --git a/sys.subproj/i386.subproj/getppid.s b/sys.subproj/i386.subproj/getppid.s
new file mode 100644 (file)
index 0000000..87cc8b7
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+PSEUDO(getppid, getpid, 0)
+       movl    %edx, %eax
+       ret             // ppid = getppid();
diff --git a/sys.subproj/i386.subproj/getpriority.s b/sys.subproj/i386.subproj/getpriority.s
new file mode 100644 (file)
index 0000000..ca03e09
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getpriority, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/getrlimit.s b/sys.subproj/i386.subproj/getrlimit.s
new file mode 100644 (file)
index 0000000..e8c7669
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getrlimit, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/getrusage.s b/sys.subproj/i386.subproj/getrusage.s
new file mode 100644 (file)
index 0000000..b3835d1
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getrusage, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/getsockname.s b/sys.subproj/i386.subproj/getsockname.s
new file mode 100644 (file)
index 0000000..cdddd3f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getsockname, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/getsockopt.s b/sys.subproj/i386.subproj/getsockopt.s
new file mode 100644 (file)
index 0000000..11fbb2c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getsockopt, 5)
+       ret
diff --git a/sys.subproj/i386.subproj/getuid.s b/sys.subproj/i386.subproj/getuid.s
new file mode 100644 (file)
index 0000000..534a7ed
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(getuid, 0)
+       ret             // uid = getuid();
diff --git a/sys.subproj/i386.subproj/ioctl.s b/sys.subproj/i386.subproj/ioctl.s
new file mode 100644 (file)
index 0000000..87d2668
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ioctl, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/kill.s b/sys.subproj/i386.subproj/kill.s
new file mode 100644 (file)
index 0000000..fbcde10
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(kill, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/ktrace.s b/sys.subproj/i386.subproj/ktrace.s
new file mode 100644 (file)
index 0000000..2cedba9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(ktrace, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/lfs_bmapv.s b/sys.subproj/i386.subproj/lfs_bmapv.s
new file mode 100644 (file)
index 0000000..5bfe288
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lfs_bmapv, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/lfs_markv.s b/sys.subproj/i386.subproj/lfs_markv.s
new file mode 100644 (file)
index 0000000..b43267c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lfs_markv, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/lfs_segclean.s b/sys.subproj/i386.subproj/lfs_segclean.s
new file mode 100644 (file)
index 0000000..3463892
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lfs_segclean, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/lfs_segwait.s b/sys.subproj/i386.subproj/lfs_segwait.s
new file mode 100644 (file)
index 0000000..96c60f6
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lfs_segwait, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/link.s b/sys.subproj/i386.subproj/link.s
new file mode 100644 (file)
index 0000000..aaf945a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(link, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/listen.s b/sys.subproj/i386.subproj/listen.s
new file mode 100644 (file)
index 0000000..ff4e5ee
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(listen, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/load_shared_file.s b/sys.subproj/i386.subproj/load_shared_file.s
new file mode 100644 (file)
index 0000000..bdfebfd
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(load_shared_file, 7)
+       ret
diff --git a/sys.subproj/i386.subproj/lseek.s b/sys.subproj/i386.subproj/lseek.s
new file mode 100644 (file)
index 0000000..1d7ce24
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lseek, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/lstat.s b/sys.subproj/i386.subproj/lstat.s
new file mode 100644 (file)
index 0000000..fbf7e02
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lstat, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/lstatv.s b/sys.subproj/i386.subproj/lstatv.s
new file mode 100644 (file)
index 0000000..40d7f4f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(lstatv, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/madvise.s b/sys.subproj/i386.subproj/madvise.s
new file mode 100644 (file)
index 0000000..96a5603
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(madvise, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/mincore.s b/sys.subproj/i386.subproj/mincore.s
new file mode 100644 (file)
index 0000000..1002afd
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mincore, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/minherit.s b/sys.subproj/i386.subproj/minherit.s
new file mode 100644 (file)
index 0000000..3901af9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(minherit, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/mkcomplex.s b/sys.subproj/i386.subproj/mkcomplex.s
new file mode 100644 (file)
index 0000000..0b54a3b
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mkcomplex, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/mkdir.s b/sys.subproj/i386.subproj/mkdir.s
new file mode 100644 (file)
index 0000000..fd001b9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mkdir, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/mkfifo.s b/sys.subproj/i386.subproj/mkfifo.s
new file mode 100644 (file)
index 0000000..1469906
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mkfifo, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/mknod.s b/sys.subproj/i386.subproj/mknod.s
new file mode 100644 (file)
index 0000000..ab8c6fb
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mknod, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/mlock.s b/sys.subproj/i386.subproj/mlock.s
new file mode 100644 (file)
index 0000000..0051c53
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mlock, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/mlockall.s b/sys.subproj/i386.subproj/mlockall.s
new file mode 100644 (file)
index 0000000..0a0dad4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mlockall, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/mmap.s b/sys.subproj/i386.subproj/mmap.s
new file mode 100644 (file)
index 0000000..57fa9a1
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mmap, 6)
+       ret
diff --git a/sys.subproj/i386.subproj/mount.s b/sys.subproj/i386.subproj/mount.s
new file mode 100644 (file)
index 0000000..df208d0
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mount, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/mprotect.s b/sys.subproj/i386.subproj/mprotect.s
new file mode 100644 (file)
index 0000000..368c648
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(mprotect, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/msgctl.s b/sys.subproj/i386.subproj/msgctl.s
new file mode 100644 (file)
index 0000000..9028ca2
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(msgctl, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/msgget.s b/sys.subproj/i386.subproj/msgget.s
new file mode 100644 (file)
index 0000000..9a9c46c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(msgget, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/msgrcv.s b/sys.subproj/i386.subproj/msgrcv.s
new file mode 100644 (file)
index 0000000..627c8c5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(msgrcv, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/msgsnd.s b/sys.subproj/i386.subproj/msgsnd.s
new file mode 100644 (file)
index 0000000..0cf6dc2
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(msgsnd, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/msgsys.s b/sys.subproj/i386.subproj/msgsys.s
new file mode 100644 (file)
index 0000000..bad4612
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(msgsys, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/msync.s b/sys.subproj/i386.subproj/msync.s
new file mode 100644 (file)
index 0000000..26924bc
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(msync, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/munlock.s b/sys.subproj/i386.subproj/munlock.s
new file mode 100644 (file)
index 0000000..b7341af
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(munlock, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/munlockall.s b/sys.subproj/i386.subproj/munlockall.s
new file mode 100644 (file)
index 0000000..098b0b4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(munlockall, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/munmap.s b/sys.subproj/i386.subproj/munmap.s
new file mode 100644 (file)
index 0000000..7e2e28c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(munmap, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/nfssvc.s b/sys.subproj/i386.subproj/nfssvc.s
new file mode 100644 (file)
index 0000000..70a8e2d
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(nfssvc, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/open.s b/sys.subproj/i386.subproj/open.s
new file mode 100644 (file)
index 0000000..c505660
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(open, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/pathconf.s b/sys.subproj/i386.subproj/pathconf.s
new file mode 100644 (file)
index 0000000..ae6eab4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(pathconf, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/pipe.s b/sys.subproj/i386.subproj/pipe.s
new file mode 100644 (file)
index 0000000..8fefcdd
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(pipe, 0)
+       movl    4(%esp),%ecx
+       movl    %eax,(%ecx)
+       movl    %edx,4(%ecx)
+       xorl    %eax,%eax
+       ret
diff --git a/sys.subproj/i386.subproj/profil.s b/sys.subproj/i386.subproj/profil.s
new file mode 100644 (file)
index 0000000..e9af89f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(profil, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/ptrace.s b/sys.subproj/i386.subproj/ptrace.s
new file mode 100644 (file)
index 0000000..28ab2ad
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+       .globl  _errno
+
+LEAF(_ptrace, 0)
+       xorl    %eax,%eax
+       REG_TO_EXTERN(%eax,_errno)
+UNIX_SYSCALL_NONAME(ptrace, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/quota.s b/sys.subproj/i386.subproj/quota.s
new file mode 100644 (file)
index 0000000..f3788d7
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+#define SYS_quota 149
+
+UNIX_SYSCALL(quota, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/quotactl.s b/sys.subproj/i386.subproj/quotactl.s
new file mode 100644 (file)
index 0000000..cc89a5a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(quotactl, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/read.s b/sys.subproj/i386.subproj/read.s
new file mode 100644 (file)
index 0000000..1429fa2
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(read, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/readlink.s b/sys.subproj/i386.subproj/readlink.s
new file mode 100644 (file)
index 0000000..958d7b7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(readlink, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/readv.s b/sys.subproj/i386.subproj/readv.s
new file mode 100644 (file)
index 0000000..fe11a86
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(readv, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/reboot.s b/sys.subproj/i386.subproj/reboot.s
new file mode 100644 (file)
index 0000000..b6841b4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(reboot, 2)
+       hlt
diff --git a/sys.subproj/i386.subproj/recvfrom.s b/sys.subproj/i386.subproj/recvfrom.s
new file mode 100644 (file)
index 0000000..a9ab56e
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(recvfrom, 6)
+       ret
diff --git a/sys.subproj/i386.subproj/recvmsg.s b/sys.subproj/i386.subproj/recvmsg.s
new file mode 100644 (file)
index 0000000..d61786f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(recvmsg, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/rename.s b/sys.subproj/i386.subproj/rename.s
new file mode 100644 (file)
index 0000000..a3efcfb
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(rename, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/reset_shared_file.s b/sys.subproj/i386.subproj/reset_shared_file.s
new file mode 100644 (file)
index 0000000..49e7424
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(reset_shared_file, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/revoke.s b/sys.subproj/i386.subproj/revoke.s
new file mode 100644 (file)
index 0000000..438ad16
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(revoke, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/rmdir.s b/sys.subproj/i386.subproj/rmdir.s
new file mode 100644 (file)
index 0000000..d5c2e6b
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(rmdir, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/searchfs.s b/sys.subproj/i386.subproj/searchfs.s
new file mode 100644 (file)
index 0000000..4ee3b8b
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(searchfs, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/select.s b/sys.subproj/i386.subproj/select.s
new file mode 100644 (file)
index 0000000..2aa2880
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(select, 5)
+       ret
diff --git a/sys.subproj/i386.subproj/sem_close.s b/sys.subproj/i386.subproj/sem_close.s
new file mode 100644 (file)
index 0000000..c3ed857
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_close, 1)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_destroy.s b/sys.subproj/i386.subproj/sem_destroy.s
new file mode 100644 (file)
index 0000000..2b7fdc5
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_destroy, 1)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_getvalue.s b/sys.subproj/i386.subproj/sem_getvalue.s
new file mode 100644 (file)
index 0000000..d169e21
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_getvalue, 2)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_init.s b/sys.subproj/i386.subproj/sem_init.s
new file mode 100644 (file)
index 0000000..daf0ba9
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_init, 3)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_open.s b/sys.subproj/i386.subproj/sem_open.s
new file mode 100644 (file)
index 0000000..2c68a7c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_open, 4)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_post.s b/sys.subproj/i386.subproj/sem_post.s
new file mode 100644 (file)
index 0000000..f6b24af
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_post, 1)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_trywait.s b/sys.subproj/i386.subproj/sem_trywait.s
new file mode 100644 (file)
index 0000000..9c0f725
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_trywait, 1)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_unlink.s b/sys.subproj/i386.subproj/sem_unlink.s
new file mode 100644 (file)
index 0000000..0449cbf
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_unlink, 1)
+       ret
+
diff --git a/sys.subproj/i386.subproj/sem_wait.s b/sys.subproj/i386.subproj/sem_wait.s
new file mode 100644 (file)
index 0000000..405b047
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sem_wait, 1)
+       ret
+
diff --git a/sys.subproj/i386.subproj/semconfig.s b/sys.subproj/i386.subproj/semconfig.s
new file mode 100644 (file)
index 0000000..5c07385
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(semconfig, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/semctl.s b/sys.subproj/i386.subproj/semctl.s
new file mode 100644 (file)
index 0000000..b53bebe
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(semctl, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/semget.s b/sys.subproj/i386.subproj/semget.s
new file mode 100644 (file)
index 0000000..1889c4d
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(semget, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/semop.s b/sys.subproj/i386.subproj/semop.s
new file mode 100644 (file)
index 0000000..7c0c902
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(semop, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/semsys.s b/sys.subproj/i386.subproj/semsys.s
new file mode 100644 (file)
index 0000000..e775bf6
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(semsys, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/sendmsg.s b/sys.subproj/i386.subproj/sendmsg.s
new file mode 100644 (file)
index 0000000..c6acb08
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sendmsg, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/sendto.s b/sys.subproj/i386.subproj/sendto.s
new file mode 100644 (file)
index 0000000..990f1f1
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sendto, 6)
+       ret
diff --git a/sys.subproj/i386.subproj/setattrlist.s b/sys.subproj/i386.subproj/setattrlist.s
new file mode 100644 (file)
index 0000000..907e057
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setattrlist, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/setegid.s b/sys.subproj/i386.subproj/setegid.s
new file mode 100644 (file)
index 0000000..a4db7f8
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setegid, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/seteuid.s b/sys.subproj/i386.subproj/seteuid.s
new file mode 100644 (file)
index 0000000..497ea22
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(seteuid, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/setgid.s b/sys.subproj/i386.subproj/setgid.s
new file mode 100644 (file)
index 0000000..4767c4c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setgid, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/setgroups.s b/sys.subproj/i386.subproj/setgroups.s
new file mode 100644 (file)
index 0000000..66add53
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setgroups, 2)
+       ret             // setgroups(gidsetsize, gidset)
diff --git a/sys.subproj/i386.subproj/setitimer.s b/sys.subproj/i386.subproj/setitimer.s
new file mode 100644 (file)
index 0000000..8806cd9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setitimer, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/setjmp.s b/sys.subproj/i386.subproj/setjmp.s
new file mode 100644 (file)
index 0000000..bc5108d
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+/*
+ * NeXT 386 setjmp/longjmp
+ *
+ * Written by Bruce Martin, NeXT Inc. 4/9/92
+ */
+
+/*
+ * C library -- setjmp, longjmp
+ *
+ *     longjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ *     setjmp(a)
+ * by restoring registers from the stack,
+ * The previous value of the signal mask is
+ * restored.
+ *
+ */
+
+#include <architecture/i386/asm_help.h>
+#include "SYS.h"
+
+#define JB_ONSTACK     0
+#define JB_MASK                4
+#define JB_EAX         8
+#define JB_EBX         12
+#define JB_ECX         16
+#define JB_EDX         20
+#define JB_EDI         24
+#define JB_ESI         28
+#define JB_EBP         32
+#define JB_ESP         36
+#define JB_SS          40
+#define JB_EFLAGS      44
+#define JB_EIP         48
+#define JB_CS          52
+#define JB_DS          56
+#define JB_ES          60
+#define JB_FS          64
+#define JB_GS          68
+#define JB_SAVEMASK    72      // sigsetjmp/siglongjmp only
+
+LEAF(_sigsetjmp, 0)
+       movl    4(%esp), %eax           // sigjmp_buf * jmpbuf; 
+       movl    8(%esp), %ecx           // int savemask;
+       movl    %ecx, JB_SAVEMASK(%eax) // jmpbuf[_JBLEN] = savemask;
+       cmpl    $0, %ecx                // if savemask != 0
+       jne     _setjmp                 //     setjmp(jmpbuf); 
+       BRANCH_EXTERN(__setjmp)         // else
+                                       //     _setjmp(jmpbuf); 
+       
+LEAF(_setjmp, 0)
+       movl    4(%esp), %ecx           // jmp_buf (struct sigcontext *)
+       pushl   %ecx                    // save ecx
+
+       // call sigstack to get the current signal stack
+       subl    $12, %esp               // space for return structure
+       pushl   %esp
+       pushl   $0
+       CALL_EXTERN(_sigaltstack)
+       movl    12(%esp), %eax          // save stack pointer
+       movl    %eax, JB_ONSTACK(%ecx)
+       addl    $20, %esp
+
+       // call sigblock to get signal mask
+       pushl   $0
+       CALL_EXTERN(_sigblock)
+       addl    $4, %esp
+       popl    %ecx                    // restore ecx
+       movl    %eax, JB_MASK(%ecx)
+
+       // now build sigcontext
+       movl    %ebx, JB_EBX(%ecx)
+       movl    %edi, JB_EDI(%ecx)
+       movl    %esi, JB_ESI(%ecx)
+       movl    %ebp, JB_EBP(%ecx)
+
+       // EIP is set to the frame return address value
+       movl    (%esp), %eax
+       movl    %eax, JB_EIP(%ecx)
+       // ESP is set to the frame return address plus 4
+       movl    %esp, %eax
+       addl    $4, %eax
+       movl    %eax, JB_ESP(%ecx)
+
+       // segment registers
+       movl    $0,  JB_SS(%ecx)
+       mov     %ss, JB_SS(%ecx)
+       movl    $0,  JB_CS(%ecx)
+       mov     %cs, JB_CS(%ecx)
+       movl    $0,  JB_DS(%ecx)
+       mov     %ds, JB_DS(%ecx)
+       movl    $0,  JB_ES(%ecx)
+       mov     %es, JB_ES(%ecx)
+       movl    $0,  JB_FS(%ecx)
+       mov     %fs, JB_FS(%ecx)
+       movl    $0,  JB_GS(%ecx)
+       mov     %gs, JB_GS(%ecx)
+
+       // save eflags - you can't use movl
+       pushf
+       popl    %eax
+       movl    %eax, JB_EFLAGS(%ecx)
+
+       // return 0
+       xorl    %eax, %eax
+       ret
+
+LEAF(_siglongjmp, 0)
+       movl 4(%esp), %eax              // sigjmp_buf * jmpbuf; 
+       cmpl $0, JB_SAVEMASK(%eax)      // if jmpbuf[_JBLEN] != 0
+       jne     _longjmp                //     longjmp(jmpbuf, var); 
+       BRANCH_EXTERN(__longjmp)        // else
+                                       //     _longjmp(jmpbuf, var); 
+       
+LEAF(_longjmp, 0)
+       subl    $2,%esp
+       fnstcw  (%esp)                  // save FP control word
+       fninit                          // reset FP coprocessor
+       fldcw   (%esp)                  // restore FP control word
+       addl    $2,%esp
+       movl    4(%esp), %eax           // address of jmp_buf (saved context)
+       movl    8(%esp), %edx           // return value
+       movl    %edx, JB_EAX(%eax)      // return value into saved context
+       movl    $SYS_sigreturn, %eax    // sigreturn system call
+       UNIX_SYSCALL_TRAP
+       addl    $8, %esp
+       CALL_EXTERN(_longjmperror)
+       CALL_EXTERN(_abort)
+END(_longjmp)
diff --git a/sys.subproj/i386.subproj/setpgid.s b/sys.subproj/i386.subproj/setpgid.s
new file mode 100644 (file)
index 0000000..d0627ef
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setpgid, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/setpriority.s b/sys.subproj/i386.subproj/setpriority.s
new file mode 100644 (file)
index 0000000..315ec64
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setpriority, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/setprivexec.s b/sys.subproj/i386.subproj/setprivexec.s
new file mode 100644 (file)
index 0000000..9569b59
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setprivexec, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/setquota.s b/sys.subproj/i386.subproj/setquota.s
new file mode 100644 (file)
index 0000000..0919c02
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+#define SYS_setquota 148
+
+UNIX_SYSCALL(setquota, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/setrlimit.s b/sys.subproj/i386.subproj/setrlimit.s
new file mode 100644 (file)
index 0000000..06ffe21
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setrlimit, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/setsid.s b/sys.subproj/i386.subproj/setsid.s
new file mode 100644 (file)
index 0000000..5f6905e
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setsid, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/setsockopt.s b/sys.subproj/i386.subproj/setsockopt.s
new file mode 100644 (file)
index 0000000..48d60af
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setsockopt, 5)
+       ret
diff --git a/sys.subproj/i386.subproj/settimeofday.s b/sys.subproj/i386.subproj/settimeofday.s
new file mode 100644 (file)
index 0000000..529c5f9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(settimeofday, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/setuid.s b/sys.subproj/i386.subproj/setuid.s
new file mode 100644 (file)
index 0000000..dbebb62
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(setuid, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/shm_open.s b/sys.subproj/i386.subproj/shm_open.s
new file mode 100644 (file)
index 0000000..3629959
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shm_open, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shm_unlink.s b/sys.subproj/i386.subproj/shm_unlink.s
new file mode 100644 (file)
index 0000000..cbbc420
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shm_unlink, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shmat.s b/sys.subproj/i386.subproj/shmat.s
new file mode 100644 (file)
index 0000000..c8fdc2c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shmat, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shmctl.s b/sys.subproj/i386.subproj/shmctl.s
new file mode 100644 (file)
index 0000000..4ae81b7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shmctl, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shmdt.s b/sys.subproj/i386.subproj/shmdt.s
new file mode 100644 (file)
index 0000000..bfc59ab
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shmdt, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shmget.s b/sys.subproj/i386.subproj/shmget.s
new file mode 100644 (file)
index 0000000..592ff0e
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shmget, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shmsys.s b/sys.subproj/i386.subproj/shmsys.s
new file mode 100644 (file)
index 0000000..48f49c6
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shmsys, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/shutdown.s b/sys.subproj/i386.subproj/shutdown.s
new file mode 100644 (file)
index 0000000..8e201ac
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(shutdown, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/sigaltstack.s b/sys.subproj/i386.subproj/sigaltstack.s
new file mode 100644 (file)
index 0000000..b4ca3e5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sigaltstack, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/sigpending.s b/sys.subproj/i386.subproj/sigpending.s
new file mode 100644 (file)
index 0000000..6e99e21
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sigpending, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/sigreturn.s b/sys.subproj/i386.subproj/sigreturn.s
new file mode 100644 (file)
index 0000000..b048bb4
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sigreturn, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/socket.s b/sys.subproj/i386.subproj/socket.s
new file mode 100644 (file)
index 0000000..905c645
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(socket, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/socketpair.s b/sys.subproj/i386.subproj/socketpair.s
new file mode 100644 (file)
index 0000000..2e7c00a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(socketpair, 5)
+       ret
diff --git a/sys.subproj/i386.subproj/stat.s b/sys.subproj/i386.subproj/stat.s
new file mode 100644 (file)
index 0000000..cb041e5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(stat, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/statfs.s b/sys.subproj/i386.subproj/statfs.s
new file mode 100644 (file)
index 0000000..386a41b
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(statfs, 2);
+       ret
diff --git a/sys.subproj/i386.subproj/statv.s b/sys.subproj/i386.subproj/statv.s
new file mode 100644 (file)
index 0000000..db5ce1c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(statv, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/swapon.s b/sys.subproj/i386.subproj/swapon.s
new file mode 100644 (file)
index 0000000..fe34af2
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(swapon, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/symlink.s b/sys.subproj/i386.subproj/symlink.s
new file mode 100644 (file)
index 0000000..44edc06
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(symlink, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/sync.s b/sys.subproj/i386.subproj/sync.s
new file mode 100644 (file)
index 0000000..03f711f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(sync, 0)
+       ret
diff --git a/sys.subproj/i386.subproj/syscall.s b/sys.subproj/i386.subproj/syscall.s
new file mode 100644 (file)
index 0000000..2e21b2d
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+LEAF(_syscall, 0)
+       popl    %ecx            // ret addr
+       popl    %eax            // syscall number
+       pushl   %ecx
+       UNIX_SYSCALL_TRAP
+       movl    (%esp),%edx     // add one element to stack so
+       pushl   %ecx            // caller "pop" will work
+       jnb     2f
+       BRANCH_EXTERN(cerror)
+2:
+END(_syscall)
diff --git a/sys.subproj/i386.subproj/table.s b/sys.subproj/i386.subproj/table.s
new file mode 100644 (file)
index 0000000..4dec901
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(table, 5)
+       ret
diff --git a/sys.subproj/i386.subproj/truncate.s b/sys.subproj/i386.subproj/truncate.s
new file mode 100644 (file)
index 0000000..a29542d
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(truncate, 2)
+       ret
diff --git a/sys.subproj/i386.subproj/umask.s b/sys.subproj/i386.subproj/umask.s
new file mode 100644 (file)
index 0000000..82d5619
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(umask, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/undelete.s b/sys.subproj/i386.subproj/undelete.s
new file mode 100644 (file)
index 0000000..1e1c804
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(undelete, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/unlink.s b/sys.subproj/i386.subproj/unlink.s
new file mode 100644 (file)
index 0000000..d3b7191
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(unlink, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/unmount.s b/sys.subproj/i386.subproj/unmount.s
new file mode 100644 (file)
index 0000000..283b03c
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(unmount, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/utimes.s b/sys.subproj/i386.subproj/utimes.s
new file mode 100644 (file)
index 0000000..d9d7b8b
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(utimes, 1)
+       ret
diff --git a/sys.subproj/i386.subproj/vfork.s b/sys.subproj/i386.subproj/vfork.s
new file mode 100644 (file)
index 0000000..714a205
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+LEAF(_vfork, 0) 
+       CALL_EXTERN(__cthread_fork_prepare)
+#if defined(__DYNAMIC__)
+// Just like __cthread_fork_prepare we need to prevent threads on the child's
+// side from doing a mach call in the dynamic linker until __dyld_fork_child
+// is run (see below).  So we call __dyld_fork_prepare which takes out the dyld
+// lock to prevent all other threads but this one from entering dyld.
+.cstring
+LC1:
+       .ascii "__dyld_fork_prepare\0"
+.text
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC1-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_prepare indirectly
+#endif
+
+       movl    $SYS_vfork,%eax;        // code for vfork -> eax
+       UNIX_SYSCALL_TRAP;              // do the system call
+       jnc     L1                      // jump if CF==0
+
+#if defined(__DYNAMIC__)
+// __dyld_fork_parent() is called by the parent process after a vfork syscall.
+// This releases the dyld lock acquired by __dyld_fork_prepare().  In this case
+// we just use it to clean up after a vfork error so the parent process can 
+// dyld after vfork() errors without deadlocking.
+.cstring
+LC2:
+       .ascii "__dyld_fork_parent\0"
+.text
+       pushl   %eax            // save the return value (errno)
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC2-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_parent indirectly
+       popl    %eax            // restore the return value (errno)
+#endif
+       CALL_EXTERN(cerror)
+       CALL_EXTERN(__cthread_fork_parent)
+       movl    $-1,%eax
+       ret
+       
+L1:
+       orl     %edx,%edx       // CF=OF=0,  ZF set if zero result      
+       jz      L2              // parent, since r1 == 0 in parent, 1 in child
+       
+       //child here...
+#if defined(__DYNAMIC__)
+// Here on the child side of the vfork we need to tell the dynamic linker that
+// we have vforked.  To do this we call __dyld_fork_child in the dyanmic
+// linker.  But since we can't dynamicly bind anything until this is done we
+// do this by using the private extern __dyld_func_lookup() function to get the
+// address of __dyld_fork_child (the 'C' code equivlent):
+//
+//     _dyld_func_lookup("__dyld_fork_child", &address);
+//     address();
+//
+.cstring
+LC0:
+       .ascii "__dyld_fork_child\0"
+
+.text
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC0-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_child indirectly
+#endif
+       CALL_EXTERN(_fork_mach_init)
+       CALL_EXTERN(__cthread_fork_child)
+#if    defined(__DYNAMIC__)
+.cstring
+LC10:
+       .ascii "__dyld_fork_child_final\0"
+
+.text
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC10-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_child_final indirectly
+#endif
+       xorl    %eax,%eax       // zero eax
+       ret
+
+       //parent here...
+L2:
+       push    %eax            // save pid
+#if    defined(__DYNAMIC__)
+// __dyld_fork_parent() is called by the parent process after a vfork syscall.
+// This releases the dyld lock acquired by __dyld_fork_prepare().
+       subl    $4,%esp         // allocate space for the address parameter
+       leal    0(%esp),%eax    // get the address of the allocated space
+       pushl   %eax            // push the address of the allocated space
+       call    1f
+1:     popl    %eax
+       leal    LC2-1b(%eax),%eax
+       pushl   %eax            // push the name of the function to look up
+       call    __dyld_func_lookup
+       addl    $8,%esp         // remove parameters to __dyld_func_lookup
+       movl    0(%esp),%eax    // move the value returned in address parameter
+       addl    $4,%esp         // deallocate the space for the address param
+       call    *%eax           // call __dyld_fork_parent indirectly
+#endif
+       CALL_EXTERN_AGAIN(__cthread_fork_parent)
+       pop     %eax
+       ret             
+
diff --git a/sys.subproj/i386.subproj/wait4.s b/sys.subproj/i386.subproj/wait4.s
new file mode 100644 (file)
index 0000000..889c6c0
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(wait4, 4)
+       ret
diff --git a/sys.subproj/i386.subproj/write.s b/sys.subproj/i386.subproj/write.s
new file mode 100644 (file)
index 0000000..e8e98f9
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(write, 3)
+       ret
diff --git a/sys.subproj/i386.subproj/writev.s b/sys.subproj/i386.subproj/writev.s
new file mode 100644 (file)
index 0000000..10fc07d
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#include "SYS.h"
+
+UNIX_SYSCALL(writev, 3)
+       ret
diff --git a/sys.subproj/msync.2 b/sys.subproj/msync.2
new file mode 100644 (file)
index 0000000..94de3b6
--- /dev/null
@@ -0,0 +1,103 @@
+.\" Copyright (c) 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)msync.2     8.2 (Berkeley) 6/21/94
+.\" $FreeBSD: src/lib/libc/sys/msync.2,v 1.17 2000/04/21 09:41:53 phantom Exp $
+.\"
+.Dd June 21, 1994
+.Dt MSYNC 2
+.Os
+.Sh NAME
+.Nm msync
+.Nd synchronize a mapped region
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.Fd #include <sys/types.h>
+.Fd #include <sys/mman.h>
+.Ft int
+.Fn msync "void *addr" "size_t len" "int flags"
+.Sh DESCRIPTION
+The
+.Fn msync
+system call
+writes any modified pages back to the filesystem and updates
+the file modification time.
+If
+.Fa len
+is 0, all modified pages within the region containing
+.Fa addr
+will be flushed;
+if
+.Fa len
+is non-zero, only those pages containing 
+.Fa addr
+and
+.Fa len-1
+succeeding locations will be examined.
+The
+.Fa flags
+argument may be specified as follows:
+.Bd -literal
+MS_ASYNC       Return immediately
+MS_SYNC                Perform synchronous writes
+MS_INVALIDATE  Invalidate all cached data
+.Ed
+.Sh RETURN VALUES
+If any errors occur, -1 is returned and errno is set to indicate the
+error.
+Otherwise, a 0 value is returned.
+.Sh ERRORS
+.Fn msync
+will fail if:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+.Fa addr
+is not a multiple of the hardware page size.
+.It Bq Er EINVAL
+.Fa len
+is too large or negative.
+.It Bq Er EINVAL
+.Fa flags
+was both MS_ASYNC and MS_INVALIDATE.
+Only one of these flags is allowed.
+.It Bq Er EIO
+An I/O error occurred while writing to the file system.
+.Sh SEE ALSO
+.Xr madvise 2 ,
+.Xr mincore 2 ,
+.Xr mprotect 2 ,
+.Xr munmap 2
+.Sh HISTORY
+The
+.Fn msync
+function first appeared in
+.Bx 4.4 .
diff --git a/sys.subproj/ppc.subproj/ATPgetreq.s b/sys.subproj/ppc.subproj/ATPgetreq.s
new file mode 100644 (file)
index 0000000..3033717
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATPgetreq, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ATPgetrsp.s b/sys.subproj/ppc.subproj/ATPgetrsp.s
new file mode 100644 (file)
index 0000000..f5f25ab
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATPgetrsp, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ATPsndreq.s b/sys.subproj/ppc.subproj/ATPsndreq.s
new file mode 100644 (file)
index 0000000..076c33f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATPsndreq, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ATPsndrsp.s b/sys.subproj/ppc.subproj/ATPsndrsp.s
new file mode 100644 (file)
index 0000000..00cca6d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATPsndrsp, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ATgetmsg.s b/sys.subproj/ppc.subproj/ATgetmsg.s
new file mode 100644 (file)
index 0000000..529a298
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATgetmsg, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ATputmsg.s b/sys.subproj/ppc.subproj/ATputmsg.s
new file mode 100644 (file)
index 0000000..61e085f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATputmsg, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ATsocket.s b/sys.subproj/ppc.subproj/ATsocket.s
new file mode 100644 (file)
index 0000000..f53d7d0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ATsocket, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/Makefile b/sys.subproj/ppc.subproj/Makefile
new file mode 100644 (file)
index 0000000..633178e
--- /dev/null
@@ -0,0 +1,132 @@
+#
+# Generated by the Apple Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = ppc
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = assym.h genassym.h _setjmp.h SYS.h processor_facilities.h
+
+OTHERLINKED = ATsocket.s ATgetmsg.s ATputmsg.s ATPsndreq.s ATPsndrsp.s\
+              ATPgetreq.s ATPgetrsp.s accept.s access.s acct.s\
+              add_profil.s adjtime.s bind.s cerror.s chdir.s\
+              checkuseraccess.s chflags.s chmod.s chown.s chroot.s\
+              close.s connect.s cthread.s dup.s dup2.s exchangedata.s\
+              execve.s _exit.s fchdir.s fchflags.s fchmod.s fchown.s\
+              fcntl.s flock.s fork.s fpathconf.s fstat.s fstatfs.s\
+              fstatv.s fsync.s ftruncate.s getattrlist.s\
+              getdirentries.s getdirentriesattr.s getegid.s geteuid.s\
+              getfh.s getfsstat.s getgid.s getgroups.s getitimer.s\
+              _getlogin.s getpeername.s getpgrp.s getpid.s getppid.s\
+              getpriority.s getrlimit.s getrusage.s getsockname.s\
+              getsockopt.s getuid.s ioctl.s kill.s ktrace.s\
+              lfs_bmapv.s lfs_markv.s lfs_segclean.s lfs_segwait.s\
+              link.s listen.s longjmp.s _longjmp.s lseek.s lstat.s\
+              lstatv.s madvise.s mincore.s minherit.s mkcomplex.s\
+              mkdir.s mkfifo.s mknod.s mlock.s mlockall.s mmap.s\
+              mount.s mprotect.s msgctl.s msgget.s msgrcv.s msgsnd.s\
+              msgsys.s msync.s munlock.s munlockall.s munmap.s\
+              nfssvc.s open.s pathconf.s pipe.s profil.s ptrace.s\
+              quota.s quotactl.s read.s readlink.s readv.s reboot.s\
+              recvfrom.s recvmsg.s rename.s revoke.s rmdir.s\
+              searchfs.s select.s semconfig.s semctl.s semget.s\
+              semop.s semsys.s sendmsg.s sendto.s setattrlist.s\
+              setegid.s seteuid.s setgid.s setgroups.s setitimer.s\
+              setjmp.s _setjmp.s _setlogin.s setpgid.s setpriority.s\
+              setprivexec.s setquota.s setrlimit.s setsid.s\
+              setsockopt.s settimeofday.s setuid.s shmat.s shmctl.s\
+              shmdt.s shmget.s shmsys.s shm_open.s shm_unlink.s\
+              shutdown.s sigaltstack.s sigpending.s sigreturn.s\
+              socket.s socketpair.s stat.s statfs.s statv.s swapon.s\
+              symlink.s sync.s syscall.s _sysctl.s table.s truncate.s\
+              umask.s undelete.s unlink.s unmount.s ur_cthread.s\
+              utimes.s vfork.s wait4.s write.s writev.s sem_close.s\
+              sem_destroy.s sem_getvalue.s sem_init.s sem_open.s\
+              sem_post.s sem_trywait.s sem_unlink.s sem_wait.s\
+              processor_facilities.s load_shared_file.s reset_shared_file.s
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+OTHERLINKEDOFILES = ATsocket.o ATgetmsg.o ATputmsg.o ATPsndreq.o\
+                    ATPsndrsp.o ATPgetreq.o ATPgetrsp.o accept.o\
+                    access.o acct.o add_profil.o adjtime.o bind.o\
+                    cerror.o chdir.o checkuseraccess.o chflags.o\
+                    chmod.o chown.o chroot.o close.o connect.o\
+                    cthread.o dup.o dup2.o exchangedata.o execve.o\
+                    _exit.o fchdir.o fchflags.o fchmod.o fchown.o\
+                    fcntl.o flock.o fork.o fpathconf.o fstat.o\
+                    fstatfs.o fstatv.o fsync.o ftruncate.o\
+                    getattrlist.o getdirentries.o getdirentriesattr.o\
+                    getegid.o geteuid.o getfh.o getfsstat.o getgid.o\
+                    getgroups.o getitimer.o _getlogin.o getpeername.o\
+                    getpgrp.o getpid.o getppid.o getpriority.o\
+                    getrlimit.o getrusage.o getsockname.o getsockopt.o\
+                    getuid.o ioctl.o kill.o ktrace.o lfs_bmapv.o\
+                    lfs_markv.o lfs_segclean.o lfs_segwait.o link.o\
+                    listen.o longjmp.o _longjmp.o lseek.o lstat.o\
+                    lstatv.o madvise.o mincore.o minherit.o\
+                    mkcomplex.o mkdir.o mkfifo.o mknod.o mlock.o\
+                    mlockall.o mmap.o mount.o mprotect.o msgctl.o\
+                    msgget.o msgrcv.o msgsnd.o msgsys.o msync.o\
+                    munlock.o munlockall.o munmap.o nfssvc.o open.o\
+                    pathconf.o pipe.o profil.o ptrace.o quota.o\
+                    quotactl.o read.o readlink.o readv.o reboot.o\
+                    recvfrom.o recvmsg.o rename.o revoke.o rmdir.o\
+                    searchfs.o select.o semconfig.o semctl.o semget.o\
+                    semop.o semsys.o sendmsg.o sendto.o setattrlist.o\
+                    setegid.o seteuid.o setgid.o setgroups.o\
+                    setitimer.o setjmp.o _setjmp.o _setlogin.o\
+                    setpgid.o setpriority.o setprivexec.o setquota.o\
+                    setrlimit.o setsid.o setsockopt.o settimeofday.o\
+                    setuid.o shmat.o shmctl.o shmdt.o shmget.o\
+                    shmsys.o shm_open.o shm_unlink.o shutdown.o\
+                    sigaltstack.o sigpending.o sigreturn.o socket.o\
+                    socketpair.o stat.o statfs.o statv.o swapon.o\
+                    symlink.o sync.o syscall.o _sysctl.o table.o\
+                    truncate.o umask.o undelete.o unlink.o unmount.o\
+                    ur_cthread.o utimes.o vfork.o wait4.o write.o\
+                    writev.o sem_close.o sem_destroy.o sem_getvalue.o\
+                    sem_init.o sem_open.o sem_post.o sem_trywait.o\
+                    sem_unlink.o sem_wait.o processor_facilities.o\
+                    load_shared_file.o reset_shared_file.o
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /AppleInternal/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+PUBLIC_HEADERS = processor_facilities.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/SandBox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/sys.subproj/ppc.subproj/Makefile.postamble b/sys.subproj/ppc.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/sys.subproj/ppc.subproj/Makefile.preamble b/sys.subproj/ppc.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..e7c0be7
--- /dev/null
@@ -0,0 +1,138 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+PUBLIC_HEADER_DIR := $(SYSTEM_LIBRARY_DIR)/Frameworks/System.framework/Versions/B/PrivateHeaders/architecture/ppc
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+INCLUDED_ARCHS = ppc
diff --git a/sys.subproj/ppc.subproj/PB.project b/sys.subproj/ppc.subproj/PB.project
new file mode 100644 (file)
index 0000000..2359ad6
--- /dev/null
@@ -0,0 +1,216 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (assym.h, genassym.h, _setjmp.h, SYS.h, processor_facilities.h); 
+        OTHER_LINKED = (
+            ATsocket.s, 
+            ATgetmsg.s, 
+            ATputmsg.s, 
+            ATPsndreq.s, 
+            ATPsndrsp.s, 
+            ATPgetreq.s, 
+            ATPgetrsp.s, 
+            accept.s, 
+            access.s, 
+            acct.s, 
+            add_profil.s, 
+            adjtime.s, 
+            bind.s, 
+            cerror.s, 
+            chdir.s, 
+            checkuseraccess.s, 
+            chflags.s, 
+            chmod.s, 
+            chown.s, 
+            chroot.s, 
+            close.s, 
+            connect.s, 
+            cthread.s, 
+            dup.s, 
+            dup2.s, 
+            exchangedata.s, 
+            execve.s, 
+            _exit.s, 
+            fchdir.s, 
+            fchflags.s, 
+            fchmod.s, 
+            fchown.s, 
+            fcntl.s, 
+            flock.s, 
+            fork.s, 
+            fpathconf.s, 
+            fstat.s, 
+            fstatfs.s, 
+            fstatv.s, 
+            fsync.s, 
+            ftruncate.s, 
+            getattrlist.s, 
+            getdirentries.s, 
+            getdirentriesattr.s, 
+            getegid.s, 
+            geteuid.s, 
+            getfh.s, 
+            getfsstat.s, 
+            getgid.s, 
+            getgroups.s, 
+            getitimer.s, 
+            _getlogin.s, 
+            getpeername.s, 
+            getpgrp.s, 
+            getpid.s, 
+            getppid.s, 
+            getpriority.s, 
+            getrlimit.s, 
+            getrusage.s, 
+            getsockname.s, 
+            getsockopt.s, 
+            getuid.s, 
+            ioctl.s, 
+            kill.s, 
+            ktrace.s, 
+            lfs_bmapv.s, 
+            lfs_markv.s, 
+            lfs_segclean.s, 
+            lfs_segwait.s, 
+            link.s, 
+            listen.s, 
+            longjmp.s, 
+            _longjmp.s, 
+            lseek.s, 
+            lstat.s, 
+            lstatv.s, 
+            madvise.s, 
+            mincore.s, 
+            minherit.s, 
+            mkcomplex.s, 
+            mkdir.s, 
+            mkfifo.s, 
+            mknod.s, 
+            mlock.s, 
+            mlockall.s, 
+            mmap.s, 
+            mount.s, 
+            mprotect.s, 
+            msgctl.s, 
+            msgget.s, 
+            msgrcv.s, 
+            msgsnd.s, 
+            msgsys.s, 
+            msync.s, 
+            munlock.s, 
+            munlockall.s, 
+            munmap.s, 
+            nfssvc.s, 
+            open.s, 
+            pathconf.s, 
+            pipe.s, 
+            profil.s, 
+            ptrace.s, 
+            quota.s, 
+            quotactl.s, 
+            read.s, 
+            readlink.s, 
+            readv.s, 
+            reboot.s, 
+            recvfrom.s, 
+            recvmsg.s, 
+            rename.s, 
+            revoke.s, 
+            rmdir.s, 
+            searchfs.s, 
+            select.s, 
+            semconfig.s, 
+            semctl.s, 
+            semget.s, 
+            semop.s, 
+            semsys.s, 
+            sendmsg.s, 
+            sendto.s, 
+            setattrlist.s, 
+            setegid.s, 
+            seteuid.s, 
+            setgid.s, 
+            setgroups.s, 
+            setitimer.s, 
+            setjmp.s, 
+            _setjmp.s, 
+            _setlogin.s, 
+            setpgid.s, 
+            setpriority.s, 
+            setprivexec.s, 
+            setquota.s, 
+            setrlimit.s, 
+            setsid.s, 
+            setsockopt.s, 
+            settimeofday.s, 
+            setuid.s, 
+            shmat.s, 
+            shmctl.s, 
+            shmdt.s, 
+            shmget.s, 
+            shmsys.s, 
+            shm_open.s, 
+            shm_unlink.s, 
+            shutdown.s, 
+            sigaltstack.s, 
+            sigpending.s, 
+            sigreturn.s, 
+            socket.s, 
+            socketpair.s, 
+            stat.s, 
+            statfs.s, 
+            statv.s, 
+            swapon.s, 
+            symlink.s, 
+            sync.s, 
+            syscall.s, 
+            _sysctl.s, 
+            table.s, 
+            truncate.s, 
+            umask.s, 
+            undelete.s, 
+            unlink.s, 
+            unmount.s, 
+            ur_cthread.s, 
+            utimes.s, 
+            vfork.s, 
+            wait4.s, 
+            write.s, 
+            writev.s, 
+            sem_close.s, 
+            sem_destroy.s, 
+            sem_getvalue.s, 
+            sem_init.s, 
+            sem_open.s, 
+            sem_post.s, 
+            sem_trywait.s, 
+            sem_unlink.s, 
+            sem_wait.s, 
+            processor_facilities.s, 
+            load_shared_file.s,
+            reset_shared_file.s
+        ); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        PRECOMPILED_HEADERS = (); 
+        PROJECT_HEADERS = (); 
+        PUBLIC_HEADERS = (processor_facilities.h); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/SandBox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /AppleInternal/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = ppc; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/sys.subproj/ppc.subproj/SYS.h b/sys.subproj/ppc.subproj/SYS.h
new file mode 100644 (file)
index 0000000..7a56a8e
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   SYS.h
+ *
+ *     Definition of the user side of the UNIX system call interface
+ *     for M98K.
+ *
+ *     Errors are flagged by the location of the trap return (ie., which
+ *     instruction is executed upon rfi):
+ *
+ *             SC PC + 4:      Error (typically branch to cerror())
+ *             SC PC + 8:      Success
+ *
+ * HISTORY
+ * 18-Nov-92   Ben Fathi (benf@next.com)
+ *     Ported to m98k.
+ *
+ *  9-Jan-92   Peter King (king@next.com)
+ *     Created.
+ */
+
+#define KERNEL_PRIVATE 1
+/*
+ * Header files.
+ */
+#import        <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+#import        <mach/ppc/exception.h>
+#import        <sys/syscall.h>
+
+/* From rhapsody kernel mach/ppc/syscall_sw.h */
+#define        kernel_trap_args_0
+#define        kernel_trap_args_1
+#define        kernel_trap_args_2
+#define        kernel_trap_args_3
+#define        kernel_trap_args_4
+#define        kernel_trap_args_5
+#define        kernel_trap_args_6
+#define        kernel_trap_args_7
+
+/*
+ * simple_kernel_trap -- Mach system calls with 8 or less args
+ * Args are passed in a0 - a7, system call number in r0.
+ * Do a "sc" instruction to enter kernel.
+ */    
+#define simple_kernel_trap(trap_name, trap_number)     \
+       .globl  _##trap_name                            @\
+_##trap_name:                                          @\
+       li      r0,trap_number                           @\
+       sc                                               @\
+       blr                                              @\
+       END(trap_name)
+
+#define kernel_trap_0(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_1(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_2(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_3(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_4(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_5(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_6(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_7(trap_name,trap_number)            \
+       simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_8(trap_name,trap_number)            \
+        simple_kernel_trap(trap_name,trap_number)
+
+#define kernel_trap_9(trap_name,trap_number)            \
+        simple_kernel_trap(trap_name,trap_number)
+
+/* End of rhapsody kernel mach/ppc/syscall_sw.h */
+
+/*
+ * Macros.
+ */
+
+#define        SYSCALL(name, nargs)                    \
+       .globl  cerror                          @\
+LEAF(_##name)                                  @\
+       kernel_trap_args_##nargs                @\
+       li      r0,SYS_##name                   @\
+       sc                                      @\
+       b       1f                              @\
+       b       2f                              @\
+1:     BRANCH_EXTERN(cerror)                   @\
+.text                                          \
+2:     nop
+
+#define        SYSCALL_NONAME(name, nargs)             \
+       .globl  cerror                          @\
+       kernel_trap_args_##nargs                @\
+       li      r0,SYS_##name                   @\
+       sc                                      @\
+       b       1f                              @\
+       b       2f                              @\
+1:     BRANCH_EXTERN(cerror)                   @\
+.text                                          \
+2:     nop
+
+#define        PSEUDO(pseudo, name, nargs)             \
+LEAF(_##pseudo)                                        @\
+       SYSCALL_NONAME(name, nargs)
+
+
+#undef END
+#import        <mach/ppc/syscall_sw.h>
+
+#if !defined(SYS_getdirentriesattr)
+#define SYS_getdirentriesattr 222
+#endif
+
+#if !defined(SYS_semsys)
+#define SYS_semsys     251
+#define SYS_msgsys     252
+#define SYS_shmsys     253
+#define SYS_semctl     254
+#define SYS_semget     255
+#define SYS_semop      256
+#define SYS_semconfig  257
+#define SYS_msgctl     258
+#define SYS_msgget     259
+#define SYS_msgsnd     260
+#define SYS_msgrcv     261
+#define SYS_shmat      262
+#define SYS_shmctl     263
+#define SYS_shmdt      264
+#define SYS_shmget     265
+#endif
diff --git a/sys.subproj/ppc.subproj/_exit.s b/sys.subproj/ppc.subproj/_exit.s
new file mode 100644 (file)
index 0000000..fd3a59e
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+PSEUDO(_exit, exit, 1)
+       blr
diff --git a/sys.subproj/ppc.subproj/_getlogin.s b/sys.subproj/ppc.subproj/_getlogin.s
new file mode 100644 (file)
index 0000000..e0eb958
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+PSEUDO(_getlogin, getlogin, 0)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/_longjmp.s b/sys.subproj/ppc.subproj/_longjmp.s
new file mode 100644 (file)
index 0000000..4591e54
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*     void _longjmp(jmp_buf env, int val); */
+
+/*     int _longjmp(jmp_buf env); */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
+ *
+ *     File: sys/ppc/_longjmp.s
+ *
+ *     Implements _longjmp()
+ *
+ *     History:
+ *     8 September 1998        Matt Watson (mwatson@apple.com)
+ *             Created. Derived from longjmp.s
+ */
+#include "SYS.h"
+#include <architecture/ppc/asm_help.h>
+#include "_setjmp.h"
+
+LEAF(__longjmp)
+       lwz r31, JMP_r31(r3)
+       /* r1, r14-r30 */
+       lwz r1,  JMP_r1 (r3)
+       lwz r2,  JMP_r2 (r3)
+       lwz r13, JMP_r13(r3)
+       lwz r14, JMP_r14(r3)
+       lwz r15, JMP_r15(r3)
+       lwz r16, JMP_r16(r3)
+       lwz r17, JMP_r17(r3)
+       lwz r18, JMP_r18(r3)
+       lwz r19, JMP_r19(r3)
+       lwz r20, JMP_r20(r3)
+       lwz r21, JMP_r21(r3)
+       lwz r22, JMP_r22(r3)
+       lwz r23, JMP_r23(r3)
+       lwz r24, JMP_r24(r3)
+       lwz r25, JMP_r25(r3)
+       lwz r26, JMP_r26(r3)
+       lwz r27, JMP_r27(r3)
+       lwz r28, JMP_r28(r3)
+       lwz r29, JMP_r29(r3)
+       lwz r30, JMP_r30(r3)
+       lwz r0, JMP_cr(r3)
+       mtcrf 0xff,r0
+       lwz r0, JMP_lr(r3)
+       mtlr r0
+       lwz r0, JMP_ctr(r3)                     ; XXX   ctr is volatile
+       mtctr r0
+       lwz r0, JMP_xer(r3)                     ; XXX   xer is volatile
+       mtxer r0
+       mr. r3, r4
+       bnelr
+       li  r3, 1
+       blr
+
diff --git a/sys.subproj/ppc.subproj/_setjmp.h b/sys.subproj/ppc.subproj/_setjmp.h
new file mode 100644 (file)
index 0000000..e97255c
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ *     Copyright (c) 1998, Apple Computer Inc. All rights reserved.
+ *
+ *     File: _setjmp.h
+ *
+ *     Defines for register offsets in the save area.
+ *
+ */
+
+#define JMP_r1 0x00
+#define JMP_r2 0x04
+#define JMP_r13        0x08
+#define JMP_r14        0x0c
+#define JMP_r15        0x10
+#define JMP_r16        0x14
+#define JMP_r17        0x18
+#define JMP_r18        0x1c
+#define JMP_r19        0x20
+#define JMP_r20        0x24
+#define JMP_r21        0x28
+#define JMP_r22        0x2c
+#define JMP_r23        0x30
+#define JMP_r24        0x34
+#define JMP_r25        0x38
+#define JMP_r26        0x3c
+#define JMP_r27        0x40
+#define JMP_r28        0x44
+#define JMP_r29        0x48
+#define JMP_r30        0x4c
+#define JMP_r31        0x50
+#define JMP_lr  0x54
+#define JMP_cr  0x58
+#define JMP_ctr        0x5c
+#define JMP_xer        0x60
+#define JMP_sig        0x64
+#define JMP_SIGFLAG 0x68
diff --git a/sys.subproj/ppc.subproj/_setjmp.s b/sys.subproj/ppc.subproj/_setjmp.s
new file mode 100644 (file)
index 0000000..2be62c8
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*     int _setjmp(jmp_buf env); */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
+ *
+ *     File: sys/ppc/_setjmp.s
+ *
+ *     Implements _setjmp()
+ *
+ *     History:
+ *     8 September 1998        Matt Watson (mwatson@apple.com)
+ *             Created. Derived from setjmp.s
+ */
+
+#include "SYS.h"
+#include <architecture/ppc/asm_help.h>
+#include "_setjmp.h"
+
+LEAF(__setjmp)
+       stw r31, JMP_r31(r3)
+       /* r1, r2, r13-r30 */
+       stw r1, JMP_r1(r3)
+       stw r2, JMP_r2(r3)
+       stw r13, JMP_r13(r3)
+       stw r14, JMP_r14(r3)
+       stw r15, JMP_r15(r3)
+       stw r16, JMP_r16(r3)
+       stw r17, JMP_r17(r3)
+       stw r18, JMP_r18(r3)
+       stw r19, JMP_r19(r3)
+       stw r20, JMP_r20(r3)
+       stw r21, JMP_r21(r3)
+       stw r22, JMP_r22(r3)
+       mfcr r0
+       stw r23, JMP_r23(r3)
+       stw r24, JMP_r24(r3)
+       mflr r5
+       stw r25, JMP_r25(r3)
+       stw r26, JMP_r26(r3)
+       mfctr r6                                ; XXX   ctr is volatile
+       stw r27, JMP_r27(r3)
+       stw r28, JMP_r28(r3)
+       mfxer r7                                ; XXX   xer is volatile
+       stw r29, JMP_r29(r3)
+       stw r30, JMP_r30(r3)
+       stw r0, JMP_cr(r3)
+       stw r5, JMP_lr(r3)
+       stw r6, JMP_ctr(r3)
+       stw r7, JMP_xer(r3)
+       li r3, 0
+       blr
+
diff --git a/sys.subproj/ppc.subproj/_setlogin.s b/sys.subproj/ppc.subproj/_setlogin.s
new file mode 100644 (file)
index 0000000..997db69
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+PSEUDO(_setlogin, setlogin, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/_sysctl.s b/sys.subproj/ppc.subproj/_sysctl.s
new file mode 100644 (file)
index 0000000..8e29463
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(__sysctl, 6)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/accept.s b/sys.subproj/ppc.subproj/accept.s
new file mode 100644 (file)
index 0000000..672331c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(accept, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/access.s b/sys.subproj/ppc.subproj/access.s
new file mode 100644 (file)
index 0000000..5cd4fb9
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(access, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/acct.s b/sys.subproj/ppc.subproj/acct.s
new file mode 100644 (file)
index 0000000..387d35d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(acct, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/add_profil.s b/sys.subproj/ppc.subproj/add_profil.s
new file mode 100644 (file)
index 0000000..d30b6dd
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(add_profil, 4)
+       blr
diff --git a/sys.subproj/ppc.subproj/adjtime.s b/sys.subproj/ppc.subproj/adjtime.s
new file mode 100644 (file)
index 0000000..11f80da
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(adjtime, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/assym.h b/sys.subproj/ppc.subproj/assym.h
new file mode 100644 (file)
index 0000000..49d8a8f
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#ifndef _ASSYM_H_
+#define _ASSYM_H_
+#define PCB_FLOAT_STATE 208
+#define PCB_FS_F0 208
+#define PCB_FS_F1 216
+#define PCB_FS_F2 224
+#define PCB_FS_F3 232
+#define PCB_FS_F4 240
+#define PCB_FS_F5 248
+#define PCB_FS_F6 256
+#define PCB_FS_F7 264
+#define PCB_FS_F8 272
+#define PCB_FS_F9 280
+#define PCB_FS_F10 288
+#define PCB_FS_F11 296
+#define PCB_FS_F12 304
+#define PCB_FS_F13 312
+#define PCB_FS_F14 320
+#define PCB_FS_F15 328
+#define PCB_FS_F16 336
+#define PCB_FS_F17 344
+#define PCB_FS_F18 352
+#define PCB_FS_F19 360
+#define PCB_FS_F20 368
+#define PCB_FS_F21 376
+#define PCB_FS_F22 384
+#define PCB_FS_F23 392
+#define PCB_FS_F24 400
+#define PCB_FS_F25 408
+#define PCB_FS_F26 416
+#define PCB_FS_F27 424
+#define PCB_FS_F28 432
+#define PCB_FS_F29 440
+#define PCB_FS_F30 448
+#define PCB_FS_F31 456
+#define PCB_FS_FPSCR 464
+#define PCB_SAVED_STATE 0
+#define PCB_KSP 472
+#define PCB_SR0 476
+#define PCB_SIZE 480
+#define SS_R0 8
+#define SS_R1 12
+#define SS_R2 16
+#define SS_R3 20
+#define SS_R4 24
+#define SS_R5 28
+#define SS_R6 32
+#define SS_R7 36
+#define SS_R8 40
+#define SS_R9 44
+#define SS_R10 48
+#define SS_R11 52
+#define SS_R12 56
+#define SS_R13 60
+#define SS_R14 64
+#define SS_R15 68
+#define SS_R16 72
+#define SS_R17 76
+#define SS_R18 80
+#define SS_R19 84
+#define SS_R20 88
+#define SS_R21 92
+#define SS_R22 96
+#define SS_R23 100
+#define SS_R24 104
+#define SS_R25 108
+#define SS_R26 112
+#define SS_R27 116
+#define SS_R28 120
+#define SS_R29 124
+#define SS_R30 128
+#define SS_R31 132
+#define SS_CR 136
+#define SS_XER 140
+#define SS_LR 144
+#define SS_CTR 148
+#define SS_SRR0 0
+#define SS_SRR1 4
+#define SS_MQ 152
+#define SS_SR_COPYIN 160
+#define SS_SIZE 176
+#define PP_SAVE_CR 0
+#define PP_SAVE_SRR0 4
+#define PP_SAVE_SRR1 8
+#define PP_SAVE_DAR 12
+#define PP_SAVE_DSISR 16
+#define PP_SAVE_SPRG0 20
+#define PP_SAVE_SPRG1 24
+#define PP_SAVE_SPRG2 28
+#define PP_SAVE_SPRG3 32
+#define PP_SAVE_EXCEPTION_TYPE 36
+#define PP_CPU_DATA 52
+#define PP_PHYS_EXCEPTION_HANDLERS 40
+#define PP_VIRT_PER_PROC 44
+#define PP_ACTIVE_STACKS 56
+#define PP_NEED_AST 60
+#define PP_FPU_PCB 64
+#define KS_PCB 16276
+#define KS_R1 16280
+#define KS_R2 16284
+#define KS_R13 16288
+#define KS_LR 16364
+#define KS_CR 16368
+#define KS_SIZE 96
+#define KSTK_SIZE 16372
+#define THREAD_PCB 36
+#define THREAD_KERNEL_STACK 40
+#define THREAD_SWAPFUNC 48
+#define THREAD_RECOVER 116
+#define THREAD_TASK 12
+#define TASK_VMMAP 8
+#define TASK_MACH_EXC_PORT 96
+#define VMMAP_PMAP 32
+#define PMAP_SPACE 4
+#define MACH_TRAP_OFFSET_POW2 4
+#define MACH_TRAP_ARGC 0
+#define MACH_TRAP_FUNCTION 4
+#define HOST_SELF 0
+#define CPU_ACTIVE_THREAD 0
+#define FM_SIZE 56
+#define ARG_SIZE 16
+#define LA_SIZE 24
+#define FM_BACKPTR 0
+#define FM_LR_SAVE 8
+#define FM_TOC_SAVE 20
+#define RPA_SIZE 32
+#define SPA_SIZE 16
+#define FM_ARG0 56
+#define FM_REDZONE 0
+
+#define        SIZEOF_SIGCATCH               4
+#define        SIGCATCH_HANDLER              0x00000000
+
+#endif /* _ASSYM_H_ */
diff --git a/sys.subproj/ppc.subproj/bind.s b/sys.subproj/ppc.subproj/bind.s
new file mode 100644 (file)
index 0000000..e694ae0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(bind, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/cerror.s b/sys.subproj/ppc.subproj/cerror.s
new file mode 100644 (file)
index 0000000..5753534
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ */
+
+#import        <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+
+       .globl  _errno
+
+NESTED(cerror, 0, 1, 0, 0)
+       REG_TO_EXTERN(r3,_errno)
+       CALL_EXTERN(_cthread_set_errno_self)
+       li32    r3,-1
+       li32    r4,-1   /* in case a 64-bit value is returned */
+       RETURN
+END(cerror)
diff --git a/sys.subproj/ppc.subproj/chdir.s b/sys.subproj/ppc.subproj/chdir.s
new file mode 100644 (file)
index 0000000..bec9ec4
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(chdir, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/checkuseraccess.s b/sys.subproj/ppc.subproj/checkuseraccess.s
new file mode 100644 (file)
index 0000000..a3df1da
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(checkuseraccess, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/chflags.s b/sys.subproj/ppc.subproj/chflags.s
new file mode 100644 (file)
index 0000000..8969b30
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(chflags, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/chmod.s b/sys.subproj/ppc.subproj/chmod.s
new file mode 100644 (file)
index 0000000..d3b242a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(chmod, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/chown.s b/sys.subproj/ppc.subproj/chown.s
new file mode 100644 (file)
index 0000000..d05ce9a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(chown, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/chroot.s b/sys.subproj/ppc.subproj/chroot.s
new file mode 100644 (file)
index 0000000..c2a061e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(chroot, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/close.s b/sys.subproj/ppc.subproj/close.s
new file mode 100644 (file)
index 0000000..fc1d293
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(close, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/connect.s b/sys.subproj/ppc.subproj/connect.s
new file mode 100644 (file)
index 0000000..5e7d6d3
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(connect, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/cthread.s b/sys.subproj/ppc.subproj/cthread.s
new file mode 100644 (file)
index 0000000..c456ba7
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+        .text
+        .align 2
+        .globl __pthread_set_self
+__pthread_set_self:
+        li r0, 0x7FF1
+        sc
+        blr
diff --git a/sys.subproj/ppc.subproj/dup.s b/sys.subproj/ppc.subproj/dup.s
new file mode 100644 (file)
index 0000000..fe70d58
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(dup, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/dup2.s b/sys.subproj/ppc.subproj/dup2.s
new file mode 100644 (file)
index 0000000..ef1e13d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(dup2, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/exchangedata.s b/sys.subproj/ppc.subproj/exchangedata.s
new file mode 100644 (file)
index 0000000..7a990fc
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(exchangedata, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/execve.s b/sys.subproj/ppc.subproj/execve.s
new file mode 100644 (file)
index 0000000..0c0172b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(execve, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fchdir.s b/sys.subproj/ppc.subproj/fchdir.s
new file mode 100644 (file)
index 0000000..19aa46e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fchdir, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fchflags.s b/sys.subproj/ppc.subproj/fchflags.s
new file mode 100644 (file)
index 0000000..9e0749d
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fchflags, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/fchmod.s b/sys.subproj/ppc.subproj/fchmod.s
new file mode 100644 (file)
index 0000000..e4a0eb8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fchmod, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fchown.s b/sys.subproj/ppc.subproj/fchown.s
new file mode 100644 (file)
index 0000000..48b477b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fchown, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fcntl.s b/sys.subproj/ppc.subproj/fcntl.s
new file mode 100644 (file)
index 0000000..83a060c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fcntl, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/flock.s b/sys.subproj/ppc.subproj/flock.s
new file mode 100644 (file)
index 0000000..c422536
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(flock, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fork.s b/sys.subproj/ppc.subproj/fork.s
new file mode 100644 (file)
index 0000000..6df807e
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/ppc/sys/fork.s
+ *
+ * HISTORY
+ * 18-Nov-92  Ben Fathi (benf@next.com)
+ *     Created from M88K sources
+ *
+ * 11-Jan-92  Peter King (king@next.com)
+ *     Created from M68K sources
+ */
+
+#import <sys/syscall.h>
+#import <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+#import        <mach/ppc/syscall_sw.h>
+
+/* We use 8 bytes for LOCAL_VAR(1) and LOCAL_VAR(2) */
+NESTED(_fork, 8, 0, 0, 0)
+       CALL_EXTERN(__cthread_fork_prepare)
+#if defined(__DYNAMIC__)
+.cstring
+LC1:
+       .ascii  "__dyld_fork_prepare\0"
+.text
+       .align 2
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC1-1b)
+       addi    r3,r3,lo16(LC1-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl   
+#endif
+       li      r0,SYS_fork
+       sc
+       b       Lbotch                  // error return
+
+       cmpwi   r4,0
+       beq     Lparent                 // parent, since a1 == 0 in parent,
+                                       //                     1 in child
+#if defined(__DYNAMIC__)
+.cstring
+LC3:
+       .ascii  "__dyld_fork_child\0"
+.text
+       .align 2
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC3-1b)
+       addi    r3,r3,lo16(LC3-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl   
+#endif
+       CALL_EXTERN(_fork_mach_init)
+       CALL_EXTERN(__cthread_fork_child)
+#if defined(__DYNAMIC__)
+.cstring
+LC4:
+       .ascii  "__dyld_fork_child_final\0"
+.text
+       .align 2
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC4-1b)
+       addi    r3,r3,lo16(LC4-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl   
+#endif
+
+       li      r3,0
+       b       Lreturn
+
+Lparent:
+#if defined(__DYNAMIC__)
+       stw     r3,LOCAL_VAR(2)(r1)     // save child pid
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC2-1b)
+       addi    r3,r3,lo16(LC2-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl           
+#endif
+       CALL_EXTERN(__cthread_fork_parent)
+#if defined(__DYNAMIC__)
+       lwz     r3,LOCAL_VAR(2)(r1)
+#endif
+       b       Lreturn
+
+Lbotch:        
+#if defined(__DYNAMIC__)
+.cstring
+LC2:
+       .ascii  "__dyld_fork_parent\0"
+.text
+       .align 2
+       stw     r3,LOCAL_VAR(2)(r1)     // save error value
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC2-1b)
+       addi    r3,r3,lo16(LC2-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl
+       lwz     r3,LOCAL_VAR(2)(r1)     // restore error value for cerror
+               
+#endif
+       CALL_EXTERN(cerror)
+       /*
+        * We use cthread_fork_parent() to clean up after a fork error
+        * (unlock cthreads and mailloc packages) so the parent
+        * process can Malloc() after fork() errors without
+        * deadlocking.
+        */
+       CALL_EXTERN_AGAIN(__cthread_fork_parent)
+       li32    r3,-1                   // error return
+Lreturn:       RETURN
+END(_fork)
+
diff --git a/sys.subproj/ppc.subproj/fpathconf.s b/sys.subproj/ppc.subproj/fpathconf.s
new file mode 100644 (file)
index 0000000..a4666fc
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fpathconf, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fstat.s b/sys.subproj/ppc.subproj/fstat.s
new file mode 100644 (file)
index 0000000..dcc424a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fstat, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fstatfs.s b/sys.subproj/ppc.subproj/fstatfs.s
new file mode 100644 (file)
index 0000000..27b0ad3
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fstatfs, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/fstatv.s b/sys.subproj/ppc.subproj/fstatv.s
new file mode 100644 (file)
index 0000000..57cded8
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(fstatv, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/fsync.s b/sys.subproj/ppc.subproj/fsync.s
new file mode 100644 (file)
index 0000000..5ff3afa
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(fsync, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ftruncate.s b/sys.subproj/ppc.subproj/ftruncate.s
new file mode 100644 (file)
index 0000000..30eb15c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ftruncate, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/genassym.h b/sys.subproj/ppc.subproj/genassym.h
new file mode 100644 (file)
index 0000000..729dfa9
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * genassym.h -- macros of use with genassym.c and assymdefs.c
+ */
+
+#import        <architecture/ppc/reg_help.h>
+#import        <architecture/ppc/macro_help.h>
+
+#define        PRINT_OFFSET(ptr_type, field)                                   \
+MACRO_BEGIN                                                            \
+       print_define("", #ptr_type, #field);                            \
+       print_hex((unsigned) &(((ptr_type)0)->field));                  \
+MACRO_END
+
+#define        PRINT_BIT_FIELD(reg_type, field)                                \
+MACRO_BEGIN                                                            \
+       reg_type __reg;                                                 \
+       CONTENTS(__reg) = 0;                                            \
+       __reg.field = (typeof (__reg.field)) -1;                        \
+       print_define("", #reg_type, #field);                            \
+       print_hex(CONTENTS(__reg));                                     \
+MACRO_END
+
+#define        PRINT_ENUM(item)                                                \
+MACRO_BEGIN                                                            \
+       print_define("", "", #item);                                    \
+       print_hex((unsigned)item);                                      \
+MACRO_END
+
+#define        PRINT_DEFINE(macro)                                             \
+MACRO_BEGIN                                                            \
+       print_define("", "", #macro);                                   \
+       print_str(STRINGIFY(macro));                                    \
+MACRO_END
+
+#define        PRINT_CONSTANT(macro)                                           \
+MACRO_BEGIN                                                            \
+       print_define("", "", #macro);                                   \
+       print_hex((unsigned)macro);                                     \
+MACRO_END
+
+#define        PRINT_REGADDR(macro)                                            \
+MACRO_BEGIN                                                            \
+       print_define("", "", #macro);                                   \
+       print_hex((unsigned) &macro);                                   \
+MACRO_END
+
+#define        PRINT_REG_PAIR(struct_ptr, name0, name1)                        \
+MACRO_BEGIN                                                            \
+       print_define("", #struct_ptr, #name0 "_" #name1);               \
+       print_hex((unsigned) &(((struct_ptr)0)->U_##name0##_##name1));  \
+MACRO_END
+
+#define        PRINT_BIT_POS(reg_type, field)                                  \
+MACRO_BEGIN                                                            \
+       reg_type __reg;                                                 \
+       CONTENTS(__reg) = 0;                                            \
+       __reg.field = 1;                                                \
+       print_define("", #reg_type, #field "_BIT");                     \
+       print_dec((int) bit_num(#reg_type, #field, CONTENTS(__reg)));   \
+MACRO_END
+
+#define        PRINT_FIELD_INFO(reg_type, field)                               \
+MACRO_BEGIN                                                            \
+       reg_type __reg;                                                 \
+       CONTENTS(__reg) = 0;                                            \
+       __reg.field = -1;                                               \
+       print_define("", #reg_type, #field "_OFF");                     \
+       print_dec((int) bit_num(#reg_type, #field, CONTENTS(__reg)));   \
+       print_define("", #reg_type, #field "_WIDTH");                   \
+       print_dec((int) field_width(#reg_type, #field, CONTENTS(__reg)));\
+MACRO_END
+
+#define        PRINT_L2_SIZE(type)                                             \
+MACRO_BEGIN                                                            \
+       print_define("L2_SIZEOF", #type, "");                           \
+       print_dec((int) log2(sizeof(type), #type));                     \
+MACRO_END
+
+#define        PRINT_SIZEOF(type)                                              \
+MACRO_BEGIN                                                            \
+       print_define("SIZEOF", #type, "");                              \
+       print_dec((int) sizeof(type));                                  \
+MACRO_END
+
+#define        PRINT_L2_CONSTANT(macro)                                        \
+MACRO_BEGIN                                                            \
+       print_define("L2", "", #macro);                                 \
+       print_dec((int) log2(macro, #macro));                           \
+MACRO_END
+
+typedef enum {
+       MAJOR, MINOR
+} cmt_level_t;
+
+extern void comment(cmt_level_t level, const char *cmt);
+extern void print_define(const char *prefix, const char *type_name,
+ const char *field);
+extern void print_dec(int val);
+extern void print_hex(unsigned val);
+extern void print_str(const char *str);
+extern unsigned bit_num(char *reg_type, char *field, unsigned bits);
+extern unsigned field_width(char *reg_type, char *field, unsigned bits);
+extern unsigned log2(unsigned val, char *type);
+extern void assymdefs(void);
+
diff --git a/sys.subproj/ppc.subproj/getattrlist.s b/sys.subproj/ppc.subproj/getattrlist.s
new file mode 100644 (file)
index 0000000..b2b9a72
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(getattrlist, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/getdirentries.s b/sys.subproj/ppc.subproj/getdirentries.s
new file mode 100644 (file)
index 0000000..51e308b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getdirentries, 4)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getdirentriesattr.s b/sys.subproj/ppc.subproj/getdirentriesattr.s
new file mode 100644 (file)
index 0000000..989b481
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(getdirentriesattr, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/getegid.s b/sys.subproj/ppc.subproj/getegid.s
new file mode 100644 (file)
index 0000000..1d5959c
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#import        <architecture/ppc/pseudo_inst.h>
+
+#import "SYS.h"
+
+PSEUDO(getegid,getgid,0)
+       mr      a0,a1
+       blr
+
diff --git a/sys.subproj/ppc.subproj/geteuid.s b/sys.subproj/ppc.subproj/geteuid.s
new file mode 100644 (file)
index 0000000..fc71756
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#import        <architecture/ppc/pseudo_inst.h>
+
+#import "SYS.h"
+
+PSEUDO(geteuid,getuid,0)
+       mr      a0,a1
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getfh.s b/sys.subproj/ppc.subproj/getfh.s
new file mode 100644 (file)
index 0000000..fb377fd
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getfh, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getfsstat.s b/sys.subproj/ppc.subproj/getfsstat.s
new file mode 100644 (file)
index 0000000..0e013f8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getfsstat, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getgid.s b/sys.subproj/ppc.subproj/getgid.s
new file mode 100644 (file)
index 0000000..79c52fe
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getgid, 0)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getgroups.s b/sys.subproj/ppc.subproj/getgroups.s
new file mode 100644 (file)
index 0000000..2284f9b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getgroups, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getitimer.s b/sys.subproj/ppc.subproj/getitimer.s
new file mode 100644 (file)
index 0000000..35075cf
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getitimer, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getpeername.s b/sys.subproj/ppc.subproj/getpeername.s
new file mode 100644 (file)
index 0000000..ca29d16
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getpeername, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getpgrp.s b/sys.subproj/ppc.subproj/getpgrp.s
new file mode 100644 (file)
index 0000000..ba45913
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getpgrp, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getpid.s b/sys.subproj/ppc.subproj/getpid.s
new file mode 100644 (file)
index 0000000..0445d37
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getpid, 0)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getppid.s b/sys.subproj/ppc.subproj/getppid.s
new file mode 100644 (file)
index 0000000..209b0b3
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#import        <architecture/ppc/pseudo_inst.h>
+
+#import "SYS.h"
+
+PSEUDO(getppid,getpid,0)
+       mr      a0,a1
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getpriority.s b/sys.subproj/ppc.subproj/getpriority.s
new file mode 100644 (file)
index 0000000..8235428
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getpriority, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getrlimit.s b/sys.subproj/ppc.subproj/getrlimit.s
new file mode 100644 (file)
index 0000000..0f02bea
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getrlimit, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getrusage.s b/sys.subproj/ppc.subproj/getrusage.s
new file mode 100644 (file)
index 0000000..c01f157
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getrusage, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getsockname.s b/sys.subproj/ppc.subproj/getsockname.s
new file mode 100644 (file)
index 0000000..df3ed97
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getsockname, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getsockopt.s b/sys.subproj/ppc.subproj/getsockopt.s
new file mode 100644 (file)
index 0000000..6b90c2f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getsockopt, 5)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/getuid.s b/sys.subproj/ppc.subproj/getuid.s
new file mode 100644 (file)
index 0000000..45610de
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(getuid, 0)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ioctl.s b/sys.subproj/ppc.subproj/ioctl.s
new file mode 100644 (file)
index 0000000..79347cf
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ioctl, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/kill.s b/sys.subproj/ppc.subproj/kill.s
new file mode 100644 (file)
index 0000000..244276e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(kill, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ktrace.s b/sys.subproj/ppc.subproj/ktrace.s
new file mode 100644 (file)
index 0000000..b396926
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(ktrace, 4)
+       blr
diff --git a/sys.subproj/ppc.subproj/lfs_bmapv.s b/sys.subproj/ppc.subproj/lfs_bmapv.s
new file mode 100644 (file)
index 0000000..24c4507
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(lfs_bmapv, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/lfs_markv.s b/sys.subproj/ppc.subproj/lfs_markv.s
new file mode 100644 (file)
index 0000000..dbb69c9
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(lfs_markv, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/lfs_segclean.s b/sys.subproj/ppc.subproj/lfs_segclean.s
new file mode 100644 (file)
index 0000000..8a36388
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(lfs_segclean, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/lfs_segwait.s b/sys.subproj/ppc.subproj/lfs_segwait.s
new file mode 100644 (file)
index 0000000..2dc8335
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(lfs_segwait, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/link.s b/sys.subproj/ppc.subproj/link.s
new file mode 100644 (file)
index 0000000..741d98a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(link, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/listen.s b/sys.subproj/ppc.subproj/listen.s
new file mode 100644 (file)
index 0000000..3c01971
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(listen, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/load_shared_file.s b/sys.subproj/ppc.subproj/load_shared_file.s
new file mode 100644 (file)
index 0000000..53b7c62
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(load_shared_file, 7)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/longjmp.s b/sys.subproj/ppc.subproj/longjmp.s
new file mode 100644 (file)
index 0000000..63d6806
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
+ *
+ *     File: sys/ppc/longjmp.s
+ *
+ *     Implements siglongjmp(), longjmp(), _longjmp() 
+ *
+ *     NOTE:   Scatterloading this file will BREAK the functions.
+ *
+ *     History:
+ *     30-Aug-1998     Umesh Vaishampayan      (umeshv@apple.com)
+ *             Created. Derived from _setjmp.s, setjmp.c and setjmp.s
+ */
+
+#include "SYS.h"
+#include <architecture/ppc/asm_help.h>
+#include "_setjmp.h"
+
+/*
+ *     longjmp routines
+ */
+
+/*     void siglongjmp(sigjmp_buf env, int val); */
+
+LEAF(_siglongjmp)
+       lwz r0, JMP_SIGFLAG(r3) ; load sigflag saved by siglongjmp()
+       cmpwi cr1,r0,0                  ; this changes cr1[EQ] which is volatile
+       beq- cr1, L__longjmp    ; if r0 == 0 do _longjmp()
+       ; else *** fall through *** to longjmp()
+
+/*     void longjmp(jmp_buf env, int val); */
+
+LEAF(_longjmp)
+L_longjmp:
+       mr r30, r3
+       mr r31, r4
+       lwz r3, JMP_sig(r3)             ; restore the signal mask
+       CALL_EXTERN(_sigsetmask)
+       mr r4, r31
+       mr r3, r30
+L__longjmp:
+       BRANCH_EXTERN(__longjmp)
diff --git a/sys.subproj/ppc.subproj/lseek.s b/sys.subproj/ppc.subproj/lseek.s
new file mode 100644 (file)
index 0000000..0cce603
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(lseek, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/lstat.s b/sys.subproj/ppc.subproj/lstat.s
new file mode 100644 (file)
index 0000000..9454192
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(lstat, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/lstatv.s b/sys.subproj/ppc.subproj/lstatv.s
new file mode 100644 (file)
index 0000000..3c09ab4
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(lstatv, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/madvise.s b/sys.subproj/ppc.subproj/madvise.s
new file mode 100644 (file)
index 0000000..a656a59
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(madvise, 3)
+       blr
diff --git a/sys.subproj/ppc.subproj/mincore.s b/sys.subproj/ppc.subproj/mincore.s
new file mode 100644 (file)
index 0000000..0c794cf
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(mincore, 3)
+       blr
diff --git a/sys.subproj/ppc.subproj/minherit.s b/sys.subproj/ppc.subproj/minherit.s
new file mode 100644 (file)
index 0000000..a17397b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(minherit, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/mkcomplex.s b/sys.subproj/ppc.subproj/mkcomplex.s
new file mode 100644 (file)
index 0000000..011508b
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(mkcomplex, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/mkdir.s b/sys.subproj/ppc.subproj/mkdir.s
new file mode 100644 (file)
index 0000000..b9816c1
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(mkdir, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/mkfifo.s b/sys.subproj/ppc.subproj/mkfifo.s
new file mode 100644 (file)
index 0000000..d8483c9
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(mkfifo, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/mknod.s b/sys.subproj/ppc.subproj/mknod.s
new file mode 100644 (file)
index 0000000..9017fee
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(mknod, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/mlock.s b/sys.subproj/ppc.subproj/mlock.s
new file mode 100644 (file)
index 0000000..3297c9e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(mlock, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/mlockall.s b/sys.subproj/ppc.subproj/mlockall.s
new file mode 100644 (file)
index 0000000..de14a8a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(mlockall, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/mmap.s b/sys.subproj/ppc.subproj/mmap.s
new file mode 100644 (file)
index 0000000..b8dcac9
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(mmap, 6)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/mount.s b/sys.subproj/ppc.subproj/mount.s
new file mode 100644 (file)
index 0000000..cf61211
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#import        <architecture/ppc/pseudo_inst.h>
+#import "SYS.h"
+
+SYSCALL(mount, 4)
+       blr
diff --git a/sys.subproj/ppc.subproj/mprotect.s b/sys.subproj/ppc.subproj/mprotect.s
new file mode 100644 (file)
index 0000000..a266bb5
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(mprotect, 3)
+       blr
diff --git a/sys.subproj/ppc.subproj/msgctl.s b/sys.subproj/ppc.subproj/msgctl.s
new file mode 100644 (file)
index 0000000..a56f61d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(msgctl, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/msgget.s b/sys.subproj/ppc.subproj/msgget.s
new file mode 100644 (file)
index 0000000..45aa533
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(msgget, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/msgrcv.s b/sys.subproj/ppc.subproj/msgrcv.s
new file mode 100644 (file)
index 0000000..9afa905
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(msgrcv, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/msgsnd.s b/sys.subproj/ppc.subproj/msgsnd.s
new file mode 100644 (file)
index 0000000..71d1954
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(msgsnd, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/msgsys.s b/sys.subproj/ppc.subproj/msgsys.s
new file mode 100644 (file)
index 0000000..7e0036f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(msgsys, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/msync.s b/sys.subproj/ppc.subproj/msync.s
new file mode 100644 (file)
index 0000000..eb6fb6e
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(msync, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/munlock.s b/sys.subproj/ppc.subproj/munlock.s
new file mode 100644 (file)
index 0000000..1306a1f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(munlock, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/munlockall.s b/sys.subproj/ppc.subproj/munlockall.s
new file mode 100644 (file)
index 0000000..49f3585
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(munlockall, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/munmap.s b/sys.subproj/ppc.subproj/munmap.s
new file mode 100644 (file)
index 0000000..7ea41da
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(munmap, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/nfssvc.s b/sys.subproj/ppc.subproj/nfssvc.s
new file mode 100644 (file)
index 0000000..bf152ce
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(nfssvc, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/open.s b/sys.subproj/ppc.subproj/open.s
new file mode 100644 (file)
index 0000000..31e98c7
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(open, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/pathconf.s b/sys.subproj/ppc.subproj/pathconf.s
new file mode 100644 (file)
index 0000000..443bdd7
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(pathconf, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/pipe.s b/sys.subproj/ppc.subproj/pipe.s
new file mode 100644 (file)
index 0000000..a26568d
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#import "SYS.h"
+
+LEAF(_pipe)
+       stw     r3,ARG(1)(r1)           // preserve fildes on stack
+       SYSCALL_NONAME(pipe, 0)
+       lwz     r11,ARG(1)(r1)          // restore fildes
+       stw     r3,0(r11)
+       stw     r4,4(r11)
+       li      r3,0
+       blr
diff --git a/sys.subproj/ppc.subproj/processor_facilities.h b/sys.subproj/ppc.subproj/processor_facilities.h
new file mode 100644 (file)
index 0000000..f82e7a5
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/* Does the current CPU have Altivec support? */
+extern int _cpu_has_altivec;
+
+/* What processor facilities is the current thread using? */
+#define floatUsed      0x40000000
+#define vectorUsed     0x20000000
+
+extern int processor_facilities_used(void);
diff --git a/sys.subproj/ppc.subproj/processor_facilities.s b/sys.subproj/ppc.subproj/processor_facilities.s
new file mode 100644 (file)
index 0000000..87ebeb6
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+.globl _processor_facilities_used
+_processor_facilities_used:
+       li r0,0x7FF3
+       sc
+       blr
diff --git a/sys.subproj/ppc.subproj/profil.s b/sys.subproj/ppc.subproj/profil.s
new file mode 100644 (file)
index 0000000..150565f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(profil, 4)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ptrace.s b/sys.subproj/ppc.subproj/ptrace.s
new file mode 100644 (file)
index 0000000..2bb6255
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#import "SYS.h"
+
+LEAF(_ptrace)
+       li      r7,0
+       REG_TO_EXTERN(r7,_errno)
+SYSCALL_NONAME(ptrace, 4)
+       blr
diff --git a/sys.subproj/ppc.subproj/quota.s b/sys.subproj/ppc.subproj/quota.s
new file mode 100644 (file)
index 0000000..d299496
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+#define        SYS_quota       149
+
+SYSCALL(quota, 4)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/quotactl.s b/sys.subproj/ppc.subproj/quotactl.s
new file mode 100644 (file)
index 0000000..78e71bc
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(quotactl, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/read.s b/sys.subproj/ppc.subproj/read.s
new file mode 100644 (file)
index 0000000..11ef4b7
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(read, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/readlink.s b/sys.subproj/ppc.subproj/readlink.s
new file mode 100644 (file)
index 0000000..48e113e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(readlink, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/readv.s b/sys.subproj/ppc.subproj/readv.s
new file mode 100644 (file)
index 0000000..b002966
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(readv, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/reboot.s b/sys.subproj/ppc.subproj/reboot.s
new file mode 100644 (file)
index 0000000..90bc47b
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved */
+
+#import        "SYS.h"
+
+SYSCALL(reboot, 2)
+       BRANCH_EXTERN(_abort)
diff --git a/sys.subproj/ppc.subproj/recvfrom.s b/sys.subproj/ppc.subproj/recvfrom.s
new file mode 100644 (file)
index 0000000..567b3e8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(recvfrom, 6)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/recvmsg.s b/sys.subproj/ppc.subproj/recvmsg.s
new file mode 100644 (file)
index 0000000..aeb5106
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(recvmsg, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/rename.s b/sys.subproj/ppc.subproj/rename.s
new file mode 100644 (file)
index 0000000..a2adfd0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(rename, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/reset_shared_file.s b/sys.subproj/ppc.subproj/reset_shared_file.s
new file mode 100644 (file)
index 0000000..a43aba6
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(reset_shared_file, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/revoke.s b/sys.subproj/ppc.subproj/revoke.s
new file mode 100644 (file)
index 0000000..3e2ae5a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(revoke, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/rmdir.s b/sys.subproj/ppc.subproj/rmdir.s
new file mode 100644 (file)
index 0000000..245e79d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(rmdir, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/searchfs.s b/sys.subproj/ppc.subproj/searchfs.s
new file mode 100644 (file)
index 0000000..6d04cda
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(searchfs, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/select.s b/sys.subproj/ppc.subproj/select.s
new file mode 100644 (file)
index 0000000..f23d513
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(select, 5)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_close.s b/sys.subproj/ppc.subproj/sem_close.s
new file mode 100644 (file)
index 0000000..cee016c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_close, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_destroy.s b/sys.subproj/ppc.subproj/sem_destroy.s
new file mode 100644 (file)
index 0000000..b9339c0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_destroy, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_getvalue.s b/sys.subproj/ppc.subproj/sem_getvalue.s
new file mode 100644 (file)
index 0000000..72317b5
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_getvalue, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_init.s b/sys.subproj/ppc.subproj/sem_init.s
new file mode 100644 (file)
index 0000000..06fd281
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_init, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_open.s b/sys.subproj/ppc.subproj/sem_open.s
new file mode 100644 (file)
index 0000000..c997c38
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_open, 4)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_post.s b/sys.subproj/ppc.subproj/sem_post.s
new file mode 100644 (file)
index 0000000..4c58ce4
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_post, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_trywait.s b/sys.subproj/ppc.subproj/sem_trywait.s
new file mode 100644 (file)
index 0000000..7c0d846
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_trywait, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_unlink.s b/sys.subproj/ppc.subproj/sem_unlink.s
new file mode 100644 (file)
index 0000000..9ddb3d8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_unlink, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sem_wait.s b/sys.subproj/ppc.subproj/sem_wait.s
new file mode 100644 (file)
index 0000000..c5d166d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sem_wait, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/semconfig.s b/sys.subproj/ppc.subproj/semconfig.s
new file mode 100644 (file)
index 0000000..ac9fc2f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(semconfig, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/semctl.s b/sys.subproj/ppc.subproj/semctl.s
new file mode 100644 (file)
index 0000000..847bd99
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(semctl, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/semget.s b/sys.subproj/ppc.subproj/semget.s
new file mode 100644 (file)
index 0000000..a5339bd
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(semget, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/semop.s b/sys.subproj/ppc.subproj/semop.s
new file mode 100644 (file)
index 0000000..bb743b3
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(semop, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/semsys.s b/sys.subproj/ppc.subproj/semsys.s
new file mode 100644 (file)
index 0000000..a6c38d6
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(semsys, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sendmsg.s b/sys.subproj/ppc.subproj/sendmsg.s
new file mode 100644 (file)
index 0000000..d5843d4
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sendmsg, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sendto.s b/sys.subproj/ppc.subproj/sendto.s
new file mode 100644 (file)
index 0000000..3ba2164
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sendto, 6)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setattrlist.s b/sys.subproj/ppc.subproj/setattrlist.s
new file mode 100644 (file)
index 0000000..136332b
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(setattrlist, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/setegid.s b/sys.subproj/ppc.subproj/setegid.s
new file mode 100644 (file)
index 0000000..c0c16f2
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setegid, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/seteuid.s b/sys.subproj/ppc.subproj/seteuid.s
new file mode 100644 (file)
index 0000000..9ecfa30
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(seteuid, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setgid.s b/sys.subproj/ppc.subproj/setgid.s
new file mode 100644 (file)
index 0000000..eefae95
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setgid, 1)
+       blr
diff --git a/sys.subproj/ppc.subproj/setgroups.s b/sys.subproj/ppc.subproj/setgroups.s
new file mode 100644 (file)
index 0000000..ee55f69
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setgroups, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setitimer.s b/sys.subproj/ppc.subproj/setitimer.s
new file mode 100644 (file)
index 0000000..26ba852
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setitimer, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setjmp.s b/sys.subproj/ppc.subproj/setjmp.s
new file mode 100644 (file)
index 0000000..78fbc76
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
+ *
+ *     File: sys/ppc/setjmp.s
+ *
+ *     Implements sigsetjmp(), setjmp(), _setjmp()
+ *
+ *     NOTE:   Scatterloading this file will BREAK the functions.
+ *
+ *     History:
+ *     30-Aug-1998     Umesh Vaishampayan      (umeshv@apple.com)
+ *             Created. Derived from _setjmp.s, setjmp.c and setjmp.s
+ */
+
+#include "SYS.h"
+#include <architecture/ppc/asm_help.h>
+#include "_setjmp.h"
+
+/*
+ * setjmp  routines
+ */
+
+/*     int sigsetjmp(sigjmp_buf env, int savemask); */
+
+LEAF(_sigsetjmp)
+       cmpwi cr1,r4,0                  ; this changes cr1[EQ] which is volatile
+       stw r4, JMP_SIGFLAG(r3) ; save the sigflag for use by siglongjmp()
+       beq- cr1, L__setjmp             ; if r4 == 0 do _setjmp()
+       ; else *** fall through ***  to setjmp()
+
+/*     int setjmp(jmp_buf env); */
+
+LEAF(_setjmp)
+L_setjmp:
+       mflr r0
+       stw r31, JMP_r31(r3)
+       stw r0, JMP_lr(r3)
+       mr r31, r3
+       li r3, 0                                ; get the previous signal mask
+       CALL_EXTERN(_sigblock)
+       stw r3, JMP_sig(r31)    ; save the previous mask
+       mr r3, r31
+       lwz r0, JMP_lr(r3)
+       mtlr r0
+       lwz r31, JMP_r31(r3)
+L__setjmp:
+       BRANCH_EXTERN(__setjmp)
diff --git a/sys.subproj/ppc.subproj/setpgid.s b/sys.subproj/ppc.subproj/setpgid.s
new file mode 100644 (file)
index 0000000..55dea92
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setpgid, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setpriority.s b/sys.subproj/ppc.subproj/setpriority.s
new file mode 100644 (file)
index 0000000..f550c21
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setpriority, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setprivexec.s b/sys.subproj/ppc.subproj/setprivexec.s
new file mode 100644 (file)
index 0000000..dfcb10e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setprivexec, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setquota.s b/sys.subproj/ppc.subproj/setquota.s
new file mode 100644 (file)
index 0000000..edc8f40
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+#define        SYS_setquota    148
+
+SYSCALL(setquota, 2)
+       blr
diff --git a/sys.subproj/ppc.subproj/setrlimit.s b/sys.subproj/ppc.subproj/setrlimit.s
new file mode 100644 (file)
index 0000000..36796f0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setrlimit, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setsid.s b/sys.subproj/ppc.subproj/setsid.s
new file mode 100644 (file)
index 0000000..793019c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setsid, 0)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setsockopt.s b/sys.subproj/ppc.subproj/setsockopt.s
new file mode 100644 (file)
index 0000000..a5eb732
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setsockopt, 5)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/settimeofday.s b/sys.subproj/ppc.subproj/settimeofday.s
new file mode 100644 (file)
index 0000000..322876f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(settimeofday, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/setuid.s b/sys.subproj/ppc.subproj/setuid.s
new file mode 100644 (file)
index 0000000..d9d5dff
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(setuid, 1)
+       blr
diff --git a/sys.subproj/ppc.subproj/shm_open.s b/sys.subproj/ppc.subproj/shm_open.s
new file mode 100644 (file)
index 0000000..28c8418
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shm_open, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shm_unlink.s b/sys.subproj/ppc.subproj/shm_unlink.s
new file mode 100644 (file)
index 0000000..514dbf9
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shm_unlink, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shmat.s b/sys.subproj/ppc.subproj/shmat.s
new file mode 100644 (file)
index 0000000..f0752cc
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shmat, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shmctl.s b/sys.subproj/ppc.subproj/shmctl.s
new file mode 100644 (file)
index 0000000..ef50a7f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shmctl, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shmdt.s b/sys.subproj/ppc.subproj/shmdt.s
new file mode 100644 (file)
index 0000000..ca48fc6
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shmdt, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shmget.s b/sys.subproj/ppc.subproj/shmget.s
new file mode 100644 (file)
index 0000000..c9237ed
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shmget, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shmsys.s b/sys.subproj/ppc.subproj/shmsys.s
new file mode 100644 (file)
index 0000000..846b113
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shmsys, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/shutdown.s b/sys.subproj/ppc.subproj/shutdown.s
new file mode 100644 (file)
index 0000000..65970a1
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(shutdown, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sigaltstack.s b/sys.subproj/ppc.subproj/sigaltstack.s
new file mode 100644 (file)
index 0000000..1e28861
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sigaltstack, 3)
+       blr
diff --git a/sys.subproj/ppc.subproj/sigpending.s b/sys.subproj/ppc.subproj/sigpending.s
new file mode 100644 (file)
index 0000000..8da6e14
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sigpending, 1)
+       blr
diff --git a/sys.subproj/ppc.subproj/sigreturn.s b/sys.subproj/ppc.subproj/sigreturn.s
new file mode 100644 (file)
index 0000000..2f7f0f3
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/m98k/sys/sigreturn.s
+ *
+ *     The sigreturn() system call.
+ *
+ *     The M98K sigcontext structure is more robust than older cousins.
+ *     This routine is responsible for restoring register state
+ *     based on the setting of sc_regs_saved before trapping into the
+ *     kernel.  See <bsd/m98k/signal.h>
+ *
+ * HISTORY
+ * 18-Nov-92  Ben Fathi (benf@next.com)
+ *     Ported to m98k.
+ *
+ * 13-Jan-92  Peter King (king@next.com)
+ *     Created.
+ */
+
+#import        "assym.h"
+#import        "SYS.h"
+
+/*
+ * r3 = sigcontext pointer
+ */
+
+LEAF(_sigreturn)
+
+       /* Now call the kernel routine to restore the rest */   
+
+       SYSCALL_NONAME(sigreturn, 1)
+       blr
+END(_sigreturn)
diff --git a/sys.subproj/ppc.subproj/socket.s b/sys.subproj/ppc.subproj/socket.s
new file mode 100644 (file)
index 0000000..db1141a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(socket, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/socketpair.s b/sys.subproj/ppc.subproj/socketpair.s
new file mode 100644 (file)
index 0000000..55e96dc
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(socketpair, 5)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/stat.s b/sys.subproj/ppc.subproj/stat.s
new file mode 100644 (file)
index 0000000..4b731d4
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(stat, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/statfs.s b/sys.subproj/ppc.subproj/statfs.s
new file mode 100644 (file)
index 0000000..e2833c3
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(statfs, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/statv.s b/sys.subproj/ppc.subproj/statv.s
new file mode 100644 (file)
index 0000000..1979fea
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright 1998 Apple Computer, Inc. */
+
+#include "SYS.h"
+
+SYSCALL(statv, 0)
+       blr
diff --git a/sys.subproj/ppc.subproj/swapon.s b/sys.subproj/ppc.subproj/swapon.s
new file mode 100644 (file)
index 0000000..b6af343
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(swapon, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/symlink.s b/sys.subproj/ppc.subproj/symlink.s
new file mode 100644 (file)
index 0000000..9c8bb6e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(symlink, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/sync.s b/sys.subproj/ppc.subproj/sync.s
new file mode 100644 (file)
index 0000000..308892e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(sync, 0)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/syscall.s b/sys.subproj/ppc.subproj/syscall.s
new file mode 100644 (file)
index 0000000..fec2d28
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved. */
+
+#include "SYS.h"
+
+PSEUDO(syscall, syscall, 7)
+       blr
diff --git a/sys.subproj/ppc.subproj/table.s b/sys.subproj/ppc.subproj/table.s
new file mode 100644 (file)
index 0000000..6c24f1c
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(table, 5)
+       blr
diff --git a/sys.subproj/ppc.subproj/truncate.s b/sys.subproj/ppc.subproj/truncate.s
new file mode 100644 (file)
index 0000000..0b43058
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(truncate, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/umask.s b/sys.subproj/ppc.subproj/umask.s
new file mode 100644 (file)
index 0000000..b5b594b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(umask, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/undelete.s b/sys.subproj/ppc.subproj/undelete.s
new file mode 100644 (file)
index 0000000..d26927f
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(undelete, 1)
+       blr
diff --git a/sys.subproj/ppc.subproj/unlink.s b/sys.subproj/ppc.subproj/unlink.s
new file mode 100644 (file)
index 0000000..ef6071a
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(unlink, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/unmount.s b/sys.subproj/ppc.subproj/unmount.s
new file mode 100644 (file)
index 0000000..20e114b
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(unmount, 1)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/ur_cthread.s b/sys.subproj/ppc.subproj/ur_cthread.s
new file mode 100644 (file)
index 0000000..f3695ba
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+        .text
+        .align 2
+        .globl __pthread_self
+__pthread_self:
+        li r0, 0x7FF2
+        sc
+        blr
diff --git a/sys.subproj/ppc.subproj/utimes.s b/sys.subproj/ppc.subproj/utimes.s
new file mode 100644 (file)
index 0000000..abb5f14
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(utimes, 2)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/vfork.s b/sys.subproj/ppc.subproj/vfork.s
new file mode 100644 (file)
index 0000000..6a3277a
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/ppc/sys/vfork.s
+ *
+ * HISTORY
+ * 23-Jun-1998 Umesh Vaishampayan (umeshv@apple.com)
+ *     Created from fork.s
+ *
+ */
+
+#if 1
+#import <sys/syscall.h>
+#import <architecture/ppc/asm_help.h>
+#import        <architecture/ppc/pseudo_inst.h>
+#import        <mach/ppc/syscall_sw.h>
+
+/* We use 8 bytes for LOCAL_VAR(1) and LOCAL_VAR(2) */
+NESTED(_vfork, 8, 0, 0, 0)
+       CALL_EXTERN(__cthread_fork_prepare)
+#if defined(__DYNAMIC__)
+.cstring
+LC1:
+       .ascii  "__dyld_fork_prepare\0"
+.text
+       .align 2
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC1-1b)
+       addi    r3,r3,lo16(LC1-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl   
+#endif
+       li      r0,SYS_vfork
+       sc
+       b       Lbotch                  // error return
+
+       cmpwi   r4,0
+       beq     Lparent                 // parent, since a1 == 0 in parent,
+                                       //                     1 in child
+#if defined(__DYNAMIC__)
+.cstring
+LC3:
+       .ascii  "__dyld_fork_child\0"
+.text
+       .align 2
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC3-1b)
+       addi    r3,r3,lo16(LC3-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl   
+#endif
+       CALL_EXTERN(_fork_mach_init)
+       CALL_EXTERN(__cthread_fork_child)
+#if defined(__DYNAMIC__)
+.cstring
+LC4:
+       .ascii  "__dyld_fork_child_final\0"
+.text
+       .align 2
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC4-1b)
+       addi    r3,r3,lo16(LC4-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl   
+#endif
+
+       li      r3,0
+       b       Lreturn
+
+Lparent:
+#if defined(__DYNAMIC__)
+       stw     r3,LOCAL_VAR(2)(r1)     // save child pid
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC2-1b)
+       addi    r3,r3,lo16(LC2-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl           
+#endif
+       CALL_EXTERN(__cthread_fork_parent)
+#if defined(__DYNAMIC__)
+       lwz     r3,LOCAL_VAR(2)(r1)
+#endif
+       b       Lreturn
+
+Lbotch:        
+#if defined(__DYNAMIC__)
+.cstring
+LC2:
+       .ascii  "__dyld_fork_parent\0"
+.text
+       .align 2
+       stw     r3,LOCAL_VAR(2)(r1)     // save error value
+       mflr    r0
+       bl      1f
+1:     mflr    r3
+       mtlr    r0
+       addis   r3,r3,ha16(LC2-1b)
+       addi    r3,r3,lo16(LC2-1b)
+       addi    r4,r1,LOCAL_VAR(1)
+       bl      __dyld_func_lookup
+       lwz     r3,LOCAL_VAR(1)(r1)
+       mtspr   ctr,r3
+       bctrl
+       lwz     r3,LOCAL_VAR(2)(r1)     // restore error value for cerror
+               
+#endif
+       CALL_EXTERN(cerror)
+       /*
+        * We use cthread_fork_parent() to clean up after a fork error
+        * (unlock cthreads and mailloc packages) so the parent
+        * process can Malloc() after fork() errors without
+        * deadlocking.
+        */
+       CALL_EXTERN_AGAIN(__cthread_fork_parent)
+       li32    r3,-1                   // error return
+Lreturn:       RETURN
+END(_vfork)
+#else
+#include "SYS.h"
+
+.text
+.align 2
+.globl _vfork
+_vfork:
+       li      r0,SYS_vfork
+       sc
+       b       Lbotch                  // error return
+
+       cmpwi   r4,0
+       beqlr                   // parent, since a1 == 0 in parent,
+       li      r3,0
+       blr
+Lbotch:        
+       BRANCH_EXTERN(cerror)
+#endif
+
diff --git a/sys.subproj/ppc.subproj/wait4.s b/sys.subproj/ppc.subproj/wait4.s
new file mode 100644 (file)
index 0000000..56c6921
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(wait4, 4)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/write.s b/sys.subproj/ppc.subproj/write.s
new file mode 100644 (file)
index 0000000..ef0833d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(write, 3)
+       blr
+
diff --git a/sys.subproj/ppc.subproj/writev.s b/sys.subproj/ppc.subproj/writev.s
new file mode 100644 (file)
index 0000000..499ce7f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include "SYS.h"
+
+SYSCALL(writev, 3)
+       blr
+
diff --git a/sys.subproj/sem_close.2 b/sys.subproj/sem_close.2
new file mode 100644 (file)
index 0000000..9d09d20
--- /dev/null
@@ -0,0 +1,61 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd June 8, 2000
+.Dt SEM_CLOSE 2
+.Os Darwin
+.Sh NAME
+.Nm sem_close
+.Nd close a named semaphore
+.Sh SYNOPSIS
+.Fd #include <semaphore.h>
+.Ft int
+.Fn sem_close "sem_t *sem"
+.Sh DESCRIPTION
+The system resources associated with the named semaphore referenced by
+.Fa sem
+are deallocated and the descriptor is invalidated.
+.Pp
+If successful,
+.Fn sem_close
+will return 0.  Otherwise, -1 is returned and
+.Va errno
+is set.
+.Sh ERRORS
+.Fn sem_close
+succeeds unless:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+.Fa sem
+is not a valid semaphore descriptor.
+.El
+.Sh SEE ALSO
+.Xr semctl 2 ,
+.Xr semget 2 ,
+.Xr semop 2 ,
+.Xr sem_init 2 ,
+.Xr sem_open 2 ,
+.Xr sem_unlink 2
+.Sh HISTORY
+.Fn sem_close
+is specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/sem_open.2 b/sys.subproj/sem_open.2
new file mode 100644 (file)
index 0000000..582bb25
--- /dev/null
@@ -0,0 +1,163 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd June 8, 2000
+.Dt SEM_OPEN 2
+.Os Darwin
+.Sh NAME
+.Nm sem_open
+.Nd initialize and open a named semaphore
+.Sh SYNOPSIS
+.Fd #include <semaphore.h>
+.Ft sem_t *
+.Fn sem_open "const char *name" "int flags"
+.Ft sem_t *
+.Fn sem_open "const char *name" "int flags" "mode_t mode" "unsigned int value"
+.Sh DESCRIPTION
+The named semaphore named
+.Fa name
+is initialized and opened as specified by the argument
+.Fa flags
+and a semaphore descriptor is returned to the calling process.
+.Pp
+The flags specified are formed by
+.Em or Ns 'ing
+the following values:
+.Pp
+.Bd -literal -offset indent -compact
+O_CREAT                create the semaphore if it does not exist
+O_EXCL         error if create and semaphore exists
+.Ed
+.Pp
+If
+.Dv O_CREATE
+if specified,
+.Fn sem_open
+requires an additional two arguments.
+.Fa mode
+specifies the permissions for the semaphore as described in
+.Xr chmod 2
+and modified by the process' umask value (see
+.Xr umask 2 ) .
+The semaphore is created with an initial
+.Fa value ,
+which must be less than or equal to
+.Dv SEM_VALUE_MAX .
+.Pp
+If
+.Dv O_EXCL
+is specified and the semaphore exists,
+.Fn sem_open
+fails.  The check for the existence of the semaphore and the creation
+of the semaphore are atomic with respect to all processes calling
+.Fn sem_open
+with
+.Dv O_CREAT
+and
+.Dv O_EXCL
+set.
+.Pp
+When a new semaphore is created, it is given the user ID and group ID
+which coorespond to the effective user and group IDs of the calling
+process. There is no visible entry in the file system for the created
+object in this implementation.
+.Pp
+The returned semaphore descriptor is available to the calling process
+until it is closed with
+.Fn sem_close ,
+or until the caller exits or execs.
+.Pp
+If a process makes repeated calls to
+.Fn sem_open ,
+with the same
+.Fa name
+argument, the same descriptor is returned for each successful call,
+unless
+.Fn sem_unlink
+has been called on the semaphore in the interim.
+.Pp
+If
+.Fn sem_open
+fails for any reason, it will return a value of
+.Dv SEM_FAILED
+and sets
+.Va errno .
+On success, it returns a semaphore descriptor.
+.Sh ERRORS
+The named semaphore is opened unless:
+.Bl -tag -width Er
+.It Bq Er EACCES
+The required permissions (for reading and/or writing)
+are denied for the given flags; or
+.Dv O_CREAT
+is specified, the object does not exist, and permission to
+create the semaphore is denied.
+.It Bq Er EEXIST
+.Dv O_CREAT
+and
+.Dv O_EXCL
+were specified and the semaphore exists.
+.It Bq Er EINTR
+The
+.Fn sem_open
+operation was interrupted by a signal.
+.It Bq Er EINVAL
+The
+.Fn shm_open
+operation is not supported; or
+.Dv O_CREAT
+is specified and
+.Fa value
+exceeds
+.Dv SEM_VALUE_MAX .
+.It Bq Er EMFILE
+The process has already reached its limit for semaphores or file
+descriptors in use.
+.It Bq Er ENAMETOOLONG
+.Fa name
+exceeded
+.Dv SEM_NAME_LEN
+characters.
+.It Bq Er ENFILE
+Too many semaphores or file descriptors are open on the system.
+.It Bq Er ENOENT
+.Dv O_CREAT
+is not set and the named semaphore does not exist.
+.It Bq Er ENOSPC
+.Dv O_CREAT
+is specified, the file does not exist, and there is insufficient
+space available to create the semaphore.
+.El
+.Sh SEE ALSO
+.Xr semctl 2 ,
+.Xr semget 2 ,
+.Xr semop 2 ,
+.Xr sem_close 2 ,
+.Xr sem_post 2 ,
+.Xr sem_trywait 2 ,
+.Xr sem_unlink 2 ,
+.Xr sem_wait 2 ,
+.Xr umask 2
+.Sh HISTORY
+.Fn sem_open
+is specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/sem_post.2 b/sys.subproj/sem_post.2
new file mode 100644 (file)
index 0000000..8f2b285
--- /dev/null
@@ -0,0 +1,66 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd June 8, 2000
+.Dt SEM_POST 2
+.Os Darwin
+.Sh NAME
+.Nm sem_post
+.Nd unlock a semaphore
+.Sh SYNOPSIS
+.Fd #include <semaphore.h>
+.Ft int
+.Fn sem_post "sem_t *sem"
+.Sh DESCRIPTION
+The the semaphore referenced by
+.Fa sem
+is unlocked, the value of the semaphore is incremented, and all
+threads which are waiting on the semaphore are awakened.
+.Pp
+.Fn sem_post
+is reentrant with respect to signals and may be called from within a
+signal hanlder.
+.Pp
+If successful,
+.Fn sem_post
+will return 0.  Otherwise, -1 is returned and
+.Va errno
+is set.
+.Sh ERRORS
+.Fn sem_post
+succeeds unless:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+.Fa sem
+is not a valid semaphore descriptor.
+.El
+.Sh SEE ALSO
+.Xr semctl 2 ,
+.Xr semget 2 ,
+.Xr semop 2 ,
+.Xr sem_open 2 ,
+.Xr sem_trywait 2 ,
+.Xr sem_wait 2
+.Sh HISTORY
+.Fn sem_post
+is specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/sem_trywait.2 b/sys.subproj/sem_trywait.2
new file mode 100644 (file)
index 0000000..c0db675
--- /dev/null
@@ -0,0 +1 @@
+.so man2/sem_wait.2
diff --git a/sys.subproj/sem_unlink.2 b/sys.subproj/sem_unlink.2
new file mode 100644 (file)
index 0000000..785862d
--- /dev/null
@@ -0,0 +1,75 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd June 8, 2000
+.Dt SEM_UNLINK 2
+.Os Darwin
+.Sh NAME
+.Nm sem_unlink
+.Nd remove a named semaphore
+.Sh SYNOPSIS
+.Fd #include <semaphore.h>
+.Ft int
+.Fn sem_unlink "const char *name"
+.Sh DESCRIPTION
+The named semaphore named
+.Fa name
+is removed.  If the semaphore is in use my other processes, then
+.Fa name
+is immeditately dissasociated with the semaphore, but the semaphore
+itself will not be removed until all references to it have been
+closed.  Subsequent calls to
+.Fn sem_open
+using
+.Fa name
+will refer to or create a new semaphore named
+.Fa name .
+.Pp
+If successful,
+.Fn sem_close
+will return 0.  Otherwise, -1 is returned and
+.Va errno
+is set, and the state of the semaphore is unchanged.
+.Sh ERRORS
+.Fn sem_unlink
+succeeds unless:
+.Bl -tag -width Er
+.It Bq Er EACCES
+Permission is denied to be remove the semaphore.
+.It Bq Er ENAMETOOLONG
+.Fa name
+exceeded
+.Dv SEM_NAME_LEN
+characters.
+.It Bq Er ENOENT
+The named semaphore does not exist.
+.El
+.Sh SEE ALSO
+.Xr semctl 2 ,
+.Xr semget 2 ,
+.Xr semop 2 ,
+.Xr sem_close 2 ,
+.Xr sem_open 2
+.Sh HISTORY
+.Fn sem_unlink
+is specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/sem_wait.2 b/sys.subproj/sem_wait.2
new file mode 100644 (file)
index 0000000..db5a1b8
--- /dev/null
@@ -0,0 +1,89 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd June 8, 2000
+.Dt SEM_WAIT 2
+.Os Darwin
+.Sh NAME
+.Nm sem_wait, sem_trywait
+.Nd lock a semaphore
+.Sh SYNOPSIS
+.Fd #include <semaphore.h>
+.Ft int
+.Fn sem_wait "sem_t *sem"
+.Ft int
+.Fn sem_trywait "sem_t *sem"
+.Sh DESCRIPTION
+The semaphore referenced by
+.Fa sem
+is locked.  When calling
+.Fn sem_wait ,
+if the semaphore's value is zero, the calling thread will block until
+the lock is aquired or until the call is interrupted by a
+signal. Alternatively, the
+.Fn sem_trywait
+function will fail if the semaphore is already locked, rather than
+blocking on the semaphore.
+.Pp
+If successful (the lock was aquired),
+.Fn sem_wait
+and
+.Fn sem_trywait
+will return 0.  Otherwise, -1 is returned and
+.Va errno
+is set, and the state of the semaphore is unchanged.
+.Sh ERRORS
+.Fn sem_wait
+and
+.Fn sem_trywait
+succeed unless:
+.Bl -tag -width Er
+.It Bq Er EAGAIN
+The semaphore is already locked.
+.It Bq Er EINVAL
+.Fa sem
+is not a valid semaphore descriptor.
+.It Bq Er EDEADLK
+A deadlock was detected.
+.It Bq Er EINTR
+The call was interrupted by a signal.
+.El
+.Sh NOTES
+Applications may encounter a priority inversion while using
+semaphores.  When a thread is waiting on a semaphore which is about to
+be posted by a lower-priority thread and the lower-priority thread is
+preempted by another thread (of medium priority), a priority inversion
+has occured, and the higher-priority thread will be blocked for an
+unlimited time period.  Programmers using the realtime functionality
+of the system should take care to avoid priority inversions.
+.Sh SEE ALSO
+.Xr semctl 2 ,
+.Xr semget 2 ,
+.Xr semop 2 ,
+.Xr sem_open 2 ,
+.Xr sem_post 2
+.Sh HISTORY
+.Fn sem_wait
+and
+.Fn sem_trywait
+are specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/shm_open.2 b/sys.subproj/shm_open.2
new file mode 100644 (file)
index 0000000..24dac52
--- /dev/null
@@ -0,0 +1,176 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd September 20, 1999
+.Dt SHM_OPEN 2
+.Os Darwin
+.Sh NAME
+.Nm shm_open
+.Nd open a shared memory object
+.Sh SYNOPSIS
+.Fd #include <sys/mman.h>
+.Ft int
+.Fn shm_open "const char *name" "int flags" "mode_t mode"
+.Sh DESCRIPTION
+The shared memory object referenced by
+.Fa name
+is opened for reading and/or writing as specified by the argument
+.Fa flags
+and the file descriptor returned to the calling process.
+The returned file descriptor will be the lowest non-open file
+descriptor for the calling process, and is not shared with any
+other processes, as it is a new file descriptor. The new file
+descriptor will have the
+.Dv FD_CLOEXEC
+flag set.
+Repeated calls
+to
+.Nm shm_open
+with the same string value for
+.Fn name
+will return a file descriptor referring to the same shared memory
+object, provided that the object has not been unlinked by a call to
+.Fn shm_unlink .
+The
+.Fa flags
+argument may indicate the file is to be
+created if it does not exist (by specifying the
+.Dv O_CREAT
+flag), in which case the file is created with mode
+.Fa mode
+as described in
+.Xr chmod 2
+and modified by the process' umask value (see
+.Xr umask 2 ) .
+.Pp
+The flags specified are formed by
+.Em or Ns 'ing
+the following values:
+.Pp
+.Bd -literal -offset indent -compact
+O_RDONLY       open for reading only
+O_RDWR         open for reading and writing
+O_CREAT                create object if it does not exist
+O_EXCL         error if create and object exists
+O_TRUNC                truncate size to 0
+.Ed
+.Pp
+Exactly one of
+.Dv O_RDONLY
+or
+.Dv O_RDWR
+must be specified.
+.Pp
+If
+.Dv O_TRUNC
+is specified and the
+file exists, the file is truncated to zero length.
+If
+.Dv O_EXCL
+is set with
+.Dv O_CREAT
+and the file already
+exists,
+.Fn shm_open
+returns an error.  This may be used to
+implement a simple exclusive access locking mechanism.
+.Pp
+If successful,
+.Fn shm_open
+returns a non-negative integer, termed a file descriptor.
+It returns -1 and sets
+.Va errno
+on failure.
+The file pointer used to mark the current position within the
+memory object is set to the beginning of the object.
+.Pp
+When a new shared memory object is created it is given the
+owner and group corresponding to the effective user and
+group of the calling process. There is no visible entry in the
+file system for the created object in this implementation.
+.Pp
+When a shared memory object is created, it persists until it
+it unlinked and all other references are gone. Objects do
+not persist across a system reboot.
+.Pp
+The new descriptor is set to remain open across
+.Xr execve
+system calls; see
+.Xr close 2
+and
+.Xr fcntl 2 .
+.Pp
+The system imposes a limit on the number of file descriptors
+open simultaneously by one process.
+.Xr Getdtablesize 2
+returns the current system limit.
+.Sh ERRORS
+The named object is opened unless:
+.Bl -tag -width Er
+.It Bq Er EACCES
+The required permissions (for reading and/or writing)
+are denied for the given flags.
+.It Bq Er EACCES
+.Dv O_CREAT
+is specified, the object does not exist, and permission to
+create the object is denied.
+.It Bq Er EEXIST
+.Dv O_CREAT
+and
+.Dv O_EXCL
+were specified and the object exists.
+.It Bq Er EINTR
+The
+.Fn shm_open
+operation was interrupted by a signal.
+.It Bq Er EINVAL
+The
+.Fn shm_open
+operation is not supported.
+.It Bq Er EMFILE
+The process has already reached its limit for open file descriptors.
+.It Bq Er ENAMETOOLONG
+.Fa name
+exceeded
+.Dv SHM_NAME_MAX
+characters.
+.It Bq Er ENFILE
+The system file table is full.
+.It Bq Er ENOENT
+.Dv O_CREAT
+is not set and the named object does not exist.
+.It Bq Er ENOSPC
+.Dv O_CREAT
+is specified, the file does not exist, and there is insufficient
+space available to create the object.
+.El
+.Sh SEE ALSO
+.Xr chmod 2 ,
+.Xr close 2 ,
+.Xr getdtablesize 2 ,
+.Xr mmap 2 ,
+.Xr shm_unlink 2 ,
+.Xr umask 2
+.Sh HISTORY
+.Fn shm_open
+is specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/shm_unlink.2 b/sys.subproj/shm_unlink.2
new file mode 100644 (file)
index 0000000..a2a2191
--- /dev/null
@@ -0,0 +1,74 @@
+.\"    $Darwin$
+.\"
+.\" Wilfredo Sanchez, wsanchez@apple.com
+.\" Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+.\"
+.\" @APPLE_LICENSE_HEADER_START@
+.\" 
+.\" The contents of this file constitute Original Code as defined in and
+.\" are subject to the Apple Public Source License Version 1.1 (the
+.\" "License").  You may not use this file except in compliance with the
+.\" License.  Please obtain a copy of the License at
+.\" http://www.apple.com/publicsource and read it before using this file.
+.\" 
+.\" This Original Code and all software distributed under the License are
+.\" distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+.\" FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+.\" License for the specific language governing rights and limitations
+.\" under the License.
+.\" 
+.\" @APPLE_LICENSE_HEADER_END@
+.\"
+.Dd September 20, 1999
+.Dt SHM_UNLINK 2
+.Os Darwin
+.Sh NAME
+.Nm shm_unlink
+.Nd remove shared memory object
+.Sh SYNOPSIS
+.Fd #include <sys/mman.h>
+.Ft int
+.Fn shm_unlink "const char *name"
+.Sh DESCRIPTION
+The
+.Fn shm_unlink
+function removes the shared memory object named by
+.Fa name .
+If no process has the file open, then all resources associated
+with the object are reclaimed.
+If one or more process have the object open, the name removed,
+but the removal of the memory object is delayed until all
+references to it have been closed.
+.Sh RETURN VALUES
+Upon successful completion, a value of 0 is returned.
+Otherwise, a value of -1 is returned and
+.Va errno
+is set to indicate the error, and the named shared memory object
+will remain unchanged.
+.Sh ERRORS
+The
+.Fn shm_unlink
+succeeds unless:
+.Bl -tag -width Er
+.It Bq Er EACCES
+Permission is denied to be remove the object.
+.It Bq Er ENAMETOOLONG
+.Fa name
+exceeded
+.Dv SHM_NAME_MAX
+characters.
+.It Bq Er ENOENT
+The named object does not exist.
+.El
+.Sh SEE ALSO
+.Xr close 2 ,
+.Xr mmap 2 ,
+.Xr munmap 2 ,
+.Xr shmat 2 ,
+.Xr shmctl 2 ,
+.Xr shm_open 2
+.Sh HISTORY
+.Fn shm_open
+is specified in the POSIX Realtime Extension (1003.1b-1993/1003.1i-1995).
diff --git a/sys.subproj/sigaction.c b/sys.subproj/sigaction.c
new file mode 100644 (file)
index 0000000..5f57366
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ *
+ *     @(#)sigaction.c 1.0
+ */
+
+#include <sys/syscall.h>
+#include <signal.h>
+#include <sys/signal.h>
+#include <errno.h>
+
+/*
+ *     Intercept the sigaction syscall and use our signal trampoline
+ *     as the signal handler instead.  The code here is derived
+ *     from sigvec in sys/kern_sig.c.
+ */
+
+extern void    (*sigcatch[NSIG])();
+#if defined(__DYNAMIC__)
+extern int __in_sigtramp;
+#endif
+
+static int
+sigaction__ (sig, nsv, osv, bind)
+        int sig;
+       register struct sigaction *nsv, *osv;
+        int bind;
+{
+       struct sigaction vec;
+       void (*prevsig)();
+       extern void _sigtramp();
+
+       if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) {
+               errno = EINVAL;
+               return (-1);
+       }
+       prevsig = sigcatch[sig];
+       if (nsv) {
+               sigcatch[sig] = nsv->sa_handler;
+               vec = *nsv;  nsv = &vec;
+               if (nsv->sa_handler != (void (*)())SIG_DFL && nsv->sa_handler != (void (*)())SIG_IGN) {
+                       nsv->sa_handler = _sigtramp;
+#ifdef __DYNAMIC__
+                    if (bind && (__in_sigtramp == 0))                          // XXX
+                          _dyld_bind_fully_image_containing_address(sigcatch[sig]);
+#endif
+               }
+       }
+       if (syscall (SYS_sigaction, sig, nsv, osv) < 0) {
+               sigcatch[sig] = prevsig;
+               return (-1);
+       }
+       if (osv && prevsig)
+               osv->sa_handler = prevsig;
+       return (0);
+}
+
+
+int
+sigaction (sig, nsv, osv)
+        int sig;
+       register const struct sigaction *nsv;
+        register struct sigaction *osv;
+{
+    return sigaction__(sig, nsv, osv, 1);
+}
+
+// XXX
+#ifdef __DYNAMIC__
+
+int
+_sigaction_nobind (sig, nsv, osv)
+        int sig;
+       register const struct sigaction *nsv;
+        register struct sigaction *osv;
+{
+    return sigaction__(sig, nsv, osv, 0);
+}
+#endif
+
diff --git a/sys.subproj/sigcatch.c b/sys.subproj/sigcatch.c
new file mode 100644 (file)
index 0000000..2e19f89
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ * This file contains global data and the size of the global data can NOT
+ * change or otherwise it would make the shared library incompatable.  This
+ * data has been padded so new signals can be added.  Also see gen/siglist.c
+ */
+
+#include "sigcatch.h"
+
+/*
+ * Actually declare the global data.
+ */
+sigcatch_t sigcatch[PADDING] = { (void (*)(int, int, struct sigcontext *))0 };
+
+
diff --git a/sys.subproj/sigcatch.h b/sys.subproj/sigcatch.h
new file mode 100644 (file)
index 0000000..cf7ef81
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
+ *
+ *     File:   libc/m98k/sigcatch.h
+ *
+ *     Header file for sigtramp data structures.
+ */
+
+#include <sys/signal.h>
+
+/*
+ * Constants
+ */
+#define        PADDING 50
+
+/*
+ * Type definitions.
+ */
+typedef        void (*sigcatch_t)(int, int, struct sigcontext *);
+
+/*
+ * Global data.
+ */
+extern sigcatch_t      sigcatch[PADDING];
diff --git a/sys.subproj/sigprocmask.c b/sys.subproj/sigprocmask.c
new file mode 100644 (file)
index 0000000..2407eb6
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*     @(#)sigprocmask.c       1.0     9/26/95 (c) 1995 NeXT   */
+
+#include <sys/syscall.h>
+#include <signal.h>
+#include <sys/signal.h>
+#include <errno.h>
+
+/*
+ *     Translate sigprocmask call to system call interface.
+ */
+
+int   sigprocmask (
+        int how,
+        const sigset_t *nsm,
+        sigset_t *osm)
+{
+    sigset_t   mask;
+
+    if (nsm == 0) {
+        how = SIG_BLOCK;
+        sigemptyset(&mask);
+    } else {
+        mask = *nsm;
+    }
+    mask = (sigset_t) syscall(SYS_sigprocmask, how, mask);
+    /* syscall will call cerror if there is an error */
+    if (osm)
+        *osm = mask;
+    return 0;
+}
diff --git a/sys.subproj/sigsuspend.c b/sys.subproj/sigsuspend.c
new file mode 100644 (file)
index 0000000..dcc65be
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*     @(#)sigsuspend.c        1.0     9/22/95 (c) 1995 NeXT   */
+
+#include <sys/signal.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+int
+sigsuspend (
+            const sigset_t *sigmask_p
+)
+{
+    sigset_t   mask;
+    
+    if (sigmask_p)
+        mask = *sigmask_p;
+    else
+        sigemptyset(&mask);
+    return syscall (SYS_sigsuspend, mask);
+}
+
diff --git a/sys.subproj/sigtramp.c b/sys.subproj/sigtramp.c
new file mode 100644 (file)
index 0000000..407add5
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
+ */
+#import        "sigcatch.h"
+#import        <signal.h>
+#import        <sys/signal.h>
+
+/*
+ * sigvec registers _sigtramp as the handler for any signal requiring
+ * user-mode intervention.  All _sigtramp does is find the real handler,
+ * calls it, then sigreturn's.
+ *
+ * Note that the kernel saves/restores all of our register state.
+ */
+#if defined(__DYNAMIC__)
+int __in_sigtramp = 0;
+#endif
+
+void
+_sigtramp(
+       int                     code,
+       int                     subcode,
+       struct sigcontext       *scp
+) {
+       sigcatch_t      catcher;
+
+       catcher = sigcatch[code];
+#if defined(__DYNAMIC__)
+        __in_sigtramp++;
+#endif
+        catcher(code, subcode, scp);
+#if defined(__DYNAMIC__)
+        __in_sigtramp--;
+#endif
+        sigreturn(scp);
+}
diff --git a/threads.subproj/Makefile b/threads.subproj/Makefile
new file mode 100644 (file)
index 0000000..66f86ea
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = threads
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+HFILES = cthread_internals.h cthreads.h
+
+CFILES = cprocs.c cthreads.c lu_utils.c mig_support.c threads_data.c
+
+SUBPROJECTS = i386.subproj ppc.subproj
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+NEXTSTEP_INSTALLDIR = /Local/Developer/System
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+NEXTSTEP_PB_CFLAGS = -D__POSIX_LIB__
+PROJECT_HEADERS = cthread_internals.h cthreads.h
+
+
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /Local/Public/Sandbox/$(USER)/BUILD/$(NAME)
+
+NEXTSTEP_PUBLIC_HEADERS_DIR = /usr/include
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/threads.subproj/Makefile.postamble b/threads.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/threads.subproj/Makefile.preamble b/threads.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/threads.subproj/PB.project b/threads.subproj/PB.project
new file mode 100644 (file)
index 0000000..0fbe5d1
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (cthread_internals.h, cthreads.h); 
+        OTHER_LINKED = (cprocs.c, cthreads.c, lu_utils.c, mig_support.c, threads_data.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        PROJECT_HEADERS = (cthread_internals.h, cthreads.h); 
+        SUBPROJECTS = (i386.subproj, ppc.subproj); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/Local/Public/Sandbox/$(USER)/BUILD/$(NAME)"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_COMPILEROPTIONS = "-D__POSIX_LIB__"; 
+    NEXTSTEP_INSTALLDIR = /Local/Developer/System; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    NEXTSTEP_PUBLICHEADERSDIR = /usr/include; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = threads; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/threads.subproj/cprocs.c b/threads.subproj/cprocs.c
new file mode 100644 (file)
index 0000000..dfa18a8
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * HISTORY
+ * 22-July-93 Blaine Garst
+ *     fixed kernel cache set up of cproc info
+ *
+ * 05-April-90  Morris Meyer (mmeyer) at NeXT
+ *     Fixed bug in cproc_fork_child() where the first cproc would
+ *     try doing a msg_rpc() with an invalid reply port.
+ *
+ */
+
+/*
+ * cprocs.c - by Eric Cooper
+ *
+ * Implementation of cprocs (lightweight processes)
+ * and primitive synchronization operations.
+ */
+#include <stdlib.h>
+#include "pthread_internals.h"
+#include "cthreads.h"
+#include "cthread_internals.h"
+#include <mach/message.h>
+
+/*
+ * C Threads imports:
+ */
+extern void stack_init();
+extern void alloc_stack(), _dealloc_stack();
+
+/*
+ * Mach imports:
+ */
+extern mach_port_t mach_thread_self();
+extern boolean_t swtch_pri();
+
+private int cprocs_started = FALSE;
+
+#ifdef CTHREADS_DEBUG
+private void
+print_cproc(p)
+       cproc_t p;
+{
+       char *s;
+
+       switch (p->state) {
+           case CPROC_RUNNING:
+               s = "";
+               break;
+           case CPROC_SPINNING:
+               s = "+";
+               break;
+           case CPROC_BLOCKED:
+               s = "*";
+               break;
+           default:
+               ASSERT(SHOULDNT_HAPPEN);
+       }
+       printf(" %x(%s)%s",
+               p->id,
+               cthread_name(p->incarnation), s);
+}
+
+private void
+print_cproc_queue(name, queue)
+       const char * name;
+       cthread_queue_t queue;
+{
+       printf("[%s] %s:", cthread_name(cthread_self()), name);
+       cthread_queue_map(queue, cproc_t, print_cproc);
+       printf("\n");
+}
+#endif CTHREADS_DEBUG
+
+private int cproc_lock = 0;            /* unlocked */
+private cproc_t cprocs = NO_CPROC;     /* linked list of cprocs */
+
+#ifdef CTHREADS_DEBUG
+private void
+print_all_cprocs()
+{
+       cproc_t p;
+
+       printf("[%s] cprocs:", cthread_name(cthread_self()));
+       for (p = cprocs; p != NO_CPROC; p = p->link)
+               print_cproc(p);
+       printf("\n");
+}
+#endif CTHREADS_DEBUG
+
+/*
+ * Routines for supporting fork() of multi-threaded programs.
+ */
+
+void _cproc_fork_child()
+/*
+ * Called in the child after a fork().  Resets cproc data structures to
+ * coincide with the reality that we now have a single cproc and cthread.
+ */
+{
+       pthread_t pself;
+
+        pself = pthread_self();
+        pself->reply_port = MACH_PORT_NULL;
+}
+
+/*
+ *     Support for a per-thread UNIX errno.
+ */
+
+#undef errno
+extern int errno;
+void cthread_set_errno_self(error)
+       int     error;
+{
+       pthread_t t;
+
+       t = pthread_self();
+        if (t && (t->sig == _PTHREAD_SIG)) {
+            t->err_no = error;
+        }
+        errno = error;
+}
+
diff --git a/threads.subproj/cthread_internals.h b/threads.subproj/cthread_internals.h
new file mode 100644 (file)
index 0000000..901a438
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * HISTORY
+ * 08-Mar-90  Avadis Tevanian, Jr. (avie) at NeXT
+ *     Added errno field to cproc structure.
+ *
+ */
+
+/*
+ * cthread_internals.h - by Eric Cooper
+ *
+ * Private definitions for the C Threads implementation.
+ *
+ * The cproc structure is used for different implementations
+ * of the basic schedulable units that execute cthreads.
+ *
+ *     MTHREAD         MACH threads; single address space,
+ *                     kernel-mode preemptive scheduling
+ */
+#include <assert.h>
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+
+/*
+ * Low-level thread implementation.
+ * This structure must agree with struct ur_cthread in cthreads.h
+ */
+typedef struct cproc {
+       struct cproc *next;      /* for lock, condition, and ready queues */
+       struct cproc *incarnation;      /* for cthread_self() */
+       int state;
+       mach_port_t reply_port;         /* for mig_get_reply_port() */
+
+       mach_port_t wait_port;
+
+       int id;
+       struct cproc *link;             /* so all cprocs can be found
+                                          after a fork() */
+       int flags;
+
+       unsigned int stack_base;
+       unsigned int stack_size;
+       int     error;
+
+} *cproc_t;
+
+#define        NO_CPROC                ((cproc_t) 0)
+#define        cproc_self()            ((cproc_t) ur_cthread_self())
+extern void cthread_set_self(cproc_t p);
+
+/*
+ * Possible cproc states.
+ */
+#define        CPROC_RUNNING           0
+#define        CPROC_SPINNING          1
+#define        CPROC_BLOCKED           2
+
+/*
+ * The cproc flag bits.
+ */
+#define CPROC_INITIAL_STACK    0x1
+#define        CPROC_NOCACHE_THREAD    /* Don't try to cache this cthread on exit */
+
+/*
+ * C Threads imports:
+ */
+#ifdef __STRICT_BSD__
+extern char *malloc();
+#endif /* __STRICT_BSD__ */
+
+/*
+ * Mach imports:
+ */
+extern void mach_error();
+
+/*
+ * C library imports:
+ */
+#ifdef __STRICT_BSD__
+extern exit();
+#else
+#include <stdlib.h>
+#endif /* __STRICT_BSD__ */
+
+/*
+ * Macro for MACH kernel calls.
+ */
+#ifndef MACH_CALL
+#define        MACH_CALL(expr, ret) {                                          \
+       if (((ret) = (expr)) != KERN_SUCCESS) {                         \
+               mach_error(#expr, (ret));                               \
+               assert(0);                                              \
+       }                                                               \
+}
+#endif
+
+/*
+ * Debugging support.
+ */
+#ifdef CTHREADS_DEBUG
+
+#define        private
+#define        TRACE(x)        if (cthread_debug) x ; else
+extern int cthread_debug;
+
+/*
+ * C library imports:
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#else  /* CTHREADS_DEBUG */
+
+#define        private static
+#define        TRACE(x)
+
+#endif /* DEBUG */
diff --git a/threads.subproj/cthreads.c b/threads.subproj/cthreads.c
new file mode 100644 (file)
index 0000000..5bd7035
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * cthreads.c - by Eric Cooper
+ *
+ * Implementation of cthread_fork, cthread_join, cthread_exit, etc.
+ * HISTORY
+ * 22-July-93 Blaine Garst
+ *     fixed association of read_thread info
+ *     fixed kernel cache set up of cproc info
+ *
+ */
+#include <stdlib.h>
+#include "cthreads.h"
+#include "cthread_internals.h"
+#include "pthread_internals.h"
+/*
+ * C Threads imports:
+ */
+extern void cproc_init();
+extern thread_port_t cproc_create();
+extern void mig_init();
+extern void _pthread_set_self(pthread_t);
+
+/*
+ * Mach imports:
+ */
+extern void mig_fork_child();
+
+/*
+ * C library imports:
+ */
+extern int _setjmp(jmp_buf env);
+extern void _longjmp(jmp_buf env, int val);
+
+/*
+ * Thread status bits.
+ */
+#define        T_MAIN          0x1
+#define        T_RETURNED      0x2
+#define        T_DETACHED      0x4
+
+#ifdef CTHREADS_DEBUG
+int cthread_debug = FALSE;
+#endif CTHREADS_DEBUG
+
+/*
+ * Routines for supporting fork() of multi-threaded programs.
+ */
+
+
+extern void _malloc_fork_prepare(), _malloc_fork_parent();
+extern void _malloc_fork_child();
+extern void _cproc_fork_child(), _stack_fork_child();
+extern void _lu_fork_child(void);
+extern void _pthread_fork_child(void);
+
+static pthread_t psaved_self = 0;
+static pthread_lock_t psaved_self_global_lock = LOCK_INITIALIZER;
+
+void _cthread_fork_prepare()
+/*
+ * Prepare cthreads library to fork() a multi-threaded program.  All cthread
+ * library critical section locks are acquired before a fork() and released
+ * afterwards to insure no cthread data structure is left in an inconsistent
+ * state in the child, which comes up with only the forking thread running.
+ */
+{
+       _spin_lock(&psaved_self_global_lock);
+       psaved_self = pthread_self();
+        _spin_lock(&psaved_self->lock);
+       _malloc_fork_prepare();
+}
+
+void _cthread_fork_parent()
+/*
+ * Called in the parent process after a fork syscall.
+ * Releases locks acquired by cthread_fork_prepare().
+ */
+{
+       _malloc_fork_parent();
+        _spin_unlock(&psaved_self->lock);
+        _spin_unlock(&psaved_self_global_lock);
+
+}
+
+void _cthread_fork_child()
+/*
+ * Called in the child process after a fork syscall.  Releases locks acquired
+ * by cthread_fork_prepare().  Deallocates cthread data structures which
+ * described other threads in our parent.  Makes this thread the main thread.
+ * 
+ * The mach_init() routine must be called in the child before this routine.
+ */
+{
+       pthread_t p = psaved_self;
+        
+       _pthread_set_self(p);
+        _spin_unlock(&psaved_self_global_lock);   
+       mig_fork_child();
+       _malloc_fork_child();
+       p->kernel_thread = mach_thread_self();
+       p->reply_port = MACH_PORT_NULL;
+       p->mutexes = NULL;
+       p->cleanup_stack = NULL;
+       p->death = MACH_PORT_NULL;
+       p->joiners = MACH_PORT_NULL;
+       p->num_joiners = 0;
+       p->detached = _PTHREAD_CREATE_PARENT;
+        _spin_unlock(&p->lock);
+
+        _cproc_fork_child();
+
+       _lu_fork_child();
+
+       _pthread_fork_child();
+
+       __is_threaded = 0;
+       mig_init(1);            /* enable multi-threaded mig interfaces */
+       
+}
+
diff --git a/threads.subproj/cthreads.h b/threads.subproj/cthreads.h
new file mode 100644 (file)
index 0000000..6c97927
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Cthreads.
+ */
+
+#ifndef        _CTHREADS_
+#define        _CTHREADS_ 1
+
+#if defined(__cplusplus)
+#define __DECLBEGIN extern "C" {
+#define __DECLEND }
+#else
+#define __DECLBEGIN
+#define __DECLEND
+#endif
+
+typedef void *any_t;
+
+/*
+ * Spin locks.
+ */
+__DECLBEGIN
+extern void spin_unlock(int *p);
+extern void spin_lock(int *p);
+__DECLEND
+
+#include <mach/mach_types.h>
+#include <mach/boolean.h>
+
+#ifndef MACRO_BEGIN
+
+#define        NEVER FALSE
+
+#define        MACRO_BEGIN     do {
+#define        MACRO_END       } while (NEVER)
+
+#endif /* MACRO_BEGIN */
+
+/*
+ * C Threads package initialization.
+ */
+__DECLBEGIN
+extern void cthread_init();
+__DECLEND
+
+#include <stdlib.h>
+
+/*
+ * Queues.
+ */
+typedef struct cthread_queue {
+       struct cthread_queue_item *head;
+       struct cthread_queue_item *tail;
+} *cthread_queue_t;
+
+typedef struct cthread_queue_item {
+       struct cthread_queue_item *next;
+} *cthread_queue_item_t;
+
+#define        NO_QUEUE_ITEM   ((cthread_queue_item_t) 0)
+
+#define        QUEUE_INITIALIZER       { NO_QUEUE_ITEM, NO_QUEUE_ITEM }
+
+#define        cthread_queue_alloc()   ((cthread_queue_t) calloc(1, sizeof(struct cthread_queue)))
+#define        cthread_queue_init(q)   ((q)->head = (q)->tail = 0)
+#define        cthread_queue_free(q)   free((any_t) (q))
+
+#define        cthread_queue_enq(q, x) \
+       MACRO_BEGIN \
+               (x)->next = 0; \
+               if ((q)->tail == 0) \
+                       (q)->head = (cthread_queue_item_t) (x); \
+               else \
+                       (q)->tail->next = (cthread_queue_item_t) (x); \
+               (q)->tail = (cthread_queue_item_t) (x); \
+       MACRO_END
+
+#define        cthread_queue_preq(q, x) \
+       MACRO_BEGIN \
+               if ((q)->tail == 0) \
+                       (q)->tail = (cthread_queue_item_t) (x); \
+               ((cthread_queue_item_t) (x))->next = (q)->head; \
+               (q)->head = (cthread_queue_item_t) (x); \
+       MACRO_END
+
+#define        cthread_queue_head(q, t)        ((t) ((q)->head))
+
+#define        cthread_queue_deq(q, t, x) \
+       MACRO_BEGIN \
+               if (((x) = (t) ((q)->head)) != 0 && \
+                   ((q)->head = (cthread_queue_item_t) ((x)->next)) == 0) \
+                       (q)->tail = 0; \
+       MACRO_END
+
+#define        cthread_queue_map(q, t, f) \
+       MACRO_BEGIN \
+               register cthread_queue_item_t x, next; \
+               for (x = (cthread_queue_item_t) ((q)->head); x != 0; x = next) { \
+                       next = x->next; \
+                       (*(f))((t) x); \
+               } \
+       MACRO_END
+
+
+/*
+ * Mutex objects.
+ */
+typedef struct mutex {
+       int lock;
+       char *name;
+} *mutex_t;
+
+#define        MUTEX_INITIALIZER       { 0, 0 }
+
+#define        mutex_alloc()           ((mutex_t) calloc(1, sizeof(struct mutex)))
+#define        mutex_init(m)           ((m)->lock = 0)
+#define        mutex_set_name(m, x)    ((m)->name = (x))
+#define        mutex_name(m)           ((m)->name != 0 ? (m)->name : "?")
+#define        mutex_clear(m)          /* nop */
+#define        mutex_free(m)           free((any_t) (m))
+
+#define        mutex_lock(m) \
+       MACRO_BEGIN \
+               if (! mutex_try_lock(m)) mutex_wait_lock(m); \
+       MACRO_END
+
+__DECLBEGIN
+extern int mutex_try_lock(mutex_t m);  /* nonblocking */
+extern void mutex_wait_lock(mutex_t m);        /* blocking */
+extern void mutex_unlock(mutex_t m);
+__DECLEND
+
+/*
+ * Condition variables.
+ */
+typedef struct condition {
+       int lock;
+       struct cthread_queue queue;
+       char *name;
+} *condition_t;
+
+#define        CONDITION_INITIALIZER           { 0, QUEUE_INITIALIZER, 0 }
+
+#define        condition_alloc()               ((condition_t) calloc(1, sizeof(struct condition)))
+#define        condition_init(c)               MACRO_BEGIN (c)->lock = 0; cthread_queue_init(&(c)->queue); MACRO_END
+#define        condition_set_name(c, x)        ((c)->name = (x))
+#define        condition_name(c)               ((c)->name != 0 ? (c)->name : "?")
+#define        condition_clear(c)              MACRO_BEGIN condition_broadcast(c); spin_lock(&(c)->lock); MACRO_END
+#define        condition_free(c)               MACRO_BEGIN condition_clear(c); free((any_t) (c)); MACRO_END
+
+#define        condition_signal(c) \
+       MACRO_BEGIN \
+               if ((c)->queue.head) cond_signal(c); \
+       MACRO_END
+
+#define        condition_broadcast(c) \
+       MACRO_BEGIN \
+               if ((c)->queue.head) cond_broadcast(c); \
+       MACRO_END
+
+__DECLBEGIN
+extern void cond_signal(condition_t c);
+extern void cond_broadcast(condition_t c);
+extern void condition_wait(condition_t c, mutex_t m);
+__DECLEND
+
+/*
+ * Threads.
+ */
+
+typedef any_t (*cthread_fn_t)(any_t arg);
+
+#import <setjmp.h>
+
+typedef struct cthread {
+       struct cthread *next;
+       thread_port_t real_thread;
+       struct mutex lock;
+       struct condition done;
+       int state;
+#if defined(__cplusplus)
+       jmp_buf catchBuf;
+#else
+       jmp_buf catch;
+#endif
+       cthread_fn_t func;
+       any_t arg;
+       any_t result;
+       const char *name;
+       any_t data;
+} *cthread_t;
+
+#define        NO_CTHREAD      ((cthread_t) 0)
+
+__DECLBEGIN
+extern cthread_t cthread_fork(cthread_fn_t func, any_t arg);
+extern void cthread_detach(cthread_t t);
+extern any_t cthread_join(cthread_t t);
+extern void cthread_yield(void);
+extern void cthread_exit(any_t result);
+extern kern_return_t cthread_priority(
+        cthread_t      t,
+        int            priority,
+        boolean_t      set_max);
+extern kern_return_t cthread_max_priority(
+        cthread_t      t,
+        mach_port_t    pset,
+        int            max_priority);
+extern kern_return_t cthread_abort(cthread_t t);
+__DECLEND
+
+/*
+ * This structure must agree with struct cproc in cthread_internals.h
+ */
+typedef struct ur_cthread {
+       struct ur_cthread *next;
+       cthread_t incarnation;
+} *ur_cthread_t;
+
+__DECLBEGIN
+extern int cthread_sp(void);
+
+extern int cthread_stack_mask;
+
+extern ur_cthread_t ur_cthread_self(void);
+#define cthread_thread(c)      (c->real_thread)
+extern void cthread_set_errno_self(int e);
+extern int cthread_errno(void);
+#define        cthread_assoc(id, t)    (((ur_cthread_t) (id))->incarnation = (t))
+#define        cthread_self()          (ur_cthread_self()->incarnation)
+
+extern void cthread_set_name(cthread_t t, const char *name);
+extern const char *cthread_name(cthread_t t);
+extern int cthread_count(void);
+extern void cthread_set_limit(int n);
+extern int cthread_limit(void);
+__DECLEND
+
+#define        cthread_set_data(t, x)  ((t)->data = (x))
+#define        cthread_data(t)         ((t)->data)
+
+/*
+ * Spin locks.
+ */
+#define        spin_unlock(p)          (*(p) = 0)
+
+/*
+ * Mutex locks.
+ */
+#define        mutex_unlock(m)         ((m)->lock = 0)
+
+
+/*
+ * Debugging support.
+ */
+#ifdef CTHREADS_DEBUG
+
+#ifndef        ASSERT
+/*
+ * Assertion macro, similar to <assert.h>
+ */
+#import <stdio.h>
+#define        ASSERT(p) \
+       MACRO_BEGIN \
+               if (!(p)) { \
+                       fprintf(stderr, \
+                               "File %s, line %d: assertion p failed.\n", \
+                               __FILE__, __LINE__); \
+                       abort(); \
+               } \
+       MACRO_END
+
+#endif /* ASSERT */
+
+#define        SHOULDNT_HAPPEN 0
+
+extern int cthread_debug;
+
+#else  /* CTHREADS_DEBUG */
+
+#ifndef        ASSERT
+#define        ASSERT(p)
+#endif /* ASSERT */
+
+#endif /* CTHREADS_DEBUG */
+
+#endif /* _CTHREADS_ */
diff --git a/threads.subproj/i386.subproj/Makefile b/threads.subproj/i386.subproj/Makefile
new file mode 100644 (file)
index 0000000..9a10ba3
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = i386
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = thread.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/threads.subproj/i386.subproj/Makefile.postamble b/threads.subproj/i386.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/threads.subproj/i386.subproj/Makefile.preamble b/threads.subproj/i386.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..6544e5f
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+INCLUDED_ARCHS = i386
diff --git a/threads.subproj/i386.subproj/PB.project b/threads.subproj/i386.subproj/PB.project
new file mode 100644 (file)
index 0000000..a77b649
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (thread.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = i386; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/threads.subproj/i386.subproj/thread.c b/threads.subproj/i386.subproj/thread.c
new file mode 100644 (file)
index 0000000..ee31e52
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+
+/*
+ * 386/thread.c
+ *
+ * Cproc startup for 386 MTHREAD implementation.
+ */
+
+#include <cthreads.h>
+#include <mach/mach.h>
+#include <mach/i386/thread_status.h>
+#include "cthread_internals.h"
+
+void
+_pthread_set_self(p)
+       cproc_t p;
+{
+       asm("pushl      %0" : : "m" (p));
+       asm("pushl      $0");                   // fake the kernel out
+       asm("movl       $1, %%eax" : : : "ax");
+       asm("lcall      $0x3b, $0");
+}
+
+void *
+_pthread_self()
+{
+       asm("movl       $0, %eax");
+       asm("lcall      $0x3b, $0");
+}
diff --git a/threads.subproj/lu_utils.c b/threads.subproj/lu_utils.c
new file mode 100644 (file)
index 0000000..65a60a4
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Port and memory management for doing lookups to the lookup server
+ * Copyright (C) 1989 by NeXT, Inc.
+ */
+/*
+ * HISTORY
+ * 27-Mar-90  Gregg Kellogg (gk) at NeXT
+ *     Changed to use bootstrap port instead of service port.
+ *
+ */
+#include <stdio.h>
+#include <mach/mach.h>
+#include <servers/bootstrap.h>
+
+mach_port_t _lu_port = MACH_PORT_NULL;
+static name_t LOOKUP_NAME = "lookup daemon";
+
+mach_port_t _lookupd_port(mach_port_t port) {
+       if (port != MACH_PORT_NULL) {
+               kern_return_t ret;
+               mach_port_t bp;
+               ret = task_get_bootstrap_port(mach_task_self(), &bp);
+               if (ret != KERN_SUCCESS) {
+                       mach_error("task_get_bootstrap_port() failed", ret);
+                       abort();
+               }
+               if (bp == MACH_PORT_NULL) {
+                       mach_error("task_get_bootstrap_port() returned MACH_PORT_NULL!", 0);
+                       return MACH_PORT_NULL;
+               }
+               ret = bootstrap_register(bp, LOOKUP_NAME, port);
+               if (ret != BOOTSTRAP_SUCCESS) {
+                       mach_error("bootstrap_register() failed", ret);
+                       abort();
+               }
+                return port;
+       }
+       return _lu_port;
+}
+
+/* called as child starts up.  mach ports aren't inherited: trash cache */
+void
+_lu_fork_child()
+{
+       mach_port_t bp;
+       kern_return_t ret;
+       int pid = getpid();
+
+       _lu_port = MACH_PORT_NULL;
+       if (pid > 2) {
+               ret = task_get_bootstrap_port(mach_task_self(), &bp);
+               if (ret != KERN_SUCCESS) {
+                       mach_error("task_get_bootstrap_port() failed", ret);
+                       abort();
+               }
+               if (bp == MACH_PORT_NULL) {
+                       fprintf(stderr, "task_get_bootstrap_port() returned MACH_PORT_NULL!\n");
+                       return;
+               }
+               ret = bootstrap_look_up(bp, LOOKUP_NAME, &_lu_port);
+               if (ret != BOOTSTRAP_SUCCESS && ret != BOOTSTRAP_UNKNOWN_SERVICE) {
+                       mach_error("bootstrap_look_up() failed", ret);
+                       _lu_port = MACH_PORT_NULL;
+               }
+       }
+}
+
+void
+_lu_setport(mach_port_t desired)
+{
+       if (_lu_port != MACH_PORT_NULL) {
+               mach_port_deallocate(mach_task_self(), _lu_port);
+       }
+       _lu_port = desired;
+}
+
+static int
+port_valid(mach_port_t port)
+{
+       mach_port_type_t ptype;
+       kern_return_t ret;
+       
+       ret = mach_port_type(mach_task_self(), port, &ptype);
+       if (ret != KERN_SUCCESS) {
+               mach_error("mach_port_type() failed", ret);
+               return 0;
+       }
+       return 1;
+}
+
+int
+_lu_running(void)
+{
+       if (_lu_port == MACH_PORT_NULL) {
+               _lu_fork_child();
+       }
+       if (_lu_port != MACH_PORT_NULL) {
+               if (port_valid(_lu_port)) {
+                       return (1);
+               }
+               _lu_fork_child();
+               if (port_valid(_lu_port)) {
+                       return (1);
+               }
+       }
+       return 0;
+}
+
diff --git a/threads.subproj/mig_support.c b/threads.subproj/mig_support.c
new file mode 100644 (file)
index 0000000..1cf0f63
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/* 
+ * Mach Operating System
+ * Copyright (c) 1989 Carnegie-Mellon University
+ * All rights reserved.  The CMU software License Agreement specifies
+ * the terms and conditions for use and redistribution.
+ */
+/*
+ * mig_support.c  - by Mary Thompson
+ *
+ * Routines to set and deallocate the mig reply port for the current thread.
+ * Called from mig-generated interfaces.
+ */
+#include <mach/mach.h>
+#include <pthread_internals.h>
+#include <pthread.h>
+
+#include "cthreads.h"
+#include "cthread_internals.h"
+
+pthread_lock_t reply_port_lock;
+extern mach_port_t _pthread_reply_port(pthread_t);
+static mach_port_t _task_reply_port = MACH_PORT_NULL;
+
+/*
+ * called in new child...
+ * clear lock to cover case where the parent had
+ * a thread holding this lock while another thread
+ * did the fork()
+ */
+void mig_fork_child()
+{
+       UNLOCK(reply_port_lock);
+}
+
+/*
+ * Called by mach_init with 0 before cthread_init is
+ * called and again with 1 at the end of cthread_init.
+ */
+void
+mig_init(init_done)
+       int init_done;
+{
+    if (init_done == 0) {
+        LOCK_INIT(reply_port_lock);
+        _task_reply_port = mach_reply_port();
+    }
+}
+
+/*
+ * Called by mig interface code whenever a reply port is needed.
+ * Tracing is masked during this call; otherwise, a call to printf()
+ * can result in a call to malloc() which eventually reenters
+ * mig_get_reply_port() and deadlocks.
+ */
+mach_port_t
+mig_get_reply_port()
+{
+       register cproc_t self;
+        pthread_t pself;
+#ifdef CTHREADS_DEBUG
+       int d = cthread_debug;
+#endif CTHREADS_DEBUG
+
+#ifdef CTHREADS_DEBUG
+       cthread_debug = FALSE;
+#endif CTHREADS_DEBUG
+        pself = pthread_self();
+        if ((pself != (pthread_t)NULL) && (pself->sig == _PTHREAD_SIG)) {
+            if (pself->reply_port == MACH_PORT_NULL) {
+                pself->reply_port = mach_reply_port();
+            }
+            return pself->reply_port;
+        }
+       self = cproc_self();
+       if (self == NO_CPROC) {
+#ifdef CTHREADS_DEBUG
+               cthread_debug = d;
+#endif CTHREADS_DEBUG
+               return(_task_reply_port);
+       }
+        if (self->reply_port == MACH_PORT_NULL) {
+            self->reply_port = mach_reply_port();
+        }
+#ifdef CTHREADS_DEBUG
+       cthread_debug = d;
+#endif CTHREADS_DEBUG
+       return self->reply_port;
+}
+
+/*
+ * Called by mig interface code after a timeout on the reply port.
+ * May also be called by user. The new mig calls with port passed in
+ * We are ignoring this , so is osfmk cthreads code
+ */
+void
+mig_dealloc_reply_port(mach_port_t migport)
+{
+       register cproc_t self;
+        pthread_t pself;
+       register mach_port_t port;
+#ifdef CTHREADS_DEBUG
+       int d = cthread_debug;
+#endif CTHREADS_DEBUG
+
+#ifdef CTHREADS_DEBUG
+       cthread_debug = FALSE;
+#endif CTHREADS_DEBUG
+        pself = pthread_self();
+        if ((pself != (pthread_t)NULL) && (pself->sig == _PTHREAD_SIG)) {
+            port = pself->reply_port;
+            if (port != MACH_PORT_NULL && port != _task_reply_port) {
+                    LOCK(reply_port_lock);
+                    pself->reply_port = _task_reply_port;
+                    (void) mach_port_destroy(mach_task_self(), port);
+                    pself->reply_port = MACH_PORT_NULL;
+                    UNLOCK(reply_port_lock);
+            }
+            return;
+        }
+       self = cproc_self();
+       if (self == NO_CPROC) {
+#ifdef CTHREADS_DEBUG
+               cthread_debug = d;
+#endif CTHREADS_DEBUG
+               return;
+       }
+       ASSERT(self != NO_CPROC);
+       port = self->reply_port;
+        if (port != MACH_PORT_NULL && port != _task_reply_port) {
+               LOCK(reply_port_lock);
+                self->reply_port = _task_reply_port;
+                (void) mach_port_destroy(mach_task_self(), port);
+                self->reply_port = MACH_PORT_NULL;
+               UNLOCK(reply_port_lock);
+       }
+#ifdef CTHREADS_DEBUG
+       cthread_debug = d;
+#endif CTHREADS_DEBUG
+}
+
+/*************************************************************
+ *  Called by mig interfaces after each RPC.
+ *  Could be called by user.
+ ***********************************************************/
+
+void
+mig_put_reply_port(
+       mach_port_t     reply_port)
+{
+}
diff --git a/threads.subproj/ppc.subproj/Makefile b/threads.subproj/ppc.subproj/Makefile
new file mode 100644 (file)
index 0000000..62e6941
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = ppc
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/threads.subproj/ppc.subproj/Makefile.postamble b/threads.subproj/ppc.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/threads.subproj/ppc.subproj/Makefile.preamble b/threads.subproj/ppc.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..7211b2b
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+INCLUDED_ARCHS = ppc
diff --git a/threads.subproj/ppc.subproj/PB.project b/threads.subproj/ppc.subproj/PB.project
new file mode 100644 (file)
index 0000000..49e45ce
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = ppc; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/threads.subproj/threads_data.c b/threads.subproj/threads_data.c
new file mode 100644 (file)
index 0000000..587b938
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * This file contains global data and the size of the global data can NOT
+ * change or otherwise it would make the shared library incompatable.  It
+ * is padded so that new data can take the place of storage occupied by part
+ * of it.
+ */
+int msg_send_timeout = 100;    /* milliseconds */
+int msg_receive_timeout = 10;  /* milliseconds */
+int mutex_spin_limit = 0;
+int cthread_stack_mask = 0;
+extern void cthread_init();
+unsigned int cproc_default_stack_size = 1000000;
+int condition_spin_limit = 0;
+int condition_yield_limit = 7;
+unsigned int initial_stack_boundary = 0;
+unsigned int cthread_stack_base = 0;   /* Base for stack allocation */
+int    malloc_lock = 0;                        /* 
+                                        * Needs to be shared between malloc.o
+                                        * and malloc_utils.o
+                                        */
+
+/* global data padding, must NOT be static */
+char _threads_data_padding[208] = { 0 };
diff --git a/util.subproj/Makefile b/util.subproj/Makefile
new file mode 100644 (file)
index 0000000..f9b0874
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = util
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Component
+
+CFILES = login.c login_tty.c logout.c logwtmp.c pty.c
+
+OTHERSRCS = Makefile.preamble Makefile Makefile.postamble
+
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = subproj.make
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+
+
+
+NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(JDKBINDIR)/javac
+
+include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/util.subproj/Makefile.postamble b/util.subproj/Makefile.postamble
new file mode 100644 (file)
index 0000000..411cde6
--- /dev/null
@@ -0,0 +1,100 @@
+###############################################################################
+#  Makefile.postamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile, which is imported after all other makefiles, to
+#  override attributes for a project's Makefile environment. This allows you  
+#  to take advantage of the environment set up by the other Makefiles. 
+#  You can also define custom rules at the end of this file.
+#
+###############################################################################
+# 
+# These variables are exported by the standard makefiles and can be 
+# used in any customizations you make.  They are *outputs* of
+# the Makefiles and should be used, not set.
+# 
+#  PRODUCTS: products to install.  All of these products will be placed in
+#       the directory $(DSTROOT)$(INSTALLDIR)
+#  GLOBAL_RESOURCE_DIR: The directory to which resources are copied.
+#  LOCAL_RESOURCE_DIR: The directory to which localized resources are copied.
+#  OFILE_DIR: Directory into which .o object files are generated.
+#  DERIVED_SRC_DIR: Directory used for all other derived files
+#
+#  ALL_CFLAGS:  flags to pass when compiling .c files
+#  ALL_MFLAGS:  flags to pass when compiling .m files
+#  ALL_CCFLAGS:  flags to pass when compiling .cc, .cxx, and .C files
+#  ALL_MMFLAGS:  flags to pass when compiling .mm, .mxx, and .M files
+#  ALL_PRECOMPFLAGS:  flags to pass when precompiling .h files
+#  ALL_LDFLAGS:  flags to pass when linking object files
+#  ALL_LIBTOOL_FLAGS:  flags to pass when libtooling object files
+#  ALL_PSWFLAGS:  flags to pass when processing .psw and .pswm (pswrap) files
+#  ALL_RPCFLAGS:  flags to pass when processing .rpc (rpcgen) files
+#  ALL_YFLAGS:  flags to pass when processing .y (yacc) files
+#  ALL_LFLAGS:  flags to pass when processing .l (lex) files
+#
+#  NAME: name of application, bundle, subproject, palette, etc.
+#  LANGUAGES: langages in which the project is written (default "English")
+#  English_RESOURCES: localized resources (e.g. nib's, images) of project
+#  GLOBAL_RESOURCES: non-localized resources of project
+#
+#  SRCROOT:  base directory in which to place the new source files
+#  SRCPATH:  relative path from SRCROOT to present subdirectory
+#
+#  INSTALLDIR: Directory the product will be installed into by 'install' target
+#  PUBLIC_HDR_INSTALLDIR: where to install public headers.  Don't forget
+#        to prefix this with DSTROOT when you use it.
+#  PRIVATE_HDR_INSTALLDIR: where to install private headers.  Don't forget
+#       to prefix this with DSTROOT when you use it.
+#
+#  EXECUTABLE_EXT: Executable extension for the platform (i.e. .exe on Windows)
+#
+###############################################################################
+
+# Some compiler flags can be overridden here for certain build situations.
+#
+#    WARNING_CFLAGS:  flag used to set warning level (defaults to -Wmost)
+#    DEBUG_SYMBOLS_CFLAGS:  debug-symbol flag passed to all builds (defaults
+#      to -g)
+#    DEBUG_BUILD_CFLAGS:  flags passed during debug builds (defaults to -DDEBUG)
+#    OPTIMIZE_BUILD_CFLAGS:  flags passed during optimized builds (defaults
+#      to -O)
+#    PROFILE_BUILD_CFLAGS:  flags passed during profile builds (defaults
+#      to -pg -DPROFILE)
+#    LOCAL_DIR_INCLUDE_DIRECTIVE:  flag used to add current directory to
+#      the include path (defaults to -I.)
+#    DEBUG_BUILD_LDFLAGS, OPTIMIZE_BUILD_LDFLAGS, PROFILE_BUILD_LDFLAGS: flags
+#      passed to ld/libtool (defaults to nothing)
+
+
+# Library and Framework projects only:
+#    INSTALL_NAME_DIRECTIVE:  This directive ensures that executables linked
+#      against the framework will run against the correct version even if
+#      the current version of the framework changes.  You may override this
+#      to "" as an alternative to using the DYLD_LIBRARY_PATH during your
+#      development cycle, but be sure to restore it before installing.
+
+
+# Ownership and permissions of files installed by 'install' target
+
+#INSTALL_AS_USER = root
+        # User/group ownership 
+#INSTALL_AS_GROUP = wheel
+        # (probably want to set both of these) 
+#INSTALL_PERMISSIONS =
+        # If set, 'install' chmod's executable to this
+
+
+# Options to strip.  Note: -S strips debugging symbols (executables can be stripped
+# down further with -x or, if they load no bundles, with no options at all).
+
+#STRIPFLAGS = -S
+
+
+#########################################################################
+# Put rules to extend the behavior of the standard Makefiles here.  Include them in
+# the dependency tree via cvariables like AFTER_INSTALL in the Makefile.preamble.
+#
+# You should avoid redefining things like "install" or "app", as they are
+# owned by the top-level Makefile API and no context has been set up for where 
+# derived files should go.
+#
diff --git a/util.subproj/Makefile.preamble b/util.subproj/Makefile.preamble
new file mode 100644 (file)
index 0000000..c1624b4
--- /dev/null
@@ -0,0 +1,137 @@
+###############################################################################
+#  Makefile.preamble
+#  Copyright 1997, Apple Computer, Inc.
+#
+#  Use this makefile for configuring the standard application makefiles 
+#  associated with ProjectBuilder. It is included before the main makefile.
+#  In Makefile.preamble you set attributes for a project, so they are available
+#  to the project's makefiles.  In contrast, you typically write additional rules or 
+#  override built-in behavior in the Makefile.postamble.
+#  
+#  Each directory in a project tree (main project plus subprojects) should 
+#  have its own Makefile.preamble and Makefile.postamble.
+###############################################################################
+#
+# Before the main makefile is included for this project, you may set:
+#
+#    MAKEFILEDIR: Directory in which to find $(MAKEFILE)
+#    MAKEFILE: Top level mechanism Makefile (e.g., app.make, bundle.make)
+
+# Compiler/linker flags added to the defaults:  The OTHER_* variables will be 
+# inherited by all nested sub-projects, but the LOCAL_ versions of the same
+# variables will not.  Put your -I, -D, -U, and -L flags in ProjectBuilder's
+# Build Attributes inspector if at all possible.  To override the default flags
+# that get passed to ${CC} (e.g. change -O to -O2), see Makefile.postamble.  The
+# variables below are *inputs* to the build process and distinct from the override
+# settings done (less often) in the Makefile.postamble.
+#
+#    OTHER_CFLAGS, LOCAL_CFLAGS:  additional flags to pass to the compiler
+#      Note that $(OTHER_CFLAGS) and $(LOCAL_CFLAGS) are used for .h, ...c, .m,
+#      .cc, .cxx, .C, and .M files.  There is no need to respecify the
+#      flags in OTHER_MFLAGS, etc.
+#    OTHER_MFLAGS, LOCAL_MFLAGS:  additional flags for .m files
+#    OTHER_CCFLAGS, LOCAL_CCFLAGS:  additional flags for .cc, .cxx, and ...C files
+#    OTHER_MMFLAGS, LOCAL_MMFLAGS:  additional flags for .mm and .M files
+#    OTHER_PRECOMPFLAGS, LOCAL_PRECOMPFLAGS:  additional flags used when
+#      precompiling header files
+#    OTHER_LDFLAGS, LOCAL_LDFLAGS:  additional flags passed to ld and libtool
+#    OTHER_PSWFLAGS, LOCAL_PSWFLAGS:  additional flags passed to pswrap
+#    OTHER_RPCFLAGS, LOCAL_RPCFLAGS:  additional flags passed to rpcgen
+#    OTHER_YFLAGS, LOCAL_YFLAGS:  additional flags passed to yacc
+#    OTHER_LFLAGS, LOCAL_LFLAGS:  additional flags passed to lex
+
+# These variables provide hooks enabling you to add behavior at almost every 
+# stage of the make:
+#
+#    BEFORE_PREBUILD: targets to build before installing headers for a subproject
+#    AFTER_PREBUILD: targets to build after installing headers for a subproject
+#    BEFORE_BUILD_RECURSION: targets to make before building subprojects
+#    BEFORE_BUILD: targets to make before a build, but after subprojects
+#    AFTER_BUILD: targets to make after a build
+#
+#    BEFORE_INSTALL: targets to build before installing the product
+#    AFTER_INSTALL: targets to build after installing the product
+#    BEFORE_POSTINSTALL: targets to build before postinstalling every subproject
+#    AFTER_POSTINSTALL: targts to build after postinstalling every subproject
+#
+#    BEFORE_INSTALLHDRS: targets to build before installing headers for a 
+#         subproject
+#    AFTER_INSTALLHDRS: targets to build after installing headers for a subproject
+#    BEFORE_INSTALLSRC: targets to build before installing source for a subproject
+#    AFTER_INSTALLSRC: targets to build after installing source for a subproject
+#
+#    BEFORE_DEPEND: targets to build before building dependencies for a
+#        subproject
+#    AFTER_DEPEND: targets to build after building dependencies for a
+#        subproject
+#
+#    AUTOMATIC_DEPENDENCY_INFO: if YES, then the dependency file is
+#        updated every time the project is built.  If NO, the dependency
+#        file is only built when the depend target is invoked.
+
+# Framework-related variables:
+#    FRAMEWORK_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the framework's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+
+# Library-related variables:
+#    PUBLIC_HEADER_DIR:  Determines where public exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.  For library projects you should
+#       set this to something like /Developer/Headers/$(NAME).  Do not set
+#       this variable for framework projects unless you do not want the
+#       header files included in the framework.
+#    PRIVATE_HEADER_DIR:  Determines where private exported header files
+#      should be installed.  Do not include $(DSTROOT) in this value --
+#      it is prefixed automatically.
+#    LIBRARY_STYLE:  This may be either STATIC or DYNAMIC, and determines
+#      whether the libraries produced are statically linked when they
+#      are used or if they are dynamically loadable. This defaults to
+#       DYNAMIC.
+#    LIBRARY_DLL_INSTALLDIR:  On Windows platforms, this variable indicates
+#      where to put the library's DLL.  This variable defaults to 
+#      $(INSTALLDIR)/../Executables
+#
+#    INSTALL_AS_USER: owner of the intalled products (default root)
+#    INSTALL_AS_GROUP: group of the installed products (default wheel)
+#    INSTALL_PERMISSIONS: permissions of the installed product (default o+rX)
+#
+#    OTHER_RECURSIVE_VARIABLES: The names of variables which you want to be
+#      passed on the command line to recursive invocations of make.  Note that
+#      the values in OTHER_*FLAGS are inherited by subprojects automatically --
+#      you do not have to (and shouldn't) add OTHER_*FLAGS to 
+#      OTHER_RECURSIVE_VARIABLES. 
+
+# Additional headers to export beyond those in the PB.project:
+#    OTHER_PUBLIC_HEADERS
+#    OTHER_PROJECT_HEADERS
+#    OTHER_PRIVATE_HEADERS
+
+# Additional files for the project's product: <<path relative to proj?>>
+#    OTHER_RESOURCES: (non-localized) resources for this project
+#    OTHER_OFILES: relocatables to be linked into this project
+#    OTHER_LIBS: more libraries to link against
+#    OTHER_PRODUCT_DEPENDS: other dependencies of this project
+#    OTHER_SOURCEFILES: other source files maintained by .pre/postamble
+#    OTHER_GARBAGE: additional files to be removed by `make clean'
+
+# Set this to YES if you don't want a final libtool call for a library/framework.
+#    BUILD_OFILES_LIST_ONLY
+
+# To include a version string, project source must exist in a directory named 
+# $(NAME).%d[.%d][.%d] and the following line must be uncommented.
+# OTHER_GENERATED_OFILES = $(VERS_OFILE)
+
+# This definition will suppress stripping of debug symbols when an executable
+# is installed.  By default it is YES.
+# STRIP_ON_INSTALL = NO
+
+# Uncomment to suppress generation of a KeyValueCoding index when installing 
+# frameworks (This index is used by WOB and IB to determine keys available
+# for an object).  Set to YES by default.
+# PREINDEX_FRAMEWORK = NO
+
+# Change this definition to install projects somewhere other than the
+# standard locations.  NEXT_ROOT defaults to "C:/Apple" on Windows systems
+# and "" on other systems.
+DSTROOT = $(HOME)
diff --git a/util.subproj/PB.project b/util.subproj/PB.project
new file mode 100644 (file)
index 0000000..87e4046
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        H_FILES = (); 
+        OTHER_LINKED = (login.c, login_tty.c, logout.c, logwtmp.c, pty.c); 
+        OTHER_SOURCES = (Makefile.preamble, Makefile, Makefile.postamble); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(JDKBINDIR)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = util; 
+    PROJECTTYPE = Component; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/util.subproj/login.c b/util.subproj/login.c
new file mode 100644 (file)
index 0000000..8720a25
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <utmp.h>
+#include <stdio.h>
+
+void
+login(ut)
+       struct utmp *ut;
+{
+       register int fd;
+       int tty;
+
+       tty = ttyslot();
+       if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) {
+               (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), L_SET);
+               (void)write(fd, ut, sizeof(struct utmp));
+               (void)close(fd);
+       }
+       if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) {
+               (void)write(fd, ut, sizeof(struct utmp));
+               (void)close(fd);
+       }
+}
diff --git a/util.subproj/login_tty.c b/util.subproj/login_tty.c
new file mode 100644 (file)
index 0000000..e172a2b
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+
+int login_tty(fd)
+       int fd;
+{
+       (void) setsid();
+       if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1)
+               return (-1);
+       (void) dup2(fd, 0);
+       (void) dup2(fd, 1);
+       (void) dup2(fd, 2);
+       if (fd > 2)
+               (void) close(fd);
+       return (0);
+}
diff --git a/util.subproj/logout.c b/util.subproj/logout.c
new file mode 100644 (file)
index 0000000..6c7be20
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <fcntl.h>
+#include <utmp.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef struct utmp UTMP;
+
+int
+logout(line)
+       register char *line;
+{
+       register int fd;
+       UTMP ut;
+       int rval;
+
+       if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0)
+               return(0);
+       rval = 0;
+       while (read(fd, &ut, sizeof(UTMP)) == sizeof(UTMP)) {
+               if (!ut.ut_name[0] || strncmp(ut.ut_line, line, UT_LINESIZE))
+                       continue;
+               bzero(ut.ut_name, UT_NAMESIZE);
+               bzero(ut.ut_host, UT_HOSTSIZE);
+               (void)time(&ut.ut_time);
+               (void)lseek(fd, -(off_t)sizeof(UTMP), L_INCR);
+               (void)write(fd, &ut, sizeof(UTMP));
+               rval = 1;
+       }
+       (void)close(fd);
+       return(rval);
+}
diff --git a/util.subproj/logwtmp.c b/util.subproj/logwtmp.c
new file mode 100644 (file)
index 0000000..4e573a6
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+#include <unistd.h>
+#include <utmp.h>
+
+void logwtmp(line, name, host)
+       char *line, *name, *host;
+{
+       struct utmp ut;
+       struct stat buf;
+       int fd;
+       time_t time();
+       char *strncpy();
+
+       if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0)
+               return;
+       if (fstat(fd, &buf) == 0) {
+               (void) strncpy(ut.ut_line, line, sizeof(ut.ut_line));
+               (void) strncpy(ut.ut_name, name, sizeof(ut.ut_name));
+               (void) strncpy(ut.ut_host, host, sizeof(ut.ut_host));
+               (void) time(&ut.ut_time);
+               if (write(fd, (char *)&ut, sizeof(struct utmp)) !=
+                   sizeof(struct utmp))
+                       (void) ftruncate(fd, buf.st_size);
+       }
+       (void) close(fd);
+}
diff --git a/util.subproj/pty.c b/util.subproj/pty.c
new file mode 100644 (file)
index 0000000..8c9fc0e
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*
+ * Copyright (c) 1990, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+int openpty(amaster, aslave, name, termp, winp)
+       int *amaster, *aslave;
+       char *name;
+       struct termios *termp;
+       struct winsize *winp;
+{
+       static char line[] = "/dev/ptyXX";
+       register const char *cp1, *cp2;
+       register int master, slave, ttygid;
+       struct group *gr;
+
+       if ((gr = getgrnam("tty")) != NULL)
+               ttygid = gr->gr_gid;
+       else
+               ttygid = -1;
+
+       for (cp1 = "pqrs"; *cp1; cp1++) {
+               line[8] = *cp1;
+               for (cp2 = "0123456789abcdef"; *cp2; cp2++) {
+                       line[5] = 'p';
+                       line[9] = *cp2;
+                       if ((master = open(line, O_RDWR, 0)) == -1) {
+                               if (errno == ENOENT)
+                                       return (-1);    /* out of ptys */
+                       } else {
+                               line[5] = 't';
+                               (void) chown(line, getuid(), ttygid);
+                               (void) chmod(line, S_IRUSR|S_IWUSR|S_IWGRP);
+                               (void) revoke(line);
+                               if ((slave = open(line, O_RDWR, 0)) != -1) {
+                                       *amaster = master;
+                                       *aslave = slave;
+                                       if (name)
+                                               strcpy(name, line);
+                                       if (termp)
+                                               (void) tcsetattr(slave, 
+                                                       TCSAFLUSH, termp);
+                                       if (winp)
+                                               (void) ioctl(slave, TIOCSWINSZ, 
+                                                       (char *)winp);
+                                       return (0);
+                               }
+                               (void) close(master);
+                       }
+               }
+       }
+       errno = ENOENT; /* out of ptys */
+       return (-1);
+}
+
+forkpty(amaster, name, termp, winp)
+       int *amaster;
+       char *name;
+       struct termios *termp;
+       struct winsize *winp;
+{
+       int master, slave, pid;
+
+       if (openpty(&master, &slave, name, termp, winp) == -1)
+               return (-1);
+       switch (pid = fork()) {
+       case -1:
+               return (-1);
+       case 0:
+               /* 
+                * child
+                */
+               (void) close(master);
+               login_tty(slave);
+               return (0);
+       }
+       /*
+        * parent
+        */
+       *amaster = master;
+       (void) close(slave);
+       return (pid);
+}