From e9ce8d39e6e7429796e6a36445943bd5c5ed786c Mon Sep 17 00:00:00 2001
From: Apple <opensource@apple.com>
Date: Wed, 11 Apr 2001 00:23:59 +0000
Subject: [PATCH] Libc-166.tar.gz

---
 Makefile                                      |   65 +
 Makefile.postamble                            |   11 +
 Makefile.preamble                             |   12 +
 PB.project                                    |   50 +
 compat43.subproj/Makefile                     |   47 +
 compat43.subproj/Makefile.postamble           |  100 +
 compat43.subproj/Makefile.preamble            |  137 +
 compat43.subproj/PB.project                   |   36 +
 compat43.subproj/creat.c                      |   66 +
 compat43.subproj/gethostid.c                  |   76 +
 compat43.subproj/getwd.c                      |   73 +
 compat43.subproj/killpg.c                     |   75 +
 compat43.subproj/send.c                       |   67 +
 compat43.subproj/sethostid.c                  |   75 +
 compat43.subproj/setpgrp.c                    |   67 +
 compat43.subproj/setregid.c                   |   80 +
 compat43.subproj/setreuid.c                   |   81 +
 compat43.subproj/setrgid.c                    |   68 +
 compat43.subproj/setruid.c                    |   68 +
 compat43.subproj/sigcompat.c                  |  124 +
 crt_externs.c                                 |  100 +
 db.subproj/Makefile                           |   51 +
 db.subproj/Makefile.postamble                 |  100 +
 db.subproj/Makefile.preamble                  |  137 +
 db.subproj/PB.project                         |   26 +
 db.subproj/btree.subproj/Makefile             |   56 +
 db.subproj/btree.subproj/Makefile.postamble   |  100 +
 db.subproj/btree.subproj/Makefile.preamble    |    3 +
 db.subproj/btree.subproj/PB.project           |   42 +
 db.subproj/btree.subproj/bt_close.c           |  222 ++
 db.subproj/btree.subproj/bt_conv.c            |  239 ++
 db.subproj/btree.subproj/bt_debug.c           |  349 +++
 db.subproj/btree.subproj/bt_delete.c          |  342 +++
 db.subproj/btree.subproj/bt_extern.h          |   89 +
 db.subproj/btree.subproj/bt_get.c             |  256 ++
 db.subproj/btree.subproj/bt_open.c            |  458 +++
 db.subproj/btree.subproj/bt_overflow.c        |  242 ++
 db.subproj/btree.subproj/bt_page.c            |  111 +
 db.subproj/btree.subproj/bt_put.c             |  336 +++
 db.subproj/btree.subproj/bt_search.c          |  253 ++
 db.subproj/btree.subproj/bt_seq.c             |  398 +++
 db.subproj/btree.subproj/bt_split.c           |  843 ++++++
 db.subproj/btree.subproj/bt_stack.c           |  110 +
 db.subproj/btree.subproj/bt_utils.c           |  265 ++
 db.subproj/btree.subproj/btree.h              |  372 +++
 db.subproj/db.subproj/Makefile                |   45 +
 db.subproj/db.subproj/Makefile.postamble      |  100 +
 db.subproj/db.subproj/Makefile.preamble       |  137 +
 db.subproj/db.subproj/PB.project              |   23 +
 db.subproj/db.subproj/db.c                    |  117 +
 db.subproj/hash.subproj/Makefile              |   48 +
 db.subproj/hash.subproj/Makefile.postamble    |  100 +
 db.subproj/hash.subproj/Makefile.preamble     |  137 +
 db.subproj/hash.subproj/PB.project            |   32 +
 db.subproj/hash.subproj/extern.h              |   84 +
 db.subproj/hash.subproj/hash.c                | 1012 +++++++
 db.subproj/hash.subproj/hash.h                |  303 ++
 db.subproj/hash.subproj/hash_bigkey.c         |  685 +++++
 db.subproj/hash.subproj/hash_buf.c            |  365 +++
 db.subproj/hash.subproj/hash_func.c           |  230 ++
 db.subproj/hash.subproj/hash_log2.c           |   70 +
 db.subproj/hash.subproj/hash_page.c           |  962 +++++++
 db.subproj/hash.subproj/hsearch.c             |  125 +
 db.subproj/hash.subproj/ndbm.c                |  220 ++
 db.subproj/hash.subproj/page.h                |  111 +
 db.subproj/hash.subproj/search.h              |   70 +
 db.subproj/mpool.subproj/Makefile             |   45 +
 db.subproj/mpool.subproj/Makefile.postamble   |  100 +
 db.subproj/mpool.subproj/Makefile.preamble    |  137 +
 db.subproj/mpool.subproj/PB.project           |   23 +
 db.subproj/mpool.subproj/mpool.c              |  552 ++++
 db.subproj/recno.subproj/Makefile             |   48 +
 db.subproj/recno.subproj/Makefile.postamble   |  100 +
 db.subproj/recno.subproj/Makefile.preamble    |  137 +
 db.subproj/recno.subproj/PB.project           |   32 +
 db.subproj/recno.subproj/extern.h             |   73 +
 db.subproj/recno.subproj/rec_close.c          |  183 ++
 db.subproj/recno.subproj/rec_delete.c         |  215 ++
 db.subproj/recno.subproj/rec_get.c            |  316 ++
 db.subproj/recno.subproj/rec_open.c           |  253 ++
 db.subproj/recno.subproj/rec_put.c            |  271 ++
 db.subproj/recno.subproj/rec_search.c         |  145 +
 db.subproj/recno.subproj/rec_seq.c            |  149 +
 db.subproj/recno.subproj/rec_utils.c          |  132 +
 db.subproj/recno.subproj/recno.h              |   58 +
 gen.subproj/Makefile                          |   72 +
 gen.subproj/Makefile.postamble                |    4 +
 gen.subproj/Makefile.preamble                 |    2 +
 gen.subproj/NSSystemDirectories.c             |  122 +
 gen.subproj/PB.project                        |  108 +
 gen.subproj/alarm.c                           |   77 +
 gen.subproj/assert.c                          |   75 +
 gen.subproj/clock.c                           |   74 +
 gen.subproj/closedir.c                        |   76 +
 gen.subproj/confstr.c                         |  104 +
 gen.subproj/crypt.c                           |  981 +++++++
 gen.subproj/ctermid.c                         |   71 +
 gen.subproj/ctime.c                           | 1399 +++++++++
 gen.subproj/daemon.c                          |   89 +
 gen.subproj/devname.c                         |  130 +
 gen.subproj/difftime.c                        |   63 +
 gen.subproj/disklabel.c                       |  204 ++
 gen.subproj/err.c                             |  206 ++
 gen.subproj/errlst.c                          |  173 ++
 gen.subproj/exec.c                            |  323 +++
 gen.subproj/fnmatch.c                         |  189 ++
 gen.subproj/ftok.3                            |   87 +
 gen.subproj/ftok.c                            |   47 +
 gen.subproj/fts.c                             | 1015 +++++++
 gen.subproj/getbsize.c                        |  124 +
 gen.subproj/getcap.c                          | 1064 +++++++
 gen.subproj/getcwd.c                          |  410 +++
 gen.subproj/gethostname.c                     |   74 +
 gen.subproj/getloadavg.c                      |   92 +
 gen.subproj/getlogin.c                        |   76 +
 gen.subproj/getmntinfo.c                      |   88 +
 gen.subproj/getpagesize.c                     |   72 +
 gen.subproj/getpass.c                         |  109 +
 gen.subproj/getttyent.c                       |  223 ++
 gen.subproj/getusershell.c                    |  155 +
 gen.subproj/getvfsbyname.c                    |   94 +
 gen.subproj/gmon.c                            |  758 +++++
 gen.subproj/i386.subproj/Makefile             |   50 +
 gen.subproj/i386.subproj/Makefile.postamble   |  100 +
 gen.subproj/i386.subproj/Makefile.preamble    |  137 +
 gen.subproj/i386.subproj/PB.project           |   43 +
 gen.subproj/i386.subproj/abs.c                |   71 +
 gen.subproj/i386.subproj/bcmp.c               |   86 +
 gen.subproj/i386.subproj/bcopy.c              |  161 ++
 gen.subproj/i386.subproj/bzero.c              |   42 +
 gen.subproj/i386.subproj/ecvt.c               |  166 ++
 gen.subproj/i386.subproj/ffs.c                |   81 +
 gen.subproj/i386.subproj/insque.c             |   55 +
 gen.subproj/i386.subproj/isinf.c              |   42 +
 gen.subproj/i386.subproj/mcount.s             |   38 +
 gen.subproj/i386.subproj/memcpy.c             |   32 +
 gen.subproj/i386.subproj/memmove.c            |   32 +
 gen.subproj/i386.subproj/remque.c             |   55 +
 gen.subproj/i386.subproj/setjmperr.c          |   55 +
 gen.subproj/i386.subproj/strcat.c             |   77 +
 gen.subproj/i386.subproj/strcpy.c             |   77 +
 gen.subproj/i386.subproj/strlen.c             |   77 +
 gen.subproj/i386.subproj/strncat.c            |   95 +
 gen.subproj/i386.subproj/strncmp.c            |   83 +
 gen.subproj/i386.subproj/strncpy.c            |   95 +
 gen.subproj/isatty.c                          |   66 +
 gen.subproj/isnan.c                           |   83 +
 gen.subproj/malloc.c                          |  774 +++++
 gen.subproj/malloc.h                          |  151 +
 gen.subproj/nanosleep.c                       |   72 +
 gen.subproj/nice.c                            |   75 +
 gen.subproj/nlist.c                           |  329 +++
 gen.subproj/opendir.c                         |  278 ++
 gen.subproj/pause.c                           |   67 +
 gen.subproj/popen.c                           |  182 ++
 gen.subproj/ppc.subproj/Makefile              |   53 +
 gen.subproj/ppc.subproj/Makefile.postamble    |  100 +
 gen.subproj/ppc.subproj/Makefile.preamble     |  137 +
 gen.subproj/ppc.subproj/PB.project            |   43 +
 gen.subproj/ppc.subproj/abs.s                 |   62 +
 gen.subproj/ppc.subproj/bcmp.c                |   41 +
 gen.subproj/ppc.subproj/bcopy.s               |  410 +++
 gen.subproj/ppc.subproj/bzero.s               |   79 +
 gen.subproj/ppc.subproj/ecvt.c                |  237 ++
 gen.subproj/ppc.subproj/ffs.s                 |   49 +
 gen.subproj/ppc.subproj/fp.h                  |   62 +
 gen.subproj/ppc.subproj/genassym.h            |  126 +
 gen.subproj/ppc.subproj/insque.c              |   55 +
 gen.subproj/ppc.subproj/isinf.c               |   54 +
 gen.subproj/ppc.subproj/mcount.s              |   43 +
 gen.subproj/ppc.subproj/memcpy.s              |   23 +
 gen.subproj/ppc.subproj/memmove.s             |   23 +
 gen.subproj/ppc.subproj/remque.c              |   55 +
 gen.subproj/ppc.subproj/setjmperr.c           |   44 +
 gen.subproj/ppc.subproj/strcat.c              |   44 +
 gen.subproj/ppc.subproj/strcpy.c              |   52 +
 gen.subproj/ppc.subproj/strlen.s              |  100 +
 gen.subproj/ppc.subproj/strncat.c             |   52 +
 gen.subproj/ppc.subproj/strncmp.c             |   56 +
 gen.subproj/ppc.subproj/strncpy.c             |   61 +
 gen.subproj/psignal.c                         |   85 +
 gen.subproj/raise.c                           |   63 +
 gen.subproj/readdir.c                         |   93 +
 gen.subproj/rewinddir.c                       |   66 +
 gen.subproj/scalable_malloc.c                 | 1649 +++++++++++
 gen.subproj/scalable_malloc.h                 |   47 +
 gen.subproj/scandir.c                         |  153 +
 gen.subproj/seekdir.c                         |   70 +
 gen.subproj/sethostname.c                     |   77 +
 gen.subproj/setlogin.c                        |   63 +
 gen.subproj/setmode.c                         |  471 +++
 gen.subproj/siginterrupt.c                    |   79 +
 gen.subproj/siglist.c                         |  127 +
 gen.subproj/signal.c                          |  106 +
 gen.subproj/sigsetops.c                       |   99 +
 gen.subproj/sleep.c                           |   46 +
 gen.subproj/stack_logging.c                   |  384 +++
 gen.subproj/stack_logging.h                   |   92 +
 gen.subproj/sysconf.c                         |  206 ++
 gen.subproj/sysctl.c                          |  195 ++
 gen.subproj/sysctlbyname.c                    |   37 +
 gen.subproj/syslog.c                          |  307 ++
 gen.subproj/telldir.c                         |  146 +
 gen.subproj/termios.c                         |  260 ++
 gen.subproj/time.c                            |   70 +
 gen.subproj/times.c                           |   85 +
 gen.subproj/timezone.c                        |  152 +
 gen.subproj/ttyname.c                         |  133 +
 gen.subproj/ttyslot.c                         |   86 +
 gen.subproj/ualarm.c                          |   83 +
 gen.subproj/uname.c                           |  108 +
 gen.subproj/unvis.c                           |  266 ++
 gen.subproj/usleep.c                          |   65 +
 gen.subproj/utime.c                           |   75 +
 gen.subproj/vis.c                             |  204 ++
 gen.subproj/wait.c                            |   65 +
 gen.subproj/wait3.c                           |   67 +
 gen.subproj/waitpid.c                         |   72 +
 gen.subproj/zone.c                            |  120 +
 gen.subproj/zone.h                            |   55 +
 headers.subproj/Makefile                      |   53 +
 headers.subproj/Makefile.postamble            |    5 +
 headers.subproj/Makefile.preamble             |    4 +
 headers.subproj/NSSystemDirectories.h         |   88 +
 headers.subproj/PB.project                    |   41 +
 headers.subproj/asm.h                         |  415 +++
 headers.subproj/crt_externs.h                 |   36 +
 headers.subproj/libc.h                        |   72 +
 headers.subproj/monitor.h                     |   44 +
 headers.subproj/standards.h                   |   36 +
 internat.subproj/Makefile                     |   50 +
 internat.subproj/Makefile.postamble           |    5 +
 internat.subproj/Makefile.preamble            |    3 +
 internat.subproj/NXCType.c                    |  598 ++++
 internat.subproj/NXCType.h                    |   58 +
 internat.subproj/NXIsAlNum.c                  |   36 +
 internat.subproj/NXIsAlpha.c                  |   37 +
 internat.subproj/NXIsAscii.c                  |   34 +
 internat.subproj/NXIsCntrl.c                  |   36 +
 internat.subproj/NXIsDigit.c                  |   36 +
 internat.subproj/NXIsGraph.c                  |   37 +
 internat.subproj/NXIsLower.c                  |   36 +
 internat.subproj/NXIsPrint.c                  |   37 +
 internat.subproj/NXIsPunct.c                  |   36 +
 internat.subproj/NXIsSpace.c                  |   36 +
 internat.subproj/NXIsUpper.c                  |   36 +
 internat.subproj/NXIsXDigit.c                 |   36 +
 internat.subproj/NXToAscii.c                  |  250 ++
 internat.subproj/NXToLower.c                  |   34 +
 internat.subproj/NXToUpper.c                  |   34 +
 internat.subproj/PB.project                   |   42 +
 internat.subproj/_NXToLower.c                 |   36 +
 internat.subproj/_NXToUpper.c                 |   36 +
 locale.subproj/Makefile                       |   46 +
 locale.subproj/Makefile.postamble             |  100 +
 locale.subproj/Makefile.preamble              |  137 +
 locale.subproj/PB.project                     |   37 +
 locale.subproj/ansi.c                         |  166 ++
 locale.subproj/ctype.c                        |   90 +
 locale.subproj/euc.c                          |  238 ++
 locale.subproj/frune.c                        |  121 +
 locale.subproj/isctype.c                      |  193 ++
 locale.subproj/lconv.c                        |   88 +
 locale.subproj/localeconv.c                   |   67 +
 locale.subproj/mbrune.c                       |  130 +
 locale.subproj/none.c                         |  111 +
 locale.subproj/rune.c                         |  352 +++
 locale.subproj/runetable.c                    |  178 ++
 locale.subproj/setlocale.c                    |  252 ++
 locale.subproj/utf2.c                         |  166 ++
 mach.subproj/Makefile                         |   65 +
 mach.subproj/Makefile.postamble               |    0
 mach.subproj/Makefile.preamble                |   37 +
 mach.subproj/PB.project                       |   78 +
 mach.subproj/bootstrap.defs                   |   22 +
 mach.subproj/clock.defs                       |    1 +
 mach.subproj/clock_priv.defs                  |    1 +
 mach.subproj/clock_reply.defs                 |   22 +
 mach.subproj/clock_sleep.c                    |   32 +
 mach.subproj/err_ipc.sub                      |   99 +
 mach.subproj/err_kern.sub                     |  182 ++
 mach.subproj/err_mach_ipc.sub                 |  119 +
 mach.subproj/err_server.sub                   |  357 +++
 mach.subproj/err_us.sub                       |   45 +
 mach.subproj/error_codes.c                    |   79 +
 mach.subproj/exc.defs                         |   23 +
 mach.subproj/exc_catcher.c                    |   60 +
 mach.subproj/exc_catcher_state.c              |   62 +
 mach.subproj/exc_catcher_state_identity.c     |   64 +
 mach.subproj/externs.h                        |   15 +
 mach.subproj/fprintf_stderr.c                 |   35 +
 mach.subproj/headers.subproj/Makefile         |   53 +
 .../headers.subproj/Makefile.postamble        |  100 +
 .../headers.subproj/Makefile.preamble         |    1 +
 mach.subproj/headers.subproj/PB.project       |   45 +
 mach.subproj/headers.subproj/errorlib.h       |   70 +
 mach.subproj/headers.subproj/mach.h           |  120 +
 mach.subproj/headers.subproj/mach_error.h     |   83 +
 mach.subproj/headers.subproj/mach_init.h      |  112 +
 mach.subproj/headers.subproj/mach_interface.h |   27 +
 mach.subproj/headers.subproj/mig_errors.h     |  124 +
 mach.subproj/headers.subproj/port_obj.h       |   71 +
 mach.subproj/headers.subproj/sync.h           |   29 +
 mach.subproj/headers.subproj/vm_task.h        |   28 +
 mach.subproj/host_priv.defs                   |    1 +
 mach.subproj/host_security.defs               |    1 +
 mach.subproj/ledger.defs                      |    1 +
 mach.subproj/lock_set.defs                    |    1 +
 mach.subproj/mach_absolute_time.c             |   19 +
 mach.subproj/mach_error.c                     |   79 +
 mach.subproj/mach_error_string.c              |  112 +
 mach.subproj/mach_host.defs                   |   22 +
 mach.subproj/mach_init.c                      |  219 ++
 mach.subproj/mach_init_ports.c                |  105 +
 mach.subproj/mach_msg.c                       |  148 +
 mach.subproj/mach_msg_destroy.c               |  169 ++
 mach.subproj/mach_msg_receive.c               |   57 +
 mach.subproj/mach_msg_send.c                  |   57 +
 mach.subproj/mach_msg_server.c                |  265 ++
 mach.subproj/mach_port.defs                   |   22 +
 mach.subproj/mach_subsystem_join.c            |  153 +
 mach.subproj/mach_traps.s                     |   48 +
 mach.subproj/mig_allocate.c                   |   64 +
 mach.subproj/mig_deallocate.c                 |   60 +
 mach.subproj/mig_reply_setup.c                |   75 +
 mach.subproj/mig_strncpy.c                    |   85 +
 mach.subproj/ms_thread_switch.c               |   47 +
 mach.subproj/notify.defs                      |    1 +
 mach.subproj/panic.c                          |   58 +
 mach.subproj/port_obj.c                       |   29 +
 mach.subproj/processor.defs                   |    1 +
 mach.subproj/processor_set.defs               |    1 +
 mach.subproj/sbrk.c                           |   76 +
 mach.subproj/semaphore.c                      |   87 +
 mach.subproj/servers.subproj/Makefile         |   49 +
 .../servers.subproj/Makefile.postamble        |  100 +
 .../servers.subproj/Makefile.preamble         |    3 +
 mach.subproj/servers.subproj/PB.project       |   23 +
 mach.subproj/servers.subproj/bootstrap.defs   |  307 ++
 mach.subproj/servers.subproj/bootstrap_defs.h |   53 +
 mach.subproj/servers.subproj/key_defs.h       |  102 +
 mach.subproj/servers.subproj/ls_defs.h        |  232 ++
 mach.subproj/servers.subproj/netname.defs     |   49 +
 mach.subproj/servers.subproj/netname_defs.h   |   65 +
 mach.subproj/servers.subproj/nm_defs.h        |   78 +
 mach.subproj/slot_name.c                      |   82 +
 mach.subproj/task.defs                        |    1 +
 mach.subproj/thread_act.defs                  |    1 +
 mach.subproj/vm_map.defs                      |    1 +
 net.subproj/Makefile                          |   47 +
 net.subproj/Makefile.postamble                |  100 +
 net.subproj/Makefile.preamble                 |  137 +
 net.subproj/PB.project                        |   36 +
 net.subproj/inet_addr.c                       |  170 ++
 net.subproj/inet_lnaof.c                      |   77 +
 net.subproj/inet_makeaddr.c                   |   80 +
 net.subproj/inet_netof.c                      |   76 +
 net.subproj/inet_network.c                    |  111 +
 net.subproj/inet_ntoa.c                       |   77 +
 net.subproj/iso_addr.c                        |  137 +
 net.subproj/linkaddr.c                        |  176 ++
 net.subproj/ns_addr.c                         |  245 ++
 net.subproj/ns_ntoa.c                         |  118 +
 net.subproj/nsap_addr.c                       |  115 +
 net.subproj/recv.c                            |   66 +
 pthreads.subproj/Makefile                     |   63 +
 pthreads.subproj/Makefile.postamble           |  100 +
 pthreads.subproj/Makefile.preamble            |  137 +
 pthreads.subproj/PB.project                   |   44 +
 pthreads.subproj/lock.s                       |  136 +
 pthreads.subproj/mk_pthread_impl.c            |   68 +
 pthreads.subproj/posix_sched.h                |   47 +
 pthreads.subproj/pthread.c                    | 1278 +++++++++
 pthreads.subproj/pthread.h                    |  267 ++
 pthreads.subproj/pthread_cond.c               |  330 +++
 pthreads.subproj/pthread_impl.h               |   28 +
 pthreads.subproj/pthread_internals.h          |  241 ++
 pthreads.subproj/pthread_machdep.h            |   32 +
 pthreads.subproj/pthread_mutex.c              |  418 +++
 pthreads.subproj/pthread_tsd.c                |  167 ++
 pthreads.subproj/sched.h                      |   17 +
 pthreads.subproj/stack.s                      |   69 +
 pthreads.subproj/thread_setup.c               |   95 +
 regex.subproj/Makefile                        |   47 +
 regex.subproj/Makefile.postamble              |  100 +
 regex.subproj/Makefile.preamble               |  137 +
 regex.subproj/PB.project                      |   23 +
 regex.subproj/cclass.h                        |   88 +
 regex.subproj/cname.h                         |  159 ++
 regex.subproj/engine.c                        | 1109 ++++++++
 regex.subproj/regcomp.c                       | 1712 +++++++++++
 regex.subproj/regerror.c                      |  198 ++
 regex.subproj/regex2.h                        |  191 ++
 regex.subproj/regexec.c                       |  195 ++
 regex.subproj/regfree.c                       |   98 +
 regex.subproj/utils.h                         |   75 +
 stdio.subproj/Makefile                        |   57 +
 stdio.subproj/Makefile.postamble              |  100 +
 stdio.subproj/Makefile.preamble               |  137 +
 stdio.subproj/PB.project                      |   89 +
 stdio.subproj/clrerr.c                        |   67 +
 stdio.subproj/fclose.c                        |   86 +
 stdio.subproj/fdopen.c                        |  107 +
 stdio.subproj/feof.c                          |   71 +
 stdio.subproj/ferror.c                        |   71 +
 stdio.subproj/fflush.c                        |  109 +
 stdio.subproj/fgetc.c                         |   66 +
 stdio.subproj/fgetln.c                        |  179 ++
 stdio.subproj/fgetpos.c                       |   71 +
 stdio.subproj/fgets.c                         |  122 +
 stdio.subproj/fileno.c                        |   71 +
 stdio.subproj/findfp.c                        |  184 ++
 stdio.subproj/flags.c                         |  108 +
 stdio.subproj/floatio.h                       |   65 +
 stdio.subproj/fopen.c                         |  102 +
 stdio.subproj/fprintf.c                       |   87 +
 stdio.subproj/fpurge.c                        |   83 +
 stdio.subproj/fputc.c                         |   67 +
 stdio.subproj/fputs.c                         |   79 +
 stdio.subproj/fread.c                         |   99 +
 stdio.subproj/freopen.c                       |  173 ++
 stdio.subproj/fscanf.c                        |   87 +
 stdio.subproj/fseek.c                         |  284 ++
 stdio.subproj/fsetpos.c                       |   70 +
 stdio.subproj/ftell.c                         |  127 +
 stdio.subproj/funopen.c                       |   99 +
 stdio.subproj/fvwrite.c                       |  208 ++
 stdio.subproj/fvwrite.h                       |   75 +
 stdio.subproj/fwalk.c                         |   78 +
 stdio.subproj/fwrite.c                        |   90 +
 stdio.subproj/getc.c                          |   71 +
 stdio.subproj/getchar.c                       |   70 +
 stdio.subproj/gets.c                          |   86 +
 stdio.subproj/getw.c                          |   68 +
 stdio.subproj/glue.h                          |   68 +
 stdio.subproj/local.h                         |  107 +
 stdio.subproj/makebuf.c                       |  136 +
 stdio.subproj/mktemp.c                        |  145 +
 stdio.subproj/perror.c                        |   85 +
 stdio.subproj/printf.c                        |   86 +
 stdio.subproj/putc.c                          |   72 +
 stdio.subproj/putchar.c                       |   73 +
 stdio.subproj/puts.c                          |   82 +
 stdio.subproj/putw.c                          |   75 +
 stdio.subproj/refill.c                        |  147 +
 stdio.subproj/remove.c                        |   70 +
 stdio.subproj/rewind.c                        |   69 +
 stdio.subproj/rget.c                          |   75 +
 stdio.subproj/scanf.c                         |   86 +
 stdio.subproj/setbuf.c                        |   68 +
 stdio.subproj/setbuffer.c                     |   80 +
 stdio.subproj/setvbuf.c                       |  179 ++
 stdio.subproj/snprintf.c                      |   95 +
 stdio.subproj/sprintf.c                       |   94 +
 stdio.subproj/sscanf.c                        |  107 +
 stdio.subproj/stdio.c                         |  125 +
 stdio.subproj/tempnam.c                       |  104 +
 stdio.subproj/tmpfile.c                       |   97 +
 stdio.subproj/tmpnam.c                        |   76 +
 stdio.subproj/ungetc.c                        |  167 ++
 stdio.subproj/vfprintf.c                      | 1290 +++++++++
 stdio.subproj/vfscanf.c                       |  767 +++++
 stdio.subproj/vprintf.c                       |   67 +
 stdio.subproj/vscanf.c                        |   68 +
 stdio.subproj/vsnprintf.c                     |   79 +
 stdio.subproj/vsprintf.c                      |   77 +
 stdio.subproj/vsscanf.c                       |   88 +
 stdio.subproj/wbuf.c                          |  107 +
 stdio.subproj/wsetup.c                        |  109 +
 stdlib.subproj/Makefile                       |   51 +
 stdlib.subproj/Makefile.postamble             |  100 +
 stdlib.subproj/Makefile.preamble              |  137 +
 stdlib.subproj/PB.project                     |   51 +
 stdlib.subproj/abort.c                        |   83 +
 stdlib.subproj/atexit.c                       |   86 +
 stdlib.subproj/atexit.h                       |   65 +
 stdlib.subproj/atof.c                         |   64 +
 stdlib.subproj/atoi.c                         |   63 +
 stdlib.subproj/atol.c                         |   64 +
 stdlib.subproj/bsearch.c                      |   99 +
 stdlib.subproj/div.c                          |   97 +
 stdlib.subproj/exit.c                         |   78 +
 stdlib.subproj/getenv.c                       |  108 +
 stdlib.subproj/getopt.c                       |  137 +
 stdlib.subproj/getsubopt.c                    |  116 +
 stdlib.subproj/heapsort.c                     |  202 ++
 stdlib.subproj/labs.c                         |   66 +
 stdlib.subproj/ldiv.c                         |   76 +
 stdlib.subproj/merge.c                        |  365 +++
 stdlib.subproj/putenv.c                       |   76 +
 stdlib.subproj/qsort.c                        |  192 ++
 stdlib.subproj/radixsort.c                    |  336 +++
 stdlib.subproj/rand.c                         |   72 +
 stdlib.subproj/random.c                       |  399 +++
 stdlib.subproj/setenv.c                       |  137 +
 stdlib.subproj/strtod.c                       | 2530 +++++++++++++++++
 stdlib.subproj/strtol.c                       |  147 +
 stdlib.subproj/strtoq.c                       |  154 +
 stdlib.subproj/strtoul.c                      |  125 +
 stdlib.subproj/strtouq.c                      |  132 +
 stdlib.subproj/system.c                       |   94 +
 string.subproj/Makefile                       |   51 +
 string.subproj/Makefile.postamble             |  100 +
 string.subproj/Makefile.preamble              |  137 +
 string.subproj/PB.project                     |   47 +
 string.subproj/index.c                        |   74 +
 string.subproj/memccpy.c                      |   76 +
 string.subproj/memchr.c                       |   80 +
 string.subproj/memcmp.c                       |   75 +
 string.subproj/memset.c                       |  151 +
 string.subproj/rindex.c                       |   74 +
 string.subproj/rindix.c                       |   37 +
 string.subproj/strcasecmp.c                   |  136 +
 string.subproj/strchr.c                       |   44 +
 string.subproj/strcmp.s                       |  105 +
 string.subproj/strcoll.c                      |   71 +
 string.subproj/strcspn.c                      |   86 +
 string.subproj/strdup.c                       |   74 +
 string.subproj/strerror.c                     |   86 +
 string.subproj/strftime.c                     |  310 ++
 string.subproj/strmode.c                      |  170 ++
 string.subproj/strpbrk.c                      |   75 +
 string.subproj/strsep.c                       |  101 +
 string.subproj/strspn.c                       |   79 +
 string.subproj/strstr.c                       |   83 +
 string.subproj/strtok.c                       |  108 +
 string.subproj/strxfrm.c                      |   85 +
 string.subproj/swab.c                         |   83 +
 sys.subproj/Makefile                          |   52 +
 sys.subproj/Makefile.postamble                |  106 +
 sys.subproj/Makefile.preamble                 |  139 +
 sys.subproj/PB.project                        |   45 +
 sys.subproj/errno.c                           |   46 +
 sys.subproj/getdtablesize.c                   |    5 +
 sys.subproj/gettimeofday.c                    |   56 +
 sys.subproj/i386.subproj/ATPgetreq.s          |   28 +
 sys.subproj/i386.subproj/ATPgetrsp.s          |   28 +
 sys.subproj/i386.subproj/ATPsndreq.s          |   28 +
 sys.subproj/i386.subproj/ATPsndrsp.s          |   28 +
 sys.subproj/i386.subproj/ATgetmsg.s           |   28 +
 sys.subproj/i386.subproj/ATputmsg.s           |   28 +
 sys.subproj/i386.subproj/ATsocket.s           |   28 +
 sys.subproj/i386.subproj/Makefile             |  127 +
 sys.subproj/i386.subproj/Makefile.postamble   |  100 +
 sys.subproj/i386.subproj/Makefile.preamble    |  137 +
 sys.subproj/i386.subproj/PB.project           |  211 ++
 sys.subproj/i386.subproj/SYS.h                |   90 +
 sys.subproj/i386.subproj/_exit.s              |   28 +
 sys.subproj/i386.subproj/_getlogin.s          |   28 +
 sys.subproj/i386.subproj/_setjmp.s            |  135 +
 sys.subproj/i386.subproj/_setlogin.s          |   29 +
 sys.subproj/i386.subproj/_sysctl.s            |   28 +
 sys.subproj/i386.subproj/accept.s             |   28 +
 sys.subproj/i386.subproj/access.s             |   28 +
 sys.subproj/i386.subproj/acct.s               |   28 +
 sys.subproj/i386.subproj/add_profil.s         |   28 +
 sys.subproj/i386.subproj/adjtime.s            |   28 +
 sys.subproj/i386.subproj/bind.s               |   28 +
 sys.subproj/i386.subproj/cerror.s             |   36 +
 sys.subproj/i386.subproj/chdir.s              |   28 +
 sys.subproj/i386.subproj/checkuseraccess.s    |   28 +
 sys.subproj/i386.subproj/chflags.s            |   28 +
 sys.subproj/i386.subproj/chmod.s              |   28 +
 sys.subproj/i386.subproj/chown.s              |   28 +
 sys.subproj/i386.subproj/chroot.s             |   28 +
 sys.subproj/i386.subproj/close.s              |   28 +
 sys.subproj/i386.subproj/connect.s            |   28 +
 sys.subproj/i386.subproj/dup.s                |   28 +
 sys.subproj/i386.subproj/dup2.s               |   28 +
 sys.subproj/i386.subproj/exchangedata.s       |   28 +
 sys.subproj/i386.subproj/execve.s             |   28 +
 sys.subproj/i386.subproj/fchdir.s             |   28 +
 sys.subproj/i386.subproj/fchflags.s           |   28 +
 sys.subproj/i386.subproj/fchmod.s             |   28 +
 sys.subproj/i386.subproj/fchown.s             |   28 +
 sys.subproj/i386.subproj/fcntl.s              |   28 +
 sys.subproj/i386.subproj/flock.s              |   28 +
 sys.subproj/i386.subproj/fork.s               |  164 ++
 sys.subproj/i386.subproj/fpathconf.s          |   28 +
 sys.subproj/i386.subproj/fstat.s              |   28 +
 sys.subproj/i386.subproj/fstatfs.s            |   28 +
 sys.subproj/i386.subproj/fstatv.s             |   28 +
 sys.subproj/i386.subproj/fsync.s              |   28 +
 sys.subproj/i386.subproj/ftruncate.s          |   28 +
 sys.subproj/i386.subproj/getattrlist.s        |   28 +
 sys.subproj/i386.subproj/getdirentries.s      |   28 +
 sys.subproj/i386.subproj/getdirentriesattr.s  |   28 +
 sys.subproj/i386.subproj/getegid.s            |   29 +
 sys.subproj/i386.subproj/geteuid.s            |   29 +
 sys.subproj/i386.subproj/getfh.s              |   28 +
 sys.subproj/i386.subproj/getfsstat.s          |   28 +
 sys.subproj/i386.subproj/getgid.s             |   28 +
 sys.subproj/i386.subproj/getgroups.s          |   28 +
 sys.subproj/i386.subproj/getitimer.s          |   28 +
 sys.subproj/i386.subproj/getpeername.s        |   28 +
 sys.subproj/i386.subproj/getpgrp.s            |   28 +
 sys.subproj/i386.subproj/getpid.s             |   28 +
 sys.subproj/i386.subproj/getppid.s            |   29 +
 sys.subproj/i386.subproj/getpriority.s        |   28 +
 sys.subproj/i386.subproj/getrlimit.s          |   28 +
 sys.subproj/i386.subproj/getrusage.s          |   28 +
 sys.subproj/i386.subproj/getsockname.s        |   28 +
 sys.subproj/i386.subproj/getsockopt.s         |   28 +
 sys.subproj/i386.subproj/getuid.s             |   28 +
 sys.subproj/i386.subproj/ioctl.s              |   28 +
 sys.subproj/i386.subproj/kill.s               |   28 +
 sys.subproj/i386.subproj/ktrace.s             |   28 +
 sys.subproj/i386.subproj/lfs_bmapv.s          |   28 +
 sys.subproj/i386.subproj/lfs_markv.s          |   28 +
 sys.subproj/i386.subproj/lfs_segclean.s       |   28 +
 sys.subproj/i386.subproj/lfs_segwait.s        |   28 +
 sys.subproj/i386.subproj/link.s               |   28 +
 sys.subproj/i386.subproj/listen.s             |   28 +
 sys.subproj/i386.subproj/load_shared_file.s   |   28 +
 sys.subproj/i386.subproj/lseek.s              |   28 +
 sys.subproj/i386.subproj/lstat.s              |   28 +
 sys.subproj/i386.subproj/lstatv.s             |   28 +
 sys.subproj/i386.subproj/madvise.s            |   28 +
 sys.subproj/i386.subproj/mincore.s            |   28 +
 sys.subproj/i386.subproj/minherit.s           |   28 +
 sys.subproj/i386.subproj/mkcomplex.s          |   28 +
 sys.subproj/i386.subproj/mkdir.s              |   28 +
 sys.subproj/i386.subproj/mkfifo.s             |   28 +
 sys.subproj/i386.subproj/mknod.s              |   28 +
 sys.subproj/i386.subproj/mlock.s              |   28 +
 sys.subproj/i386.subproj/mlockall.s           |   28 +
 sys.subproj/i386.subproj/mmap.s               |   28 +
 sys.subproj/i386.subproj/mount.s              |   28 +
 sys.subproj/i386.subproj/mprotect.s           |   28 +
 sys.subproj/i386.subproj/msgctl.s             |   28 +
 sys.subproj/i386.subproj/msgget.s             |   28 +
 sys.subproj/i386.subproj/msgrcv.s             |   28 +
 sys.subproj/i386.subproj/msgsnd.s             |   28 +
 sys.subproj/i386.subproj/msgsys.s             |   28 +
 sys.subproj/i386.subproj/msync.s              |   28 +
 sys.subproj/i386.subproj/munlock.s            |   28 +
 sys.subproj/i386.subproj/munlockall.s         |   28 +
 sys.subproj/i386.subproj/munmap.s             |   28 +
 sys.subproj/i386.subproj/nfssvc.s             |   28 +
 sys.subproj/i386.subproj/open.s               |   28 +
 sys.subproj/i386.subproj/pathconf.s           |   28 +
 sys.subproj/i386.subproj/pipe.s               |   32 +
 sys.subproj/i386.subproj/profil.s             |   28 +
 sys.subproj/i386.subproj/ptrace.s             |   33 +
 sys.subproj/i386.subproj/quota.s              |   30 +
 sys.subproj/i386.subproj/quotactl.s           |   28 +
 sys.subproj/i386.subproj/read.s               |   28 +
 sys.subproj/i386.subproj/readlink.s           |   28 +
 sys.subproj/i386.subproj/readv.s              |   28 +
 sys.subproj/i386.subproj/reboot.s             |   28 +
 sys.subproj/i386.subproj/recvfrom.s           |   28 +
 sys.subproj/i386.subproj/recvmsg.s            |   28 +
 sys.subproj/i386.subproj/rename.s             |   28 +
 sys.subproj/i386.subproj/reset_shared_file.s  |   28 +
 sys.subproj/i386.subproj/revoke.s             |   28 +
 sys.subproj/i386.subproj/rmdir.s              |   28 +
 sys.subproj/i386.subproj/searchfs.s           |   28 +
 sys.subproj/i386.subproj/select.s             |   28 +
 sys.subproj/i386.subproj/sem_close.s          |   26 +
 sys.subproj/i386.subproj/sem_destroy.s        |   26 +
 sys.subproj/i386.subproj/sem_getvalue.s       |   26 +
 sys.subproj/i386.subproj/sem_init.s           |   26 +
 sys.subproj/i386.subproj/sem_open.s           |   26 +
 sys.subproj/i386.subproj/sem_post.s           |   26 +
 sys.subproj/i386.subproj/sem_trywait.s        |   26 +
 sys.subproj/i386.subproj/sem_unlink.s         |   26 +
 sys.subproj/i386.subproj/sem_wait.s           |   26 +
 sys.subproj/i386.subproj/semconfig.s          |   28 +
 sys.subproj/i386.subproj/semctl.s             |   28 +
 sys.subproj/i386.subproj/semget.s             |   28 +
 sys.subproj/i386.subproj/semop.s              |   28 +
 sys.subproj/i386.subproj/semsys.s             |   28 +
 sys.subproj/i386.subproj/sendmsg.s            |   28 +
 sys.subproj/i386.subproj/sendto.s             |   28 +
 sys.subproj/i386.subproj/setattrlist.s        |   28 +
 sys.subproj/i386.subproj/setegid.s            |   28 +
 sys.subproj/i386.subproj/seteuid.s            |   28 +
 sys.subproj/i386.subproj/setgid.s             |   28 +
 sys.subproj/i386.subproj/setgroups.s          |   28 +
 sys.subproj/i386.subproj/setitimer.s          |   28 +
 sys.subproj/i386.subproj/setjmp.s             |  154 +
 sys.subproj/i386.subproj/setpgid.s            |   28 +
 sys.subproj/i386.subproj/setpriority.s        |   28 +
 sys.subproj/i386.subproj/setprivexec.s        |   28 +
 sys.subproj/i386.subproj/setquota.s           |   30 +
 sys.subproj/i386.subproj/setrlimit.s          |   28 +
 sys.subproj/i386.subproj/setsid.s             |   28 +
 sys.subproj/i386.subproj/setsockopt.s         |   28 +
 sys.subproj/i386.subproj/settimeofday.s       |   28 +
 sys.subproj/i386.subproj/setuid.s             |   28 +
 sys.subproj/i386.subproj/shm_open.s           |   28 +
 sys.subproj/i386.subproj/shm_unlink.s         |   28 +
 sys.subproj/i386.subproj/shmat.s              |   28 +
 sys.subproj/i386.subproj/shmctl.s             |   28 +
 sys.subproj/i386.subproj/shmdt.s              |   28 +
 sys.subproj/i386.subproj/shmget.s             |   28 +
 sys.subproj/i386.subproj/shmsys.s             |   28 +
 sys.subproj/i386.subproj/shutdown.s           |   28 +
 sys.subproj/i386.subproj/sigaltstack.s        |   28 +
 sys.subproj/i386.subproj/sigpending.s         |   28 +
 sys.subproj/i386.subproj/sigreturn.s          |   28 +
 sys.subproj/i386.subproj/socket.s             |   28 +
 sys.subproj/i386.subproj/socketpair.s         |   28 +
 sys.subproj/i386.subproj/stat.s               |   28 +
 sys.subproj/i386.subproj/statfs.s             |   28 +
 sys.subproj/i386.subproj/statv.s              |   28 +
 sys.subproj/i386.subproj/swapon.s             |   28 +
 sys.subproj/i386.subproj/symlink.s            |   28 +
 sys.subproj/i386.subproj/sync.s               |   28 +
 sys.subproj/i386.subproj/syscall.s            |   37 +
 sys.subproj/i386.subproj/table.s              |   25 +
 sys.subproj/i386.subproj/truncate.s           |   28 +
 sys.subproj/i386.subproj/umask.s              |   28 +
 sys.subproj/i386.subproj/undelete.s           |   28 +
 sys.subproj/i386.subproj/unlink.s             |   28 +
 sys.subproj/i386.subproj/unmount.s            |   28 +
 sys.subproj/i386.subproj/utimes.s             |   28 +
 sys.subproj/i386.subproj/vfork.s              |  164 ++
 sys.subproj/i386.subproj/wait4.s              |   28 +
 sys.subproj/i386.subproj/write.s              |   28 +
 sys.subproj/i386.subproj/writev.s             |   28 +
 sys.subproj/msync.2                           |  103 +
 sys.subproj/ppc.subproj/ATPgetreq.s           |   26 +
 sys.subproj/ppc.subproj/ATPgetrsp.s           |   26 +
 sys.subproj/ppc.subproj/ATPsndreq.s           |   26 +
 sys.subproj/ppc.subproj/ATPsndrsp.s           |   26 +
 sys.subproj/ppc.subproj/ATgetmsg.s            |   26 +
 sys.subproj/ppc.subproj/ATputmsg.s            |   26 +
 sys.subproj/ppc.subproj/ATsocket.s            |   26 +
 sys.subproj/ppc.subproj/Makefile              |  132 +
 sys.subproj/ppc.subproj/Makefile.postamble    |  100 +
 sys.subproj/ppc.subproj/Makefile.preamble     |  138 +
 sys.subproj/ppc.subproj/PB.project            |  216 ++
 sys.subproj/ppc.subproj/SYS.h                 |  163 ++
 sys.subproj/ppc.subproj/_exit.s               |   25 +
 sys.subproj/ppc.subproj/_getlogin.s           |   26 +
 sys.subproj/ppc.subproj/_longjmp.s            |   76 +
 sys.subproj/ppc.subproj/_setjmp.h             |   57 +
 sys.subproj/ppc.subproj/_setjmp.s             |   73 +
 sys.subproj/ppc.subproj/_setlogin.s           |   25 +
 sys.subproj/ppc.subproj/_sysctl.s             |   26 +
 sys.subproj/ppc.subproj/accept.s              |   26 +
 sys.subproj/ppc.subproj/access.s              |   26 +
 sys.subproj/ppc.subproj/acct.s                |   26 +
 sys.subproj/ppc.subproj/add_profil.s          |   25 +
 sys.subproj/ppc.subproj/adjtime.s             |   26 +
 sys.subproj/ppc.subproj/assym.h               |  155 +
 sys.subproj/ppc.subproj/bind.s                |   26 +
 sys.subproj/ppc.subproj/cerror.s              |   36 +
 sys.subproj/ppc.subproj/chdir.s               |   26 +
 sys.subproj/ppc.subproj/checkuseraccess.s     |   27 +
 sys.subproj/ppc.subproj/chflags.s             |   25 +
 sys.subproj/ppc.subproj/chmod.s               |   26 +
 sys.subproj/ppc.subproj/chown.s               |   26 +
 sys.subproj/ppc.subproj/chroot.s              |   26 +
 sys.subproj/ppc.subproj/close.s               |   26 +
 sys.subproj/ppc.subproj/connect.s             |   26 +
 sys.subproj/ppc.subproj/cthread.s             |   28 +
 sys.subproj/ppc.subproj/dup.s                 |   26 +
 sys.subproj/ppc.subproj/dup2.s                |   26 +
 sys.subproj/ppc.subproj/exchangedata.s        |   27 +
 sys.subproj/ppc.subproj/execve.s              |   26 +
 sys.subproj/ppc.subproj/fchdir.s              |   26 +
 sys.subproj/ppc.subproj/fchflags.s            |   25 +
 sys.subproj/ppc.subproj/fchmod.s              |   26 +
 sys.subproj/ppc.subproj/fchown.s              |   26 +
 sys.subproj/ppc.subproj/fcntl.s               |   26 +
 sys.subproj/ppc.subproj/flock.s               |   26 +
 sys.subproj/ppc.subproj/fork.s                |  163 ++
 sys.subproj/ppc.subproj/fpathconf.s           |   26 +
 sys.subproj/ppc.subproj/fstat.s               |   26 +
 sys.subproj/ppc.subproj/fstatfs.s             |   26 +
 sys.subproj/ppc.subproj/fstatv.s              |   27 +
 sys.subproj/ppc.subproj/fsync.s               |   26 +
 sys.subproj/ppc.subproj/ftruncate.s           |   26 +
 sys.subproj/ppc.subproj/genassym.h            |  126 +
 sys.subproj/ppc.subproj/getattrlist.s         |   27 +
 sys.subproj/ppc.subproj/getdirentries.s       |   26 +
 sys.subproj/ppc.subproj/getdirentriesattr.s   |   27 +
 sys.subproj/ppc.subproj/getegid.s             |   31 +
 sys.subproj/ppc.subproj/geteuid.s             |   31 +
 sys.subproj/ppc.subproj/getfh.s               |   26 +
 sys.subproj/ppc.subproj/getfsstat.s           |   26 +
 sys.subproj/ppc.subproj/getgid.s              |   26 +
 sys.subproj/ppc.subproj/getgroups.s           |   26 +
 sys.subproj/ppc.subproj/getitimer.s           |   26 +
 sys.subproj/ppc.subproj/getpeername.s         |   26 +
 sys.subproj/ppc.subproj/getpgrp.s             |   26 +
 sys.subproj/ppc.subproj/getpid.s              |   26 +
 sys.subproj/ppc.subproj/getppid.s             |   31 +
 sys.subproj/ppc.subproj/getpriority.s         |   26 +
 sys.subproj/ppc.subproj/getrlimit.s           |   26 +
 sys.subproj/ppc.subproj/getrusage.s           |   26 +
 sys.subproj/ppc.subproj/getsockname.s         |   26 +
 sys.subproj/ppc.subproj/getsockopt.s          |   26 +
 sys.subproj/ppc.subproj/getuid.s              |   26 +
 sys.subproj/ppc.subproj/ioctl.s               |   26 +
 sys.subproj/ppc.subproj/kill.s                |   26 +
 sys.subproj/ppc.subproj/ktrace.s              |   25 +
 sys.subproj/ppc.subproj/lfs_bmapv.s           |   25 +
 sys.subproj/ppc.subproj/lfs_markv.s           |   25 +
 sys.subproj/ppc.subproj/lfs_segclean.s        |   25 +
 sys.subproj/ppc.subproj/lfs_segwait.s         |   25 +
 sys.subproj/ppc.subproj/link.s                |   26 +
 sys.subproj/ppc.subproj/listen.s              |   26 +
 sys.subproj/ppc.subproj/load_shared_file.s    |   26 +
 sys.subproj/ppc.subproj/longjmp.s             |   63 +
 sys.subproj/ppc.subproj/lseek.s               |   26 +
 sys.subproj/ppc.subproj/lstat.s               |   26 +
 sys.subproj/ppc.subproj/lstatv.s              |   27 +
 sys.subproj/ppc.subproj/madvise.s             |   27 +
 sys.subproj/ppc.subproj/mincore.s             |   27 +
 sys.subproj/ppc.subproj/minherit.s            |   26 +
 sys.subproj/ppc.subproj/mkcomplex.s           |   27 +
 sys.subproj/ppc.subproj/mkdir.s               |   26 +
 sys.subproj/ppc.subproj/mkfifo.s              |   25 +
 sys.subproj/ppc.subproj/mknod.s               |   26 +
 sys.subproj/ppc.subproj/mlock.s               |   26 +
 sys.subproj/ppc.subproj/mlockall.s            |   26 +
 sys.subproj/ppc.subproj/mmap.s                |   26 +
 sys.subproj/ppc.subproj/mount.s               |   28 +
 sys.subproj/ppc.subproj/mprotect.s            |   27 +
 sys.subproj/ppc.subproj/msgctl.s              |   26 +
 sys.subproj/ppc.subproj/msgget.s              |   26 +
 sys.subproj/ppc.subproj/msgrcv.s              |   26 +
 sys.subproj/ppc.subproj/msgsnd.s              |   26 +
 sys.subproj/ppc.subproj/msgsys.s              |   26 +
 sys.subproj/ppc.subproj/msync.s               |   27 +
 sys.subproj/ppc.subproj/munlock.s             |   26 +
 sys.subproj/ppc.subproj/munlockall.s          |   26 +
 sys.subproj/ppc.subproj/munmap.s              |   26 +
 sys.subproj/ppc.subproj/nfssvc.s              |   26 +
 sys.subproj/ppc.subproj/open.s                |   26 +
 sys.subproj/ppc.subproj/pathconf.s            |   25 +
 sys.subproj/ppc.subproj/pipe.s                |   33 +
 .../ppc.subproj/processor_facilities.h        |   30 +
 .../ppc.subproj/processor_facilities.s        |   26 +
 sys.subproj/ppc.subproj/profil.s              |   26 +
 sys.subproj/ppc.subproj/ptrace.s              |   30 +
 sys.subproj/ppc.subproj/quota.s               |   28 +
 sys.subproj/ppc.subproj/quotactl.s            |   26 +
 sys.subproj/ppc.subproj/read.s                |   26 +
 sys.subproj/ppc.subproj/readlink.s            |   26 +
 sys.subproj/ppc.subproj/readv.s               |   26 +
 sys.subproj/ppc.subproj/reboot.s              |   27 +
 sys.subproj/ppc.subproj/recvfrom.s            |   26 +
 sys.subproj/ppc.subproj/recvmsg.s             |   26 +
 sys.subproj/ppc.subproj/rename.s              |   26 +
 sys.subproj/ppc.subproj/reset_shared_file.s   |   26 +
 sys.subproj/ppc.subproj/revoke.s              |   26 +
 sys.subproj/ppc.subproj/rmdir.s               |   26 +
 sys.subproj/ppc.subproj/searchfs.s            |   27 +
 sys.subproj/ppc.subproj/select.s              |   26 +
 sys.subproj/ppc.subproj/sem_close.s           |   26 +
 sys.subproj/ppc.subproj/sem_destroy.s         |   26 +
 sys.subproj/ppc.subproj/sem_getvalue.s        |   26 +
 sys.subproj/ppc.subproj/sem_init.s            |   26 +
 sys.subproj/ppc.subproj/sem_open.s            |   26 +
 sys.subproj/ppc.subproj/sem_post.s            |   26 +
 sys.subproj/ppc.subproj/sem_trywait.s         |   26 +
 sys.subproj/ppc.subproj/sem_unlink.s          |   26 +
 sys.subproj/ppc.subproj/sem_wait.s            |   26 +
 sys.subproj/ppc.subproj/semconfig.s           |   26 +
 sys.subproj/ppc.subproj/semctl.s              |   26 +
 sys.subproj/ppc.subproj/semget.s              |   26 +
 sys.subproj/ppc.subproj/semop.s               |   26 +
 sys.subproj/ppc.subproj/semsys.s              |   26 +
 sys.subproj/ppc.subproj/sendmsg.s             |   26 +
 sys.subproj/ppc.subproj/sendto.s              |   26 +
 sys.subproj/ppc.subproj/setattrlist.s         |   27 +
 sys.subproj/ppc.subproj/setegid.s             |   26 +
 sys.subproj/ppc.subproj/seteuid.s             |   26 +
 sys.subproj/ppc.subproj/setgid.s              |   25 +
 sys.subproj/ppc.subproj/setgroups.s           |   26 +
 sys.subproj/ppc.subproj/setitimer.s           |   26 +
 sys.subproj/ppc.subproj/setjmp.s              |   68 +
 sys.subproj/ppc.subproj/setpgid.s             |   26 +
 sys.subproj/ppc.subproj/setpriority.s         |   26 +
 sys.subproj/ppc.subproj/setprivexec.s         |   26 +
 sys.subproj/ppc.subproj/setquota.s            |   27 +
 sys.subproj/ppc.subproj/setrlimit.s           |   26 +
 sys.subproj/ppc.subproj/setsid.s              |   26 +
 sys.subproj/ppc.subproj/setsockopt.s          |   26 +
 sys.subproj/ppc.subproj/settimeofday.s        |   26 +
 sys.subproj/ppc.subproj/setuid.s              |   25 +
 sys.subproj/ppc.subproj/shm_open.s            |   26 +
 sys.subproj/ppc.subproj/shm_unlink.s          |   26 +
 sys.subproj/ppc.subproj/shmat.s               |   26 +
 sys.subproj/ppc.subproj/shmctl.s              |   26 +
 sys.subproj/ppc.subproj/shmdt.s               |   26 +
 sys.subproj/ppc.subproj/shmget.s              |   26 +
 sys.subproj/ppc.subproj/shmsys.s              |   26 +
 sys.subproj/ppc.subproj/shutdown.s            |   26 +
 sys.subproj/ppc.subproj/sigaltstack.s         |   25 +
 sys.subproj/ppc.subproj/sigpending.s          |   25 +
 sys.subproj/ppc.subproj/sigreturn.s           |   54 +
 sys.subproj/ppc.subproj/socket.s              |   26 +
 sys.subproj/ppc.subproj/socketpair.s          |   26 +
 sys.subproj/ppc.subproj/stat.s                |   26 +
 sys.subproj/ppc.subproj/statfs.s              |   26 +
 sys.subproj/ppc.subproj/statv.s               |   27 +
 sys.subproj/ppc.subproj/swapon.s              |   26 +
 sys.subproj/ppc.subproj/symlink.s             |   26 +
 sys.subproj/ppc.subproj/sync.s                |   26 +
 sys.subproj/ppc.subproj/syscall.s             |   27 +
 sys.subproj/ppc.subproj/table.s               |   25 +
 sys.subproj/ppc.subproj/truncate.s            |   26 +
 sys.subproj/ppc.subproj/umask.s               |   26 +
 sys.subproj/ppc.subproj/undelete.s            |   25 +
 sys.subproj/ppc.subproj/unlink.s              |   26 +
 sys.subproj/ppc.subproj/unmount.s             |   26 +
 sys.subproj/ppc.subproj/ur_cthread.s          |   28 +
 sys.subproj/ppc.subproj/utimes.s              |   26 +
 sys.subproj/ppc.subproj/vfork.s               |  180 ++
 sys.subproj/ppc.subproj/wait4.s               |   26 +
 sys.subproj/ppc.subproj/write.s               |   26 +
 sys.subproj/ppc.subproj/writev.s              |   26 +
 sys.subproj/sem_close.2                       |   61 +
 sys.subproj/sem_open.2                        |  163 ++
 sys.subproj/sem_post.2                        |   66 +
 sys.subproj/sem_trywait.2                     |    1 +
 sys.subproj/sem_unlink.2                      |   75 +
 sys.subproj/sem_wait.2                        |   89 +
 sys.subproj/shm_open.2                        |  176 ++
 sys.subproj/shm_unlink.2                      |   74 +
 sys.subproj/sigaction.c                       |  101 +
 sys.subproj/sigcatch.c                        |   36 +
 sys.subproj/sigcatch.h                        |   44 +
 sys.subproj/sigprocmask.c                     |   51 +
 sys.subproj/sigsuspend.c                      |   41 +
 sys.subproj/sigtramp.c                        |   57 +
 threads.subproj/Makefile                      |   57 +
 threads.subproj/Makefile.postamble            |  100 +
 threads.subproj/Makefile.preamble             |  137 +
 threads.subproj/PB.project                    |   28 +
 threads.subproj/cprocs.c                      |  151 +
 threads.subproj/cthread_internals.h           |  143 +
 threads.subproj/cthreads.c                    |  141 +
 threads.subproj/cthreads.h                    |  307 ++
 threads.subproj/i386.subproj/Makefile         |   45 +
 .../i386.subproj/Makefile.postamble           |  100 +
 .../i386.subproj/Makefile.preamble            |  137 +
 threads.subproj/i386.subproj/PB.project       |   23 +
 threads.subproj/i386.subproj/thread.c         |   55 +
 threads.subproj/lu_utils.c                    |  108 +
 threads.subproj/mig_support.c                 |  171 ++
 threads.subproj/ppc.subproj/Makefile          |   43 +
 .../ppc.subproj/Makefile.postamble            |  100 +
 threads.subproj/ppc.subproj/Makefile.preamble |  137 +
 threads.subproj/ppc.subproj/PB.project        |   23 +
 threads.subproj/threads_data.c                |   44 +
 util.subproj/Makefile                         |   45 +
 util.subproj/Makefile.postamble               |  100 +
 util.subproj/Makefile.preamble                |  137 +
 util.subproj/PB.project                       |   23 +
 util.subproj/login.c                          |   81 +
 util.subproj/login_tty.c                      |   71 +
 util.subproj/logout.c                         |   90 +
 util.subproj/logwtmp.c                        |   85 +
 util.subproj/pty.c                            |  146 +
 960 files changed, 91460 insertions(+)
 create mode 100644 Makefile
 create mode 100644 Makefile.postamble
 create mode 100644 Makefile.preamble
 create mode 100644 PB.project
 create mode 100644 compat43.subproj/Makefile
 create mode 100644 compat43.subproj/Makefile.postamble
 create mode 100644 compat43.subproj/Makefile.preamble
 create mode 100644 compat43.subproj/PB.project
 create mode 100644 compat43.subproj/creat.c
 create mode 100644 compat43.subproj/gethostid.c
 create mode 100644 compat43.subproj/getwd.c
 create mode 100644 compat43.subproj/killpg.c
 create mode 100644 compat43.subproj/send.c
 create mode 100644 compat43.subproj/sethostid.c
 create mode 100644 compat43.subproj/setpgrp.c
 create mode 100644 compat43.subproj/setregid.c
 create mode 100644 compat43.subproj/setreuid.c
 create mode 100644 compat43.subproj/setrgid.c
 create mode 100644 compat43.subproj/setruid.c
 create mode 100644 compat43.subproj/sigcompat.c
 create mode 100644 crt_externs.c
 create mode 100644 db.subproj/Makefile
 create mode 100644 db.subproj/Makefile.postamble
 create mode 100644 db.subproj/Makefile.preamble
 create mode 100644 db.subproj/PB.project
 create mode 100644 db.subproj/btree.subproj/Makefile
 create mode 100644 db.subproj/btree.subproj/Makefile.postamble
 create mode 100644 db.subproj/btree.subproj/Makefile.preamble
 create mode 100644 db.subproj/btree.subproj/PB.project
 create mode 100644 db.subproj/btree.subproj/bt_close.c
 create mode 100644 db.subproj/btree.subproj/bt_conv.c
 create mode 100644 db.subproj/btree.subproj/bt_debug.c
 create mode 100644 db.subproj/btree.subproj/bt_delete.c
 create mode 100644 db.subproj/btree.subproj/bt_extern.h
 create mode 100644 db.subproj/btree.subproj/bt_get.c
 create mode 100644 db.subproj/btree.subproj/bt_open.c
 create mode 100644 db.subproj/btree.subproj/bt_overflow.c
 create mode 100644 db.subproj/btree.subproj/bt_page.c
 create mode 100644 db.subproj/btree.subproj/bt_put.c
 create mode 100644 db.subproj/btree.subproj/bt_search.c
 create mode 100644 db.subproj/btree.subproj/bt_seq.c
 create mode 100644 db.subproj/btree.subproj/bt_split.c
 create mode 100644 db.subproj/btree.subproj/bt_stack.c
 create mode 100644 db.subproj/btree.subproj/bt_utils.c
 create mode 100644 db.subproj/btree.subproj/btree.h
 create mode 100644 db.subproj/db.subproj/Makefile
 create mode 100644 db.subproj/db.subproj/Makefile.postamble
 create mode 100644 db.subproj/db.subproj/Makefile.preamble
 create mode 100644 db.subproj/db.subproj/PB.project
 create mode 100644 db.subproj/db.subproj/db.c
 create mode 100644 db.subproj/hash.subproj/Makefile
 create mode 100644 db.subproj/hash.subproj/Makefile.postamble
 create mode 100644 db.subproj/hash.subproj/Makefile.preamble
 create mode 100644 db.subproj/hash.subproj/PB.project
 create mode 100644 db.subproj/hash.subproj/extern.h
 create mode 100644 db.subproj/hash.subproj/hash.c
 create mode 100644 db.subproj/hash.subproj/hash.h
 create mode 100644 db.subproj/hash.subproj/hash_bigkey.c
 create mode 100644 db.subproj/hash.subproj/hash_buf.c
 create mode 100644 db.subproj/hash.subproj/hash_func.c
 create mode 100644 db.subproj/hash.subproj/hash_log2.c
 create mode 100644 db.subproj/hash.subproj/hash_page.c
 create mode 100644 db.subproj/hash.subproj/hsearch.c
 create mode 100644 db.subproj/hash.subproj/ndbm.c
 create mode 100644 db.subproj/hash.subproj/page.h
 create mode 100644 db.subproj/hash.subproj/search.h
 create mode 100644 db.subproj/mpool.subproj/Makefile
 create mode 100644 db.subproj/mpool.subproj/Makefile.postamble
 create mode 100644 db.subproj/mpool.subproj/Makefile.preamble
 create mode 100644 db.subproj/mpool.subproj/PB.project
 create mode 100644 db.subproj/mpool.subproj/mpool.c
 create mode 100644 db.subproj/recno.subproj/Makefile
 create mode 100644 db.subproj/recno.subproj/Makefile.postamble
 create mode 100644 db.subproj/recno.subproj/Makefile.preamble
 create mode 100644 db.subproj/recno.subproj/PB.project
 create mode 100644 db.subproj/recno.subproj/extern.h
 create mode 100644 db.subproj/recno.subproj/rec_close.c
 create mode 100644 db.subproj/recno.subproj/rec_delete.c
 create mode 100644 db.subproj/recno.subproj/rec_get.c
 create mode 100644 db.subproj/recno.subproj/rec_open.c
 create mode 100644 db.subproj/recno.subproj/rec_put.c
 create mode 100644 db.subproj/recno.subproj/rec_search.c
 create mode 100644 db.subproj/recno.subproj/rec_seq.c
 create mode 100644 db.subproj/recno.subproj/rec_utils.c
 create mode 100644 db.subproj/recno.subproj/recno.h
 create mode 100644 gen.subproj/Makefile
 create mode 100644 gen.subproj/Makefile.postamble
 create mode 100644 gen.subproj/Makefile.preamble
 create mode 100644 gen.subproj/NSSystemDirectories.c
 create mode 100644 gen.subproj/PB.project
 create mode 100644 gen.subproj/alarm.c
 create mode 100644 gen.subproj/assert.c
 create mode 100644 gen.subproj/clock.c
 create mode 100644 gen.subproj/closedir.c
 create mode 100644 gen.subproj/confstr.c
 create mode 100644 gen.subproj/crypt.c
 create mode 100644 gen.subproj/ctermid.c
 create mode 100644 gen.subproj/ctime.c
 create mode 100644 gen.subproj/daemon.c
 create mode 100644 gen.subproj/devname.c
 create mode 100644 gen.subproj/difftime.c
 create mode 100644 gen.subproj/disklabel.c
 create mode 100644 gen.subproj/err.c
 create mode 100644 gen.subproj/errlst.c
 create mode 100644 gen.subproj/exec.c
 create mode 100644 gen.subproj/fnmatch.c
 create mode 100644 gen.subproj/ftok.3
 create mode 100644 gen.subproj/ftok.c
 create mode 100644 gen.subproj/fts.c
 create mode 100644 gen.subproj/getbsize.c
 create mode 100644 gen.subproj/getcap.c
 create mode 100644 gen.subproj/getcwd.c
 create mode 100644 gen.subproj/gethostname.c
 create mode 100644 gen.subproj/getloadavg.c
 create mode 100644 gen.subproj/getlogin.c
 create mode 100644 gen.subproj/getmntinfo.c
 create mode 100644 gen.subproj/getpagesize.c
 create mode 100644 gen.subproj/getpass.c
 create mode 100644 gen.subproj/getttyent.c
 create mode 100644 gen.subproj/getusershell.c
 create mode 100644 gen.subproj/getvfsbyname.c
 create mode 100644 gen.subproj/gmon.c
 create mode 100644 gen.subproj/i386.subproj/Makefile
 create mode 100644 gen.subproj/i386.subproj/Makefile.postamble
 create mode 100644 gen.subproj/i386.subproj/Makefile.preamble
 create mode 100644 gen.subproj/i386.subproj/PB.project
 create mode 100644 gen.subproj/i386.subproj/abs.c
 create mode 100644 gen.subproj/i386.subproj/bcmp.c
 create mode 100644 gen.subproj/i386.subproj/bcopy.c
 create mode 100644 gen.subproj/i386.subproj/bzero.c
 create mode 100644 gen.subproj/i386.subproj/ecvt.c
 create mode 100644 gen.subproj/i386.subproj/ffs.c
 create mode 100644 gen.subproj/i386.subproj/insque.c
 create mode 100644 gen.subproj/i386.subproj/isinf.c
 create mode 100644 gen.subproj/i386.subproj/mcount.s
 create mode 100644 gen.subproj/i386.subproj/memcpy.c
 create mode 100644 gen.subproj/i386.subproj/memmove.c
 create mode 100644 gen.subproj/i386.subproj/remque.c
 create mode 100644 gen.subproj/i386.subproj/setjmperr.c
 create mode 100644 gen.subproj/i386.subproj/strcat.c
 create mode 100644 gen.subproj/i386.subproj/strcpy.c
 create mode 100644 gen.subproj/i386.subproj/strlen.c
 create mode 100644 gen.subproj/i386.subproj/strncat.c
 create mode 100644 gen.subproj/i386.subproj/strncmp.c
 create mode 100644 gen.subproj/i386.subproj/strncpy.c
 create mode 100644 gen.subproj/isatty.c
 create mode 100644 gen.subproj/isnan.c
 create mode 100644 gen.subproj/malloc.c
 create mode 100644 gen.subproj/malloc.h
 create mode 100644 gen.subproj/nanosleep.c
 create mode 100644 gen.subproj/nice.c
 create mode 100644 gen.subproj/nlist.c
 create mode 100644 gen.subproj/opendir.c
 create mode 100644 gen.subproj/pause.c
 create mode 100644 gen.subproj/popen.c
 create mode 100644 gen.subproj/ppc.subproj/Makefile
 create mode 100644 gen.subproj/ppc.subproj/Makefile.postamble
 create mode 100644 gen.subproj/ppc.subproj/Makefile.preamble
 create mode 100644 gen.subproj/ppc.subproj/PB.project
 create mode 100644 gen.subproj/ppc.subproj/abs.s
 create mode 100644 gen.subproj/ppc.subproj/bcmp.c
 create mode 100644 gen.subproj/ppc.subproj/bcopy.s
 create mode 100644 gen.subproj/ppc.subproj/bzero.s
 create mode 100755 gen.subproj/ppc.subproj/ecvt.c
 create mode 100644 gen.subproj/ppc.subproj/ffs.s
 create mode 100755 gen.subproj/ppc.subproj/fp.h
 create mode 100644 gen.subproj/ppc.subproj/genassym.h
 create mode 100644 gen.subproj/ppc.subproj/insque.c
 create mode 100644 gen.subproj/ppc.subproj/isinf.c
 create mode 100644 gen.subproj/ppc.subproj/mcount.s
 create mode 100644 gen.subproj/ppc.subproj/memcpy.s
 create mode 100644 gen.subproj/ppc.subproj/memmove.s
 create mode 100644 gen.subproj/ppc.subproj/remque.c
 create mode 100755 gen.subproj/ppc.subproj/setjmperr.c
 create mode 100644 gen.subproj/ppc.subproj/strcat.c
 create mode 100644 gen.subproj/ppc.subproj/strcpy.c
 create mode 100644 gen.subproj/ppc.subproj/strlen.s
 create mode 100644 gen.subproj/ppc.subproj/strncat.c
 create mode 100644 gen.subproj/ppc.subproj/strncmp.c
 create mode 100644 gen.subproj/ppc.subproj/strncpy.c
 create mode 100644 gen.subproj/psignal.c
 create mode 100644 gen.subproj/raise.c
 create mode 100644 gen.subproj/readdir.c
 create mode 100644 gen.subproj/rewinddir.c
 create mode 100644 gen.subproj/scalable_malloc.c
 create mode 100644 gen.subproj/scalable_malloc.h
 create mode 100644 gen.subproj/scandir.c
 create mode 100644 gen.subproj/seekdir.c
 create mode 100644 gen.subproj/sethostname.c
 create mode 100644 gen.subproj/setlogin.c
 create mode 100644 gen.subproj/setmode.c
 create mode 100644 gen.subproj/siginterrupt.c
 create mode 100644 gen.subproj/siglist.c
 create mode 100644 gen.subproj/signal.c
 create mode 100644 gen.subproj/sigsetops.c
 create mode 100644 gen.subproj/sleep.c
 create mode 100644 gen.subproj/stack_logging.c
 create mode 100644 gen.subproj/stack_logging.h
 create mode 100644 gen.subproj/sysconf.c
 create mode 100644 gen.subproj/sysctl.c
 create mode 100644 gen.subproj/sysctlbyname.c
 create mode 100644 gen.subproj/syslog.c
 create mode 100644 gen.subproj/telldir.c
 create mode 100644 gen.subproj/termios.c
 create mode 100644 gen.subproj/time.c
 create mode 100644 gen.subproj/times.c
 create mode 100644 gen.subproj/timezone.c
 create mode 100644 gen.subproj/ttyname.c
 create mode 100644 gen.subproj/ttyslot.c
 create mode 100644 gen.subproj/ualarm.c
 create mode 100644 gen.subproj/uname.c
 create mode 100644 gen.subproj/unvis.c
 create mode 100644 gen.subproj/usleep.c
 create mode 100644 gen.subproj/utime.c
 create mode 100644 gen.subproj/vis.c
 create mode 100644 gen.subproj/wait.c
 create mode 100644 gen.subproj/wait3.c
 create mode 100644 gen.subproj/waitpid.c
 create mode 100644 gen.subproj/zone.c
 create mode 100644 gen.subproj/zone.h
 create mode 100644 headers.subproj/Makefile
 create mode 100644 headers.subproj/Makefile.postamble
 create mode 100644 headers.subproj/Makefile.preamble
 create mode 100644 headers.subproj/NSSystemDirectories.h
 create mode 100644 headers.subproj/PB.project
 create mode 100644 headers.subproj/asm.h
 create mode 100644 headers.subproj/crt_externs.h
 create mode 100644 headers.subproj/libc.h
 create mode 100644 headers.subproj/monitor.h
 create mode 100644 headers.subproj/standards.h
 create mode 100644 internat.subproj/Makefile
 create mode 100644 internat.subproj/Makefile.postamble
 create mode 100644 internat.subproj/Makefile.preamble
 create mode 100644 internat.subproj/NXCType.c
 create mode 100644 internat.subproj/NXCType.h
 create mode 100644 internat.subproj/NXIsAlNum.c
 create mode 100644 internat.subproj/NXIsAlpha.c
 create mode 100644 internat.subproj/NXIsAscii.c
 create mode 100644 internat.subproj/NXIsCntrl.c
 create mode 100644 internat.subproj/NXIsDigit.c
 create mode 100644 internat.subproj/NXIsGraph.c
 create mode 100644 internat.subproj/NXIsLower.c
 create mode 100644 internat.subproj/NXIsPrint.c
 create mode 100644 internat.subproj/NXIsPunct.c
 create mode 100644 internat.subproj/NXIsSpace.c
 create mode 100644 internat.subproj/NXIsUpper.c
 create mode 100644 internat.subproj/NXIsXDigit.c
 create mode 100644 internat.subproj/NXToAscii.c
 create mode 100644 internat.subproj/NXToLower.c
 create mode 100644 internat.subproj/NXToUpper.c
 create mode 100644 internat.subproj/PB.project
 create mode 100644 internat.subproj/_NXToLower.c
 create mode 100644 internat.subproj/_NXToUpper.c
 create mode 100644 locale.subproj/Makefile
 create mode 100644 locale.subproj/Makefile.postamble
 create mode 100644 locale.subproj/Makefile.preamble
 create mode 100644 locale.subproj/PB.project
 create mode 100644 locale.subproj/ansi.c
 create mode 100644 locale.subproj/ctype.c
 create mode 100644 locale.subproj/euc.c
 create mode 100644 locale.subproj/frune.c
 create mode 100644 locale.subproj/isctype.c
 create mode 100644 locale.subproj/lconv.c
 create mode 100644 locale.subproj/localeconv.c
 create mode 100644 locale.subproj/mbrune.c
 create mode 100644 locale.subproj/none.c
 create mode 100644 locale.subproj/rune.c
 create mode 100644 locale.subproj/runetable.c
 create mode 100644 locale.subproj/setlocale.c
 create mode 100644 locale.subproj/utf2.c
 create mode 100644 mach.subproj/Makefile
 create mode 100644 mach.subproj/Makefile.postamble
 create mode 100644 mach.subproj/Makefile.preamble
 create mode 100644 mach.subproj/PB.project
 create mode 100644 mach.subproj/bootstrap.defs
 create mode 100644 mach.subproj/clock.defs
 create mode 100644 mach.subproj/clock_priv.defs
 create mode 100644 mach.subproj/clock_reply.defs
 create mode 100644 mach.subproj/clock_sleep.c
 create mode 100644 mach.subproj/err_ipc.sub
 create mode 100644 mach.subproj/err_kern.sub
 create mode 100644 mach.subproj/err_mach_ipc.sub
 create mode 100644 mach.subproj/err_server.sub
 create mode 100644 mach.subproj/err_us.sub
 create mode 100644 mach.subproj/error_codes.c
 create mode 100644 mach.subproj/exc.defs
 create mode 100644 mach.subproj/exc_catcher.c
 create mode 100644 mach.subproj/exc_catcher_state.c
 create mode 100644 mach.subproj/exc_catcher_state_identity.c
 create mode 100644 mach.subproj/externs.h
 create mode 100644 mach.subproj/fprintf_stderr.c
 create mode 100644 mach.subproj/headers.subproj/Makefile
 create mode 100644 mach.subproj/headers.subproj/Makefile.postamble
 create mode 100644 mach.subproj/headers.subproj/Makefile.preamble
 create mode 100644 mach.subproj/headers.subproj/PB.project
 create mode 100644 mach.subproj/headers.subproj/errorlib.h
 create mode 100644 mach.subproj/headers.subproj/mach.h
 create mode 100644 mach.subproj/headers.subproj/mach_error.h
 create mode 100644 mach.subproj/headers.subproj/mach_init.h
 create mode 100644 mach.subproj/headers.subproj/mach_interface.h
 create mode 100644 mach.subproj/headers.subproj/mig_errors.h
 create mode 100644 mach.subproj/headers.subproj/port_obj.h
 create mode 100644 mach.subproj/headers.subproj/sync.h
 create mode 100644 mach.subproj/headers.subproj/vm_task.h
 create mode 100644 mach.subproj/host_priv.defs
 create mode 100644 mach.subproj/host_security.defs
 create mode 100644 mach.subproj/ledger.defs
 create mode 100644 mach.subproj/lock_set.defs
 create mode 100644 mach.subproj/mach_absolute_time.c
 create mode 100644 mach.subproj/mach_error.c
 create mode 100644 mach.subproj/mach_error_string.c
 create mode 100644 mach.subproj/mach_host.defs
 create mode 100644 mach.subproj/mach_init.c
 create mode 100644 mach.subproj/mach_init_ports.c
 create mode 100644 mach.subproj/mach_msg.c
 create mode 100644 mach.subproj/mach_msg_destroy.c
 create mode 100644 mach.subproj/mach_msg_receive.c
 create mode 100644 mach.subproj/mach_msg_send.c
 create mode 100644 mach.subproj/mach_msg_server.c
 create mode 100644 mach.subproj/mach_port.defs
 create mode 100644 mach.subproj/mach_subsystem_join.c
 create mode 100644 mach.subproj/mach_traps.s
 create mode 100644 mach.subproj/mig_allocate.c
 create mode 100644 mach.subproj/mig_deallocate.c
 create mode 100644 mach.subproj/mig_reply_setup.c
 create mode 100644 mach.subproj/mig_strncpy.c
 create mode 100644 mach.subproj/ms_thread_switch.c
 create mode 100644 mach.subproj/notify.defs
 create mode 100644 mach.subproj/panic.c
 create mode 100644 mach.subproj/port_obj.c
 create mode 100644 mach.subproj/processor.defs
 create mode 100644 mach.subproj/processor_set.defs
 create mode 100644 mach.subproj/sbrk.c
 create mode 100644 mach.subproj/semaphore.c
 create mode 100644 mach.subproj/servers.subproj/Makefile
 create mode 100644 mach.subproj/servers.subproj/Makefile.postamble
 create mode 100644 mach.subproj/servers.subproj/Makefile.preamble
 create mode 100644 mach.subproj/servers.subproj/PB.project
 create mode 100644 mach.subproj/servers.subproj/bootstrap.defs
 create mode 100644 mach.subproj/servers.subproj/bootstrap_defs.h
 create mode 100644 mach.subproj/servers.subproj/key_defs.h
 create mode 100644 mach.subproj/servers.subproj/ls_defs.h
 create mode 100644 mach.subproj/servers.subproj/netname.defs
 create mode 100644 mach.subproj/servers.subproj/netname_defs.h
 create mode 100644 mach.subproj/servers.subproj/nm_defs.h
 create mode 100644 mach.subproj/slot_name.c
 create mode 100644 mach.subproj/task.defs
 create mode 100644 mach.subproj/thread_act.defs
 create mode 100644 mach.subproj/vm_map.defs
 create mode 100644 net.subproj/Makefile
 create mode 100644 net.subproj/Makefile.postamble
 create mode 100644 net.subproj/Makefile.preamble
 create mode 100644 net.subproj/PB.project
 create mode 100644 net.subproj/inet_addr.c
 create mode 100644 net.subproj/inet_lnaof.c
 create mode 100644 net.subproj/inet_makeaddr.c
 create mode 100644 net.subproj/inet_netof.c
 create mode 100644 net.subproj/inet_network.c
 create mode 100644 net.subproj/inet_ntoa.c
 create mode 100644 net.subproj/iso_addr.c
 create mode 100644 net.subproj/linkaddr.c
 create mode 100644 net.subproj/ns_addr.c
 create mode 100644 net.subproj/ns_ntoa.c
 create mode 100644 net.subproj/nsap_addr.c
 create mode 100644 net.subproj/recv.c
 create mode 100644 pthreads.subproj/Makefile
 create mode 100644 pthreads.subproj/Makefile.postamble
 create mode 100644 pthreads.subproj/Makefile.preamble
 create mode 100644 pthreads.subproj/PB.project
 create mode 100644 pthreads.subproj/lock.s
 create mode 100644 pthreads.subproj/mk_pthread_impl.c
 create mode 100644 pthreads.subproj/posix_sched.h
 create mode 100644 pthreads.subproj/pthread.c
 create mode 100644 pthreads.subproj/pthread.h
 create mode 100644 pthreads.subproj/pthread_cond.c
 create mode 100644 pthreads.subproj/pthread_impl.h
 create mode 100644 pthreads.subproj/pthread_internals.h
 create mode 100644 pthreads.subproj/pthread_machdep.h
 create mode 100644 pthreads.subproj/pthread_mutex.c
 create mode 100644 pthreads.subproj/pthread_tsd.c
 create mode 100644 pthreads.subproj/sched.h
 create mode 100644 pthreads.subproj/stack.s
 create mode 100644 pthreads.subproj/thread_setup.c
 create mode 100644 regex.subproj/Makefile
 create mode 100644 regex.subproj/Makefile.postamble
 create mode 100644 regex.subproj/Makefile.preamble
 create mode 100644 regex.subproj/PB.project
 create mode 100644 regex.subproj/cclass.h
 create mode 100644 regex.subproj/cname.h
 create mode 100644 regex.subproj/engine.c
 create mode 100644 regex.subproj/regcomp.c
 create mode 100644 regex.subproj/regerror.c
 create mode 100644 regex.subproj/regex2.h
 create mode 100644 regex.subproj/regexec.c
 create mode 100644 regex.subproj/regfree.c
 create mode 100644 regex.subproj/utils.h
 create mode 100644 stdio.subproj/Makefile
 create mode 100644 stdio.subproj/Makefile.postamble
 create mode 100644 stdio.subproj/Makefile.preamble
 create mode 100644 stdio.subproj/PB.project
 create mode 100644 stdio.subproj/clrerr.c
 create mode 100644 stdio.subproj/fclose.c
 create mode 100644 stdio.subproj/fdopen.c
 create mode 100644 stdio.subproj/feof.c
 create mode 100644 stdio.subproj/ferror.c
 create mode 100644 stdio.subproj/fflush.c
 create mode 100644 stdio.subproj/fgetc.c
 create mode 100644 stdio.subproj/fgetln.c
 create mode 100644 stdio.subproj/fgetpos.c
 create mode 100644 stdio.subproj/fgets.c
 create mode 100644 stdio.subproj/fileno.c
 create mode 100644 stdio.subproj/findfp.c
 create mode 100644 stdio.subproj/flags.c
 create mode 100644 stdio.subproj/floatio.h
 create mode 100644 stdio.subproj/fopen.c
 create mode 100644 stdio.subproj/fprintf.c
 create mode 100644 stdio.subproj/fpurge.c
 create mode 100644 stdio.subproj/fputc.c
 create mode 100644 stdio.subproj/fputs.c
 create mode 100644 stdio.subproj/fread.c
 create mode 100644 stdio.subproj/freopen.c
 create mode 100644 stdio.subproj/fscanf.c
 create mode 100644 stdio.subproj/fseek.c
 create mode 100644 stdio.subproj/fsetpos.c
 create mode 100644 stdio.subproj/ftell.c
 create mode 100644 stdio.subproj/funopen.c
 create mode 100644 stdio.subproj/fvwrite.c
 create mode 100644 stdio.subproj/fvwrite.h
 create mode 100644 stdio.subproj/fwalk.c
 create mode 100644 stdio.subproj/fwrite.c
 create mode 100644 stdio.subproj/getc.c
 create mode 100644 stdio.subproj/getchar.c
 create mode 100644 stdio.subproj/gets.c
 create mode 100644 stdio.subproj/getw.c
 create mode 100644 stdio.subproj/glue.h
 create mode 100644 stdio.subproj/local.h
 create mode 100644 stdio.subproj/makebuf.c
 create mode 100644 stdio.subproj/mktemp.c
 create mode 100644 stdio.subproj/perror.c
 create mode 100644 stdio.subproj/printf.c
 create mode 100644 stdio.subproj/putc.c
 create mode 100644 stdio.subproj/putchar.c
 create mode 100644 stdio.subproj/puts.c
 create mode 100644 stdio.subproj/putw.c
 create mode 100644 stdio.subproj/refill.c
 create mode 100644 stdio.subproj/remove.c
 create mode 100644 stdio.subproj/rewind.c
 create mode 100644 stdio.subproj/rget.c
 create mode 100644 stdio.subproj/scanf.c
 create mode 100644 stdio.subproj/setbuf.c
 create mode 100644 stdio.subproj/setbuffer.c
 create mode 100644 stdio.subproj/setvbuf.c
 create mode 100644 stdio.subproj/snprintf.c
 create mode 100644 stdio.subproj/sprintf.c
 create mode 100644 stdio.subproj/sscanf.c
 create mode 100644 stdio.subproj/stdio.c
 create mode 100644 stdio.subproj/tempnam.c
 create mode 100644 stdio.subproj/tmpfile.c
 create mode 100644 stdio.subproj/tmpnam.c
 create mode 100644 stdio.subproj/ungetc.c
 create mode 100644 stdio.subproj/vfprintf.c
 create mode 100644 stdio.subproj/vfscanf.c
 create mode 100644 stdio.subproj/vprintf.c
 create mode 100644 stdio.subproj/vscanf.c
 create mode 100644 stdio.subproj/vsnprintf.c
 create mode 100644 stdio.subproj/vsprintf.c
 create mode 100644 stdio.subproj/vsscanf.c
 create mode 100644 stdio.subproj/wbuf.c
 create mode 100644 stdio.subproj/wsetup.c
 create mode 100644 stdlib.subproj/Makefile
 create mode 100644 stdlib.subproj/Makefile.postamble
 create mode 100644 stdlib.subproj/Makefile.preamble
 create mode 100644 stdlib.subproj/PB.project
 create mode 100644 stdlib.subproj/abort.c
 create mode 100644 stdlib.subproj/atexit.c
 create mode 100644 stdlib.subproj/atexit.h
 create mode 100644 stdlib.subproj/atof.c
 create mode 100644 stdlib.subproj/atoi.c
 create mode 100644 stdlib.subproj/atol.c
 create mode 100644 stdlib.subproj/bsearch.c
 create mode 100644 stdlib.subproj/div.c
 create mode 100644 stdlib.subproj/exit.c
 create mode 100644 stdlib.subproj/getenv.c
 create mode 100644 stdlib.subproj/getopt.c
 create mode 100644 stdlib.subproj/getsubopt.c
 create mode 100644 stdlib.subproj/heapsort.c
 create mode 100644 stdlib.subproj/labs.c
 create mode 100644 stdlib.subproj/ldiv.c
 create mode 100644 stdlib.subproj/merge.c
 create mode 100644 stdlib.subproj/putenv.c
 create mode 100644 stdlib.subproj/qsort.c
 create mode 100644 stdlib.subproj/radixsort.c
 create mode 100644 stdlib.subproj/rand.c
 create mode 100644 stdlib.subproj/random.c
 create mode 100644 stdlib.subproj/setenv.c
 create mode 100644 stdlib.subproj/strtod.c
 create mode 100644 stdlib.subproj/strtol.c
 create mode 100644 stdlib.subproj/strtoq.c
 create mode 100644 stdlib.subproj/strtoul.c
 create mode 100644 stdlib.subproj/strtouq.c
 create mode 100644 stdlib.subproj/system.c
 create mode 100644 string.subproj/Makefile
 create mode 100644 string.subproj/Makefile.postamble
 create mode 100644 string.subproj/Makefile.preamble
 create mode 100644 string.subproj/PB.project
 create mode 100644 string.subproj/index.c
 create mode 100644 string.subproj/memccpy.c
 create mode 100644 string.subproj/memchr.c
 create mode 100644 string.subproj/memcmp.c
 create mode 100644 string.subproj/memset.c
 create mode 100644 string.subproj/rindex.c
 create mode 100644 string.subproj/rindix.c
 create mode 100644 string.subproj/strcasecmp.c
 create mode 100644 string.subproj/strchr.c
 create mode 100644 string.subproj/strcmp.s
 create mode 100644 string.subproj/strcoll.c
 create mode 100644 string.subproj/strcspn.c
 create mode 100644 string.subproj/strdup.c
 create mode 100644 string.subproj/strerror.c
 create mode 100644 string.subproj/strftime.c
 create mode 100644 string.subproj/strmode.c
 create mode 100644 string.subproj/strpbrk.c
 create mode 100644 string.subproj/strsep.c
 create mode 100644 string.subproj/strspn.c
 create mode 100644 string.subproj/strstr.c
 create mode 100644 string.subproj/strtok.c
 create mode 100644 string.subproj/strxfrm.c
 create mode 100644 string.subproj/swab.c
 create mode 100644 sys.subproj/Makefile
 create mode 100644 sys.subproj/Makefile.postamble
 create mode 100644 sys.subproj/Makefile.preamble
 create mode 100644 sys.subproj/PB.project
 create mode 100644 sys.subproj/errno.c
 create mode 100644 sys.subproj/getdtablesize.c
 create mode 100644 sys.subproj/gettimeofday.c
 create mode 100644 sys.subproj/i386.subproj/ATPgetreq.s
 create mode 100644 sys.subproj/i386.subproj/ATPgetrsp.s
 create mode 100644 sys.subproj/i386.subproj/ATPsndreq.s
 create mode 100644 sys.subproj/i386.subproj/ATPsndrsp.s
 create mode 100644 sys.subproj/i386.subproj/ATgetmsg.s
 create mode 100644 sys.subproj/i386.subproj/ATputmsg.s
 create mode 100644 sys.subproj/i386.subproj/ATsocket.s
 create mode 100644 sys.subproj/i386.subproj/Makefile
 create mode 100644 sys.subproj/i386.subproj/Makefile.postamble
 create mode 100644 sys.subproj/i386.subproj/Makefile.preamble
 create mode 100644 sys.subproj/i386.subproj/PB.project
 create mode 100644 sys.subproj/i386.subproj/SYS.h
 create mode 100644 sys.subproj/i386.subproj/_exit.s
 create mode 100644 sys.subproj/i386.subproj/_getlogin.s
 create mode 100644 sys.subproj/i386.subproj/_setjmp.s
 create mode 100644 sys.subproj/i386.subproj/_setlogin.s
 create mode 100644 sys.subproj/i386.subproj/_sysctl.s
 create mode 100644 sys.subproj/i386.subproj/accept.s
 create mode 100644 sys.subproj/i386.subproj/access.s
 create mode 100644 sys.subproj/i386.subproj/acct.s
 create mode 100644 sys.subproj/i386.subproj/add_profil.s
 create mode 100644 sys.subproj/i386.subproj/adjtime.s
 create mode 100644 sys.subproj/i386.subproj/bind.s
 create mode 100644 sys.subproj/i386.subproj/cerror.s
 create mode 100644 sys.subproj/i386.subproj/chdir.s
 create mode 100644 sys.subproj/i386.subproj/checkuseraccess.s
 create mode 100644 sys.subproj/i386.subproj/chflags.s
 create mode 100644 sys.subproj/i386.subproj/chmod.s
 create mode 100644 sys.subproj/i386.subproj/chown.s
 create mode 100644 sys.subproj/i386.subproj/chroot.s
 create mode 100644 sys.subproj/i386.subproj/close.s
 create mode 100644 sys.subproj/i386.subproj/connect.s
 create mode 100644 sys.subproj/i386.subproj/dup.s
 create mode 100644 sys.subproj/i386.subproj/dup2.s
 create mode 100644 sys.subproj/i386.subproj/exchangedata.s
 create mode 100644 sys.subproj/i386.subproj/execve.s
 create mode 100644 sys.subproj/i386.subproj/fchdir.s
 create mode 100644 sys.subproj/i386.subproj/fchflags.s
 create mode 100644 sys.subproj/i386.subproj/fchmod.s
 create mode 100644 sys.subproj/i386.subproj/fchown.s
 create mode 100644 sys.subproj/i386.subproj/fcntl.s
 create mode 100644 sys.subproj/i386.subproj/flock.s
 create mode 100644 sys.subproj/i386.subproj/fork.s
 create mode 100644 sys.subproj/i386.subproj/fpathconf.s
 create mode 100644 sys.subproj/i386.subproj/fstat.s
 create mode 100644 sys.subproj/i386.subproj/fstatfs.s
 create mode 100644 sys.subproj/i386.subproj/fstatv.s
 create mode 100644 sys.subproj/i386.subproj/fsync.s
 create mode 100644 sys.subproj/i386.subproj/ftruncate.s
 create mode 100644 sys.subproj/i386.subproj/getattrlist.s
 create mode 100644 sys.subproj/i386.subproj/getdirentries.s
 create mode 100644 sys.subproj/i386.subproj/getdirentriesattr.s
 create mode 100644 sys.subproj/i386.subproj/getegid.s
 create mode 100644 sys.subproj/i386.subproj/geteuid.s
 create mode 100644 sys.subproj/i386.subproj/getfh.s
 create mode 100644 sys.subproj/i386.subproj/getfsstat.s
 create mode 100644 sys.subproj/i386.subproj/getgid.s
 create mode 100644 sys.subproj/i386.subproj/getgroups.s
 create mode 100644 sys.subproj/i386.subproj/getitimer.s
 create mode 100644 sys.subproj/i386.subproj/getpeername.s
 create mode 100644 sys.subproj/i386.subproj/getpgrp.s
 create mode 100644 sys.subproj/i386.subproj/getpid.s
 create mode 100644 sys.subproj/i386.subproj/getppid.s
 create mode 100644 sys.subproj/i386.subproj/getpriority.s
 create mode 100644 sys.subproj/i386.subproj/getrlimit.s
 create mode 100644 sys.subproj/i386.subproj/getrusage.s
 create mode 100644 sys.subproj/i386.subproj/getsockname.s
 create mode 100644 sys.subproj/i386.subproj/getsockopt.s
 create mode 100644 sys.subproj/i386.subproj/getuid.s
 create mode 100644 sys.subproj/i386.subproj/ioctl.s
 create mode 100644 sys.subproj/i386.subproj/kill.s
 create mode 100644 sys.subproj/i386.subproj/ktrace.s
 create mode 100644 sys.subproj/i386.subproj/lfs_bmapv.s
 create mode 100644 sys.subproj/i386.subproj/lfs_markv.s
 create mode 100644 sys.subproj/i386.subproj/lfs_segclean.s
 create mode 100644 sys.subproj/i386.subproj/lfs_segwait.s
 create mode 100644 sys.subproj/i386.subproj/link.s
 create mode 100644 sys.subproj/i386.subproj/listen.s
 create mode 100644 sys.subproj/i386.subproj/load_shared_file.s
 create mode 100644 sys.subproj/i386.subproj/lseek.s
 create mode 100644 sys.subproj/i386.subproj/lstat.s
 create mode 100644 sys.subproj/i386.subproj/lstatv.s
 create mode 100644 sys.subproj/i386.subproj/madvise.s
 create mode 100644 sys.subproj/i386.subproj/mincore.s
 create mode 100644 sys.subproj/i386.subproj/minherit.s
 create mode 100644 sys.subproj/i386.subproj/mkcomplex.s
 create mode 100644 sys.subproj/i386.subproj/mkdir.s
 create mode 100644 sys.subproj/i386.subproj/mkfifo.s
 create mode 100644 sys.subproj/i386.subproj/mknod.s
 create mode 100644 sys.subproj/i386.subproj/mlock.s
 create mode 100644 sys.subproj/i386.subproj/mlockall.s
 create mode 100644 sys.subproj/i386.subproj/mmap.s
 create mode 100644 sys.subproj/i386.subproj/mount.s
 create mode 100644 sys.subproj/i386.subproj/mprotect.s
 create mode 100644 sys.subproj/i386.subproj/msgctl.s
 create mode 100644 sys.subproj/i386.subproj/msgget.s
 create mode 100644 sys.subproj/i386.subproj/msgrcv.s
 create mode 100644 sys.subproj/i386.subproj/msgsnd.s
 create mode 100644 sys.subproj/i386.subproj/msgsys.s
 create mode 100644 sys.subproj/i386.subproj/msync.s
 create mode 100644 sys.subproj/i386.subproj/munlock.s
 create mode 100644 sys.subproj/i386.subproj/munlockall.s
 create mode 100644 sys.subproj/i386.subproj/munmap.s
 create mode 100644 sys.subproj/i386.subproj/nfssvc.s
 create mode 100644 sys.subproj/i386.subproj/open.s
 create mode 100644 sys.subproj/i386.subproj/pathconf.s
 create mode 100644 sys.subproj/i386.subproj/pipe.s
 create mode 100644 sys.subproj/i386.subproj/profil.s
 create mode 100644 sys.subproj/i386.subproj/ptrace.s
 create mode 100644 sys.subproj/i386.subproj/quota.s
 create mode 100644 sys.subproj/i386.subproj/quotactl.s
 create mode 100644 sys.subproj/i386.subproj/read.s
 create mode 100644 sys.subproj/i386.subproj/readlink.s
 create mode 100644 sys.subproj/i386.subproj/readv.s
 create mode 100644 sys.subproj/i386.subproj/reboot.s
 create mode 100644 sys.subproj/i386.subproj/recvfrom.s
 create mode 100644 sys.subproj/i386.subproj/recvmsg.s
 create mode 100644 sys.subproj/i386.subproj/rename.s
 create mode 100644 sys.subproj/i386.subproj/reset_shared_file.s
 create mode 100644 sys.subproj/i386.subproj/revoke.s
 create mode 100644 sys.subproj/i386.subproj/rmdir.s
 create mode 100644 sys.subproj/i386.subproj/searchfs.s
 create mode 100644 sys.subproj/i386.subproj/select.s
 create mode 100644 sys.subproj/i386.subproj/sem_close.s
 create mode 100644 sys.subproj/i386.subproj/sem_destroy.s
 create mode 100644 sys.subproj/i386.subproj/sem_getvalue.s
 create mode 100644 sys.subproj/i386.subproj/sem_init.s
 create mode 100644 sys.subproj/i386.subproj/sem_open.s
 create mode 100644 sys.subproj/i386.subproj/sem_post.s
 create mode 100644 sys.subproj/i386.subproj/sem_trywait.s
 create mode 100644 sys.subproj/i386.subproj/sem_unlink.s
 create mode 100644 sys.subproj/i386.subproj/sem_wait.s
 create mode 100644 sys.subproj/i386.subproj/semconfig.s
 create mode 100644 sys.subproj/i386.subproj/semctl.s
 create mode 100644 sys.subproj/i386.subproj/semget.s
 create mode 100644 sys.subproj/i386.subproj/semop.s
 create mode 100644 sys.subproj/i386.subproj/semsys.s
 create mode 100644 sys.subproj/i386.subproj/sendmsg.s
 create mode 100644 sys.subproj/i386.subproj/sendto.s
 create mode 100644 sys.subproj/i386.subproj/setattrlist.s
 create mode 100644 sys.subproj/i386.subproj/setegid.s
 create mode 100644 sys.subproj/i386.subproj/seteuid.s
 create mode 100644 sys.subproj/i386.subproj/setgid.s
 create mode 100644 sys.subproj/i386.subproj/setgroups.s
 create mode 100644 sys.subproj/i386.subproj/setitimer.s
 create mode 100644 sys.subproj/i386.subproj/setjmp.s
 create mode 100644 sys.subproj/i386.subproj/setpgid.s
 create mode 100644 sys.subproj/i386.subproj/setpriority.s
 create mode 100644 sys.subproj/i386.subproj/setprivexec.s
 create mode 100644 sys.subproj/i386.subproj/setquota.s
 create mode 100644 sys.subproj/i386.subproj/setrlimit.s
 create mode 100644 sys.subproj/i386.subproj/setsid.s
 create mode 100644 sys.subproj/i386.subproj/setsockopt.s
 create mode 100644 sys.subproj/i386.subproj/settimeofday.s
 create mode 100644 sys.subproj/i386.subproj/setuid.s
 create mode 100644 sys.subproj/i386.subproj/shm_open.s
 create mode 100644 sys.subproj/i386.subproj/shm_unlink.s
 create mode 100644 sys.subproj/i386.subproj/shmat.s
 create mode 100644 sys.subproj/i386.subproj/shmctl.s
 create mode 100644 sys.subproj/i386.subproj/shmdt.s
 create mode 100644 sys.subproj/i386.subproj/shmget.s
 create mode 100644 sys.subproj/i386.subproj/shmsys.s
 create mode 100644 sys.subproj/i386.subproj/shutdown.s
 create mode 100644 sys.subproj/i386.subproj/sigaltstack.s
 create mode 100644 sys.subproj/i386.subproj/sigpending.s
 create mode 100644 sys.subproj/i386.subproj/sigreturn.s
 create mode 100644 sys.subproj/i386.subproj/socket.s
 create mode 100644 sys.subproj/i386.subproj/socketpair.s
 create mode 100644 sys.subproj/i386.subproj/stat.s
 create mode 100644 sys.subproj/i386.subproj/statfs.s
 create mode 100644 sys.subproj/i386.subproj/statv.s
 create mode 100644 sys.subproj/i386.subproj/swapon.s
 create mode 100644 sys.subproj/i386.subproj/symlink.s
 create mode 100644 sys.subproj/i386.subproj/sync.s
 create mode 100644 sys.subproj/i386.subproj/syscall.s
 create mode 100644 sys.subproj/i386.subproj/table.s
 create mode 100644 sys.subproj/i386.subproj/truncate.s
 create mode 100644 sys.subproj/i386.subproj/umask.s
 create mode 100644 sys.subproj/i386.subproj/undelete.s
 create mode 100644 sys.subproj/i386.subproj/unlink.s
 create mode 100644 sys.subproj/i386.subproj/unmount.s
 create mode 100644 sys.subproj/i386.subproj/utimes.s
 create mode 100644 sys.subproj/i386.subproj/vfork.s
 create mode 100644 sys.subproj/i386.subproj/wait4.s
 create mode 100644 sys.subproj/i386.subproj/write.s
 create mode 100644 sys.subproj/i386.subproj/writev.s
 create mode 100644 sys.subproj/msync.2
 create mode 100644 sys.subproj/ppc.subproj/ATPgetreq.s
 create mode 100644 sys.subproj/ppc.subproj/ATPgetrsp.s
 create mode 100644 sys.subproj/ppc.subproj/ATPsndreq.s
 create mode 100644 sys.subproj/ppc.subproj/ATPsndrsp.s
 create mode 100644 sys.subproj/ppc.subproj/ATgetmsg.s
 create mode 100644 sys.subproj/ppc.subproj/ATputmsg.s
 create mode 100644 sys.subproj/ppc.subproj/ATsocket.s
 create mode 100644 sys.subproj/ppc.subproj/Makefile
 create mode 100644 sys.subproj/ppc.subproj/Makefile.postamble
 create mode 100644 sys.subproj/ppc.subproj/Makefile.preamble
 create mode 100644 sys.subproj/ppc.subproj/PB.project
 create mode 100644 sys.subproj/ppc.subproj/SYS.h
 create mode 100644 sys.subproj/ppc.subproj/_exit.s
 create mode 100644 sys.subproj/ppc.subproj/_getlogin.s
 create mode 100644 sys.subproj/ppc.subproj/_longjmp.s
 create mode 100644 sys.subproj/ppc.subproj/_setjmp.h
 create mode 100644 sys.subproj/ppc.subproj/_setjmp.s
 create mode 100644 sys.subproj/ppc.subproj/_setlogin.s
 create mode 100644 sys.subproj/ppc.subproj/_sysctl.s
 create mode 100644 sys.subproj/ppc.subproj/accept.s
 create mode 100644 sys.subproj/ppc.subproj/access.s
 create mode 100644 sys.subproj/ppc.subproj/acct.s
 create mode 100644 sys.subproj/ppc.subproj/add_profil.s
 create mode 100644 sys.subproj/ppc.subproj/adjtime.s
 create mode 100644 sys.subproj/ppc.subproj/assym.h
 create mode 100644 sys.subproj/ppc.subproj/bind.s
 create mode 100644 sys.subproj/ppc.subproj/cerror.s
 create mode 100644 sys.subproj/ppc.subproj/chdir.s
 create mode 100644 sys.subproj/ppc.subproj/checkuseraccess.s
 create mode 100644 sys.subproj/ppc.subproj/chflags.s
 create mode 100644 sys.subproj/ppc.subproj/chmod.s
 create mode 100644 sys.subproj/ppc.subproj/chown.s
 create mode 100644 sys.subproj/ppc.subproj/chroot.s
 create mode 100644 sys.subproj/ppc.subproj/close.s
 create mode 100644 sys.subproj/ppc.subproj/connect.s
 create mode 100644 sys.subproj/ppc.subproj/cthread.s
 create mode 100644 sys.subproj/ppc.subproj/dup.s
 create mode 100644 sys.subproj/ppc.subproj/dup2.s
 create mode 100644 sys.subproj/ppc.subproj/exchangedata.s
 create mode 100644 sys.subproj/ppc.subproj/execve.s
 create mode 100644 sys.subproj/ppc.subproj/fchdir.s
 create mode 100644 sys.subproj/ppc.subproj/fchflags.s
 create mode 100644 sys.subproj/ppc.subproj/fchmod.s
 create mode 100644 sys.subproj/ppc.subproj/fchown.s
 create mode 100644 sys.subproj/ppc.subproj/fcntl.s
 create mode 100644 sys.subproj/ppc.subproj/flock.s
 create mode 100644 sys.subproj/ppc.subproj/fork.s
 create mode 100644 sys.subproj/ppc.subproj/fpathconf.s
 create mode 100644 sys.subproj/ppc.subproj/fstat.s
 create mode 100644 sys.subproj/ppc.subproj/fstatfs.s
 create mode 100644 sys.subproj/ppc.subproj/fstatv.s
 create mode 100644 sys.subproj/ppc.subproj/fsync.s
 create mode 100644 sys.subproj/ppc.subproj/ftruncate.s
 create mode 100644 sys.subproj/ppc.subproj/genassym.h
 create mode 100644 sys.subproj/ppc.subproj/getattrlist.s
 create mode 100644 sys.subproj/ppc.subproj/getdirentries.s
 create mode 100644 sys.subproj/ppc.subproj/getdirentriesattr.s
 create mode 100644 sys.subproj/ppc.subproj/getegid.s
 create mode 100644 sys.subproj/ppc.subproj/geteuid.s
 create mode 100644 sys.subproj/ppc.subproj/getfh.s
 create mode 100644 sys.subproj/ppc.subproj/getfsstat.s
 create mode 100644 sys.subproj/ppc.subproj/getgid.s
 create mode 100644 sys.subproj/ppc.subproj/getgroups.s
 create mode 100644 sys.subproj/ppc.subproj/getitimer.s
 create mode 100644 sys.subproj/ppc.subproj/getpeername.s
 create mode 100644 sys.subproj/ppc.subproj/getpgrp.s
 create mode 100644 sys.subproj/ppc.subproj/getpid.s
 create mode 100644 sys.subproj/ppc.subproj/getppid.s
 create mode 100644 sys.subproj/ppc.subproj/getpriority.s
 create mode 100644 sys.subproj/ppc.subproj/getrlimit.s
 create mode 100644 sys.subproj/ppc.subproj/getrusage.s
 create mode 100644 sys.subproj/ppc.subproj/getsockname.s
 create mode 100644 sys.subproj/ppc.subproj/getsockopt.s
 create mode 100644 sys.subproj/ppc.subproj/getuid.s
 create mode 100644 sys.subproj/ppc.subproj/ioctl.s
 create mode 100644 sys.subproj/ppc.subproj/kill.s
 create mode 100644 sys.subproj/ppc.subproj/ktrace.s
 create mode 100644 sys.subproj/ppc.subproj/lfs_bmapv.s
 create mode 100644 sys.subproj/ppc.subproj/lfs_markv.s
 create mode 100644 sys.subproj/ppc.subproj/lfs_segclean.s
 create mode 100644 sys.subproj/ppc.subproj/lfs_segwait.s
 create mode 100644 sys.subproj/ppc.subproj/link.s
 create mode 100644 sys.subproj/ppc.subproj/listen.s
 create mode 100644 sys.subproj/ppc.subproj/load_shared_file.s
 create mode 100644 sys.subproj/ppc.subproj/longjmp.s
 create mode 100644 sys.subproj/ppc.subproj/lseek.s
 create mode 100644 sys.subproj/ppc.subproj/lstat.s
 create mode 100644 sys.subproj/ppc.subproj/lstatv.s
 create mode 100644 sys.subproj/ppc.subproj/madvise.s
 create mode 100644 sys.subproj/ppc.subproj/mincore.s
 create mode 100644 sys.subproj/ppc.subproj/minherit.s
 create mode 100644 sys.subproj/ppc.subproj/mkcomplex.s
 create mode 100644 sys.subproj/ppc.subproj/mkdir.s
 create mode 100644 sys.subproj/ppc.subproj/mkfifo.s
 create mode 100644 sys.subproj/ppc.subproj/mknod.s
 create mode 100644 sys.subproj/ppc.subproj/mlock.s
 create mode 100644 sys.subproj/ppc.subproj/mlockall.s
 create mode 100644 sys.subproj/ppc.subproj/mmap.s
 create mode 100644 sys.subproj/ppc.subproj/mount.s
 create mode 100644 sys.subproj/ppc.subproj/mprotect.s
 create mode 100644 sys.subproj/ppc.subproj/msgctl.s
 create mode 100644 sys.subproj/ppc.subproj/msgget.s
 create mode 100644 sys.subproj/ppc.subproj/msgrcv.s
 create mode 100644 sys.subproj/ppc.subproj/msgsnd.s
 create mode 100644 sys.subproj/ppc.subproj/msgsys.s
 create mode 100644 sys.subproj/ppc.subproj/msync.s
 create mode 100644 sys.subproj/ppc.subproj/munlock.s
 create mode 100644 sys.subproj/ppc.subproj/munlockall.s
 create mode 100644 sys.subproj/ppc.subproj/munmap.s
 create mode 100644 sys.subproj/ppc.subproj/nfssvc.s
 create mode 100644 sys.subproj/ppc.subproj/open.s
 create mode 100644 sys.subproj/ppc.subproj/pathconf.s
 create mode 100644 sys.subproj/ppc.subproj/pipe.s
 create mode 100644 sys.subproj/ppc.subproj/processor_facilities.h
 create mode 100644 sys.subproj/ppc.subproj/processor_facilities.s
 create mode 100644 sys.subproj/ppc.subproj/profil.s
 create mode 100644 sys.subproj/ppc.subproj/ptrace.s
 create mode 100644 sys.subproj/ppc.subproj/quota.s
 create mode 100644 sys.subproj/ppc.subproj/quotactl.s
 create mode 100644 sys.subproj/ppc.subproj/read.s
 create mode 100644 sys.subproj/ppc.subproj/readlink.s
 create mode 100644 sys.subproj/ppc.subproj/readv.s
 create mode 100644 sys.subproj/ppc.subproj/reboot.s
 create mode 100644 sys.subproj/ppc.subproj/recvfrom.s
 create mode 100644 sys.subproj/ppc.subproj/recvmsg.s
 create mode 100644 sys.subproj/ppc.subproj/rename.s
 create mode 100644 sys.subproj/ppc.subproj/reset_shared_file.s
 create mode 100644 sys.subproj/ppc.subproj/revoke.s
 create mode 100644 sys.subproj/ppc.subproj/rmdir.s
 create mode 100644 sys.subproj/ppc.subproj/searchfs.s
 create mode 100644 sys.subproj/ppc.subproj/select.s
 create mode 100644 sys.subproj/ppc.subproj/sem_close.s
 create mode 100644 sys.subproj/ppc.subproj/sem_destroy.s
 create mode 100644 sys.subproj/ppc.subproj/sem_getvalue.s
 create mode 100644 sys.subproj/ppc.subproj/sem_init.s
 create mode 100644 sys.subproj/ppc.subproj/sem_open.s
 create mode 100644 sys.subproj/ppc.subproj/sem_post.s
 create mode 100644 sys.subproj/ppc.subproj/sem_trywait.s
 create mode 100644 sys.subproj/ppc.subproj/sem_unlink.s
 create mode 100644 sys.subproj/ppc.subproj/sem_wait.s
 create mode 100644 sys.subproj/ppc.subproj/semconfig.s
 create mode 100644 sys.subproj/ppc.subproj/semctl.s
 create mode 100644 sys.subproj/ppc.subproj/semget.s
 create mode 100644 sys.subproj/ppc.subproj/semop.s
 create mode 100644 sys.subproj/ppc.subproj/semsys.s
 create mode 100644 sys.subproj/ppc.subproj/sendmsg.s
 create mode 100644 sys.subproj/ppc.subproj/sendto.s
 create mode 100644 sys.subproj/ppc.subproj/setattrlist.s
 create mode 100644 sys.subproj/ppc.subproj/setegid.s
 create mode 100644 sys.subproj/ppc.subproj/seteuid.s
 create mode 100644 sys.subproj/ppc.subproj/setgid.s
 create mode 100644 sys.subproj/ppc.subproj/setgroups.s
 create mode 100644 sys.subproj/ppc.subproj/setitimer.s
 create mode 100644 sys.subproj/ppc.subproj/setjmp.s
 create mode 100644 sys.subproj/ppc.subproj/setpgid.s
 create mode 100644 sys.subproj/ppc.subproj/setpriority.s
 create mode 100644 sys.subproj/ppc.subproj/setprivexec.s
 create mode 100644 sys.subproj/ppc.subproj/setquota.s
 create mode 100644 sys.subproj/ppc.subproj/setrlimit.s
 create mode 100644 sys.subproj/ppc.subproj/setsid.s
 create mode 100644 sys.subproj/ppc.subproj/setsockopt.s
 create mode 100644 sys.subproj/ppc.subproj/settimeofday.s
 create mode 100644 sys.subproj/ppc.subproj/setuid.s
 create mode 100644 sys.subproj/ppc.subproj/shm_open.s
 create mode 100644 sys.subproj/ppc.subproj/shm_unlink.s
 create mode 100644 sys.subproj/ppc.subproj/shmat.s
 create mode 100644 sys.subproj/ppc.subproj/shmctl.s
 create mode 100644 sys.subproj/ppc.subproj/shmdt.s
 create mode 100644 sys.subproj/ppc.subproj/shmget.s
 create mode 100644 sys.subproj/ppc.subproj/shmsys.s
 create mode 100644 sys.subproj/ppc.subproj/shutdown.s
 create mode 100644 sys.subproj/ppc.subproj/sigaltstack.s
 create mode 100644 sys.subproj/ppc.subproj/sigpending.s
 create mode 100644 sys.subproj/ppc.subproj/sigreturn.s
 create mode 100644 sys.subproj/ppc.subproj/socket.s
 create mode 100644 sys.subproj/ppc.subproj/socketpair.s
 create mode 100644 sys.subproj/ppc.subproj/stat.s
 create mode 100644 sys.subproj/ppc.subproj/statfs.s
 create mode 100644 sys.subproj/ppc.subproj/statv.s
 create mode 100644 sys.subproj/ppc.subproj/swapon.s
 create mode 100644 sys.subproj/ppc.subproj/symlink.s
 create mode 100644 sys.subproj/ppc.subproj/sync.s
 create mode 100644 sys.subproj/ppc.subproj/syscall.s
 create mode 100644 sys.subproj/ppc.subproj/table.s
 create mode 100644 sys.subproj/ppc.subproj/truncate.s
 create mode 100644 sys.subproj/ppc.subproj/umask.s
 create mode 100644 sys.subproj/ppc.subproj/undelete.s
 create mode 100644 sys.subproj/ppc.subproj/unlink.s
 create mode 100644 sys.subproj/ppc.subproj/unmount.s
 create mode 100644 sys.subproj/ppc.subproj/ur_cthread.s
 create mode 100644 sys.subproj/ppc.subproj/utimes.s
 create mode 100644 sys.subproj/ppc.subproj/vfork.s
 create mode 100644 sys.subproj/ppc.subproj/wait4.s
 create mode 100644 sys.subproj/ppc.subproj/write.s
 create mode 100644 sys.subproj/ppc.subproj/writev.s
 create mode 100644 sys.subproj/sem_close.2
 create mode 100644 sys.subproj/sem_open.2
 create mode 100644 sys.subproj/sem_post.2
 create mode 100644 sys.subproj/sem_trywait.2
 create mode 100644 sys.subproj/sem_unlink.2
 create mode 100644 sys.subproj/sem_wait.2
 create mode 100644 sys.subproj/shm_open.2
 create mode 100644 sys.subproj/shm_unlink.2
 create mode 100644 sys.subproj/sigaction.c
 create mode 100644 sys.subproj/sigcatch.c
 create mode 100644 sys.subproj/sigcatch.h
 create mode 100644 sys.subproj/sigprocmask.c
 create mode 100644 sys.subproj/sigsuspend.c
 create mode 100644 sys.subproj/sigtramp.c
 create mode 100644 threads.subproj/Makefile
 create mode 100644 threads.subproj/Makefile.postamble
 create mode 100644 threads.subproj/Makefile.preamble
 create mode 100644 threads.subproj/PB.project
 create mode 100644 threads.subproj/cprocs.c
 create mode 100644 threads.subproj/cthread_internals.h
 create mode 100644 threads.subproj/cthreads.c
 create mode 100644 threads.subproj/cthreads.h
 create mode 100644 threads.subproj/i386.subproj/Makefile
 create mode 100644 threads.subproj/i386.subproj/Makefile.postamble
 create mode 100644 threads.subproj/i386.subproj/Makefile.preamble
 create mode 100644 threads.subproj/i386.subproj/PB.project
 create mode 100644 threads.subproj/i386.subproj/thread.c
 create mode 100644 threads.subproj/lu_utils.c
 create mode 100644 threads.subproj/mig_support.c
 create mode 100644 threads.subproj/ppc.subproj/Makefile
 create mode 100644 threads.subproj/ppc.subproj/Makefile.postamble
 create mode 100644 threads.subproj/ppc.subproj/Makefile.preamble
 create mode 100644 threads.subproj/ppc.subproj/PB.project
 create mode 100644 threads.subproj/threads_data.c
 create mode 100644 util.subproj/Makefile
 create mode 100644 util.subproj/Makefile.postamble
 create mode 100644 util.subproj/Makefile.preamble
 create mode 100644 util.subproj/PB.project
 create mode 100644 util.subproj/login.c
 create mode 100644 util.subproj/login_tty.c
 create mode 100644 util.subproj/logout.c
 create mode 100644 util.subproj/logwtmp.c
 create mode 100644 util.subproj/pty.c

diff --git a/Makefile b/Makefile
new file mode 100644
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
index 0000000..e702b54
--- /dev/null
+++ b/Makefile.postamble
@@ -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
index 0000000..438e0bb
--- /dev/null
+++ b/Makefile.preamble
@@ -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
index 0000000..ef095b6
--- /dev/null
+++ b/PB.project
@@ -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
index 0000000..5e7d581
--- /dev/null
+++ b/compat43.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/compat43.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/compat43.subproj/Makefile.preamble
@@ -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
index 0000000..846afeb
--- /dev/null
+++ b/compat43.subproj/PB.project
@@ -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
index 0000000..03a1b34
--- /dev/null
+++ b/compat43.subproj/creat.c
@@ -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
index 0000000..cb5c5f4
--- /dev/null
+++ b/compat43.subproj/gethostid.c
@@ -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
index 0000000..9369837
--- /dev/null
+++ b/compat43.subproj/getwd.c
@@ -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
index 0000000..b57e9f8
--- /dev/null
+++ b/compat43.subproj/killpg.c
@@ -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
index 0000000..410dee5
--- /dev/null
+++ b/compat43.subproj/send.c
@@ -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
index 0000000..841607a
--- /dev/null
+++ b/compat43.subproj/sethostid.c
@@ -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
index 0000000..197340b
--- /dev/null
+++ b/compat43.subproj/setpgrp.c
@@ -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
index 0000000..7a01282
--- /dev/null
+++ b/compat43.subproj/setregid.c
@@ -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
index 0000000..db0d515
--- /dev/null
+++ b/compat43.subproj/setreuid.c
@@ -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
index 0000000..a6dee28
--- /dev/null
+++ b/compat43.subproj/setrgid.c
@@ -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
index 0000000..70775bf
--- /dev/null
+++ b/compat43.subproj/setruid.c
@@ -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
index 0000000..827075b
--- /dev/null
+++ b/compat43.subproj/sigcompat.c
@@ -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
index 0000000..04ec529
--- /dev/null
+++ b/crt_externs.c
@@ -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
index 0000000..7ce1eb5
--- /dev/null
+++ b/db.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/db.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/db.subproj/Makefile.preamble
@@ -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
index 0000000..3a69a6c
--- /dev/null
+++ b/db.subproj/PB.project
@@ -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
index 0000000..c185508
--- /dev/null
+++ b/db.subproj/btree.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/db.subproj/btree.subproj/Makefile.postamble
@@ -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
index 0000000..c9fa330
--- /dev/null
+++ b/db.subproj/btree.subproj/Makefile.preamble
@@ -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
index 0000000..8de9a71
--- /dev/null
+++ b/db.subproj/btree.subproj/PB.project
@@ -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
index 0000000..9cbbf8a
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_close.c
@@ -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
index 0000000..41d9530
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_conv.c
@@ -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
index 0000000..e64187c
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_debug.c
@@ -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
index 0000000..90f049d
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_delete.c
@@ -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
index 0000000..9a3839b
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_extern.h
@@ -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
index 0000000..e62c7ac
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_get.c
@@ -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
index 0000000..0eb86d3
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_open.c
@@ -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
index 0000000..dc73942
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_overflow.c
@@ -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
index 0000000..c9c1b44
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_page.c
@@ -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
index 0000000..403d16b
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_put.c
@@ -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
index 0000000..aa1151a
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_search.c
@@ -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
index 0000000..fcbfd2c
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_seq.c
@@ -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
index 0000000..d11c37f
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_split.c
@@ -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
index 0000000..528299b
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_stack.c
@@ -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
index 0000000..17093b8
--- /dev/null
+++ b/db.subproj/btree.subproj/bt_utils.c
@@ -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
index 0000000..aa62d01
--- /dev/null
+++ b/db.subproj/btree.subproj/btree.h
@@ -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
index 0000000..b3f08b6
--- /dev/null
+++ b/db.subproj/db.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/db.subproj/db.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/db.subproj/db.subproj/Makefile.preamble
@@ -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
index 0000000..b93a5d0
--- /dev/null
+++ b/db.subproj/db.subproj/PB.project
@@ -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
index 0000000..086e14d
--- /dev/null
+++ b/db.subproj/db.subproj/db.c
@@ -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
index 0000000..f27af80
--- /dev/null
+++ b/db.subproj/hash.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/db.subproj/hash.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/db.subproj/hash.subproj/Makefile.preamble
@@ -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
index 0000000..6cfb553
--- /dev/null
+++ b/db.subproj/hash.subproj/PB.project
@@ -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
index 0000000..cf678d2
--- /dev/null
+++ b/db.subproj/hash.subproj/extern.h
@@ -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
index 0000000..40b4761
--- /dev/null
+++ b/db.subproj/hash.subproj/hash.c
@@ -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
index 0000000..2140387
--- /dev/null
+++ b/db.subproj/hash.subproj/hash.h
@@ -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
index 0000000..8c8f467
--- /dev/null
+++ b/db.subproj/hash.subproj/hash_bigkey.c
@@ -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
index 0000000..9d89a8b
--- /dev/null
+++ b/db.subproj/hash.subproj/hash_buf.c
@@ -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
index 0000000..d33b481
--- /dev/null
+++ b/db.subproj/hash.subproj/hash_func.c
@@ -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
index 0000000..0f7f002
--- /dev/null
+++ b/db.subproj/hash.subproj/hash_log2.c
@@ -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
index 0000000..aa7b36f
--- /dev/null
+++ b/db.subproj/hash.subproj/hash_page.c
@@ -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
index 0000000..83ed150
--- /dev/null
+++ b/db.subproj/hash.subproj/hsearch.c
@@ -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
index 0000000..ca7125b
--- /dev/null
+++ b/db.subproj/hash.subproj/ndbm.c
@@ -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
index 0000000..a74c50b
--- /dev/null
+++ b/db.subproj/hash.subproj/page.h
@@ -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
index 0000000..3196b8f
--- /dev/null
+++ b/db.subproj/hash.subproj/search.h
@@ -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
index 0000000..a127134
--- /dev/null
+++ b/db.subproj/mpool.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/db.subproj/mpool.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/db.subproj/mpool.subproj/Makefile.preamble
@@ -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
index 0000000..06d52a0
--- /dev/null
+++ b/db.subproj/mpool.subproj/PB.project
@@ -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
index 0000000..d3e9e2e
--- /dev/null
+++ b/db.subproj/mpool.subproj/mpool.c
@@ -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
index 0000000..56520b7
--- /dev/null
+++ b/db.subproj/recno.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/db.subproj/recno.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/db.subproj/recno.subproj/Makefile.preamble
@@ -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
index 0000000..3a7b202
--- /dev/null
+++ b/db.subproj/recno.subproj/PB.project
@@ -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
index 0000000..d903770
--- /dev/null
+++ b/db.subproj/recno.subproj/extern.h
@@ -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
index 0000000..7c57f5f
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_close.c
@@ -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
index 0000000..126cd7f
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_delete.c
@@ -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
index 0000000..a14bfc2
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_get.c
@@ -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
index 0000000..4f8743e
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_open.c
@@ -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
index 0000000..45029a6
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_put.c
@@ -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
index 0000000..9cf4341
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_search.c
@@ -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
index 0000000..693d447
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_seq.c
@@ -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
index 0000000..8f7c475
--- /dev/null
+++ b/db.subproj/recno.subproj/rec_utils.c
@@ -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
index 0000000..39b076d
--- /dev/null
+++ b/db.subproj/recno.subproj/recno.h
@@ -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
index 0000000..0148fde
--- /dev/null
+++ b/gen.subproj/Makefile
@@ -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
index 0000000..b0473f2
--- /dev/null
+++ b/gen.subproj/Makefile.postamble
@@ -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
index 0000000..3be9dcf
--- /dev/null
+++ b/gen.subproj/Makefile.preamble
@@ -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
index 0000000..1e37408
--- /dev/null
+++ b/gen.subproj/NSSystemDirectories.c
@@ -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
index 0000000..5401699
--- /dev/null
+++ b/gen.subproj/PB.project
@@ -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
index 0000000..1b66b07
--- /dev/null
+++ b/gen.subproj/alarm.c
@@ -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
index 0000000..2ce97a7
--- /dev/null
+++ b/gen.subproj/assert.c
@@ -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
index 0000000..47367f3
--- /dev/null
+++ b/gen.subproj/clock.c
@@ -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
index 0000000..858f4fc
--- /dev/null
+++ b/gen.subproj/closedir.c
@@ -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
index 0000000..9c380aa
--- /dev/null
+++ b/gen.subproj/confstr.c
@@ -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
index 0000000..5e2caec
--- /dev/null
+++ b/gen.subproj/crypt.c
@@ -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
index 0000000..507c9cf
--- /dev/null
+++ b/gen.subproj/ctermid.c
@@ -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
index 0000000..d8b0656
--- /dev/null
+++ b/gen.subproj/ctime.c
@@ -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
index 0000000..7c638ce
--- /dev/null
+++ b/gen.subproj/daemon.c
@@ -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
index 0000000..3a03f5a
--- /dev/null
+++ b/gen.subproj/devname.c
@@ -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
index 0000000..015b223
--- /dev/null
+++ b/gen.subproj/difftime.c
@@ -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
index 0000000..e828970
--- /dev/null
+++ b/gen.subproj/disklabel.c
@@ -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
index 0000000..a355d99
--- /dev/null
+++ b/gen.subproj/err.c
@@ -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
index 0000000..1a022c9
--- /dev/null
+++ b/gen.subproj/errlst.c
@@ -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
index 0000000..1f6e2d7
--- /dev/null
+++ b/gen.subproj/exec.c
@@ -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
index 0000000..93bb361
--- /dev/null
+++ b/gen.subproj/fnmatch.c
@@ -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
index 0000000..ceed639
--- /dev/null
+++ b/gen.subproj/ftok.3
@@ -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
index 0000000..fc70f62
--- /dev/null
+++ b/gen.subproj/ftok.c
@@ -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
index 0000000..75576d7
--- /dev/null
+++ b/gen.subproj/fts.c
@@ -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
index 0000000..8d64465
--- /dev/null
+++ b/gen.subproj/getbsize.c
@@ -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
index 0000000..8ce326b
--- /dev/null
+++ b/gen.subproj/getcap.c
@@ -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
index 0000000..0c71e79
--- /dev/null
+++ b/gen.subproj/getcwd.c
@@ -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
index 0000000..50ce9b5
--- /dev/null
+++ b/gen.subproj/gethostname.c
@@ -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
index 0000000..e65fdff
--- /dev/null
+++ b/gen.subproj/getloadavg.c
@@ -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
index 0000000..02563a6
--- /dev/null
+++ b/gen.subproj/getlogin.c
@@ -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
index 0000000..9284aa7
--- /dev/null
+++ b/gen.subproj/getmntinfo.c
@@ -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
index 0000000..c10d072
--- /dev/null
+++ b/gen.subproj/getpagesize.c
@@ -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
index 0000000..a09ca80
--- /dev/null
+++ b/gen.subproj/getpass.c
@@ -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
index 0000000..f033908
--- /dev/null
+++ b/gen.subproj/getttyent.c
@@ -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
index 0000000..5a5f09a
--- /dev/null
+++ b/gen.subproj/getusershell.c
@@ -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
index 0000000..2e1af68
--- /dev/null
+++ b/gen.subproj/getvfsbyname.c
@@ -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
index 0000000..8872c02
--- /dev/null
+++ b/gen.subproj/gmon.c
@@ -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
index 0000000..5aea859
--- /dev/null
+++ b/gen.subproj/i386.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/gen.subproj/i386.subproj/Makefile.postamble
@@ -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
index 0000000..6544e5f
--- /dev/null
+++ b/gen.subproj/i386.subproj/Makefile.preamble
@@ -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
index 0000000..6bad7ee
--- /dev/null
+++ b/gen.subproj/i386.subproj/PB.project
@@ -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
index 0000000..4d6c1bb
--- /dev/null
+++ b/gen.subproj/i386.subproj/abs.c
@@ -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
index 0000000..ae8f18f
--- /dev/null
+++ b/gen.subproj/i386.subproj/bcmp.c
@@ -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
index 0000000..6bfae93
--- /dev/null
+++ b/gen.subproj/i386.subproj/bcopy.c
@@ -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
index 0000000..b0c8884
--- /dev/null
+++ b/gen.subproj/i386.subproj/bzero.c
@@ -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
index 0000000..70b7c25
--- /dev/null
+++ b/gen.subproj/i386.subproj/ecvt.c
@@ -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
index 0000000..6205d2b
--- /dev/null
+++ b/gen.subproj/i386.subproj/ffs.c
@@ -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
index 0000000..17f0b48
--- /dev/null
+++ b/gen.subproj/i386.subproj/insque.c
@@ -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
index 0000000..838b17b
--- /dev/null
+++ b/gen.subproj/i386.subproj/isinf.c
@@ -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
index 0000000..82af032
--- /dev/null
+++ b/gen.subproj/i386.subproj/mcount.s
@@ -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
index 0000000..6b5774f
--- /dev/null
+++ b/gen.subproj/i386.subproj/memcpy.c
@@ -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
index 0000000..c907093
--- /dev/null
+++ b/gen.subproj/i386.subproj/memmove.c
@@ -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
index 0000000..9e032c5
--- /dev/null
+++ b/gen.subproj/i386.subproj/remque.c
@@ -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
index 0000000..ab963b5
--- /dev/null
+++ b/gen.subproj/i386.subproj/setjmperr.c
@@ -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
index 0000000..32cefc0
--- /dev/null
+++ b/gen.subproj/i386.subproj/strcat.c
@@ -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
index 0000000..77ecaf3
--- /dev/null
+++ b/gen.subproj/i386.subproj/strcpy.c
@@ -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
index 0000000..b57e6e7
--- /dev/null
+++ b/gen.subproj/i386.subproj/strlen.c
@@ -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
index 0000000..a73aabe
--- /dev/null
+++ b/gen.subproj/i386.subproj/strncat.c
@@ -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
index 0000000..0dc3d06
--- /dev/null
+++ b/gen.subproj/i386.subproj/strncmp.c
@@ -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
index 0000000..c47add3
--- /dev/null
+++ b/gen.subproj/i386.subproj/strncpy.c
@@ -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
index 0000000..5170369
--- /dev/null
+++ b/gen.subproj/isatty.c
@@ -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
index 0000000..bce7a53
--- /dev/null
+++ b/gen.subproj/isnan.c
@@ -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
index 0000000..5393b99
--- /dev/null
+++ b/gen.subproj/malloc.c
@@ -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
index 0000000..219f605
--- /dev/null
+++ b/gen.subproj/malloc.h
@@ -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
index 0000000..84dec2f
--- /dev/null
+++ b/gen.subproj/nanosleep.c
@@ -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
index 0000000..8b99cd2
--- /dev/null
+++ b/gen.subproj/nice.c
@@ -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
index 0000000..e6fca65
--- /dev/null
+++ b/gen.subproj/nlist.c
@@ -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
index 0000000..1426f1d
--- /dev/null
+++ b/gen.subproj/opendir.c
@@ -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
index 0000000..fea8bc1
--- /dev/null
+++ b/gen.subproj/pause.c
@@ -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
index 0000000..7729280
--- /dev/null
+++ b/gen.subproj/popen.c
@@ -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
index 0000000..2a0ec70
--- /dev/null
+++ b/gen.subproj/ppc.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/gen.subproj/ppc.subproj/Makefile.postamble
@@ -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
index 0000000..7211b2b
--- /dev/null
+++ b/gen.subproj/ppc.subproj/Makefile.preamble
@@ -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
index 0000000..d1d8013
--- /dev/null
+++ b/gen.subproj/ppc.subproj/PB.project
@@ -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
index 0000000..3d7ae3c
--- /dev/null
+++ b/gen.subproj/ppc.subproj/abs.s
@@ -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
index 0000000..b9fdb04
--- /dev/null
+++ b/gen.subproj/ppc.subproj/bcmp.c
@@ -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
index 0000000..38ffd42
--- /dev/null
+++ b/gen.subproj/ppc.subproj/bcopy.s
@@ -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
index 0000000..f320437
--- /dev/null
+++ b/gen.subproj/ppc.subproj/bzero.s
@@ -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
index 0000000..1146030
--- /dev/null
+++ b/gen.subproj/ppc.subproj/ecvt.c
@@ -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
index 0000000..bb4963a
--- /dev/null
+++ b/gen.subproj/ppc.subproj/ffs.s
@@ -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
index 0000000..0934658
--- /dev/null
+++ b/gen.subproj/ppc.subproj/fp.h
@@ -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
index 0000000..729dfa9
--- /dev/null
+++ b/gen.subproj/ppc.subproj/genassym.h
@@ -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
index 0000000..17f0b48
--- /dev/null
+++ b/gen.subproj/ppc.subproj/insque.c
@@ -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
index 0000000..b98587d
--- /dev/null
+++ b/gen.subproj/ppc.subproj/isinf.c
@@ -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
index 0000000..2c73e3d
--- /dev/null
+++ b/gen.subproj/ppc.subproj/mcount.s
@@ -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
index 0000000..0c371f6
--- /dev/null
+++ b/gen.subproj/ppc.subproj/memcpy.s
@@ -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
index 0000000..d517786
--- /dev/null
+++ b/gen.subproj/ppc.subproj/memmove.s
@@ -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
index 0000000..9e032c5
--- /dev/null
+++ b/gen.subproj/ppc.subproj/remque.c
@@ -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
index 0000000..3df3b7d
--- /dev/null
+++ b/gen.subproj/ppc.subproj/setjmperr.c
@@ -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
index 0000000..ef5c208
--- /dev/null
+++ b/gen.subproj/ppc.subproj/strcat.c
@@ -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
index 0000000..a4c78b4
--- /dev/null
+++ b/gen.subproj/ppc.subproj/strcpy.c
@@ -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
index 0000000..baa1216
--- /dev/null
+++ b/gen.subproj/ppc.subproj/strlen.s
@@ -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
index 0000000..9f9ef54
--- /dev/null
+++ b/gen.subproj/ppc.subproj/strncat.c
@@ -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
index 0000000..bd54d2d
--- /dev/null
+++ b/gen.subproj/ppc.subproj/strncmp.c
@@ -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
index 0000000..1fd6e26
--- /dev/null
+++ b/gen.subproj/ppc.subproj/strncpy.c
@@ -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
index 0000000..3d8a0b8
--- /dev/null
+++ b/gen.subproj/psignal.c
@@ -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
index 0000000..533615e
--- /dev/null
+++ b/gen.subproj/raise.c
@@ -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
index 0000000..fd86c9e
--- /dev/null
+++ b/gen.subproj/readdir.c
@@ -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
index 0000000..0829a23
--- /dev/null
+++ b/gen.subproj/rewinddir.c
@@ -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
index 0000000..cbf6ab8
--- /dev/null
+++ b/gen.subproj/scalable_malloc.c
@@ -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
index 0000000..8891c3d
--- /dev/null
+++ b/gen.subproj/scalable_malloc.h
@@ -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
index 0000000..d963bbd
--- /dev/null
+++ b/gen.subproj/scandir.c
@@ -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
index 0000000..b005ed2
--- /dev/null
+++ b/gen.subproj/seekdir.c
@@ -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
index 0000000..7947676
--- /dev/null
+++ b/gen.subproj/sethostname.c
@@ -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
index 0000000..5c6b5a3
--- /dev/null
+++ b/gen.subproj/setlogin.c
@@ -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
index 0000000..dc2cc3a
--- /dev/null
+++ b/gen.subproj/setmode.c
@@ -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
index 0000000..591f73c
--- /dev/null
+++ b/gen.subproj/siginterrupt.c
@@ -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
index 0000000..5c700fe
--- /dev/null
+++ b/gen.subproj/siglist.c
@@ -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
index 0000000..e936bd9
--- /dev/null
+++ b/gen.subproj/signal.c
@@ -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
index 0000000..9588381
--- /dev/null
+++ b/gen.subproj/sigsetops.c
@@ -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
index 0000000..e47b89e
--- /dev/null
+++ b/gen.subproj/sleep.c
@@ -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
index 0000000..a8e7a4d
--- /dev/null
+++ b/gen.subproj/stack_logging.c
@@ -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
index 0000000..32ede79
--- /dev/null
+++ b/gen.subproj/stack_logging.h
@@ -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
index 0000000..32cf64c
--- /dev/null
+++ b/gen.subproj/sysconf.c
@@ -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
index 0000000..0ba7784
--- /dev/null
+++ b/gen.subproj/sysctl.c
@@ -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
index 0000000..27e3ca9
--- /dev/null
+++ b/gen.subproj/sysctlbyname.c
@@ -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
index 0000000..cd3985f
--- /dev/null
+++ b/gen.subproj/syslog.c
@@ -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
index 0000000..19d655e
--- /dev/null
+++ b/gen.subproj/telldir.c
@@ -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
index 0000000..d4af066
--- /dev/null
+++ b/gen.subproj/termios.c
@@ -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
index 0000000..dcfd0b2
--- /dev/null
+++ b/gen.subproj/time.c
@@ -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
index 0000000..4b7c4e8
--- /dev/null
+++ b/gen.subproj/times.c
@@ -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
index 0000000..c175032
--- /dev/null
+++ b/gen.subproj/timezone.c
@@ -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
index 0000000..a07b134
--- /dev/null
+++ b/gen.subproj/ttyname.c
@@ -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
index 0000000..bb3cfb5
--- /dev/null
+++ b/gen.subproj/ttyslot.c
@@ -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
index 0000000..d057766
--- /dev/null
+++ b/gen.subproj/ualarm.c
@@ -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
index 0000000..f3d8ed7
--- /dev/null
+++ b/gen.subproj/uname.c
@@ -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
index 0000000..0272875
--- /dev/null
+++ b/gen.subproj/unvis.c
@@ -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
index 0000000..96e7432
--- /dev/null
+++ b/gen.subproj/usleep.c
@@ -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
index 0000000..cdddca7
--- /dev/null
+++ b/gen.subproj/utime.c
@@ -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
index 0000000..4b6924e
--- /dev/null
+++ b/gen.subproj/vis.c
@@ -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
index 0000000..216853a
--- /dev/null
+++ b/gen.subproj/wait.c
@@ -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
index 0000000..e516385
--- /dev/null
+++ b/gen.subproj/wait3.c
@@ -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
index 0000000..f60a2f1
--- /dev/null
+++ b/gen.subproj/waitpid.c
@@ -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
index 0000000..0f4610f
--- /dev/null
+++ b/gen.subproj/zone.c
@@ -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
index 0000000..94dd796
--- /dev/null
+++ b/gen.subproj/zone.h
@@ -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
index 0000000..4c2346e
--- /dev/null
+++ b/headers.subproj/Makefile
@@ -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
index 0000000..df76c31
--- /dev/null
+++ b/headers.subproj/Makefile.postamble
@@ -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
index 0000000..1a55329
--- /dev/null
+++ b/headers.subproj/Makefile.preamble
@@ -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
index 0000000..75782d6
--- /dev/null
+++ b/headers.subproj/NSSystemDirectories.h
@@ -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
index 0000000..c329ba0
--- /dev/null
+++ b/headers.subproj/PB.project
@@ -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
index 0000000..d21a6b5
--- /dev/null
+++ b/headers.subproj/asm.h
@@ -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
index 0000000..9434878
--- /dev/null
+++ b/headers.subproj/crt_externs.h
@@ -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
index 0000000..9125b3c
--- /dev/null
+++ b/headers.subproj/libc.h
@@ -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
index 0000000..d9c14f3
--- /dev/null
+++ b/headers.subproj/monitor.h
@@ -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
index 0000000..934b381
--- /dev/null
+++ b/headers.subproj/standards.h
@@ -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
index 0000000..e1ea59d
--- /dev/null
+++ b/internat.subproj/Makefile
@@ -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
index 0000000..df76c31
--- /dev/null
+++ b/internat.subproj/Makefile.postamble
@@ -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
index 0000000..ab01f68
--- /dev/null
+++ b/internat.subproj/Makefile.preamble
@@ -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
index 0000000..a9932b1
--- /dev/null
+++ b/internat.subproj/NXCType.c
@@ -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
index 0000000..3c5407e
--- /dev/null
+++ b/internat.subproj/NXCType.h
@@ -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
index 0000000..65e15e0
--- /dev/null
+++ b/internat.subproj/NXIsAlNum.c
@@ -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
index 0000000..b946d95
--- /dev/null
+++ b/internat.subproj/NXIsAlpha.c
@@ -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
index 0000000..f2545d4
--- /dev/null
+++ b/internat.subproj/NXIsAscii.c
@@ -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
index 0000000..71e154d
--- /dev/null
+++ b/internat.subproj/NXIsCntrl.c
@@ -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
index 0000000..1ead0b3
--- /dev/null
+++ b/internat.subproj/NXIsDigit.c
@@ -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
index 0000000..39545d1
--- /dev/null
+++ b/internat.subproj/NXIsGraph.c
@@ -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
index 0000000..1074676
--- /dev/null
+++ b/internat.subproj/NXIsLower.c
@@ -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
index 0000000..29154e1
--- /dev/null
+++ b/internat.subproj/NXIsPrint.c
@@ -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
index 0000000..188d694
--- /dev/null
+++ b/internat.subproj/NXIsPunct.c
@@ -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
index 0000000..35c6d50
--- /dev/null
+++ b/internat.subproj/NXIsSpace.c
@@ -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
index 0000000..e23a927
--- /dev/null
+++ b/internat.subproj/NXIsUpper.c
@@ -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
index 0000000..785ca3f
--- /dev/null
+++ b/internat.subproj/NXIsXDigit.c
@@ -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
index 0000000..b089fb2
--- /dev/null
+++ b/internat.subproj/NXToAscii.c
@@ -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
index 0000000..90ddc12
--- /dev/null
+++ b/internat.subproj/NXToLower.c
@@ -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
index 0000000..db23e6b
--- /dev/null
+++ b/internat.subproj/NXToUpper.c
@@ -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
index 0000000..67c5990
--- /dev/null
+++ b/internat.subproj/PB.project
@@ -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
index 0000000..0b10647
--- /dev/null
+++ b/internat.subproj/_NXToLower.c
@@ -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
index 0000000..e30b2ab
--- /dev/null
+++ b/internat.subproj/_NXToUpper.c
@@ -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
index 0000000..f126176
--- /dev/null
+++ b/locale.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/locale.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/locale.subproj/Makefile.preamble
@@ -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
index 0000000..25515a8
--- /dev/null
+++ b/locale.subproj/PB.project
@@ -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
index 0000000..cba06a3
--- /dev/null
+++ b/locale.subproj/ansi.c
@@ -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
index 0000000..7dec737
--- /dev/null
+++ b/locale.subproj/ctype.c
@@ -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
index 0000000..41394b9
--- /dev/null
+++ b/locale.subproj/euc.c
@@ -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
index 0000000..a6adad9
--- /dev/null
+++ b/locale.subproj/frune.c
@@ -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
index 0000000..593b8ed
--- /dev/null
+++ b/locale.subproj/isctype.c
@@ -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
index 0000000..786ca4a
--- /dev/null
+++ b/locale.subproj/lconv.c
@@ -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
index 0000000..4393c9c
--- /dev/null
+++ b/locale.subproj/localeconv.c
@@ -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
index 0000000..105c4a7
--- /dev/null
+++ b/locale.subproj/mbrune.c
@@ -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
index 0000000..8c8c442
--- /dev/null
+++ b/locale.subproj/none.c
@@ -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
index 0000000..2325a7e
--- /dev/null
+++ b/locale.subproj/rune.c
@@ -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
index 0000000..3d6df8a
--- /dev/null
+++ b/locale.subproj/runetable.c
@@ -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
index 0000000..8011e68
--- /dev/null
+++ b/locale.subproj/setlocale.c
@@ -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
index 0000000..1d4a69f
--- /dev/null
+++ b/locale.subproj/utf2.c
@@ -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
index 0000000..68ed0b6
--- /dev/null
+++ b/mach.subproj/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 = 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
index 0000000..e69de29
diff --git a/mach.subproj/Makefile.preamble b/mach.subproj/Makefile.preamble
new file mode 100644
index 0000000..c8f3ba4
--- /dev/null
+++ b/mach.subproj/Makefile.preamble
@@ -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
index 0000000..9a4126c
--- /dev/null
+++ b/mach.subproj/PB.project
@@ -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
index 0000000..8f57322
--- /dev/null
+++ b/mach.subproj/bootstrap.defs
@@ -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
index 0000000..1695171
--- /dev/null
+++ b/mach.subproj/clock.defs
@@ -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
index 0000000..d419faf
--- /dev/null
+++ b/mach.subproj/clock_priv.defs
@@ -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
index 0000000..b0e0f5b
--- /dev/null
+++ b/mach.subproj/clock_reply.defs
@@ -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
index 0000000..e96fcc2
--- /dev/null
+++ b/mach.subproj/clock_sleep.c
@@ -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
index 0000000..9c763cc
--- /dev/null
+++ b/mach.subproj/err_ipc.sub
@@ -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
index 0000000..5103603
--- /dev/null
+++ b/mach.subproj/err_kern.sub
@@ -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
index 0000000..6db64fb
--- /dev/null
+++ b/mach.subproj/err_mach_ipc.sub
@@ -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
index 0000000..fcbe91b
--- /dev/null
+++ b/mach.subproj/err_server.sub
@@ -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
index 0000000..8db68f6
--- /dev/null
+++ b/mach.subproj/err_us.sub
@@ -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
index 0000000..b46cd61
--- /dev/null
+++ b/mach.subproj/error_codes.c
@@ -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
index 0000000..9bdb234
--- /dev/null
+++ b/mach.subproj/exc.defs
@@ -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
index 0000000..1125ed3
--- /dev/null
+++ b/mach.subproj/exc_catcher.c
@@ -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
index 0000000..61cefb3
--- /dev/null
+++ b/mach.subproj/exc_catcher_state.c
@@ -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
index 0000000..ac2ea37
--- /dev/null
+++ b/mach.subproj/exc_catcher_state_identity.c
@@ -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
index 0000000..0110179
--- /dev/null
+++ b/mach.subproj/externs.h
@@ -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
index 0000000..a2f70f7
--- /dev/null
+++ b/mach.subproj/fprintf_stderr.c
@@ -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
index 0000000..f82584e
--- /dev/null
+++ b/mach.subproj/headers.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/mach.subproj/headers.subproj/Makefile.postamble
@@ -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
index 0000000..817860a
--- /dev/null
+++ b/mach.subproj/headers.subproj/Makefile.preamble
@@ -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
index 0000000..7448712
--- /dev/null
+++ b/mach.subproj/headers.subproj/PB.project
@@ -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
index 0000000..aa270da
--- /dev/null
+++ b/mach.subproj/headers.subproj/errorlib.h
@@ -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
index 0000000..9fa02f3
--- /dev/null
+++ b/mach.subproj/headers.subproj/mach.h
@@ -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
index 0000000..b60fcf9
--- /dev/null
+++ b/mach.subproj/headers.subproj/mach_error.h
@@ -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
index 0000000..c9521cf
--- /dev/null
+++ b/mach.subproj/headers.subproj/mach_init.h
@@ -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
index 0000000..6373e90
--- /dev/null
+++ b/mach.subproj/headers.subproj/mach_interface.h
@@ -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
index 0000000..2344e84
--- /dev/null
+++ b/mach.subproj/headers.subproj/mig_errors.h
@@ -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
index 0000000..796972c
--- /dev/null
+++ b/mach.subproj/headers.subproj/port_obj.h
@@ -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
index 0000000..e327d10
--- /dev/null
+++ b/mach.subproj/headers.subproj/sync.h
@@ -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
index 0000000..8ae7856
--- /dev/null
+++ b/mach.subproj/headers.subproj/vm_task.h
@@ -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
index 0000000..060900d
--- /dev/null
+++ b/mach.subproj/host_priv.defs
@@ -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
index 0000000..96999e5
--- /dev/null
+++ b/mach.subproj/host_security.defs
@@ -0,0 +1 @@
+#include <mach/host_security.defs>
diff --git a/mach.subproj/ledger.defs b/mach.subproj/ledger.defs
new file mode 100644
index 0000000..c7e9270
--- /dev/null
+++ b/mach.subproj/ledger.defs
@@ -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
index 0000000..c62bb42
--- /dev/null
+++ b/mach.subproj/lock_set.defs
@@ -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
index 0000000..04491ef
--- /dev/null
+++ b/mach.subproj/mach_absolute_time.c
@@ -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
index 0000000..df35b48
--- /dev/null
+++ b/mach.subproj/mach_error.c
@@ -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
index 0000000..846d2b8
--- /dev/null
+++ b/mach.subproj/mach_error_string.c
@@ -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
index 0000000..e3d6c22
--- /dev/null
+++ b/mach.subproj/mach_host.defs
@@ -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
index 0000000..6fac3a0
--- /dev/null
+++ b/mach.subproj/mach_init.c
@@ -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
index 0000000..8853ef7
--- /dev/null
+++ b/mach.subproj/mach_init_ports.c
@@ -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
index 0000000..d7a1d92
--- /dev/null
+++ b/mach.subproj/mach_msg.c
@@ -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
index 0000000..008ee99
--- /dev/null
+++ b/mach.subproj/mach_msg_destroy.c
@@ -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
index 0000000..8d7f260
--- /dev/null
+++ b/mach.subproj/mach_msg_receive.c
@@ -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
index 0000000..80180dd
--- /dev/null
+++ b/mach.subproj/mach_msg_send.c
@@ -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
index 0000000..4144c7a
--- /dev/null
+++ b/mach.subproj/mach_msg_server.c
@@ -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
index 0000000..935d58f
--- /dev/null
+++ b/mach.subproj/mach_port.defs
@@ -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
index 0000000..a22504a
--- /dev/null
+++ b/mach.subproj/mach_subsystem_join.c
@@ -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
index 0000000..59c9b0a
--- /dev/null
+++ b/mach.subproj/mach_traps.s
@@ -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
index 0000000..38db1ac
--- /dev/null
+++ b/mach.subproj/mig_allocate.c
@@ -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
index 0000000..5ee1c3f
--- /dev/null
+++ b/mach.subproj/mig_deallocate.c
@@ -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
index 0000000..b18ec76
--- /dev/null
+++ b/mach.subproj/mig_reply_setup.c
@@ -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
index 0000000..fe2a314
--- /dev/null
+++ b/mach.subproj/mig_strncpy.c
@@ -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
index 0000000..2f6a6d6
--- /dev/null
+++ b/mach.subproj/ms_thread_switch.c
@@ -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
index 0000000..2014be5
--- /dev/null
+++ b/mach.subproj/notify.defs
@@ -0,0 +1 @@
+#include <mach/notify.defs>
diff --git a/mach.subproj/panic.c b/mach.subproj/panic.c
new file mode 100644
index 0000000..2411d52
--- /dev/null
+++ b/mach.subproj/panic.c
@@ -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
index 0000000..4d63221
--- /dev/null
+++ b/mach.subproj/port_obj.c
@@ -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
index 0000000..bc58140
--- /dev/null
+++ b/mach.subproj/processor.defs
@@ -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
index 0000000..5504bc9
--- /dev/null
+++ b/mach.subproj/processor_set.defs
@@ -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
index 0000000..5b47642
--- /dev/null
+++ b/mach.subproj/sbrk.c
@@ -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
index 0000000..e0ac63b
--- /dev/null
+++ b/mach.subproj/semaphore.c
@@ -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
index 0000000..e00ee97
--- /dev/null
+++ b/mach.subproj/servers.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/mach.subproj/servers.subproj/Makefile.postamble
@@ -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
index 0000000..5cee34d
--- /dev/null
+++ b/mach.subproj/servers.subproj/Makefile.preamble
@@ -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
index 0000000..d9b8447
--- /dev/null
+++ b/mach.subproj/servers.subproj/PB.project
@@ -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
index 0000000..0daa753
--- /dev/null
+++ b/mach.subproj/servers.subproj/bootstrap.defs
@@ -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
index 0000000..18a8ca8
--- /dev/null
+++ b/mach.subproj/servers.subproj/bootstrap_defs.h
@@ -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
index 0000000..a44d526
--- /dev/null
+++ b/mach.subproj/servers.subproj/key_defs.h
@@ -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
index 0000000..9dc2fe7
--- /dev/null
+++ b/mach.subproj/servers.subproj/ls_defs.h
@@ -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
index 0000000..264495c
--- /dev/null
+++ b/mach.subproj/servers.subproj/netname.defs
@@ -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
index 0000000..8dcffcb
--- /dev/null
+++ b/mach.subproj/servers.subproj/netname_defs.h
@@ -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
index 0000000..641a2e7
--- /dev/null
+++ b/mach.subproj/servers.subproj/nm_defs.h
@@ -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
index 0000000..814ea0a
--- /dev/null
+++ b/mach.subproj/slot_name.c
@@ -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
index 0000000..af6399f
--- /dev/null
+++ b/mach.subproj/task.defs
@@ -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
index 0000000..8c515f8
--- /dev/null
+++ b/mach.subproj/thread_act.defs
@@ -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
index 0000000..36aa954
--- /dev/null
+++ b/mach.subproj/vm_map.defs
@@ -0,0 +1 @@
+#include <mach/vm_map.defs>
diff --git a/net.subproj/Makefile b/net.subproj/Makefile
new file mode 100644
index 0000000..7417017
--- /dev/null
+++ b/net.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/net.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/net.subproj/Makefile.preamble
@@ -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
index 0000000..172eb9c
--- /dev/null
+++ b/net.subproj/PB.project
@@ -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
index 0000000..646a95d
--- /dev/null
+++ b/net.subproj/inet_addr.c
@@ -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
index 0000000..99e72ba
--- /dev/null
+++ b/net.subproj/inet_lnaof.c
@@ -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
index 0000000..8789c19
--- /dev/null
+++ b/net.subproj/inet_makeaddr.c
@@ -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
index 0000000..c371654
--- /dev/null
+++ b/net.subproj/inet_netof.c
@@ -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
index 0000000..07d6e7f
--- /dev/null
+++ b/net.subproj/inet_network.c
@@ -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
index 0000000..e91f1ea
--- /dev/null
+++ b/net.subproj/inet_ntoa.c
@@ -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
index 0000000..3267fa8
--- /dev/null
+++ b/net.subproj/iso_addr.c
@@ -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
index 0000000..ffaafff
--- /dev/null
+++ b/net.subproj/linkaddr.c
@@ -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
index 0000000..7e98719
--- /dev/null
+++ b/net.subproj/ns_addr.c
@@ -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
index 0000000..e038815
--- /dev/null
+++ b/net.subproj/ns_ntoa.c
@@ -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
index 0000000..2c5ebaa
--- /dev/null
+++ b/net.subproj/nsap_addr.c
@@ -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
index 0000000..42645fa
--- /dev/null
+++ b/net.subproj/recv.c
@@ -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
index 0000000..5aaeca9
--- /dev/null
+++ b/pthreads.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/pthreads.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/pthreads.subproj/Makefile.preamble
@@ -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
index 0000000..cb9a7f3
--- /dev/null
+++ b/pthreads.subproj/PB.project
@@ -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
index 0000000..baac7af
--- /dev/null
+++ b/pthreads.subproj/lock.s
@@ -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
index 0000000..67b8c1b
--- /dev/null
+++ b/pthreads.subproj/mk_pthread_impl.c
@@ -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
index 0000000..b9badf1
--- /dev/null
+++ b/pthreads.subproj/posix_sched.h
@@ -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
index 0000000..ddf28a8
--- /dev/null
+++ b/pthreads.subproj/pthread.c
@@ -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
index 0000000..0f1ea58
--- /dev/null
+++ b/pthreads.subproj/pthread.h
@@ -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
index 0000000..49e4c36
--- /dev/null
+++ b/pthreads.subproj/pthread_cond.c
@@ -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
index 0000000..ef83dee
--- /dev/null
+++ b/pthreads.subproj/pthread_impl.h
@@ -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
index 0000000..1e96b3c
--- /dev/null
+++ b/pthreads.subproj/pthread_internals.h
@@ -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
index 0000000..57a3f24
--- /dev/null
+++ b/pthreads.subproj/pthread_machdep.h
@@ -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
index 0000000..1276e60
--- /dev/null
+++ b/pthreads.subproj/pthread_mutex.c
@@ -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
index 0000000..f8cfb6b
--- /dev/null
+++ b/pthreads.subproj/pthread_tsd.c
@@ -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
index 0000000..d67a482
--- /dev/null
+++ b/pthreads.subproj/sched.h
@@ -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
index 0000000..7548bbf
--- /dev/null
+++ b/pthreads.subproj/stack.s
@@ -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
index 0000000..13502dc
--- /dev/null
+++ b/pthreads.subproj/thread_setup.c
@@ -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
index 0000000..df9cdf6
--- /dev/null
+++ b/regex.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/regex.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/regex.subproj/Makefile.preamble
@@ -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
index 0000000..2ef71b3
--- /dev/null
+++ b/regex.subproj/PB.project
@@ -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
index 0000000..028b6ed
--- /dev/null
+++ b/regex.subproj/cclass.h
@@ -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
index 0000000..1abcd7c
--- /dev/null
+++ b/regex.subproj/cname.h
@@ -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
index 0000000..3f7856a
--- /dev/null
+++ b/regex.subproj/engine.c
@@ -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
index 0000000..e2e0bf3
--- /dev/null
+++ b/regex.subproj/regcomp.c
@@ -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
index 0000000..6d7da99
--- /dev/null
+++ b/regex.subproj/regerror.c
@@ -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
index 0000000..d68f62b
--- /dev/null
+++ b/regex.subproj/regex2.h
@@ -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
index 0000000..928e272
--- /dev/null
+++ b/regex.subproj/regexec.c
@@ -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
index 0000000..9d81d4c
--- /dev/null
+++ b/regex.subproj/regfree.c
@@ -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
index 0000000..f18607b
--- /dev/null
+++ b/regex.subproj/utils.h
@@ -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
index 0000000..4fc67ac
--- /dev/null
+++ b/stdio.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/stdio.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/stdio.subproj/Makefile.preamble
@@ -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
index 0000000..5d739da
--- /dev/null
+++ b/stdio.subproj/PB.project
@@ -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
index 0000000..610dae9
--- /dev/null
+++ b/stdio.subproj/clrerr.c
@@ -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
index 0000000..e7b1c97
--- /dev/null
+++ b/stdio.subproj/fclose.c
@@ -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
index 0000000..4bc1a94
--- /dev/null
+++ b/stdio.subproj/fdopen.c
@@ -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
index 0000000..756ff08
--- /dev/null
+++ b/stdio.subproj/feof.c
@@ -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
index 0000000..ef590e5
--- /dev/null
+++ b/stdio.subproj/ferror.c
@@ -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
index 0000000..33793d4
--- /dev/null
+++ b/stdio.subproj/fflush.c
@@ -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
index 0000000..78a771b
--- /dev/null
+++ b/stdio.subproj/fgetc.c
@@ -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
index 0000000..d1ce9d5
--- /dev/null
+++ b/stdio.subproj/fgetln.c
@@ -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
index 0000000..0dfafd6
--- /dev/null
+++ b/stdio.subproj/fgetpos.c
@@ -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
index 0000000..45da44e
--- /dev/null
+++ b/stdio.subproj/fgets.c
@@ -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
index 0000000..b5d106a
--- /dev/null
+++ b/stdio.subproj/fileno.c
@@ -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
index 0000000..405a911
--- /dev/null
+++ b/stdio.subproj/findfp.c
@@ -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
index 0000000..22cc1e9
--- /dev/null
+++ b/stdio.subproj/flags.c
@@ -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
index 0000000..06be4a7
--- /dev/null
+++ b/stdio.subproj/floatio.h
@@ -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
index 0000000..4f10f39
--- /dev/null
+++ b/stdio.subproj/fopen.c
@@ -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
index 0000000..761156d
--- /dev/null
+++ b/stdio.subproj/fprintf.c
@@ -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
index 0000000..65c0fad
--- /dev/null
+++ b/stdio.subproj/fpurge.c
@@ -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
index 0000000..2e31e22
--- /dev/null
+++ b/stdio.subproj/fputc.c
@@ -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
index 0000000..855db46
--- /dev/null
+++ b/stdio.subproj/fputs.c
@@ -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
index 0000000..5d622ea
--- /dev/null
+++ b/stdio.subproj/fread.c
@@ -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
index 0000000..9e38851
--- /dev/null
+++ b/stdio.subproj/freopen.c
@@ -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
index 0000000..27a3028
--- /dev/null
+++ b/stdio.subproj/fscanf.c
@@ -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
index 0000000..802e3cc
--- /dev/null
+++ b/stdio.subproj/fseek.c
@@ -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
index 0000000..7397bb9
--- /dev/null
+++ b/stdio.subproj/fsetpos.c
@@ -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
index 0000000..b899c66
--- /dev/null
+++ b/stdio.subproj/ftell.c
@@ -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
index 0000000..d96a23f
--- /dev/null
+++ b/stdio.subproj/funopen.c
@@ -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
index 0000000..f7d2c86
--- /dev/null
+++ b/stdio.subproj/fvwrite.c
@@ -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
index 0000000..7b021ce
--- /dev/null
+++ b/stdio.subproj/fvwrite.h
@@ -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
index 0000000..ddbf641
--- /dev/null
+++ b/stdio.subproj/fwalk.c
@@ -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
index 0000000..7e4e82f
--- /dev/null
+++ b/stdio.subproj/fwrite.c
@@ -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
index 0000000..b4af96a
--- /dev/null
+++ b/stdio.subproj/getc.c
@@ -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
index 0000000..e7d7e5a
--- /dev/null
+++ b/stdio.subproj/getchar.c
@@ -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
index 0000000..ea8b1e5
--- /dev/null
+++ b/stdio.subproj/gets.c
@@ -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
index 0000000..a2776b3
--- /dev/null
+++ b/stdio.subproj/getw.c
@@ -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
index 0000000..4636067
--- /dev/null
+++ b/stdio.subproj/glue.h
@@ -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
index 0000000..ae80de0
--- /dev/null
+++ b/stdio.subproj/local.h
@@ -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
index 0000000..89c3bbb
--- /dev/null
+++ b/stdio.subproj/makebuf.c
@@ -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
index 0000000..e6e29eb
--- /dev/null
+++ b/stdio.subproj/mktemp.c
@@ -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
index 0000000..7a3c4f5
--- /dev/null
+++ b/stdio.subproj/perror.c
@@ -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
index 0000000..a7e2385
--- /dev/null
+++ b/stdio.subproj/printf.c
@@ -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
index 0000000..f4ca592
--- /dev/null
+++ b/stdio.subproj/putc.c
@@ -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
index 0000000..b69fabe
--- /dev/null
+++ b/stdio.subproj/putchar.c
@@ -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
index 0000000..31ae510
--- /dev/null
+++ b/stdio.subproj/puts.c
@@ -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
index 0000000..225f916
--- /dev/null
+++ b/stdio.subproj/putw.c
@@ -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
index 0000000..1af09b2
--- /dev/null
+++ b/stdio.subproj/refill.c
@@ -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
index 0000000..f20237e
--- /dev/null
+++ b/stdio.subproj/remove.c
@@ -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
index 0000000..f014fb6
--- /dev/null
+++ b/stdio.subproj/rewind.c
@@ -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
index 0000000..7478d4f
--- /dev/null
+++ b/stdio.subproj/rget.c
@@ -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
index 0000000..d2f6ce5
--- /dev/null
+++ b/stdio.subproj/scanf.c
@@ -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
index 0000000..1180f10
--- /dev/null
+++ b/stdio.subproj/setbuf.c
@@ -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
index 0000000..1aa3e62
--- /dev/null
+++ b/stdio.subproj/setbuffer.c
@@ -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
index 0000000..25a8d52
--- /dev/null
+++ b/stdio.subproj/setvbuf.c
@@ -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
index 0000000..a9b6315
--- /dev/null
+++ b/stdio.subproj/snprintf.c
@@ -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
index 0000000..0cddde0
--- /dev/null
+++ b/stdio.subproj/sprintf.c
@@ -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
index 0000000..92ccf56
--- /dev/null
+++ b/stdio.subproj/sscanf.c
@@ -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
index 0000000..dc8a702
--- /dev/null
+++ b/stdio.subproj/stdio.c
@@ -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
index 0000000..ebbb84a
--- /dev/null
+++ b/stdio.subproj/tempnam.c
@@ -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
index 0000000..2924a9e
--- /dev/null
+++ b/stdio.subproj/tmpfile.c
@@ -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
index 0000000..3ab71b1
--- /dev/null
+++ b/stdio.subproj/tmpnam.c
@@ -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
index 0000000..ab92783
--- /dev/null
+++ b/stdio.subproj/ungetc.c
@@ -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
index 0000000..f819e25
--- /dev/null
+++ b/stdio.subproj/vfprintf.c
@@ -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
index 0000000..c245bfc
--- /dev/null
+++ b/stdio.subproj/vfscanf.c
@@ -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
index 0000000..686deaf
--- /dev/null
+++ b/stdio.subproj/vprintf.c
@@ -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
index 0000000..3b92a1c
--- /dev/null
+++ b/stdio.subproj/vscanf.c
@@ -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
index 0000000..3d2e6d1
--- /dev/null
+++ b/stdio.subproj/vsnprintf.c
@@ -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
index 0000000..2e8e0ad
--- /dev/null
+++ b/stdio.subproj/vsprintf.c
@@ -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
index 0000000..59bbabf
--- /dev/null
+++ b/stdio.subproj/vsscanf.c
@@ -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
index 0000000..78032d4
--- /dev/null
+++ b/stdio.subproj/wbuf.c
@@ -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
index 0000000..758523d
--- /dev/null
+++ b/stdio.subproj/wsetup.c
@@ -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
index 0000000..f952411
--- /dev/null
+++ b/stdlib.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/stdlib.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/stdlib.subproj/Makefile.preamble
@@ -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
index 0000000..7480e6f
--- /dev/null
+++ b/stdlib.subproj/PB.project
@@ -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
index 0000000..df2ae6e
--- /dev/null
+++ b/stdlib.subproj/abort.c
@@ -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
index 0000000..014fbce
--- /dev/null
+++ b/stdlib.subproj/atexit.c
@@ -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
index 0000000..27a7fa5
--- /dev/null
+++ b/stdlib.subproj/atexit.h
@@ -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
index 0000000..49ad147
--- /dev/null
+++ b/stdlib.subproj/atof.c
@@ -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
index 0000000..c178b6a
--- /dev/null
+++ b/stdlib.subproj/atoi.c
@@ -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
index 0000000..5aec484
--- /dev/null
+++ b/stdlib.subproj/atol.c
@@ -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
index 0000000..bb40138
--- /dev/null
+++ b/stdlib.subproj/bsearch.c
@@ -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
index 0000000..c6594e6
--- /dev/null
+++ b/stdlib.subproj/div.c
@@ -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
index 0000000..133133d
--- /dev/null
+++ b/stdlib.subproj/exit.c
@@ -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
index 0000000..51d9073
--- /dev/null
+++ b/stdlib.subproj/getenv.c
@@ -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
index 0000000..d5075b7
--- /dev/null
+++ b/stdlib.subproj/getopt.c
@@ -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
index 0000000..d4d6813
--- /dev/null
+++ b/stdlib.subproj/getsubopt.c
@@ -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
index 0000000..0b8b1be
--- /dev/null
+++ b/stdlib.subproj/heapsort.c
@@ -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
index 0000000..5267e5d
--- /dev/null
+++ b/stdlib.subproj/labs.c
@@ -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
index 0000000..83f63e4
--- /dev/null
+++ b/stdlib.subproj/ldiv.c
@@ -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
index 0000000..c71e767
--- /dev/null
+++ b/stdlib.subproj/merge.c
@@ -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
index 0000000..2fbe267
--- /dev/null
+++ b/stdlib.subproj/putenv.c
@@ -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
index 0000000..d0d2fc6
--- /dev/null
+++ b/stdlib.subproj/qsort.c
@@ -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
index 0000000..53a02b5
--- /dev/null
+++ b/stdlib.subproj/radixsort.c
@@ -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
index 0000000..0379c8f
--- /dev/null
+++ b/stdlib.subproj/rand.c
@@ -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
index 0000000..722e805
--- /dev/null
+++ b/stdlib.subproj/random.c
@@ -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
index 0000000..e74a41f
--- /dev/null
+++ b/stdlib.subproj/setenv.c
@@ -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
index 0000000..0ed39d8
--- /dev/null
+++ b/stdlib.subproj/strtod.c
@@ -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
index 0000000..ad8302d
--- /dev/null
+++ b/stdlib.subproj/strtol.c
@@ -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
index 0000000..c099ba1
--- /dev/null
+++ b/stdlib.subproj/strtoq.c
@@ -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
index 0000000..e0ccb4d
--- /dev/null
+++ b/stdlib.subproj/strtoul.c
@@ -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
index 0000000..1fefc54
--- /dev/null
+++ b/stdlib.subproj/strtouq.c
@@ -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
index 0000000..f31e4db
--- /dev/null
+++ b/stdlib.subproj/system.c
@@ -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
index 0000000..85018cc
--- /dev/null
+++ b/string.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/string.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/string.subproj/Makefile.preamble
@@ -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
index 0000000..78cb76d
--- /dev/null
+++ b/string.subproj/PB.project
@@ -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
index 0000000..673fa55
--- /dev/null
+++ b/string.subproj/index.c
@@ -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
index 0000000..d925f12
--- /dev/null
+++ b/string.subproj/memccpy.c
@@ -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
index 0000000..000bf02
--- /dev/null
+++ b/string.subproj/memchr.c
@@ -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
index 0000000..a54399d
--- /dev/null
+++ b/string.subproj/memcmp.c
@@ -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
index 0000000..6b0b3d8
--- /dev/null
+++ b/string.subproj/memset.c
@@ -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
index 0000000..c5eb97a
--- /dev/null
+++ b/string.subproj/rindex.c
@@ -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
index 0000000..ae1ae04
--- /dev/null
+++ b/string.subproj/rindix.c
@@ -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
index 0000000..ab1b078
--- /dev/null
+++ b/string.subproj/strcasecmp.c
@@ -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
index 0000000..b99e5c9
--- /dev/null
+++ b/string.subproj/strchr.c
@@ -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
index 0000000..556ec2d
--- /dev/null
+++ b/string.subproj/strcmp.s
@@ -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
index 0000000..e0d1ef1
--- /dev/null
+++ b/string.subproj/strcoll.c
@@ -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
index 0000000..61f7f9b
--- /dev/null
+++ b/string.subproj/strcspn.c
@@ -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
index 0000000..a238f53
--- /dev/null
+++ b/string.subproj/strdup.c
@@ -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
index 0000000..d0b5693
--- /dev/null
+++ b/string.subproj/strerror.c
@@ -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
index 0000000..beff35e
--- /dev/null
+++ b/string.subproj/strftime.c
@@ -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
index 0000000..462b945
--- /dev/null
+++ b/string.subproj/strmode.c
@@ -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
index 0000000..7a68733
--- /dev/null
+++ b/string.subproj/strpbrk.c
@@ -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
index 0000000..8b43f33
--- /dev/null
+++ b/string.subproj/strsep.c
@@ -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
index 0000000..5e496f2
--- /dev/null
+++ b/string.subproj/strspn.c
@@ -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
index 0000000..6ec3d6d
--- /dev/null
+++ b/string.subproj/strstr.c
@@ -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
index 0000000..16521c3
--- /dev/null
+++ b/string.subproj/strtok.c
@@ -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
index 0000000..0153076
--- /dev/null
+++ b/string.subproj/strxfrm.c
@@ -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
index 0000000..e229855
--- /dev/null
+++ b/string.subproj/swab.c
@@ -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
index 0000000..705fdfa
--- /dev/null
+++ b/sys.subproj/Makefile
@@ -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
index 0000000..6b33f70
--- /dev/null
+++ b/sys.subproj/Makefile.postamble
@@ -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
index 0000000..eda7efc
--- /dev/null
+++ b/sys.subproj/Makefile.preamble
@@ -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
index 0000000..d57c398
--- /dev/null
+++ b/sys.subproj/PB.project
@@ -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
index 0000000..9539d89
--- /dev/null
+++ b/sys.subproj/errno.c
@@ -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
index 0000000..c25bf90
--- /dev/null
+++ b/sys.subproj/getdtablesize.c
@@ -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
index 0000000..d07239b
--- /dev/null
+++ b/sys.subproj/gettimeofday.c
@@ -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
index 0000000..3e47b64
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATPgetreq.s
@@ -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
index 0000000..4f995b5
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATPgetrsp.s
@@ -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
index 0000000..7f35022
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATPsndreq.s
@@ -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
index 0000000..1207b67
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATPsndrsp.s
@@ -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
index 0000000..9bc673a
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATgetmsg.s
@@ -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
index 0000000..648d0a7
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATputmsg.s
@@ -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
index 0000000..682c64c
--- /dev/null
+++ b/sys.subproj/i386.subproj/ATsocket.s
@@ -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
index 0000000..fd962c5
--- /dev/null
+++ b/sys.subproj/i386.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/sys.subproj/i386.subproj/Makefile.postamble
@@ -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
index 0000000..6544e5f
--- /dev/null
+++ b/sys.subproj/i386.subproj/Makefile.preamble
@@ -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
index 0000000..2e0da04
--- /dev/null
+++ b/sys.subproj/i386.subproj/PB.project
@@ -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
index 0000000..c35bf0c
--- /dev/null
+++ b/sys.subproj/i386.subproj/SYS.h
@@ -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
index 0000000..f8c2d1e
--- /dev/null
+++ b/sys.subproj/i386.subproj/_exit.s
@@ -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
index 0000000..1d2a47a
--- /dev/null
+++ b/sys.subproj/i386.subproj/_getlogin.s
@@ -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
index 0000000..bbec3f8
--- /dev/null
+++ b/sys.subproj/i386.subproj/_setjmp.s
@@ -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
index 0000000..d8d2359
--- /dev/null
+++ b/sys.subproj/i386.subproj/_setlogin.s
@@ -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
index 0000000..1d174f8
--- /dev/null
+++ b/sys.subproj/i386.subproj/_sysctl.s
@@ -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
index 0000000..6e0dc76
--- /dev/null
+++ b/sys.subproj/i386.subproj/accept.s
@@ -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
index 0000000..4d031b1
--- /dev/null
+++ b/sys.subproj/i386.subproj/access.s
@@ -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
index 0000000..83074c5
--- /dev/null
+++ b/sys.subproj/i386.subproj/acct.s
@@ -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
index 0000000..02e610f
--- /dev/null
+++ b/sys.subproj/i386.subproj/add_profil.s
@@ -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
index 0000000..4496a62
--- /dev/null
+++ b/sys.subproj/i386.subproj/adjtime.s
@@ -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
index 0000000..cbe58e1
--- /dev/null
+++ b/sys.subproj/i386.subproj/bind.s
@@ -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
index 0000000..e1ab9cc
--- /dev/null
+++ b/sys.subproj/i386.subproj/cerror.s
@@ -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
index 0000000..b862cb4
--- /dev/null
+++ b/sys.subproj/i386.subproj/chdir.s
@@ -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
index 0000000..a49371b
--- /dev/null
+++ b/sys.subproj/i386.subproj/checkuseraccess.s
@@ -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
index 0000000..2436f67
--- /dev/null
+++ b/sys.subproj/i386.subproj/chflags.s
@@ -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
index 0000000..6bc417a
--- /dev/null
+++ b/sys.subproj/i386.subproj/chmod.s
@@ -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
index 0000000..05686ec
--- /dev/null
+++ b/sys.subproj/i386.subproj/chown.s
@@ -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
index 0000000..79c27c7
--- /dev/null
+++ b/sys.subproj/i386.subproj/chroot.s
@@ -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
index 0000000..33d4a42
--- /dev/null
+++ b/sys.subproj/i386.subproj/close.s
@@ -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
index 0000000..96719ab
--- /dev/null
+++ b/sys.subproj/i386.subproj/connect.s
@@ -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
index 0000000..9116c62
--- /dev/null
+++ b/sys.subproj/i386.subproj/dup.s
@@ -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
index 0000000..6f0fb01
--- /dev/null
+++ b/sys.subproj/i386.subproj/dup2.s
@@ -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
index 0000000..dcd757f
--- /dev/null
+++ b/sys.subproj/i386.subproj/exchangedata.s
@@ -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
index 0000000..44e4ecb
--- /dev/null
+++ b/sys.subproj/i386.subproj/execve.s
@@ -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
index 0000000..8040919
--- /dev/null
+++ b/sys.subproj/i386.subproj/fchdir.s
@@ -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
index 0000000..7189e7e
--- /dev/null
+++ b/sys.subproj/i386.subproj/fchflags.s
@@ -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
index 0000000..a48a89a
--- /dev/null
+++ b/sys.subproj/i386.subproj/fchmod.s
@@ -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
index 0000000..d410dca
--- /dev/null
+++ b/sys.subproj/i386.subproj/fchown.s
@@ -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
index 0000000..f788e03
--- /dev/null
+++ b/sys.subproj/i386.subproj/fcntl.s
@@ -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
index 0000000..f490a4a
--- /dev/null
+++ b/sys.subproj/i386.subproj/flock.s
@@ -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
index 0000000..74b278d
--- /dev/null
+++ b/sys.subproj/i386.subproj/fork.s
@@ -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
index 0000000..12f71ee
--- /dev/null
+++ b/sys.subproj/i386.subproj/fpathconf.s
@@ -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
index 0000000..1a72abb
--- /dev/null
+++ b/sys.subproj/i386.subproj/fstat.s
@@ -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
index 0000000..b9a8cdf
--- /dev/null
+++ b/sys.subproj/i386.subproj/fstatfs.s
@@ -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
index 0000000..69ee4c9
--- /dev/null
+++ b/sys.subproj/i386.subproj/fstatv.s
@@ -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
index 0000000..38d8f62
--- /dev/null
+++ b/sys.subproj/i386.subproj/fsync.s
@@ -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
index 0000000..1522750
--- /dev/null
+++ b/sys.subproj/i386.subproj/ftruncate.s
@@ -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
index 0000000..4e051b4
--- /dev/null
+++ b/sys.subproj/i386.subproj/getattrlist.s
@@ -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
index 0000000..3592e4a
--- /dev/null
+++ b/sys.subproj/i386.subproj/getdirentries.s
@@ -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
index 0000000..4840434
--- /dev/null
+++ b/sys.subproj/i386.subproj/getdirentriesattr.s
@@ -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
index 0000000..5be6771
--- /dev/null
+++ b/sys.subproj/i386.subproj/getegid.s
@@ -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
index 0000000..132c7a2
--- /dev/null
+++ b/sys.subproj/i386.subproj/geteuid.s
@@ -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
index 0000000..a81c0e3
--- /dev/null
+++ b/sys.subproj/i386.subproj/getfh.s
@@ -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
index 0000000..665b3a3
--- /dev/null
+++ b/sys.subproj/i386.subproj/getfsstat.s
@@ -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
index 0000000..ba2aac4
--- /dev/null
+++ b/sys.subproj/i386.subproj/getgid.s
@@ -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
index 0000000..8d255a5
--- /dev/null
+++ b/sys.subproj/i386.subproj/getgroups.s
@@ -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
index 0000000..3e24bbf
--- /dev/null
+++ b/sys.subproj/i386.subproj/getitimer.s
@@ -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
index 0000000..8a30166
--- /dev/null
+++ b/sys.subproj/i386.subproj/getpeername.s
@@ -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
index 0000000..e1c3858
--- /dev/null
+++ b/sys.subproj/i386.subproj/getpgrp.s
@@ -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
index 0000000..beab7f7
--- /dev/null
+++ b/sys.subproj/i386.subproj/getpid.s
@@ -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
index 0000000..87cc8b7
--- /dev/null
+++ b/sys.subproj/i386.subproj/getppid.s
@@ -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
index 0000000..ca03e09
--- /dev/null
+++ b/sys.subproj/i386.subproj/getpriority.s
@@ -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
index 0000000..e8c7669
--- /dev/null
+++ b/sys.subproj/i386.subproj/getrlimit.s
@@ -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
index 0000000..b3835d1
--- /dev/null
+++ b/sys.subproj/i386.subproj/getrusage.s
@@ -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
index 0000000..cdddd3f
--- /dev/null
+++ b/sys.subproj/i386.subproj/getsockname.s
@@ -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
index 0000000..11fbb2c
--- /dev/null
+++ b/sys.subproj/i386.subproj/getsockopt.s
@@ -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
index 0000000..534a7ed
--- /dev/null
+++ b/sys.subproj/i386.subproj/getuid.s
@@ -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
index 0000000..87d2668
--- /dev/null
+++ b/sys.subproj/i386.subproj/ioctl.s
@@ -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
index 0000000..fbcde10
--- /dev/null
+++ b/sys.subproj/i386.subproj/kill.s
@@ -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
index 0000000..2cedba9
--- /dev/null
+++ b/sys.subproj/i386.subproj/ktrace.s
@@ -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
index 0000000..5bfe288
--- /dev/null
+++ b/sys.subproj/i386.subproj/lfs_bmapv.s
@@ -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
index 0000000..b43267c
--- /dev/null
+++ b/sys.subproj/i386.subproj/lfs_markv.s
@@ -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
index 0000000..3463892
--- /dev/null
+++ b/sys.subproj/i386.subproj/lfs_segclean.s
@@ -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
index 0000000..96c60f6
--- /dev/null
+++ b/sys.subproj/i386.subproj/lfs_segwait.s
@@ -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
index 0000000..aaf945a
--- /dev/null
+++ b/sys.subproj/i386.subproj/link.s
@@ -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
index 0000000..ff4e5ee
--- /dev/null
+++ b/sys.subproj/i386.subproj/listen.s
@@ -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
index 0000000..bdfebfd
--- /dev/null
+++ b/sys.subproj/i386.subproj/load_shared_file.s
@@ -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
index 0000000..1d7ce24
--- /dev/null
+++ b/sys.subproj/i386.subproj/lseek.s
@@ -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
index 0000000..fbf7e02
--- /dev/null
+++ b/sys.subproj/i386.subproj/lstat.s
@@ -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
index 0000000..40d7f4f
--- /dev/null
+++ b/sys.subproj/i386.subproj/lstatv.s
@@ -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
index 0000000..96a5603
--- /dev/null
+++ b/sys.subproj/i386.subproj/madvise.s
@@ -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
index 0000000..1002afd
--- /dev/null
+++ b/sys.subproj/i386.subproj/mincore.s
@@ -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
index 0000000..3901af9
--- /dev/null
+++ b/sys.subproj/i386.subproj/minherit.s
@@ -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
index 0000000..0b54a3b
--- /dev/null
+++ b/sys.subproj/i386.subproj/mkcomplex.s
@@ -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
index 0000000..fd001b9
--- /dev/null
+++ b/sys.subproj/i386.subproj/mkdir.s
@@ -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
index 0000000..1469906
--- /dev/null
+++ b/sys.subproj/i386.subproj/mkfifo.s
@@ -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
index 0000000..ab8c6fb
--- /dev/null
+++ b/sys.subproj/i386.subproj/mknod.s
@@ -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
index 0000000..0051c53
--- /dev/null
+++ b/sys.subproj/i386.subproj/mlock.s
@@ -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
index 0000000..0a0dad4
--- /dev/null
+++ b/sys.subproj/i386.subproj/mlockall.s
@@ -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
index 0000000..57fa9a1
--- /dev/null
+++ b/sys.subproj/i386.subproj/mmap.s
@@ -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
index 0000000..df208d0
--- /dev/null
+++ b/sys.subproj/i386.subproj/mount.s
@@ -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
index 0000000..368c648
--- /dev/null
+++ b/sys.subproj/i386.subproj/mprotect.s
@@ -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
index 0000000..9028ca2
--- /dev/null
+++ b/sys.subproj/i386.subproj/msgctl.s
@@ -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
index 0000000..9a9c46c
--- /dev/null
+++ b/sys.subproj/i386.subproj/msgget.s
@@ -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
index 0000000..627c8c5
--- /dev/null
+++ b/sys.subproj/i386.subproj/msgrcv.s
@@ -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
index 0000000..0cf6dc2
--- /dev/null
+++ b/sys.subproj/i386.subproj/msgsnd.s
@@ -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
index 0000000..bad4612
--- /dev/null
+++ b/sys.subproj/i386.subproj/msgsys.s
@@ -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
index 0000000..26924bc
--- /dev/null
+++ b/sys.subproj/i386.subproj/msync.s
@@ -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
index 0000000..b7341af
--- /dev/null
+++ b/sys.subproj/i386.subproj/munlock.s
@@ -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
index 0000000..098b0b4
--- /dev/null
+++ b/sys.subproj/i386.subproj/munlockall.s
@@ -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
index 0000000..7e2e28c
--- /dev/null
+++ b/sys.subproj/i386.subproj/munmap.s
@@ -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
index 0000000..70a8e2d
--- /dev/null
+++ b/sys.subproj/i386.subproj/nfssvc.s
@@ -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
index 0000000..c505660
--- /dev/null
+++ b/sys.subproj/i386.subproj/open.s
@@ -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
index 0000000..ae6eab4
--- /dev/null
+++ b/sys.subproj/i386.subproj/pathconf.s
@@ -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
index 0000000..8fefcdd
--- /dev/null
+++ b/sys.subproj/i386.subproj/pipe.s
@@ -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
index 0000000..e9af89f
--- /dev/null
+++ b/sys.subproj/i386.subproj/profil.s
@@ -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
index 0000000..28ab2ad
--- /dev/null
+++ b/sys.subproj/i386.subproj/ptrace.s
@@ -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
index 0000000..f3788d7
--- /dev/null
+++ b/sys.subproj/i386.subproj/quota.s
@@ -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
index 0000000..cc89a5a
--- /dev/null
+++ b/sys.subproj/i386.subproj/quotactl.s
@@ -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
index 0000000..1429fa2
--- /dev/null
+++ b/sys.subproj/i386.subproj/read.s
@@ -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
index 0000000..958d7b7
--- /dev/null
+++ b/sys.subproj/i386.subproj/readlink.s
@@ -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
index 0000000..fe11a86
--- /dev/null
+++ b/sys.subproj/i386.subproj/readv.s
@@ -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
index 0000000..b6841b4
--- /dev/null
+++ b/sys.subproj/i386.subproj/reboot.s
@@ -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
index 0000000..a9ab56e
--- /dev/null
+++ b/sys.subproj/i386.subproj/recvfrom.s
@@ -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
index 0000000..d61786f
--- /dev/null
+++ b/sys.subproj/i386.subproj/recvmsg.s
@@ -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
index 0000000..a3efcfb
--- /dev/null
+++ b/sys.subproj/i386.subproj/rename.s
@@ -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
index 0000000..49e7424
--- /dev/null
+++ b/sys.subproj/i386.subproj/reset_shared_file.s
@@ -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
index 0000000..438ad16
--- /dev/null
+++ b/sys.subproj/i386.subproj/revoke.s
@@ -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
index 0000000..d5c2e6b
--- /dev/null
+++ b/sys.subproj/i386.subproj/rmdir.s
@@ -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
index 0000000..4ee3b8b
--- /dev/null
+++ b/sys.subproj/i386.subproj/searchfs.s
@@ -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
index 0000000..2aa2880
--- /dev/null
+++ b/sys.subproj/i386.subproj/select.s
@@ -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
index 0000000..c3ed857
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_close.s
@@ -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
index 0000000..2b7fdc5
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_destroy.s
@@ -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
index 0000000..d169e21
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_getvalue.s
@@ -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
index 0000000..daf0ba9
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_init.s
@@ -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
index 0000000..2c68a7c
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_open.s
@@ -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
index 0000000..f6b24af
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_post.s
@@ -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
index 0000000..9c0f725
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_trywait.s
@@ -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
index 0000000..0449cbf
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_unlink.s
@@ -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
index 0000000..405b047
--- /dev/null
+++ b/sys.subproj/i386.subproj/sem_wait.s
@@ -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
index 0000000..5c07385
--- /dev/null
+++ b/sys.subproj/i386.subproj/semconfig.s
@@ -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
index 0000000..b53bebe
--- /dev/null
+++ b/sys.subproj/i386.subproj/semctl.s
@@ -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
index 0000000..1889c4d
--- /dev/null
+++ b/sys.subproj/i386.subproj/semget.s
@@ -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
index 0000000..7c0c902
--- /dev/null
+++ b/sys.subproj/i386.subproj/semop.s
@@ -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
index 0000000..e775bf6
--- /dev/null
+++ b/sys.subproj/i386.subproj/semsys.s
@@ -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
index 0000000..c6acb08
--- /dev/null
+++ b/sys.subproj/i386.subproj/sendmsg.s
@@ -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
index 0000000..990f1f1
--- /dev/null
+++ b/sys.subproj/i386.subproj/sendto.s
@@ -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
index 0000000..907e057
--- /dev/null
+++ b/sys.subproj/i386.subproj/setattrlist.s
@@ -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
index 0000000..a4db7f8
--- /dev/null
+++ b/sys.subproj/i386.subproj/setegid.s
@@ -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
index 0000000..497ea22
--- /dev/null
+++ b/sys.subproj/i386.subproj/seteuid.s
@@ -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
index 0000000..4767c4c
--- /dev/null
+++ b/sys.subproj/i386.subproj/setgid.s
@@ -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
index 0000000..66add53
--- /dev/null
+++ b/sys.subproj/i386.subproj/setgroups.s
@@ -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
index 0000000..8806cd9
--- /dev/null
+++ b/sys.subproj/i386.subproj/setitimer.s
@@ -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
index 0000000..bc5108d
--- /dev/null
+++ b/sys.subproj/i386.subproj/setjmp.s
@@ -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
index 0000000..d0627ef
--- /dev/null
+++ b/sys.subproj/i386.subproj/setpgid.s
@@ -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
index 0000000..315ec64
--- /dev/null
+++ b/sys.subproj/i386.subproj/setpriority.s
@@ -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
index 0000000..9569b59
--- /dev/null
+++ b/sys.subproj/i386.subproj/setprivexec.s
@@ -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
index 0000000..0919c02
--- /dev/null
+++ b/sys.subproj/i386.subproj/setquota.s
@@ -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
index 0000000..06ffe21
--- /dev/null
+++ b/sys.subproj/i386.subproj/setrlimit.s
@@ -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
index 0000000..5f6905e
--- /dev/null
+++ b/sys.subproj/i386.subproj/setsid.s
@@ -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
index 0000000..48d60af
--- /dev/null
+++ b/sys.subproj/i386.subproj/setsockopt.s
@@ -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
index 0000000..529c5f9
--- /dev/null
+++ b/sys.subproj/i386.subproj/settimeofday.s
@@ -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
index 0000000..dbebb62
--- /dev/null
+++ b/sys.subproj/i386.subproj/setuid.s
@@ -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
index 0000000..3629959
--- /dev/null
+++ b/sys.subproj/i386.subproj/shm_open.s
@@ -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
index 0000000..cbbc420
--- /dev/null
+++ b/sys.subproj/i386.subproj/shm_unlink.s
@@ -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
index 0000000..c8fdc2c
--- /dev/null
+++ b/sys.subproj/i386.subproj/shmat.s
@@ -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
index 0000000..4ae81b7
--- /dev/null
+++ b/sys.subproj/i386.subproj/shmctl.s
@@ -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
index 0000000..bfc59ab
--- /dev/null
+++ b/sys.subproj/i386.subproj/shmdt.s
@@ -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
index 0000000..592ff0e
--- /dev/null
+++ b/sys.subproj/i386.subproj/shmget.s
@@ -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
index 0000000..48f49c6
--- /dev/null
+++ b/sys.subproj/i386.subproj/shmsys.s
@@ -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
index 0000000..8e201ac
--- /dev/null
+++ b/sys.subproj/i386.subproj/shutdown.s
@@ -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
index 0000000..b4ca3e5
--- /dev/null
+++ b/sys.subproj/i386.subproj/sigaltstack.s
@@ -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
index 0000000..6e99e21
--- /dev/null
+++ b/sys.subproj/i386.subproj/sigpending.s
@@ -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
index 0000000..b048bb4
--- /dev/null
+++ b/sys.subproj/i386.subproj/sigreturn.s
@@ -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
index 0000000..905c645
--- /dev/null
+++ b/sys.subproj/i386.subproj/socket.s
@@ -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
index 0000000..2e7c00a
--- /dev/null
+++ b/sys.subproj/i386.subproj/socketpair.s
@@ -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
index 0000000..cb041e5
--- /dev/null
+++ b/sys.subproj/i386.subproj/stat.s
@@ -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
index 0000000..386a41b
--- /dev/null
+++ b/sys.subproj/i386.subproj/statfs.s
@@ -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
index 0000000..db5ce1c
--- /dev/null
+++ b/sys.subproj/i386.subproj/statv.s
@@ -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
index 0000000..fe34af2
--- /dev/null
+++ b/sys.subproj/i386.subproj/swapon.s
@@ -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
index 0000000..44edc06
--- /dev/null
+++ b/sys.subproj/i386.subproj/symlink.s
@@ -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
index 0000000..03f711f
--- /dev/null
+++ b/sys.subproj/i386.subproj/sync.s
@@ -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
index 0000000..2e21b2d
--- /dev/null
+++ b/sys.subproj/i386.subproj/syscall.s
@@ -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
index 0000000..4dec901
--- /dev/null
+++ b/sys.subproj/i386.subproj/table.s
@@ -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
index 0000000..a29542d
--- /dev/null
+++ b/sys.subproj/i386.subproj/truncate.s
@@ -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
index 0000000..82d5619
--- /dev/null
+++ b/sys.subproj/i386.subproj/umask.s
@@ -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
index 0000000..1e1c804
--- /dev/null
+++ b/sys.subproj/i386.subproj/undelete.s
@@ -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
index 0000000..d3b7191
--- /dev/null
+++ b/sys.subproj/i386.subproj/unlink.s
@@ -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
index 0000000..283b03c
--- /dev/null
+++ b/sys.subproj/i386.subproj/unmount.s
@@ -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
index 0000000..d9d7b8b
--- /dev/null
+++ b/sys.subproj/i386.subproj/utimes.s
@@ -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
index 0000000..714a205
--- /dev/null
+++ b/sys.subproj/i386.subproj/vfork.s
@@ -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
index 0000000..889c6c0
--- /dev/null
+++ b/sys.subproj/i386.subproj/wait4.s
@@ -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
index 0000000..e8e98f9
--- /dev/null
+++ b/sys.subproj/i386.subproj/write.s
@@ -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
index 0000000..10fc07d
--- /dev/null
+++ b/sys.subproj/i386.subproj/writev.s
@@ -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
index 0000000..94de3b6
--- /dev/null
+++ b/sys.subproj/msync.2
@@ -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
index 0000000..3033717
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATPgetreq.s
@@ -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
index 0000000..f5f25ab
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATPgetrsp.s
@@ -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
index 0000000..076c33f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATPsndreq.s
@@ -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
index 0000000..00cca6d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATPsndrsp.s
@@ -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
index 0000000..529a298
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATgetmsg.s
@@ -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
index 0000000..61e085f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATputmsg.s
@@ -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
index 0000000..f53d7d0
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ATsocket.s
@@ -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
index 0000000..633178e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/sys.subproj/ppc.subproj/Makefile.postamble
@@ -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
index 0000000..e7c0be7
--- /dev/null
+++ b/sys.subproj/ppc.subproj/Makefile.preamble
@@ -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
index 0000000..2359ad6
--- /dev/null
+++ b/sys.subproj/ppc.subproj/PB.project
@@ -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
index 0000000..7a56a8e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/SYS.h
@@ -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
index 0000000..fd3a59e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_exit.s
@@ -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
index 0000000..e0eb958
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_getlogin.s
@@ -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
index 0000000..4591e54
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_longjmp.s
@@ -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
index 0000000..e97255c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_setjmp.h
@@ -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
index 0000000..2be62c8
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_setjmp.s
@@ -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
index 0000000..997db69
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_setlogin.s
@@ -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
index 0000000..8e29463
--- /dev/null
+++ b/sys.subproj/ppc.subproj/_sysctl.s
@@ -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
index 0000000..672331c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/accept.s
@@ -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
index 0000000..5cd4fb9
--- /dev/null
+++ b/sys.subproj/ppc.subproj/access.s
@@ -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
index 0000000..387d35d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/acct.s
@@ -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
index 0000000..d30b6dd
--- /dev/null
+++ b/sys.subproj/ppc.subproj/add_profil.s
@@ -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
index 0000000..11f80da
--- /dev/null
+++ b/sys.subproj/ppc.subproj/adjtime.s
@@ -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
index 0000000..49d8a8f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/assym.h
@@ -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
index 0000000..e694ae0
--- /dev/null
+++ b/sys.subproj/ppc.subproj/bind.s
@@ -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
index 0000000..5753534
--- /dev/null
+++ b/sys.subproj/ppc.subproj/cerror.s
@@ -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
index 0000000..bec9ec4
--- /dev/null
+++ b/sys.subproj/ppc.subproj/chdir.s
@@ -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
index 0000000..a3df1da
--- /dev/null
+++ b/sys.subproj/ppc.subproj/checkuseraccess.s
@@ -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
index 0000000..8969b30
--- /dev/null
+++ b/sys.subproj/ppc.subproj/chflags.s
@@ -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
index 0000000..d3b242a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/chmod.s
@@ -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
index 0000000..d05ce9a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/chown.s
@@ -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
index 0000000..c2a061e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/chroot.s
@@ -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
index 0000000..fc1d293
--- /dev/null
+++ b/sys.subproj/ppc.subproj/close.s
@@ -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
index 0000000..5e7d6d3
--- /dev/null
+++ b/sys.subproj/ppc.subproj/connect.s
@@ -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
index 0000000..c456ba7
--- /dev/null
+++ b/sys.subproj/ppc.subproj/cthread.s
@@ -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
index 0000000..fe70d58
--- /dev/null
+++ b/sys.subproj/ppc.subproj/dup.s
@@ -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
index 0000000..ef1e13d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/dup2.s
@@ -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
index 0000000..7a990fc
--- /dev/null
+++ b/sys.subproj/ppc.subproj/exchangedata.s
@@ -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
index 0000000..0c0172b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/execve.s
@@ -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
index 0000000..19aa46e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fchdir.s
@@ -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
index 0000000..9e0749d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fchflags.s
@@ -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
index 0000000..e4a0eb8
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fchmod.s
@@ -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
index 0000000..48b477b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fchown.s
@@ -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
index 0000000..83a060c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fcntl.s
@@ -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
index 0000000..c422536
--- /dev/null
+++ b/sys.subproj/ppc.subproj/flock.s
@@ -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
index 0000000..6df807e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fork.s
@@ -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
index 0000000..a4666fc
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fpathconf.s
@@ -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
index 0000000..dcc424a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fstat.s
@@ -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
index 0000000..27b0ad3
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fstatfs.s
@@ -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
index 0000000..57cded8
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fstatv.s
@@ -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
index 0000000..5ff3afa
--- /dev/null
+++ b/sys.subproj/ppc.subproj/fsync.s
@@ -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
index 0000000..30eb15c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ftruncate.s
@@ -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
index 0000000..729dfa9
--- /dev/null
+++ b/sys.subproj/ppc.subproj/genassym.h
@@ -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
index 0000000..b2b9a72
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getattrlist.s
@@ -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
index 0000000..51e308b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getdirentries.s
@@ -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
index 0000000..989b481
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getdirentriesattr.s
@@ -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
index 0000000..1d5959c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getegid.s
@@ -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
index 0000000..fc71756
--- /dev/null
+++ b/sys.subproj/ppc.subproj/geteuid.s
@@ -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
index 0000000..fb377fd
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getfh.s
@@ -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
index 0000000..0e013f8
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getfsstat.s
@@ -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
index 0000000..79c52fe
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getgid.s
@@ -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
index 0000000..2284f9b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getgroups.s
@@ -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
index 0000000..35075cf
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getitimer.s
@@ -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
index 0000000..ca29d16
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getpeername.s
@@ -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
index 0000000..ba45913
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getpgrp.s
@@ -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
index 0000000..0445d37
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getpid.s
@@ -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
index 0000000..209b0b3
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getppid.s
@@ -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
index 0000000..8235428
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getpriority.s
@@ -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
index 0000000..0f02bea
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getrlimit.s
@@ -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
index 0000000..c01f157
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getrusage.s
@@ -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
index 0000000..df3ed97
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getsockname.s
@@ -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
index 0000000..6b90c2f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getsockopt.s
@@ -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
index 0000000..45610de
--- /dev/null
+++ b/sys.subproj/ppc.subproj/getuid.s
@@ -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
index 0000000..79347cf
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ioctl.s
@@ -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
index 0000000..244276e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/kill.s
@@ -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
index 0000000..b396926
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ktrace.s
@@ -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
index 0000000..24c4507
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lfs_bmapv.s
@@ -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
index 0000000..dbb69c9
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lfs_markv.s
@@ -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
index 0000000..8a36388
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lfs_segclean.s
@@ -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
index 0000000..2dc8335
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lfs_segwait.s
@@ -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
index 0000000..741d98a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/link.s
@@ -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
index 0000000..3c01971
--- /dev/null
+++ b/sys.subproj/ppc.subproj/listen.s
@@ -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
index 0000000..53b7c62
--- /dev/null
+++ b/sys.subproj/ppc.subproj/load_shared_file.s
@@ -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
index 0000000..63d6806
--- /dev/null
+++ b/sys.subproj/ppc.subproj/longjmp.s
@@ -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
index 0000000..0cce603
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lseek.s
@@ -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
index 0000000..9454192
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lstat.s
@@ -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
index 0000000..3c09ab4
--- /dev/null
+++ b/sys.subproj/ppc.subproj/lstatv.s
@@ -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
index 0000000..a656a59
--- /dev/null
+++ b/sys.subproj/ppc.subproj/madvise.s
@@ -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
index 0000000..0c794cf
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mincore.s
@@ -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
index 0000000..a17397b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/minherit.s
@@ -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
index 0000000..011508b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mkcomplex.s
@@ -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
index 0000000..b9816c1
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mkdir.s
@@ -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
index 0000000..d8483c9
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mkfifo.s
@@ -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
index 0000000..9017fee
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mknod.s
@@ -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
index 0000000..3297c9e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mlock.s
@@ -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
index 0000000..de14a8a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mlockall.s
@@ -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
index 0000000..b8dcac9
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mmap.s
@@ -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
index 0000000..cf61211
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mount.s
@@ -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
index 0000000..a266bb5
--- /dev/null
+++ b/sys.subproj/ppc.subproj/mprotect.s
@@ -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
index 0000000..a56f61d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/msgctl.s
@@ -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
index 0000000..45aa533
--- /dev/null
+++ b/sys.subproj/ppc.subproj/msgget.s
@@ -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
index 0000000..9afa905
--- /dev/null
+++ b/sys.subproj/ppc.subproj/msgrcv.s
@@ -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
index 0000000..71d1954
--- /dev/null
+++ b/sys.subproj/ppc.subproj/msgsnd.s
@@ -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
index 0000000..7e0036f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/msgsys.s
@@ -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
index 0000000..eb6fb6e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/msync.s
@@ -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
index 0000000..1306a1f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/munlock.s
@@ -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
index 0000000..49f3585
--- /dev/null
+++ b/sys.subproj/ppc.subproj/munlockall.s
@@ -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
index 0000000..7ea41da
--- /dev/null
+++ b/sys.subproj/ppc.subproj/munmap.s
@@ -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
index 0000000..bf152ce
--- /dev/null
+++ b/sys.subproj/ppc.subproj/nfssvc.s
@@ -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
index 0000000..31e98c7
--- /dev/null
+++ b/sys.subproj/ppc.subproj/open.s
@@ -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
index 0000000..443bdd7
--- /dev/null
+++ b/sys.subproj/ppc.subproj/pathconf.s
@@ -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
index 0000000..a26568d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/pipe.s
@@ -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
index 0000000..f82e7a5
--- /dev/null
+++ b/sys.subproj/ppc.subproj/processor_facilities.h
@@ -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
index 0000000..87ebeb6
--- /dev/null
+++ b/sys.subproj/ppc.subproj/processor_facilities.s
@@ -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
index 0000000..150565f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/profil.s
@@ -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
index 0000000..2bb6255
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ptrace.s
@@ -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
index 0000000..d299496
--- /dev/null
+++ b/sys.subproj/ppc.subproj/quota.s
@@ -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
index 0000000..78e71bc
--- /dev/null
+++ b/sys.subproj/ppc.subproj/quotactl.s
@@ -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
index 0000000..11ef4b7
--- /dev/null
+++ b/sys.subproj/ppc.subproj/read.s
@@ -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
index 0000000..48e113e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/readlink.s
@@ -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
index 0000000..b002966
--- /dev/null
+++ b/sys.subproj/ppc.subproj/readv.s
@@ -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
index 0000000..90bc47b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/reboot.s
@@ -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
index 0000000..567b3e8
--- /dev/null
+++ b/sys.subproj/ppc.subproj/recvfrom.s
@@ -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
index 0000000..aeb5106
--- /dev/null
+++ b/sys.subproj/ppc.subproj/recvmsg.s
@@ -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
index 0000000..a2adfd0
--- /dev/null
+++ b/sys.subproj/ppc.subproj/rename.s
@@ -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
index 0000000..a43aba6
--- /dev/null
+++ b/sys.subproj/ppc.subproj/reset_shared_file.s
@@ -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
index 0000000..3e2ae5a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/revoke.s
@@ -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
index 0000000..245e79d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/rmdir.s
@@ -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
index 0000000..6d04cda
--- /dev/null
+++ b/sys.subproj/ppc.subproj/searchfs.s
@@ -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
index 0000000..f23d513
--- /dev/null
+++ b/sys.subproj/ppc.subproj/select.s
@@ -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
index 0000000..cee016c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_close.s
@@ -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
index 0000000..b9339c0
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_destroy.s
@@ -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
index 0000000..72317b5
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_getvalue.s
@@ -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
index 0000000..06fd281
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_init.s
@@ -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
index 0000000..c997c38
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_open.s
@@ -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
index 0000000..4c58ce4
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_post.s
@@ -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
index 0000000..7c0d846
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_trywait.s
@@ -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
index 0000000..9ddb3d8
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_unlink.s
@@ -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
index 0000000..c5d166d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sem_wait.s
@@ -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
index 0000000..ac9fc2f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/semconfig.s
@@ -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
index 0000000..847bd99
--- /dev/null
+++ b/sys.subproj/ppc.subproj/semctl.s
@@ -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
index 0000000..a5339bd
--- /dev/null
+++ b/sys.subproj/ppc.subproj/semget.s
@@ -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
index 0000000..bb743b3
--- /dev/null
+++ b/sys.subproj/ppc.subproj/semop.s
@@ -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
index 0000000..a6c38d6
--- /dev/null
+++ b/sys.subproj/ppc.subproj/semsys.s
@@ -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
index 0000000..d5843d4
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sendmsg.s
@@ -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
index 0000000..3ba2164
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sendto.s
@@ -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
index 0000000..136332b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setattrlist.s
@@ -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
index 0000000..c0c16f2
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setegid.s
@@ -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
index 0000000..9ecfa30
--- /dev/null
+++ b/sys.subproj/ppc.subproj/seteuid.s
@@ -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
index 0000000..eefae95
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setgid.s
@@ -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
index 0000000..ee55f69
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setgroups.s
@@ -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
index 0000000..26ba852
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setitimer.s
@@ -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
index 0000000..78fbc76
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setjmp.s
@@ -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
index 0000000..55dea92
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setpgid.s
@@ -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
index 0000000..f550c21
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setpriority.s
@@ -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
index 0000000..dfcb10e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setprivexec.s
@@ -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
index 0000000..edc8f40
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setquota.s
@@ -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
index 0000000..36796f0
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setrlimit.s
@@ -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
index 0000000..793019c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setsid.s
@@ -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
index 0000000..a5eb732
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setsockopt.s
@@ -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
index 0000000..322876f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/settimeofday.s
@@ -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
index 0000000..d9d5dff
--- /dev/null
+++ b/sys.subproj/ppc.subproj/setuid.s
@@ -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
index 0000000..28c8418
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shm_open.s
@@ -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
index 0000000..514dbf9
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shm_unlink.s
@@ -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
index 0000000..f0752cc
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shmat.s
@@ -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
index 0000000..ef50a7f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shmctl.s
@@ -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
index 0000000..ca48fc6
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shmdt.s
@@ -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
index 0000000..c9237ed
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shmget.s
@@ -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
index 0000000..846b113
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shmsys.s
@@ -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
index 0000000..65970a1
--- /dev/null
+++ b/sys.subproj/ppc.subproj/shutdown.s
@@ -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
index 0000000..1e28861
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sigaltstack.s
@@ -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
index 0000000..8da6e14
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sigpending.s
@@ -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
index 0000000..2f7f0f3
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sigreturn.s
@@ -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
index 0000000..db1141a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/socket.s
@@ -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
index 0000000..55e96dc
--- /dev/null
+++ b/sys.subproj/ppc.subproj/socketpair.s
@@ -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
index 0000000..4b731d4
--- /dev/null
+++ b/sys.subproj/ppc.subproj/stat.s
@@ -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
index 0000000..e2833c3
--- /dev/null
+++ b/sys.subproj/ppc.subproj/statfs.s
@@ -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
index 0000000..1979fea
--- /dev/null
+++ b/sys.subproj/ppc.subproj/statv.s
@@ -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
index 0000000..b6af343
--- /dev/null
+++ b/sys.subproj/ppc.subproj/swapon.s
@@ -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
index 0000000..9c8bb6e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/symlink.s
@@ -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
index 0000000..308892e
--- /dev/null
+++ b/sys.subproj/ppc.subproj/sync.s
@@ -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
index 0000000..fec2d28
--- /dev/null
+++ b/sys.subproj/ppc.subproj/syscall.s
@@ -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
index 0000000..6c24f1c
--- /dev/null
+++ b/sys.subproj/ppc.subproj/table.s
@@ -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
index 0000000..0b43058
--- /dev/null
+++ b/sys.subproj/ppc.subproj/truncate.s
@@ -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
index 0000000..b5b594b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/umask.s
@@ -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
index 0000000..d26927f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/undelete.s
@@ -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
index 0000000..ef6071a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/unlink.s
@@ -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
index 0000000..20e114b
--- /dev/null
+++ b/sys.subproj/ppc.subproj/unmount.s
@@ -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
index 0000000..f3695ba
--- /dev/null
+++ b/sys.subproj/ppc.subproj/ur_cthread.s
@@ -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
index 0000000..abb5f14
--- /dev/null
+++ b/sys.subproj/ppc.subproj/utimes.s
@@ -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
index 0000000..6a3277a
--- /dev/null
+++ b/sys.subproj/ppc.subproj/vfork.s
@@ -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
index 0000000..56c6921
--- /dev/null
+++ b/sys.subproj/ppc.subproj/wait4.s
@@ -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
index 0000000..ef0833d
--- /dev/null
+++ b/sys.subproj/ppc.subproj/write.s
@@ -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
index 0000000..499ce7f
--- /dev/null
+++ b/sys.subproj/ppc.subproj/writev.s
@@ -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
index 0000000..9d09d20
--- /dev/null
+++ b/sys.subproj/sem_close.2
@@ -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
index 0000000..582bb25
--- /dev/null
+++ b/sys.subproj/sem_open.2
@@ -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
index 0000000..8f2b285
--- /dev/null
+++ b/sys.subproj/sem_post.2
@@ -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
index 0000000..c0db675
--- /dev/null
+++ b/sys.subproj/sem_trywait.2
@@ -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
index 0000000..785862d
--- /dev/null
+++ b/sys.subproj/sem_unlink.2
@@ -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
index 0000000..db5a1b8
--- /dev/null
+++ b/sys.subproj/sem_wait.2
@@ -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
index 0000000..24dac52
--- /dev/null
+++ b/sys.subproj/shm_open.2
@@ -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
index 0000000..a2a2191
--- /dev/null
+++ b/sys.subproj/shm_unlink.2
@@ -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
index 0000000..5f57366
--- /dev/null
+++ b/sys.subproj/sigaction.c
@@ -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
index 0000000..2e19f89
--- /dev/null
+++ b/sys.subproj/sigcatch.c
@@ -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
index 0000000..cf7ef81
--- /dev/null
+++ b/sys.subproj/sigcatch.h
@@ -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
index 0000000..2407eb6
--- /dev/null
+++ b/sys.subproj/sigprocmask.c
@@ -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
index 0000000..dcc65be
--- /dev/null
+++ b/sys.subproj/sigsuspend.c
@@ -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
index 0000000..407add5
--- /dev/null
+++ b/sys.subproj/sigtramp.c
@@ -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
index 0000000..66f86ea
--- /dev/null
+++ b/threads.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/threads.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/threads.subproj/Makefile.preamble
@@ -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
index 0000000..0fbe5d1
--- /dev/null
+++ b/threads.subproj/PB.project
@@ -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
index 0000000..dfa18a8
--- /dev/null
+++ b/threads.subproj/cprocs.c
@@ -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
index 0000000..901a438
--- /dev/null
+++ b/threads.subproj/cthread_internals.h
@@ -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
index 0000000..5bd7035
--- /dev/null
+++ b/threads.subproj/cthreads.c
@@ -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
index 0000000..6c97927
--- /dev/null
+++ b/threads.subproj/cthreads.h
@@ -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
index 0000000..9a10ba3
--- /dev/null
+++ b/threads.subproj/i386.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/threads.subproj/i386.subproj/Makefile.postamble
@@ -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
index 0000000..6544e5f
--- /dev/null
+++ b/threads.subproj/i386.subproj/Makefile.preamble
@@ -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
index 0000000..a77b649
--- /dev/null
+++ b/threads.subproj/i386.subproj/PB.project
@@ -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
index 0000000..ee31e52
--- /dev/null
+++ b/threads.subproj/i386.subproj/thread.c
@@ -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
index 0000000..65a60a4
--- /dev/null
+++ b/threads.subproj/lu_utils.c
@@ -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
index 0000000..1cf0f63
--- /dev/null
+++ b/threads.subproj/mig_support.c
@@ -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
index 0000000..62e6941
--- /dev/null
+++ b/threads.subproj/ppc.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/threads.subproj/ppc.subproj/Makefile.postamble
@@ -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
index 0000000..7211b2b
--- /dev/null
+++ b/threads.subproj/ppc.subproj/Makefile.preamble
@@ -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
index 0000000..49e45ce
--- /dev/null
+++ b/threads.subproj/ppc.subproj/PB.project
@@ -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
index 0000000..587b938
--- /dev/null
+++ b/threads.subproj/threads_data.c
@@ -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
index 0000000..f9b0874
--- /dev/null
+++ b/util.subproj/Makefile
@@ -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
index 0000000..411cde6
--- /dev/null
+++ b/util.subproj/Makefile.postamble
@@ -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
index 0000000..c1624b4
--- /dev/null
+++ b/util.subproj/Makefile.preamble
@@ -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
index 0000000..87e4046
--- /dev/null
+++ b/util.subproj/PB.project
@@ -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
index 0000000..8720a25
--- /dev/null
+++ b/util.subproj/login.c
@@ -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
index 0000000..e172a2b
--- /dev/null
+++ b/util.subproj/login_tty.c
@@ -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
index 0000000..6c7be20
--- /dev/null
+++ b/util.subproj/logout.c
@@ -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
index 0000000..4e573a6
--- /dev/null
+++ b/util.subproj/logwtmp.c
@@ -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
index 0000000..8c9fc0e
--- /dev/null
+++ b/util.subproj/pty.c
@@ -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);
+}
-- 
2.45.2