[comp.os.minix] Undeliverable mail

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 09:50 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3164 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 09:50 PST
Received: by NDSUVM1 (Mailer X1.24) id 3117; Fri, 18 Dec 87 11:13:08 CST
Date: 17 Dec 87 17:48:35 GMT
From: Freeman Pascal <ncpascal@ndsuvax.uucp>
Subject: Bug in my ttyname(3)!
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

Hello,
    In my past posting for tty(1) I inadvertently allowed a bug to get
past me.  Here are the diffs to fix ttyname(3).  The ttyname(3) I posted
will work only because of the way U**X and MINIX set up their directory
structure and where they place their devices.  This fix will check if
the devices are also the same and keep ttyname() honest.

                Freeman P. Pascal IV
                ncpascal@ndsuvax

--------------------------  Cut here for diff  -------------------------------

64c64,65
<     if ( dev_stat.st_ino == fd_stat.st_ino ) {
---
>     if (( dev_stat.st_ino == fd_stat.st_ino ) &&
>         (dev_stat.st_dev == fd_stat.st_dev)) {

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 10:04 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 2998 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 10:04 PST
Received: by NDSUVM1 (Mailer X1.24) id 2903; Fri, 18 Dec 87 11:10:02 CST
Date: 17 Dec 87 05:39:19 GMT
From: Freeman Pascal <ncpascal@ndsuvax.uucp>
Subject: tty utility and ttyname(3) library call for MINIX
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

Hello,
     This is a little utility that I wrote when I first started to use
MINIX.  It behaves just like tty(1) for UNIX.  In writing it I also
needed to write ttyname(3) library call.  I hope both the tty(1) and
ttyname(3) is usefile.  Just follow the instructions in the "INSTALL"
file and enjoy.

                Freeman P. Pascal IV
                ncpascal@ndsuvax


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#        "End of archive 1 (of 1)."
# Contents:  INSTALL Makefile makelibc tty.c ttyname.c
# Wrapped by ncpascal@ndsuvax on Wed Dec 16 23:30:02 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f INSTALL -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"INSTALL\"
else
echo shar: Extracting \"INSTALL\" \(692 characters\)
sed "s/^X//" >INSTALL <<'END_OF_INSTALL'
XManifest:
X--------
X    Makefile    makefile for tty
X    makelibc    shell script to make C library
X    tty.c        utility to return tty name
X    ttyname.c    library function to return tty name (see ttyname(3))
X
XInstallation instructions:
X-------------------------
X
X1.  Compile ttyname.c as a library routine and place in /usr/lib/libc.a.
X    If you are using the makelibc shell script that was posted quite
X    awhile back just append "ar av ttyname.s" to the beginning and run.
X    I am including my version if you don't have it.
X
X2.  Run makefile to compile tty.c.  It will automatically locate "tty" in
X    the /usr/bin direcory, set it's mode to "r-xr-xr-x" (555), and set it's
X    stack size to 1k.
X
X3.  Enjoy
END_OF_INSTALL
if test 692 -ne `wc -c <INSTALL`; then
    echo shar: \"INSTALL\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f Makefile -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(229 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X#    Makefile for /usr/bin/tty
X#
XCFLAGS= -T. -i -O
XDEST= /usr/bin
XMODE= 555
XMEMSIZ= 1024
X
X$(DEST)/tty:    tty.c
X    cc $(CFLAGS) -o $(DEST)/tty tty.c
X    @chmod $(MODE) $(DEST)/tty
X    @chmem =$(MEMSIZ) $(DEST)/tty >/dev/null
X    @echo "done."
X
END_OF_Makefile
if test 229 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f makelibc -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"makelibc\"
else
echo shar: Extracting \"makelibc\" \(2053 characters\)
sed "s/^X//" >makelibc <<'END_OF_makelibc'
X#
X#  makelibc - Make C library
X#
X#                - NOTE -
X#
X#  This shell script will -REMOVE- the old version of libc.a if it
X#  exists in the current directory.  It will also -REPLACE- the old
X#  /usr/lib/libc.a with version just packaged.
X#
Xif (test -f ./libc.a)        # remove old libc.a if it exists
X    then rm ./libc.a
Xfi
Xar av libc.a getgrp.s                    # process groups
Xar av libc.a termcap.s gtty.s stty.s            # v1.2 update
Xar av libc.a popen.s ctime.s system.s qsort.s        # v1.2 upgrade
Xar av libc.a regexp.s regsub.s
Xar av libc.a getopt.s getgrent.s getpwent.s crypt.s
Xar av libc.a ttyname.s
Xar av libc.a fdopen.s
Xar av libc.a fgets.s fprintf.s fputs.s fread.s freopen.s fclose.s
Xar av libc.a fopen.s fseek.s ftell.s fwrite.s gets.s scanf.s getc.s printdat.s
Xar av libc.a fflush.s setbuf.s sprintf.s doprintf.s putc.s ungetc.s strcmp.s
Xar av libc.a access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s
Xar av libc.a exec.s exit.s cleanup.s fork.s isatty.s fstat.s getegid.s getenv.
s
Xar av libc.a geteuid.s getgid.s getpass.s close.s getuid.s ioctl.s kill.s
Xar av libc.a link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s
Xar av libc.a getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s
Xar av libc.a setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s
Xar av libc.a stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s
Xar av libc.a ftime.s
Xar av libc.a sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s
Xar av libc.a stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s
Xar av libc.a printk.s abort.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy.
s
Xar av libc.a getutil.s rand.s rindex.s adi.s and.s cii.s cms.s cmu4.s com.s
Xar av libc.a csa2.s csb2.s cuu.s .dup.s dvi.s dvi4.s dvu.s dvu4.s exg.s fakfp.
s
Xar av libc.a gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli.s mli4.s
Xar av libc.a ngi.s nop.s rck.s rmi.s rmi4.s rmu.s rmu4.s rol.s ror.s sar2.s
Xar av libc.a sbi.s set.s sli.s sri.s sti.s xor.s error.s unknown.s trp.s
Xar av libc.a setjmp.s
X
Xcp libc.a /usr/lib
Xecho
Xecho "Done."
Xecho
X
END_OF_makelibc
if test 2053 -ne `wc -c <makelibc`; then
    echo shar: \"makelibc\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f tty.c -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"tty.c\"
else
echo shar: Extracting \"tty.c\" \(437 characters\)
sed "s/^X//" >tty.c <<'END_OF_tty.c'
X/*
X * tty.c - Return tty name
X *
X * Freename P. Pascal IV
X *
X */
X/*
X *  History:
X *
X *    31 July 87    fpp    Creation
X */
X#include <stdio.h>
X
Xchar    *ttyname();
X
Xmain(argc, argv)
Xint  argc;
Xchar *argv[];
X{
X  char *tty_name;
X
X  tty_name = ttyname( 0 );
X  if(( argc == 2 ) && ( !strcmp(argv[1], "-s") ))
X    /* do nothing - shhh! we're in silent mode */;
X  else
X    printf("%s\n", ((tty_name) ? tty_name : "not a tty"));
X  exit((tty_name) ? 0 : 1 );
X}
X
END_OF_tty.c
if test 437 -ne `wc -c <tty.c`; then
    echo shar: \"tty.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f ttyname.c -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"ttyname.c\"
else
echo shar: Extracting \"ttyname.c\" \(1517 characters\)
sed "s/^X//" >ttyname.c <<'END_OF_ttyname.c'
X/*
X *  char  *tty_name( fd )
X *    FILE  fd;
X *
X *  EFFECTS:
X *
X *       returns the path to the tty DEVice referenced by 'fd'.
X *  if 'fd' does not reference a tty a NULL is returned.
X */
X#include <sys/file.h>
X#include <sys/types.h>
X#include <sys/dir.h>
X#include <sys/stat.h>
X
X#define    STDIN        0
X#define    NULL        0
X#define DEV_PATH    "/dev/"
X
Xchar    *strcpy();
Xchar    *strcat();
Xchar    *ttyname();
X
Xchar  *ttyname(fd)
X  register    fd;
X{
X  struct stat        fd_stat, dev_stat;
X  static char        buf[40];
X  struct direct        dir;
X  register        dev_fd;
X
X  if (!isatty(fd))                /* is fd a tty?     */
X    return( NULL );
X
X  if (fstat(fd, &fd_stat) < 0)             /* get tty status     */
X    return( NULL );
X
X  if (( fd_stat.st_mode & S_IFMT ) != S_IFCHR)    /* is it a char device?    *
/
X    return( NULL );
X
X  if (( dev_fd = open( DEV_PATH, O_RDONLY) ) < 0) {
X    perror( DEV_PATH );
X    return( NULL );
X  }
X
X  /*
X   *  read throuh /dev/ and look at each entry an compare.  If the inode
X   *  equal then we have found our match.  else continue looking
X   */
X  while ( read(dev_fd, &dir, sizeof(dir) )) {
X    if (dir.d_ino == NO_ENTRY)        /* there's no file here */
X        continue;
X    if (dir.d_ino != fd_stat.st_ino)
X        continue;
X
X    strcpy( buf, DEV_PATH );        /* build new device name */
X    strcat( buf, dir.d_name );
X    if ( stat( buf, &dev_stat ) < 0 ) {    /* get device status    */
X        perror( buf );
X        continue;
X    }
X    /*
X     *    if the inodes match we have found our tty.
X     */
X    if ( dev_stat.st_ino == fd_stat.st_ino ) {
X        close( dev_fd );
X        return( buf );
X    }
X  }
X  close( dev_fd );
X  return( NULL );
X}
END_OF_ttyname.c
if test 1517 -ne `wc -c <ttyname.c`; then
    echo shar: \"ttyname.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
    MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 1 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 10:22 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 2697 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 10:21 PST
Received: by NDSUVM1 (Mailer X1.24) id 2651; Fri, 18 Dec 87 11:03:59 CST
Date: 17 Dec 87 05:17:23 GMT
From: Freeman Pascal <ncpascal@ndsuvax.uucp>
Subject: Directory(3) library calls for MINIX
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

Hello,
    Here I am again.  This time I have the directory(3) library calls.
I have followed the BSD description as closely as the BSD 4.3 PRM allows
me to (some entries have so little info in them).  I hope they can be
of some use.

                N O T E
                -------

     I would not suggest using these routines if you already have a tried
and tested set of directory functions that work for you.  Use these as a
last resort (I have such confidence in my code).  I know the readdir(),
opendir(), and closedir() work properly.  Although, I had to make some
assumptions on how to implement telldir() and seekdir().  I basicly decided
to pass and returned what was needed for the lseek() call.  I hope this
was correct. If anyone knows the correct specs on these calls or know
where to point me to please do.  Enjoy.

                Freeman P. Pascal IV
                ncpascal@ndsuvax

# /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#        "End of archive 1 (of 1)."
# Contents:  INSTALL Makefile dir.c dir.h makelibc tst.c
# Wrapped by ncpascal@ndsuvax on Wed Dec 16 22:27:00 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f INSTALL -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"INSTALL\"
else
echo shar: Extracting \"INSTALL\" \(1907 characters\)
sed "s/^X//" >INSTALL <<'END_OF_INSTALL'
XManifest:
X--------
X    INSTALL        this file
X    Makefile    makefile for tty
X    makelibc    shell script to make C library
X    tst.c        test file for directory(3)
X    dir.c        library function to return tty name (see directory(3))
X
XInstallation instructions:
X-------------------------
X
X1.  install dir.h in /usr/include/sys.
X
X2.  Add "typedef unshort ino_t" or "#define ino_t inode_nr" to
X    /usr/include/sys/types.h depending on your thinking how this
X    declaration should be handled.
X
X3.  Compile dir.c as a library routine and place in /usr/lib/libc.a.
X    If you are using the makelibc shell script that was posted quite
X    awhile back just append "ar av libc.a dir.s" to the beginning and run.
X    I am including my version if you don't have it.
X
X4.  Run makefile to compile tst.c and run it to test directory(3).
X
X5.  Enjoy
X
XNotes:
X-----
X
X    I'm not sure on the exact operations performed by telldir() and
Xseekdir().  I set up telldir() to return the current position (long int
Xlike seek()) within the opened directory.  Seekdir() was set up likewise,
Xit will set the file postion within the opened directory without regard
Xif it entry boundries or if the entry is active (d_ino entry is non-zero).
X
X    In all actuality, I would suggest that if you use the POSIX version of
Xdirectory(3) that came across the net lately.  At the time I wrote these
Xroutines I was attempting to get the BSD version of arc to work under MINIX.
XI am now leaning towards using the POSIX implementation.  I am including
Xthese only for the sake of completeness for my scandir(3) routines I'm also
Xposting.
X
X    I must also state I don't garentee that theses routines work correctly.
XI have tested them and found them to work as I need them to.  I would
Xsuggest you run them through your own tests to decide if they work for
Xyour own purposes.  (Gee - I have such confidence in my own code :-)
X
X                Freeman P. Pascal IV
X                ncpascal@ndsuvax
END_OF_INSTALL
if test 1907 -ne `wc -c <INSTALL`; then
    echo shar: \"INSTALL\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f Makefile -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(125 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
XCFLAGS=-T. -i
X
Xall:    tst dir.s
X
Xtst:    tst.s dir.s
X    @cc -o tst $(CFLAGS) tst.s dir.s
X    @echo "Done."
X
Xtst.s:    tst.c
X
Xdir.s:    dir.c
END_OF_Makefile
if test 125 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dir.c -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"dir.c\"
else
echo shar: Extracting \"dir.c\" \(3423 characters\)
sed "s/^X//" >dir.c <<'END_OF_dir.c'
X/*
X *    dirs.c    - BSD 4.x compatible directory functions
X *
X *    Freeman P. Pascal IV
X */
X/*
X *  History:
X *
X *    04 Dec 87    fpp    Creation
X */
X#include    <errno.h>
X#include    <sys/types.h>
X#include    <sys/dir.h>
X#include    <sys/stat.h>
X#include    <sys/file.h>
X
X#ifndef VOID
X#define    VOID    void
X#endif
X
X#ifndef    PUBLIC
X#define PUBLIC
X#endif
X
X#ifndef    NULL
X#define    NULL    0
X#endif
X
X#define    loop    while( 1 )    /* loop forever */
X
Xstruct direct        __dir;
Xextern    int    errno;
X
X/*========================================================================*\
X**                opendir()                  **
X\*========================================================================*/
XPUBLIC DIR *
Xopendir( path )
Xchar     *path;
X{
X/*
X *    Open a directory for reading
X */
X  struct stat    sp;
X  DIR        *dirp;
X
X  if (( dirp = (DIR *) malloc( sizeof( DIR ))) == (DIR *) NULL ) {
X    errno = ENOMEM;
X    return( NULL );
X  }
X  if (( dirp->dd_fd = open( path, O_RDONLY )) == -1  ) {
X#ifdef    DIR_DEBUG
X    perror( "opendir() (open)" );
X#endif
X    return( NULL );
X  }
X  if ( fstat( dirp->dd_fd, &sp ) == -1 ) {
X#ifdef    DIR_DEBUG
X    perror( "opendir() (fstat)" );
X#endif
X    return( NULL );
X  }
X  dirp->dd_loc = 0;
X  return( dirp );
X}
X
X/*========================================================================*\
X**                readdir()                  **
X\*========================================================================*/
XPUBLIC struct direct *
Xreaddir( dirp )
Xregister DIR    *dirp;
X{
X/*
X *    Read and return the next directory structure
X *    referenced by *dirp
X */
X  register struct direct    *dp;
X
X  loop {
X    if (dirp->dd_loc == 0) {
X        dirp->dd_size = read( dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ );
X        if (dirp->dd_size <= 0)
X            return( NULL );
X    }
X    if (dirp->dd_loc >= dirp->dd_size) {
X        dirp->dd_loc = 0;        /* reload buffer */
X        continue;
X    }
X    dp = (struct direct *) (dirp->dd_buf + dirp->dd_loc);
X    dirp->dd_loc += sizeof( struct direct );
X    if (dp->d_ino == 0)
X        continue;            /* skip empty entries */
X    __dir.d_ino = dp->d_ino;
X    strncpy( __dir.d_name, dp->d_name, DIRSIZ );
X    __dir.d_name[ DIRSIZ ] = '\0';
X    return( &__dir );
X  }
X}
X
X/*========================================================================*\
X**                telldir()                  **
X\*========================================================================*/
XPUBLIC long
Xtelldir( dirp )
XDIR    *dirp;
X{
X/*
X *     Return current position within directory stream.
X */
X return( lseek( dirp->dd_fd, 0L, L_INCR ));
X}
X
X/*========================================================================*\
X**                seekdir()                  **
X\*========================================================================*/
XPUBLIC int
Xseekdir( dirp, loc )
XDIR    *dirp;
Xlong    loc;
X{
X/*
X *    Set position within directory stream.
X */
X  long    pos;
X
X  dirp->dd_loc = 0;        /* force readdir() read into dd_buf */
X  return( lseek( dirp->dd_fd, loc, L_SET ));
X}
X
X/*========================================================================*\
X**                rewinddir()                  **
X\*========================================================================*/
XPUBLIC int
Xrewinddir( dirp )
XDIR    *dirp;
X{
X/*
X *    Resets the position of the directory stream to the beginning.
X */
X return( seekdir( dirp, 0L ));
X}
X
X/*========================================================================*\
X**                closedir()                  **
X\*========================================================================*/
XPUBLIC int
Xclosedir( dirp )
XDIR    *dirp;
X{
X/*
X *    Close given directory and free memory used by *dirp
X */
X  close( dirp->dd_fd );
X  free(( char * ) dirp );
X  return( 0 );
X}
X
END_OF_dir.c
if test 3423 -ne `wc -c <dir.c`; then
    echo shar: \"dir.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dir.h -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"dir.h\"
else
echo shar: Extracting \"dir.h\" \(741 characters\)
sed "s/^X//" >dir.h <<'END_OF_dir.h'
X/*
X *  dir.h
X *
X *  Minix directory structures
X *
X */
X/*
X *  History:
X *
X *    16 Dec  87    fpp    Changed type of d_ino in direct structure
X *                from "inode_nr" (from orginal types.h)
X *                to "ino_t" (added to types.h for compatibl-
X *                ity)
X *    29 July 87    fpp    Creation
X */
X#define    DIRSIZ        14
X#define    DIRBLKSIZ    512        /* read this much in at a time    */
X
Xstruct    direct {
X  ino_t        d_ino;            /* inode of file        */
X  char        d_name[ DIRSIZ ];    /* file name            */
X};
X
Xtypedef struct _dirdesc
X{
X  int        dd_fd;            /* directory file descriptor    */
X  long        dd_loc;            /* current location in dd_buf    */
X  long        dd_size;        /* size of last read        */
X  char        dd_buf[ DIRBLKSIZ ];    /* read buffer             */
X
X} DIR;
X
XDIR        *opendir();
Xstruct direct    *readdir();
Xlong        telldir();
X
END_OF_dir.h
if test 741 -ne `wc -c <dir.h`; then
    echo shar: \"dir.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f makelibc -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"makelibc\"
else
echo shar: Extracting \"makelibc\" \(2138 characters\)
sed "s/^X//" >makelibc <<'END_OF_makelibc'
X#
X#  makelibc - Make C library
X#
X#                - NOTE -
X#
X#  This shell script will -REMOVE- the old version of libc.a if it
X#  exists in the current directory.  It will also -REPLACE- the old
X#  /usr/lib/libc.a with version just packaged.
X#
Xif (test -f ./libc.a)        # remove old libc.a if it exists
X    then rm ./libc.a
Xfi
Xar av libc.a getwd.s rename.s            # getwd(3) rename(2)
Xar av libc.a dir.s scandir.s            # directory(3), scandir(3)
Xar av libc.a getgrp.s                # process groups
Xar av libc.a termcap.s gtty.s stty.s        # v1.2 update
Xar av libc.a popen.s ctime.s system.s qsort.s    # v1.2 upgrade
Xar av libc.a regexp.s regsub.s
Xar av libc.a getopt.s getgrent.s getpwent.s crypt.s
Xar av libc.a fdopen.s
Xar av libc.a fgets.s fprintf.s fputs.s fread.s freopen.s fclose.s
Xar av libc.a fopen.s fseek.s ftell.s fwrite.s gets.s scanf.s getc.s printdat.s
Xar av libc.a fflush.s setbuf.s sprintf.s doprintf.s putc.s ungetc.s strcmp.s
Xar av libc.a access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s
Xar av libc.a exec.s exit.s cleanup.s fork.s isatty.s fstat.s getegid.s getenv.
s
Xar av libc.a geteuid.s getgid.s getpass.s close.s getuid.s ioctl.s kill.s
Xar av libc.a link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s
Xar av libc.a getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s
Xar av libc.a setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s
Xar av libc.a stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s
Xar av libc.a ftime.s
Xar av libc.a sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s
Xar av libc.a stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s
Xar av libc.a printk.s abort.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy.
s
Xar av libc.a getutil.s rand.s rindex.s adi.s and.s cii.s cms.s cmu4.s com.s
Xar av libc.a csa2.s csb2.s cuu.s .dup.s dvi.s dvi4.s dvu.s dvu4.s exg.s fakfp.
s
Xar av libc.a gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli.s mli4.s
Xar av libc.a ngi.s nop.s rck.s rmi.s rmi4.s rmu.s rmu4.s rol.s ror.s sar2.s
Xar av libc.a sbi.s set.s sli.s sri.s sti.s xor.s error.s unknown.s trp.s
Xar av libc.a setjmp.s
X
Xcp libc.a /usr/lib
Xecho
Xecho "Done."
Xecho
X
END_OF_makelibc
if test 2138 -ne `wc -c <makelibc`; then
    echo shar: \"makelibc\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f tst.c -a "${1}" != "-c" ; then
  echo shar: Will not over-write existing file \"tst.c\"
else
echo shar: Extracting \"tst.c\" \(765 characters\)
sed "s/^X//" >tst.c <<'END_OF_tst.c'
X#include    <sys/types.h>
X#include    <sys/dir.h>
X
X#define NULL        (DIR *) 0
X#define    PRDIR( dp )    printf( "%14s\t%d\n", dp->d_name, dp->d_ino )
X
Xmain()
X{
X  DIR        *dirp;
X  struct direct *dp;
X
X  if (( dirp = opendir( "." ) ) == NULL ) {
X    perror( "\".\"" );
X    exit( 1 );
X  }
X  while(( dp = readdir( dirp )) != NULL )
X    PRDIR( dp );
X
X  prints( "\nseekdir: " );
X  seekdir( dirp, 45 ); dp = readdir( dirp ); PRDIR( dp );
X
X  printf( "\ntelldir():  %20s  %D\n", dp->d_name, telldir( dirp ));
X
X  prints( "\nrewind(): " );
X  rewinddir( dirp ); dp = readdir( dirp ); PRDIR( dp );
X
X  printf( "\ntelldir():  %20s  %D\n", dp->d_name, telldir( dirp ));
X
X  prints( "\nseekdir: " );
X  seekdir( dirp, 4 * sizeof( struct direct ));
X  dp = readdir( dirp ); PRDIR( dp );
X
X  closedir( dirp );
X}
END_OF_tst.c
if test 765 -ne `wc -c <tst.c`; then
    echo shar: \"tst.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
    MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 1 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 10:34 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3956 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 10:33 PST
Received: by NDSUVM1 (Mailer X1.24) id 3914; Fri, 18 Dec 87 12:15:33 CST
Date: 18 Dec 87 16:35:15 GMT
From: Jim Paradis <paradis@encore.uucp>
Subject: Update on TTY driver
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

The recent posting on the subject of message-sending deadlocks
prompted me to take a second look at my serial TTY driver.  Sure
enough, that's what was causing my system hangs.  Apparently,
the RESUME message to the filesystem (sent out of interrupt service
when we get enough characters to satisfy a read request) was
occasionally colliding with a READ, WRITE, or IOCTL message being
sent from the filesystem to the TTY driver.  Now, I have to figure
out a workaround...

   +----------------+  Jim Paradis                  linus--+
+--+-------------+  |  Encore Computer Corp.       necntc--|
|  | E N C O R E |  |  257 Cedar Hill St.           ihnp4--+-encore!paradis
|  +-------------+--+  Marlboro MA 01752           decvax--|
+----------------+     (617) 460-0500             talcott--+
...coated with sesame seeds, and garnished with lark's vomit!

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 12:13 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 6017 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 12:13 PST
Received: by NDSUVM1 (Mailer X1.24) id 5986; Fri, 18 Dec 87 14:02:59 CST
Date: 18 Dec 87 06:19:18 GMT
From: Erik_A_Kane@cup.portal.com
Subject: Minix on an IBM Convertible (laptop)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

I have a friend attempting to run Minix 1.2 on an IBM Convertible
(laptop). If anyone has any experience/comments/suggestions in
this area I'm sure he would appreciate it. Apparently he is getting
unexpected traps while loading the root file system.

Erik Kane

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 12:25 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 6295 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 12:25 PST
Received: by NDSUVM1 (Mailer X1.24) id 6257; Fri, 18 Dec 87 14:12:03 CST
Date: 18 Dec 87 18:38:45 GMT
From: Bing Bang <bing@galbp.lbp.harris.com>
Subject: Re: Problems with serial TTY driver
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In article <2314@encore.UUCP> paradis@encore.UUCP (Jim Paradis) writes:
>After many weeks of not quite being able to get around to it,
>I finally added serial line support to my rewritten MINIX TTY
>driver.  It works, but there's one serious problem: If I test
>it out by looping back transmit and receive on the serial line
>and running a quick&dirty terminal program, if I type at it
>too fast the system will hang.  Now, I remember someone else in
>this newsgroup sometime back who added serial capabilities to
>the stock TTY driver and ended up with the same problem.  Is there

well, i'm glad i'm not the only one having this problem. i've been trying
to track this problem down for months. maybe we can team up. here's what
i know of the problem. in tty_task, the message structure tty_mess is
declared so that it is allocated on the stack. the problem seems to be that
some routine corrupts 6 or 8 bytes just below the address of the structure.
this of course usually contains the reuturn address and stuff from the
receive() call tty_task makes. i know the corruption is relative to the
structure address becuse i can make other declarations in tty_task to move
the location of the structure. the problem can be "solved" by allocating
a char array just below the structure, although memory in the array still
get corrupted. i do not care for this solution.


--
Bing H. Bang           +----------------------------------------------------+
Harris/Lanier          |MSDOS and OS/2 (whenever it gets here): just say no.|
Atlanta GA             +----------------------------------------------------+

Postmaster@locke.bitnet (PMDF Mail Server) (12/19/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Fri, 18 Dec 87 20:00 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0600 for
 MINIX@UWALOCKE; Fri, 18 Dec 87 20:00 PST
Received: by NDSUVM1 (Mailer X1.24) id 0566; Fri, 18 Dec 87 21:56:29 CST
Date: 19 Dec 87 03:25:04 GMT
From: SERETNY%HARTFORD.BITNET@cunyvm.cuny.edu
Subject: Anyone trying to reach me...
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments:     Warning -- original Sender: tag was mmdf@UDEL.EDU
Comments: To: info-minix@UDEL.EDU


        If there is anyone who wishes to respond to my request earlier
about using MINIX on a PDP-11/40, please e-mail me at SERETNY@HARTFORD.Bitnet
        I am leaving for xmas break, and have temporarily signed off from
all the list groups until January...  Thanks.
                                Robert M. Seretny

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 08:55 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3692 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 08:55 PST
Received: by NDSUVM1 (Mailer X1.24) id 3641; Sat, 19 Dec 87 10:52:54 CST
Date: 18 Dec 87 22:04:32 GMT
From: Bing Bang <bing@galbp.lbp.harris.com>
Subject: Re: Deadlock in Minix
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In article <1064@kulcs.UUCP> bart@kulcs.UUCP (Bart De Decker) writes:
>
>I added the following code to kernel/proc.c.
>It detects a deadlock that arises when two processes (or tasks) try to send
>each other a message at the same time.
>
[dif code]
>
>Not really a solution, but it shows clearly the deadlock problem  ...
>
>-- Bart

long ago, i posted changes to fs and the kernel to solve this problem.
it involved creating a que for messages, so that the sender is never
blocked by not being able to send. of course the messages must be copied
to a system resourced message structure so that the sender can safely re-
use his message structure.


--
Bing H. Bang           +----------------------------------------------------+
Harris/Lanier          |MSDOS and OS/2 (whenever it gets here): just say no.|
Atlanta GA             +----------------------------------------------------+

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 10:40 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 4177 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 10:40 PST
Received: by NDSUVM1 (Mailer X1.24) id 4117; Sat, 19 Dec 87 12:38:24 CST
Date: 18 Dec 87 20:50:24 GMT
From: JohnsonMA <mjohnson@druhi.att.com>
Subject: MINIX on a 68000
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

A few months back there were numerous postings about Beta testers for a
version of MINIX that ran on 68000, Atari ST's in particular.  Would
someone care to update us on how that work is going?  Will the final
product be sold through Prentice-Hall?  Many of us are waiting with
bated breath.

Mark A. Johnson

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 12:37 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 4947 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 12:37 PST
Received: by NDSUVM1 (Mailer X1.24) id 4908; Sat, 19 Dec 87 14:20:30 CST
Date: 19 Dec 87 09:14:10 GMT
From: monty walls <mwalls@unirot.uucp>
Subject: PS for MINIX
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

Enclosed is my implementation of PS for minix.  Please excuse the
strange coding style. PS expects a native minix maintence enviornment(
minix c compiler, asld, ...).  For a cross compiler based minix it
will require some changes.  This version of PS is based on the V7
documentation with some slight changes in the output
for minix.
---------------------cut here ----------------------------------------
echo x - maint.info
gres '^X' '' > maint.info << '/'
XB 71C6 _proc
XB 8216 _aout
XB 3076 _mproc
XB 5CC2 _fproc
/
echo x - maint.sh
gres '^X' '' > maint.sh << '/'
Xgrep '_proc$'  ../kernel/kernel.map >/etc/maint.info
Xgrep _aout  ../kernel/kernel.map >>/etc/maint.info
Xgrep _mproc ../mm/mm.map >>/etc/maint.info
Xgrep _fproc ../fs/fs.map >>/etc/maint.info
Xcat /etc/maint.info
/
echo x - makefile
gres '^X' '' > makefile << '/'
X#    ps needs offsets for
X#    1). proc(kernel)
X#    2). aout(kernel)
X#    3). fproc(fs)
X#    4). mproc(mm)
X#    5). getopts
X#
X#    These do not normally change except after maintence to the
X#    the system(fs,bootblok,mm,kernel) that adds or deletes variables
X#    from working storage.  What I do is maintain an info file containing
X#    the kernel, mm, fs offsets that are automatically generated by making
X#    the system software(examine maint.sh).
X#
X#
X#    ps needs the setuid bit set & 4096 bytes of memory
X#
Xl=/usr/lib
Xi=/usr/include
XCFLAGS=  -Di8088
X
Xpsobj = ps.s psutil.s ps_mm.s ps_k.s ps_fs.s ps_aout.s
Xps:    $(psobj)
X    @asld -T. -o ps $l/crtso.s $(psobj) $l/libaux.a $l/libc.a $l/end.s
X
/
echo x - ps.c
gres '^X' '' > ps.c << '/'
X/*
X * ps: display processes
X *     options:
X *    a: -    wants information about all processes with terminals
X *    l: -    long listing
X *    x: -    even processes with no terminals
X *
X * author:    Monty Walls
X * written:    11/18/87
X * Copyright:    Copyright (c) 1987 by Monty Walls.
X *        Not derived from licensed software.
X *
X *        Permission to copy and/or distribute granted under the
X *        following conditions:
X *
X *        1). This notice must remain intact.
X *        2). The author is not responsible for the consequences of use
X *            this software, no matter how awful, even if they
X *            arise from defects in it.
X *        3). Altered version must not be represented as being the
X *            original software.
X *
X * change log:
X *
X * mrw(12/1/87)    -    1) changed method for determining offsets for
X *               kernel(aout, proc), mm(mproc), fs(fproc).
X *               now we read it from file(no longer maintence
X *               level dependent).
X */
X
X#include "/usr/src/h/const.h"
X#include "/usr/src/h/type.h"
X#include "/usr/src/h/callnr.h"
X#include "/usr/src/h/com.h"
X#include "/usr/src/h/error.h"
X#include "/usr/src/kernel/const.h"
X#include "/usr/src/kernel/type.h"
X#include "/usr/src/kernel/glo.h"
X#include "/usr/src/kernel/proc.h"
X
X#include <stdio.h>
X#include "ps.h"
X
Xint errflag = 0;
Xlong _aout, _kproc, _mproc, _fproc;
Xlong mm_offset, fs_offset;
X
Xextern int getopt(), ps_k();
Xextern int ps_fs(), ps_mm();
Xextern int print_ps();
Xextern long getlong(), getblock();
Xextern FILE *fopen();
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X    FILE *fd;
X    int c, n, opt = 0;
X    unsigned ptr;
X    struct proc fs_proc, mm_proc;
X    struct process_status p;
X    char seg_flag[2];
X    char verify_name[MAXSTR];
X
X    while ((c = getopt(argc, argv, OPTIONS)) != EOF) {
X        switch (c) {
X            case 'a':
X                opt |= ALL;
X                break;
X            case 'l':
X                opt |= VERBOSE;
X                break;
X            case 'x':
X                opt |= TERMINALS;
X                break;
X            case '?':
X            default:
X                errflag++;
X                break;
X        }
X    }
X    if (errflag) {
X        fprintf(stderr,"USAGE: %s [-%s ]\n",argv[0],OPTIONS);
X        exit(2);
X    }
X    if ((fd = fopen(MAINT_INFO,"r")) != NULL) {
X        /* get maintence dependent kernel info or panic */
X        if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) {
X            if (strcmp(PROC,verify_name)) {
X                fprintf(stderr,"ERROR: %s - invalid specification for proc(%s)
 in %s\n", argv[0], verify_name, MAINT_INFO);
X                exit(1);
X            }
X            else
X                _kproc = ptr + KERNELBASE;
X        }
X        else {
X            fprintf(stderr,"ERROR: %s - EOF on scanning kernel info in %s\n",
 argv[0], MAINT_INFO);
X            exit(1);
X        }
X        if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) {
X            if (strcmp(AOUT,verify_name)) {
X                fprintf(stderr,"ERROR: %s - invalid specification for aout(%s)
 in %s\n", argv[0], verify_name, MAINT_INFO);
X                exit(1);
X            }
X            else
X                _aout = ptr + KERNELBASE;
X        }
X        else {
X            fprintf(stderr,"ERROR: %s - EOF on scanning kernel info in %s\n",
 argv[0], MAINT_INFO);
X            exit(1);
X        }
X        /* get maintence dependent mm info or panic */
X        if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) {
X            if (strcmp(MPROC,verify_name)) {
X                fprintf(stderr,"ERROR: %s - invalid specification for mproc(%s
)
 in %s\n", argv[0], verify_name, MAINT_INFO);
X                exit(1);
X            }
X            else
X                _mproc = ptr;
X        }
X        else {
X            fprintf(stderr,"ERROR: %s - EOF on scanning MM info in %s\n",
 argv[0], MAINT_INFO);
X            exit(1);
X        }
X        /* get maintence dependent fs info or panic */
X        if (fscanf(fd, "%1s %x %s", seg_flag, &ptr, verify_name) == 3) {
X            if (strcmp(FPROC,verify_name)) {
X                fprintf(stderr,"ERROR: %s - invalid specification for fproc(%s
)
 in %s\n", argv[0], verify_name, MAINT_INFO);
X                exit(1);
X            }
X            else
X                _fproc = ptr;
X        }
X        else {
X            fprintf(stderr,"ERROR: %s - EOF on scanning FS info in %s\n",
 argv[0], MAINT_INFO);
X            exit(1);
X        }
X        fclose(fd);
X    }
X    else {
X        fprintf(stderr,"ERROR: %s could not open %s\n",argv[0],MAINT_INFO);
X        exit(1);
X    }
X
X    if ((fd = fopen(KERNEL,"r")) != NULL) {
X        /* compute the mem offsets for mm and fs */
X        getblock(fd, _kproc+(MM_SLOT)*sizeof(struct proc), &mm_proc, sizeof
(struct proc));
X        getblock(fd, _kproc+(FS_SLOT)*sizeof(struct proc), &fs_proc, sizeof
(struct proc));
X        mm_offset = _mproc+mm_proc.p_map[D].mem_phys*CLICK_SIZE;
X        fs_offset = _fproc+fs_proc.p_map[D].mem_phys*CLICK_SIZE;
X
X        print_hdr(stdout,opt);
X        /* now loop through slots telling about them */
X        for (n = 0; n < NR_PROCS; n++) {
X            if (ps_k(fd, n+NR_TASKS, &p)) {        /* get kernel ps info */
X                ps_mm(fd, n, &p);    /* get mm ps info */
X                ps_fs(fd, n, &p);    /* get fs ps info */
X                ps_aout(fd, n, &p);    /* get cmd */
X                print_ps(stdout, opt, &p);
X            }
X        }
X    }
X    else {
X        perror(argv[0]);
X        exit(2);
X    }
X}
X
Xprint_ps(fd, opt, p)
XFILE *fd;
Xint opt;
Xstruct process_status *p;
X{
X    if (p->tty || (opt & TERMINALS)) {
X        if (opt & VERBOSE) {    /* flags & status */
X            fprintf(fd," %2.2o",p->flag);
X            fprintf(fd,"  %c",p->status);
X            if (p->real_uid != -1)
X                fprintf(fd, "  %4.4d",p->real_uid);
X            else
X                fputs("  ----",fd);
X        }
X
X        fprintf(fd,"  %4.4d",p->pid);
X
X        if (opt & VERBOSE) {
X            fprintf(fd,"  %4.4d",p->owner);
X            showname(fd, "  ", p->getfrom);
X            fprintf(fd," %5.5X",p->addr);
X            fprintf(fd,"  %2.2x",p->size);
X        }
X
X        if (p->tty)
X            fprintf(fd, "  tty%1.1d", (int)((p->tty >> MINOR) & 0377));
X        else
X            fputs("     ?",fd);
X
X        fprintf(fd, "  %2.2d:%02.2d", (int)(p->time / 3600),(int)(p->time / 60
 % 60));
X
X        if (p->pgm) {
X            fprintf(fd,"  %s",p->pgm);
X            free(p->pgm);
X        }
X        else {
X            showname(fd,"  ",p->slot-NR_TASKS);
X        }
X        fputc('\n',fd);
X        fflush(fd);
X    }
X}
X
Xprint_hdr(fd, opt)
XFILE *fd;
Xint opt;
X{
X    if (opt & VERBOSE) {    /* flags & status */
X        fputs("  F  S   UID",fd);
X    }
X    fputs("   PID",fd);
X    if (opt & VERBOSE)
X        fputs("  PPID  WCHAN   ADDR  SZ",fd);
X    fputs("   TTY   TIME  CMD\n",fd);
X    fflush(fd);
X}
/
echo x - ps.h
gres '^X' '' > ps.h << '/'
X/*
X *    ps : display process status for executing process
X */
X
X/* device name for main memory    */
X#define KERNEL        "/dev/mem"
X
X/* info filename for system */
X#define MAINT_INFO    "/etc/maint.info"
X
X/* variable names */
X#define PROC        "_proc"
X#define AOUT        "_aout"
X#define MPROC        "_mproc"
X#define FPROC        "_fproc"
X
X/* KERNEL BASE ADDRESS */
X#define KERNELBASE    ((long)03000)
X
X/* slot indexes for fs & mm */
X#define FS_SLOT        (NR_TASKS+FS_PROC_NR)    /* slot number in proc table o
f
 fs */
X#define MM_SLOT        (NR_TASKS+MM_PROC_NR)    /* slot number in proc table o
f
 mm */
X
X/* ps: options
X *    a: -    wants information about all processes with terminals
X *    l: -    long listing
X *    x: -    even processes with no terminals
X */
X#define OPTIONS        "alx"
X
X/* bit patterns for selected options */
X#define VERBOSE        0x04
X#define ALL        0x08
X#define TERMINALS    0x10
X
X#define MAXSTR        256
X
Xstruct process_status {
X    int pid;        /* process pid */
X    int slot;        /* kernel slot number */
X    int getfrom;        /* slot of who task wants to receive from */
X    int owner;        /* pid of parent process */
X    uid real_gid;
X    uid real_uid;
X    uid effective_gid;
X    uid effective_uid;
X    real_time time;
X    dev_nr tty;
X    int size;        /* bytes total for process */
X    long addr;        /* physical base address of process */
X    char *pgm;        /* pointer to cmd name */
X    int pflag;        /* kernel process flags */
X    unsigned flag;        /* flag: IN_USE, WAITING, HANGING, PAUSED .. */
X    char status;        /* flag: NOT_SUSPENDED, SUSPENDED, NOT_REVIVED,
 REVIVING */
X};
/
echo x - ps_aout.c
gres '^X' '' > ps_aout.c << '/'
X/*
X * get aout table entry corresponding to n
X */
X
X#include "/usr/src/h/const.h"
X#include "/usr/src/h/type.h"
X#include "/usr/src/h/callnr.h"
X#include "/usr/src/h/com.h"
X#include "/usr/src/h/error.h"
X#include "/usr/src/kernel/const.h"
X#include "/usr/src/kernel/type.h"
X#include "/usr/src/kernel/glo.h"
X#include "/usr/src/kernel/proc.h"
X
X#include <stdio.h>
X#include "ps.h"
X
Xextern long getlong();
Xextern char *strsave();
Xextern long _aout;
X
Xps_aout(fd, n, p)
XFILE *fd;
Xint n;
Xstruct process_status *p;
X{
X    long where;
X    int limit = MAXSTR;
X    char buf[MAXSTR], *bp = buf;
X
X    if (n == LOW_USER + 1) {
X        p->pgm = strsave("/bin/sh");
X    }
X    else {
X        where = getlong(fd, (_aout+n*sizeof(long)));
X        if (where) {
X            fseek(fd, where, 0);
X            while (*bp++ = fgetc(fd))
X                if (--limit == 0)
X                    break;
X            if (bp == buf)
X                p->pgm = NULL;
X            else
X                p->pgm = strsave(buf);
X        }
X        else
X            p->pgm = NULL;
X    }
X}
X
/
echo x - ps_fs.c
gres '^X' '' > ps_fs.c << '/'
X/*
X * ps_fs: get information for ps from fs
X */
X#include "/usr/src/h/const.h"
X#include "/usr/src/h/type.h"
X#include "/usr/src/h/stat.h"
X#include "/usr/src/fs/const.h"
X#include "/usr/src/fs/type.h"
X#include "/usr/src/fs/fproc.h"
X
X#include "ps.h"
X#include <stdio.h>
X
Xextern getblock();
Xextern long fs_offset;
X
Xps_fs(fd, n, p)
XFILE *fd;
Xint n;
Xstruct process_status *p;
X{
X    long fp;
X    struct fproc fs_info;
X
X    /* on entry n contains the slot number we are to look up */
X    fp = fs_offset + (n * sizeof(struct fproc));
X    getblock(fd, fp, &fs_info, sizeof(struct fproc));
X
X    /* no reliable way to check if this is right task we are looking at */
X    p->tty = fs_info.fs_tty;
X    if (fs_info.fp_suspended)
X        p->status = 'w';
X    else
X        p->status = 'r';
X    return;
X}
/
echo x - ps_k.c
gres '^X' '' > ps_k.c << '/'
X/*
X * ps: kernel dependent information retieval
X */
X
X#include "/usr/src/h/const.h"
X#include "/usr/src/h/type.h"
X#include "/usr/src/h/callnr.h"
X#include "/usr/src/h/com.h"
X#include "/usr/src/h/error.h"
X#include "/usr/src/kernel/const.h"
X#include "/usr/src/kernel/type.h"
X#include "/usr/src/kernel/glo.h"
X#include "/usr/src/kernel/proc.h"
X
X#include <stdio.h>
X#include "ps.h"
X
Xextern getblock();
Xextern long _kproc;
X
Xint
Xps_k(fd, n, p)
XFILE *fd;
Xint n;
Xstruct process_status *p;
X{
X    long kp;
X    struct proc k_info, k_getfrom;
X
X    /* on entry n contains the slot number were do look ups on */
X    kp = _kproc + (n * sizeof(struct proc));
X
X    /* copy mem to us for looking at */
X    getblock(fd, kp, &k_info, sizeof(struct proc));
X
X    if (k_info.p_flags & P_SLOT_FREE)
X        return (0);
X    else {
X        /* valid slot */
X        p->pid = k_info.p_pid;
X        p->slot = n;
X        p->pflag = k_info.p_flags;
X        p->time = k_info.user_time + k_info.sys_time;
X        p->addr = (long)k_info.p_map[T].mem_phys*CLICK_SIZE;
X        p->size = ((long)k_info.p_map[T].mem_len+(long)k_info.p_map[D].mem_len
+
(long)k_info.p_map[S].mem_len)*CLICK_SIZE/BLOCK_SIZE;
X        p->getfrom = k_info.p_getfrom;
X        return (1);
X    }
X}
/
echo x - ps_mm.c
gres '^X' '' > ps_mm.c << '/'
X/*
X * ps_mm: get information for ps from mm
X */
X#include "/usr/src/h/const.h"
X#include "/usr/src/h/type.h"
X#include "/usr/src/h/stat.h"
X#include "/usr/src/mm/const.h"
X#include "/usr/src/mm/mproc.h"
X
X#include "ps.h"
X#include <stdio.h>
X
Xextern getblock();
Xextern long mm_offset;
X
Xps_mm(fd, n, p)
XFILE *fd;
Xint n;
Xstruct process_status *p;
X{
X    static __ps_mm_descent;        /* stop recursion */
X    long mp;
X    struct mproc mm_info, mm_parent;
X
X    /* on entry n contains the slot number were do look ups on */
X    mp = mm_offset + (n * sizeof(struct mproc));
X
X    /* get copy of this proc entry for us */
X    getblock(fd, mp, &mm_info, sizeof(struct mproc));
X
X    if (p->pid == mm_info.mp_pid) {                /* safety */
X        if (!__ps_mm_descent) {
X            /* get the pid of the parent process */
X            __ps_mm_descent = 1;
X            ps_mm(fd, mm_info.mp_parent, &mm_parent);
X            p->owner = mm_parent.mp_pid;
X        }
X        else
X            __ps_mm_descent = 0;
X        /* fill in the normal info */
X        p->real_gid = mm_info.mp_realgid;
X        p->real_uid = mm_info.mp_realuid;
X        p->effective_gid = mm_info.mp_effgid;
X        p->effective_uid = mm_info.mp_effuid;
X        p->flag = mm_info.mp_flags;
X    }
X    else {
X        p->owner = -1;
X        p->real_gid = -1;
X        p->real_uid = -1;
X        p->effective_gid = -1;
X        p->effective_uid = -1;
X        p->flag = 0;
X    }
X    return;
X}
X
/
echo x - psutil.c
gres '^X' '' > psutil.c << '/'
X/*
X * utility routines for ps
X */
X
X#include "/usr/src/h/const.h"
X#include "/usr/src/h/com.h"
X#include <stdio.h>
X
Xunsigned
Xgetword(fd, offset)
XFILE *fd;
Xlong offset;
X{
X    int n;
X
X    fseek(fd, offset, 0);
X    fread(&n, sizeof(int), 1, fd);
X    return (n);
X}
X
Xlong
Xgetlong(fd, offset)
XFILE *fd;
Xlong offset;
X{
X    long n;
X
X    fseek(fd, offset, 0);
X    fread(&n, sizeof(long), 1, fd);
X    return (n);
X}
X
Xunsigned
Xgetblock(fd, offset, p, cnt)
XFILE *fd;
Xlong offset;
Xchar *p;
Xint cnt;
X{
X    fseek(fd, offset, 0);
X    fread(p, cnt, 1, fd);
X    return (offset);
X}
X
X/* fast and simple way of showing the process name */
X
Xstatic char *taskname[] = {
X    "MM    ",
X    "FS    ",
X    "INIT  "
X};
X
Xshowname(fd,pad,n)
XFILE *fd;
Xchar *pad;
Xint n;
X{
X    if (pad)
X        fputs(pad,fd);
X    if (n >= ANY || n < 0)
X        fputs("ANY   ",fd);
X    else if (n <= LOW_USER)
X        fprintf(fd,"%6.6s",taskname[n]);
X    else
X        fprintf(fd,"%4.4d", n);
X}
X
/
`
X{
X
X{
X
.
X.
X.x %sTTTTT2T,fop[T]) == ) == )ty defi/* spo    2ep->st by by upare('w* n>ra
 s\ns\nssusr/src* n>fi/'
X//'
X//

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 16:07 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 6109 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 16:06 PST
Received: by NDSUVM1 (Mailer X1.24) id 6068; Sat, 19 Dec 87 17:50:54 CST
Date: 19 Dec 87 16:06:09 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: Fixes to the shell
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

I have incorporated various fixes from the network into the shell.  Here
are diff files that you can apply to the V1.2 shell sources to generate the
revised shell sources.  When you are done, you should get something like this:

-rw-r--r-- 1 ast      7321 Dec 19 16:46 sh.h
-rw-r--r-- 1 ast     14508 Dec 19 16:46 sh1.c
-rw-r--r-- 1 ast     11571 Dec 19 16:46 sh2.c
-rw-r--r-- 1 ast     16881 Dec 19 16:46 sh3.c
-rw-r--r-- 1 ast     12423 Dec 19 16:46 sh4.c
-rw-r--r-- 1 ast      9219 Dec 19 16:49 sh5.c
-rw-r--r-- 1 ast        92 Dec 19 16:50 sh6.c

Please post any new bug reports to the net.

Andy Tanenbaum (ast@cs.vu.nl)

----------------------- shar file with shell source diffs ------------------
: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin
echo Extracting \s\h\.\h\.\d\i\f\f
sed 's/^X//' > \s\h\.\h\.\d\i\f\f << '+ END-OF-FILE '\s\h\.\h\.\d\i\f\f
X113,116c113
X<     union {
X<         char    *io_name;    /* file name */
X<         struct block *io_here;    /* here structure pointer */
X<     } io_un;
X---
X>     char    *io_name;    /* file name */
X261,266c258,261
X< #define    XIO    4    /* file IO */
X< #define XHERE    0x80    /* Any of the above inside a here document */
X< #define XMASK    0x7f    /* Get the actual task */
X<
X< /* in substitution */
X< #define    INSUB()    ((e.iop->task&XMASK)==XGRAVE||
(e.iop->task&XMASK)==XDOLL)
X---
X> #define    XIO    3    /* file IO */
X>
X> /* in substitution */
X> #define    INSUB()    (e.iop->task == XGRAVE || e.iop->task == XDOLL)
X273a269
X> int    herechar();
X301c297
X< struct    io    *setbase(/* struct io * */);
X---
X> struct io *setbase(/* struct io * */);
X329a326
X> int    getarea(/* char *obj */);
+ END-OF-FILE sh.h.diff
chmod 'u=rw,g=r,o=r' \s\h\.\h\.\d\i\f\f
set `sum \s\h\.\h\.\d\i\f\f`
sum=$1
case $sum in
11281)    :;;
*)    echo 'Bad sum in '\s\h\.\h\.\d\i\f\f >&2
esac
echo Extracting \s\h\1\.\c\.\d\i\f\f
sed 's/^X//' > \s\h\1\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\1\.\c\.\d\i\f\f
X213c213,215
X<     freearea(areanum = 1);
X---
X>     areanum = 1;
X>     freehere(areanum);
X>     freearea(areanum);
X907a910,916
X> int
X> getarea(cp)
X> char *cp;
X> {
X>     return ((struct region*)cp-1)->area;
X> }
X>
+ END-OF-FILE sh1.c.diff
chmod 'u=rw,g=r,o=r' \s\h\1\.\c\.\d\i\f\f
set `sum \s\h\1\.\c\.\d\i\f\f`
sum=$1
case $sum in
52924)    :;;
*)    echo 'Bad sum in '\s\h\1\.\c\.\d\i\f\f >&2
esac
echo Extracting \s\h\2\.\c\.\d\i\f\f
sed 's/^X//' > \s\h\2\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\2\.\c\.\d\i\f\f
X125,129c125,131
X<         while ((c = yylex(0)) == ';' || c == '&' || multiline && c == '\n')
{
X<             if (c == '&')
X<                 t = block(TASYNC, t, NOBLOCK, NOWORDS);
X<             if ((p = andor()) == NULL)
X<                 return(t);
X---
X>         if((peeksym = yylex(0)) == '&')
X>             t = block(TASYNC, t, NOBLOCK, NOWORDS);
X>         while ((c = yylex(0)) == ';' || c == '&' || multiline && c == '\n')
{
X>             if ((p = andor()) == NULL)
X>                 return(t);
X>             if((peeksym = yylex(0)) == '&')
X>                 p = block(TASYNC, p, NOBLOCK, NOWORDS);
X136a139
X>
X559c562
X<     iop->io_un.io_name = cp;
X---
X>     iop->io_name = cp;
+ END-OF-FILE sh2.c.diff
chmod 'u=rw,g=r,o=r' \s\h\2\.\c\.\d\i\f\f
set `sum \s\h\2\.\c\.\d\i\f\f`
sum=$1
case $sum in
41193)    :;;
*)    echo 'Bad sum in '\s\h\2\.\c\.\d\i\f\f >&2
esac
echo Extracting \s\h\3\.\c\.\d\i\f\f
sed 's/^X//' > \s\h\3\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\3\.\c\.\d\i\f\f
X177a178
X>     freehere(areanum);
X270,271d270
X<     if (t->type == TPAREN)
X<         exit(execute(t->left, NOPIPE, NOPIPE, FEXEC));
X275a275,276
X>     if (t->type == TPAREN)
X>         exit(execute(t->left, NOPIPE, NOPIPE, FEXEC));
X322c323
X<         cp = iop->io_un.io_name;
X---
X>         cp = iop->io_name;
X343c344
X<         u = herein(iop->io_un.io_here, iop->io_flag&IOXHERE);
X---
X>         u = herein(iop->io_name, iop->io_flag&IOXHERE);
+ END-OF-FILE sh3.c.diff
chmod 'u=rw,g=r,o=r' \s\h\3\.\c\.\d\i\f\f
set `sum \s\h\3\.\c\.\d\i\f\f`
sum=$1
case $sum in
31980)    :;;
*)    echo 'Bad sum in '\s\h\3\.\c\.\d\i\f\f >&2
esac
echo Extracting \s\h\4\.\c\.\d\i\f\f
sed 's/^X//' > \s\h\4\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\4\.\c\.\d\i\f\f
X350,354c350,352
X<
X<     /* jrp debug */
X<     scraphere();
X<
X<     freearea(areanum = 1);    /* free old space */
X---
X>     areanum = 1;
X>     freehere(areanum);
X>     freearea(areanum);    /* free old space */
X726a725,737
X>
X> char *
X> memcpy(ato, from, nb)
X> register char *ato, *from;
X> register int nb;
X> {
X>     register char *to;
X>
X>     to = ato;
X>     while (--nb >= 0)
X>         *to++ = *from++;
X>     return(ato);
X> }
+ END-OF-FILE sh4.c.diff
chmod 'u=rw,g=r,o=r' \s\h\4\.\c\.\d\i\f\f
set `sum \s\h\4\.\c\.\d\i\f\f`
sum=$1
case $sum in
42392)    :;;
*)    echo 'Bad sum in '\s\h\4\.\c\.\d\i\f\f >&2
esac
echo Extracting \s\h\5\.\c\.\d\i\f\f
sed 's/^X//' > \s\h\5\.\c\.\d\i\f\f << '+ END-OF-FILE '\s\h\5\.\c\.\d\i\f\f
X29c29
X<     if ((ec != '"') && (ec != '\'')) {
X---
X>     if (ec != '\'') {
X237a238,255
X>  * Return the characters from a here temp file.
X>  */
X> int
X> herechar(ap)
X> register struct ioarg *ap;
X> {
X>     char c;
X>
X>
X>     if (read(ap->afile, &c, sizeof(c)) != sizeof(c)) {
X>         close(ap->afile);
X>         c = 0;
X>     }
X>     return (c);
X>
X> }
X>
X> /*
X413,424c431,438
X< } *herelist;
X<
X< struct    block {
X<     char    *b_linebuf;
X<     char    *b_next;
X<     char    b_tmpfile[50];
X<     int    b_fd;
X< };
X<
X< static    struct block *readhere();
X<
X< #define    NCPB    2048        /* here text block allocation unit */
X---
X> };
X>
X> static    struct here *inhere;        /* list of hear docs while parsing */
X> static    struct here *acthere;        /* list of active here documents */
X>
X> static    char *readhere();
X>
X> #define    NCPB    100    /* here text block allocation unit */
X439,444c453,457
X<     h->h_iop->io_un.io_here = NULL;
X<     h->h_next = NULL;
X<     if (herelist == 0)
X<         herelist = h;
X<     else
X<         for (lh = herelist; lh!=NULL; lh = lh->h_next)
X---
X>     h->h_next = NULL;
X>     if (inhere == 0)
X>         inhere = h;
X>     else
X>         for (lh = inhere; lh!=NULL; lh = lh->h_next)
X462,681c475,608
X<     for (h = herelist; h != NULL; h = h->h_next) {
X<         h->h_iop->io_un.io_here =
X<             readhere(h->h_tag, h->h_dosub? 0: '\'',
X<                 h->h_iop->io_flag & IOXHERE);
X<     }
X<     herelist = NULL;
X< }
X<
X< static struct block *
X< readhere(s, ec, nolit)
X< register char *s;
X< {
X<     register struct block *bp;
X<     register c;
X<     jmp_buf ev;
X<
X<     bp = (struct block *) space(sizeof(*bp));
X<     if (bp == 0)
X<         return(0);
X<     bp->b_linebuf = (char *)space(NCPB);
X<     if (bp->b_linebuf == 0) {
X<         /* jrp - should release bp here... */
X<         return(0);
X<     }
X<     if (newenv(setjmp(errpt = ev)) == 0) {
X<         if (e.iop == iostack && e.iop->iofn == filechar) {
X<             pushio(e.iop->arg, filechar);
X<             e.iobase = e.iop;
X<         }
X<
X<         /* jrp changes */
X<         bp->b_linebuf[0] = 0;
X<         bp->b_next = bp->b_linebuf;
X<         bp->b_tmpfile[0] = 0;
X<         bp->b_fd = -1;
X<         for (;;) {
X<             while ((c = getc(ec)) != '\n' && c) {
X<                 if (ec == '\'')
X<                     c &= ~ QUOTE;
X<                 if (savec(c, bp, nolit) == 0) {
X<                     c = 0;
X<                     break;
X<                 }
X<             }
X<             savec(0, bp, nolit);
X<             if (strcmp(s, bp->b_linebuf) == 0 || c == 0)
X<                 break;
X<             savec('\n', bp, nolit);
X<         }
X<         *bp->b_linebuf = 0;
X<         if (c == 0) {
X<             prs("here document `"); prs(s); err("' unclosed");
X<         }
X<         quitenv();
X<     }
X<     return(bp);
X< }
X<
X< static
X< savec(c, bp, nolit)
X< register struct block *bp;
X< {
X<     /* jrp - gutted routine completely, modified to use temp file. */
X<
X<     /* If the file is not open, see if a filename needs to be
X<      * created.  If so, create one.  Then create the file.
X<      */
X<     char *    lp;
X<     char *    cp;
X<     static int inc;
X<     int    len;
X<
X<     if(bp->b_fd < 0) {
X<         if(bp->b_tmpfile[0] == 0) {
X<         /* Key this by the PID plus a tag... */
X<         for (cp = bp->b_tmpfile, lp = "/tmp/shtm";
X<              (*cp = *lp++) != '\0'; cp++)
X<             ;
X<
X<         inc = (inc + 1) % 100;
X<         lp = putn(getpid()*100 + inc);
X<         for (; (*cp = *lp++) != '\0'; cp++)
X<             ;
X<         }
X<
X<         /* Create the file, then open it for
X<          * read/write access.  After opening the
X<          * file, unlink it to it'll go away when
X<          * we're through using it.
X<          */
X<         bp->b_fd = creat(bp->b_tmpfile, 0600);
X<         close(bp->b_fd);
X<         bp->b_fd = open(bp->b_tmpfile, 2);
X<         unlink(bp->b_tmpfile);
X<         if(bp->b_fd < 0) {
X<             return(0);
X<         }
X<     }
X<
X<     /* Stuff the character into the line buffer.  If it's a
X<      * newline, then insert it before the trailing null, write
X<      * out the line, and reset the line buffer.
X<      */
X<     if(c == '\n') {
X<         bp->b_next[-1] = '\n';
X<         bp->b_next[0] = '\0';
X<         len = strlen(bp->b_linebuf);
X<
X<         /* Write this out, unless the line ended
X<          * with a backslash...
X<          */
X<         if((len > 1) && (bp->b_next[-2] != '\\')) {
X<         write_linebuf(bp, nolit);
X<         }
X<
X<         return(1);
X<     }
X<     else {
X<         if(bp->b_next == &(bp->b_linebuf[NCPB - 1])) {
X<         prs("here: line buffer full\n");
X<         return(0);
X<         }
X<         *(bp->b_next++) = c;
X<         return(1);
X<     }
X< }
X<
X< write_linebuf(bp, nolit)
X< struct block * bp;
X< {
X<
X<     char c;
X<     jmp_buf ev;
X<
X<     if(nolit) {
X<         if (newenv(setjmp(errpt = ev)) == 0) {
X<             PUSHIO(aword, bp->b_linebuf, strchar);
X<             setbase(e.iop);
X<             e.iop->task |= XHERE;
X<             while ((c = subgetc(0, 0)) != 0) {
X<                 c &= ~ QUOTE;
X<                 write(bp->b_fd, &c, sizeof c);
X<             }
X<             quitenv();
X<
X<         }
X<     }
X<     else {
X<         write(bp->b_fd, bp->b_linebuf, strlen(bp->b_linebuf));
X<     }
X<
X<     /* Zap the line buffer for next time... */
X<     bp->b_next = bp->b_linebuf;
X<     bp->b_linebuf[0] = 0;
X< }
X<
X< herein(bp, xdoll)
X< struct block *bp;
X< {
X<     int    ret_fd;
X<
X<     if (bp == 0)
X<         return(-1);
X<
X<     /* If we have a temp file, then rewind it to the beginning */
X<     if(bp->b_fd < 0) {
X<         return(-1);
X<     }
X<
X<     lseek(bp->b_fd, 0L, 0);
X<
X<     /* Free up this block pointer, as we're
X<      * not going to need it anymore.
X<      */
X<     xfree(bp->b_linebuf);
X<     xfree(bp);
X<
X<     return(bp->b_fd);
X< }
X<
X< scraphere()
X< {
X<     struct here * h;
X<     struct here * nexth;
X<     struct block * bp;
X<
X<
X<     /* Close and unlink any files associated with
X<      * heres in progress, and free up all the
X<      * associated structures.
X<      */
X<     h = herelist;
X<     while(h != NULL) {
X<         nexth = h->h_next;
X<         bp = (struct block *)h->h_iop->io_un.io_here;
X<         if(bp != NULL) {
X<             if(bp->b_fd >= 0) { close(bp->b_fd); }
X<             if(*bp->b_tmpfile) { unlink(bp->b_tmpfile); }
X<             xfree(bp->b_linebuf);
X<             xfree(bp);
X<         }
X<         xfree(h);
X<         h = nexth;
X<     }
X<
X<     herelist = NULL;
X< }
X<
X< char *
X< memcpy(ato, from, nb)
X< register char *ato, *from;
X< register int nb;
X< {
X<     register char *to;
X<
X<     to = ato;
X<     while (--nb >= 0)
X<         *to++ = *from++;
X<     return(ato);
X< }
X---
X>     for (h = inhere; h != NULL; h = inhere) {
X>         h->h_iop->io_name = readhere(h->h_tag, h->h_dosub? 0: '\'');
X>         /* relink from inhere to acthere list */
X>         inhere = h->h_next;
X>         h->h_next = acthere;
X>         acthere = h;
X>     }
X>     inhere = h;
X> }
X>
X> static char *
X> readhere(s, ec)
X> register char *s;
X> {
X>     int tf;
X>     char tname[30];
X>     register c;
X>     jmp_buf ev;
X>     char line [LINELIM+1];
X>     char *next;
X>
X>     tempname(tname);
X>     tf = creat(tname, 0600);
X>     if (tf < 0)
X>         return (0);
X>     if (newenv(setjmp(errpt = ev)) != 0)
X>         return (0);
X>     if (e.iop == iostack && e.iop->iofn == filechar) {
X>         pushio(e.iop->arg, filechar);
X>         e.iobase = e.iop;
X>     }
X>     for (;;) {
X>         if (talking && e.iop <= iostack)
X>             prs(cprompt->value);
X>         next = line;
X>         while ((c = getc(ec)) != '\n' && c) {
X>             if (ec == '\'')
X>                 c &= ~ QUOTE;
X>             if (next >= &line[LINELIM]) {
X>                 c = 0;
X>                 break;
X>             }
X>             *next++ = c;
X>         }
X>         *next = 0;
X>         if (strcmp(s, line) == 0 || c == 0)
X>             break;
X>         *next++ = '\n';
X>         write (tf, line, (int)(next-line));
X>     }
X>     if (c == 0) {
X>         prs("here document `"); prs(s); err("' unclosed");
X>     }
X>     close(tf);
X>     quitenv();
X>     /* correct area? */
X>     return (strsave(tname, areanum));
X> }
X>
X> /*
X>  * open here temp file.
X>  * if unquoted here, expand here temp file into second temp file.
X>  */
X> herein(hname, xdoll)
X> char *hname;
X> {
X>     register hf, tf;
X>
X>     if (hname == 0)
X>         return(-1);
X>     hf = open(hname, 0);
X>     if (hf < 0)
X>         return (-1);
X>     if (xdoll) {
X>         char c;
X>         char tname[30];
X>         jmp_buf ev;
X>
X>         tempname(tname);
X>         if ((tf = creat(tname, 0600)) < 0)
X>             return (-1);
X>         if (newenv(setjmp(errpt = ev)) == 0) {
X>             PUSHIO(afile, hf, herechar);
X>             setbase(e.iop);
X>             while ((c = subgetc(0, 0)) != 0) {
X>                 c &= ~ QUOTE;
X>                 write(tf, &c, sizeof c);
X>             }
X>             quitenv();
X>         } else
X>             unlink(tname);
X>         close(tf);
X>         tf = open(tname, 0);
X>         unlink(tname);
X>         return (tf);
X>     } else
X>         return (hf);
X> }
X>
X> scraphere()
X> {
X>     inhere = NULL;
X> }
X>
X> /* unlink here temp files before a freearea(area) */
X> freehere(area)
X> int area;
X> {
X>     register struct here *h, *hl;
X>
X>     hl = NULL;
X>     for (h = acthere; h != NULL; hl = h, h = h->h_next)
X>         if (getarea(h) >= area) {
X>             if (h->h_iop->io_name != NULL)
X>                 unlink(h->h_iop->io_name);
X>             if (hl == NULL)
X>                 acthere = h->h_next;
X>             else
X>                 hl->h_next = h->h_next;
X>         }
X> }
X>
X> tempname(tname)
X> char *tname;
X> {
X>     static int inc;
X>     register char *cp, *lp;
X>
X>     for (cp = tname, lp = "/tmp/shtm"; (*cp = *lp++) != '\0'; cp++)
X>         ;
X>     lp = putn(getpid()*1000 + inc++);
X>     for (; (*cp = *lp++) != '\0'; cp++)
X>         ;
X> }
+ END-OF-FILE sh5.c.diff
chmod 'u=rw,g=r,o=r' \s\h\5\.\c\.\d\i\f\f
set `sum \s\h\5\.\c\.\d\i\f\f`
sum=$1
case $sum in
19080)    :;;
*)    echo 'Bad sum in '\s\h\5\.\c\.\d\i\f\f >&2
esac
exit 0

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 17:52 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 7184 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 17:51 PST
Received: by NDSUVM1 (Mailer X1.24) id 7145; Sat, 19 Dec 87 19:43:20 CST
Date: 17 Dec 87 17:04:52 GMT
From: Phil Miller <pcm@ogcvax.uucp>
Subject: Updating login.c
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In the V1.2 updates, there is a diffs file for login.c in the commands.

However, I find no such file (login.c) on any of the distribution floppies.

Could someone please post or e-mail a copy of login.c to me?

Thanks in advance.

--Phil

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 17:56 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 7362 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 17:56 PST
Received: by NDSUVM1 (Mailer X1.24) id 7313; Sat, 19 Dec 87 19:54:23 CST
Date: 20 Dec 87 01:36:19 GMT
From: Jess Anderson <ANDERSON@vms3.macc.wisc.edu>
Subject: Posting Duplication
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments:     Warning -- original Sender: tag was mmdf@UDEL.EDU
Comments: To: info-minix@UDEL.EDU


Are you aware that every minix post is coming to Usenet twice,
once as itself, and once as undeliverable mail from postmaster
@locke.bitnet?  Most annoying.  Sure hope you can fix it.

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sat, 19 Dec 87 23:48 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 8950 for
 MINIX@UWALOCKE; Sat, 19 Dec 87 23:48 PST
Received: by NDSUVM1 (Mailer X1.24) id 8884; Sun, 20 Dec 87 01:45:29 CST
Date: 19 Dec 87 21:39:15 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: Emacs for Christmas!
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

That's right, Emacs for Christmas!  In a series of postings I have
distributed Ken Harrenstien's Emacs clone called ELLE.  This posting
is intended to let you figure out if you got all the files correctly.
If everything arrived properly, ls -l should give this report:

-rw-r--r-- 1 ast       302 Dec 19 20:07 .ellepro.b1
-rw-r--r-- 1 ast      6006 Dec 19 20:07 .ellepro.e
-rw-r--r-- 1 ast     18120 Dec 19 22:18 Announcement
-rw-r--r-- 1 ast      8822 Dec 19 20:07 defprf.e
-rwxr-xr-x 1 ast     71522 Dec 19 20:07 elle
-rw-r--r-- 1 ast     98565 Dec 19 22:14 elle.uuencoded
-rw-r--r-- 1 ast     18500 Dec 19 22:11 ellec
-rw-r--r-- 1 ast     25514 Dec 19 22:15 ellec.uuencode
-rw-r--r-- 1 ast       446 Dec 19 22:14 ellepro.b1.uue
-rw-r--r-- 1 ast     17020 Dec 19 20:07 help.dat
-rw-r--r-- 1 ast     33948 Dec 19 22:20 sharfile

The sum listings are as follows (except the block sizes are off by 2):

21924    18 Announcement
55136     9 defprf.e
05771    70 elle
21986    97 elle.uuencoded
15228    19 ellec
51169    25 ellec.uuencode
63217     1 ellepro.b1.uue
41527    17 help.dat
12343    34 sharfile

Other than this posting there are 6 others:
  1. Announcment (includes the user manual)
  2. elle.uuencoded part 1 of 2
  3. elle.uuencoded part 2 of 2
  4. ellec uuencoded
  5. .ellepro.b1.uuencoded
  6. sharfile

The two elle files should be stripped of their mail headers and joined
to give one file.  Check to see that this file has the same size and sum
as elle.uuencoded.  The file ellec should be checked against ellec.uuencoded.
Finally .ellepro.b1.uu should also be checked.  If all three are ok, uudecode
them and compare to elle, ellec, and .ellepro.b1, respectively.  The
announcement is not encoded, nor is the shar file, which contains defprf.e,
.ellepro.e, and help.dat.  Installation instructions are at the end of the
announcement.

I have tested ELLE fairly extensively on a Z-248 AT clone and found no errors.
If you find errors, please post them to this group.  I will try to answer
questions, etc. as best I can.

It is conceivable that our network link will die shortly, because we have
intelligent I/O boards installed and they know that the university is
closed for vacation until January 4, 1988, so that if they break, nobody will
touch them for two weeks and they can have a nice rest.  If I am suddenly
silent, it is more likely due to this than to my hiding from all the abuse
about to be aimed at me because ELLE is not full Emacs.

Finally, now that I have your undivided attention, how about somebody taking
a good look at the sed I posted before, with an eye to getting the last bugs
out of it.  If that occurs, we can change the MINIX shar to use sed, and
thus be compatible with the UNIX shar.  To test sed, make a sed script that
converts like this:
  /and/s//QQQ1/
  /the/s//QQQ2/
  /has/s//QQQ3/
  /this/s//QQQ4/
etc.  Then run this on a large piece of text.  Then convert it back with
another sed script and compare the output with the original.  Put some long
lines in because it seems to stumble on these.

Andy Tanenbaum (ast@cs.vu.nl)

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 00:43 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 9248 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 00:42 PST
Received: by NDSUVM1 (Mailer X1.24) id 9215; Sun, 20 Dec 87 02:38:50 CST
Date: 20 Dec 87 06:46:59 GMT
From: monty walls <mwalls@unirot.uucp>
Subject: Man page for PS
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

----------------------------------------------------------------------------

    Sorry about forgetting to enclose the doc's for PS.  Therefore
please find enclosed the man page.  Have fun with it-

    Monty Walls.

-------------------------Cut Here--------------------------------------------
NAME
    ps - process status

SYNOPSIS
    ps [-alx ]

DESCRIPTION
    PS prints information about active processes. It does so by
    examining kernel, mm, and fs address spaces.  The 'a' option
    asks for information about all processes with terminals
    (normally only ones own processes are displayed); 'x' displays
    processes even without terminals; 'l' asks for the long listing.
    The normal short listing contains the PID, TTY, TIME, and the CMD.

    The long listing contains:

    F    -    01:  in use; 02:  waiting; 04:  hanging; 10:  paused;
            20:  alarm on;  40: seperate I & D spaces.

    S    -    s - suspended, r - running (process FS status)

    UID    -    owners uid

    PID    -    process id

    PPID    -    parents process id

    ADDR    -    core address(in hex)

    SZ    -    size of code+data+stack(in hex)

    WCHAN    -    the pid or name of the process its waiting on

    TTY    -    owning tty

    TIME    -    system & user time in seconds for the process

    CMD    -    command name of process


FILES
    /dev/mem    core memory
    /etc/maint.info    kernel, fs, and mm maintence info

PORTABILITY

    Heavily dependent on the basic structure of minix on 8088.

SEE ALSO
    kill(1)


.............

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 03:07 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 9891 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 03:06 PST
Received: by NDSUVM1 (Mailer X1.24) id 9861; Sun, 20 Dec 87 04:52:25 CST
Date: 19 Dec 87 21:40:54 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: Announcement of Emacs for MINIX (users manual)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU


                        ELLE FOR MINIX

         Andy Tanenbaum (ast@cs.vu.nl)


1. INTRODUCTION
     I have good news for the Emacs fans among the MINIX users.  I have
ported an Emacs clone to MINIX.  The clone is called ELLE (ELLE Looks
Like Emacs).  It was written by Ken Harrenstien of SRI.  His e-mail
address is klh@sri-nic.arpa.  ELLE is not full Emacs (surely you didn't
expect that?), but it has about 80 commands and is highly usable.  I am
not distributing the (700K) source, but you can get it from Vincent Broman's
MINIX archive.  Instructions will be posted shortly.

     For people who don't know about Emacs, it is a VERY VERY big editor
that can do anything you can imagine, if you have enough patience to wait
forever.  Mined was inspired by Emacs, and has the same style, but only a
small subset, and is much faster.  Compared to mined, ELLE has the following
advantages:

   1.  It can edit files as large as the disk can hold (vs. mined, 38K)
   2.  It can handle multiple windows (2, to be specific)
   3.  You can have lots of files in the editor simultaneously
   4.  You can change the key bindings relatively easily
   5.  It has a bunch of additional commands that mined is missing

Compared to Emacs, it has the following advantages:
   1.  It is much, much smaller
   2.  It is a lot faster
   3.  It has #ifs for a large number of machines

The disadvantage of ELLE compared to mined is that regular expressions are
missing, and compared to Emacs that hundreds and hundreds of commands are
missing.

     For the record, I am aware of Jove and Scame and have tried both.
Without getting into all the details, ELLE seems much better suited to
MINIX. It is very fast, for example.  Implementing full Emacs on MINIX
is unthinkable.

     One problem is that I have been unable to compile ELLE on MINIX.
I can compile all the files, but asld runs out of space when linking
everything.  I have made a preliminary attempt to see if asld can be
sfixed, but it really appears to be out of space.  The only solution is
to remove a few of the ELLE source files (such as internal diagnostics
and paragraph filling).  I haven't really worked on this and definitely
don't have the time now.  My hope is that one or more of you will do that.
I cross compiled ELLE on PC-IX.  That works fine.  People who are using
Turbo C might try that.

1.1 Key bindings
     Mined only has a small number of commands.  All of them are either of
the form CTRL-x or are on the numeric keypad.  Emacs, in contrast, has so
many commands, that not only are all the CTRL-x commands used up, but so
are all the ESC x (escape followed by x; escape is not a shift character,
like CTRL).  Even this is not enough, so CTRL-X is used as a prefix for
additional commands.  Thus CTRL-X CTRL-L is a command, and so is CTRL-X K.
Fortunately, it wasn't necessary to distinguish upper case from lower case,
so what is conventionally written as CTRL-X K really means CTRL-X k.

     The result of all this is that many commands need three or four key
strokes to execute.  The command "CTRL-X (" requires you to touch CTRL, X,
shift, and (, for example, because the parentheses are upper case.
A lot of people think 4 (usually pretty obscure) key strokes is too much work.
For this reason, Emacs and ELLE allow users to assign their own key bindings.
In ELLE this is done with "user profiles."  A user profile is a file listing
which function is invoked by which key stroke.  The user profile is then
compiled by a program called ellec into binary form.  When ELLE starts up
it checks to see if a file .ellepro.b1 exists in $HOME.  If it does, this
file is read in and overrides the default bindings.  It is also possible to
tell ELLE to read in a specific file as profile.

     I have written a user profile that simulates the mined commands fairly
well (but not perfectly, since there are a few things that ELLE
simply cannot perform).  This profile also includes the other ELLE functions,
mostly in the form ESC x, rather than the 3 and 4 key stroke Emacs commands.
In addition, the numeric keypad is used, and lowercase characters were used
in preference to uppercase where possible (e.g., = instead of +).
Furthermore, I have made an attempt to choose mnemonic names for most
commands, although the goals of choosing mmenomic names and having all the
common command be no longer than two lowercase key strokes are in conflict.

     If you have never used Emacs, I suggest that you use the mined profile.
It should be easy to learn, since it is a superset of mined.  If you already
know Emacs, you have a choice of familiarity vs. fewer key strokes.  In
particular, I have avoided the many CTRL-X y and CTRL-X CTRL-Y sequences
that Emacs has.  A third option is to build your own profile using ellec.
The keybindings are described below.

     ELLE has a character-oriented view of the world, not a line oriented
view, like ed.  It does not have magic characters for searching, however, you
can use line feed in search patterns.  For example, to find a line consisting
of the three characters "foo" all by themselves on a line, using the mined
bindings (see below), use the pattern: CTRL-\ CTRL-J f o o CTRL-\ CTRL-J.
The CTRL-\ means to interpret the next character literally, in this case it
is CTRL-J, which is line feed.  You can also search for patterns involving
multiple lines.  For example, to find a line ending in an "x" followed by a
line beginning with a "y", use as pattern: x CTRL-\ CTRL-J y.
2. MINED KEY BINDINGS

     These are the key bindings if the binary user profile, .ellepro.b1,
is installed in $HOME.  The ESCAPE key followed by a number followed by a
command causes that command to be executed "number" times.  This applies
both to control characters and insertable characters.  CTRL-X refers to a
"control character."  ESC x refers to an escape character followed by x.
^X Y refers to CTRL-X followed by y.  To abort the current command and go
back to the main loop of the editor, type CTRL-G, rather than CTRL-\.
     Only a few commands are of the form CTRL-X Y.  All of these are also
bound to CTRL-X CTRL-Y, so you can hold down CTRL and then hit X Y, or
release control after the X, as you prefer.
     The key bindings that are not listed should not be used.  Some of them
actually do things.  For example, the ANSI escape codes ESC [ x are bound
to ^X Y for a variety of y.
     Some commands work on regions.  A region is defined as the text between
the most recently set mark and the cursor.


2.1 Mined Commands

CURSOR MOTION
   arrows   Move the cursor in the indicated direction
   CTRL-A   Move cursor to start of current line
   CTRL-Z   Move cursor to end of current line
   CTRL-F   Move cursor forward word
   CTRL-B   Move cursor backward to start of previous word

SCREEN MOTION
   Home key Move to first character of the file
   End key  Move to last character of the file
   PgUp key Scroll window up 22 lines (closer to start of the file)
   PgDn key Scroll window down 22 lines (closer to end of the file)
   CTRL-U   Scroll window up 1 line
   CTRL-D   Scroll window down 1 line
   ESC ,    Move to top of screen
   CTRL-_   Move to bottom of screen

MODIFYING TEXT
   DEL key  Delete the character under the cursor
   Backsp   Delete the character to left of the cursor
   CTRL-N   Delete the next word
   CTRL-P   Delete the previous word
   CTRL-T   Delete tail of line (all characters from cursor to end of line)
   CTRL-O   Open up the line (insert line feed and back up)
   ESC G    Get and insert a file at the cursor position (CTRL-G in mined)

REGIONS
   CTRL-^   Set mark at current position for use with CTRL-C and CTRL-K
   CTRL-C   Copy the text between the mark and the cursor into the buffer
   CTRL-K   Delete text between mark and cursor; also copy it to the buffer
   CTRL-Y   Yank contents of the buffer out and insert it at the cursor

MISCELLANEOUS
   numeric +    Search forward (prompts for expression)
   numeric \(em Search backward (prompts for expression)
   CTRL-]   ESC n CTRL-[ goes to line n (slightly different syntax than mined)
   CTRL-R   Global replace pattern with string (from cursor to end)
   CTRL-L   Replace pattern with string within the current line only
   CTRL-W   Write the edited file back to the disk
   CTRL-S   Fork off a shell (use CTRL-D to get back to the editor)
   CTRL-G   Abort whatever the editor was doing and wait for command (CTRL-\)
   CTRL-E   Redraw screen with cursor line positioned in the middle
   CTRL-V   Visit (edit) a new file
   CTRL-Q   Write buffer to a file
   ESC X    Exit the editor

2.2 Non-Mined Commands

CURSOR MOTION
   ESC P Forward paragraph (a paragraph is a line beginning with a dot)
   ESC ] Backward paragraph
   ESC . Indent this line as much as the previous one

MODIFYING TEXT
   CTRL-\ Insert the next character (used for inserting control characters)
   ESC T Transpose characters
   ESC W Transpose words
   ESC = Delete white space (horizontal space)
   ESC | Delete blank lines (vertical space)

REGIONS
   ESC M Mark current paragraph
   ESC ^ Exchange cursor and mark
   ESC Y Yank back the next-to-the-last kill (CTRL-Y yanks the last one)
   ESC A Append next kill to kill buffer

KEYBOARD MACROS
   ESC / Start Keyboard Macro
   ESC \ End Keyboard Macro
   ESC * View Keyboard Macro (the PrtSc key on the numeric pad is also a *)
   ESC E Execute Keyboard Macro

WINDOW MANAGEMENT
   ^X 1  Enter one window mode
   ^X 2  Enter two window mode
   ^X L  Make the current window larger
   ^X P  Make the window more petit/petite (Yes, Virginia, they are English)
   ^X N  Next window
   ^X W  New window

BUFFER MANAGEMENT
   numeric 5    Display the list of current files and buffers
   ESC B Select a buffer
   ESC S Select an existing buffer
   ESC N Mark a buffer as NOT modified (even if it really is)

UPPER AND LOW CASE MANIPULATION
   ESC I Set first character of word to upper case
   ESC C Capitalize current word
   ESC O Make current word ordinary (i.e., lower case)
   ESC U Set entire region between mark and cursor to upper case
   ESC L Set entire region between mark and cursor to lower case

MISCELLANEOUS
   ESC F Find file and read it into its own buffer
   ESC Z Incremental search
   ESC Q Like CTRL-R, but queries at each occurrence (type ? for options)
   ESC R Reset the user profile from a file
   ESC H Help (ELLE prompts for the 1 or 2 character command to describe)
   ESC ; Insert a comment in a C program (generates /* */ for you)
   ^X X  Exit the editor (same as ESC X and CTRL-X CTRL-X)


The major differences between ELLE with the mined profile and mined are:

1. The definition of a "word" is different for forward and backward word
2. The mark is set with CTRL-^ instead of CTRL-@
3. Use CTRL-G to abort a command instead of CTRL-\
4. Use CTRL-\ to literally insert the next character, instead of ALT
5. CTRL-E adjusts the window to put the cursor in the middle of it
6. To get and insert a file, use ESC G instead of CTRL-G
7. To go to line n, type ESC n CTRL-[ instead of CTRL-[ n
8. You exit with CTRL-X CTRL-X and then answer the question with "y".
9. There are many new commands, windows, larger files, etc.

Needless to say, if it had been easy to eliminate these differences and
have the two editors be fully compatible, I would have done so.  In each
case it would have been a significant undertaking.

3. EMACS KEY BINDINGS

     This section was adapted from the official ELLE documentation.

CURSOR MOVEMENT
   CTRL-F         Forward one character.
   CTRL-B         Backward one character.
   CTRL-H         Same as CTRL-B: move backward one character.
   ESC F          Forward one word.
   ESC B          Backward one word.
   CTRL-A         Beginning of current line.
   CTRL-E         End of current line.
   CTRL-N         Next line (goes to the next line).
   CTRL-P         Previous line (goes to the previous line).
   CTRL-V         Beginning of next screenful.
   ESC V          Beginning of previous screenful.
   ESC ]      Forward Paragraph.
   ESC [      Backward Paragraph.
   ESC <          Beginning of whole buffer.
   ESC >          End of whole buffer.

DELETING
   CTRL-D         Deletes forward one character (the one the cursor is under).
   DELETE         Deletes backward one character (the one to left of cursor).
   ESC D          Kills forward one word.
   ESC DEL        Kills backward one word.
   CTRL-K         Kills the rest of the line (to the right of the cursor).
   ESC \          Deletes spaces around the cursor.
   CTRL-X CTRL-O  Deletes blank lines around the cursor.

CASE CHANGE
   ESC C          Capitalizes word : first letter becomes uppercase; rest lower
   ESC L          Makes the whole next word lowercase.
   ESC U          Makes the whole next word uppercase.
   CTRL-X CTRL-L  Makes whole region lowercase.
   CTRL-X CTRL-U  Makes whole region uppercase.

SEARCHING  (If no string is given, previous string is used)
   CTRL-S      Incremental Search forward; prompts "I-search:"
   CTRL-R      Reverse Incremental Search; prompts "R-search:"
                    During an incremental search, the following characters
             have special effects:
               "normal" chars    - Begin searching immediately.
               ^G        - Cancel I-search, return to start.
               DEL        - Erase last char, return to last match.
               ^S, ^R        - Repeat search (or change direction).
               ESC or CR    - Exit I-search at current point.

   ESC %          Query Replace.  Asks for a search string, then
               for the replacement string, and begins searching.
               Stops at each match and waits for a command.
               Type "?" to see your options.
   CTRL-X %      Replace String.  Like Query Replace, but simply
               replaces all matches, without stopping to ask.

MARKING AREAS
   CTRL-^          Set mark
   CTRL-X CTRL-X   Exchange cursor and mark.
   ESC H       Mark Paragraph.  Sets mark and cursor to surround a para.
   CTRL-W          Wipe-out -- kills a "region":
   ESC W           Copy region.  Like CTRL-W then CTRL-Y but does modify buffer
   CTRL-Y          Yanks-back (un-kills) whatever you have most recently killed
.
   ESC Y           Yanks-back (un-kills) the next most recently killed text.
   ESC CTRL-W       Append Next Kill.  Accumulates stuff from several kills

FILLING TEXT
   ESC Q           Fill the paragraph to the size of the Fill Column.
   ESC G           Fill the region.
   CTRL-X F        Set Fill Column.  ESC Q will use this line size.
   CTRL-X .        Set Fill Prefix.  Asks for prefix string
   CTRL-X T       Toggles Auto Fill Mode.

WINDOWS
   CTRL-X 2        Make two windows (split screen).
   CTRL-X 1        Make one window (delete window) (make one screen).
   CTRL-X O        Go to Other window.
   CTRL-X ^        Grow window: makes current window bigger.

BUFFERS
   CTRL-X CTRL-F   Find a file and make a buffer for it.
   CTRL-X B        Select Buffer: goes to specified buffer or makes new one
   CTRL-X CTRL-B   Show the names of the buffers used in this editing session.
   CTRL-X K       Kill Buffer.
   ESC ~           Say buffer is not modified.
   CTRL-X CTRL-M   Toggle EOL mode (per-buffer flag).

KEYBOARD MACRO
   CTRL-X (       Start collecting a keyboard macro.
   CTRL-X )        Stop collecting.
   CTRL-X E       Execute the collected macro.
   CTRL-X *       Display the collected macro.

FILES
   CTRL-X CTRL-I   Insert a file where cursor is.
   CTRL-X CTRL-R   Read a new file into current buffer.
   CTRL-X CTRL-V   Same as ^X ^R above (reads a file).
   CTRL-X CTRL-W   Write buffer out to new file name.
   CTRL-X CTRL-S   Save file: write out buffer to its file name.
   CTRL-X CTRL-E   Write region out to new file name.

MISCELLANEOUS
   CTRL-X CTRL-Z   Exit from ELLE.
   CTRL-X !        Escape to shell (CTRL-D to return)
   CTRL-O          Open up line
   LINEFEED        Same as typing RETURN and TAB.
   CTRL-T          Transposes characters.
   ESC T       Transposes words.
   CTRL-U         Makes the next command happen four times.
   CTRL-U number   Makes the next command happen "number" times.
   ESC number      Same as CTRL-U number.
   CTRL-L          Refreshes screen.
   CTRL-U CTRL-L   Refresh only the line cursor is on.
   CTRL-U n CTRL-L Change window so the cursor is on line n
   CTRL-Q          Quote: insert the next character no matter what it is.
   CTRL-G          Quit: use to avoid answering a question.
   ESC ;           Inserts comment (for writing C programs).
   ESC I           Inserts indentation equal to previous line.
   ESC M           Move to end of this line's indentation.
   CTRL-_       Describes a command is command database is online

UNUSED CONTROLS
   CTRL-\          Special debugging command.  Not for normal users!
   CTRL-^          Special debugging command.  Not for normal users!
   CTRL-C          Not used.
   CTRL-Z          Not used.
   CTRL-]          Not used.


4. INSTALLING ELLE ON MINIX
     I have distributed the following files:

     elle     (executable binary of the editor)
     ellec       (executable binary of the profile compiler)
     .ellepro.e  (mined profile in source form)
     .ellepro.b1 (mined profile in binary form)
     defprf.e    (default profile in source form)
     help.dat    (help file)

Before starting to install ELLE, be sure you have updated to the tty.c
that supports both ANSI input and output.  Also install the /etc/termcap
file that goes with this tty driver.

HOW TO INSTALL ELLE

Step 1:
     Install 'elle' and 'ellec' in your /bin or /usr/bin directory.

Step 2:
     Install help.dat in /usr/src/elle/help.dat

Step 3:
     If you want to use the mined-like commands, install .ellepro.b1 in $HOME

Step 4:
     Type 'elle filename' and you are up and running.


HOW TO CREATE YOUR OWN USER PROFILE
Step 1:
     Modify .ellepro.e to suit your taste

Step 2:
     Install .ellepro.e in $HOME

Step 3:
     Type: ellec -Profile

Step 4:
     Check to see if $HOME/.ellepro.b1 was created

If you have questions that are likely to be of interest to other people,
post them rather than sending me private mail.

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 03:45 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0711 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 03:45 PST
Received: by NDSUVM1 (Mailer X1.24) id 0649; Sun, 20 Dec 87 05:41:23 CST
Date: 19 Dec 87 21:48:43 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: .ellepro.b1.uu (ELLE binary user profile)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

begin 644 .ellepro.b1
M 0"  !( + "2 "( Z@   "X! !0+)E-."@ ' 0 E= ,,&@U$<H(<5#Q 7&D5
M6P(>(U8! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
M 0$! 0$! 0$! 08P7S%?,E\S7S1?-5\V7S=?.%\Y7T%K0C)##T5F1CQ'/TAA
M21%+-$PH32].-D\04"U1<U):4S-4"54G5PY8@UEJ6G!>)"IG6UQ=+CT(?!LL
M53M\+GTO9%QE,4<R1D$90AA#!$0%1S5(.$Q)3DA02E-O5&Y53U905TY8@UDY
@ 1D"& ,$! 4'-0@X#$D.2!!*$V\4;A5/%E 73AB#&3EO

end

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 03:58 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0547 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 03:58 PST
Received: by NDSUVM1 (Mailer X1.24) id 0511; Sun, 20 Dec 87 05:36:58 CST
Date: 19 Dec 87 21:45:57 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: ellec.uuencoded (key binding compiler)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

begin 644 ellec
M 0,0!#    !&+   SAL  /85           !                      !&
M+   B]R+#X/# HO!0-'@ \.C1BQ04U'H!P"#Q 90Z.@>Z7L#QP:>5   @WX$
M 7\&_P:F5.L,_W8&_W8$Z&D#@\0$_S9,+.@'(8/$ J.45/\V4"SH^B"#Q *C
MEE3_-E0LZ.T@@\0"HYA4_S98+.C@((/$ J.:5(,^E%0 =!6#/I94 '0.@SZ8
M5 !T!X,^FE0 =0JXH3U0Z" ;@\0"QP9.+(  N(  4/\VE%2X3C%0Z 0:@\0&
MQP92+&  N&  4/\VEE2XSC%0Z.P9@\0&QP96+$X N$X 4/\VF%2X+C)0Z-09
M@\0&@SZ,,@!T%:&*,J-:+%#_-II4_S:,,NBX&8/$!K\  #L^3#%]6(O?N0,
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
MOP  .SY.+'T8H914 \>+V(H'F"7_ %!7Z*T @\0$1^OBN"-!4.B'$X/$ K\
M #L^4BQ]*Z&65 /'B]B*1P&8)?\ 4*&65 /'B]B*!Y@E_P -@ !0Z'$ @\0$
M@\<"Z\^X,T%0Z$D3@\0"OP  .SY6+'TKH9A4 \>+V(I' 9@E_P!0H9A4 \>+
MV(H'F"7_  T  5#H,P"#Q 2#QP+KS[A+05#H"Q.#Q *#/KY4 '0._S:^5+A-
M05#HD!*#Q 3IW"&X @#HG"'I'O_IB "#?@8 =0+K?8-^!@!^"8M&!CL&2"Q^
M&?]V!.@8 H/$ E#_=@:X=T%0Z+D2@\0&ZU&+7@:Y P#3XX._%D@ =1G_=@3H
M\ &#Q )0_W8&N*I!4.B1$H/$!NLIBUX&N0, T^/_MQ9(_W8$Z,L!@\0"4.A#
M 8/$ E"XZ4%0Z&@2@\0&ZP3_!KY4Z4@AN   Z @AZ6__Z<T OQ( B3Z ,J%.
M+*-^,@,^3BR)/H0RH5(LF;D" /?YHX(R SY2+(D^B#*A5BR9N0( ]_FCAC(#
M/E8LB3Z,,J%:+*.*,@,^6BS_-M9'N $ 4+@2 %"X?#)0Z#84@\0(_S;61_\V
M3BRX 0!0_S:45.@@%(/$"(,^4BP =!;_-M9'_S92++@! %#_-I94Z ,4@\0(
M@SY6+ !T%O\VUD?_-E8LN $ 4/\VF%3HYA.#Q B#/EHL '06_S;61_\V6BRX
M 0!0_S::5.C)$X/$".EO(+@  .@O(.DJ_^L8B[X$ %?H& "#Q *+UX'B@/\+
MPNL Z4P@N   Z P@Z^#K'HM&!"5_ (OX@_]A? J#_WI_!8U%X.L"B\?K .DD
M(+@  .CD'^O:ZW>+O@0 B7[ZBU[Z_T;ZB@>8B_"%P'0-5NAN!H/$ H7 = +K
MY(7V=02+Q^M)QT;ZYC*+7OK&!R+_1OJ+WT>*!YB+\(O F(M>^O]&^H@'A<!T
M$H/^(G4+B\:8BU[ZB ?_1OKKUXM>^L9'_R*+7OK&!P"XYC+K .FC'[@" .AC
M'^N!ZVV+O@0 ODHS]\<  700B]Y&Q@=8B]Y&Q@<M@>?__O?'@ !T$(O>1L8'
M38O>1L8'+8'G?_^#_Q]_"8O>1L8'7H/'0(/_?W44B]Y&Q@=$B]Y&Q@=%B]Y&
MQ@=,ZPB+QYB+WD:(!\8$ +A*,^L Z2P?N   Z.P>ZXOI2 ''AK3Y_$&#?@0
M=12X"T)0Z"(0@\0"N$)"4.@8$(/$ L>&UOP  (V&V/Q0Z ,.@\0"O@$ .S9(
M+'X#Z9D C8;8_(O6T>(#PHO8@S\ =0/I@0"+QKD# -/@!11(B_B#?0( =0M6
MN%!"4.AD#X/$!(M%!HE&^(7 =0>+AK3YB4;XQT;Z  "+1OH[AM;\?2.-AK;Y
MBU;ZT>(#PHO8_S?_=OCH<OF#Q 2%P'X"ZP7_1OKKU(M&^CN&UOQ] NL7C8:V
M^8N6UOS1X@/"B]B+1OB)!_^&UOQ&Z5[_QT;Z  "+1OH[AM;\?5>-AK;YBU;Z
MT>(#PHO8BP<[AK3Y=#V#?@0 =!Z-AK;YBU;ZT>(#PHO8_S?_=@2X>4)0Z!T/
M@\0&ZQF-AK;YBU;ZT>(#PHO8_S>X@$)0Z (/@\0$_T;ZZZ"XB$)0Z/,.@\0"
MZ=D=N$@&Z)D=Z:_^Z8T N(I"4.C:#H/$ KC!0E#HT Z#Q *-AK3\4.C!#(/$
M KX! #LV2"Q_8HO&N0, T^ %%$B+^%:X[$)0Z*4.@\0$C8:T_(O6T>(#PHO8
M@S\ = :#?0( =0RX]T)0Z(0.@\0"ZR7_=02X 4-0C4;44.B_%8/$!O]U HU&
MU%#_=02X!D-0Z%T.@\0(1NN8Z4 =N$@#Z  =Z6K_ZW*X(4-0Z$(.@\0"O@$
M.S9(+']<B\:Y P#3X 442(OX@ST =0+K1H-] @!U#5:X1$-0Z! -@\0$ZS.+
M102)1OJ%P'4%QT;Z;4.+10:)1OB%P'4%QT;X>D/_=OC_=OK_=0+_-;B)0U#H
MX V#Q I&ZY[IPQRX! #H@QSKANGP +B?0U#HQ0V#Q *XW$-0Z+L-@\0"N")$
M4.BQ#8/$ HV&V/Q0Z*(+@\0"O@$ .S9(+'X#Z;@ B\:Y P#3X 442(OX@ST
M=0/IH "#?00 = :#?0( =0Y6N&-$4.AJ#(/$!.F& (M%!(E&^(V&=/R)1OJ+
M7OC_1OB*!YA0Z/?[@\0"BU[Z_T;ZB >%P'0"Z^*-AG3\B4;ZBU[Z_T;Z@#]&
M=0N+7OK_1OJ /U]T!XV&=/R)1OK_=0)6_W;ZN)%$4.@,#8/$"(V&V/R+UM'B
M \*+V(,_ '4%N   ZP*+QE#_=OJXL$10Z.8,@\0&1ND__^G(&[B( ^B(&^D'
M_^L:Z)X B_B%P'0)5^A? H/$ NONN $ ZP#IHQNX  #H8QOKWNMUBSY4,X7_
M?!J%_W4,@S[ 5 !T!;C__^M:QP94,___B\?K4/\VU$?HFA"#Q *+^#W__W4=
MQP; 5 $ QP94,P  BQY8,\8' ,<&6#/"5(O'ZR*#_PIU#/\&5C/'!E@SPE3K
M#8O'F(L>6#.(!_\&6#.+Q^L Z20;N   Z.0:ZX/K?^B% .AY_XOX/?__=06X
M  #K:H/_*74%N   ZV"#_RAU.NC<"(OPB4;XQT0" @#HS?^+\(M>^(E'!(7
M=06+1OCK.NBY_XE&^H7 = J+1OJ)!(MV^NOLBT;XZR&#_R)U#+@! %#H9 "#
MQ +K$(D^5#.X  !0Z%0 @\0"ZP#IFQJX! #H6QKI>/_K.>CR_HOXBH4S1YBI
M" !T NL:@_\[=1/HW/Z+^#T* '0)@___=0+K#^OMZP+KTX/__W0$B3Y4,^E7
M&K@  .@7&NN_Z;$ C8;0_HOXQX;._@  Z*+^B_ ]__]T6H-^! !T/XO&ZS+H
MCOZ+\#W__W4%N   ZW^#_B)T!HDV5#/K-O^&SOZ!OL[^+ %^ NL1B\:8B]]'
MB ?KNCTB '3)Z^'K$U;H6P"#Q *%P'0"Z]*)-E0SZP+KG.B_!XF&S/Z+GLS^
MQT<" 0"+AL[^0%#H"!"#Q *+GLS^B4<$Q@4 C8;0_E"+GLS^_W<$Z!\8@\0$
MBX;,_NL Z9L9N# !Z%L9Z4;_ZS>#?@0@?BF#?@1_?2.#?@0H=!V#?@0I=!>#
M?@0[=!&#?@0B= N#?@1<= 6X 0#K [@  .L Z5D9N   Z!D9Z\'K;(N^! "#
M?0("= 2+Q^M;BW4$A?9U!;@  .M/@WP" 70%N   ZT3'1OI:,XM>^H,_ '0E
MBU[Z_S?_= 3H?/2#Q 2%P'0-_S2+7OK_5P*#Q +K&(-&^@3KT_]T!+CR1%#H
M3@F#Q 2X  #K .GC&+@" .BC&.N,ZU*+O@0 QP9(+   O@  @?Z0 7TWB]ZY
M P#3X\>'%$@  (O>N0, T^/'AQ9(  "+WKD# -/CQX<82   B]ZY P#3X\>'
M&D@  $;KP[B<5.L Z8<8N   Z$<8ZZ;I&@*+O@0 5^CK!H/$ CT$ 'T0N -%
M4.C%"(/$ K@  .GW 8M% NLQBT4$B4;NZS6-1NQ0_W4$Z$@&@\0$A<!T"(M&
M[(E&[NL<N!I%4.B/"(/$ K@  .G! 3T  '3*/0$ =,WKY(L]@WT" 700N#I%
M4.AK"(/$ K@  .F= 8M%!(E&](L]@WT" 700N%I%4.A-"(/$ K@  .E_ 8M%
M!(E&\HL]@WT" 700N'I%4.@O"(/$ K@  .EA 8M%!(E&\(-^[@!^!X%^[I !
M?A/_=NZXG$50Z D(@\0$N   Z3L!BT;NN0, T^ %%$B)1O:+7O:#/P!T?XM>
M]HL'.T;N=47_=O2+7O;_=P+HWO*#Q 2%P'0R_W;RBU[V_W<$Z,OR@\0$A<!T
M'XM>]H-_!@!T$_]V\(M>]O]W!NBO\H/$!(7 = /IH "+7O:#?P8 = B+7O:+
M1P;K [CD15"+7O;_=P2+7O;_=P*+7O;_-[BY15#H;@>#Q K'1O@  (%^^) !
M?62+7OBY P#3XX._%$@ =0+K3O]V\HM>^+D# -/C_[<82.C/\8/$!(7 ?QG_
M=O2+7OBY P#3X_^W%DCHMO&#Q 2%P'X<BT;X.T;N=0+K$O]V]+CS15#H" >#
MQ 2X  #K._]&^.N5BU[VBT;NB0>+7O:+1O")1P:+7O:+1O*)1P2+7O:+1O2)
M1P*A2"P[1NY]!HM&[J-(++B<5.L Z6(6N!  Z"(6Z=W]Z3D"B[X$ (7_= F+
M!8E&^H7 =0:X  #I'P*+10+K&(MU!.LBN   Z0\"_W4$Z.D"@\0"B_#K#ST
M '3C/0$ =.D] @!TWH/^_W4&N   Z>@!BW[Z@WT" 700N!5&4.A8!H/$ K@
M .G/ ?]U!.BW!(/$ HE&]H-^]@!U$_]U!+@X1E#H,P:#Q 2X  #IJ@'WQ@ !
M=0/II "!YO_^QT;X  "+1O@[!E8L?4:AF%0#1OB+V(H'F"7_ #OP=2ZAF%0#
M1OB+V(I' 9@E_P [1O9T&/]U!/]V]E;HY/6#Q )0N%I&4.C4!8/$".L&@T;X
M NNQBT;X.P96+'PDH58L.P94+'P0N']&4.BP!8/$ K@  .DG :%6+(E&^(,&
M5BP"B\:8BQ:85 -6^(O:B >AF%0#1OB+V(M&]HA' >GX /?&@ !U ^FB ('F
M?__'1O@  (M&^#L&4BQ]1J&65 -&^(O8B@>8)?\ ._!U+J&65 -&^(O8BD<!
MF"7_ #M&]G08_W4$_W;V5N@W]8/$ E"XGD90Z"<%@\0(ZP:#1O@"Z[&+1O@[
M!E(L?".A4BP[!E L? ^XPT90Z ,%@\0"N   ZWNA4BR)1OB#!E(L HO&F(L6
MEE0#5OB+VH@'H994 T;XB]B+1O:(1P'K38O&)7\ B4;XH914 T;XB]B /P!T
M*Z&45 -&^(O8B@>8)?\ .T;V=!C_=03_=O96Z*7T@\0"4+CB1E#HE02#Q BA
ME%0#1OB+V(M&]H@'N)Q4ZP#I'12X!@#HW1/IOOWK,+\  (LVE%0[/DXL?0F+
MWD;&!P!'Z_''!EHL  #'!E8L  #'!E(L  "XG%3K .GB$[@  .BB$^O(Z8X
MB[X$ (7_=06X  #K?HM% NL;BT4$B4;ZZR*X  #K;/]U!.B  H/$ HE&^NL/
M/0  =. ] 0!TZ#T" '3>@W[Z '4%N   ZT2^   [-E@L?3:AFE0#QHO8B@>8
M)?\ .4;Z= RAFE0#QHO8@#\ =16AFE0#QHO8BT;ZB ?_!EHLN)Q4ZPA&Z\2X
M  #K .E)$[@" .@)$^EI_^D: 8N^! "%_W4&N/__Z0D!QT;Z  !7Z,H1@\0"
MB4;XB]]'B@>8)?\ B_"#?O@ =0:X___IXP"#?O@!=06+QNG8 (/^7G4<@W[X
M G40B@684.B&\H/$ B6?_^F] +C__^FW %;H<_*#Q *+\( ]+7521X ] '4&
MN/__Z9T B\;K,U?H>_^#Q )0Z$[R@\0"#0 !Z84 5^AG_X/$ E#H.O*#Q (-
M@ #K<E?H5/^#Q (EG__K9CU# '3O/4T =-<]6 !TOH/^4W4:B@684.@M\H/$
M CU0 '4+@W[X G4%N"  ZSB#_D1U+HO?1XH'F%#H"_*#Q (]10!U'(O?1XH'
MF%#H^?&#Q (]3 !U"H ] '4%N'\ ZP6X___K .DC$K@$ .CC$>G=_NL3N 8
M4+@! %#HB@F#Q 3K .D%$K@  .C%$>OEZVJ+?@2%_W4%N   ZUO'1O@  +X
M ( ]+74$1_]&^(O?1XH'F(E&^H7 ="6+7OJ*AS-'F*D$ '4%N   ZRN+QKH*
M /?JBU;Z@^HP \*+\.O.@W[X '0&B\;WV.L"B\:+7@:)![@! .L Z9$1N 0
MZ%$1ZX[K%XN^! "^  "%_W0%1HL]Z_>+QNL Z7 1N   Z# 1Z^'K+(N^! "^
M  "%_WX9.SY(+'\3B]^Y P#3XXNW%DB%]G0$B\;K!;@%1^L Z3H1N   Z/H0
MZ\SK.(N^! "+-D@LA?9^)(O>N0, T^/_MQ9(5^A_[(/$!(7 = 2+QNL/@^X!
M=>&X  #K!;@  .L Z?@0N   Z+@0Z\#IC@"+O@0 O@  @?Z0 7T/B\;1X /'
MB]C'!P  1NOKO@  .S9.+'T:H914 \:+V(H'F"7_ (O T> #QXO8_P=&Z^"^
M   [-E(L?1VAEE0#QHO8BD<!F"7_ (O T> #QXO8_P>#Q@+KW;X  #LV5BQ]
M':&85 /&B]B*1P&8)?\ B\#1X /'B]C_!X/& NO=Z5\0N   Z!\0Z6G_ZR*+
MO@0 B[8& (-^" !^$8O?1XH'F(O>1H@'@VX( 77OZ3(0N   Z/(/Z];K+XN^
M! " /2!U T?K^( ] '075^BW#H/$ @/'B_!.@#P@=0+K^$;&! "+Q^L Z?D/
MN ( Z+D/Z\GK1[@61U#_-MA'Z,X @\0$_W86_W84_W82_W80_W8._W8,_W8*
M_W8(_W8&_W8$_S;81^BF (/$%K@>1U#_-MA'Z)@ @\0$Z:@/N   Z&@/Z['K
M1/]V%O]V%/]V$O]V$/]V#O]V#/]V"O]V"/]V!O]V!.B,_X/$%(L>6#/&!P"X
MPE10_S96,[@@1U#_-MA'Z$H @\0(Z5H/N   Z!H/Z[3K,?]V%O]V%/]V$O]V
M$/]V#O]V#/]V"O]V"/]V!O]V!.@^_X/$%+@! %#H(P.#Q +I'P^X  #HWP[K
MQP KP.C7#HU&"%#_=@;_=@3HI@>#Q :+7@2+1P2I0 !T!U/HZ &#Q +I[ XK
MP.BM#HU&!E#_=@3_-M9'Z'L'@\0&BQ[61XM'!*E  '0'4^B\ 8/$ NG #BO
MZ($._W8(Z!L @\0"A<!T!2O Z:D._W8&_W8$Z'@ @\0$Z^\ *\#H6PXK_^L'
MN/__Z8L.1X/_%'T7B]_1XXM&!#N'U$=U[8O?T>/'A]1'  "#_Q1]V/]V!.A9
M 8/$ HM>!/\WZ 0#@\0"BUX$BT<$J2  = ^#?P8 = G_=P;H\P6#Q *#_P)^
M"?]V!.CE!8/$ BO ZYL N 8 Z.@-QT;V   K_^LH@_\4?"+K4#UW '5+@4[V
M @"XI %0_W8$Z-@ @\0$B4;XA<!\,NMG1XO?T>.#O]1' '7-BUX&B@>8/6$
M=1Z!3O8" +@! %#_=@3HV@*#Q 2)1OB%P'TD*\#IDP ]<@!UIH%.]@$ *\!0
M_W8$Z+@"@\0$B4;XA<!]%>O<N ( 4"O2*\!24/]V^.A: H/$"+@* %#HR0.#
MQ *)1OJ%P'2XB]C'1P(  (O8BT;XB0>+1O:)1P2X  10Z*0#@\0"BU[ZB4<&
M@W\& '4'@4\$! #K"(M>^H%/!"  BU[ZBT<&B4<(B]_1XXM&^HF'U$>+1OKI
M)PT *\#HYPS_=@3_=@:X" !0N $ 4.@R#(/$".D*#;@" .C*#(M>!(M'!*D$
M '4(BT<$J0( =00KP.LPBUX$@W\" '[S_W<"_W<&_S?HGPN#Q :)1OJ+7@0[
M1P)U$<=' @  BT<&B4<(BT;ZZ;H,BUX$@4\$$ "X___K\ "X! #H; S'1O@
M (-^!@!U"^LU@V[Z 741_T;XBT;X.T8(<R2+1@:)1OK_=@J+7@3_1@2*!YA0
MZ(H)@\0$BUX*BT<$J1  =,N+1OCI7@RX! #H'@R+O@0 BS9&+(O>@\8"BP>)
M1OJ%P'0\B7[XBU[X@#\ =!G_1OB*!YB+7OK_1OJ*%[D( -/BT_H[PG3?BU[X
M@#\ =<:+7OJ /SUUOHO#!0$ Z08,*\#K^>LU@S[N50!T!/\6[E6X  !0N
M4+@  %"X  !0N   4/]V!+@! %"X  !0Z+T*@\00ZP#IRPNX  #HBPOKPP"X
M! #H@@N+O@0 *_;'1O@  .L!1XH%F*.T1ST@ '3T/0D =.\]#0!TZCT* '3E
M/0P =." /2UU%$?'1O@! .L,B\:Z"@#WZHOP W;ZB]]'B@>8+3  B4;Z/0H
M<N.#?O@ = >+QO?8Z5@+B\;K^2O Z!4+*\!04%!04/]V!+@& %"X 0!0Z"0*
M@\00Z30+N ( Z/0*BT8$H_15BU8(BT8&H_I5B1;\58M&"J/V5;@3 %"X 0!0
MZ'H*@\0$B4;ZA<!T!)GI_ J+%OQ5H?I5Z_0 *\#HLPK_=@3_=@:X!0!0N $
M4.C^"8/$".G6"K@" .B6"HM>!(M'!*D8 '0%N/__ZV"+7@2+1P2I 0!T\(-O
M @%_6XM'!*D$ '0*N $ 4(U&^E#K"K@ !%"+7@3_=P:+7@3_-^A1 (/$!HM>
M!(E' H-_ @!_'X-_ @!U!X%/! @ ZZJ+7@2!3P00 .N@BT;Z*N3I70J+7@2+
M1P:)1PB+7@2+1P2I! !UY/]'"(M'"$B+V(H'F.O9 +@" .CZ"2O 4%#_=@90
M_W8(_W8$N , 4+@! %#H!0F#Q!")1OKI$@HKP.C3":'^1P4"  -&! 7_ R4
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
MZ0'_*\#HIP$K_XO?T>.#O]1' '0.B]_1X_^WU$?HO_2#Q )'@_\4?.'IO0$
MN ( Z'P!B[X$ (NV!@")?OKK 4> /0!U^NL+B]Y&B@>8B]]'B > / !U\,8%
M (M&^NF( ;@" .A( 8N^! "+M@8 B7[ZZPN+WD:*!YB+WT>(!X \ '7PQ@4
MBT;ZZ5P!N ( Z!P!BT8$B4;ZZP/_1@2+7@2 /P!U]8O#*T;ZZ3L! "O Z/L
M*\!04/]V!E#_=@C_=@2X! !0N $ 4.@& (/$$.D6 2O Z-< BT8(H_15BT8*
MH_95BT8,H_A5BT8.H_I5BT80H_Q5BT82H_Y5_W8&_W8$Z%0 @\0$Z=X *\#H
MGP#_=@KH?0"#Q *+^(D^]%6+1@BC]E6+1@JC^%6^^E6#_PY^$.L5BUX*B@>8
MB]Y&B ?_1@J+QT^%P'7K_W8&_W8$Z 8 @\0$Z9  N ( Z%  BT8&H_)5N/!5
M4/]V!.B. (/$!(E&^H7 =1>#/O)5 'P%H?)5ZPNA\E7WV*,(7KC__^E6 "O
MZ!< B[X$ "OVZP%&B]]'@#\ =?>-1 'I.@!;58OL5U8KX#LF DAR O_CQP;R
M500 QP;T50( QP;V50\ QP;Z501(N/!54+@! %#H&P"!Q 0 Z?W_C6;\7E]=
MPP"Y 0#I# "Y @#I!@"Y P#I  !5B^R+A@0 BYX& ,T@7<, 58OL5RO_BU8&
MBT8$BUX*BTX(A=)Y"??:]]B#V@#WUX7;>0GWV_?9@]L ]]?H4P"%_W0']]KW
MV(/: %]=P@@  %6+[%<K_XM6!HM&!(M>"HM."(72>0GWVO?8@]H ]]>%VWD'
M]]OWV8/; .@5 (O3B\&%_W0']]KWV(/: %]=P@@  (7;=1*+V(O"*]+W\9/W
M\8O*B],KV\-55U8K_X3_=29'5XK[BMV*Z2K)B^F*Z"K)BL2*XHK6*O924%&+
MS3O3<@VX___K"E=74E"+PBO2]_.+Z/?A7ROX@]( B_*+P_?E \:#T@!>*_"#
MT@!8*\)Y"DT#^1/S%0  Z_2+SXO>7X7_= B*S8KKBM^*^(O%*])>7UW#
M  $ @      !     0    $               !R,WXS     (@SEC,
MH#.E,P    "L,[XS     ,8SV3,     X3/R,P    #Z,Q0T     !TT-30
M    /C13-     !<-&DT     '$T?S0     AS21-     "9-*PT     +4T
MQ30     SC3=-     #F-/4T     /XT$#4
M !HU+#4     -C5"-0    !,-58U     & U;C4     >#6'-0    "1-9XU
M     *@ULC4     NC7--0    #9->,U     .LU_C4     !S81-@
M                                         !HV)S8     ,39)-@
M  !4-F V     &HV=C8     ?S:0-@    "8-JDV     +$VO38
M                            QS;9-@    #A-O0V     /PV"S<
M%3<D-P               "\W/3<     23=@-P    !M-WDW     (,WD#<
M    FS>O-P    "[-\DW     -,WXC<     ZC?S-P    #[-P4X
M        $#@:.      B."PX     #0X/S@     1SA3.     !;.&4X
M &TX?#@     B#B3.     ";.*@X     *\XOS@               #+.-<X
M     . XZS@     \S@ .0     *.18Y     " Y+CD     .SE).0    !3
M.6,Y     &PY?3D     BCF5.0    ">.:HY     +0YQ#D
M             ,XYWSD     ZCG].0     (.ALZ     "0Z.CH
M                            0SI/.@    !9.F4Z     &\Z?3H
MACJ4.@    ";.JTZ     +8ZQ3H     SCK@.@    #L.O4Z
M                .Q [     !@[)CL     +CM .P    !(.U<[
M        7SMG.P    !P.WP[     (4[ECL
M *$[KSL     MCO,.P    #4.^<[     .\[_CL     !SP6/      ?/"T\
M     #8\1CP     4#Q@/     !H/'@\     ($\D#P               ";
M/+0\     +T\S3P     U3SI/     #S/ 8]     ! ](#T
M                                   I/3H]     $,]5CT     7SUO
M/0
M                     '@]AST     CCV9/0
M
M
M                              "> ",4!0 &%00 !7EZ'$X#&!H9 G%P
M"5U/)5QI %N- (QA 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
M 0$! 0$! 0$! 0$! 0$! 0$' E8,'@Y4$%,2;Q-N%%47:Q@S'DHE<RU>,%\Q
M7S)?,U\T7S5?-E\W7SA?.5\[?#PX/CE;+EP(72U""T,11 Q&"D<I2"])?4P0
M37M.%D]@4!=1,%0.50]64%<F66I^-G\- C4#A 5#!CP+1 PH#3</&Q!:$CT3
M0!4G%CX70A@D&H,A@B1T)7(H9"EE*F<N=C!+,4<R1CA,.4T].EY)0C)%9D9U
M23]+-$](4T%4=W\= 0"  $XQ, #.,2< +C(     ;3X  *A4  !O/@  JE0
M '$^  "L5   >3X  *Y4  !_/@  L%0  (4^  "R5   C#X  +14  "3/@(
M  "V5)H^  "X5   HCX  *A4  "H/@  NE0
M
M
M    __\  ,)4QD2O%,Y$B1+31"X7W$3T%NE$+1(     26YS97)T(%-E;&8
M9E]I;G-S96QF %%U;W1E9"!);G-E<G0 9E]Q=6]T:6YS $-23$8 9E]C<FQF
M $9O<G=A<F0@0VAA<F%C=&5R &9?9F-H87( 0F%C:W=A<F0@0VAA<F%C=&5R
M &9?8F-H87( 1&5L971E($-H87)A8W1E<@!F7V1C:&%R $)A8VMW87)D($1E
M;&5T92!#:&%R86-T97( 9E]B9&-H87( 1&5L971E($AO<FEZ;VYT86P@4W!A
M8V4 9E]D96QS<&, 5')A;G-P;W-E($-H87)A8W1E<G, 9E]T8VAA<G, 1F]R
M=V%R9"!7;W)D &9?9G=O<F0 0F%C:W=A<F0@5V]R9 !F7V)W;W)D $MI;&P@
M5V]R9 !F7VMW;W)D $)A8VMW87)D($MI;&P@5V]R9 !F7V)K=V]R9 !4<F%N
M<W!O<V4@5V]R9', 9E]T=V]R9', 57!P97)C87-E(%=O<F0 9E]U8W=O<F0
M3&]W97)C87-E(%=O<F0 9E]L8W=O<F0 57!P97)C87-E($EN:71I86P 9E]U
M8VEW;W)D $)E9VEN;FEN9R!O9B!,:6YE &9?8F5G;&EN90!%;F0@;V8@3&EN
M90!F7V5N9&QI;F4 3F5X="!,:6YE &9?;GAT;&EN90!0<F5V:6]U<R!,:6YE
M &9?<')V;&EN90!$;W=N(%)E86P@3&EN90!F7V1N<FQI;F4 57 @4F5A;"!,
M:6YE &9?=7!R;&EN90!/<&5N($QI;F4 9E]O;&EN90!$96QE=&4@0FQA;FL@
M3&EN97, 9E]D96QB;&EN97, 2VEL;"!,:6YE &9?:VQI;F4 0F%C:W=A<F0@
M2VEL;"!,:6YE &9?8FML:6YE $=O=&\@3&EN90!F7V=O;&EN90!3970O4&]P
M($UA<FL 9E]S971M87)K $5X8VAA;F=E(%!O:6YT(&%N9"!-87)K &9?97AC
M:&UA<FL 2VEL;"!296=I;VX 9E]K<F5G:6]N $-O<'D@4F5G:6]N &9?8V]P
M<F5G %5P<&5R8V%S92!296=I;VX 9E]U8W)E9P!,;W=E<F-A<V4@4F5G:6]N
M &9?;&-R96< 1FEL;"!296=I;VX 9E]F:6QL<F5G $9O<G=A<F0@4&%R86=R
M87!H &9?9G!A<F$ 0F%C:W=A<F0@4&%R86=R87!H &9?8G!A<F$ 36%R:R!0
M87)A9W)A<&@ 9E]M<FMP87)A $9I;&P@4&%R86=R87!H &9?9FEL;'!A<F$
M4V5L96-T($)U9F9E<@!F7W-E;&)U9F9E<@!396QE8W0@17AI<W1I;F<@0G5F
M9F5R &9?<V5L>&)U9F9E<@!+:6QL($)U9F9E<@!F7VMB=69F97( 3&ES="!"
M=69F97)S &9?;&ES=&)U9G, 0G5F9F5R($YO="!-;V1I9FEE9 !F7V)U9FYO
M=&UO9 !%3TP@0U),1B!-;V1E &9?96]L;6]D90!';W1O($)E9VEN;FEN9P!F
M7V=O8F5G $=O=&\@16YD &9?9V]E;F0 5VAA="!086=E &9?=VAA='!A9V4
M1FEN9"!&:6QE &9?9F9I;&4 4F5A9"!&:6QE &9?<F9I;&4 5FES:70@1FEL
M90!F7W9F:6QE $EN<V5R="!&:6QE &9?:69I;&4 4V%V92!&:6QE &9?<V9I
M;&4 4V%V92!!;&P@1FEL97, 9E]S879E9FEL97, 5W)I=&4@1FEL90!F7W=F
M:6QE %=R:71E(%)E9VEO;@!F7W=R96< 5W)I=&4@3&%S="!+:6QL &9?=VQA
M<W1K:6QL %1W;R!7:6YD;W=S &9?,G=I;F1S $]N92!7:6YD;W< 9E\Q=VEN
M9 !/=&AE<B!7:6YD;W< 9E]O=&AW:6YD $=R;W<@5VEN9&]W &9?9W)O=VEN
M9 !3:')I;FL@5VEN9&]W &9?<VAR:6YK=VEN9 !$96QE=&4@5VEN9&]W &9?
M9&5L=VEN9 !3=&%N9&]U="!7:6YD;W< 9E]S;W=I;F0 5'=O($UO9&4@5VEN
M9&]W<P!F7S)M;V1E=VEN9', 3F5W(%=I;F1O=P!F7VYE=W=I;@!.97AT(%-C
M<F5E;@!F7VYS8W)E96X 4')E=FEO=7,@4V-R965N &9?<'-C<F5E;@!38W)O
M;&P@5VEN9&]W(%5P &9?<V-U<'=I;F0 4V-R;VQL(%=I;F1O=R!$;W=N &9?
M<V-D;G=I;F0 36]V92!T;R!7:6YD;W<@5&]P &9?;79W=&]P $UO=F4@=&\@
M5VEN9&]W($)O='1O;0!F7VUV=V)O= !3970@4')O9FEL90!F7W-E='!R;V8
M4')E9FEX($UE=&$ 9E]P9GAM971A %!R969I>"!%>'1E;F0 9E]P9GAE>'0
M56YI=F5R<V%L($%R9P!F7W5A<F< 3F5G871I=F4@07)G=6UE;G0 9E]N96=A
M<F< 07)G=6UE;G0@1&EG:70 9E]A<F=D:6< 5E0Q,# @0G5T=&]N($AA8VL
M9E]V=&)U='1O;G, 1&5S8W)I8F4 9E]D97-C<FEB90!3=&%R="!+8F0@36%C
M<F\ 9E]S:VUA8P!%;F0@2V)D($UA8W)O &9?96MM86, 17AE8W5T92!+8F0@
M36%C<F\ 9E]X:VUA8P!6:65W($MB9"!-86-R;P!F7W9K;6%C %5N+6MI;&P
M9E]U;FMI;&P 56XM:VEL;"!0;W  9E]U;FMP;W  07!P96YD($YE>'0@2VEL
M; !F7V%P<&YK:6QL %-T<FEN9R!396%R8V@ 9E]S<F-H %)E=F5R<V4@4W1R
M:6YG(%-E87)C: !F7W)S<F-H $EN8W)E;65N=&%L(%-E87)C: !F7VES<F-H
M %)E=F5R<V4@4V5A<F-H &9?<FES<F-H %)E<&QA8V4@4W1R:6YG &9?<F5P
M<W1R %%U97)Y(%)E<&QA8V4 9E]Q=65R97  4F5P;&%C92!I;B!,:6YE &9?
M<F5P;&EN90!3970@1FEL;"!#;VQU;6X 9E]S9F-O; !3970@1FEL;"!0<F5F
M:7@ 9E]S9G!R968 075T;R!&:6QL($UO9&4 9E]F:6QL;6]D90!);F1E;G0@
M06-C;W)D:6YG('1O($UO9&4 9E]I;F1A=&T 26YD96YT($YE=R!,:6YE &9?
M:6YD;FP 0F%C:R!T;R!);F1E;G1A=&EO;@!F7V)A8VMI;F0 26YD96YT(&9O
M<B!#;VUM96YT &9?:6YD8V]M;0!);F1E;G0@4F5L871I=F4 9E]I;F1R96P
M4'5S:"!T;R!);F9E<FEO<@!F7W!S:&EN9@!2971U<FX@=&\@4W5P97)I;W(
M9E]R971S=7  5W)I=&4@1FEL92!%>&ET &9?=V9E>&ET $AI="!"<F5A:W!O
M:6YT &9?8FMP= !$96)U9R!-;V1E &9?9&5B=6< 8V%N;F]T(&EN:70L(&YO
M(&UE;6]R>0!R &-A;FYO="!O<&5N(&EN<'5T(&9I;&4@(B5S(@!W &-A;FYO
M="!O<&5N(&]U='!U="!F:6QE("(E<R( 8F%D('5S86=E+"!S964@9&]C $A/
M344 +P N96QL97!R;RYE '( 8V%N;F]T(&]P96X@<')O9FEL92 B)7,B $A/
M344 +P N96QL97!R;RYB,0!W8@!W &-A;FYO="!O<&5N(&]U='!U="!P<F]F
M:6QE("(E<R( 4 !% %!R;V9I;&4 4&-O;F8 1F-O;F8 1EAC;VYF $--8V]N
M9@!#4V-O;F8 06QL8V]N9@!09'5M< !&9'5M< !E;&QE8SH@86UB:6=U;W5S
M('-W:71C:#H@+25S(#T@)7,@;W(@)7,* &5L;&5C.B!B860@<W=I=&-H('1Y
M<&4Z("5S"@!E;&QE8SH@8F%D('-W:71C:#H@)7,* "\J(%1H:7,@9FEL92!D
M969I;F5S('1H92!I;FET:6%L(&1A=&$@9F]R($5,3$4G<R!D969A=6QT('5S
M97(@<')O9FEL92X**BH@270@:7,@875T;VUA=&EC86QL>2!G96YE<F%T960@
M8GD@14Q,14,L(&%N9"!S:&]U;&0@;F]T(&)E(&5D:71E9"X**B\*8VAA<B!C
M:&%R;6%P6UT@/2!["@ ))3)D+  )+RH@*"4S;RD@)3-S " @)7, ("HO"@!]
M.PH@8VAA<B!M971A;6%P6UT@/2!["@ ),"4M,V\L)3-D+  )+RH@)31S " @
M)7, ("HO"@!].PH@8VAA<B!E>'1M87!;72 ]('L*  DP)2TS;RPE,V0L  DO
M*B E-', (" E<P @*B\* 'T["@!S=')U8W0@<')O9FEL92!D969?<')O9B ]
M('L* " @)60L("\J(%9E<B J+PH ("!S:7IE;V8H8VAA<FUA<"DL(" @8VAA
M<FUA<"P* " @<VEZ96]F*&UE=&%M87 I+S(L(&UE=&%M87 L"@ @('-I>F5O
M9BAE>'1M87 I+S(L("!E>'1M87 L( H (" P+" P"@!].PH .R!%3$Q%(&1E
M9F%U;'0@05-#24D@<')O9FEL90H* "AK97EA;&QU;F)I;F0I(" [(%1O(&9L
M=7-H(&%L;"!E>&ES=&EN9R!B:6YD:6YG<PH*  H[($UE=&$@8VAA<G,*"@ *
M(#L@17AT96YD960@8V]M;6%N9',*"@ * "5D(&5R<F]R<R!E;F-O=6YT97)E
M9"P@8VAE8VL@;W5T<'5T(&9I;&4N #M)3E1%4DY!3"!%4E)/4CH@0F%D(&9U
M;F-T:6]N(&EN9&5X("5D(&9O<B!K97D@)7,* #M)3E1%4DY!3"!%4E)/4CH@
M3F\@;F%M92!F;W(@9G5N8W1I;VX@)60@=VAI;&4@;6%P<&EN9R!K97D@)7,*
M "AK97EB:6YD("5S("(E<R(I"@!U;FMN;W=N+6UO9'5L90 C($9U;F-T:6]N
M(&UO9'5L92!D969I;FET:6]N(&9I;&4L(&=E;F5R871E9"!B>2!%3$Q%0PH
M1E5.7T]&24Q%4R ]( !I;G1E<FYA;"!E<G)O<B M(&YO(&YA;64@9F]R(&9U
M;F-T:6]N("5D "5S("5S"@!<"@DE<RYO  H +RH@+D@@1G5N8W1I;VX@1&5F
M:6YI=&EO;B!F:6QE+"!G96YE<F%T960@8GD@14Q,14,@*B\* "\J(" @," J
M+R!%1E5.2$],12 O*B!!;'=A>7,@=6YD969I;F5D("HO"@ O*B E,V0@*B\@
M $5&54Y(3TQ%"@ B)7,B $5&54XH("4M,3)S+" E+3$T<RP@(B5S(BD* #L@
M36%S=&5R($9U;F-T:6]N($1E9FEN:71I;VX@9FEL90H :6YT97)N86P@97)R
M;W(@+2!N;R!N86UE(&9O<B!F=6YC=&EO;B E9 !U;FMN;W=N+6%D9'( =6YK
M;F]W;BUM;V1U;&4 *&5F=6X@)60@(B5S(B E<R E<RD* "\J("Y(($9U;F-T
M:6]N($EN9&5X($1E9FEN:71I;VX@9FEL92P@9V5N97)A=&5D(&)Y($5,3$5#
M("HO"@ O*B!&3E\@9&5F:6YE<R!&=6YC=&EO;B!.=6UB97)S("AI;F1I8V5S
M*2!F;W(@86QL(&MN;W=N(&9U;F-T:6]N<R J+PH +RH@1EA?(&1E9FEN97,@
M1G5N8W1I;VX@95AI<W1E;F-E(&EN('1H:7,@14Q,12!C;VYF:6=U<F%T:6]N
M("HO"@!I;G1E<FYA;"!E<G)O<B M(&YO(&%D9'(O;F%M92!F;W(@9G5N8W1I
M;VX@)60 (V1E9FEN92!&3E\E+3$T<R E,V0@+RH@)7,@*B\* "-D969I;F4@
M1EA?)2TQ-',@)3-D"@!K97EB:6YD &5F=6X ;65N=6ET96T :V5Y86QL=6YB
M:6YD '5N9&5F86QL '5N:VYO=VX@;W Z("@E<RD 969U;B M(&YO="!E;F]U
M9V@@87)G<P!E9G5N("T@;F]N+79A;'5E(&9U;F-T:6]N(&EN9&5X &5F=6X@
M+2!N;VXM<W1R:6YG(&9U;F-T:6]N(&YA;64 969U;B M(&YO;BUS=')I;F<@
M9G5N8W1I;VX@861D<@!E9G5N("T@;F]N+7-T<FEN9R!F=6YC=&EO;B!M;V1U
M;&4 969U;B M(&)A9"!F=6YC=&EO;B!I;F1E>" E9 !E9G5N("T@<F5D969I
M;FEN9R!F=6YC=&EO;B H)60@(B5S(B E<R E<RD =6YK;F]W;BUM;V1U;&4
M969U;B M(&YA;64@;W(@861D<F5S<R!D=7 A(" B)7,B "AK97EB:6YD*2!N
M;VXM<W1R:6YG(&9U;F-T:6]N(&YA;64 *&ME>6)I;F0I(&YO('-U8V@@9G5N
M8W1I;VX@+2 B)7,B "AK97EB:6YD*2!R961E9FEN:6YG(%@M)7,@87,@)60]
M(B5S(@ H:V5Y8FEN9"D@=&]O(&UA;GD@6"T@8V]M;6%N9', *&ME>6)I;F0I
M(')E9&5F:6YI;F<@32TE<R!A<R E9#TB)7,B "AK97EB:6YD*2!T;V\@;6%N
M>2!-+2!C;VUM86YD<P H:V5Y8FEN9"D@<F5D969I;FEN9R E<R!A<R E9#TB
M)7,B '5N:VYO=VX@9G5N8W1I;VX 96QL96,Z(  * " @("!,:6YE("5D.B E
M<PH    @(" @(" @(" (" @("" @(" @(" @(" @(" @(" @( @0$! 0$! 0
M$! 0$! 0$! $! 0$! 0$! 0$$! 0$! 0$$%!04%!00$! 0$! 0$! 0$! 0$!
M 0$! 0$!$! 0$! 00D)"0D)" @(" @(" @(" @(" @(" @(" @(0$! 0(
M       !  A6"%8!    0@ (6@A: @    8      +9'P$?*1P
M                                        "EX  %-T86-K(&]V97)F
%;&]W"@

end

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 04:10 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0197 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 04:09 PST
Received: by NDSUVM1 (Mailer X1.24) id 0164; Sun, 20 Dec 87 05:09:27 CST
Date: 19 Dec 87 21:43:13 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: elle.uuencoded  part 1 of 2
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

begin 755 elle
M 0-P!#    !P\@  PB0   H*           !
M    B]R+#X/# HO!0-'@ \.C  !04U'HFV:#Q 90Z$S@ZQRX @!0BT8$!0\
MF;D0 /?Y4.B_H(/$!.L Z<KPN   Z(KPZ]SK+HN^! "+M@8 B\8E#P"Z 0"+
MR-/BB\:Y! #3^(O T> #QXO8BP<CT(O"ZP#IDO"X  #H4O#KRNLHB[X$ (NV
M!@"+QB4/ +H! (O(T^*+QKD$ -/XB\#1X /'B]@)%^E@\+@  .@@\.O0ZRJ+
MO@0 B[8& (O&)0\ N@$ B\C3XO?2B\:Y! #3^(O T> #QXO8(1?I+/"X  #H
M[._KSNMDBS;")#LVQ"1U&5;HZ :#Q *+\(7 =0S_-L0DZ!D'@\0"B_#_=!2X
M!@!0Z#-N@\0$B_B%_W4"ZRF /0!T%E?HQP6#Q *+\(7V=0E7Z% %@\0"B_!6
MZ-\%@\0"5^@':X/$ NF^[[@  .A^[^N4ZW&+-L(D_W04N!L 4.CD;8/$!(OX
MA?]U NM5@#T ="N+-L8DA?9T%?]T%%?H3 "#Q 2%P'0"ZP6+=!+KYX7V=0JX
M.0!0Z,]P@\0"5^BJ:H/$ H7V=!JX9 !0Z(9P@\0"_W04Z)=P@\0"5NA=!8/$
M NE#[[@  .@#[^N'ZTN+O@0 B[8& ( \ '0VB7[ZB7;XBU[Z@#\ =""+7OK_
M1OJ*!YB+7OC_1OB*%[D( -/BT_H[PG0"ZP?KV+@! .L(1NO%N   ZP#I[NZX
M! #HKN[KK>DC ;AI %#H&FV#Q *)1OJ%P'4#Z0P!BU[Z@#\ =0:+/L0DZQB+
M7OJ /R!U!;\  .L+_W;ZZ)0$@\0"B_C_=OKHYFF#Q *%_W4-N'< 4.CV;X/$
M NG, #L^Q"1T%H,^R"0 =0/IJ0"+'L@D.7\(= /IG0"+-L(D._YU%E?H.P6#
MQ *+\(7 =0E7Z&\%@\0"B_#_=!2XA@!0Z(EL@\0$B4;Z@W[Z '4"ZWJ+7OJ
M/P!T&(M>^H _('4%O@  ZPO_=OKH" 2#Q *+\/]V^NA::8/$ H7V=0RXO@!0
MZ&IO@\0"ZT$[_G21@S[() !T%HL>R"0Y?PAU#>@!"%;H(@2#Q +H]P<Y/L0D
M=0=6Z!($@\0"5^@;!8/$ CD^PB1U!J'$)*/").G [;@" .B [>G4_NGT *'$
M)(E&]KC- %#H(P.#Q *)1OA0Z-8#@\0"N-< 4.B_-H/$ HL^QB2%_W4#Z:<
MBW44@#P@=0/IE@#W11P! '0%N.\ ZP.X\@!0Z),V@\0"5NB,-H/$ E?H036#
MQ )24(U&XE#H C>#Q :-1N)0Z.OJ@\0"B4;@5NCAZH/$ KH4 "O0*U;@B5;Z
MA=)^#?]V^K@@ %#H)S:#Q 2X]0!0Z#\V@\0"C4;B4.@U-H/$ KCX %#H*S:#
MQ *+=1:%]G0'5N@=-H/$ K@* %#H'RZ#Q *+?1+I4O__=OCH^PJ#Q +_=O;H
M" .#Q +_=OCH#P2#Q +IP.RX' #H@.SI __K$HL>Q"2!9QS^_X$.RB0$ .FC
M[+@  .AC[.OFZRV+'L0D@7<<@ "+'L0DBT<<J8  = 6X^P#K [@, 5#H<6V#
MQ *!#LHD  'I;.RX  #H+.SKR^L)Z*\NZ#E0Z5GLN   Z!GLZ^_K">BY+N@F
M4.E&[+@  .@&[.OOZ6<!N!L!4.A';8/$ O\VSB3_-LPDC4;H4.C7-8/$!HU&
MZ%#H7VV#Q +H8B['1O0! ,=&]@$ O@$ BQ;.)*',)(E&^(E6^H-N^ &#7OH
M@W[Z 'P=Z-TLB_@]"@!U!?]&]NL,@_\,=0=&BT;VB4;TZ]6X( %0Z/-L@\0"
MB\:94E"-1NA0Z&PU@\0&C4;H4.C:;(/$ K@H 5#HT&R#Q *+1O9 *T;TB\"9
M4E"-1NA0Z$(U@\0&C4;H4.BP;(/$ K@P 5#HIFR#Q +_-LXD_S;,).@02H/$
M!(O F5)0C4;H4.@1-8/$!HU&Z%#H?VR#Q *X-P%0Z'5L@\0"BT;VF5)0C4;H
M4.CM-(/$!HU&Z%#H6VR#Q *X0 %0Z&ML@\0"Z%$MZ$@NA<!T!?]&]NOTZ+(K
MB_B+1O:94E"-1NA0Z+4T@\0&C4;H4.@C;(/$ H/_"G0*N$4!4.@4;(/$ KA7
M 5#H)&R#Q +H"BWIU.JX% #HE.KID/[K/<<&QB0  +A9 5#H. "#Q *CQ"2C
MT"2ATB0M @!0N"T 4.BO,X/$!+AD 5#H%P"#Q *CQ"2CPB3HV@;IC.JX  #H
M3.KKN^M@BW8$5NAA (/$ HOXA?]T!(O'ZTFX( !0Z'AE@\0"B_BAQB2)11*)
M/L8D5N@[98/$ HE%%,=%&   QT4:  "X  !05^A(G(/$!,=%%@  QT4<  "A
MU"2)11Z+Q^L Z2+JN   Z.+IZYCK)(L^QB2%_W05_W8$_W44Z$?G@\0$A<!T
M!8M]$NOGB\?K .GTZ;@  .BTZ>O4ZQN+1@0[!L0D= :AQ"2CPB3_=@3H#@"#
MQ +IS^FX  #HC^GKW>MGBW8$BS[$)#OW=0+K5XL6SB2AS"2)11B)51J)-L0D
MBT0>H]0D_W0:_W08Z*<K@\0$BQ[6)(EW"(L>UB2+%LXDH<PDB4<2B5<4BQ[6
M),='#  !5^@: (/$ L<&V"0  ($.RB0$ >E>Z;@  .@>Z>N1ZR"+?@2+-MHD
MA?9T"SM\"'4"ZPN+-.OQ5^C\I(/$ NDTZ;@  .CTZ.O8ZS>+O@0 5^@W (/$
M HE&^HOP._=U NL9]T0< 0!T!(O&ZQ-6Z!H @\0"B_ [1OIUX;@  .L Z?/H
MN ( Z+/HZ\'K*HN^! "+]X7V= >+=!*%]G4$BS;&)(M<%( _('0"ZP0[]W7C
MB\;K .F_Z+@  .A_Z.O.Z88 BWX$O@  H<8DB4;Z@W[Z '03.7[Z= Z+=OJ+
M7OJ+1Q*)1OKKYX-^^@!U#^CY8+AI 5#H>&N#Q +K287V=0B+11*CQB3K!HM%
M$HE$$E?HX)J#Q )0Z(FA@\0"N/__4.@2G(/$ H-]%@!T"?]U%NB'8X/$ O]U
M%.A^8X/$ E?H=V.#Q +I+NBX @#H[N?I<?_K,(L>Q"2+1QRI 0!T$_\VQ"3H
M)0"#Q *%P'\%N   ZP[H14S'!M@D  "X 0#K .GSY[@  .BSY^O(ZT2+?@3_
M=12X> %0Z!IF@\0$B_"%]G4%N   ZR:*!)A0Z.A/@\0"/5D =06X 0#K [C_
M_XE&^E;H\V*#Q *+1OKK .FEY[@" .AEY^NTZ1D!@S[() !T#;BC 5#H[6B#
MQ +I @&AUB2)1OKH6DF+7OJ+1P:9N0( ]_F+^(M>^HM'! /'B_#_-M DN $
M4%;H>02#Q :CW"3_-L0DBU[ZBT<&C54!*\)0C40!4.A<!(/$!J/()(L>UB2+
M1P(E 0"+'L@D"4<"BQ[>)(M' B4! (L>W"0)1P+HX@*+7OJ)?P:-1 &+V-'C
MBY_@)(M7 HL'B4;VB5;XBQ[()(M6^(M&]HE'#HE7$#D6SB1_*GP&.0;,)',B
MBQ[()(M7$(M'#HE&]HE6^(L>R"2+5OB+1O:)1Q*)5Q3K*(L>R"2+%LXDH<PD
MB4<2B5<4C43_B]C1XXN?X"2+5P*+!Z/,)(D6SB3HG@"!#LHD @#I@>:X!@#H
M0>;IWO[I@ "#/L@D '4,N+4!4.C(9X/$ NMJBS[6)(-]! !T+.@R2/]U$/]U
M#NC>*(/$!(M%!/?84.AT1H/$ NB9*8E%#HE5$.AD*,=%!   BQ[()(M'!D !
M10;_-L@DZ+4#@\0"_S;<).BK X/$ L<&W"0  ,<&R"0  .C/ 8$.RB0&!.GU
MY;@  .BUY>EW_^LR@S[() !U#+C# 5#H/6>#Q +K'/\VR"3HGP*#Q *A<"6C
MR"2AUB2C<"6!#LHD! #IN.6X  #H>.7KQNMYBS;()(7V=0RXT0%0Z !G@\0"
MZV*A<B6)1OJ+/M8D@WT$ '0.B_Z+-M8DBT;Z]]B)1OJ+108#1OH] 0!\"XM$
M!@-&^CT! 'T,N-\!4.C 9H/$ NLBBT;Z 44&BT;Z 40$BT;Z*40&BQ[<)(M&
M^@%'!($.RB0" .DUY;@" .CUY.E^_^L5@S[() !U NL)Z#+_Z&O_Z"S_Z17E
MN   Z-7DZ^/K$H,^R"0 =0+K!N@3_^B$_NGYY+@  .BYY.OFZU6A<B7K/O\V
MUB3H40"#Q +K/O\VWB3H10"#Q +_-MPDZ#L @\0"ZRB+/MHDA?]T$O=% @$
M= =7Z", @\0"BSWKZNL,/0  =-\]! !TQ.NVZ&X Z9KDN   Z%KDZZ/K*XN^
M! "%_W4"ZQ[W10(! '0'@64"_O_K!8%- @$ @4T,  &!#LHD "#I9>2X  #H
M)>3KS>LD@SYT)0!T!:%R)>L/@SX:$ !T!;@  .L#N ( HQH0Z L Z3?DN
MZ/?CZ]3K<(L^W"2%_W4(QP8"    ZUV#/AH0 74,BQ[>)(M' B4! .L#H1H0
MHP( @SX"  !T(8,^!   =0VXZ %0Z&OY@\0"HP0 H00 B44(@4T" @#K$:'0
M)(E%"(%E OW_@0[*)  @@4T,  &!#LHD! #IO>.X  #H?>/KB.MYQP;:)
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
M1 &#Q *+^(7 = V+QB5_ %#_UX/$ NL#Z#A6Z<+=N   Z(+=Z]7K$NBC_PV
M %#HQ_^#Q +K .FFW;@  .AFW>OFZQ+HA_\-  %0Z*O_@\0"ZP#IBMVX  #H
M2MWKYNF% (-^! !]!;@! .L#N 0 HW0EQT;Z  #H5/^+\(O&)7\ B_B#_RUU
M%(-^^@!U#L<&="7__\<&<B4! .LQ@_\P?"J#_SE_)8M&^KH* /?J \<M, ")
M1OJ#/G0E 'P&QP9T)0$ BT;ZHW(EZP+K NNHH7(E]RYT):-R)8DV>B7'!H E
M @#I^MRX @#HNMSI<O_K%;C__U#H9O^#Q *A<B7WV*-R)>G:W+@  .B:W.OC
MZQ.+1@2C>B6X__]0Z$'_@\0"Z;W<N   Z'W<Z^7K$;A;%5"X3 50Z,9&@\0$
MZ:+<N   Z&+<Z^?K%O]V!.@8 (/$ HO8T>.+A\X"ZP#I@MRX  #H0MSKXNMY
MB[X$ /?'  %T#(LV1@6A1 6)1OKK$/?'@ !T,XLV0@6A0 6)1OI7Z&]$@\0"
MB_B+WD:*!Y@[QW0#1NL+B@28)?\ B4;ZZP:#;OH!=>+K%(O')7\  P8^!8O8
MB@>8)?\ B4;ZBT;Z.P8*!'P%N   ZP6+1OKK .G_V[@" .B_V^E^_^M!Z-_]
MZQ[H;3'K-.A1,>LOZ*<NZRKHS2[K)>C],^L@Z$94ZQL]00!TW3U" '3=/4,
M=-T]1 !TW3U1 '3=Z^#IL]NX  #H<]OKM^GD (-^! !T$/]V!(V&-/]0Z!/9
M@\0$ZR7_-B 0N%H%4/\V@B6-AC3_4.CZV(/$!%#H@]B#Q 10Z'S8@\0$N
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
MN!H Z-;4Z1'_ZSVX  !0_W8&Z )@@\0$Z X5BUX&T>.+G^ DQT<(  "#?@0
M= J+7@2!3PP  >L&@0[*) ( @0[*) @ Z<[4N   Z([4Z[OK(HN^! "+=02+
MQ@-%!HE&^CMV^GT+5E?HGO^#Q 1&Z_#IHM2X @#H8M3KUNEC!8M^!(7_=0:X
M  #I4P7W10P(#74&N   Z48%.S[6)'4)BQ;.)*',).L&BU44BT42B4;VB5;X
MBT4$ T4&B4;>H<0DB4;@BT4(H\0DZ*D7B4;BB5;DQT;<  "+51"+10X[5OA]
M ^FA 7\(.T;V=P/IEP&A%A#W;0:9N60 ]_F+\.L2N&0 *P86$/=M!IFY9 #W
M^8OPA?9_!;X! .L+.W4&? :+109(B_#_=OC_=O;H>A:#Q 2%]G0$B\;K [@!
M %#H_C6#Q +H+Q>)10Z)51#'1M0  .C.%XE&YHE6Z(M6Z(M&YCM6^'\O? 4[
M1O9S*(M6Z(M&YHE&]HE6^(E%$HE5%#L^UB1U#8M6Z(M&YJ/,)(D6SB3I:_^+
M=03'1M@  ,=&^@  .W;>?3G_1MS_=OJ+WM'C_[?@).CT#8/$!(O>T>.+A^ D
MB4;Z]T4" 0!T"8M>^H!/"@CK!XM>^H!G"O=&Z\+_=OC_=O97Z ($@\0&A<!T
M ^D. X-^U !T$:$4$/=M!IFY9 #W^8OPZ0?_BU;XBT;V.U40?Q1\!3M%#G,-
MN- %4.CL58/$ NG6_H-]!@%^&8M%!$"+V-'CBY_@)(M7 HL'B44.B540ZR^+
M7031XXN'X"2)1OJ+7OJ+1P2+P)F)1LZ)5M"+7OJ+5P*+!P-&SA-6T(E%#HE5
M$/]U$/]U#N@H%8/$!.D.__=%#  %=!3_=1#_=0[H$A6#Q 3'1M0! .FP_O=%
M#  (=2/_=OC_=O97Z#D#@\0&A<!U ^E#_HM5((M%'HE&YHE6Z.G7 NA4%HE&
MYHE6Z(/Z '4(/0  =0/I'OZ+5NB+1N8K11X;52")1O*)5O2+5NB+1N:)1NZ)
M5O [51Q\&7\%.T4:=A*+5O"+1NXK11H;51R)1NZ)5O"#?O0 =1F#?O( =1.+
M5O"+1NX[51AU"#M%%G4#Z:X!BW4$.W;>?22+WM'CBX?@)(E&^HM>^HM5&(M%
M%CM7 G\(? 0[!W<"ZP-&Z]<[=MY\+(M>^HM'!(O F8E&SHE6T(M>^HM7 HL'
M T;.$U;0.548? I_!3E%%G8#Z5$!.W4$?CB+7OJ#?P0 =".+7OJ+51B+118[
M5P)U%3L'=1&-1/^+V-'CBY_@)(!_"P!T#$Z+WM'CBX?@)(E&^HEVVD8[=MY]
M&HO>T>.+G^ DBU<"BP<#1O(35O2)!XE7 NO@BW;:.W4$?A2-1/^+V-'CBY_@
M)(I'"YB)1MCK!<=&V   QT;6 0"+7OJ+5P*+!XE&ZHE6[%)0Z'83@\0$.W;>
M? /IEP"+WM'CBX?@)(E&^HM6\(M&[CM6['\G? 4[1NIW((M>^HM6[(M&ZCM7
M G42.P=U#H-^V !U"(-^U@!U NM:_T;<BU[ZBD<+F(E&UCMU!'X-C43_B]C1
MXXN'X"3K [@  %#_=OKH" N#Q 3W10(! '0)BU[Z@$\*".L'BU[Z@&<*]^BU
M$XE&ZHE6[(M>^HI'"YB)1MA&Z6'__W;X_W;V5^@- 8/$!H7 = +K&ND5_/]V
M^/]V]E?H]P"#Q :%P'0#Z:0 Z?[[.S[6)'0#Z9@ BT;>2(O8T>.+A^ DB4;Z
MBU[ZBT<$B\"9B4;.B5;0BU[ZBU<"BP<#1LX35M [5NA\(7\%.T;F<AJ#?1
M=02#?0X = ?'1M*6 .L%QT;2R #K,H-]$ !U#8-]#@!U!\=&TO__ZQ__=NC_
M=N:Z  "X9 !24/]U$/]U#NBZSU)0Z-7/B4;2BT;2.T4*= R+1M*)10J!#LHD
M! #'11;__\=%&/__BU;HBT;FB44>B54@@64,]_*#?MP = 6!30P0 /]VY/]V
MXNC7$8/$!(M&X*/$)(M&W.L Z33/N"X Z/3.Z93ZZ90 BW8$BU8(BT8&.U00
M?PQ\!3M$#G,%N   ZW>+1 0#1 9(B]C1XXN_X"2+1029B4;TB5;VBU4"BP4#
M1O035O:)1OB)5OJ+5@B+1@8[5OI_#'P%.T;X<P6X 0#K-HM6"(M&!CM6^GP,
M?P4[1OAV!;@  .L?@WT$ '04BD4*F*D" '4&@'T+ 7X%N   ZP6X 0#K .F4
MSK@( .A4SNEC_^GB HM&!(E&^(7 =0:AUB2)1OB+7OB+1PR)1O*+1O@[!M8D
M=0:ARB0)1O*!9O+XWW4#Z: "BU[XBT;RB4<,]T;R" UT$O]V^.BF^8/$ HM>
M^(M'#(E&\O=&\A  =0/I= *+7OB+1P*I 0!T!;@! .L#N   4.A>#8/$ HE&
MY(M>^(M'!(E&]HM>^(M'!@-&]HE&](M^]CM^]'P#Z2X"B]_1XXN'X"2)1OJ+
MV(I'"IBI 0!U ^D1 H-^! !T(N@Q987 =!OHK62+7OB+1O*)1PS_=N3H  V#
MQ *X 0#I P+_=OK_=OKH!@*#Q 2%P'0#Z<\!]P:()0$ =0/IO0'W1O+  '4%
M@4[RP #'1NP  ,=&Z@  ]T;R0 !U ^G1 (M>^H-_" !U ^G% (U% 8OP.W;T
M?4N+WM'CBY_@)(I'"IBI 0!U NLXB][1X_^WX"3_=OKHF@&#Q 2%P'08@W[L
M '4#B7;HBU[ZBT<( 4;L@T;Z$.L(@W[L '0"ZP-&Z["#?NP =0+K:(O?T>.+
MA^ DB4;ZBW;HH8HE P:,)8E&XHO&*\?W;N(#!HXE P:0)8E&\(O&*\>+%G8E
M@^H$.\)]"(M&\#M&['P"ZR6!9O*___]V^(O&*\=05^@7"H/$!CO^?0I7Z- !
M@\0"1^ORZ=, ]T;R@ !U ^G" (M>^H-_#@!U ^FV (U% 8OP.W;T?4N+WM'C
MBY_@)(I'"IBI 0!U NLX_W;ZB][1X_^WX"3HOP"#Q 2%P'08@W[J '4#B7;F
MBU[ZBT<. 4;J@T;Z$.L(@W[J '0"ZP-&Z["#?NH =0+K68O?T>.+A^ DB4;Z
MBW;FH8HE P:,)8E&XHO&*\?W;N(#!HXE P:0)8E&\(O&*\>+%G8E@^H$.\)]
M"(M&\#M&ZGP"ZQ:!9O)___]V^(O&*\=05^@Q"H/$!NL'5^CW (/$ HM>^H!G
M"OY'Z<K]_W;DZ 0+@\0"BU[XQT<,  "X  #K .FFR[@: .AFR^D5_>F[ (M^
M!HI%"IBI 0!T0(M%#HE&^HMU#(M>!(I'"IBI! !U!;@! .L#N   BE4*N0@
MT^+3^O?"" !U!;H! .L#N@  .\)T!;@  .MNZRJ+10B)1OJ+=0:+7@2*1PJ8
M)00 BE4*N0@ T^+3^H'B!  [PG0%N   ZT*+7@2+1OH[1PAT!;@  .LR@W[Z
M '0GBUX$BW\&B]]'B@>8B]Y&BA>Y" #3XM/Z.\)T!;@  .L+@V[Z 77?N $
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
M)?\ ZP=7Z!5Y@\0"B4;Z/0H =0G_!H %B\;IY "#?OK_= 7_10+_#<=&^@T
MZQ:#?OH*=1#W11R  '4)_P: !8O&Z;P 5O]V!/]V^NB^ (/$!HE&^HM&^@%&
M! -V^CMV!GT#Z57_.W8&= /ICP"#;0(!? R+'?\%B@>8)?\ ZP=7Z)IX@\0"
MZV/_#H %ZV[W11R  '0[@VT" 7P,BQW_!8H'F"7_ .L'5^AR>(/$ HE&^CT*
M '4&_P: !>M @W[Z_W0%_T4"_PU7Z(QY@\0"ZRS_10+_#>LE]T4<@ !U!O\&
M@ 7K&/]% O\-ZQ$]__]TF#T* '3B/0T =)3KZ(O&ZP#I,L.X @#H\L+IH?[I
M@P"+=@2#_A]^$H/^?WT-B\:8BUX&B >X 0#K9HM^!H/^"74EBT8()0< N@@
M*]")5OJ+1OJ)1@B+WT?&!R"#;OH!=?2+1@CK.<=&" $ ]\:  '0)B]]'Q@=^
M_T8(@>9_ (/^'WX%@_Y_=0V+WT?&!UZ!]D  _T8(B\:8B 6+1@CK .FCPK@"
M .ACPNET_^GI (M>"(M'!HM>" -'!(OPN   4/]V!.B 38/$!%;_=@;HADZ#
MQ 2-AFK_B4;ZOP$ .WX&?QN+QBO'B]C1XXN?X"2+1P:+7OJ)!X-&^@)'Z^"-
M1/^+^(M&! -&!COX?#F+QRM&!HO8T>.+G^ DBT<&B]_1XXN?X"2)1P:+QRM&
M!HO8T>.+G^ DBT<(B]_1XXN?X"2)1PA/Z[V-AFK_B4;ZBT8$ T8&2(OX.WX$
M?"2+7OJ+!XO?T>.+G^ DB4<&@T;Z HO?T>.+G^ DQT<(  !/Z]>+?@0[_GT/
MB]_1XXN?X"2 3PH!1^OMZ:[!N)( Z&[!Z0[_Z>0 BUX(BT<&BUX( T<$B_"X
M  !0_W8$Z(M,@\0$5O]V!NCH3H/$!(V&:O^)1OJ+?@2+1@0#1@8[^'T7B]_1
MXXN?X"2+1P:+7OJ)!X-&^@)'Z]^+?@2+QBM&!COX?3F+QP-&!HO8T>.+G^ D
MBT<&B]_1XXN?X"2)1P:+QP-&!HO8T>.+G^ DBT<(B]_1XXN?X"2)1PA'Z[Z-
MAFK_B4;ZB\8K1@:+^#O^?22+7OJ+!XO?T>.+G^ DB4<&@T;Z HO?T>.+G^ D
MQT<(  !'Z]B+?@0[_GT/B]_1XXN?X"2 3PH!1^OMZ;[ N)( Z'[ Z1/_ZR*A
M@@6)1OH[1@1T#_]V!.A448/$ HM&!*."!8M&^NL Z9' N ( Z%' Z];ID "+
MO@0 B[8& #L^E"5T"E97Z'1+@\0$ZW6+QBL&DB6)1OJ%P'Q#@W[Z '4"ZV"+
M1OH[!IXE?3"+W]'CBY_@)(I'"IBI# !U'_]V^HO?T>.+G^ DBT<& P:2)5#H
MQE:#Q 2)-I(EZR?K'8M&^O?8B4;Z]RZ@)3L&GB5]"^B@2X-N^@%U]^L(5E?H
M_4J#Q 3I]K^X @#HMK_I9__K8_<&B"4( '0%Z*Q+ZU.+'I0ET>.+O^ DBT4(
M*P:2)8OPA<!^/+@  %#H"_^#Q *)1OBADB6)1OJX( !0Z-M5@\0"_P:2)8/N
M 77M_W;XZ.;^@\0"_W;Z_S:4)>@%_X/$!.F(O[@$ .A(O^N5ZQG_-L0DZ)P#
M@\0"QP;,)   QP;.)   Z66_N   Z"6_Z]_K#_\VQ"3H=G6#Q +K .E,O[@
M .@,O^OIZP__-L0DZ-9U@\0"ZP#I,[^X  #H\[[KZ>L7N@  N $ 4E#_-L0D
MZ/5U@\0&ZP#I$K^X  #HTK[KX>LBBS[$)(-M @%\#(L=_P6*!Y@E_P#K!U?H
MUG.#Q +K .GFOK@  .BFONO6ZPR+/L0D_T4"_PWIT+ZX  #HD+[K[.LDBS[$
M)(-M! %\"XL=_P6+1@2(!^L*_W8$5^CE<X/$!.L Z:*^N   Z&*^Z]3K((L^
MQ"2#?0( ?@J+'8H'F"7_ .L'5^AK=(/$ NL Z7B^N   Z#B^Z]CK(/\VQ"3H
M%'&#Q +_=@3HEO^#Q +_-L0DZ!]Q@\0"Z4Z^N   Z Z^Z]CK%?]V!O]V!/\V
MQ"3H6':#Q ;K .DOOK@  .COO>OCZQ7_=@;_=@3_-L0DZ/-T@\0&ZP#I$+ZX
M  #HT+WKX^L-Z&(!H\PDB1;.).GYO;@  .BYO>OKZQJX  !0_W8&_W8$_S;$
M).C+=X/$".C0_^G5O;@  .B5O>O>ZQ/_-LXD_S;,).A2 (/$!.L Z;B]N
MZ'B]Z^7K$[H  +@  %)0Z#4 @\0$ZP#IF[VX  #H6[WKY>L;N ( 4+H  +@
M %)0_S;$).AK=X/$".L Z7:]N   Z#:]Z]WK&;@  %#_=@;_=@3_-L0DZ$AW
M@\0(ZP#I4[VX  #H$[WKW^L9N $ 4(M&!)E24/\VQ"3H)7>#Q CK .DPO;@
M .CPO.O?ZQFX 0!0_W8&_W8$_S;$).@"=X/$".L Z0V]N   Z,V\Z]_K#_\V
MQ"3HBP.#Q +K .GTO+@  .BTO.OIZP__-L0DZ*L"@\0"ZP#IV[RX  #HF[SK
MZ>L/_S;$).C0 8/$ NL Z<*\N   Z(*\Z^GK#_\VQ"3H"P2#Q +K .FIO+@
M .AIO.OIZP__-L0DZ)]X@\0"ZP#ID+RX  #H4+SKZ>L3N PV4/\VQ"3H9P"#
MQ 3K .ESO+@  .@SO.OEZQ.X8#A0_S;$).A* (/$!.L Z5:\N   Z!:\Z^7K
M$[B5-U#_-L0DZ"T @\0$ZP#I.;RX  #H^;OKY>L3N,XV4/\VQ"3H$ "#Q 3K
M .D<O+@  .C<N^OEZQ;H;O]24/]V!O]V!.BO (/$".L Z?R[N   Z+R[Z^+K
M#_\VQ"3HTP.#Q +K .GCN[@  .BCN^OIZR#_=@3H3VZ#Q )0Z/AT@\0"N
M4/]V!.C+;8/$!.FYN[@  .AYN^O8ZQBX  !0_W8(_W8&_W8$Z(QU@\0(ZP#I
ME[NX  #H5[OKX.L._W8$Z(YW@\0"ZP#I?[NX  #H/[OKZNL8_W8(_W8&N)4W
M4/]V!.@0 (/$".L Z5V[N   Z!V[Z^#K48M^!%?H4W>#Q *)1OB)5OJX  !0
M_W8*_W8(5^@B=8/$"%?_5@:#Q )7Z"YW@\0"B4;TB5;VN   4/]V^O]V^%?H
M_72#Q B+5O:+1O3K .D"N[@( .C"NNNGZ;8 BWX$]T4<@ !T>(-M @%\#(L=
M_P6*!Y@E_P#K!U?HOV^#Q *+\#W__W16@_X*=4__10+_#5?HX7"#Q *+\#W_
M_W09@VT" 7P,BQW_!8H'F"7_ .L'5^B';X/$ H-M @%\#(L=_P6*!Y@E_P#K
M!U?H;F^#Q *#_@UU!;@! .LUZXKK+(-M @%\#(L=_P6*!Y@E_P#K!U?H1V^#
MQ *+\#W__W0,@_X*=06X 0#K!^O4N   ZP#I0;JX  #H ;KI0?_INP"+?@3W
M11R  '1X@VT" 7P,BQW_!8H'F"7_ .L'5^C];H/$ HOP/?__=%:#_@IU3_]%
M O\-5^@?<(/$ HOP/0T =06X 0#K<8/^_W09@VT" 7P,BQW_!8H'F"7_ .L'
M5^B[;H/$ H-M @%\#(L=_P6*!Y@E_P#K!U?HHFZ#Q +KBNLQ@VT" 7P,BQW_
M!8H'F"7_ .L'5^B%;H/$ HOP/?__=!&#_@IU"O]% O\-N $ ZP?KS[@  .L
MZ7JYN   Z#JYZ3S_Z;\ BWX$]T4<@ !T>E?H@F^#Q *+\#W__W1J@_X*=6-7
MZ&]O@\0"B_ ]#0!U-X-M @%\#(L=_P6*!Y@E_P#K!U?H%6Z#Q *#;0(!? R+
M'?\%B@>8)?\ ZP=7Z/QM@\0"N $ ZUJ#_O]T&8-M @%\#(L=_P6*!Y@E_P#K
M!U?HV6V#Q +KB.LS5^@(;X/$ HOP/?__="6#_@IU'H-M @%\#(L=_P6*!Y@E
M_P#K!U?HJ6V#Q *X 0#K!^O-N   ZP#IK[BX  #H;[CI./_I@@"+?@3W11R
M '1/5^BW;H/$ HOP/?__=#^#_@IU.%?HI&Z#Q *+\#T- '4,5^@#_X/$ K@!
M .M(@_[_=!F#;0(!? R+'?\%B@>8)?\ ZP=7Z#EM@\0"Z[/K(5?H:&Z#Q *+
M\#W__W03@_X*=0Q7Z,+^@\0"N $ ZP?KW[@  .L Z2&XN   Z.&WZ77_ZR/_
M=@3HAW2#Q *)1OB)5OK_=@3H"'2#Q (#1O@35OKK .GSM[@$ .BSM^O5ZQSH
MW/B+^#T@ '0%@_\)=0+K[X/__W0#Z/+XZ<VWN   Z(VWZ]SK'.AC^(OX/2
M= 6#_PEU NOO@___= /HH/CII[>X  #H9[?KW.M#B[X$ (7_?A/HO_J%P'4%
MN   ZRR#[P%U[^L@A?]]&8O']]B+^.B[^H7 =06X  #K#X/O 77OZP/H7?JX
M 0#K .E:M[@  .@:M^NUZU+H0_CK,NM&BQ[$)(M''*F  '0:Z-WWZ-KWB_@]
M__]T ^@C^.@@^(/_#70"ZR"X 0#K';@  .L8/?__=/$]"0!TQ#T* '3!/2
M=+KKY>NQZ?ZVN   Z+ZVZZ;K&(M^!H7_?@[_=@3H'_B#Q *#[P%U\NG<MK@
M .B<MNO@ZSB+=@2%]G0NBS[$)(O>1HH'F(E&^H7 =!V#;00!? N+'?\%BT;Z
MB ?K"O]V^E?HW6N#Q 3KUNF:MK@" .A:MNO ZSW_=@K_=@C_-L0DZ S[@\0&
MB4;XB5;Z_W8&_W8$_S;$).CV^H/$!CM6^G4*.T;X=06X 0#K [@  .L Z5.V
MN 0 Z!.VZ[OK;XM^!(-^" !]&8O?1\8'+8M6"(M&!O?:]]B#V@")1@:)5@B#
M?@@ ?"1_!H-^!@IR'+H  +@* %)0_W8(_W8&Z%*V4E!7Z+?_@\0&B_BZ  "X
M"@!24/]V"/]V!NAVM@4P (O?1X@'Q@4 B\?K .G:M;@  .B:M>N)Z8( Z"OY
MB4;XB5;ZZ"$!Z&/VB_@]__]T18/_"G4^Z*?V@SZB)0!T(?\VHB7H0IN#Q *%
MP'01H:(E!0$ ]]A0Z$7X@\0"Z\CK%>CL]E#H-0&#Q *%P'0"ZP7H&?;KL>C7
M]HOX/2X = 6#_RUU%>B/^.B^^#M6^GP*?P4[1OAR ^B6^.E-M;@$ .@-M>EU
M_^M#Z#KXZ', Z"_VB_@]__]T,(/_"G4I@SZB)0!T$O\VHB7HOIJ#Q *%P'0"
MZ]KK$NAW]E#HP "#Q *%P'0"ZP+KQNG_M+@  .B_M.NUZR2+/G(EA?]U NL7
MBW8$A?]]"8MV!HO']]B+^/_6@^\!=?GIT;2X  #HD;3KU.L=Z+KUB_A0Z$,
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
MY(E&\(E6\HM6!HM&!"M&\!M6\HE&](E6]H/Z 'Q7?P4]  !T4(L^?B6+QXO
MF3E6]G\*? 4Y1O1S XM^]%97Z/K*@\0$B_"%P'T#O@  B\>9B4;PB5;RBU;V
MBT;T*T;P&U;RB4;TB5;V@_H ?[=\!3T  '6P_W;Z_W;XZ$_C@\0$B\;K .FS
MH+@, .ASH.E2_^F' (MV"(7V?P6X  #K>('^A !\!;C__^MMOP  Z.GCB4;X
MB5;Z_W8&_W8$Z WC@\0$N   4%:-AFG_4.C@VX/$!HOXB\<KQGPJZ+SC*T8$
M&U8&B_"#/H % 'X6BQ[$)(M''*F  '0%N ( ZP.X 0 K\.L#OO___W;Z_W;X
MZ+SB@\0$B\;K .D@H+B4 .C@G^EP_^L/N/__4.@I (/$ NL Z0:@N   Z,:?
MZ^GK#[@! %#H$ "#Q +K .GMG[@  .BMG^OIZP_HO0'_=@3H#@"#Q +IU)^X
M  #HE)_KZ>F= 8N^! #H(>-24.C%R(/$!(OPA<!]#;@$"%#HIB*#Q *^  "+
M'M8DBT<$B89:_XL>UB2+1P8#AEK_B898_XO>T>.+G^ DBU<"BP>)1NR)5NZ-
MAEW_B4;XQD;W (7_?@+K2(O& \<[AEK_? /IW "+QBN&6O\#^(NV6O^+WM'C
MBY_@)(M7 HL'B4;LB5;N_W;N_W;LZ,;A@\0$B\?WV(OX5^A/ 8/$ NGR (O&
M \<[AEC_?P/IE "+AEC_*\8K^(N&6/](B_"+WM'CBY_@)(M'!(O F8F&5/^)
MEE;_B][1XXN?X"2+5P*+!P.&5/\3EE;_B4;LB5;N.[9:_WXGC43_B]C1XXN?
MX"2*1PN8B$;WA<!T$8U$_XO8T>.+G^ DBT<&B4;R_W;N_W;LZ##A@\0$C4;L
M4(U&[%#H)=F#Q 2#[P%^!H-^\ !UY^M1 _<[MEC_?#9.B][1XXN?X"2+1P2+
MP)F)AE3_B996_XO>T>.+G^ DBU<"BP<#AE3_$Y96_U)0Z-G@@\0$ZQ.+WM'C
MBY_@)/]W O\WZ,3@@\0$Z2R>N*@ Z.R=Z5K^ZT&+/M8DBQ;.)*',)(E&^(E6
M^N@%X*'*)"7XWPE%#%?H9LF#Q *+10P)!LHD@2;*)/?RBU;ZBT;XH\PDB1;.
M).G@G;@$ .B@G>NWZ8, BT8$0(OXA<!_ NMTQT;Z  "+-M(DQT;X  #H6]Z)
M1OH]__]U NM9@W[Z"G4LBQ[$)(M''*F  '0;Z#S>B4;Z/0T =07_1OCK%8-^
M^O]T ^AYWNL%_T;XZP6#[@%UO(/O 76N@W[X '02BQ[$)(M''*F  '0#Z%/>
MZ%#>N $ ZP#I4IVX! #H$IWI=/\ ZSJ+/L0D@VT$ 7P+BQW_!8M&!(@'ZPK_
M=@17Z&52@\0$@P;,) &#%LXD +K__[C__U)0Z/>]@\0$Z0R=N   Z,R<Z[[K
M&(M^!H7_?@[_=@3HK?^#Q *#[P%U\NGJG+@  .BJG.O@ZR.+'L0DBT<<J8
M= JX#0!0Z(7_@\0"N H 4.A[_X/$ NF]G+@  .A]G.O5ZQR+O@0 B]]'B@>8
MB_"%P'0)5NA7_X/$ NOKZ9><N   Z%><Z]SK(8N^! "+M@8 A?9^$HO?1XH'
MF%#H+_^#Q *#[@%U[NELG+@  .@LG.O7ZS>+O@0 B\<E^/^+\.CA^B7X_XO6
M*]"Y P#3^E*X"0!0Z#S_@\0$B\<KQE"X( !0Z"W_@\0$Z2N<N   Z.N;Z\'K
M#.@6WH$.RB0( .D5G+@  .C5F^OLZQ+_=@;_=@3HE-Z#Q 3HV?_I^9NX  #H
MN9OKYNL2_W8&_W8$Z+[>@\0$Z+W_Z=V;N   Z)V;Z^;K#_]V!.B"WH/$ NBD
M_^G$F[@  .B$F^OIZS7HP]^#^@!U!ST  '4"ZR/H*-S'!LPD  #'!LXD  "+
M'M8DQT<.  #'1Q   ($.RB0  >F%F[@  .A%F^O#ZRGHU]Z)1OB)5OK_=@;_
M=@3H0=Z#Q 3_=OK_=OCHO-Y24.@. (/$".E2F[@$ .@2F^O/Z3$!BU8&BT8$
M.U8*?"M_!3M&"'8DBU8&BT8$B4;XB5;ZBU8*BT8(B48$B58&BU;ZBT;XB48(
MB58*_W8&_W8$Z)K=@\0$BU8*BT8(*T8$&U8&B4;XB5;Z_W;Z_W;X_S;$).C!
M48/$!HL6SB2AS"2)1O2)5O:+5@:+1@2CS"2)%LXDN@  N   4E#HH[N#Q 2+
M5O:+1O2CS"2)%LXDBQ;.)*',)#M6"GP=?P4[1@AR%HL6SB2AS"0K1O@;5OJC
MS"2)%LXDZR"+%LXDH<PD.U8&?!1_!3M&!'8-BU8&BT8$H\PDB1;.)(L6K"6A
MJB4[5@I\'7\%.T8(<A:+%JPEH:HE*T;X&U;ZHZHEB1:L)>L@BQ:L):&J)3M6
M!GP4?P4[1@1V#8M6!HM&!*.J)8D6K"7H3-SI%IJX" #HUIGIQO[IB0#_=@;_
M=@3HD]R#Q 2+5@J+1@@K1@0;5@924.BGVX/$!(OXA?]U NM>@SZF)0%U/HL>
MKB71XXNWL"6%]G0PBU8&BT8$.U8*?!M_!3M&"'845E?H!5.#Q 2+'JXET>.)
MO[ EZPA75NCQ4H/$!.L'5^@A (/$ O]V"O]V"/]V!O]V!.@]_H/$".F!F;@
M .A!F>EN_^LV_P:N)8,^KB4(? ;'!JXE  "+'JXET>.+O[ EA?]T!U?H?U*#
MQ *+'JXET>.+1@2)A[ EZ4"9N   Z "9Z\+I30''1O0  (M6"HM&""M&!!M6
M!HE&^(E6^H/Z 'TVBU8&BT8$B4;XB5;ZBU8*BT8(B48$B58&BU;ZBT;XB48(
MB58*BU;ZBT;X*T8$&U8&B4;XB5;Z_W8&_W8$Z&S;@\0$@WX, G5FO@  @V[X
M 8->^@"#?OH ?%/HL]F+^%#HDN2#Q *%P'0%O@  Z]V%]G05@_]!? R#_UI_
M!XU%((OXZP+KQNL6O@$ @_]A? R#_WI_!XU%X(OXZP+KKNB;V5?H!=J#Q +_
M1O3KG^M2@WX, '4/OF$ QT;V>@#'1@S@_^L-OD$ QT;V6@#'1@P@ (-N^ &#
M7OH @W[Z 'PBZ"[9B_@[\'\7.W[V?Q+H3-F+QP-&#%#HL=F#Q +_1O3KT(L6
MSB2AS"2)1@B)5@KH =J#?O0 = S_=@;_=@3HO+B#Q 3_=@K_=@CHX?N#Q 3I
MZ)>X" #HJ)?IJO[K'HM&!"5_ (OX@_]A? J#_WI_!8U%X.L"B\?K .F_E[@
M .A_E^O: .L1N%5;4+@8"%#HQP&#Q 3IHY>X  #H8Y?KY^L-N"0(4.@E (/$
M NF,E[@  .A,E^OKZPVX, A0Z X @\0"Z767N   Z#67Z^OK2/]V!.BC%8/$
M HOXA<!U NLTBS;$)( ] '4=@WP6 '4,N#T(4.BE&(/$ NL)_W06Z*D"@\0"
MZP=7Z* "@\0"5^AL$H/$ NDCE[@  .CCENNPZQ&XKUQ0N%,(4.@L 8/$!.D(
ME[@  .C(ENOGZRJ+'L0DBT<<J0$ = RX  !0Z* #@\0"ZP^X80A0Z/(7@\0"
MN $ ZP#IU):X  #HE);KSNF3 ,=&^@$ BS;$)(L^QB2#?OH ='&%_W1M]T4<
M 0!T88-]%@!T6X,^="4 = ]7Z-.L@\0"Z)3_B4;ZZT7_=12X@0A0Z,,4@\0$
MB4;X@W[X '4'QT;Z  #K+8M>^(H'F%#HB?Z#Q (]60!U#5?HE:R#Q +H5O^)
M1OK_=OCHD!&#Q *+?1+KB5;H>JR#Q *+1OKK .DVEK@$ .CVE>ED_^L/N @
M4.C9 H/$ NL Z1R6N   Z-R5Z^GK#[@) %#HP *#Q +K .D#EK@  .C#E>OI
MZP^X"@!0Z*<"@\0"ZP#IZI6X  #HJI7KZ>LG_W8$Z!@4@\0"B_B%P'4"ZQ.
M/0!T!U?_5@:#Q )7Z (1@\0"Z;F5N   Z'F5Z]'I%0&+O@0 BS;&)(7V=!N#
M?!8 =!!7_W06Z-62@\0$A<!U NL%BW02Z^&%]G0*5NB3JX/$ NG= +@  %!7
MZ!.)@\0$B4;VA<!]#X,^P"4"= ;HLP'IO@#K"?]V]NA$A8/$ E?H2 6#Q *)
M1OC_=OCH):N#Q *+\(7V=%I6Z!K=@\0"A=)U H7 =0:#?!8 =$6#?!8 = 6+
M1!;K [C<"%#_=!2XJ@A0Z$83@\0&B4;Z@W[Z '4"ZUZ+7OJ /P!T"_]V^NAH
MJH/$ HOP_W;ZZ"00@\0"ZPO_=OCH4JJ#Q *+\%;HX:J#Q *#?O8 ?0E7Z.H$
M@\0"ZQ]7Z"< @\0"A<!U%(-\%@!T#O]T%NCG#X/$ L=$%@  Z9F4N 8 Z%F4
MZ>+^ZR_H9JR%P'4"ZR/_=@3HJ02#Q +_=@3H'P"#Q *%P'4%N   ZPCHL*>X
M 0#K .E?E+@  .@?E.O)Z:$ N   4/]V!.CLAX/$!(OXA<!]">B4 +@  .F"
M ,<&P"4  %?H0$>#Q *+\(7 =3.#_R!\#+CF"%#HE!6#Q +K%H,^P"4 = 7H
M8 #K"K@-"5#H^A:#Q )7Z.R#@\0"N   ZSQ6_S;$).AG3(/$!.A#UXE&^(E6
M^NB7ZXL6SB2AS"0[5OIU!3M&^'0,_W;Z_W;XZ(.T@\0$Z.[5N $ ZP#ILY.X
M! #H<Y/I5O_K#;@F"5#H)0"#Q +IFY.X  #H6Y/KZ^L-N#,)4.@. (/$ NF$
MD[@  .A$D^OKZR?_=@3HH12#Q *X00E0Z)<4@\0"_S; )>CCX8/$ E#HU!2#
MQ +I4Y.X  #H$Y/KT>G& HM&!"4' (E&^L>&QOX! (M&^NM9QT;X10GK8X,^
MV"0 =1"X4@E0Z)H4@\0"N   Z9$"QT;X7 GK18L>KB71XX._L"4 =1"X:PE0
MZ'84@\0"N   Z6T"QT;X>PGK(;B-"5#HW16#Q *X  #I5@(]  !THCT! '2D
M/0( =+WKW_=&! @ ="?_=OCH^Q"#Q *+\(7 =0:X  #I*0)6C4:04.@BD(/$
M!%;HX@V#Q *-1I"+\(L^Q"3W1@0( '0%@#P =2"#?18 =1"XGPE0Z-L3@\0"
MN   Z>P!_W465NCFCX/$!(V&J/Y05N@ZCX/$!(F&IO[_-@P05O\V"!"-ALC^
M4.C- 8/$"/\V#A!6_S8*$(V&+/]0Z+D!@\0(C88L_U#HI9"#Q +H:@.#OJ;^
M 'P;N ( 4%;HFGN#Q 2%P'0,Z'7^QX;&_@  Z7$!_S8&$(V&+/]0Z(& @\0$
MB4;VA<!]#.A3_L>&QOX  .E/ 8-^^@!U!U;H_0&#Q *XM0E0Z-P2@\0"@[ZF
M_@!\)HN&K/XE_P]0C88L_U#H4WN#Q 3_MK+^_[:P_HV&+/]0Z%Q[@\0&BT;Z
MZVG_=O97Z$1&@\0$B8;&_NMHZ+33BQ:L):&J)2L&S"0;%LXD4E#H)].#Q 2)
M1O3_=O:X @!0_W;TZ(I?@\0&B8;&_O]V].AY2H/$ NLL_W;VN ( 4(L>KB71
MX_^WL"7H9%^#Q :)AL;^ZP\]  !TDCT! '2=/0( =-3_=O;H"(&#Q *+AL;^
MH\ EA<!T$KC "5#HA?V#Q +'AL;^  #K:,>&QOX! (-^^@!U ^@PI(V&R/Y0
MZ%V/@\0"C8;(_E!6Z).#@\0$A<!U!U;H1H^#Q )6C88L_U#H?(.#Q 2%P'47
MC88L_U#H*X^#Q *XS@E0Z+81@\0"ZQ"XU@E0Z!(2@\0"QX;&_@  Z*\!BX;&
M_NL Z8*0N%8!Z$*0Z3']ZVR+?@3&!0#_=@CH: "#Q *+\(O&*T8(4/]V"%?H
M(XZ#Q :#?@8 = K_=@97Z%6-@\0$5^@_ (/$ HOX5E?H1(V#Q 2+=@J%]G0;
M5NC2C8/$ KH. "O0 ]>+VL8' %97Z"*-@\0$BT8$ZP#I"Y"X  #HRX_KC.LC
MBW8$B_Z+WT>*!YB)1OJ%P'0*@W[Z+W4"B_?KZ8O&ZP#IWH^X @#HGH_KU>LJ
MBS[$)/]V!.BQ"H/$ HOP@WT6 '0)_W46Z/P*@\0"B746@0[*) 0 Z:J/N
MZ&J/Z\[IN@#HY0"+?@2%_W0"ZQF#?@0 = /IGP!7Z%JF@\0"B_B%P'4#Z8\
M_W44N.0)4/\V@B6-1IA0Z.2,@\0$4.AMC(/$!%#H9HR#Q 2#?@8 = Z-1IA0
MN.<)4.@T?(/$!/\V!A"-1IA0Z,9]@\0$B_"%P'T=@WX& '05_S; )>BEW8/$
M E"X] E0Z 5\@\0$ZQ]65^C$0X/$!%;H^'Z#Q *#?@8 = JX 0I0Z.1[@\0"
M@64<_O_I6/_H# #IY8ZX9 #HI8[I/?_K&X,^%@@ ?Q&X 0!0N ,*4.AJ@H/$
M!*,6".F_CK@  .A_CNO=ZQ/_-A8(Z*!^@\0"QP86"/__Z:*.N   Z&*.Z^7I
ML@&X"@I0Z*,/@\0"Z'BPB4;Z4.@)LH/$ HOP]T;Z@ !T"K@="E#HMP^#Q *#
M_EMU'K@@"E#HJ ^#Q +H2; -@ ")1OI0Z->Q@\0"B_#K(8/^7'4<N",*4.B%
M#X/$ N@FL T  8E&^E#HM+&#Q *+\(M&^B5_ (A&\,9&\0"-1O!0Z%P/@\0"
MH<0DB4;N@SX("@!T#/\V" KH-Z2#Q +K7+@G"E#H!0^#Q +_-AX0Z"\/@\0"
MN# *4.@E#X/$ K@T"E#H4*.#Q *C" I0Z .D@\0"_S8>$.@P^8/$ H7 =1S_
M=N[H[*.#Q +_-@@*Z/*D@\0"QP8("@  Z;4 C4;PB_B+WT?&!SR+WT?&!T:+
MQIE24%?H.->#Q :+^(O?1\8'/NC%S[@  %"-1O"+URO04HU&\%#HG-J#Q :%
MP'4,N#X*4.B;#H/$ NM>Z*O0B4;HB5;JZ/'5A<!U!>AIT.OTN$T*4.BOHH/$
M HE&[.B)T(E&Y(E6YHM6ZHM&Z"M&Y!M6YE)0Z,W.@\0$4/]V[.B&18/$!/]V
M[.@CJX/$ O]V[.A I(/$ NBC#O]V[N@DHX/$ NGEC+@8 .BEC.E%_NM&@SY6
M"@!T#+A<"E#H+0Z#Q +K,(L^6@J%_W4/N(D*4.@THH/$ J-:"HOX5^C1T(/$
M L<&5@K__\<&?"4! ($.RB0$ .F4C+@  .A4C.NRZSZ#/E8* 'X;@RY8"@%\
M%+H  +@  %)0_S9:"NB\T(/$!NL9@SY6"@!T$L<&5@H  ,<&?"4  ($.RB0$
M .E,C+@  .@,C.NZZTR#/E8* '0,N),*4.B5#8/$ NLV@SY:"@!U#+BI"E#H
M@@V#Q +K(Z%R)4BC6 J%P'P8N@  N   4E#_-EH*Z%'0@\0&QP96"@$ Z?:+
MN   Z+:+ZZSK5HL^6@J%_W4,N+X*4.@^#8/$ NL_BS;$)%?H":*#Q +H&LZX
MTPI0Z._4@\0"Z!S/B4;XB5;Z5^C6J8/$ NC]S5;HXJ&#Q +_=OK_=OA7Z'="
M@\0&Z9:+N 0 Z%:+ZZ+IIP"+/GHEA?]\"\<&>B7__XO'Z9$ @SY6"@!^4XL>
M6@J#;P(!?!.+'EH*_P>+!TB+V(H'F"7_ .L*_S9:"N@U0(/$ HOX@___= 2+
MQ^M8@RY8"@%\%+H  +@  %)0_S9:"NAXSX/$!NNLQP96"@  Z#\BB_B#/E8*
M 'TGBQY:"H-O! %\$HO'F(L>6@K_!XL72HO:B ?K"U?_-EH*Z"E @\0$B\?K
M .GDBK@  .BDBNE0_^M6@SY6"@!^1XL>6@J#;P(!?!.+'EH*_P>+!TB+V(H'
MF"7_ .L*_S9:"NB6/X/$ HOX/?__=0>#/E@* 'X2BQY:"O]' HL>6@K_#[@!
M .L%N   ZP#I@XJX  #H0XKKHNL<@SY6"@!^",<&5@H  .L*@SY6"@!] ^C4
M_>E=BK@  .@=BNO< .G; ,<&R"7&/\<&RB7&/[@  %#_-H8DZ(Y_@\0$N
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
M^NCHF8/$ NB6W;H  +@  %)0Z*W%@\0$N&H,4+@! %#H-@"#Q 3HEL=24+H
M +@  %)0Z'#I@\0(_W;XZ*V9@\0"Z%O=_W;ZZ+&:@\0"Z6*#N 0 Z"*#ZX;I
MBP&+1@:CU"2!#LHD! #'1O0  ,=&^*,,QT;VM S_=OCH_0>#Q *)1O*%P'4#
MZ3L!BS;:)?]V]O]V\O]V^+C"#%#H4P&#Q B)1O2%P'4#Z1H!H=PEB4;PBT8$
MB4;ZBQ;.)*',)(E&[(E6[K@  %!6_W;RZ![0@\0&A<!U ^GL .BTYH-^^@!U
M ^ASJ8-^^@!U!^BSI(OXZP._( "+Q^M]Z<8 B\:9B4;HB5;JBQ;.)*',)"M&
MZ!M6ZE)0_S;.)/\VS"3H2N>#Q C_=O#_=O3H^>6#Q 2#_RYU ^F/ .F) +C*
M#%#HA@.#Q +KH/]V[O]V[.A8YH/$!.N)ZW"!#LHD 0#I?O__1OKK@K@6#5#H
M7 .#Q +I=?^)/GHEZT\]( !T@7\;/0< =-$]# !TSCT2 '37/1< =-(]&P!T
MO>O8/2X =0/I7/]_##TA '2W/2P =+?KPCT_ '2&/5X =(T]?P!U ^DY_^NN
MZ?+^BQ[$)(M''J/4)($.RB0$ (-^] !T"?]V].@5_8/$ NG,@;@4 .B,@>EL
M_@#IF *A8B&)AB3_QP9B(0  H=8DB4;X_S9X)>ATGH/$ NCCY8L>UB2+1P2C
M)@W_!BH-QH8N_P#_=@K_=@C_=@;_=@2-AB[_4.@@?X/$ HV6+O\#PE#HNWB#
MQ J-AB[_4.@(?X/$ HF&+/_W!LHD_-]U ^F[ .BQ&(7 = /IL0#HD<.-AB[_
M4.AERH/$ HN&+/^9B88@_XF6(O^+%LXDH<PD X8@_Q.6(O^CS"2)%LXD@0[*
M)  !N   4.A[LH/$ O<&RB0$ '01_S9P)>@#H(/$ E#H^*B#Q +_-LXD_S;,
M).@2J8/$!($FRB0#(*&4):,F#>BV%^@:PXN&+/^94E#_-L0DZ)<W@\0&BX8L
M_YF)AB#_B98B_XL6SB2AS"0KAB#_&Y8B_Z/,)(D6SB3HQL+'!G(E 0#'!G0E
M  #'!H E  #H;**+\(/^&W0*@_X*= 6#_@UU ^FV (/^!W4O_W;XZ"Z=@\0"
MQP8H#0$ N   4.BP 8/$ L<&*@T  .C(]8N&)/^C8B&X  #I# %6Z+BC@\0"
MB88F_X.^)O];=17H#Z(-@ "+\%#HGJ.#Q *)AB;_Z^3'1OHL#8M>^HH'F"7_
M (OXA<!T#3F^)O]U NL%_T;ZZ^2+Q^L=5NC_H8/$ NL@_S9X)>@4JX/$ NL4
MZ$7XZ%3UZQ8]  !T\SU. '3BZ]>#/H E G4#Z3#_Z5O^Z+W#B88H_XF6*O^#
M^@!\''\%/?\ =A6X2 U0C88N_U#H#7V#Q 3H$/7I_/V+OBC_Z-'!C88N_U#H
MI<B#Q *-10&C* V-10%0Z'KZ@\0"B4;ZBT;ZB4;VB3[<)87_=!#H2,"+7OJ(
M!_]&^H/O 77PBU[ZQ@< _W;XZ B<@\0"BX8D_Z-B(8M&]NL Z2=_N-P Z.=^
MZ5_]ZPV#/BH- '0#Z,0 Z0]_N   Z,]^Z^OK$+@  %#_=@3HR "#Q 3I]7ZX
M  #HM7[KZ.L0N $ 4/]V!.BN (/$!.G;?K@  .B;?NOHZQ"X @!0_W8$Z)0
M@\0$Z<%^N   Z(%^Z^CK$+@# %#_=@3H>@"#Q 3IIWZX  #H9W[KZ.L0N 4
M4/]V!.A@ (/$!.F-?K@  .A-?NOHZQ"X!P!0_W8$Z$8 @\0$Z7-^N   Z#-^
MZ^CK$_]V!K@+ %#_=@3H*0"#Q ;I5GZX  #H%G[KY>L1N   4+@  %#H#@"#
MQ 3I.WZX  #H^WWKY^F4 (MV!HL^UB3'!BH-  "#?@0 =0F#/B@- '4"ZW7_
M-G@EZ-R:@\0"]\8" '0%Z&[ ZP/H?+Z#?@0 =!WWQ@@ = [_=@C_=@3H6.&#
MQ 3K"?]V!.@(QX/$ N@UP:,H#>C(O_?& 0!T'O?&! !T ^@T]H$.RB0  ;@
M %#H*:^#Q +HEQ3K!H$.RB0  5?H<9J#Q +IG'VX  #H7'WI8__K-8N^!@"+
MW]'CB[?@)/\V?B7_=@3_= SHQGN#Q ;_=@3H%WN#Q *)1 Y7Z(^R@\0"Z$@4
MZ5Q]N   Z!Q]Z\/K0XL>)@W1XXNWX"2+? C&AGC_ +B$ "O'4/]V!%?_= :-
MAGC_4.CU>H/$!E#H[GJ#Q ;_-B8-C89X_U#H@O^#Q 3I#WVXA #HSWSKM>L9
MN%H-4.@: (/$ O]V!.A'$X/$ NC8$^GL?+@  .BL?.O?ZRW'!BH-  "X  !0
MH78E2%#HT0>#Q 3HE@C_=@3H%A.#Q +HIQ/'!I(E&/SIM7RX  #H=7SKRP#K
M"+@  .L Z:)\N   Z&)\Z_#K,;CD)5"X 0!0Z)]L@\0$ON0EO]XEN0, ZP#S
MI8$.XB4@ ($FXB7G_Z#E)9BCAB7I9WRX  #H)WSKQ^L1N-XE4+@! %#H?&R#
MQ 3I3'RX  #H#'SKY^L1N.0E4+@! %#H86R#Q 3I,7RX  #H\7OKY^L#Z21\
MN   Z.1[Z_7K#[@  %#H*0"#Q +K .D+?+@  .C+>^OIZP^X 0!0Z!  @\0"
MZP#I\GNX  #HLGOKZ>F. (L6SB2AS"2)1O:)5OB#?@0 = 6X= WK [B%#5#H
MCP"#Q *+^(7 =0+K8;BV=5"X#@!0Z')R@\0$B4;ZN $ 4.@G<H/$ O]V!/\V
MVB57Z-'(@\0&B_"X  !0Z UR@\0"_W;ZN X 4.@^<H/$!(7V= 7H4=_K%O]V
M^/]V]NAXO8/$!+B.#5#HP/R#Q +I67NX!@#H&7OI:?_K#;B<#5#H\_V#Q +I
M07NX  #H 7OKZ^MB_W8$Z&_Y@\0"B_B%P'4%N   ZTN+-NHE@#T =2E7Z%GV
M@\0"B_Z%]G4/N*$-4.B!_(/$ K@  .LF_S;:)5;HB_R#Q 3K%87V= =6Z"SV
M@\0"B3[J):'<):/:)8O'ZP#IU7JX  #HE7KKENL-N   4.@E (/$ NF^>K@
M .A^>NOKZPVX 0!0Z X @\0"Z:=ZN   Z&=ZZ^OIUP+'AOS^ 0"^  #'1OH
M (L6SB2AS"2)A@#_B98"_Z'6)(F&_O['AOC^  #H,9R+^(.^^/X =02%_W5P
MZ%>\_S9X)>@GEX/$ NB6WH-^! !T!;BW#>L#N,(-4.B+W8/$ E:-1LA0Z*;=
M@\0$@[[\_@!U"KC-#5#H;]V#Q *X  !0Z(^K@\0"A?]T$?\VSB3_-LPDZ#NB
M@\0$Z.L0_[;^_NC*EH/$ L>&^/X! (7_=0F!#LHD" #HBJ#HT)N+^(O'Z:0
MA?9_ ^EB_TX[=OI^ ^E9_\>&_/X! #MV^G4#Z4O__T[ZC88 _XO6N0( T^(#
MPHO8_W<"_S?HEMV#Q 3I*__HB)N+^.F5 ,>&^OX  .D@ <>&^OX! .D7 8.^
M_/X =!'_M@+__[8 _^ADW8/$!.E2 8MV^L>&_/X! .GM_H7V= /I/P'_=@3H
M:/V#Q +IA %7Z*Z<@\0"/?Y!= >)/GHEZ2 !ZS<]$0!TE7\4/0< =*@]" !U
M ^E(_ST- '2_Z] ]$@!TBST3 '4#Z7K_/1L =*L]?P!U ^DG_^NT@_XQ?!>X
MV U0Z%7Z@\0"N $ 4.A*;X/$ NG+ (O'F(U6R /6B]J(!T:#OOS^ '4#Z5O^
M@WX$ '0$B\;K!8U$__?84.AONX/$ O]V!%:-1LA0Z.;%@\0&B8;\_H.^_/X
M="R)=OKH][N)AO3^B9;V_HV& /^+UKD" -/B \*+V(N6]OZ+AO3^B0>)5P+K
M ^BBNNGZ_8N&^OX[1@1T#HN&^OZ)1@2%]G\#Z>/]A?9_-8,^ZB4 = B+-MHE
MA?9_ ^G-_?\VVB6-1LA0_S;J)>B\#X/$!HLVVB6)/GHEQX;X_@$ Z:K]Z6+_
M@S[J)0!T"O\VZB7H3O.#Q *-1 %0Z!+S@\0"H^HE5O\VZB6-1LA0Z'L/@\0&
MB3;:)>C=N?\V>"7HK92#Q +H'-S_MO[^Z*"4@\0"@0[*)  @Z<5WN @!Z(5W
MZ2#]Z9P!QP9V)1@ QP;2)$\ QP:()0  QP::)0$ QP:6)0$ QP:>)00 QP:@
M)0$ BQZ&)='CBX?P#:/N)8,^UB4 =1>XJ Y0Z'QF@\0"H]8EA<!U!L<&UB6M
M#NL#Z8H N+$.4/\VUB7HOO*#Q 2%P'0(QP;P)0( ZW"XM0Y0_S;6)>BD\H/$
M!(7 = C'!O E 0#K5KB\#E#_-M8EZ(KR@\0$A<!T",<&\"4! .L\_S;6)>BD
M"(/$ H7 = C'!O E  #K)O\VUB6X 0!0Z+?R@\0$N,,.4+@! %#HJ?*#Q 2X
M 0!0Z#QF@\0"H? EZ8@ QP;L)7\ QP:>)0, QP:<)0( QP:8)0( QP:0)0(
MQP:*)0$ QP:.)0( QP:,)0$ @SZ&)0UU&,<&FB4% ,<&EB4" ,<&C"42 ,<&
MBB4" ($.B"4; .L^@0Z()0L QP:<)0@ QP:8)0  QP:6)0( H88E+0< N@$
MB\C3XHD6BB6ABB6CC"7K#3T! '4#Z7#_/0( =,*#/FX. 'T3]P:()1  = 6X
M_P#K [A_ *-N#ND==K@  .C==>E;_NM@H? EZTG_-A8FZ$D'@\0"@SX>)@!T
M"O\V(";H. >#Q *X  !0Z)T&@\0"ZS&X& !0Z T,@\0"ZR6XW Y0Z"4,@\0"
MN.T.4.@;#(/$ NL//0  =+(] 0!TU#T" '3;Z;)UN   Z')UZYCK3*'P)>LU
M@SX>)@!T"O\V(B;HV :#Q +_-A0FZ,X&@\0"ZR>X'0!0Z*T+@\0"ZQNX]@Y0
MZ,4+@\0"ZP\]  !TQCT! '3>/0( =.7I7'6X  #H''7KK.M+H? EZRC_-G8E
M_S8&)NBC!H/$!.LGN/D.4.B("X/$ NL;N/P.4.A\"X/$ NL//0  =-,] 0!T
MWCT" '3EQP:2)0  QP:4)0  Z0=UN   Z,=TZZWIB@"+O@0 B[8& #LVTB1^
M!(LVTB2A\"7K65=6_S8$)NB:4(/$!E#H& :#Q +K4[@, %#H]PJ#Q *+QC5@
M %#HZPJ#Q *+QS5@ %#HWPJ#Q +K+[C_#E#H]PJ#Q *-12!0Z,D*@\0"C40@
M4.B_"H/$ NL//0  =*(] 0!TLCT" '31B3Z4)8DVDB7I<G2X  #H,G3I;?_K
M$?\V[@WHL@J#Q +_#I(EZ59TN   Z!9TZ^?K$+@' %#H<PJ#Q +H* OI/'2X
M  #H_'/KZ.L[H? EZR3_-@@FZ&D%@\0"ZR>X%P!0Z$@*@\0"ZQNX @]0Z& *
M@\0"ZP\]  !TUST! '3>/0( =.7I]W.X  #HMW/KO>E+ 8M^!(7_?P/I/@&A
M=B5(.48&?3.ADB6)1OJAE"6)1OBX  !0BT8&*\=0Z,'^@\0$_S9V)5?H'0&#
MQ 3_=OK_=OCHJOZ#Q 2A\"7IYP"#/O@E '0E_S;T)>C5!(/$ O\V^"7HRP2#
MQ *#[P%U\?\V_"7HO 2#Q +K%Z%V)2L&E"50_S8 )NC&!(/$!(/O 77IQP:4
M)?__Z;  N!  4.A["8/$ K@* %#H<0F#Q *AAB7K&;X1 .LCO@@ ZQZ^! #K
M&;X" .L4O@  ZP\M"0 ]! !W\]'@D_^G$ Y6Z.\#@\0"@^\!=;VX& !0Z"X)
M@\0"ZU>X!0]0Z$8)@\0"H88EZQ2^&0#K(+X$ .L;O@$ ZQ:^  #K$3T' '3Q
M/0D =.<]#0!TW>OJ5NBC X/$ H/O 77 ZQ4]  !U ^D1_ST! '4#Z57_/0(
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
M  #H8FCKP.L;@SZD#@!_!^CBZX7 = 6X 0#K [@  .L Z7UHN   Z#UHZ]T
MZ8@ B[X$ (NV!@"#?@@ =0+K=8O'J0$ =!6+WT>*!YB+WD:(!X-N" %U NM;
MZ^2+QJD! '5!BT8(B4;ZBT8(T>B)1@@]! !V*/]V"%97Z$, @\0&BT;Z)0$
MB48(A<!U NLEBT8(*4;Z W[Z W;ZZP:+1OJ)1@B+WT>*!YB+WD:(!X-N" %U
M[^GI9[@" .BI9^EO_^LEB[X$ (NV!@"#?@@ =!2+WX/' HL'B]Z#Q@*)!X-N
M" %U[.FY9[@  .AY9^O3 .M!N*(14.B55(/$ O\V,":XLA%0Z(=4@\0$_S8R
M)KC"$5#H>52#Q 2X# !0N-(14.AK5(/$!+@! %#H70&#Q +I;6>X  #H+6?K
MM^LLN   4.@M (/$ HOXA<!U$+@  %#H-@&#Q *+^(7 = 2+Q^L%N   ZP#I
M-V>X  #H]V;KS.D- 8-^! !T"KCS$5#H#52#Q *#?@0 = ZXZ -0N! 24.CY
M4X/$!(L^,":%_W46@WX$ '0*N#<24.CA4X/$ K@  .G( (-^! !T!;@! .L#
MN   B88@^,>&*O@  ,>&*/@  +X  (7_=0/IAP"#?@0 =!A7A?9U!;A+$NL#
MN%$24+A#$E#HE5.#Q 9&@_X(? .^  !7C88@^%#H6@V#Q 2%P'T:@WX$ '0/
M_[8D^%>X4A)0Z&=3@\0&N' 2ZT^#?00 ="N#?@0 = V^  "X@1)0Z$E3@\0"
M@WX$ '0-N   4%?H1 *#Q 3K!;B<$NL>BSWI<O^#?@0 = [_MBKXN*P24.@8
M4X/$!+@  .L Z1]FN-P'Z-]EZ>K^Z00"@WX$ '0*N,T24.CT4H/$ HL^,B:%
M_W4C@WX$ '0*N.,24.C<4H/$ H,^,"8 = :X[Q+IS &X  #IQ@&+1@2)AAKX
MQX8B^   QX8D^   QT;Z  "#?@0 =!*XJ!!0N'@04+C^$E#HF5*#Q :%_W4#
MZ7<!@WX$ '0+5[@/$U#H@5*#Q 17C88:^%#H3PR#Q 2%P'T:@WX$ '0._[8>
M^+@7$U#H75*#Q 2X,1/I5 &+10([1OIU$H-^! !T"KA$$U#H/U*#Q +K&X-^
M! !T#_]U KA'$U#H*E*#Q 3K!KA?$^D? 8M%!"7_ #W- '08@WX$ '0,N&T3
M4.@'4H/$ NL&N(43Z?P @WX$ '06]T4$ (!T!;B5$^L#N)L34.CC48/$ H-]
M" !U&(-^! !T#+BA$U#HS5&#Q +K!KBS$^G" /=%! " =22+108K!C0FJ0$

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 04:12 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 1143 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 04:09 PST
Received: by NDSUVM1 (Mailer X1.24) id 0956; Sun, 20 Dec 87 06:02:27 CST
Date: 19 Dec 87 05:16:19 GMT
From: Glen Overby <ncoverby@ndsuvax.uucp>
Subject: Re: awk/sed (looking for source)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In article <1768@botter.cs.vu.nl> ast@cs.vu.nl (Andy Tanenbaum) writes:
>In article <750@louie.udel.EDU> THELBEKK%NORUNIT.BITNET@cunyvm.cuny.edu writes
:
>>Greetings!  As far as I can see, the awk and sed sources still
>>haven't made it into BITNET -- could a reposting be made?
>>
>Is this, in fact true?  If so, I can repost.

I can't recall if it has made it to MINIX-L on Bitnet, but I do know
that it is on the archive server for Bitnet on the LISTSERV at NDSUVM1
(I maintain this).  Other networks can access this mail, but it works
best for people on BitNet due to the 80-column restriction on mail.

> I would rather not uuencode
>if I don't have to since that will increase the volume by tens of kilobytes.
>What does BITNET actual do?  If it just mungs tabs or something simple, I
>can replace all the tabs with ! or ? or some other character that is not
>otherwise used.

BitNet has always been a problem.  First of all, they run an IBM
protocol which limits lines to 80 characters.  To get around this, IBM
has come up with TWO "packetising" techniques ("DISK DUMP and "NETDATA"
to those unfortunate enough to know) which combine short lines and break
up long ones.  Unfortunately, mail does not use either of these
techniques, so lines over 80 characters long either get truncated or
wrapped (depending on what software you're using and how it is feeling
today).

I feel that the BitNet people should come up with some solution of their
own to make themselves compatable with the rest of the world, rather than
the rest of the world changing to accomodate the IBM world.  There is no
reason that all other networks should suffer the increased load of
uuencoded sources or manually translated characters just because of brain
dammage on BitNet.

For a long time we at NDSU recieved all of our news over BitNet, and I
worked around the problem of wrapped lines and expanded tabs (translation
tables were no problem, fortunately).  So what comes across BitNet *IS*
useable; it just takes some work, and a few different techniques.

Of the problems I ran into, the biggest was tab expansion.  I worked around
this problem with patches by using "patch" with the "loose" option (-l).
Wrapped lines showed up on the filenames of the shar archives and on a few
comments (a linefeed between * and / on a terminating comment).  These are
readily visible in sources that use 'sed' and start all lines with a 'X',
but had to be manually fixed.

Translation tables have not plagued me with Minix sources, but it still
exists.  The problem comes from the lack of a standard EBCDIC to ASCII
translation, as well as internal inconsitiencies in EBCDIC.  Curly braces (
{ } ) are a classic one (There are two sets of them; one for IBM's "TN"
print train and another for the "PN" train.  IBM terminals NORMALLY use the
"PN" ones, but many Unix systems use the "TN" one.  And a major mail
gateway to BitNet is a Unix machine).  Tabs are an even worse situation.
IBM's editors do not use tab characters, but instead display them as a
strange character or something (depending on how you connect to your IBM).
As a result, the gateways expand tabs.  Most gateways will expand tabs on a
FOUR character boundary rather than 8.

So, in short, the problems with BitNet can be worked around by the people
on that network so rest of us don't have to suffer for it.  Or would you
prefer to go back to using punched cards?

>Andy Tanenbaum (ast@cs.vu.nl)


--
Glen Overby
Bitnet: ncoverby@ndsuvax
UUCP: uunet!ndsuvax!ncoverby

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 04:44 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0369 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 04:44 PST
Received: by NDSUVM1 (Mailer X1.24) id 0324; Sun, 20 Dec 87 05:24:28 CST
Date: 19 Dec 87 21:44:19 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: elle.uuencoded  part 2 of 2
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

M=!B#?@0 = RXO1-0Z*)1@\0"ZP:XT!/IEP"#?@0 = NX 0!05^B5 (/$!(M&
M^#M%!G13@[XD^ %T3(-^! !T#_]V^+CC$U#H9U&#Q 3K!;C[$^M=@WX$ '0L
MBT4&*T;XB4;VA<!^#_]V]K@,%%#H0%&#Q 3K$(M&]O?84+@9%%#H+E&#Q 2+
M108#10B)1OB+-8E^^HO^Z8+^@WX$ '0-_W;XN"D44.@(48/$!+@  .L Z0]D
MN.('Z,]CZ?/]ZVR+O@0 @WX& '4;]T4$ (!T!;A!%.L#N$844%>X-!10Z-!0
M@\0&_W4&N$L44.C#4(/$!/]U"O]U"(,^7A  = 6X413K [A;%%#HIU"#Q :X
M8!!0_W4$Z! +@\0$4/]U!+AC%%#HC%"#Q ;IF&.X  #H6&/KC.D) 8-^! !T
M"KAO%%#H;E"#Q *#?@0 = ZXZ -0N(\44.A:4(/$!(L^-B:%_W46@WX$ '0*
MN+844.A"4(/$ K@  .G$ (-^! !T!;@! .L#N   B88@^,>&*O@  ,>&*/@
M +X  (7_=0/I@P"#?@0 =!A7A?9U!;C*%.L#N- 44+C"%%#H]D^#Q 9&@_X(
M? .^  !7C88@^%#HNPF#Q 2%P'T:@WX$ '0/_[8D^%>XT110Z,A/@\0&N.X4
MZTN#?00 =">#?@0 = V^  "X_Q10Z*I/@\0"@WX$ '0)5^B' (/$ NL%N!H5
MZQZ+/>EV_X-^! !T#O^V*OBX*A50Z'U/@\0$N   ZP#IA&*XW ?H1&+I[O[K
M2;A+%5#H8$^#Q *XZ!!0N&L54.A23X/$!+@B$5"X<150Z$1/@\0$N   4+C>
MCE"X%@!0N  (4.CM$X/$"+AU%5#H)$^#Q +I,&*X  #H\&'KK^MQB[X$ (MU
M!/?& $!T!;A4 .L#N"  4/?& (!T!;A, .L#N"  4/?& "!T!;@J .L#N"
M4+AW%5#HV4Z#Q C_=1#_=0[_=13_=1+_=0S_=0K_=0C_=0;_=03_=0+_-5>X
M?A50Z*Y.@\0:N   ZP#IM6&X  #H=6'KA^LKN   4+@  %#H* "#Q 2+^(7
M= 2+Q^L.N $ 4+@  %#H$ "#Q 3K .F 8;@  .A 8>O-ZTO_=@;_=@2-AB#X
M4.A% (/$!HOXA<!T!(O'ZRV-AB#X4+BGD%"X%@!0N  (4.CT$H/$"(OX@WX$
M '0*N*P54.@C3H/$ HO'ZP#I*V&XW ?HZV#KK>FX (N^! "#?@8 = 6X 0#K
M [@  (-^" !T!;H$ .L#N@  "\(- @")!<=%"   QT4*  "+-C8FA?9T<597
MZ*H'@\0$A<!]-X-]! !]&8-^!@!T#KCH U"XKA50Z+)-@\0$N,D5ZU&#?@8
M= W_=02XWA50Z)I-@\0$N/85ZSF#? 0 ="2#?@8 = JX!Q90Z']-@\0"@WX&
M '0)5NA<_H/$ NL%N"06ZP^+-.N+BT4(B44&N   ZP#I:&"X @#H*&#I/__I
MX@.+O@0 BUX&BP<E! ")1NR#?NP = R#?0P =0:X  #IO@.+7@:+!R4! (E&
M\HM>!HM'"(E&[E?_=@;HZ :#Q 2%P'TIBUX&@W\$ 'P&N   Z8T#@W[R '0.
MN.@#4+@T%E#HYTR#Q 2X41;I<P.#?NP = 6+10CK XM% HOPA<!T%E;_=@;H
MG0:#Q 2%P'P$B_[K NL"Z]:%]G1JBUX&@W\$ 'T:@W[R '0.N.@#4+A>%E#H
MEDR#Q 2X>Q;I(@.#?O( ="&+7@:+1P2+7@8[1P9]!;BG%NL#N+864+B(%E#H
M:4R#Q 2#?O( = E6Z$;]@\0"ZQ&#?NP = 6XMQ;K [C$%NG; HM>!HM&[HE'
M"(M>!HE'"H-^\@!T&8-^[ !T!;CB%NL#N.@64+C,%E#H&TR#Q 2#?NP =%N+
M10R)1OB#?O( =!R+7OC_=PC_=P:+7OC_=P+_=OBXZ190Z.U+@\0*BU[X.7\$
M=!^#?O( =!-7BU[X_W<$N ,74.C.2X/$!NL&N"P7Z5@"QT;T  #'1O8  .L0
M@W[R '0*N#<74.BJ2X/$ H-^\@!T#K@B$5"X.1=0Z)9+@\0$O@  A?]U ^D)
M H-^\@!T!U?H:?R#Q *#?NP = 6+10CK XM% COP=#B#?NP =!J#?O( = RX
M/1=0Z%=+@\0"ZP:X4!?IX0'K&(-^\@!T#+A?%U#H/4N#Q +K!KAM%^G' 8M%
M!"7_ #W3 '08@W[R '0,N'L74.@:2X/$ NL&N(H7Z:0!@WT, '0D@WT0 'P&
M@WT4 'T8@W[R '0,N)D74.CP2H/$ NL&N*T7Z7H!@W[L '0#Z8\ BT4*B4;Z
MA<!U ^F  (M>^HM'!"7_ #W- '08@W[R '0,N+X74.BT2H/$ NL&N,X7Z3X!
M]T4$ "!U+8M>^HM'"HO N@  .540=04Y10YT&(-^\@!T#+C9%U#H@$J#Q +K
M!KCS%^D* 8M>^HM'"(M>^CM'"G,8@W[R '0,N/P74.A:2H/$ NL&N!,8Z>0
MZUF+10P[1OAT&X-^\@!T#_]V^+@D&%#H-4J#Q 3K!KA &.F_ (M5%(M%$CM6
M]G\?? 4[1O1S&(-^\@!T#+A/&%#H"TJ#Q +K!KAN&.F5 (M5%(M%$HE&](E6
M]E?_=@;HQP.#Q 2%P'U2BUX&@W\$ 'T9@W[R '0.N.@#4+B#&%#HS$F#Q 2X
MH!CK68-^\@!T(XM>!HM'!(M>!CM'!GT%N,X8ZP.XWAA0N*T84.B@28/$!.L%
MN-\8ZROK%(OW@W[L '0%BT4&ZP*+!8OXZ?#]@W[R '0*N.<84.AS28/$ K@
M .L Z7I<N!  Z#I<Z17\ZQ#_=@2X]!A0Z%-)@\0$Z5]<N   Z!]<Z^CK$K@
M %#_=@3H$ "#Q 3K .E#7+@  .@#7.OFZ?<"BWX$@WX& '0+5[@3&5#H%4F#
MQ 2%_W48@WX& '0,N!X94.@!28/$ NL&N   Z<0"@WX& '0D_W4._W4,_W4*
M_W4(_W4&_W4$_W4"_W40_S6X+QE0Z,](@\04@WX& '0?N'H14+AN$5#_=0;H
M+@.#Q 10_W4&N%T94.BJ2(/$"(M%$(E&^H7 = B+7OJ+=PKK [X  (-^!@!T
M#?]V^KAV&5#H@DB#Q 2#?OH =0/IE0"#?@8 = ZX(A%0N((94.AE2(/$!(-^
M!@!T"?]V^NA ^8/$ HM>^HM'!"7_ #W3 '08@WX& '0,N(T94.@X2(/$ NL&
MN*$9Z?L!A?9T2(-^!@!T#KBH$%"XKQE0Z!A(@\0$@WX& '0+N   4%;H$_>#
MQ 2+1 0E_P ]S0!T&(-^!@!T#+BY&5#H[$>#Q +K!KC,&>FO 8-^!@!T#/\U
MN-T94.C21X/$!(,] '0OA?9T$8L%.T0&<@J+1 8#1 @Y!788@WX& '0,N.H9
M4.BH1X/$ NL&N/ 9Z6L!ZR2#?0( ?P:#?00 ?AB#?@8 = RX^AE0Z()'@\0"
MZP:X !KI10&#?@8 = JX#QI0Z&I'@\0"@WX& '00_W4"_W4"N!$:4.A41X/$
M!H-] @!T.(7V=!R#?00 =1;W108" '4/BP4K1 :+5 HKT#E5 G08@WX& '0,
MN"8:4.@>1X/$ NL&N"P:Z>$ @WX& '0*N#@:4.@&1X/$ H-^!@!T$/]U!/]U
M!+@Z&E#H\$:#Q :#?00 =#*%]G06]T4& @!T#XL%*T0&BU0(*] Y501V&(-^
M!@!T#+A/&E#HP$:#Q +K!KA5&NF# (-^!@!T"KAA&E#HJ$:#Q *#?@8 =!;_
M=0K_=0C_=0K_=0BX8QI0Z(Q&@\0*@WT* 'T7@WX& '0,N'@:4.AV1H/$ NL%
MN'X:ZSJ#?@8 =!;_=0[_=0S_=0[_=0RXB!I0Z%-&@\0*@WX& '035^A?%8/$
M E)0N)\:4.@Z1H/$!K@  .L Z4%9N ( Z %9Z0#]Z9  B[X$ (L%)0$ B4;X
MC44,B_"+10B)1OJ%P'0CB]Z#Q@*+1@8[!W4.BT4(*T;ZB44$N/__ZUB#;OH!
M=>"#[@*+10J)1OK_10K_10B!?0CH WXF]P4" '0/QT4"M1K'103__[C__^LG
MQT4(Z .+1OJ9N>@#]_F)5OJ-10R+5OK1X@/"B]B+1@:)!XM&^NL Z:58N 0
MZ&58Z6?_ZSN+O@0 B[8& ,=&^I 1@SP =!N+!(7'= 6+1 +K [@@ (M>^H@'
M_T;Z@\8$Z^"+7OK&!P"XD!'K .E?6+@" .@?6.N] .G# +CP %#H'DZ#Q *)
M1OJ%P'0(BT;Z/?__=1&XR!I0N   4.C&!H/$!.F6 (M^^K@4 %"X# !05^B(
M 8/$!HD^,":)/C0FZ(4 B_"C,B;'1 (  ,<$  #'1 3-@(ET!L=$"/__QT0*
M\ #_=0I6Z!@&@\0$B_B!3 0 $(%-! ! @WX& '0?BT8$*T4&4%?H^ 6#Q 2+
M\/]V!E;H[ 6#Q 2!9 3_/XM%""T" %!7Z-D%@\0$@64$_W_H% "C.":A,B;K
M .F05[@" .A05^DT_^MNBSXP)H7_=5J+/C@FA?]U$+C3&E"X  !0Z $&@\0$
MZTO'!0  B3XP)L<&."8  +@ $%"X# !0Z%L @\0$B_"+_H7V= N+-5?H+ "#
MQ +K[^BL_Z,X)HL^,":%_W4%N   ZPF+!:,P)HO'ZP#I%U>X  #HUU;KBNL4
MBWX$QT4$  "A,":)!8D^,";I^5:X  #HN5;KY.M5BT8$NA0 ]^)0BT8$NA0
M]^)0Z+X @\0$B_B%P'4%N   ZR^+1@8)102+10BZ  #W=@2)1OJ+1OKW9@2)
M10J+=0;_=OK_=@16Z!( @\0&B\;K .F:5K@" .A:5NNCZS.+=@2+1@B)1OJ%
MP'\%N   ZQZ+_HO& T8&B_")!<=%!   @V[Z 77JQP4  (O'ZP#I75:X @#H
M'5;KQ>LO_W8*BWX&5_]V!.C2[8/$!H,] '0%BQV)?P*#?0( = >+70*)/^L%
MBUX(B3_I)%:X  #HY%7KR>E8 HL^,B:%_W4:N   4+@  %#HL/V#Q 2+^(7
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
M^NL Z=)/N ( Z))/Z[GK-XL^.":%_W40N$T;4+@  %#H3/Z#Q 3K'(%-! "
MN  04+@, %"X,"90Z!, @\0&QT4$  #ID4^X  #H44_KP>DJ <=&^   BUX$
MQP<  (LV,B:%]G4#Z1 !BT0$A48(=0/I  &+? :+1 JZ  #W=@:)1O2+1OB)
M1O;'1O(  (M>!(L'B4;Z@V[T 7T#Z9\ @WT$ '1E@W[Z '1?]T4$ (!T!_=%
M!  8=%&#?0( =$N+7OJ+!XM>!(D'BT;Z.T;X=07'1O@  (M&^CM&]G4%QT;V
M  #_=@:X  !0_W;Z5^B2^(/$"(M>!(L'B4;Z.\9R!<=&^@  QT4$  "#?00
M=2&#?O@ = 6+7OB)/XE^^(M>!(,_ '4%BUX$B3_'!0  ZP/_1O*+QP-&!HOX
MZ5C_@W[R '4PBWP"A?]T*8-^]@!T#HM&]HE&^(O8QP<  .L,QT;X  "+7@3'
M!P  5NBQ^H/$ HOWBS3IZ?[I7$ZX"@#H'$[IS?[K5(L^,B:%_W1$BT4$A48$
M=#B+=0:+10JZ  #W=@:)1OJ#? 0 =!;_=@I6_U8(@\0$B4;XA<!T!8M&^.L6
MB\8#1@:+\(-N^@%UUXL]Z[BX  #K .G]3;@$ .B]3>ND .MF@WX$ '4%N
MZUB+?@:%_W4BZ&,8B_B)?OJ^"P"+7OK'!P  @T;Z H/N 77PQT4$TP#K"X-]
M @!T!;@  .LDBT8$B4;ZO@D BU[ZQP<  (-&^@*#[@%U\(M>!(E_$(M&!.L
MZ8Q-N ( Z$Q-ZY+K)XM^!(7_=06X  #K&%?H- F#Q *+=1#'11   ,=%!@
MB\;K .E;3;@  .@;3>O1ZQ2+?@2%_W0*@4T& 0#'100  .D]3;@  .C]3.OD
MZP^+?@2%_W0%@64&_O_I)$VX  #HY$SKZ>LDC4;>4/]V!.BJ/X/$!(7 ?0BZ
M__^X___K"(M6[HM&[.L Z?9,N!X Z+9,Z]3IH0"+1@2)1OJ%P'P2@W[Z('T,
MBU[ZT>.#OT0F '0%N   ZWW_=OKHJ/^#Q *)1O:)5OB#^@!]!;@  .MDN H
M4.B8%X/$ HOPBU[ZT>.)AT0FBT;ZB40"Z!D7B_B)1 2+5OB+1O:)1 :)5 C'
M!0  QT4"  #'108  ,=%"   QT4*  ")=0R+5OB+1O:)10Z)51#'11(  ,=%
M%   B\?K .E*3+@& .@*3.E6_^L_BWX$A?]\&H/_('P%N   ZRN+W]'C_[=$
M)N@K (/$ NL;OQ\ B]_1X_^W1";H& "#Q *#[P%U[;@! .L Z0!,N   Z,!+
MZ[GK58M^!(7_= :!_SHF=06X  #K0(MU HO>T>,YOT0F=!"X>!M0N   4.@%
M(H/$!.LC@WT$ '0%N   ZQA6Z*H[@\0"B][1X\>'1"8  %?H[/J#Q +IH4NX
M  #H84OKH^M&B[X$ (M>!M'CBX=$)HE&^H7 = >+=1"%]G4%N   ZR-6Z&40
M@\0"B_"%]G01BT0,.T;Z=06X 0#K"8LTZ^NX  #K .E12[@" .@12^NRZR>+
MO@0 5^A4$(/$ O]V!K@" %#_=1#H(1"#Q )0Z%@9@\0&ZP#I($NX  #HX$KK
MT>M)B[X$ (-M @%\#(L=B@>8)?\ _P7K,,=% @  @WT0 '07N  "4+@  %"X
M  !05^C=!X/$"(7 ?P6X___K"5?HO?^#Q +K .G-2K@  .B-2NNOZ:0 B[X$
M (-M! %\#(L=BT8&B ?_!>F+ ,=%!   BW40A?9U!;C__^MZ]T4& 0!T/H,]
M '06@VT" 7P0@4P$ ""+'8M&!H@'_P7K6+@  E"X  !0N   4%?H80>#Q B%
MP'X,_W8&5^B6_X/$!.LUN  "4+@@ %"X @!05^@^!X/$"(7 ?P6X___K&8%-
M!@( BUT0@4\$ "#_=@97Z&'_@\0$ZP#I'DJX  #HWDGI4__K+8N^! "#?0(
M?Q97Z.W^@\0"/?__=06X___K#_]% O\-BQV*!Y@E_P#K .GF2;@  .BF2>O+
MZV^+O@0 BT40B4;ZA<!T.8M>^HMW"H7V="^+!3M$!G8H]T4& @!T$HL%*T0&
MB40*QT4$  "!90;]__]% O\-BQV*!Y@E_P#K);@  %"X  )0N , 4%?H?0:#
MQ B%P'\%N/__ZPE7Z)?_@\0"ZP#I;4FX @#H+4GKB>LVBWX$BT4&J0( =!F+
M=1"+7 J+!3M'!G8,_T4$_PV!3 0 (.L/NO__N/__4E!7Z X @\0&Z2U)N
MZ.U(Z\+K'_]V"/]V!O]V!.@; (/$!HOXA<!T!U?H-@*#Q +I!$FX  #HQ$CK
MV>D1 8U&\E"-1OA0_W8(_W8&BWX$5^C1#X/$"HOPA<!U!K@  .GJ (M=$(%G
M!/]_@WX( 'P,BU;TBT;RB44(B54*BT;XB4;ZBU[ZBP>)1OJ%P'02BT;ZB440
MQT4,  #'10X  .M7BT0"B4;VA<!T0HM&]HE%$(M>]H-_"@!T$(M>]HM?"HM'
M"HO N@  ZPF+7O:+5Q"+1PZ)10R)50Z+50J+10@K10P;50Z)10B)50KK"[@
M %!7Z$_Z@\0$@WP" '0<BUP"BT;ZB0>%P'0)BU[ZBT0"B4<"QT0"  #K#H-^
M^@!T"(M>^L=' @  BT;XB4;ZB]C'!P  BUT0@4\$ ("!9 3_OXM>^H%G!/^_
MB\;K .GH1[@* .BH1^GF_NM2BWX$C4;T4(U&^%#_=@C_=@97Z+4.@\0*B_"%
MP'4%N   ZRS_=OA6Z'\-@\0$B4;ZN $ 4(M6"(M&!O?:]]B#V@!24%?H@P&#
MQ B+1OKK .F+1[@( .A+1^NFZ8< BWX$A?]T!XMV!H7V=06X  #K<8-\ @!T
M!;@  .MFN 8 4%?H4@2#Q 2)1OJ%P'4%N   ZT]6Z,4 @\0"B4;VB5;XBT;Z
MB40"BU[Z@S\ =!6#/ !T!(LTZ_>+7OJ+!XD$BQR)=P*+7OJ+1@:)!XM5#HM%
M# -&]A-6^(E%#(E5#K@! .L Z?E&N 8 Z+E&Z7#_ZQ*X  !0_W8$Z+ ,@\0$
MZP#IW$:X  #HG$;KYNL9BWX$A?]T#U?HIA"#Q *+^(7 = +K\>FY1K@  .AY
M1NO?ZR6+?@2%_W06BS6%]G0$B_[K]HMV!HDUA?9T XE\ HM&!.L Z8I&N
MZ$I&Z]/K98M^!(7_=0BZ  "X  #K4\=&^   QT;Z  "%_W0]BW4*A?9T((M$
M"KH  (E&](E6]HM6^HM&^ -&]!-6]HE&^(E6^NL2BU;ZBT;X T4.$U40B4;X
MB5;ZBSWKOXM6^HM&^.L Z1M&N @ Z-M%ZY/IR0&+?@2+11")1OJ%P'4&N/__
MZ;,!@ST = /ID@"+1@KK:X-^" !U$(-^!@!U"E?HH@&#Q +ID &+5@B+1@8K
M10@;50J)10R)50[K4HM5#HM%# -&!A-6"(E%#(E5#NL^5^@E H/$ @-&!A-6
M"(E&](E6]HM5#HM%# -&]!-6]HE%#(E5#NL7N/__Z3L!/0  =) ] 0!TM3T"
M '3$Z^FX  !05^C^!X/$!+@  .D9 8M>^HMW"H7V=1&XCQM0N/__4.B'&X/$
M!.G^ (L%*T0&B4;X]T4& @!T"XM&^(E$"H%E!OW_QT4$  "+1@KK68M&^+H
M (E&](E6]HM5"HM%" -&]!-6]HE&\(E6\HM6"(M&!BM&\!M6\HE&!HE6".LX
M5^AE 8/$ HE&](E6]HM6"(M&!@-&]!-6]HE&!HE6".L7N/__Z8$ /0  =*(]
M 0!TS3T" '3*Z^F+1OBZ  #WVO?8@]H .U8(?R=\!3M&!G<@BT4"F3E6"'\7
M? 4Y1@9W$(M&!@$%BT8&*44"N   ZS?'10(  ,<%  "+1OBZ  ")1O2)5O:+
M5@B+1@8#1O035O:)10R)50ZX  !05^CD!H/$!+@  .L Z4=$N P Z =$Z2[^
MZSN+?@2%_W4"ZR]7Z$0)@\0"BW40@60$_W]6Z!()@\0"B_")=1#'10@  ,=%
M"@  QT4,  #'10X  .D!1+@  .C!0^N]ZV:+?@2+11")1OJ%P'4(NO__N/__
MZTZ#/0!U#HM5"HM%" -%#!-5#NL[BU[ZBW<*A?9U$[B7&U"X  !0Z/,9@\0$
MB\"9ZQZ+!2M$!HO N@  B4;VB5;XBU4*BT4( T;V$U;XZP#ID4.X!@#H44/K
MDNMWBWX$BT40B4;ZA<!U"+H  +@  .M?@ST =$F+7OJ+=PJ%]G0_]T4& @!T
M#8M>^O\WZ-+\@\0"ZSS_=OKHQ_R#Q *)1O:)5OB+!2M$!HO F8E&\HE6](M6
M^(M&]BM&\AM6].L1_W;ZZ)S\@\0"*T4,&U4.ZP#I$$.X"@#HT$+K@>D:!8M^
M!(MU$(7V=0:X  #I!P6#/0!U ^GX (M$"HE&^H7 =0:X  #I[P2+7OJ+!2M'
M!HE&\HM&!NG+ (-] @!^!K@! .G2!%?HT0>#Q )7Z-,$@\0"B_"%P'4&N/__
MZ;@$Z:X @W[R '0@]T4& @!T#HM>^HM&\HE'"H%E!OW_QT4$  "X 0#ICP17
MZ(X'@\0"ZW^#?0( ?PR+7OJ+1P@K1O*)102#?00 ?@:X 0#I: 17Z&<'@\0"
MZUB#?0( ?Q%7Z%@'@\0"5^A:!(/$ NE(!%?H1P>#Q *#?O( =06+QNDV!.LM
M@WT" '\,5^@M!X/$ HO&Z2($5^@A!X/$ NL2N   Z1,$/08 =_71X)/_IUP;
M_W8&5^B !(/$!(OPBT0*B4;ZBT8&Z=X#@WT. '4,@WT, '4&N/__Z=T#@W[Z
M '0#Z>8!ZQ^#?OH = /IVP&+50Z+10P[5!!U"SM$#G4&N/__Z;,#QT;V( "+
M1@@#1O:+P+H  #E5#GP]?P4Y10QV-HM&"+H  (E&[HE6\(M5#HM%#"M&[AM6
M\%)05N@^"8/$!E?H?@.#Q *+\(M&"+H  (E%#(E5#HM&"KH  (E&[HE6\(M&
M]IF)1NJ)5NR+50Z+10P#1NX35O #1NH35NPY5!!\*'\%.40.=B&+1@JZ  ")
M1NZ)5O"+50Z+10P#1NX35O!24%;HU B#Q :+1 Z)1OB+5!2+1!(E 0"!X@
MB4;TA<!T!HM&] %&^(-^^@!U1?]V^+@@ %#HZ@N#Q 2)1OJ+7OJ+1P@[1OAS
M*,=&]@  QT8(  "+7OJ+1PA(B48*@WX& W4+BT8*B48(QT8*  #I]?[K-(M>
M^HM'"#M&^',IN)\;4+@  %#HLA:#Q 2+1@JZ  "Y @#W\8E&"H7 = /IQ?ZX
M  #I;0*#?O0 =!O_=O3_=OKHT0F#Q 2)1OJ+7OK_=P+HA>R#Q *+1OJ)1 J+
M1 Z+7OJ)1PJ#? P =1&XL1M0N   4.A3%H/$!.DF O]T%/]T$K@! %"+7OK_
M=PJ+7OK_=P:+7 S_=P+HHA2#Q R%P'425KBY&U"X  !0Z!L6@\0&Z>X!5^A#
M!8/$ L=%!   Z=H!@W[Z '5 @WP0 '4$@WP. '0Q_W4._W4,5NB(!X/$!E?H
MR &#Q *+\(-\$ !U!(-\#@!T#[H  +@  %)05NAD!X/$!ND# 8M>^HM'"HE&
M\HM&\KH  #E5#G0#Z;L .44,= /ILP"+7OJ+1P@[1O)V ^GP (M>^H,_ '1O
MBU[ZBQ^+1P2I ,!U8O=$!  @=%N+7OJ+1P@[1@IS4(M>^HM&"BM'"(E&"/=&
M" $ = /_1@B+7OJ+'XM'"#M&"'<,_W;ZZ!'M@\0"Z9H BU[ZBQ^+1@@I1PB+
M7OJ+'XM&" %'!HM>^HM&" %'".MY@SP ="F+'(M'"HE&^H7 =!V+7OJ#?PH
M=12+7OJ#?P@ = M7Z-H @\0"B_#K2_]U#O]U#%;H@@:#Q :#? H =!Y7Z+P
M@\0"B_"#? H = ^Z  "X  !24%;H7@:#Q ;_=@K_=@CHFPF#Q 2)1OJ)1 J+
M7OK'1PH  %?HT0.#Q *X 0#K<(-]#@!U"H-]# !U!(O&ZV#_=0[_=0Q6Z!L&
M@\0&5^A; (/$ NM*@W[Z '0-BU[ZBT<*B\"Z  #K!HM4$(M$#CE5#G4%.44,
M= W_=0[_=0Q6Z.(%@\0&B\;K%K@  .L1/08 =_;1X)/_IVH;N $ ZP#IZSVX
M$@#HJSWIW?KK:HM^!(MU$(L$B4;ZA<!U!;@  .M3@WP* '0-BUP*BT<*B\"Z
M  #K!HM4$(M$#HE&]HE6^(M5"HM%" -&]A-6^(E%"(E5"L=%#   QT4.  "!
M9 3_?XM>^H%/! " BT;ZB440BT;ZZP#I=CVX!@#H-CWKCNE4 HM&!(E&^HO8
MBW\0A?]U'XM>^L='"   QT<*  "+7OK'1PP  ,='#@  B\?I(P*!903_?XM&
M!B4! (O F8E&\HE6](M>^HM7#HM'##M6]'T#Z1D!?P@[1O)S ^D/ 8MU"H7V
M= Z+1 JZ  ")1O:)5OCK#(M5$(M%#HE&]HE6^(M>^HM7#HM'##M6^'X#Z94
M? @[1O9V ^F+ (M>^HM7#HM'##M6^'P.?P4[1O9R!_=&!@$ =&_W1@8" '1F
MBU[Z@W\. '5=@W\, '57@WT" '11BWT"BW4*A?9T"(M$"KH  .L&BU40BT4.
MB4;RB5;TBU[ZBU;TBT;RB4<,B5<.BU[ZBU<.BT<,B4;RB5;TBU[ZBU<*BT<(
M*T;R&U;TB4<(B5<*ZT6#/0!U$8M>^HM6^(M&]HE'#(E7#NLOBSV+7OJ+5PZ+
M1PPK1O8;5OB)1PR)5PZ+7OJ+5PJ+1P@#1O835OB)1PB)5PKI]/[IU@"#?0(
M=1V+7OK'1PP  ,='#@  BU[ZQT<(  #'1PH  .FS (M] HMU"H7V= Z+1 JZ
M  ")1O:)5OCK#(M5$(M%#HE&]HE6^(M>^HM7"HM'""M&]AM6^(E'"(E7"HM>
M^HM7#HM'# -&]A-6^(E'#(E7#H/Z 'Q=BU[Z@W\. '\/? :#?PP =0?W1@8!
M '5%]T8& @!U/(M>^HM7#HM'##M6^'4N.T;V=2F#/0!T)(L]BU[ZQT<,  #'
M1PX  (M>^HM7"HM'" -&]A-6^(E'"(E7"NL#Z2K_BU[ZB7\0@4T$ ("+Q^L
MZ1<[N H Z-<ZZ:/]ZQF+?@2%_W0+BW4"A?9T!(O^Z_6+Q^L Z?,ZN   Z+,Z
MZ]_K3(M^!(M%$(E&^H7 = J+7OJ+=PJ%]G4"ZS#W108" '0-BP4K1 :)1 J!
M90;]_XL%*T0&B\"9B44,B54.QP4  ,=%!   QT4"  #IG3JX @#H73KKK.M7
MBWX$BW40A?9T"HM$"HE&^H7 =0+K/H%,! " BU[ZBT<& T4,B06+7OJ+1PJ+
MP+H  "M%#!M5#HE% H7 = ?'100  .L/BU[ZBT<(BU[Z*T<*B44$Z3PZN (
MZ/PYZZ'K7XM^!(7_=06X  #K4,=&^@  @4T$ $!7Z$T @\0"B_"+1OJ)1 *%
MP'0/BU[ZB3>+7OJ!9P3_/^L#B7;XB7;Z@64$_[\[?@9T!HL]A?]UP\<$  "!
M9 3_/XM&^.L Z=,YN 0 Z),YZYGIK "+?@2%_W4&N   Z9P Z#X$B_"X%@!0
M5E?H.=&#Q ;'!   QT0"  "#? P =!*)=0:)? B#? 8 = :+7 :)=PB+1 J)
M1OJ%P'1<BU[Z_W<*BU[Z_W<*Z%3C@\0$B4;XA<!T+(M>^O]W"HM>^/]W!HM>
M^O]W!NC=T(/$!HM>^HM'"HM>^(E'"HM&^(E$"NL7]T0$ "!T"[@! %!6Z%L'
M@\0$QT0*  "+QNL Z1PYN 0 Z-PXZ4O_Z=X BWX$A?]U!K@  .G. ,=&^
M@WX( '4,@WX& '4&N   Z;< @WX( 'T#_T;X@W[X '0%N 8 ZP.X!0!05^C(
M]8/$!(OPA<!U!K@  .F, (%,! ! BUX,BU4*BT4(B0>)5P*+50Z+10P#1@83
M5@B)10R)50Z#?O@ = 6X!0#K [@& %!7Z('U@\0$B4;ZA<!U%8%D!/^_N,<;
M4+@  %#HJ Z#Q 3K-8M>^H%/! ! @W[X '0;BP0[1OIU"H%D!/^_BW;ZZPJ+
M7@J)-XM&^NL,BUX*BT;ZB0>+QNL Z3(XN 0 Z/(WZ1G_Z:(!BWX$A?]U!K@
M .F2 8%-! " ]T4$ "!T!U?H/P*#Q +HB0*+\+@6 %!65^B$SX/$!H-^" !U
M.8-^!@!U,X-\# !T*(M$"(E&^H7 = B+7OJ)=P;K!HM<#(EW!(M$!HE&^H7
M= :+7OJ)=PB)?OKK18-]"@!T*HM="HM'"HO N@  .58(? E_!3E&!G("ZR/_
M=@;_=0KH$P&#Q 2)1 KK4HM6"(M&!CM5$'Q'?P4[10YR0(EV^HM>^L='!@
MBU[ZQT<(  "+7OK'1PH  (M>^L='#   BU[ZQT<.  #'1Q   (M>^L='$@
MQT<4  #IE0"#?0P =0/IC "+5!"+1 XK1@8;5@B)1 Z)5!"+5!2+1!(#1@83
M5@B)1!*)5!2+5@B+1@:)10Z)51"#?!  ?$=_!H-\#@!T/XM%!HE&^H7 =!J+
M7OJ+5!2+1!([5Q1\#'\%.T<2=@6+?OKKW(E\"(M%!HE$!H7 = :+7 :)=PB)
M=0:+?@3K#\=$!@  QT0(  #'1 P  (E\ H,] '0%BQV)=P*)-8%D!/\_B\?K
M .F$-K@" .A$-NE5_NM0QT;Z  #_=@:+?@17Z)WD@\0$B_"%P'43BT;Z_T;Z
M4+@  E#HU0&#Q 3KVHM%"#M%"G('QT0*  #K#XM%"BM%"(E$"HM%"(E%"HO&
MZP#I*3:X @#HZ37KJ.M-BWX$BT4*B4;ZA<!T#O]V^NA4XH/$ L=%"@  BW4"
MA?9T!(L%B02#/0!T!8L=B7<"@WT, '0'5^@; (/$ HLU5^BL (/$ HO&ZP#I
MTC6X @#HDC7KJ^M&BWX$BT4,B4;ZA<!U NLTBW4(A?9T"(M%!HE$!NL)BU[Z
MBT4&B4<$BW4&A?9T!HM%"(E$",=%#   QT4.  #'11   .F"-;@" .A"->NR
MZT"^  "+/C8FA?]U)+@ "%"X%@!0Z''>@\0$B_B%P'40B\9&4+@ L%#HT "#
MQ 3KU(L%HS8FQT4$TP"+Q^L Z3@UN   Z/@TZ[CK%(M^!,=%!   H38FB06)
M/C8FZ1HUN   Z-HTZ^3K*+\  /]V!.CKXX/$ HOPA<!U#XO'1U#_=@3H=@"#
MQ 3KXHO&ZP#IZ#2X  #HJ#3KT.M8O@  BT8&B4;Z_W8&_W;ZZ+#>@\0$B_B%
MP'0$B\?K-HO&1E#_=OKH-P"#Q 3_=@;_=OKHC=Z#Q 2+^(7 = 2+Q^L3T7[Z
MBT;Z.T8$?0:+1@2)1OKKM.F&-+@" .A&-.N@ZSJ#?@9D?@/HZ1V#?@8*?A/_
M=@2XV!M0N   4.B8"H/$!NL5_W8&N,R\4+@6 %"X  A0Z/7E@\0(Z4(TN
MZ (TZ[[I7@*+?@3W100 P'0&N   Z4L"BT4*B4;ZBS6#?@8$?0+K8(MU H7V
M= OW1 0 P'4$B_[K[HLUA?9T!_=$! # =#"+10J)1OJ%P'0@]T4$ "!T"[@!
M %!7Z \"@\0$_W;ZZ![@@\0"QT4*  "X  #I[ &X  !05^CP 8/$!+@  .G;
M 8-^!@%] ^GU (-^^@!T!(7V=0:X  #IP@&+1 J)1OB%P'4#Z=@ ]T0$ ,!T
M ^G. (M>^(M'"HM>^@-'"HE&]CT  G(#Z;< BU[ZBP<[1OAT+(M>^HM&]CM'
M"'8A_W;V_W;ZZ%7@@\0$B4;Z@W[Z '4&N   Z60!BT;ZB44*BU[X_W<*BU[Z
MBT<&BU[Z T<*4(M>^/]W!NBJRH/$!HM>^HM&]HE'"HM>^HL'.T;X=3''1 H
M /]V^N@$X8/$ HM>^HM'"(M6]H/"(#O"=A/_=O;_=OKH%.&#Q 10Z"+?@\0"
M@4T$ "!6Z*W\@\0"B_"%P'0#Z23_N   Z>  Z1O_@WX& 'X#Z<\ @W[Z '0W
MBU[Z@W\* '4,QT4.  #'11   .LB]T4$ "!U&8M>^H-_"D!V$/]V^NC'WH/$
M L=%"@  ZRCK)H-]$ !U((-]#@!U&H-] @!T%%?H//R#Q *+_H7V=06X  #K
M<XLU]T4$ "!U8(7V=%SW1 0 X'55@WT, '1/BT4,.T0,=4>+512+11(#10X3
M51 [5!1U-CM$$G4QBU40BT4. T0.$U00B44.B5405NC@^X/$ HM%"HE&^H7
M= [_=OKH-MZ#Q +'10H  +@  .L%N   ZP#IV3&X!@#HF3'IF?WINP.+?@2%
M_W4#Z:X#H3PFB4;V@WX& '4DN   4%?HI@.#Q )24.@(!(/$!HL6AB:AA":)
MAMC]B9;:_>MO@WX& 757BW4*A?9T((M$!BL&-"8E 0")1OK_=OJ+1 JZ  !2
M4.C, X/$!NL?BU44BT42)0$ @>(  (E&^O]V^O]U$/]U#NBK X/$!HL6AB:A
MA":)AMC]B9;:_>L2BT8(B4;VQX;8_0  QX;:_0  A?]U ^D# X-^!@!U"O=%
M! # = /I\P*+=0J%]G1RBT0*B4;ZA<!T)?]V^O]T!O]V]NBV+X/$!CM&^G01
MN/X;4/\VP"7H%@>#Q 3IP@*+1OJ9B8;0_8F6TOV+EMK]BX;8_0.&T/T3EM+]
MB8;8_8F6VOV#?@8 =0S'10H  %;H[-R#Q *+1OJ9B4;NB5;PZ<\!BU40BT4.
MB4;NB5;PA=)U H7 =0/IN &#?0P =1)7N X<4/\VP"7HI :#Q ;I4 *+70R+
M1P*)1O@[1O9U!;@! .L#N   B8;<_<=&] $ BU44BT42B8;4_8F6UOV+EM;]
MBX;4_24! ('B  ")1O*Z  "X  )24/^VUOW_MM3]Z)TPB8;2_;@  BN&TOV)
M1OJ#?O  ?0/I*P%_"8-^[@!U ^D@ 8M&^IDY5O!_#7P%.4;N<P:+1NZ)1OK_
MMM;]_[;4_?]V]/]V^HV&WOT#1O)0_W;XZ&P$@\0,A<!U$E>X'AQ0_S; )>CE
M!8/$!NF1 8N&W/V)1O2%P'1/N   4/^VVOW_MMC]_W;VZ'TB@\0(@_H ?1&X
M,1Q0_S; )>BO!8/$!.E; 8M&^IF)AM#]B9;2_8N6UOV+AM3] X;0_1.6TOV)
MAM3]B9;6_?]V^HV&WOT#1O)0_W;VZ $N@\0&.T;Z=!&X0!Q0_S; )>AA!8/$
M!.D- 8M&^IF)AM#]B9;2_8N6VOV+AMC] X;0_1.6TOV)AMC]B9;:_8M&^IF)
MAM#]B9;2_8M6\(M&[BN&T/T;EM+]B4;NB5;PQT;Z  +'1O(  .G,_HM5$(M%
M#HE&[HE6\(-^!@)U ^F= #M^!'0@BUX$BU<0BT<. T;N$U;PB4<.B5<05^A]
M^(/$ HOXZWJ#?0P = T[/H@F= =7Z+WX@\0"BU;PBT;NB44.B540QT4,.B:+
M%H8FH80FB442B544@64$_]\[/H@F=0+K,J&()HE%"(7 =!*+'H@FBT<&B44&
MBUT(B7\&ZPJA/B:)10:)/CXF@WT& '0&BUT&B7\(@WX& 74"ZP6+/>GV_+@
M .L Z1(NN"P"Z-(MZ3S\ZV#'1O@  ,=&^@  BWX$A?]T1/=%! # =3V+=0J%
M]G0@BT0*N@  B4;TB5;VBU;ZBT;X T;T$U;VB4;XB5;ZZQ*+5OJ+1O@#10X3
M51")1OB)5OJ+/>NXBU;ZBT;XZP#IIRVX" #H9RWKF.D6 8,^/"8 ?W^^4!RX
M@ %05NC ((/$ E#H$1R#Q 2+^(7 ?1&X8!Q0N   4.BH X/$!.G@ %?H5QV#
MQ *X @!05NC\((/$!(OXA<!]$;AR'%"X  !0Z'\#@\0$Z;< 5NBZ*X/$ HD^
M/";'!CXF  "+W]'CQX=$)CHFQP:$)@  QP:&)@  Z8T BT8(F8E&^(E6^KB$
M)E"+5@:+1@0#1O@35OI24+@Z)E#H=@"#Q BCB":+1@B9B4;XB5;ZBQ:&)J&$
M)@-&^!-6^J.$)HD6AB:X  !0_S:&)O\VA";_-CPFZ+ ?@\0(@_H ?2O_-L E
MZ#![@\0"4/\VP"7_-H8F_S:$)O\V/":X@QQ0N   4.C' H/$#NL Z88LN 0
MZ$8LZ>'^Z1X!QT;V  #'1O@  +X  (M>!(M_!(7_='J+5OB+1O8[511_(WP%
M.T42<QR+512+11(K1O8;5O@Y5@A_"7P%.48&=P+K3NL:BU44BT42 T4.$U40
M.5;X? E_!3E&]G("ZRN+512+11(#10X351")1O:)5OB+5OB+1O8% 0"#T@ E
M_O^!XO__B4;VB5;XB_>+?0;K@HM>"HM6^(M&]HD'B5<"B7[ZBUX$BW\$A?]T
M:XM6^(M&]CM5%'\C? 4[11)S'(M5%(M%$BM&]AM6^#E6"'\)? 4Y1@9W NLZ
MZQJ+512+11(#10X351 Y5OA\"7\%.4;V<@+K'O]V"/]V!E>XIAQ0N   4.BM
M 8/$"HMV^HM\!ND!_XM]!NN1B\;K .E<*[@& .@<*^G9_ND& 8N^! #'!L E
M  "#?@H ="FX  !0_W8._W8,5^@F'H/$"(E&]HE6^('Z__]U##W__W4'QT;T
MT1SK*?]V"/]V!E?H.2"#Q :+\#M&"'00B\:9B4;VB5;XQT;TV!SK!8O&Z:$
MH< EB4;Z.SX\)G41QT;RWQS'1NX  ,=&\   ZT7'1O+F'%?HK-V#Q *)1NZ)
M5O"+W]'C@[]$)@!T*(O?T>.+GT0FBU;PBT;N.U<(=04[1P9T$%?H5P"#Q *%
MP'0%BT8(ZS__=O#_=N[_=OC_=O;_=@C_=@;_=O)7_W8._W8,_W;ZZ.UX@\0"
M4/]V^O]V]+CG'%"X  !0Z(X @\0>N   ZP#I2BJX#@#H"BKI\?[K2XN^! "+
MW]'C_[=$)K@:QU"X%@!0N  (4.C1VX/$"*'()3T! '0'@S[()0!U!;@  .L6
M5[@/'5"X  !0N ( 4/\6R"6#Q CK .GT*;@  .BT*>NMZQN+O@0 B[8& #EU
M#'4+@WT* '0%@4T$ "#ISRFX  #HCRGKW>M>C4;ZB4;Z@T;Z"J'()3T! '4#
MZ"83@S[()0!T.O]V(/]V'O]V'/]V&O]V&/]V%O]V%/]V$O]V$/]V#O]V#/]V
M"O]V"/]V!HM>^O\WN $ 4/\6R"6#Q""+1@3K .EG*;@" .@G*>N: .DQ ?]V
M!NC])H/$ HE&](M&!*.*)K@H'5#H2AB#Q *)1OB%P'0]BU[X@#\O=#.X,!U0
MZ#$8@\0"B4;VA<!T(O]V]O]V!NA6)H/$!(7 =1+_=OC_=@3H@B:#Q 2X 0#I
MT #K!<=&^#4=N$(=4/]V^.AX%H/$!(E&^H7 =0:X___IKP#_=OJX  10_W8$
MZ#,5@\0&A<!U ^F* (M&!(E&]HM>]H _?'0%_T;VZ_/_1O:+7O: /R!T&(M>
M]H _"700BU[V@#\-= B+7O: /PIU!?]&]NO;_W;T_W;V_W8&Z(HF@\0&A<!U
M.?]V!.@9)H/$ BT"  -&!(E&]HO8@#]<=1+_=OJX  10_W;VZ+44@\0&Z]7_
M=OKH8!6#Q *X 0#K$>E?__]V^NA/%8/$ K@  .L Z2HHN @ Z.HGZ<;^Z?T
MH8HFB4;ZA<!T!H-^! !U!KC__^GD /]&^HM>^H _.G0"Z_/_1OJ+7OJ /P!U
M ^G$ (M>^H _('08BU[Z@#\)=!"+7OJ /PUT"(M>^H _"G4%_T;ZZ]NX @!0
M_W8$_W;ZZ,<E@\0&A<!U<(M>^H _ '05BU[Z@#\Z= V+7OJ /R-T!?]&^NOC
MBU[Z@#\C= 6X___K9L=&^   _T;ZBU[Z@#\ =#&+7OJ /S!\*8M>^H _.7\A
MBT;XN@H ]^J+7OJ*%[D( -/BT_H#PBTP (E&^/]&^NO'BT;XZR"+7OJ /P!T
M#8M>^H _.G0%_T;ZZ^O_1OKI,?^X___K .DA)[@$ .CA)NGZ_NF- *&*)HE&
M^H7 = :#?@0 =06X___K=?]&^HM>^H _.G0"Z_/_1OJ+7OJ /P!T6(M>^H _
M('08BU[Z@#\)=!"+7OJ /PUT"(M>^H _"G4%_T;ZZ]NX @!0_W8$_W;ZZ,(D
M@\0&A<!U!;@! .L?BU[Z@#\ = V+7OJ /SIT!?]&^NOK_T;ZZZ"X  #K .F(
M)K@" .A()NEJ_^DQ J&*)HE&^H7 = :#?@0 =0:X  #I& +_1OJ+7OJ /SIT
M NOS_T;ZBU[Z@#\ =0/I^ &+7OJ /R!T&(M>^H _"700BU[Z@#\-= B+7OJ
M/PIU!?]&^NO;N ( 4/]V!/]V^N@E)(/$!H7 = /IH0&+7OJ /P!T%8M>^H _
M.G0-BU[Z@#\]= 7_1OKKXXM>^H _/70&N   Z98!BUX&BP>)1OC_1OJ+7OJ
M/P!U ^E. 8M>^H _.G4#Z4,!BU[ZB@>8Z1T!_T;ZBU[ZB@>8+4$ BUX&BQ^(
M!^D9 ?]&^HM>^HH'F.F8 (M>!HL?Q@<;Z=\ BUX&BQ_&!PKIU "+7@:+'\8'
M#>G) (M>!HL?Q@<)Z;X BUX&BQ_&!PCILP"+7@:+'\8'#.FH ,=&]@  BU[Z
M@#\ ="N+7OJ /S!\(XM>^H _.7\;BU[ZB@>8BU;VN0, T^(#PBTP (E&]O]&
M^NO-BUX&BQ^+1O:(!_].^NMABU[ZB@>8BUX&BQ^(!^M2/5P =.Q_'#TP '2>
M/3$ =)D],@!TE#TS '2//44 =0/I1?\]9@!U ^ET_W\-/5X =+\]8@!U ^E:
M_SUN '4#Z3'_/7( =0/I-/\]= !U ^DW_^LABU[ZB@>8BUX&BQ^(!^L2/5P
M=0/I\?X]7@!U ^G3_NO?BUX&_P?_1OKII_Z+7@:+'\8' (M>!O\'BT;XZR"+
M7OJ /P!T#8M>^H _.G0%_T;ZZ^O_1OKI_?VX  #K .E+)+@& .@+).G&_>GQ
M (U&!HE&^L=&^   OQ =BUX$@#\ =0/IS0"+7@2*!YCIM #_1@2+7@2*!YCI
M@@"#?OH =0:X1!WIM #_1@2+7@2*!YB+7OH#!XO?1X@'C48&.4;Z=06-1@CK
M [@  (E&^NMEB]]'Q@<EZUW'!HPF 0#K58-^^ !U!8M&".L#BT8&B4;VH8PF
M 4;V_T;XBT;VF;D* /?Y!3  B]]'B >+1O:9N0H ]_F#PC"+WT>(%^L7/24
M=*T]*P!U ^EQ_SUD '2P/6D =*/K%XM>!(H'F(O?1X@'ZPH])0!U ^E$_^OI
M_T8$Z2C_Q@4 N! =ZP#I3B.X!@#H#B/I!O_K*8N^! "%_W4%N $ ZQF /0!T
M#XO?1XH'F%#_5@B#Q +K[+@! .L Z1HCN   Z-HBZ\_K18-^! !]!>C! .LW
M@SYR)01U!>CU<NLK@S[&)0!T",<&QB4  .L&QP;&)4/.@S[&)0!T!;C 'NL#
MN-$>4.C*HX/$ NG+(K@  .B+(NNSZW.X  !0Z%6[@\0"B_B%P'0%ON,>ZS.X
M  !0_S;$).A*QH/$!(OXA<!T!;[K'NL:N   4.C?P(/$ HOXA<!T!;[Q'NL%
MN   ZRB#?@0 =![H"$B)1OI75KCY'E#H4@^#Q ;H6'*#?OH ?@/HS4>+Q^L
MZ4XBN ( Z XBZX7IXP&X#!]0Z"H/@\0"C4:8B_A0Z/ER@\0"B]]'B@>84.A$
MBH/$ NE6 ;A*'5"X 0!0Z-F=@\0$Z:8!Z,N;Z)Y'Z9T!Z9T!N $ 4/\VQ"3H
MNL6#Q 3IB0&-1IE0Z&P1@\0"B_"#_@AU!>@1TNL+5K@  E#H4^V#Q 3I90&*
M!9A0Z.6)@\0"ZS7H0;_I4P&X 0!0Z"*^@\0"Z48!N   4+@! %#H*<"#Q 3I
M-0&X 0!0N $ 4.@8P(/$!.DD 3T  '3&/48 =,<]3 !TSSU0 '3;Z0,!B@68
M4.B-B8/$ NL3Z+2YZ?L N $ 4.@KNH/$ NGN #T  '3H/48 =.GIUP"X  !0
MZ'W^@\0"B_B%P'0-5[@/'U#H'0Z#Q 3K"K@='U#H$0Z#Q +IMP#_-M8DZ 4$
M@\0"Z:H C4:94.B-$(/$ HOPA?9T!(O&ZP.X9 !0N   4.B: (/$!.F% (U&
MF5#H:!"#Q *+\(7V= 2+QNL#N&0 4+@! %#H=0"#Q 3K83U- '4#Z4S_?R@]
M(0!U ^FI_CT_ '4#Z9#^/4( =0/II?X]0P!U ^FN_CU$ '4#Z<K^/5$ =0/I
MBOX]5@!U ^D^_SU7 '4#Z6#_/5@ =0/I9?\]6@!TA;@C'U#H5PV#Q +I(/[I
M8""X9 #H("#I%/[I.@._  "#_PA]#;@  %#HS8:#Q )'Z^ZX;1]0Z+0U@\0"
MB4:&_W:&Z&4V@\0"O] 'Z!YCN'H?4.AG@X/$ HO'F;D* /?YB]K1X_^WHA[H
M48.#Q *X"@!0Z#1A@\0"@^\!==&#?@0 = _H]V-24+B 'U#HT R#Q ;'1O8
M ,=&^   N $ 4.@V"8/$ N@NMX7 =!Z-1I!0Z(9P@\0"B]B /P!T#;B.'U#H
MF@R#Q +I< *#1O8!@U;X /]V^/]V]KB<'U#H?PR#Q :+1@:94E#_=OC_=O;H
M"2"#^@!U-ST  '4RZ- 3B_B%_WT&B\?WV.L"B\>9N04 ]_F+^E>XIA]0Z$(,
M@\0$5[@  E#HR^J#Q 3IMP'HGA.+^)FY  3W^8OR]\< ('0&B\;WV(OP5NC;
M88/$ N@;8NA\8HE&C(E6CNAR$XOXF;E  /?YB_+WQP 0= :+QO?8B_!6Z*]A
M@\0"Z&QBB4:(B5:*@WX$ '015O]VCO]VC+BT'U#HR N#Q C_=HK_=HC_=H[_
M=HSHNX2#Q BX  !0Z/O[@\0"B4;TA<!T$/]V]+C#'U#HF N#Q 3I;@'H_Q*+
M^)FY  CW^8OR]\< "'0&B\;WV(OP5N@\88/$ NA\8>AV8(-^! !T#^C485)0
MN-@?4.A:"X/$!NA3>+@  %#HG/N#Q *)1O2%P'00_W;TN.,?4.@Y"X/$!.D/
M <<&IB4# .B:$IFY! #W^8OZA?]\-X-^! !T"KCX'U#H$0N#Q +H;GBX  !0
MZ%/[@\0"B4;TA<!T$/]V]+C^'U#H\ J#Q 3IQ@!/Z\7H5!*I!P!T6X-^! !T
M"K@2(%#HT@J#Q *X%R!0Z"6!@\0"Z#(2F;D* /?YB]K1X_^WHA[H#H&#Q *X
M"@!0Z/%>@\0"N   4.CL^H/$ HE&](7 = __=O2X'2!0Z(D*@\0$ZV"X,2!0
MZ'T*@\0"Z-E?Z'Q>B4;Z/?__=$6#?OH*=3WH:UZ)1OH]__]T,H-^^DQU(.A:
M7CUI '48Z%)>/6X =1#H2EX]90!U".A"7CT@ '0,N#,@4.@N"H/$ NL%Z[#I
M:_WH*U^!#LHD 0#_=OC_=O:X12!0Z X*@\0&Z1H=N'8 Z-H<Z;W\Z8(!B[X$
M /\VUB3_-L0D_S;.)/\VS"2X5R!0Z.$)@\0*5[A^(%#HU@F#Q 3_-;B*(%#H
MR@F#Q 3_=0BXEB!0Z+T)@\0$_W4,N*(@4.BP"8/$!/]U$/]U#KBN(%#HH F#
MQ ;_=13_=1*XOB!0Z) )@\0&_W48_W46N,L@4.B "8/$!O]U'/]U&KC8(%#H
M< F#Q ;_=2#_=1ZXY2!0Z& )@\0&_W4$N/(@4.A3"8/$!/]U!KC^(%#H1@F#
MQ 2X"B%0Z#P)@\0"BT4$B4;ZBT4$ T4&.4;Z? /IJ "+7OK1XXNWX"3_= B*
M1 N84/]T!/]T O\TBD0*F%#HDP"#Q )0_W;ZN"LA4.CV"(/$$+B$ %#_= :-
MAFO_4.A$&H/$!HV&:_\#1 B+V,8' (V&:_]0N$@A4.C)"(/$!(I$"IBI 0!T
M.O]T#KA2(5#HLPB#Q 2XA !0_W0,C89K_U#H 1J#Q :-AFO_ T0.B]C&!P"-
MAFO_4+A8(5#HA@B#Q 3_1OKI2O_IC!NXD@#H3!OI=?[K*+^V'O=&! $ = :+
MWT?&!TWW1@0" '0&B]]'Q@=%Q@4 N+8>ZP#I61NX  #H&1OKT #K0H,^="4
M= 6A<B7K ^C,>8OXA?]] [\  +AO(5#H*)R#Q *+QYE24(U&Z%#HU62#Q :-
M1NA0Z$.<@\0"B3X0$.D,&[@4 .C,&NNVZ9< Z+!>B4;XB5;ZBQ;.)*',)"M&
M^!M6^HOX/80 ?@RX?B%0Z#Z<@\0"ZVN#/HXF '00_S:.)N@-EH/$ L<&HB4
M (7_?PO'!HXF  "^D2'K*HU% 5#HO)6#Q *+\*..)HD^HB7HEUWHCUN+WD:(
M!X/O 77SQ@0 BS:.)KB2(5#H>IN#Q )6Z*>;@\0"N*(A4.B=FX/$ NEJ&K@$
M .@J&NE@_^M5BSZB)87_= 4[?@1^!;@  .M Z*E=B4;VB5;XH8XFB4;ZZ#%;
MBU[Z_T;ZBA>Y" #3XM/Z.]!T$?]V^/]V]NBQ7(/$!+@  .L*@^\!==2X 0#K
M .D*&K@& .C*&>NCZ3X"BU8*BT8(*T8$&U8&B4;R@W[R 'T4BU8*BT8(B48$
MB58&BT;R]]B)1O+_=@;_=@3H7UR#Q 3H5'B+\(7V=1C_=O+H6O^#Q *%P'0+
MH:(E*4;RZ#AXB_#'1O0  +\  (E^^H-N\@%] ^F? >B(6HOX@___=0/ID@&#
M_PIU:O]V\N@<_X/$ H7 =%VAHB4% 0#WV%#H'UR#Q *_( "X( !0Z.U:@\0"
MH:(EF5)0Z"I;@\0$H:(E*4;RZ*1<.1;.)'PF?P8Y!LPD<AZAHB69B4;NB5;P
MBQ;.)*',)"M&[AM6\*/,)(D6SB2#_PET!8/_"G40Z"Y:OR  N"  4.B26H/$
M H/_('0#Z8, @W[Z('4AZ*I9Z$I<.1;.)'P2?P8Y!LPD=@J#+LPD 8,>SB0
MZ=< B7;T@W[Z+G0,@W[Z(70&@W[Z/W5'@V[R 7T#Z;P Z*59B_@]__]U ^FO
M $:#_R!T*^B^6;\@ +@@ %#HREF#Q +HZULY%LXD?!)_!CD&S"1R"H,&S"0!
M@Q;.) !&.S80$'YT@W[T '1NBT;T*\:+^%?H$5N#Q (I?O+_3O*X"@!0Z-Q9
M@\0"QT;T  "^  "_( "#/J(E '0^Z)-;.1;.)'PF?P8Y!LPD<AZAHB69B4;N
MB5;PBQ;.)*',) -&[A-6\*/,)(D6SB3_-HXFZ"UA@\0"Z(AVB_#I5?Z+%LXD
MH<PDB4;VB5;XZ-Y9BU8&BT8$*P;,)!L6SB124.BX.(/$!/]V^/]V]NC668/$
M!.G!%[@. .B!%^FY_>M)@SYB(0!T!;@  .L#N $ HV(A@SZ0)@!U)[B  %#H
MKB:#Q *CD":+/F0A@#T =!&*!9A0_S:0)NCR)H/$!$?KZH$.RB0$ .EM%[@
M .@M%^NOZR3_-G(E_W8$Z%5Z@\0$_W8$_S:0)NB*)H/$!(7 = /H"P#I/Q>X
M  #H_Q;KU.F2 .CC6HE&](E6]NB&8NB$6HE&^(E6^K\  +\  (7_?%?HGW6+
M\#L&$!!_#87_= 6____K NM!ZP%'Z)Q74.AZ8H/$ H7 =0+K\.A'8NA%6HE&
M^(E6^HM6^HM&^#M6]G\5? 4[1O1W#HM6]HM&](E&^(E6^NL"ZZ6%_W05N $
M4.B"6E)0_W;Z_W;XZ*;\@\0*Z:(6N P Z&(6Z67_ .L#Z9,6N   Z%,6Z_4
M*\#H2Q:X8P!0Z.(%@\0"Z7@6*\#H.1;_=@3_=@:X(0!0N $ 4.B$%8/$".E<
M%BO Z!T6_W8$_W8&N \ 4+@! %#H:!6#Q CI0!8KP.@!%BO 4%#_=@3_=@C_
M=@;_=@3HTA6#Q )0N!  4+@! %#H Q6#Q!#I$Q8 *\#HTQ6XDB90C48&4/]V
M!.A+ (/$!NGY%;@" .BY%8U&!HE&^HM>^H-&^@*#/P!U](M>^O\WC48&4/]V
M!.@> (/$!NG,%2O Z(T5N)(F4/]V!O]V!.@& (/$!NFT%;@6!.AT%<>&[OL
M ,>&[/L  (M&!HF&^ON+1@B)AOC[ZP3_AN[[BY[Z^X.&^OL"@S\ = ;K[/^&
M[/N+GOC[@X;X^P*#/P!U[L>&Z/L" (N&[OL#ANS[!0, ]Z[H^XV6_/L#PHF&
M]OL#AN[[ X;L^XU6_#O"<B3IZ "+GO+[B@>8BY[V^X@'_X;R^_^&]ON-1OPY
MAO;[<DCIQP"-AOS[B8;T^XO8BX;N^XD'@X;T^P+'AO#[  #K0(V&_/N+EO;[
M*]")EN;[BY[T^XO"B0>#AO3[ HM>!HL'B8;R^X-&!@*+GO+[@#\ =9&+GO;[
MQ@< _X;V^_^&\/N+AO#[.X;N^WRVBY[T^\<'  "#AO3[ L>&\/L  .M@C8;\
M^XN6]OLKT(F6YON+GO3[B\*)!X.&]/L"BUX(BP>)AO+[@T8( HN>\ON /P!T
M((H'F(N>]ON(!_^&\OO_AO;[C4;\.8;V^W+=N/G_Z4T4BY[V^\8' /^&]OO_
MAO#[BX;P^SN&[/M\EHN>]/O'!P  @X;T^P*-AOS[BY;V^RO0 Y;H^TJ+PIF+
MCNC[]_GWZ8F&ZOLKP%"-AOS[4/]V!"O 4/^VZOO_=@3HFQ.#Q )0N#L 4"O
M4.C-$H/$$.N.N 0 Z)X3QD;X ,9&^0#&1OH QD;[ "O 4(U&^%#_=@0KP%"X
M! !0_W8$Z%L3@\0"4+@[ % KP%#HC1*#Q!#IG1, *\#H71.+=@2#;@8!=!W_
M=@CH& B#Q *+^#W__W0-B\>8B]Y&B >#_PIUW8/__W4*.W8$=04KP.EB$\8$
M (M&!.OU*\#H&Q,KP%!04%!04+@" % KP%#H+1*#Q!#I/1, *\#H_1*-1@A0
M_W8&_W8$Z+H*@\0&BUX$BT<$J4  = =3Z,(!@\0"Z1(3*\#HTQ*-1@90_W8$
M_S:&).B/"H/$!HL>AB2+1P2I0 !T!U/HE@&#Q +IYA(KP.BG$BO_ZP>X___I
MUQ)'@_\4?1>+W]'CBT8$.X>$)'7MB]_1X\>'A"0  (/_%'W8_W8$Z%D!@\0"
MBUX$_S?HE@*#Q *+7@2+1P2I( !T#X-_!@!T"?]W!NC/P8/$ H/_ GX)_W8$
MZ,'!@\0"*\#KFP"X!@#H-!+'1O8  "O_ZRB#_Q1\(NM0/7< =4N!3O8" +BD
M 5#_=@3HV "#Q 2)1OB%P'PRZV='B]_1XX._A"0 =<V+7@:*!Y@]80!U'H%.
M]@( N $ 4/]V!.BZ!8/$!(E&^(7 ?20KP.F3 #UR '6F@4[V 0 KP%#_=@3H
MF 6#Q 2)1OB%P'T5Z]RX @!0*](KP%)0_W;XZ,X$@\0(N H 4.BTP(/$ HE&
M^H7 =+B+V,=' @  B]B+1OB)!XM&]HE'!+@ !%#HC\"#Q *+7OJ)1P:#?P8
M=0>!3P0$ .L(BU[Z@4\$( "+7OJ+1P:)1PB+W]'CBT;ZB8>$)(M&^NES$0 K
MP.@S$?]V!/]V!K@( %"X 0!0Z'X0@\0(Z581N ( Z!81BUX$BT<$J00 =0B+
M1P2I @!U!"O ZS"+7@2#?P( ?O/_=P+_=P;_-^CK#X/$!HE&^HM>!#M' G41
MQT<"  "+1P:)1PB+1OKI!A&+7@2!3P00 +C__^OP +@$ .BX$(N^! "+-@
MB]Z#Q@*+!XE&^H7 =#R)?OB+7OB /P!T&?]&^(H'F(M>^O]&^HH7N0@ T^+3
M^CO"=-^+7OB /P!UQHM>^H _/76^B\,% 0#IH! KP.OY*\#H71 KP%!04%!0
M_W8$N $ 4"O 4.AM#X/$$.E]$ "X! #H/!"+O@0 *_;'1O@  .L!1XH%F*.D
M(3T@ '3T/0D =.\]#0!TZCT* '3E/0P =." /2UU%$?'1O@! .L,B\:Z"@#W
MZHOP W;ZB]]'B@>8+3  B4;Z/0H <N.#?O@ = >+QO?8Z1(0B\;K^2O Z,\/
M*\!04%!04/]V!+@& %"X 0!0Z-X.@\00Z>X/*\#HKP__=@:X"'10_W8$Z!X
M@\0&Z=8/*\#HEP__=@:X"710_W8$Z 8 @\0&Z;X/N"( Z'X/BT8&HYPFBT8$
MHY@FBT8&+0AT/0H =@/I*@+1X)/_IZ8ABUX(BD<"F"KDF8E&]HE6^(I' Y@J
MY)F)1O*)5O2+5OB+1O:Y" #1X-'2XOH+1O(+5O2CGB:)%J FBUX(BT<$F:.B
M)HD6I":X-@!0N $ 4.BU#H/$!(E&^HM&^NDY#XM>"(H'F"KDF8E&[HE6\(I'
M 9@JY)F)1NJ)5NR*1P*8*N29B4;FB5;HBD<#F"KDF8E&XHE6Y(I'!)@JY)F)
M1MZ)5N"*1P68*N29B4;:B5;<BU;PBT;NN1@ T>#1TN+ZBW;LBU[JN1  T>/1
MUN+Z"\,+UHMVZ(M>YKD( -'CT=;B^@O#"]:+=N2+7N(KR>L&T>/1UN+Z"\,+
MUJ.>)HD6H":+5N"+1MZY" #1X-'2XOJ+=MR+7MHKR>L&T>/1UN+Z"\,+UND<
M_[@V %"X 0!0Z-@-@\0$B4;ZBQ:@)J&>)KD( -'ZT=CB^BKD*]*+7@B(1P*+
M%J FH9XF*\GK!M'ZT=CB^BKD*]*+7@B(1P.AHB:)1P3IY?ZX-@!0N $ 4.B)
M#8/$!(E&^HL6H":AGB:Y& #1^M'8XOHJY"O2BUX(B >+%J FH9XFN1  T?K1
MV.+Z*N0KTHM>"(A' 8L6H":AGB:Y" #1^M'8XOHJY"O2BUX(B$<"BQ:@)J&>
M)BO)ZP;1^M'8XOHJY"O2BUX(B$<#BQ:D)J&B)KD( -'ZT=CB^BKD*]*+7@B(
M1P2+%J0FH:(FN0@ T?K1V.+Z*N0KTHM>"(A'!>DU_L=&^O__QP; )18 Z2?^
MN ( Z"8-*\!04/]V!E!0_W8$N!P 4+@! %#H,PR#Q!")1OKI0 TKP.@!#2O
M4/]V!O]V!%#_=@;HU0R#Q )0_W8$Z,L,@\0"4+@) %"X 0!0Z/P+@\00Z0P-
MN ( Z,P,BT8$HY@FBU8(BT8&HYXFB1:@)HM&"J.:)K@3 %"X 0!0Z%(,@\0$
MB4;ZA<!T!)GIU R+%J FH9XFZ_0 N 8 Z(H,Z$4 B4;ZBT8$B4;VBU[V_T;V
M@#\ =?7_3O;K&HM&^IFY"@#W^8/",(M>]H@7BT;ZF??YB4;Z_T[VBU[V@#]8
M=-N+1@3I?0P *\#H/0PKP%!04%!04+@4 % KP%#H3PN#Q!#I7PP *\#H'PS_
M=@3_=@:X!0!0N $ 4.AJ"X/$".E"#"O Z ,,@S[ )0!\!X,^P"4B?@FX#@!0
MN$TDZU7_=@3H70"#Q )0_W8$N ( 4.C8"H/$!K@" %"X7"10N ( 4.C&"H/$
M!HL>P"71X_^WO"'H+0"#Q )0BQ[ )='C_[>\(;@" %#HH0J#Q :X 0!0N%\D
M4+@" %#HCPJ#Q ;IPPNX @#H@PO'1OH  .L#_T;ZBUX$_T8$@#\ =?*+1OKI
MH@LKP.AC"[K&0;AM3E)0_S9D)/\V8B3HM L%.3"#T@"!XO]_HV(DB19D)"7_
M?RO2Z7$+ +@" .@P"XM>!(M'!*D8 '0%N/__ZV"+7@2+1P2I 0!T\(-O @%_
M6XM'!*D$ '0*N $ 4(U&^E#K"K@ !%"+7@3_=P:+7@3_-^A1 (/$!HM>!(E'
M H-_ @!_'X-_ @!U!X%/! @ ZZJ+7@2!3P00 .N@BT;Z*N3I]PJ+7@2+1P:)
M1PB+7@2+1P2I! !UY/]'"(M'"$B+V(H'F.O9 +@" .B4"BO 4%#_=@90_W8(
M_W8$N , 4+@! %#HGPF#Q!")1OKIK HKP.AM"HM>!(-_!@!T$8M'!*D@ '0)
M_W<&Z-6Y@\0"BUX$@6<$F_^+1@:)1P:#?P8 =06!3P0$ (M>!(M'!HE'",='
M @  Z6,* +@" .@B"BO 4%#_=@104%"X$0!0*\!0Z#()@\00B4;ZA<!U"Z&F
M)J.L)"O Z3,*N/__Z_BX!@#H[@F+1@2)1O:AK"2)1OBAK"0#1O:)1OJ#?O8
M?A [1OAS"[C__^L#BT;XZ?T)_W;ZZ)7_@\0"A<!T[>OFB]R+!XM? HDOB6<"
MB4<$,\##,\#HG0F+7@2+1@8+P'4!0(L/.TX = B+;@ +[77T](M^_HMV_(MN
M (MG HM/!(O<B0_# "O Z&D)Z: )*\#H80FX7N=0N X 4.A0 (/$!/]V!.@)
M (/$ N@C .E^"2O Z#\)*\!04%!04/]V!+@; % KP%#H3PB#Q!#I7PD *\#H
M'PDKP%!04%!04+@= % KP%#H,0B#Q!#I00D N 0 Z  )BT8$2(O8T>.+AZPN
MB4;XBT8$2(O8T>.+1@:)AZPNBT8$HY@F@WX& 70&@WX& '4%BT8&ZP.X).BC
MHB:X, !0*\!0Z&4(@\0$B4;ZA<!] ^GH"(M&^.OX %!345)65U4>!HO<BY\2
M (O#2P/;BY^L+O\VEB90_]-8CP:6)@<?75]>6EE;6(\&KB3/N H Z' (QT;R
M___'1O:" (M&!(E&^(M&!(E&^HU&"%#_=@:-1O)0Z!8 @\0&C4;R4"O 4.A_
M!(/$!(M&!.EP"+@@ .@P"(N^!@"+=@CIC $]1 !U ^D@ 3U/ '4#Z20!/5@
M=0/I)P$]8P!U ^DJ ?]V!+@E %#H/ 2#Q 3_=@2+WT>*!YA0Z"P$@\0$Z4P!
M@#TY?@/I@@&*!9@M, #W;O2)1MR+1OBZ"@#WZ@-&W(E&^.E< 4> /3!] ^ED
M 8 ].7X#Z5P!BT;VN@H ]^J*%;D( -/BT_J#ZC #PHE&]NO4@\8"BT3^F8E&
M\(E6\L=&^@H C4;?4/]V^O]V\O]V\.A5 8/$"/]V!(U&WU#H2 6#Q )0BD;K
MF%#_=O;_=OB-1M]0Z:\ @\8"BT3^F8E&\(E6\BO2Z[&#Q@*+1/Z9B4;PB5;R
MA=)]""O2B4;PB5;RQT;Z" #KG(/& HM$_IF)1O")5O*%TGT(*]*)1O")5O+'
M1OH0 .E[_X/&!(M4_HM$_.ED_X/&!(M4_HM$_.N[@\8$BU3^BT3\Z]"#Q@*+
M1/Z(1N__=@2*1N^84.@( X/$!.LH@\8"BT3^B4;L_W8$4.B5!(/$ E"*1NN8
M4/]V]O]V^/]V[.@S H/$#$> /0!T=( ])70#Z93^QT;X  #'1O8  ,=&] $
MQD;K($> /2UU!L=&]/__1X ],'4%QD;K,$> /3!\ ^EV_H ]+G4#Z9/^B@68
M/60 =0/IM/Y_ ^D>_CUO '4#Z?W^/7, =0/I<?\]=0!U ^G<_CUX '4#Z07_
MZ1O^Z5@&N!0 Z!@&QT;L  "#?@8 =1.#?@0 =0V+7@K&!S#&1P$ Z8P!@WX(
M"G4<@WX& 'T6BU8&BT8$]]KWV(/: (E&!(E6!O]&["O_C4;P \>+V,8' $>#
M_PQ\\"O_@WX("G5.*]*X"@!24/]V!O]V!.AR!HE&ZHU&\ /'B]B+1NJ(!XU&
M\ /'B]B*!YB9B4;HB5;J*]*X"@!24(M6!HM&!"M&Z!M6ZE)0Z/H%B48$B58&
M@WX("'4MBU8&BT8$)0< *]*-5O #UXO:B >+5@:+1@2Y P#1^M'8XOJ!XO\?
MB48$B58&@WX($'4MBU8&BT8$)0\ *]*-5O #UXO:B >+5@:+1@2Y! #1^M'8
MXOJ!XO\/B48$B58&1X-^!@!T ^D\_X-^! !T ^DS_\=&[@  C47_B_#K1(U&
M\ /&B]B /P!U$H-^[@!U#(U&\ /&B]C&!R#K)8U&\ /&B]B /PI]#(U&\ /&
MB]B !S#K"HU&\ /&B]B !S?_1NY.A?9]N(-^[ !T"XU&\ /'B]C&!RU'C47_
MB_#K$XU&\ /&B]B*!YB+7@J(!_]&"DZ%]GWIBUX*Q@< Z:4$N 0 Z&4$BT8,
MB4;Z@WX( 'X.BT8,.T8(?@:+1@B)1OJ+1OJ)1OB#?@8 ?Q/K./].!O]V#HI&
M"IA0Z&\ @\0$BT8&.T;Z?^?K'8M&^O].^H7 =!O_=@Z+7@3_1@2*!YA0Z$@
M@\0$BUX$@#\ ==N#?@8 ?2F ?@HP=2/_=@ZX+@!0Z"< @\0$_T8&ZQ'_1@;_
M=@Z*1@J84.@1 (/$!(M&^/?8.48&?.7I^P, N 0 Z+H#QT;X  "+7@:+1P2I
M& !T ^FF (M'!*D" '4#Z9L BT<$J00 =""X 0!0C48$4(M>!O\WZ(0"@\0&
MB4;ZBUX&QT<" 0#K08M>!O]'"(M'"$B+V(I&!(@'BUX&_T<"BT<"/0 $?"6+
M1P2I@ !U'?]W O]W!O\WZ$("@\0&B4;ZBUX&BT<&B4<(_T;X@W[X '0W@W[Z
M 'X+BUX&BT<".T;Z=!Z#?OH ?0J+7@:!3P00 .L(BUX&@4\$" "X___I-0.+
M7@;'1P(  (I&!)@JY.OM +@" .CD BO 4/]V!O]V!%!0_W8$Z+<"@\0"4+@2
M %"X 0!0Z.@!@\00B4;ZZ?4" +@" .BT HN^! "+M@8 B7[ZZP%'@#T =?KK
M"XO>1HH'F(O?1X@'@#P =?#&!0"+1OKIP (KP.B! HN^! "+M@8 B@68BA2Y
M" #3XM/Z.\)T%8H%F(H4N0@ T^+3^BO"ZP(KP.F. H ] '3V1T;KT@"X @#H
M1 *+O@0 B[8& (E^^NL+B]Y&B@>8B]]'B > / !U\,8% (M&^NE8 K@" .@8
M HM&!(E&^NL#_T8$BUX$@#\ =?6+PRM&^NDW @"X @#H]@&+O@0 B[8& (E^
M^H-^" !U!8O'Z1H"@#T = -'Z_B / !T$8O>1HH'F(O?1X@'@VX( 77JQ@4
MBT;ZZ]<KP.BU 8N^! "+M@8 B@68BA2Y" #3XM/Z.\)T%8H%F(H4N0@ T^+3
M^BO"ZP(KP.G" 8 ] '3V@VX( 73P1T;KS "X @#H<@&+O@0 B[8& (E^^H \
M '01B]Y&B@>8B]]'B >#;@@!=>K&!0"+1OKI@@$KP.A# ?]V!"O 4+@* %"X
M 0!0Z(X @\0(Z68!N ( Z"8!*\!04%!04%"X!P!0*\!0Z#@ @\00B4;ZBUX$
MH9@FB0>+1OKI.@$KP.C[ "O 4%#_=@90_W8(_W8$N 0 4+@! %#H!@"#Q!#I
M%@$KP.C7 (M&"*.8)HM&"J.:)HM&#*.<)HM&#J.>)HM&$*.@)HM&$J.B)O]V
M!O]V!.A4 (/$!.G> "O Z)\ _W8*Z'T @\0"B_B)/I@FBT8(HYHFBT8*HYPF
MOIXF@_\.?A#K%8M>"HH'F(O>1H@'_T8*B\=/A<!UZ_]V!O]V!.@& (/$!.F0
M +@" .A0 (M&!J.6)KB4)E#_=@3HC@"#Q 2)1OJ%P'47@SZ6)@!\!:&6)NL+
MH98F]]BCP"6X___I5@ KP.@7 (N^!  K]NL!1HO?1X _ '7WC40!Z3H 6U6+
M[%=6*^ [)K D<@+_X\<&EB8$ ,<&F"8" ,<&FB8/ ,<&GB:R)+B4)E"X 0!0
MZ!L @<0$ .G]_XUF_%Y?7<, N0$ Z0P N0( Z08 N0, Z0  58OLBX8$ (N>
M!@#-(%W# %6+[(M&"/=F!HO(BT8$]V8* \B+1@CW9@0#T5W""   58OL5RO_
MBU8&BT8$BUX*BTX(A=)Y"??:]]B#V@#WUX7;>0GWV_?9@]L ]]?H4P"%_W0'
M]]KWV(/: %]=P@@  %6+[%<K_XM6!HM&!(M>"HM."(72>0GWVO?8@]H ]]>%
MVWD']]OWV8/; .@5 (O3B\&%_W0']]KWV(/: %]=P@@  (7;=1*+V(O"*]+W
M\9/W\8O*B],KV\-55U8K_X3_=29'5XK[BMV*Z2K)B^F*Z"K)BL2*XHK6*O92
M4%&+S3O3<@VX___K"E=74E"+PBO2]_.+Z/?A7ROX@]( B_*+P_?E \:#T@!>
M*_"#T@!8*\)Y"DT#^1/S%0  Z_2+SXO>7X7_= B*S8KKBM^*^(O%*])>7UW#
M                        4V5L96-T(&)U9F9E<B H)7,I.B  4V5L96-T
M(&5X:7-T:6YG(&)U9F9E<B H)7,I.B  5&AA="!I<VXG="!A('-U8G-T<FEN
M9R!O9B!A;GD@8G5F9F5R(&YA;64A " ]/B  2VEL;"!B=69F97(Z( !.;R!S
M=6-H(&)U9F9E<@!+:6QL:6YG(&EN+75S92!B=69F97([('-E;&5C="!W:&EC
M:"!O=&AE<B!B=69F97(@*"5S*3H@ $YO('-U8V@@8G5F9F5R " J*E-(3U<J
M*@!"=69F97)S(&EN('1H:7,@14Q,13H*"@ J(  @(  @*  I( !%3TP@36]D
M92!I<R!#4DQ& $5/3"!-;V1E(&ES($Q& $1O=#T +"!086=E(  @($QI;F4@
M " @0V]L(  @(%ML:6YE(  @;V8@ " H;F\@14],(&%T($5/1B$I %T ("HJ
M3$E.15,J*@!-86EN $YO('-U8V@@8G5F9F5R $)U9F9E<B E<R!C;VYT86EN
M<R!C:&%N9V5S("T@9F]R9V5T('1H96T_( !!;')E861Y(#(@=VEN9&]W<P!/
M;FQY(#$@=VEN9&]W $]N;'D@,2!W:6YD;W< 3VYL>2 Q('=I;F1O=P!4;V\@
M;75C:  @*BI315!-3T1%*BH ("HJ34]$12HJ " J*D%32RHJ $YO('-U8V@@
M=VEN9&]W "TM34]212TM("AT>7!E(%-P86-E(&9O<B!M;W)E+"!O<B!T>7!E
M(&%N>2!C;VUM86YD('1O(&9L=7-H*0 M+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T@*$AI="!S<&%C92!T;R!C;VYT
M:6YU92DM+0  ("@ ($9I;&P ($UA8W)O1&5F "D@ #H@ " J " @ " M+0!4
M3U  0D]4 "TM    _D$J0D5"IT*^0M="[D),0WE#RT/V0PY$1T1?1(Y%I46\
M10     61BE&/$951G!&AT:@1M9&:$>P1]U'          #"2/!(*TE>299)
MK4GQ20       $)*8$I^2I1*  #B % !( )/ T\$:P2B!+4$R 0  %!9:UF"
M6>M9!EHZ6ME:\EH+6P  :0F."AH+5@O:"_D+%0RI#-I,B4V@30    "Y3=!-
MZ4T 3@       %$43!-H$X03%10T%! 5;&(     *F1Z9,)D&&4  /-*5TO@
M2@    #J= -U.790=A5M^FPP;;;5 M9.V0  UDOM2PY,)$R(3
MR&J,:95J                  !F/_3-
M              "> ",4!0 &%00 !7EZ'$X#&!H9 G%P"5U/)5QI %N- (QA
M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
M 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
M 0$! 0$' E8,'@Y4$%,2;Q-N%%47:Q@S'DHE<RU>,%\Q7S)?,U\T7S5?-E\W
M7SA?.5\[?#PX/CE;+EP(72U""T,11 Q&"D<I2"])?4P037M.%D]@4!=1,%0.
M50]64%<F66I^-G\- C4#A 5#!CP+1 PH#3</&Q!:$CT30!4G%CX70A@D&H,A
M@B1T)7(H9"EE*F<N=C!+,4<R1CA,.4T].EY)0C)%9D9U23]+-$](4T%4=W\=
M 0"   P$, ",!"< [ 0     4V5T(%!R;V9I;&4Z(  O $-A;FYO="!O<&5N
M(&9I;&4 0F%D('!R;V9I;&4@9F]R;6%T       * $5,3$4Z("5D>"5D('-C
M<F5E;B!T;V\@8FEG"@!%3$Q%.B!N;W0@96YO=6=H(&UE;6]R>0H 0W5R<V]R
M(&]U="!O9B!W:6YD;W< 9FEX7W=I;F0@9F%I;&5D /_______P#\ 0  > $
M /@                                       !!("T@06)O<G0@<')O
M8V5S<PI"("T@0G)E86MP;VEN=" H;75S="!H879E(")B<'0Z8B(@<V5T(&EN
M($%$0BD*0R M($-O;G1I;G5E"D0@+2!$:6%G;F]S=&EC(&-O;6UA;F0@;6]D
M90H 4R M(%1R>2!T;R!S879E(&-U<G)E;G0@8G5F9F5R"E<@+2!4<GD@=&\@
M<V%V92!W;W)L9" H86QL(&UO9&EF:65D(&)U9F9E<G,I"@     K0;=!24%.
M05-!54&W0;=!MT&W0;=!MT&W0;=!MT&W0;=!MT%30;=!=4&W0;=!MT%[075N
M:VYO=VX@97)R;W(@)60 5T%23DE.1R M($9)3$4@0T]24E505$5$(0I"=69F
M97)S(&%F9F5C=&5D.@H (" E<SH@)7,* " @)7,* "5S15)2.B E;R  4T)8
M %-"30!%3$Q%('-T;W!P960@8GD@9F%T86P@:6YT97)R=7!T("@E9"DA"E1Y
M<&4@4R!O<B!7('1O('1R>2!S879I;F<@>6]U<B!W;W)K+@H *$$L0BQ#+$0L
M4RQ7+#\I %-O<G)Y+"!N;R!D:6%G;F]S=&EC<PH 06QR96%D>2!S879I;F<@
M+2T@8V]N=&EN=65D $YO(&UA<FLA  #X!_P'+RH@ " J+P @(   1&]T(&]U
M="!O9B!W:6YD;W< __]&:6YD(&9I;&4Z( !296%D(&9I;&4Z( !6:7-I="!F
M:6QE.B  3F\@9&5F875L="!F:6QE(&YA;64N $EN<V5R="!F:6QE.B  *$YO
M(&-H86YG97,@;F5E9"!T;R!B92!W<FET=&5N*0!"=69F97(@)7,@8V]N=&%I
M;G,@8VAA;F=E<R M('=R:71E(&]U=#\@ $)U9F9E<B E<R!C;VYT86EN<R E
M<RP@=VAI8V@@8G5F9F5R('-H86QL($D@=7-E/R  <V]M971H:6YG "!#86YN
M;W0@<F5A9" M('1O;R!M86YY(&EN=&5R;F%L(&9I;&5S %-"(')T;B!C86YN
M;W0@<F5A9"!F:6QE/P @0V%N;F]T(')E860 ($-A;FYO="!W<FET90 @+2
M5W)I=&4@1FEL93H@ "!.;R!-87)K(0!7<FET92!296=I;VXZ( !.;R!K:6QL
M960@<W1U9F8 5W)I=&4@3&%S="!+:6QL.B  8F%D(&EW<FET9FEL92!A<F<
M3F\@9&5F875L="!F:6QE(&YA;64N %=R:71I;F<N+BX ($]U='!U="!E<G)O
M<@!7<FET=&5N ')E;F%M92!E<G)O<B$ +RL 4V%V:6YG("5S+BXN "!E<G)O
M<B M("5S"@ * &YU;#H   !(96QP(&9O<B!C;VUM86YD.B  32T 32T 7E@M
M $QO861I;F<@ "XN+@ @*BI(14Q0*BH ($YO(&AE;' @9F]U;F0 ("I32$]7
M*@          2V)D(&UA8W)O(&%C=&EV92P@:6=N;W)I;F<@(E-T87)T($MB
M9"!-86-R;R( ("I+0D1-04,J $%L<F5A9'D@:6X@:V)D(&UA8W)O(0!.;R!K
M8F0@;6%C<F\@9&5F:6YE9 !.;R!K8F0@;6%C<F\@9&5F:6YE9 !#=7)R96YT
M($MB9"!M86-R;SH*"@   "T+14Q,13H@8F%D('-W:71C:#H@)7,* $5,3$4Z
M(&UO<F4@=&AA;B E9"!F:6QE(&%R9W,L("5D(&EG;F]R960N"@!&=6YD86UE
M;G1A; !(3TU% %%U:70Z(&)U9F9E<G,@)7,L("5S+"XN+B!S=&EL;"!H879E
M(&-H86YG97,@+2!F;W)G970@=&AE;3\@ %%U:70Z(&)U9F9E<B E<R!S=&EL
M;"!H87,@8VAA;F=E<R M(&9O<F=E="!T:&5M/R  475I=#\@ %5S92!>6"!>
M4R!T;R!S879E(&)U9F9E<@!5<V4@7E@@7E<@=&\@=W)I=&4@;W5T(&)U9F9E
M<@!">64 0V%N;F]T(&9O<FL 4TA%3$P +V)I;B]S: !32$5,3  O8FEN+W-H
M '-H96QL "UI $YO('-H96QL(0!%3$Q%.B!.;R!M96UO<GD@;&5F= !3;VUE
M=&AI;F<@;W9E<G=R;W1E(&%N(&%L;&]C871E9"!B;&]C:R$ ; QZ#(D,475E
M<GD@4F5P;&%C90!297!L86-E(%-T<FEN9P!297!L86-E(&EN($QI;F4 ("HJ
M3$E.12HJ %)E<&QA8V4@<W1R:6YG.B  =VET:"!S=')I;F<Z(  E<R5S("5S
M %-0/5)E<&QA8V4L($1%3#U$;VXG="P@15-#/5-T;W L("$]4F5P;&%C92!A
M;&PL(%X]0F%C:R!U<"P@+CU297!L86-E("8@4W1O< !N;W0@:6UP;&5M96YT
M960         6P$4%04$!@<) EV,C3@Y"@L,#0\0$5].'&D= $AU:#\@5')Y
M(&%G86EN("T@  =%3$Q%($EN=&5R;F%L($5R<F]R.B      4F5V97)S92!3
M96%R8V@Z( !396%R8V@Z( !396%R8V@@1F%I;&5D " N+BX 3F]T:&EN9R!T
M;R!S96%R8V@@9F]R %(M<V5A<F-H.B  22US96%R8V@Z(  )*$9!24Q)3D<I
M $DM<V5A<F-H('-T<B!T;V\@;&]N9P"F#@  %300)Q G"" *&H@3!0V"!D$#
M*P*@ =  :       VGW??=5]T'W+?0
M
M                     /__
M                                    " !415)- $@Q.0!(,3D 1$TR
M-3 P $1-,S R-0 Z('5N:VYO=VX@=&5R;6EN86P@='EP90H &UL_,F@;1QM/
M&W$;7!MY-0 ;=QMY.1MX,0 ;=@ >'@ ;10 ;60 ;2P ;3  ;30 ;0  ;3P @
M?P ("  ;3@ (?P!#86YN;W0@86QL;V-A=&4@=&5R;6-A<"!B=69F97(* '!C
M &EM &1M &EA &ED &5I &5D &ES '1E '1I &%L &1L &-M &-L &-E '5P
M &EC &EP &1C &%M &)S &)C '-G '-O '-E &MM $U4 &%A82T 86UB87-S
M861O<@!M;0!M;P!L:0!C;P!497)M:6YA;"!D97-C<FEP=&EO;B!T;V\@8FEG
M(0H .B!T97)M:6YA;"!L86-K<R!O;F4@;V8Z(&-U<G-O<B!A9&1R97-S:6YG
M+"!C;&5A<B!S8W)E96XN"@ B$+8!     "L0,!!' "$ ,@ !  $  0 R$#L0
M4A!%3$Q%(#0N,0 N8F%K $X 36%R:R!S970 +W5S<B]S<F,O96QL92]H96QP
M+F1A=  N96QL97!R;RYB,0    " 50  0$X  "!%   030  "$0      %4M
M57-E9"P@3BU.6$TL($4M17AT97)N86PL($TM4TUN;V1E<RP@1"U31&YO9&5S
M " @(" @(%--.B!B86-K(" @<VUA9&1R(" @<VUL96X@('-M=7-E("!S;69L
M86=S  " 3   0%0  " J       \9CX@9FQA9W,Z("HM34]$("AD:7-K(&]U
M=&]F9&%T92DL($PM3$]#2RP@5"U,0TLR("AT96UP*0  /&8^(" @(" @4T0Z
M('-L9F]R=R!S;&)A8VL@<V1F;&=S('-D9F]R=R!S9&)A8VL@('-D;65M('-D
M9FEL92 @<V1A9&1R('-D;&5N  $ 3P " %<      $\M3W9E<G=R:71E+"!7
M+5=R:71E                           *365M;W)Y(%5S86=E.@H "7-B
M;5]N9FP@.B E-F\*  ES8FU?;&ES=#H@)39O"@ )<VUB;&L@;F]D97,@87)E
M("5O(&)Y=&5S(&QO;F<N"@!4<F%C:6YG(%--(&YO9&4@9G)E96QI<W0@+2T*
M " @("!-87AI;75M(&QO;W @9&5T96-T:6]N('-I>F4@:7,@)60N  H)3F\@
M;&ES="X* "5S)3=O+3X "B @("    I,3T]0("T@)6\@<V5E;B!A<R!N;V1E
M("5D(2$* %--(&9R965L:7-T(&QO;W  "D9R965L:7-T(&YO9&4@:&%S(&9L
M86=S.@H 1G)E92!332!F;&%G9V5D  I%;F0@+2 E9"!N;V1E<R!O;B!332!F
M<F5E;&ES="X* %1R86-I;F<@;65M(&QI<W0@+2T@"@ )3F\@;&ES=#\A"@!.
M;R!M96T@;&ES=#\A(0 @("!&;&%G<SH@)7,*)7,* " @)39O.B  3$]/4" M
M('-E96X@87,@;F]D92 E9"$A"@!,;V]P(&EN(&UE;2!L:7-T(2$ 7B  )39O
M($)!1"!"86-K<'1R(2$*"2 @("  0F%D(&)A8VL@<'1R(0!"040@+2!N;R!N
M;V1E($E$(0H)(" @( !333H@8F%D(&YO9&4@240 (" @("  1E)%12  6F5R
M;RUL96YG=&@@87)E82$ 4TTZ(&QE;B P $)A9"!F<F5E+6UE;2!B;&]C:P!"
M860@9G)E92UM96T@8FQO8VL "2 @0D%$(2$@)39O(&5X<&5C=&5D.R  06QI
M9VYM96YT(&5R<F]R(0 E9"!S:VEP<&5D+@H )60@;W9E<FQA<'!E9"X* $5N
M9" ]("4V;PH (" E-F\Z(" E<R @ " @("  1E)%10 E-F\Z(  E-60N("4U
M9"X )39O("4V;P @("4W;R ]("5S"@!4<F%C:6YG(%-$0DQ+(&YO9&4@9G)E
M96QI<W0@+2T* " @("!-87AI;75M(&QO;W @9&5T96-T:6]N('-I>F4@:7,@
M)60N  H)3F\@;&ES="X* "5S)3=O+3X "B @("    I,3T]0("T@)6\@<V5E
M;B!A<R!N;V1E("5D(2$ 4T0@9G)E96QI<W0@;&]O<  *1G)E96QI<W0@;F]D
M92!H87,@9FQA9W,Z"@!&<F5E(%-$(&9L86=G960 "D5N9" M("5D(&YO9&5S
M(&]N(%-$(&9R965L:7-T+@H 4')I;G1O=70@;V8@86QL(&EN+75S92!31$),
M2W,Z"@ @("5S"@ E<PH "@ E8R5C)6, ("4W;SH@)39O("4V;R E-F\@)39O
M("4V;R E-F\@)39O("4W;&\@)35L9"X*  H 4T0@9G)E96QI<W0@=&]O(&QO
M;F<@*"5D*0H 4T0@9G)E96QI<W0@=&]O(&QO;F< 4T0@9G)E96QI<W0@;&]O
M<"!A=" E;PH 4T0@9G)E96QI<W0@;&]O< !"860@9G)E92!31"P@;F]N+7IE
M<F\@9FQA9SH* $9R964@4T0@9FQA9V=E9 !4;V\@;6%N>2!31',@9F]R('1A
M8FQE("@E9"D* %1O;R!M86YY(%-$<P!4;V\@;6%N>2!31',@9F]R('1A8FQE
M("@E9"D* %1O;R!M86YY(%-$<P!"86-K;&ES="!L;V]P(2$@1'5P)V0@;F]D
M93HE<PH *&]N(&9R965L:7-T(2D  %!H>7,@4T0@;&]O< !31"!L;V]P "TM
M+2T@)7-,:7-T('-T87)T960Z( !0:'ES(   (%-&.B E;RP@9F0]("5D+"!L
M;CT@)6QD"@ @($)!1"$A(%-F<'1R,2 E;R!D;V5S;B=T(&UA=&-H(%-$("5O
M(2$* %-&4%12,2!B860 "@ E<PH "4)A9"!P:'ES(&)A8VMP='(* %!31"!B
M860@<V1B86-K  E"860@8F%C:W!T<@H 4T0@8F%D('-L8F%C:P )0F%D(&YO
M9&4@240A"@!"860@4T0@;F]D92!)1  )3F5G(&1I<VL@;&5N+V%D9'(* %-$
M.B!N96<@;&5N+V%D9'( "D)A9"!334),2R!P='(* %-$.B!B860@4TT "4)A
M9"!334),2S\@3&5N(&-O;F9L:6-T"@!31" A/2!330 )0F%D(%--0DQ++"!L
M96X@/"!U<V4* %-$.B!332!L96X@/"!U<V4 "4)A9"!S9&9I;&4@<'1R(2!3
M:&0@8F4@)6\* %-$.B!B860@<V1F:6QE  E"860@9&ES:R!A9&1R+"!N;W0@
M:6X@;W)D97(A"@!31"!A9&1R(&]U="!O9B!O<F1E<@!4;V\@;6%N>2!31',@
M9F]R('1A8FQE("@E9"D* %1O;R!M86YY(%-$<P )3$]/4"$A(%1H:7,@4T0@
M86QR96%D>2!S965N)7,N"@ @*&]N(&9R965L:7-T(2D  %-$(&QO;W  +2TM
M+2TM+2TM+2T* %-"1DE,12!P<FEN=&]U="!N;W0@8V]D960Z("5O"@!30E-4
M4B E;SH@ %IE<F\@<&]I;G1E<C\_/PH ("AI;RQC=7(L<BQW+&8L+BPK(#T@
M)6\L)6\L)60L)60L)6\L)6QO+"5L;RD* " @<V)F;&%G<R E-6\@/2 E<R H
M)7,I"@ @('-B8W5R("4V;P *(" @)7,*(" @ " @($)!1"!31$),2R!)1"$A
M( H 4T)#55(@;F]T(%-$/P @(" E<PH@("  (" @0D%$(%--0DQ+($E$(2$*
M %-"0U52(&AA<R!B860@4TT ("!S8FEO<" @)39O " @0D%$ $)A9"!30DE/
M4  @($)!1 !"860@4T))3U O8VYT<P * " @<V)R;&5F=" E-6\@/2 E-60N
M " @0D%$ $)A9"!S8G)L969T  H ("!S8G=L969T("4U;R ]("4U9"X ("!"
M040 0F%D('-B=VQE9G0 "@ @('-B9&]T("4W;&\@/2 E-VQD+@ @($)!1 !"
M860@<V)D;W0 "B @<V)O9F8@)3=L;R ]("4W;&0N"@ @($DO3R!P='(@;&]C
M.B E;&0N"@H 4'1R=&%B(&]V97)F;&]W    ($-A;B=T('-B<FL 6F5R;R!S
M8FU?;GAT<F$A %-"4DL@)6\@(3T@)6\ 3F\@=4Y832!N;V1E(0!30E)+("5O
M("$]("5O &=E='-P;&ET(&5R<CH@)6\ 06QI9VX@97)R &9R964Z(&)A9"!A
M<F<@)6\ <F5A;&QO8SH@8F%D(&%R9R E;P!:97)O('-B;5]N>'1R80 ZKO^N
MDJYCKO^NN:[DKD:O K,YL2FO K.HLLZR4T8@=&%B;&4@:6YC;VYS:7-T96YC
M>0!31$U%32 P %-$345-(#  4F5A9&EN(&)L:W-I>B!E<G( 3F\@9FEL90!2
M96%D:6X@4T0Z("5O $M)3$Q.(%-$,B!F86EL960 1T,@;&]O<"P@8V%N;F]T
M(&9R964@8FQO8VL@;V8@<VEZ92 E9 !3=V%P;W5T('=R="!E<G( 4V1F:6QE
M(# L(%-$("5O %-W87!O=70@97)R+"!31" E;P!3=V%P;W5T('-K(&5R<@!3
M=V%P;W5T('=R="!E<G( +W1M<"]S8F0N6%A86%A8 %-W87!O=70@8W)E870@
M97)R %-W87!O=70@;W!E;B!E<G( 4W=A<&]U="!S965K(&5R<CH@*"5D+"5L
M9"PP*2 E9" E<P!&1DY$(&)L97<@:70L(&)U="!R96-O=F5R960N(%-$("5O
M('-I>B E;&0 4VL@97)R %)D(&5R<@ H<W=A<"D  "5S("5D.B5S+" E;&0Z
M*"5D)7,L)6\L)60I/25L9" H9FP@)6QD*0
M        5$5234-!4 !415)- "]E=&,O=&5R;6-A< !R $]/4%,  %$@+2!1
M=6ET(&1I86<@;6]D90HA("T@1V]T;R!S=6)S:&5L; I6("T@5F5R:69Y($UE
M;2 F(%-$(&QI<W1S"DU&("T@365M($9R965L:7-T"DT@("T@365M(&QI<W0*
M0B @+2!#=7)R96YT(&)U9F9E<B!30@I$1B M(%-$($9R965L:7-T"D0@("T@
M4T1S(&EN('5S90I$3" M(%-$($QO9VEC86P@;&ES=',*1% @+2!31"!0:'ES
M:6-A;"!L:7-T<PI#(&X@+2!#;VUP86-T.R P+3<]<V)X7V-O;7 H;BDL(#@]
M4TT@9G)E96QI<W0L(#D]4T0@9G)E96QI<W0N"E<@("T@5VEN9&]W('!R:6YT
M;W5T"E@@;B M(%AE<F-I<V4@<F%N9&]M;'D@*$=#(&5V97)Y(&XI"EH@;B M
M(&QI:V4@6"!B=70@=VET:"!N;W1E<PH -Q\^'T(?1A]+'U,?5Q]='V$?:!\
M            4V5L9BUC:&5C:VEN9R!O;@!396QF+6-H96-K:6YG(&]F9@!-
M96T@;6=T %-"0E5& %-$(&QI<W0 "B5S(&5R<F]R.B E<R A(2$* $0^ " @
M1F%I;&5D.B E<PH ("!/2PH /S\@5'EP92 _(&9O<B!H96QP"@!T:')O;F4
M=&]O '-K>0!F;W)E &9I;F=E<G, <V5X '-T;VYE # Q, !N87IG=6P 8F%S
M90 J*D583U)#25-%*BH 3&EN92  0G5F9FQE;CH@)6QD"@!4>7!E:6X@<W1O
M<"X* "!087-S("5L9  @+2!'0R!L978@)60* "!+:6QL("5L9"\@)60[ %A%
M4E(@869T97(@:VEL;#H@)7,* "!986YK("5L9#L 6$524B!A9G1E<B!Y86YK
M.B E<PH (%!O<#L 6$524B!A9G1E<B!P;W Z("5S"@ @061D $QI;F4@ %A%
M4E(@869T97(@:6YS.B E<PH "@!815)2(&EN('!A='1E<FXA"@!,;V]P(&-O
M=6YT(#T@)6QD"@!C=7)?9&]T+R E;&0@(&-U<E]B=68O("5O(&-U<E]W:6XO
M("5O"@!7:6YD;W<@)6\Z"@ @(&YE>'0O("5O"@ @(&)U9B O("5O"@ @(')E
M9' O("5O"@ @('1O<&QD;W0O("5L9 H ("!D;W0@+R E;&0* " @8FUO9"\@
M)6QD"@ @(&5M;V0O("5L9 H ("!O;&1Z+R E;&0* " @<&]S("\@)60* " @
M:'0@("\@)60* ",@($9L86=S(" @0F]F9B!,96X@(2!#;VQS($QI;F4* "4R
M9" E+34N-7,@)39L9" E,V0@)3%D("4T9"  )2TT,"XT,',* "4R-F0@ "4M
M-# N-#!S"@   &8A( DN+#LZ*2$ 1FEL;"!C;VQU;6X@/2  06)S=7)D($9I
M;&P@4')E9FEX  !&:6QL(%!R969I>" ]("( (@   )/B;^&2XY+CDN.2XY+C
MDN.2X\WAXN($(@PB%B(P(D B6")B(GPBCB*@(K BO"+.(MXB\"+\(A(C)",P
M(T(C42-A(W C@2.5(ZDCNB/)(]@C\"/](Q,D(B0N)#PD(P!%<G)O<B P $YO
M="!O=VYE<@!.;R!S=6-H(&9I;&4@;W(@9&ER96-T;W)Y $YO('-U8V@@<')O
M8V5S<P!);G1E<G)U<'1E9"!S>7-T96T@8V%L; !)+T\@97)R;W( 3F\@<W5C
M:"!D979I8V4@;W(@861D<F5S<P!!<F<@;&ES="!T;V\@;&]N9P!%>&5C(&9O
M<FUA="!E<G)O<@!"860@9FEL92!N=6UB97( 3F\@8VAI;&1R96X 3F\@;6]R
M92!P<F]C97-S97, 3F]T(&5N;W5G:"!C;W)E %!E<FUI<W-I;VX@9&5N:65D
M $)A9"!A9&1R97-S $)L;V-K(&1E=FEC92!R97%U:7)E9 !-;W5N="!D979I
M8V4@8G5S>0!&:6QE(&5X:7-T<P!#<F]S<RUD979I8V4@;&EN:P!.;R!S=6-H
M(&1E=FEC90!.;W0@82!D:7)E8W1O<GD 27,@82!D:7)E8W1O<GD 26YV86QI
M9"!A<F=U;65N= !&:6QE('1A8FQE(&]V97)F;&]W %1O;R!M86YY(&]P96X@
M9FEL97, 3F]T(&$@='EP97=R:71E<@!497AT(&9I;&4@8G5S>0!&:6QE('1O
M;R!L87)G90!.;R!S<&%C92!L969T(&]N(&1E=FEC90!);&QE9V%L('-E96L
M4F5A9"UO;FQY(&9I;&4@<WES=&5M %1O;R!M86YY(&QI;FMS $)R;VME;B!P
M:7!E $UA=&@@87)G=6UE;G0 4F5S=6QT('1O;R!L87)G90!);G9A;&ED(&5R
M<FYO"@ Z(  *   !          $ K":L)@$   !" *PJK"H"    !@
M9B1P)'HD                                             ,PN
1 %-T86-K(&]V97)F;&]W"@

end

Postmaster@locke.bitnet (PMDF Mail Server) (12/20/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 05:14 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 0972 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 05:14 PST
Received: by NDSUVM1 (Mailer X1.24) id 0884; Sun, 20 Dec 87 06:02:00 CST
Date: 19 Dec 87 21:50:16 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: ELLE sharfile (misc. files)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin
echo Extracting \d\e\f\p\r\f\.\e
sed 's/^X//' > \d\e\f\p\r\f\.\e << '+ END-OF-FILE '\d\e\f\p\r\f\.\e
X;;;
X;;; ELLE Default Command Profile - "defprf.e"
X;;;
X;;;    This file is input to the ellec program.  It defines the default
X;;; command key bindings that ELLE uses, in the absence of an individual
X;;; user profile.
X;;;    These defaults attempt to emulate the default EMACS command key
X;;; bindings.  Differences, where known, are commented.
X;;;
X;;;    "ELLE" means the function is unique to ELLE.
X;;;    E/G: (cmd altnam) "thisname";
X;;;        "E:" refers to TOPS-20 EMACS, "G:" refers to Gnu Emacs.
X;;;        (cmd) This function exists but is bound to "cmd" instead.
X;;;            (*) function exists but is not bound to any specific key.
X;;;            ()  function does not exist.
X;;;            (=) function exists, with same binding (normally omitted)
X;;;        altnam  Name by which this function is known.
X;;;        "thisname" - name of function bound to this command.
X;;;            -    means the command is unbound (undefined).
X
X(keyallunbind)        ; Flush any predefined bindings
X
X(keybind ^@ "Set/Pop Mark")
X(keybind ^A "Beginning of Line")
X(keybind ^B "Backward Character")
X; ^C not bound.              ; E: ()- G: mode-specific-command-prefix
X(keybind ^D "Delete Character")
X(keybind ^E "End of Line")
X(keybind ^F "Forward Character")
X(keybind ^H "Backward Character")    ; G: (^B) help-command
X(keybind ^I "Indent According to Mode")
X(keybind ^J "Indent New Line")
X(keybind ^K "Kill Line")
X(keybind ^L "New Window")
X(keybind ^M "CRLF")
X(keybind ^N "Down Real Line")
X(keybind ^O "Open Line")
X(keybind ^P "Up Real Line")
X(keybind ^Q "Quoted Insert")
X(keybind ^R "Reverse Search")
X(keybind ^S "Incremental Search")
X(keybind ^T "Transpose Characters")
X(keybind ^U "Universal Arg")
X(keybind ^V "Next Screen")
X(keybind ^W "Kill Region")
X(keybind ^X "Prefix Extend")
X(keybind ^Y "Un-kill")
X; ^Z not bound            ; E: Prefix Control-Meta;  G: suspend-emacs
X(keybind ^[ "Prefix Meta")
X(keybind "^\" "Debug Mode")    ; ELLE. E: () Prefix Meta;  G: () -
X; ^] not bound.            ; E+G: Abort Recursive Edit
X(keybind ^^ "Hit Breakpoint")    ; ELLE. E: () Prefix Control;  G: () -
X(keybind ^_ "Describe")        ; E: (M-?) Help;  G: (^H-k) undo
X(keybind " " "Insert Self")
X(keybind ! "Insert Self")
X(keybind """" "Insert Self")
X(keybind # "Insert Self")
X(keybind $ "Insert Self")
X(keybind % "Insert Self")
X(keybind & "Insert Self")
X(keybind ' "Insert Self")
X(keybind "(" "Insert Self")
X(keybind ")" "Insert Self")
X(keybind * "Insert Self")
X(keybind + "Insert Self")
X(keybind , "Insert Self")
X(keybind - "Insert Self")
X(keybind . "Insert Self")
X(keybind / "Insert Self")
X(keybind 0 "Insert Self")
X(keybind 1 "Insert Self")
X(keybind 2 "Insert Self")
X(keybind 3 "Insert Self")
X(keybind 4 "Insert Self")
X(keybind 5 "Insert Self")
X(keybind 6 "Insert Self")
X(keybind 7 "Insert Self")
X(keybind 8 "Insert Self")
X(keybind 9 "Insert Self")
X(keybind : "Insert Self")
X(keybind ";" "Insert Self")
X(keybind < "Insert Self")
X(keybind = "Insert Self")
X(keybind > "Insert Self")
X(keybind ? "Insert Self")
X(keybind @ "Insert Self")
X(keybind A "Insert Self")
X(keybind B "Insert Self")
X(keybind C "Insert Self")
X(keybind D "Insert Self")
X(keybind E "Insert Self")
X(keybind F "Insert Self")
X(keybind G "Insert Self")
X(keybind H "Insert Self")
X(keybind I "Insert Self")
X(keybind J "Insert Self")
X(keybind K "Insert Self")
X(keybind L "Insert Self")
X(keybind M "Insert Self")
X(keybind N "Insert Self")
X(keybind O "Insert Self")
X(keybind P "Insert Self")
X(keybind Q "Insert Self")
X(keybind R "Insert Self")
X(keybind S "Insert Self")
X(keybind T "Insert Self")
X(keybind U "Insert Self")
X(keybind V "Insert Self")
X(keybind W "Insert Self")
X(keybind X "Insert Self")
X(keybind Y "Insert Self")
X(keybind Z "Insert Self")
X(keybind [ "Insert Self")
X(keybind "\" "Insert Self")
X(keybind ] "Insert Self")
X(keybind ^ "Insert Self")
X(keybind _ "Insert Self")
X(keybind ` "Insert Self")
X(keybind a "Insert Self")
X(keybind b "Insert Self")
X(keybind c "Insert Self")
X(keybind d "Insert Self")
X(keybind e "Insert Self")
X(keybind f "Insert Self")
X(keybind g "Insert Self")
X(keybind h "Insert Self")
X(keybind i "Insert Self")
X(keybind j "Insert Self")
X(keybind k "Insert Self")
X(keybind l "Insert Self")
X(keybind m "Insert Self")
X(keybind n "Insert Self")
X(keybind o "Insert Self")
X(keybind p "Insert Self")
X(keybind q "Insert Self")
X(keybind r "Insert Self")
X(keybind s "Insert Self")
X(keybind t "Insert Self")
X(keybind u "Insert Self")
X(keybind v "Insert Self")
X(keybind w "Insert Self")
X(keybind x "Insert Self")
X(keybind y "Insert Self")
X(keybind z "Insert Self")
X(keybind { "Insert Self")
X(keybind | "Insert Self")
X(keybind } "Insert Self")
X(keybind ~ "Insert Self")
X(keybind DEL "Backward Delete Character")
X
X; Meta chars
X
X(keybind M-^B "Move to Window Bottom")    ; ELLE (ima). E+G:()-
X(keybind M-^L "Goto Line")        ; E:();  G:(* goto-line) -
X(keybind M-^N "Scroll Window Down")    ; ELLE (ima). E+G:()- forward-list
X(keybind M-^P "Scroll Window Up")    ; ELLE (ima). E+G:()- backward-list
X(keybind M-^R "Reverse String Search")    ; E:(*); G:(* search-backward) -
X(keybind M-^S "String Search")        ; E:(*); G:(* search-forward)
 isearch-forward-regexp
X(keybind M-^T "Move to Window Top")    ; ELLE (ima). E+G:()-
X(keybind M-^W "Append Next Kill")
X(keybind M-^X "Select Existing Buffer")    ; ELLE (ima). E+G:()-
X(keybind M-^^ "Shrink Window")        ; ELLE (ima). E+G:()-
X(keybind M-% "Query Replace")
X(keybind M-- "Negative Argument")
X(keybind M-0 "Argument Digit")
X(keybind M-1 "Argument Digit")
X(keybind M-2 "Argument Digit")
X(keybind M-3 "Argument Digit")
X(keybind M-4 "Argument Digit")
X(keybind M-5 "Argument Digit")
X(keybind M-6 "Argument Digit")
X(keybind M-7 "Argument Digit")
X(keybind M-8 "Argument Digit")
X(keybind M-9 "Argument Digit")
X(keybind "M-;" "Indent for Comment")
X(keybind M-< "Goto Beginning")
X(keybind M-> "Goto End")
X(keybind M-[ "Backward Paragraph")
X(keybind "M-\" "Delete Horizontal Space")
X(keybind M-] "Forward Paragraph")
X(keybind M-B "Backward Word")
X(keybind M-C "Uppercase Initial")
X(keybind M-D "Kill Word")
X(keybind M-F "Forward Word")
X(keybind M-G "Fill Region")
X(keybind M-H "Mark Paragraph")
X(keybind M-I "Indent Relative")        ; E+G: (*) Tab to Tab Stop
X(keybind M-L "Lowercase Word")
X(keybind M-M "Back to Indentation")
X(keybind M-N  "Next Line")        ; E:(*); G:(* forward-line) -
X(keybind M-O "VT100 button hack")    ; ELLE. E+G: () -
X(keybind M-P  "Previous Line")        ; E:(*); G:() -
X(keybind M-Q "Fill Paragraph")
X(keybind M-T "Transpose Words")
X(keybind M-U "Uppercase Word")
X(keybind M-V "Previous Screen")
X(keybind M-W "Copy Region")
X(keybind M-Y "Un-kill Pop")
X(keybind M-~ "Buffer Not Modified")
X(keybind M-DEL "Backward Kill Word")
X
X; Extended commands
X
X(keybind X-^B "List Buffers")
X(keybind X-^C "Write File Exit")    ; ELLE (ima). E:()-; G: (=
 save-buffers-kill-emacs)
X(keybind X-^E "Write Region")        ; E:(*)-;    G:(*) eval-last-sexp
X(keybind X-^F "Find File")
X(keybind X-^K "Write Last Kill")    ; ELLE (mnx). E+G:()-
X(keybind X-^L "Lowercase Region")
X(keybind X-^M "EOL CRLF Mode")        ; ELLE.  E+G: ()-
X(keybind X-^O "Delete Blank Lines")
X(keybind X-^P "Set Profile")        ; ELLE.  E+G: () Mark Page
X(keybind X-^R "Read File")
X(keybind X-^S "Save File")
X(keybind X-^U "Uppercase Region")
X(keybind X-^V "Visit File")
X(keybind X-^W "Write File")
X(keybind X-^X "Exchange Point and Mark")
X(keybind X-^Z "Return to Superior")    ; G:() suspend-emacs
X(keybind X-! "Push to Inferior")    ; ELLE.  E:(*)-; G:()-
X(keybind X-$  "Replace in Line")    ; ELLE (mnx). E+G:()-
X(keybind X-% "Replace String")        ; E+G: (*) -
X(keybind "X-(" "Start Kbd Macro")
X(keybind "X-)" "End Kbd Macro")
X(keybind X-* "View Kbd Macro")        ; E: (*)-; G: ()-
X(keybind X-. "Set Fill Prefix")
X(keybind X-0 "Delete Window")        ; E: ()-
X(keybind X-1 "One Window")
X(keybind X-2 "Two Windows")
X(keybind X-8 "Standout Window")        ; ELLE.  E+G:()-
X(keybind X-9 "Two Mode Windows")    ; ELLE.  E+G:()-
X(keybind X-= "What Page")        ; E+G: (*) What Cursor Position
X(keybind X-^ "Grow Window")
X(keybind X-B "Select Buffer")
X(keybind X-E "Execute Kbd Macro")
X(keybind X-F "Set Fill Column")
X(keybind X-I "Insert File")        ; E: (*) Info
X(keybind X-K "Kill Buffer")
X(keybind X-O "Other Window")
X(keybind X-S "Save All Files")        ; E:(*)-; G:(= save-some-buffers)
X(keybind X-T "Auto Fill Mode")        ; E:(*) Transpose Regions;  G:(*)-
X(keybind X-DEL "Backward Kill Line")    ; ELLE(ico)  E+G:() Backward Kill
 Sentence
X
X; IMAGEN-specific functions, not bound.
X;(keybind ""  "Text Mode")        ; IMAGEN E:(*);    G:(*)
X;(keybind ""  "Execute Unix Command")    ; IMAGEN E:();    G:(M-!
 shell-command)
X;(keybind ""  "Execute Make")        ; IMAGEN E:(* Compile); G:(* compile)
X;(keybind ""  "Find Next Error")    ; IMAGEN E:();    G:(X-` next-error)
X
X; SUN Mouse functions, for menuitem selection.
X;(menuitem "Stuff Selection")    ; SUN
X;(menuitem "Select Region")    ; SUN
X
X; Forget completely about these.
X;(keybind ""  "ICO Extend Command")    ; ICONOGRAPHICS
X;(keybind ""  "ICO Typeset Funs")    ; ICONOGRAPHICS
X;(keybind ""  "ICO Spec Input Funs")    ; ICONOGRAPHICS
X
+ END-OF-FILE defprf.e
chmod 'u=rw,g=r,o=r' \d\e\f\p\r\f\.\e
set `sum \d\e\f\p\r\f\.\e`
sum=$1
case $sum in
55136)    :;;
*)    echo 'Bad sum in '\d\e\f\p\r\f\.\e >&2
esac
echo Extracting \.\e\l\l\e\p\r\o\.\e
sed 's/^X//' > \.\e\l\l\e\p\r\o\.\e << '+ END-OF-FILE '\.\e\l\l\e\p\r\o\.\e
X; This is the default user profile to emulate "mined" (MINIX editor),
X; as per Andy Tanenbaum.
X
X(keyallunbind)
X
X; Insert self
X(keybind A "Insert Self")
X(keybind B "Insert Self")
X(keybind C "Insert Self")
X(keybind D "Insert Self")
X(keybind E "Insert Self")
X(keybind F "Insert Self")
X(keybind G "Insert Self")
X(keybind H "Insert Self")
X(keybind I "Insert Self")
X(keybind J "Insert Self")
X(keybind K "Insert Self")
X(keybind L "Insert Self")
X(keybind M "Insert Self")
X(keybind N "Insert Self")
X(keybind O "Insert Self")
X(keybind P "Insert Self")
X(keybind Q "Insert Self")
X(keybind R "Insert Self")
X(keybind S "Insert Self")
X(keybind T "Insert Self")
X(keybind U "Insert Self")
X(keybind V "Insert Self")
X(keybind W "Insert Self")
X(keybind X "Insert Self")
X(keybind Y "Insert Self")
X(keybind Z "Insert Self")
X(keybind a "Insert Self")
X(keybind b "Insert Self")
X(keybind c "Insert Self")
X(keybind d "Insert Self")
X(keybind e "Insert Self")
X(keybind f "Insert Self")
X(keybind g "Insert Self")
X(keybind h "Insert Self")
X(keybind i "Insert Self")
X(keybind j "Insert Self")
X(keybind k "Insert Self")
X(keybind l "Insert Self")
X(keybind m "Insert Self")
X(keybind n "Insert Self")
X(keybind o "Insert Self")
X(keybind p "Insert Self")
X(keybind q "Insert Self")
X(keybind r "Insert Self")
X(keybind s "Insert Self")
X(keybind t "Insert Self")
X(keybind u "Insert Self")
X(keybind v "Insert Self")
X(keybind w "Insert Self")
X(keybind x "Insert Self")
X(keybind y "Insert Self")
X(keybind z "Insert Self")
X(keybind 0 "Insert Self")
X(keybind 1 "Insert Self")
X(keybind 2 "Insert Self")
X(keybind 3 "Insert Self")
X(keybind 4 "Insert Self")
X(keybind 5 "Insert Self")
X(keybind 6 "Insert Self")
X(keybind 7 "Insert Self")
X(keybind 8 "Insert Self")
X(keybind 9 "Insert Self")
X(keybind / "Insert Self")
X(keybind : "Insert Self")
X(keybind < "Insert Self")
X(keybind = "Insert Self")
X(keybind > "Insert Self")
X(keybind ? "Insert Self")
X(keybind @ "Insert Self")
X(keybind [ "Insert Self")
X(keybind ] "Insert Self")
X(keybind ^ "Insert Self")
X(keybind # "Insert Self")
X(keybind $ "Insert Self")
X(keybind % "Insert Self")
X(keybind & "Insert Self")
X(keybind ' "Insert Self")
X(keybind * "Insert Self")
X(keybind + "Insert Self")
X(keybind , "Insert Self")
X(keybind - "Insert Self")
X(keybind . "Insert Self")
X(keybind ! "Insert Self")
X(keybind " " "Insert Self")
X(keybind """" "Insert Self")
X(keybind "(" "Insert Self")
X(keybind ")" "Insert Self")
X(keybind ";" "Insert Self")
X(keybind "\" "Insert Self")
X(keybind _ "Insert Self")
X(keybind ` "Insert Self")
X(keybind { "Insert Self")
X(keybind | "Insert Self")
X(keybind } "Insert Self")
X(keybind ~ "Insert Self")
X
X; CTRL char
X(keybind ^A "Beginning of Line")
X(keybind ^B "Backward Word")
X(keybind ^C "Copy Region")
X(keybind ^D "Scroll Window Up")
X(keybind ^E "New Window")
X(keybind ^F "Forward Word")
X(keybind ^H "Backward Delete Character")
X(keybind ^I "Insert Self")
X; open
X(keybind ^K "Kill Region")
X(keybind ^L "Replace in Line")
X(keybind ^M "CRLF")
X(keybind ^N "Kill Word")
X(keybind ^O "Open Line")
X(keybind ^P "Backward Kill Word")
X(keybind ^Q "Write Last Kill")
X(keybind ^R "Replace String")
X(keybind ^S "Push to Inferior")
X(keybind ^T "Kill Line")
X(keybind ^U "Scroll Window Down")
X(keybind ^V "Find File")
X(keybind ^W "Save File")
X(keybind ^X "Prefix Extend")
X(keybind ^Y "Un-kill")
X(keybind ^Z "End of Line")
X(keybind "^\" "Quoted Insert")
X(keybind ^_ "Move to Window Bottom")
X(keybind ^^ "Set/Pop Mark")
X(keybind ^] "Goto Line")
X
X; ESC char
X(keybind ^[ "Prefix Meta")
X(keybind M-0 "Argument Digit")
X(keybind M-1 "Argument Digit")
X(keybind M-2 "Argument Digit")
X(keybind M-3 "Argument Digit")
X(keybind M-4 "Argument Digit")
X(keybind M-5 "Argument Digit")
X(keybind M-6 "Argument Digit")
X(keybind M-7 "Argument Digit")
X(keybind M-8 "Argument Digit")
X(keybind M-9 "Argument Digit")
X(keybind M-A "Append Next Kill")
X(keybind M-B "Select Buffer")
X(keybind M-C "Uppercase Word")
X(keybind M-E "Execute Kbd Macro")
X(keybind M-F "Find File")
X(keybind M-G "Insert File")
X(keybind M-H "Describe")
X(keybind M-I "Uppercase Initial")
X(keybind M-K "Kill Buffer")
X(keybind M-L "Lowercase Region")
X(keybind M-M "Mark Paragraph")
X(keybind M-N "Buffer Not Modified")
X(keybind M-O "Lowercase Word")
X(keybind M-P "Forward Paragraph")
X(keybind M-Q "Query Replace")
X(keybind M-R "Set Profile")
X(keybind M-S "Select Existing Buffer")
X(keybind M-T "Transpose Characters")
X(keybind M-U "Uppercase Region")
X(keybind M-W "Transpose Words")
X(keybind M-X "Return to Superior")
X(keybind M-Y "Un-kill Pop")
X(keybind M-Z "Incremental Search")
X(keybind M-^ "Exchange Point and Mark")
X(keybind M-* "View Kbd Macro")
X(keybind M-[ "Prefix Extend")
X(keybind M-] "Backward Paragraph")
X(keybind M-= "Delete Horizontal Space")
X(keybind M-| "Delete Blank Lines")
X(keybind "M-," "Move to Window Top")
X(keybind "M-;" "Indent for Comment")
X(keybind "M-." "Indent Relative")
X(keybind "M-/" "Start Kbd Macro")
X(keybind "M-\" "End Kbd Macro")
X
X
X; CTRL-X char
X(keybind X-1 "One Window")
X(keybind X-2 "Two Windows")
X(keybind X-A "Up Real Line")
X(keybind X-B "Down Real Line")
X(keybind X-C "Forward Character")
X(keybind X-D "Backward Character")
X(keybind X-G "List Buffers")
X(keybind X-H "Goto Beginning")
X(keybind X-L "Grow Window")
X(keybind X-N "Other Window")
X(keybind X-P "Shrink Window")
X(keybind X-S "Reverse String Search")
X(keybind X-T "String Search")
X(keybind X-U "Next Screen")
X(keybind X-V "Previous Screen")
X(keybind X-W "New Window")
X(keybind X-X "Return to Superior")
X(keybind X-Y "Goto End")
X
X(keybind X-^A "Up Real Line")
X(keybind X-^B "Down Real Line")
X(keybind X-^C "Forward Character")
X(keybind X-^D "Backward Character")
X(keybind X-^G "List Buffers")
X(keybind X-^H "Goto Beginning")
X(keybind X-^L "Grow Window")
X(keybind X-^N "Other Window")
X(keybind X-^P "Shrink Window")
X(keybind X-^S "Reverse String Search")
X(keybind X-^T "String Search")
X(keybind X-^U "Next Screen")
X(keybind X-^V "Previous Screen")
X(keybind X-^W "New Window")
X(keybind X-^X "Return to Superior")
X(keybind X-^Y "Goto End")
X
X
X(keybind DEL "Delete Character")
+ END-OF-FILE .ellepro.e
chmod 'u=rw,g=r,o=r' \.\e\l\l\e\p\r\o\.\e
set `sum \.\e\l\l\e\p\r\o\.\e`
sum=$1
case $sum in
54638)    :;;
*)    echo 'Bad sum in '\.\e\l\l\e\p\r\o\.\e >&2
esac
echo Extracting \h\e\l\p\.\d\a\t
sed 's/^X//' > \h\e\l\p\.\d\a\t << '+ END-OF-FILE '\h\e\l\p\.\d\a\t
XThis file describes all ELLE functions, and is in a specific format for use
Xby the "Describe" function (normally invoked by the command ^_).
X    Each function is identified by a number (which matches its
Xinternal index as defined by deffun.e), and by a name to the right of
Xthe number.  All text up to the first blank line is considered part of
Xthe documentation for that function.
X
X<F0> -- undefined --
X    This command does not have any defined function assigned to it.
X
X<F1> Insert Self
X    The character is inserted into the buffer.
X
X<F2> Quoted Insert
X    Reads a character and inserts it.
X
X<F3> CRLF
X    Insert CRLF (End Of Line), or move onto blank line.
X    A blank line is one containing only spaces and tabs
X    (which are killed if we move onto it).  Single blank lines
X    (followed by nonblank lines) are not eaten up this way.
X
X<F4> Forward Character
X    Moves forward one character.
X    With argument, moves that many characters forward.
X    Negative args move backward.
X
X<F5> Backward Character
X    Moves back one character.
X    With argument, moves that many characters backward.
X    Negative args move forward.
X
X<F6> Delete Character
X    Deletes character after point.
X    With argument, kills (and saves) that many characters.
X    Negative args kill characters backward.
X
X<F7> Backward Delete Character
X    Deletes character before point.
X    With argument, kills (and saves) that many characters.
X    Negative args kill characters forward.
X
X<F8> Delete Horizontal Space
X    Deletes all spaces and tabs around point.
X
X<F9> Transpose Characters
X    Transposes the characters before and after the cursor.
X
X<F10> Forward Word
X    Moves forward over one word.
X
X<F11> Backward Word
X    Moves backward over one word.
X
X<F12> Kill Word
X    Kills next word.
X
X<F13> Backward Kill Word
X    Kills last word.
X
X<F14> Transpose Words
X    Transposes the words before and after the cursor.
X
X<F15> Uppercase Word
X    Converts one word to upper case, moving past it.
X    With arg, applies to that many words backward or forward.
X
X<F16> Lowercase Word
X    Converts one word to lower case, moving past it.
X    With arg, applies to that many words backward or forward.
X
X<F17> Uppercase Initial
X    Puts next word in lower case, but capitalize initial.
X    With arg, applies to that many words backward or forward.
X
X<F18> reserved
X
X<F19> reserved
X
X<F20> Beginning of Line
X    Moves to beginning of line.
X
X<F21> End of Line
X    Moves to end of line.
X
X<F22> Next Line
X    Moves to beginning of next line.
X
X<F23> Previous Line
X    Moves to beginning of previous line.
X
X<F24> Down Real Line
X    Moves down vertically to next real line.
X    Continuation lines are skipped.  If given after the
X    last LF in the buffer, makes a new one at the end.
X
X<F25> Up Real Line
X    Moves up vertically to next real line.
X    Continuation lines are skipped.
X
X<F26> Open Line
X    Inserts an EOL (End Of Line) after point.
X    Differs from ordinary insertion in that point remains
X    before the inserted characters.
X    With argument, inserts several EOLs.
X
X<F27> Delete Blank Lines
X    Kills all blank lines around point.
X
X<F28> Kill Line
X    Kills to end of line, or kills an end of line (EOL).
X    At the end of a line (only blanks following), kills through the EOL.
X    Otherwise, kills the rest of the line but not the EOL.
X    With argument (positive or negative), kills specified number of lines.
X    Killed text is pushed onto the kill ring for retrieval.
X
X<F29> Backward Kill Line
X    Kills from point backwards to beginning of line.
X    With argument, same as Kill Line with negative arg.
X
X<F30> Goto Line
X    Goes to the line number specified by the argument.  The first
X    line in the buffer is line 1.
X
X<F31> reserved
X
X<F32> reserved
X
X<F33> reserved
X
X<F34> reserved
X
X<F35> Set/Pop Mark
X    Sets or pops the mark.
X
X<F36> Exchange Point and Mark
X    Exchanges positions of point and mark.
X
X<F37> Kill Region
X    Kills from point to mark.
X
X<F38> Copy Region
X    Sticks region into kill-ring without killing it.
X    Like killing and getting back, but doesn't mark buffer modified.
X
X<F39> Uppercase Region
X    Converts region between point and mark to upper case.
X
X<F40> Lowercase Region
X    Converts region between point and mark to lower case.
X
X<F41> Fill Region
X    Fills the region between point and mark.
X
X<F42> reserved
X
X<F43> reserved
X
X<F44> reserved
X
X<F45> Forward Paragraph
X    Moves forward to end of paragraph.
X    Paragraphs are delimited by blank lines or by
X    lines which start with "." or "-".
X
X<F46> Backward Paragraph
X    Moves backward to beginning of paragraph.
X
X<F47> Mark Paragraph
X    Puts point and mark around this paragraph.
X
X<F48> Fill Paragraph
X    Fills (or adjusts) this (or next) paragraph.
X    Point stays the same (but text may move past it due to filling).
X
X<F49> reserved
X
X<F50> Select Buffer
X    Selects or creates buffer with specified name.
X    If there is a buffer with that name, it is selected.
X    Otherwise, a buffer with that name is created and selected.
X
X<F51> Select Existing Buffer
X    Like Select Buffer but never creates a new buffer.  A partial
X    name may be given.
X
X<F52> Kill Buffer
X    Kills the specified buffer.
X
X<F53> List Buffers
X    Lists names, lengths, and files of all buffers.
X
X<F54> Buffer Not Modified
X    Pretends that this buffer hasn't been modified.
X    The "*" flag will disappear.
X
X<F55> EOL CRLF Mode
X    Toggles the interpretation of EOL (End-Of-Line) for the current
X    buffer.  An EOL may be either a CR-LF (Carriage-Return = ^M,
X    and LineFeed = ^J) together, or a LF alone.
X    In LF mode: LF alone is considered to be EOL.
X        This is the normal mode for Unix systems.
X    In CRLF mode: both CR and LF must exist to be counted as an EOL.
X        This is the normal mode for TOPS-20 systems.
X
X<F56> Goto Beginning
X    Goes to beginning of buffer.
X
X<F57> Goto End
X    Goes to end of buffer.
X
X<F58> What Page
X    Reports current position in the buffer in terms of the page
X    # and line # from the start of the buffer.
X
X<F59> reserved
X
X<F60> Find File
X    Visits (read) a file in its own buffer.
X    If the file is already in some buffer, selects that buffer.
X    Otherwise, visits the file in a buffer named after the file.
X
X<F61> Read File
X    Reads file into current buffer.  Same as Visit File.
X
X<F62> Visit File
X    Same as Read File.  Reads specified file into current buffer.
X
X<F63> Insert File
X    Inserts contents of file into existing text.
X    The pointer is left at the beginning, and the mark at the end.
X
X<F64> Save File
X    Saves buffer if it has been modified,
X    by writing it out to the file associated with it.
X
X<F65> Save All Files
X    Attempts to save all modified files.
X    With no argument, asks whether to save each one.
X    With any argument, saves all without asking.
X
X<F66> Write File
X    Writes buffer out to specified file.
X
X<F67> Write Region
X    Writes region out to specified file.
X
X<F68> Write Last Kill
X    Asks for a filename and writes out the most recently killed
X    stuff to that file.
X
X<F69> reserved
X
X<F70> Two Windows
X    Shows two windows and selects window 2.
X
X<F71> One Window
X    Shows only one window.
X
X<F72> Other Window
X    Selects other window.
X
X<F73> Grow Window
X    Makes this window use more lines.  Argument is number of extra
X    lines (can be negative).
X
X<F74> Shrink Window
X    Shrinks the current window by one line.  This is the same thing
X    as using Grow Window on the other window.
X    With argument, shrinks that many lines.
X
X<F75> Delete Window
X    Like "One Window" but ends up with different window.
X    If using 2 windows, deletes the current window, and
X    the other window becomes the single remaining window.
X
X<F76> Standout Window
X    Toggles the display standout mode for the current window.
X    With argument of 4, toggles the standout mode for the non-buffer
X    parts of the screen, such as the ELLE mode line.
X    With argument of 0, turns standout mode off for all windows.
X
X<F77> Two Mode Windows
X    Sets the two-mode-window flag, which is checked whenever there are
X    two windows in use.  Normally set to 1 at startup.
X    With argument of:
X        0 - Use only 1 mode line (at the bottom).
X        1 - Use 2 mode lines only if they are in standout mode.
X        2 - Always use 2 mode lines, one for each window.
X    With no argument, toggles the current setting between 0 and 2.
X
X<F78> New Window
X    Chooses new window putting point at center, top or bottom.
X    With no argument, clears the screen and chooses a window
X    which has point roughly at the center.
X    An argument gives the line to put point on.
X    C-U as argument redisplays only the line containing point.
X
X<F79> Next Screen
X    Moves down to display next screenful of text.
X    With argument, moves window down <arg> times (negative moves up).
X
X<F80> Previous Screen
X    Moves up to display previous screenful of text.
X    With arg, moves window back <arg> times.
X
X<F81> Other New Screen
X    If using 2 windows, runs "Next Screen" on other window.
X
X<F82> Line to Window Border
X    Picks a new window such that the current line is at the top of the
X    window.
X    With any argument, makes the current line be at the bottom instead.
X
X<F83> Scroll Window Up
X    Scrolls the text up by one line, moving stuff out of the top.
X    With argument, scrolls that many lines.
X
X<F84> Scroll Window Down
X    Scrolls the text down by one line, moving stuff out of the bottom.
X    With argument, scrolls that many lines.
X
X<F85> Move to Window Top
X    Moves cursor to top line of window.
X
X<F86> Move to Window Bottom
X    Moves cursor to bottom line of window (or end of buffer).
X
X<F87> reserved
X
X<F88> reserved
X
X<F89> reserved
X
X<F90> Set Profile
X    Asks for the name of an ELLE profile file
X    and sets the command mappings as specified by the file.
X
X<F91> Prefix Meta
X    Sets Meta-bit of following character.
X    E.G. Turns a following A into Meta-A.
X
X<F92> Prefix Extend
X    This is an extended command prefix with many subcommands.
X
X<F93> Universal Arg
X    Sets argument or multiplies it by four.
X    Followed by digits, uses them to specify the
X    argument for the command after the digits.
X    If not followed by digits, multiplies the argument by four.
X
X<F94> Negative Argument
X    Starts an argument collection, like Universal Arg, but
X    makes the resulting arg negative.
X
X<F95> Argument Digit
X    Collects an argument for the next command, starting with this
X    digit.
X
X<F96> VT100 Button Hack
X    Attempts to map VT-100 function buttons into something
X    useful.  Not really supported.
X
X<F97> Describe
X    Asks the user for a command and displays a brief description
X    of the function it invokes.
X
X<F98> reserved
X
X<F99> reserved
X
X<F100> Start Kbd Macro
X    Starts collecting a keyboard macro.  Everything typed
X    after this command, up to an "End Kbd Macro" command, will
X    be both executed and stored as the definition of the current
X    keyboard macro.
X
X<F101> End Kbd Macro
X    Stops collecting a keyboard macro.
X
X<F102> Execute Kbd Macro
X    Executes the currently defined keyboard macro.
X
X<F103> View Kbd Macro
X    Shows the currently defined keyboard macro.
X
X<F105> Un-kill
X    Re-inserts the last stuff killed.
X    Puts point after it and the mark before it.
X
X<F106> Un-kill Pop
X    Corrects after Un-kill to use an earlier kill.
X    Requires that the region contain the most recent killed stuff,
X    as it does immediately after using Un-kill.
X    It is deleted and replaced with the previous killed stuff,
X    which is rotated to the front of the ring buffer.
X
X<F107> Append Next Kill
X    Makes following kill commands append to last batch.
X    Thus, C-K C-K, cursor motion, this command, and C-K C-K,
X    generate one block of killed stuff, containing two lines.
X
X<F108> reserved
X
X<F109> reserved
X
X<F110> String Search
X    Searches forward for string.  Asks for a string; CR or ESCAPE
X    terminates the string.
X
X<F111> Reverse String Search
X    Searches backward for string.  Asks for a string; CR or ESCAPE
X    terminates the string.
X
X<F112> Incremental Search
X    Searches for character string as you type it.
X    C-Q quotes special characters.  DEL cancels last character.
X    C-S repeats the search, forward, and C-R repeats it backward.
X    C-R or C-S with search string empty changes the direction of search
X    or brings back search string from previous search.
X    ESCAPE exits the search; with search string empty
X    it switches to non-incremental String Search.
X    Other Control and Meta chars exit the search and then are executed.
X    If not all the input string can be found, the rest is not discarded.
X    You can rub it out, discard it all with C-G, exit,
X    or use C-R or C-S to search the other way.
X    Quitting a successful search aborts the search and moves point back;
X    quitting a failing search just discards whatever input wasn't found.
X
X<F113> Reverse Search
X    Does reverse Incremental Search.
X    See info for Incremental Search.
X
X<F114> Replace String
X    Replaces one string with another, globally.
X    Works by calling Query Replace and pretending you typed a !.
X
X<F115> Query Replace
X    Replaces a string interactively.
X    Asks for "Replace string:" (you type old string, eg FOO)
X    Then asks " with string:" (you type new string, eg BAR)
X    Then moves to and shows each each occurrence of FOO,
X    and you must then type a character to say what to do:
X    ? => Shows brief summary of this list.
X    Space => replace it with BAR and show next FOO.
X    DEL => don't replace, but show next FOO.
X    ^L => redisplay screen.
X    ^ => return to site of previous FOO (actually, jump to mark).
X    ! => replace all remaining FOOs without asking.
X    ESCAPE => just exit.
X    . => replace this FOO and exit.
X    , => replace this FOO and show result, waiting for next command.
X    Not yet: ^W => kill this FOO and enter recursive editing level.
X    Not yet: ^R => enter recursive editing level.
X    Any other character exits and is read again.
X
X<F116> Replace in Line
X    Like Replace String but only operates on the current line.
X    Asks for the string to replace, then the string to replace it with.
X
X<F117> Set Fill Column
X    Sets fill column to numeric arg or current column.
X    If there is an argument, that is used.
X    Otherwise, the current position of the cursor is used.
X    The Fill Column variable controls where Auto Fill mode
X    and Fill Paragraph put the right margin.
X
X<F118> Set Fill Prefix
X    EMACS: Defines Fill Prefix from current line.
X    All of the current line up to point becomes the value
X    of Fill Prefix.  Auto Fill Mode and Linefeed insert the
X    prefix on each line;  ^R Fill Region assumes that each
X    non-blank line starts with the prefix (which is ignored
X    for filling purposes).
X    To stop using a Fill Prefix, do ^R Set Fill Prefix
X    at the front of a line.
X
X<F119> Auto Fill Mode
X    Turns Auto Fill mode on and off.  When on, the word
X    "Fill" will appear in the mode line, and typing a space
X    when beyond the current Fill Column will cause the
X    current line to be automatically filled.
X
X<F120> Text Mode
X    An IMAGEN-specific function.  Resembles Auto Fill Mode.
X
X<F121> Indent According to Mode
X    Indents suitably for the major mode.
X    In Fundamental mode, just inserts a tab.
X
X<F122> Indent New Line
X    Inserts CRLF (End Of Line), then indents the second line.
X    Uses the definitions of CR and Tab to do the work.
X
X<F123> Back to Indentation
X    Moves to end of current line's indentation.
X
X<F124> Indent for Comment
X    Moves to start of existing comment or creates new one,
X    and indents it to start in Comment Column.
X    This doesn't work well yet.
X
X<F125> Indent Relative
X    Attempts to indent current line by the same amount as the
X    previous line.
X
X<F126> reserved
X
X<F127> reserved
X
X<F128> reserved
X
X<F129> Match Bracket
X    Similar to EMACS' "Show Matching Paren".
X
X<F130> Push to Inferior
X    Starts an inferior shell process.  Exitting this shell will
X    return to ELLE.
X
X<F131> Return to Superior
X    If system permits, returns directly to superior shell in a way which
X    allows later continuation of ELLE.  Otherwise, asks "Quit?" and
X    warns of modified buffers if any exist.  Responding "Y" and CR
X    will then cause ELLE to exit permanently (no continuation possible).
X
X<F132> Write File Exit
X    Calls "Save All Files" and then exits (no continuation possible).
X
X; 133-139 reserved
X
X<F140> Hit Breakpoint
X    This is a debugging function which calls the "bkpt"
X    routine in ELLE, assuming that the user has set a
X    debugging breakpoint there.  If no breakpoint has
X    been set (by ADB or otherwise) then nothing happens.
X
X<F141> Debug Mode
X    With no argument, turns self-checking on and off.  When
X    self-checking is on, the data structures will be verified
X    after each top-level command.  (This may be quite slow).
X    With an argument, invokes ELLE's debug/diagnostic mode, which
X    has the prompt "D>".  Type "?" and CR for a list of subcommands.
X
X; 142-149 reserved
X
XIMAGEN-specific functions.  These can only exist in the IMAGEN configuration
Xof ELLE.
X
X<F150> Execute Unix Command
X    An IMAGEN-specific function.
X
X<F151> Execute Make
X    An IMAGEN-specific function.
X
X<F152> Find Next Error
X    An IMAGEN-specific function.
X
X
XICONOGRAPHICS-dependent functions.  These will not be found in
Xanything other than the ICONOGRAPHICS configuration of ELLE.
X
X<F153> ICO Extend Command
X    An Iconographics-specific function.
X
X<F154> ICO Typeset Funs
X    An Iconographics-specific function.
X
X<F155> ICO Spec Input Funs
X    An Iconographics-specific function.
X
X
XSUN-specific functions.
X    These functions are used to handle text selection and stuffing
Xwhen using the mouse version of ELLE.
X
X<F156> Stuff Selection
X    Inserts the current mouse text selection into the buffer.
X
X<F157> Select Region
X    Makes the current region be the current mouse text selection.
X
X
+ END-OF-FILE help.dat
chmod 'u=rw,g=r,o=r' \h\e\l\p\.\d\a\t
set `sum \h\e\l\p\.\d\a\t`
sum=$1
case $sum in
41527)    :;;
*)    echo 'Bad sum in '\h\e\l\p\.\d\a\t >&2
esac
exit 0

Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 10:05 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 2524 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 10:05 PST
Received: by NDSUVM1 (Mailer X1.24) id 2489; Sun, 20 Dec 87 12:02:27 CST
Date: 19 Dec 87 21:32:52 GMT
From: Harry Henderson <hrh@well.uucp>
Subject: Minix on PS/2s
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

Has anyone gotten Minix working on the IBM PS/2 (model 50 or
higher)? Any plans to support it officially?
--
The opinions expressed are my own, but you're welcome to share them.
Harry Henderson (freelance technical editor/writer).

Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 14:01 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3255 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 14:00 PST
Received: by NDSUVM1 (Mailer X1.24) id 3208; Sun, 20 Dec 87 15:58:58 CST
Date: 20 Dec 87 19:39:37 GMT
From: Alan Bishop <bishop@ecsvax.uucp>
Subject: Re: Minix on PS/2s
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In article <4781@well.UUCP> hrh@well.UUCP (Harry Henderson) writes:
>Has anyone gotten Minix working on the IBM PS/2 (model 50 or
>higher)?

I am working on it (model 60) and have a three person mailing list of
others who are interested.  I will add you to it.

So far, I have MINIX up and running with floppy only.  I have rewritten the
floppy driver to use BIOS calls, so the system waits while the floppy is
being serviced.  However, later AT and all PS/2 BIOSes have hooks to deal
with this, so these will eventually be put in.  I just redid the hard disk
driver last night, but for some reason the system hangs whenever a read is
attempted.  I'll be looking into this over the next few days.

Although the fixes are in no really distributable form right now, if you or
anyone needs them now, I can send you some quick fixes to at least get you
running.  I probably will post the BIOS drivers when I get everything
running, and then again when the busy-wait hooks have been put in.

alan

Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 16:43 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 3967 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 16:42 PST
Received: by NDSUVM1 (Mailer X1.24) id 3929; Sun, 20 Dec 87 18:39:14 CST
Date: 20 Dec 87 14:34:03 GMT
From: Andy Tanenbaum <ast@cs.vu.nl>
Subject: Makefile for ELLE that I used on PC-IX
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU


For those of you who want to fetch the ELLE sources and work on them, be
warned that the MINIX make program can't handle the way Ken did things.
In particular, when you invoke make, the makefile makes another makefile
that is then executed.  The MINIX make first parses the entire makefile,
and dies because it encounters macros that will only be defined when the
other makefile is executed.  Since the semantics of makefiles are defined
nowhere, it is hard to tell if this is a bug, a feature or what.  In any
case, I just made up my own little makefile for use on PC-IX.  Here it is.

Andy Tanenbaum (ast@cs.vu.nl)

---------------------- ELLE Makefile for PC-IX ----------------------
l=/usr/ast/minix/lib
CFLAGS = -I/usr/ast/minix/include
CONFS = defprf.c eefdef.h eefidx.h deffun.e

OBJ= eebit.o  eebuff.o eecmds.o eedisp.o eeedit.o eeerr.o eef1.o eef2.o \
   eef3.o eefd.o eefed.o eefile.o eehelp.o eekmac.o eemain.o \
   eequer.o eeques.o eesite.o eesrch.o eeterm.o eevini.o sbbcpy.o \
   sberr.o sbm.o sbstr.o termcap.o eediag.o eefill.o  minix.o

elle:    $(OBJ) elle.h eesite.h
    ld -i -s -o xelle $l/crtso.o $(OBJ) $l/libc.a $l/end.o

conf:
    cat deffun.e defprf.e | ellec -Pconf  > defprf.c
    cat deffun.e defprf.e | ellec -Fconf  > eefdef.h
    cat deffun.e defprf.e | ellec -FXconf > eefidx.h
    rm -f eecmds.o

ellec: ellec.c eesite.h defprf.e
    cc -o ellec ellec.c

eecmds.o: eecmds.c ellec $(CONFS)
    make conf
    cc -c eecmds.c

Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 17:59 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 4423 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 17:57 PST
Received: by NDSUVM1 (Mailer X1.24) id 4374; Sun, 20 Dec 87 19:56:17 CST
Date: 21 Dec 87 01:41:14 GMT
From: SECAD-guest <mbeck@amsaa-seer.arpa>
Subject: MINIX on a '386?
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments:     Warning -- original Sender: tag was mmdf@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

Hello -

     Some time ago I tried booting MINIX 1.1 on a Tandy Model 4000.. and
saw the boot message pop up.  Unfortunately, the hardware was not set
to MINIX requirements and I could not continue the load. However, after
having tried 1.1 on about 10 different machines, I was reasonably
confident that it would run on a 4000.

     Has anyone tried MINIX 1.[12?] on other '386-based AT-style
hardware?

     Please respond with e-mail direct.. if enough queries/requests,
I'll summarize and post to the group.

Regards,
Mark Becker
...amsaa-seer!mbeck
mbeck@AMSAA-SEER.ARPA
(Or whatever path your machine likes..)

Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 19:28 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 5121 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 19:28 PST
Received: by NDSUVM1 (Mailer X1.24) id 5073; Sun, 20 Dec 87 21:26:25 CST
Date: 20 Dec 87 19:35:33 GMT
From: Johan Stevenson <johan@nlgvax.uucp>
Subject: Re: MINIX on a 68000
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In article <2494@druhi.ATT.COM> mjohnson@druhi.ATT.COM (JohnsonMA) writes:
>A few months back there were numerous postings about Beta testers for a
>version of MINIX that ran on 68000, Atari ST's in particular.  Would
>someone care to update us on how that work is going?  Will the final
>product be sold through Prentice-Hall?  Many of us are waiting with
>bated breath.

Minix-ST is really in the works and will be distributed by
Prentice-Hall. It will be spring 88 before it is available.

                Johan W. Stevenson,
                Philips Research Laboratories,
                Project Centre Geldrop,
                Building XR, Room 15,
                Willem Alexanderlaan 7B,
                5664 AN Geldrop, The Netherlands.
                phone: +31 40 892205
                uucp: mcvax!nlgvax!johan

Postmaster@locke.bitnet (PMDF Mail Server) (12/21/87)

The message could not be delivered to:

Addressee: MINIX
Reason:
  %MAIL-E, no such user MINIX at node LOCKE

----------------------------------------

Received: from JNET-DAEMON by locke.hs.washington.edu; Sun, 20 Dec 87 19:47 PST
Received: From NDSUVM1(MAILER) by UWALOCKE with RSCS id 5394 for
 MINIX@UWALOCKE; Sun, 20 Dec 87 19:47 PST
Received: by NDSUVM1 (Mailer X1.24) id 5335; Sun, 20 Dec 87 21:44:54 CST
Date: 18 Dec 87 17:28:28 GMT
From: Bob Best <bob@dhw68k.cts.com>
Subject: Re: P-H has MINIX in stock (finally)
Sender: Minix operating system <MINIX-L@NDSUVM1>
To: Local Redistribution <MINIX@locke>
Reply-to: INFO-MINIX@UDEL.edu
Comments: To: info-minix@UDEL.EDU

In article <1779@botter.cs.vu.nl> ast@cs.vu.nl (Andy Tanenbaum) writes:
>
>I talked to P-H yesterday.  Version 1.2 of MINIX in 256K & 640K PC, 512K AT,
>mag tape, and the IBM slipcase version with the abridged book are all
>in stock.
>
>Andy Tanenbaum (ast@cs.vu.nl)

After having waited one month for delivery, I finally received the Minix
version 1.1 (!) disks for the IBM-PC 640k system.  I immediately called
Prentice-Hall and spoke to a man by the name of Jim Fagan who told me
that the disks for version 1.2 would *not* be available for shipment until
February 1988.  He also told me that the changes in version 1.2 were
relevant only to the IBM-AT version hard disk support, and, hence, were
of no consequence to the IBM-PC disks that I ordered.

It was my understanding that the source code for IBM-AT specific device
drivers are included with the IBM-PC disk set, and I would expect the
IBM-PC disks to contain any revisions pertaining to the IBM-AT.
Since I intend to run Minix on both systems, I require working drivers
for both the PC and AT.

It would seem that there is still some confusion and/or
misinformation surrounding the distribution of the Minix software.  Does
anybody *really* know what is happening here?  I am sure that all Minix
enthusiasts agree that Dr. Tanenbaum's brilliant contribution deserves better
handling and support.

In the meantime, could someone please direct me to a convenient source
for the version 1.2 diffs.  I have abandoned hope of ever getting them
from P-H.

--
Bob Best
uucp: ...{trwrb,hplabs}!felix!dhw68k!bob    InterNet: bob@dhw68k.cts.com

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/25/88)

Your message could not be delivered to:

    EAMATEO

Your message has been enqueued and undeliverable for 3 days.
The mail system will continue to try to deliver your message
for an additional 9 days.

The beginning of your message follows:

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/28/88)

Your message could not be delivered to:

    EAMATEO

Your message has been enqueued and undeliverable for 6 days.
The mail system will continue to try to deliver your message
for an additional 6 days.

The beginning of your message follows:

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/28/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 15:23 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4075 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 15:21 N
Received: by EB0UB011 (Mailer X1.25) id 8989; Wed, 28 Sep 88 15:20:49 HOE
Date: Tue, 27 Sep 88 14:47:58 GMT
From: Rob McMahon <cudcv@WARWICK.AC.UK>
Subject: Re: GNU c and c++ under MINIX
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

In article <1720001@hpqtdla.HP.COM> rana@hpqtdla.HP.COM (Rana Raychoudhury)
 writes:
>  "The main goal of GNU CC was to make a god, fast compiler for machines in
>   the class that the GNU system aims to run on: 32-bit machines that address
>   8-bit bytes and have several general registers........"
>                        ^^^^^^^^^^^^^^^^^^^^^^^^^

Whilst GCC would like to use several registers, and much of its optimization
effort goes into allocating registers well, this doesn't mean it wouldn't work
on a machine with fewer registers.

>  "GNU CC does not contain machine dependent code, but it does contain code
>   that depends on machine parameters such as endianness (whether ths most
>   significant byte has the highest or lowest address of the bytes in a word)
>   and the availability of autoincrement addressing......"
>                           ^^^^^^^^^^^^^^^^^^^^^^^^

The code that depends on such features is all #ifdef'ed, it doesn't *require*
such features, it just uses them if they're available.  There are certainly
machines without auto-increment that run GCC (I'm on one now), and it runs on
machines of both types of endianness.

>  Now, porting gcc to *minix* may not be a problem per se, but running gcc on
>  machines without certain features (above) will be. From the text above, it
>  would appear that porting gcc to Intel 80X8X architectures MAY be
>  difficult.

The problems you cite are not the real problems, I should think the problem is
going to be:

cudcv (53) %> size /usr/local/lib/gnu/gcc/cc1
text    data    bss     dec     hex
417792  40960   21744   480496  754f0    Sun-3
581632  16384   18752   616768  96940    SPARC
655360  49152   13920   718432  af660    Gould
cudcv (54) %>

(cc1 is the compiler pass, this is on a Sun-3)

Rob
--
UUCP:   ...!mcvax!ukc!warwick!cudcv    PHONE:  +44 203 523037
JANET:  cudcv@uk.ac.warwick             ARPA:   cudcv@warwick.ac.uk
Rob McMahon, Computing Services, Warwick University, Coventry CV4 7AL, England

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 16:29 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4425 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 16:28 N
Received: by EB0UB011 (Mailer X1.25) id 9507; Wed, 28 Sep 88 16:27:44 HOE
Date: Tue, 27 Sep 88 20:56:11 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #8 - h
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
X-rw-r--r--  1 ast           356 Sep 26 22:50 const.h.cdif
X-rw-r--r--  1 ast           674 Sep 26 22:50 sgtty.h.cdif
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
116)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 116' >&2
esac
echo Extracting 'const.h.cdif'
sed 's/^X//' > 'const.h.cdif' << '+ END-OF-FILE ''const.h.cdif'
X*** /local/ast/minix/tape3b/h/const.h    Mon Jul 18 16:21:13 1988
X--- const.h    Mon Sep 26 13:04:33 1988
X***************
X*** 9,15 ****
X
X  #ifndef i8088
X  #ifndef ATARI_ST
X! #Either_i8088_or_ATARI_ST_must_be_defined
X  #endif
X  #endif
X
X--- 9,15 ----
X
X  #ifndef i8088
X  #ifndef ATARI_ST
X! #error Either i8088 or ATARI ST must be defined
X  #endif
X  #endif
X
+ END-OF-FILE const.h.cdif
chmod 'u=rw,g=r,o=r' 'const.h.cdif'
set `wc -c 'const.h.cdif'`
count=$1
case $count in
356)    :;;
*)    echo 'Bad character count in ''const.h.cdif' >&2
        echo 'Count should be 356' >&2
esac
echo Extracting 'sgtty.h.cdif'
sed 's/^X//' > 'sgtty.h.cdif' << '+ END-OF-FILE ''sgtty.h.cdif'
X*** /local/ast/minix/tape3b/h/sgtty.h    Wed Jul 13 11:56:57 1988
X--- sgtty.h    Mon Sep 26 13:04:34 1988
X***************
X*** 1,8 ****
X  /* Data structures for IOCTL. */
X
X  struct sgttyb {
X!   char sg_ispeed;        /* input speed (not used) */
X!   char sg_ospeed;        /* output speed (not used) */
X    char sg_erase;        /* erase character */
X    char sg_kill;            /* kill character */
X    int  sg_flags;        /* mode flags */
X--- 1,8 ----
X  /* Data structures for IOCTL. */
X
X  struct sgttyb {
X!   char sg_ispeed;        /* input speed */
X!   char sg_ospeed;        /* output speed */
X    char sg_erase;        /* erase character */
X    char sg_kill;            /* kill character */
X    int  sg_flags;        /* mode flags */
+ END-OF-FILE sgtty.h.cdif
chmod 'u=rw,g=r,o=r' 'sgtty.h.cdif'
set `wc -c 'sgtty.h.cdif'`
count=$1
case $count in
674)    :;;
*)    echo 'Bad character count in ''sgtty.h.cdif' >&2
        echo 'Count should be 674' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 16:37 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4471 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 16:35 N
Received: by EB0UB011 (Mailer X1.25) id 9561; Wed, 28 Sep 88 16:34:30 HOE
Date: Tue, 27 Sep 88 20:40:44 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #1 - introduction
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

Well, I am (hopefully) done with 1.3.  There were a lot of changes that
people suggested for 1.3b, so here comes 1.3c.  If nobody complains within
a week or so, I'll send it off to Prentice-Hall and that will be the end of
1.3.  The cdiffs that follow are all relative to 1.3b.  After upgrading
from 1.3b to 1.3c, please keep the full set of 1.3c files on diskette, so
we can use that as a base for diffs during the coming year.  I do not plan
to do 1.4 until I have rewritten my architecture book, something that may take
a year.  I will discuss plans for 1.4 later.

If you are completely lost with 1.1 -> 1.2 -> 1.3a -> 1.3b -> 1.3c now, I will
make an upgrade kit that P-H will sell starting around Dec.  That will simply
be all the 1.3c sources plus the 1.2 compiler binaries and elle.  The 1.3
compiler is identical to the 1.2 compiler.  For those of you who tuned in late,
there is a Pascal compiler as well, available from UniPress and Transmediair
(see the preface of the book for their addresses).  Please don't call P-H
about the upgrade kit until around Dec.  They will be all confused.

The kernel has been modified quite a bit.  I split tty.c into 5 files: tty.h,
ttymaps.h, tty.c, console.c, and rs232.c.  Mostly because I thought the latter
was such a cute name.  I saw the new tty.c from Down Under, but I prefer to
stick with mine.  At least I understand that one (sort of).  Changes and
improvements to it are welcome, but I am not going to throw it away.
One improvement I'd love to make is throw out all that garbage about EGA
hardware.  I am somewhat unclear why it got added in the first place.  If the
only reason is to prevent losing RS232 characters during software scrolling,
I hope somebody can attack that problem directly.  I would very much like to
have 2 scrolling algorithms included, toggled by F3:  6845 hardware, and
software.  This will make the code cleaner.  Any suggestions for making the
whole tty business smaller are worth making.

I hope the extended keyboard is supported properly.  Comments are welcome.

V1.3c should run on the PS/2 model 30.  When booting, type u or d instead of
=.  Feedback on this is very much desired.  I have no idea about other models.
Feedback is sort of desired, but IBM being what it is, I fear the worst.

Index to 1.3c postings
----------------------
P0  - this file
P1  - include
P2  - lib
P3  - commands 1 of 3
P4  - commands 2 of 3
P5  - commands 3 of 3
P6  - tools
P7  - doc
P8  - h
P9  - mm
P10 - fs
P11 - kernel 1 of 3
P12 - kernel 2 of 3
P13 - kernel 3 of 3

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 16:59 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4533 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 16:57 N
Received: by EB0UB011 (Mailer X1.25) id 9601; Wed, 28 Sep 88 16:56:11 HOE
Date: Tue, 27 Sep 88 20:42:01 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #1 include files (sorry- intro is 0)
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 9
X-rw-r--r--  1 ast           351 Sep 26 22:22 fcntl.h.new
X-rw-r--r--  1 ast          2132 Sep 26 22:22 limits.h.new
X-rw-r--r--  1 ast            81 Sep 26 22:22 memory.h.new
X-rw-r--r--  1 ast           263 Sep 26 22:22 string.h.new
X-rw-r--r--  1 ast           352 Sep 26 22:22 unistd.h.new
X-rw-r--r--  1 ast            74 Sep 26 22:22 utime.h.new
X-rw-r--r--  1 ast           217 Sep 26 22:22 utmp.h.new
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
410)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 410' >&2
esac
echo Extracting 'fcntl.h.new'
sed 's/^X//' > 'fcntl.h.new' << '+ END-OF-FILE ''fcntl.h.new'
X/* For fcntl(3)  */
X
X#define     F_DUPFD    0
X#define     F_GETFD    1        /*  reserved for future use  */
X#define     F_SETFD    2        /*  reserved for future use  */
X#define     F_GETFL    3        /*  reserved for future use  */
X#define     F_SETFL    4        /*  reserved for future use  */
X
X/* For open(2)  */
X
X#define     O_RDONLY    0
X#define     O_WRONLY    1
X#define     O_RDWR    2
+ END-OF-FILE fcntl.h.new
chmod 'u=rw,g=r,o=r' 'fcntl.h.new'
set `wc -c 'fcntl.h.new'`
count=$1
case $count in
351)    :;;
*)    echo 'Bad character count in ''fcntl.h.new' >&2
        echo 'Count should be 351' >&2
esac
echo Extracting 'limits.h.new'
sed 's/^X//' > 'limits.h.new' << '+ END-OF-FILE ''limits.h.new'
X/*  limits.h  */
X
X#define  CHAR_BIT          8    /* number of bits in char    */
X#define  WORD_BIT         16    /* number of bits in int    */
X#define  CHAR_MAX        127    /* max value of char        */
X#define  CHAR_MIN           -128    /* min value of char        */
X#define  SCHAR_MAX        127    /* max value of signed char    */
X#define  SCHAR_MIN           -128    /* min value of signed char    */
X#define     UCHAR_MAX        255    /* max value of unsigned char    */
X#define  SHRT_MAX          32767    /* max value of short        */
X#define  SHRT_MIN         -32768    /* min value of short        */
X#define  USHRT_MAX          65535    /* max value of unsigned short    */
X#define  INT_MAX          32767    /* max value of int        */
X#define  INT_MIN         -32768    /* min value of int        */
X#define  UINT_MAX          65535    /* max value of unsigned int    */
X#define  LONG_MAX     2147483647    /* max value of long        */
X#define  LONG_MIN    -2147483648    /* min value of long        */
X#define  ULONG_MAX     4294967295    /* max value of unsigned long    */
X
X#define  NAME_MAX    14        /* characters in a file name    */
X#define  PATH_MAX    127        /* number chars in path name    */
X                    /* SHOULD BE >= 255        */
X#define  FCHR_MAX    67108864    /* max file size        */
X#define  LINK_MAX    127        /* max links to a file        */
X#define  LOCK_MAX    0        /* max number of file locks    */
X                    /* SHOULD BE >= 32        */
X#define  OPEN_MAX    20        /* max number open files    */
X#define  SYS_OPEN    64        /* max open files per system    */
X#define  STD_BLK    1024        /* bytes per block        */
X#define  PIPE_MAX    7168        /* max size of write to pipe    */
X#define  PIPE_BUF    PIPE_MAX    /* size of atomic write to pipe    */
X
X#define  PID_MAX    30000        /* max process id        */
X#define  PROC_MAX    16        /* max number of processes    */
X#define  CHILD_MAX    (PROC_MAX-1)    /* number of process children    */
X#define  NGROUPS_MAX    0        /* no multiple group ids    */
X#define  UID_MAX    255        /* max user or group id        */
X                    /* SHOULD BE >= 32000        */
X#define  ARG_MAX    2048        /* execve() arg & environ space    */
X                    /* SHOULD BE >= 4096        */
X
X#define  CLK_TCK    60        /* clock ticks per second    */
X#define  MAX_CHAR    256        /* characters for terminal i/p    */
X#define  PASS_MAX    8        /* max number chars in password    */
X#define  SYS_NMLN    9        /* length of uname() strings    */
X                    /*  including '\0'        */
+ END-OF-FILE limits.h.new
chmod 'u=rw,g=r,o=r' 'limits.h.new'
set `wc -c 'limits.h.new'`
count=$1
case $count in
2132)    :;;
*)    echo 'Bad character count in ''limits.h.new' >&2
        echo 'Count should be 2132' >&2
esac
echo Extracting 'memory.h.new'
sed 's/^X//' > 'memory.h.new' << '+ END-OF-FILE ''memory.h.new'
Xchar *memcpy();
Xchar *memccpy();
Xchar *memchr();
Xchar *memset();
Xint   memcmp();
+ END-OF-FILE memory.h.new
chmod 'u=rw,g=r,o=r' 'memory.h.new'
set `wc -c 'memory.h.new'`
count=$1
case $count in
81)    :;;
*)    echo 'Bad character count in ''memory.h.new' >&2
        echo 'Count should be 81' >&2
esac
echo Extracting 'string.h.new'
sed 's/^X//' > 'string.h.new' << '+ END-OF-FILE ''string.h.new'
X/*  string.h  (a.k.a. strings.h)  */
X
Xint strlen();
Xint strcmp(), strncmp();
Xint strspn(), strcspn();
X
Xchar *strcpy(), *strncpy();
Xchar *strcat(), *strncat();
Xchar *index(),  *rindex();
Xchar *strchr(), *strrchr();
Xchar *strpbrk();
Xchar *strtok();
Xchar *strstr();
+ END-OF-FILE string.h.new
chmod 'u=rw,g=r,o=r' 'string.h.new'
set `wc -c 'string.h.new'`
count=$1
case $count in
263)    :;;
*)    echo 'Bad character count in ''string.h.new' >&2
        echo 'Count should be 263' >&2
esac
echo Extracting 'unistd.h.new'
sed 's/^X//' > 'unistd.h.new' << '+ END-OF-FILE ''unistd.h.new'
X/* For access(2)  */
X
X#define     R_OK         4
X#define     W_OK         2
X#define     X_OK         1
X#define     F_OK         0
X
X/* For lockf()  */
X
X#define     F_ULOCK    0
X#define     F_LOCK    1
X#define     F_TLOCK    2
X#define     F_TEST    3
X
X/* For lseek(2)  */
X
X#define     SEEK_SET    0
X#define     SEEK_CUR    1
X#define     SEEK_END    2
X
X#define     IN_PATH    "/etc/include"
+ END-OF-FILE unistd.h.new
chmod 'u=rw,g=r,o=r' 'unistd.h.new'
set `wc -c 'unistd.h.new'`
count=$1
case $count in
352)    :;;
*)    echo 'Bad character count in ''unistd.h.new' >&2
        echo 'Count should be 352' >&2
esac
echo Extracting 'utime.h.new'
sed 's/^X//' > 'utime.h.new' << '+ END-OF-FILE ''utime.h.new'
X/* For utime(2)  */
X
Xstruct utimbuf {
X    time_t    actime;
X    time_t    modtime;
X};
+ END-OF-FILE utime.h.new
chmod 'u=rw,g=r,o=r' 'utime.h.new'
set `wc -c 'utime.h.new'`
count=$1
case $count in
74)    :;;
*)    echo 'Bad character count in ''utime.h.new' >&2
        echo 'Count should be 74' >&2
esac
echo Extracting 'utmp.h.new'
sed 's/^X//' > 'utmp.h.new' << '+ END-OF-FILE ''utmp.h.new'
X/*  utmp.h - Used by login(1), init, and who(1)  */
X
X#define WTMP  "/usr/adm/wtmp"
X
Xstruct  utmp
X{
X  char ut_line[8];        /* terminal name */
X  char ut_name[8];        /* user name */
X  long ut_time;            /* login/out time */
X};
+ END-OF-FILE utmp.h.new
chmod 'u=rw,g=r,o=r' 'utmp.h.new'
set `wc -c 'utmp.h.new'`
count=$1
case $count in
217)    :;;
*)    echo 'Bad character count in ''utmp.h.new' >&2
        echo 'Count should be 217' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 17:03 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4538 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 17:00 N
Received: by EB0UB011 (Mailer X1.25) id 9607; Wed, 28 Sep 88 16:59:02 HOE
Date: Tue, 27 Sep 88 20:56:51 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #9 - mm
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 8
X-rw-r--r--  1 ast          1833 Sep 26 22:51 at_makefile
X-rw-r--r--  1 ast          1715 Sep 26 22:51 exec.c.cdif
X-rw-r--r--  1 ast           375 Sep 26 22:51 forkexit.c.cdif
X-rw-r--r--  1 ast          1890 Sep 26 22:51 pc_makefile
X-rw-r--r--  1 ast           323 Sep 26 22:51 signal.c.cdif
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
299)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 299' >&2
esac
echo Extracting 'at_makefile'
sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile'
X# On a PC, cpp and cem are in /lib and will be removed to make space while
X# linking the kernel.  On an AT, they are in /usr/lib are are not removed.
X# This is because they have to be in /lib on a PC; the diskette is too small
X# for them to be in /usr/lib.
X#
X
Xh=../h
Xl=/usr/lib
XCFLAGS = -Di8088 -F -T.
X
Xobj =    main.s forkexit.s break.s exec.s signal.s getset.s  \
X    alloc.s utility.s table.s putc.s
X
Xmm:    makefile    $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "Start linking MM."
X    @asld -o mm -T. $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "MM done. "
X
Xclean:
X    rm -f $(obj)
X
Xalloc.s:    const.h $h/const.h $h/type.h
X
Xbreak.s:    const.h $h/const.h $h/type.h
Xbreak.s:    $h/error.h
Xbreak.s:    $h/signal.h
Xbreak.s:    glo.h
Xbreak.s:    mproc.h
Xbreak.s:    param.h
X
Xexec.s:        const.h $h/const.h $h/type.h
Xexec.s:        $h/callnr.h
Xexec.s:        $h/error.h
Xexec.s:        $h/stat.h
Xexec.s:        glo.h
Xexec.s:        mproc.h
Xexec.s:        param.h
X
Xforkexit.s:    const.h $h/const.h $h/type.h
Xforkexit.s:    $h/callnr.h
Xforkexit.s:    $h/error.h
Xforkexit.s:    glo.h
Xforkexit.s:    mproc.h
Xforkexit.s:    param.h
X
Xgetset.s:    const.h $h/const.h $h/type.h
Xgetset.s:    $h/callnr.h
Xgetset.s:    $h/error.h
Xgetset.s:    glo.h
Xgetset.s:    mproc.h
Xgetset.s:    param.h
X
Xmain.s:        const.h $h/const.h $h/type.h
Xmain.s:        $h/callnr.h
Xmain.s:        $h/com.h
Xmain.s:        $h/error.h
Xmain.s:        glo.h
Xmain.s:        mproc.h
Xmain.s:        param.h
X
Xputc.s:        $h/const.h $h/type.h
Xputc.s:        $h/com.h
X
Xsignal.s:    const.h $h/const.h $h/type.h
Xsignal.s:    $h/callnr.h
Xsignal.s:    $h/com.h
Xsignal.s:    $h/error.h
Xsignal.s:    $h/signal.h
Xsignal.s:    $h/stat.h
Xsignal.s:    glo.h
Xsignal.s:    mproc.h
Xsignal.s:    param.h
X
Xtable.s:    const.h $h/const.h $h/type.h
Xtable.s:    $h/callnr.h
Xtable.s:    glo.h
Xtable.s:    mproc.h
Xtable.s:    param.h
X
Xutility.s:    const.h $h/const.h $h/type.h
Xutility.s:    $h/callnr.h
Xutility.s:    $h/com.h
Xutility.s:    $h/error.h
Xutility.s:    $h/stat.h
Xutility.s:    glo.h
Xutility.s:    mproc.h
+ END-OF-FILE at_makefile
chmod 'u=rw,g=r,o=r' 'at_makefile'
set `wc -c 'at_makefile'`
count=$1
case $count in
1833)    :;;
*)    echo 'Bad character count in ''at_makefile' >&2
        echo 'Count should be 1833' >&2
esac
echo Extracting 'exec.c.cdif'
sed 's/^X//' > 'exec.c.cdif' << '+ END-OF-FILE ''exec.c.cdif'
X*** /local/ast/minix/tape3b/mm/exec.c    Wed Jul 13 11:50:13 1988
X--- exec.c    Mon Sep 26 13:03:53 1988
X***************
X*** 76,82 ****
X
X    /* Read the file header and extract the segment sizes. */
X    sc = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT;
X!   m = read_header(fd, &ft, &text_bytes, &data_bytes, &bss_bytes, &tot_bytes,
 &sym_bytes, sc);
X    if (m < 0) {
X      close(fd);        /* something wrong with header */
X      return(ENOEXEC);
X--- 76,83 ----
X
X    /* Read the file header and extract the segment sizes. */
X    sc = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT;
X!   m = read_header(fd, &ft, &text_bytes, &data_bytes, &bss_bytes,
X!                         &tot_bytes, &sym_bytes, sc);
X    if (m < 0) {
X      close(fd);        /* something wrong with header */
X      return(ENOEXEC);
X***************
X*** 142,148 ****
X
 /*===========================================================================*
X   *                read_header                     *
X
 *===========================================================================*/
X! PRIVATE int read_header(fd, ft, text_bytes, data_bytes, bss_bytes, tot_bytes,
 sym_bytes, sc)
X  int fd;                /* file descriptor for reading exec file */
X  int *ft;            /* place to return ft number */
X  vir_bytes *text_bytes;        /* place to return text size */
X--- 143,150 ----
X
 /*===========================================================================*
X   *                read_header                     *
X
 *===========================================================================*/
X! PRIVATE int read_header(fd, ft, text_bytes, data_bytes, bss_bytes,
X!                             tot_bytes, sym_bytes, sc)
X  int fd;                /* file descriptor for reading exec file */
X  int *ft;            /* place to return ft number */
X  vir_bytes *text_bytes;        /* place to return text size */
+ END-OF-FILE exec.c.cdif
chmod 'u=rw,g=r,o=r' 'exec.c.cdif'
set `wc -c 'exec.c.cdif'`
count=$1
case $count in
1715)    :;;
*)    echo 'Bad character count in ''exec.c.cdif' >&2
        echo 'Count should be 1715' >&2
esac
echo Extracting 'forkexit.c.cdif'
sed 's/^X//' > 'forkexit.c.cdif' << '+ END-OF-FILE ''forkexit.c.cdif'
X*** /local/ast/minix/tape3b/mm/forkexit.c    Wed Jul 13 11:50:14 1988
X--- forkexit.c    Mon Sep 26 13:03:54 1988
X***************
X*** 254,262 ****
X    register struct mproc *parent, *rp;
X    int init_waiting, child_nr;
X    unsigned int r;
X- #ifndef ATARI_ST
X-   phys_clicks s;
X- #endif
X
X    child_nr = (int)(child - mproc);
X    parent = &mproc[child->mp_parent];
X--- 254,259 ----
+ END-OF-FILE forkexit.c.cdif
chmod 'u=rw,g=r,o=r' 'forkexit.c.cdif'
set `wc -c 'forkexit.c.cdif'`
count=$1
case $count in
375)    :;;
*)    echo 'Bad character count in ''forkexit.c.cdif' >&2
        echo 'Count should be 375' >&2
esac
echo Extracting 'pc_makefile'
sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile'
X# On a PC, cpp and cem are in /lib and will be removed to make space while
X# linking the kernel.  On an AT, they are in /usr/lib are are not removed.
X# This is because they have to be in /lib on a PC; the diskette is too small
X# for them to be in /usr/lib.
X#
X
Xh=../h
Xl=/usr/lib
XCFLAGS = -Di8088 -F -T.
X
Xobj =    main.s forkexit.s break.s exec.s signal.s getset.s  \
X    alloc.s utility.s table.s putc.s
X
Xmm:    makefile    $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "Start linking MM."
X    @echo "If disk fills up, remove some files"
X    @asld -o mm -T. $l/head.s $(obj) $l/libc.a $l/end.s
X    @mv /mm mm
X    @echo "MM done. "
X
Xclean:
X    rm -f $(obj)
X
Xalloc.s:    const.h $h/const.h $h/type.h
X
Xbreak.s:    const.h $h/const.h $h/type.h
Xbreak.s:    $h/error.h
Xbreak.s:    $h/signal.h
Xbreak.s:    glo.h
Xbreak.s:    mproc.h
Xbreak.s:    param.h
X
Xexec.s:        const.h $h/const.h $h/type.h
Xexec.s:        $h/callnr.h
Xexec.s:        $h/error.h
Xexec.s:        $h/stat.h
Xexec.s:        glo.h
Xexec.s:        mproc.h
Xexec.s:        param.h
X
Xforkexit.s:    const.h $h/const.h $h/type.h
Xforkexit.s:    $h/callnr.h
Xforkexit.s:    $h/error.h
Xforkexit.s:    glo.h
Xforkexit.s:    mproc.h
Xforkexit.s:    param.h
X
Xgetset.s:    const.h $h/const.h $h/type.h
Xgetset.s:    $h/callnr.h
Xgetset.s:    $h/error.h
Xgetset.s:    glo.h
Xgetset.s:    mproc.h
Xgetset.s:    param.h
X
Xmain.s:        const.h $h/const.h $h/type.h
Xmain.s:        $h/callnr.h
Xmain.s:        $h/com.h
Xmain.s:        $h/error.h
Xmain.s:        glo.h
Xmain.s:        mproc.h
Xmain.s:        param.h
X
Xputc.s:        $h/const.h $h/type.h
Xputc.s:        $h/com.h
X
Xsignal.s:    const.h $h/const.h $h/type.h
Xsignal.s:    $h/callnr.h
Xsignal.s:    $h/com.h
Xsignal.s:    $h/error.h
Xsignal.s:    $h/signal.h
Xsignal.s:    $h/stat.h
Xsignal.s:    glo.h
Xsignal.s:    mproc.h
Xsignal.s:    param.h
X
Xtable.s:    const.h $h/const.h $h/type.h
Xtable.s:    $h/callnr.h
Xtable.s:    glo.h
Xtable.s:    mproc.h
Xtable.s:    param.h
X
Xutility.s:    const.h $h/const.h $h/type.h
Xutility.s:    $h/callnr.h
Xutility.s:    $h/com.h
Xutility.s:    $h/error.h
Xutility.s:    $h/stat.h
Xutility.s:    glo.h
Xutility.s:    mproc.h
+ END-OF-FILE pc_makefile
chmod 'u=rw,g=r,o=r' 'pc_makefile'
set `wc -c 'pc_makefile'`
count=$1
case $count in
1890)    :;;
*)    echo 'Bad character count in ''pc_makefile' >&2
        echo 'Count should be 1890' >&2
esac
echo Extracting 'signal.c.cdif'
sed 's/^X//' > 'signal.c.cdif' << '+ END-OF-FILE ''signal.c.cdif'
X*** /local/ast/minix/tape3b/mm/signal.c    Wed Jul 13 11:50:15 1988
X--- signal.c    Mon Sep 26 13:03:56 1988
X***************
X*** 349,355 ****
X    char buf[DUMP_SIZE];
X    int i, r, s, er1, er2, slot;
X    vir_bytes v_buf;
X-   long len;
X    long a, c, ct, dest;
X    struct mproc *xmp;
X    extern char core_name[];
X--- 349,354 ----
+ END-OF-FILE signal.c.cdif
chmod 'u=rw,g=r,o=r' 'signal.c.cdif'
set `wc -c 'signal.c.cdif'`
count=$1
case $count in
323)    :;;
*)    echo 'Bad character count in ''signal.c.cdif' >&2
        echo 'Count should be 323' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 18:18 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4758 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 18:14 N
Received: by EB0UB011 (Mailer X1.25) id 9853; Wed, 28 Sep 88 18:12:09 HOE
Date: Tue, 27 Sep 88 20:57:34 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #10 - fs
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 17
X-rw-r--r--  1 ast          4197 Sep 27 15:12 at_makefile
X-rw-r--r--  1 ast          2585 Sep 27 15:12 inode.c.cdif
X-rw-r--r--  1 ast          1449 Sep 27 15:12 link.c.cdif
X-rw-r--r--  1 ast          4266 Sep 27 15:12 pc_makefile
X-rw-r--r--  1 ast          1736 Sep 27 15:12 read.c.cdif
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
295)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 295' >&2
esac
echo Extracting 'at_makefile'
sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile'
X# On a PC, cpp and cem are in /lib and will be removed to make space while
X# linking the kernel.  On an AT, they are in /usr/lib are are not removed.
X# This is because they have to be in /lib on a PC; the diskette is too small
X# for them to be in /usr/lib.
X
XCFLAGS= -Di8088 -F -T.
Xh=../h
Xl=/usr/lib
X
Xobj =    main.s open.s read.s write.s pipe.s device.s \
X    path.s mount.s link.s super.s inode.s cache.s filedes.s \
X    stadir.s protect.s time.s misc.s utility.s table.s putc.s
X
Xfs:    makefile   $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "Start linking FS.  "
X    @asld  -o fs -T. $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "FS done.  "
X
Xclean:
X    rm -f $(obj)
X
Xcache.s:    const.h type.h $h/const.h $h/type.h
Xcache.s:    $h/error.h
Xcache.s:    buf.h
Xcache.s:    file.h
Xcache.s:    fproc.h
Xcache.s:    glo.h
Xcache.s:    inode.h
Xcache.s:    super.h
X
Xdevice.s:    const.h type.h $h/const.h $h/type.h
Xdevice.s:    $h/com.h
Xdevice.s:    $h/error.h
Xdevice.s:    dev.h
Xdevice.s:    file.h
Xdevice.s:    fproc.h
Xdevice.s:    glo.h
Xdevice.s:    inode.h
Xdevice.s:    param.h
X
Xfiledes.s:    const.h type.h $h/const.h $h/type.h
Xfiledes.s:    $h/error.h
Xfiledes.s:    file.h
Xfiledes.s:    fproc.h
Xfiledes.s:    glo.h
Xfiledes.s:    inode.h
X
Xinode.s:    const.h type.h $h/const.h $h/type.h
Xinode.s:    $h/error.h
Xinode.s:    buf.h
Xinode.s:    file.h
Xinode.s:    fproc.h
Xinode.s:    glo.h
Xinode.s:    inode.h
Xinode.s:    super.h
X
Xlink.s:        const.h type.h $h/const.h $h/type.h
Xlink.s:        $h/error.h
Xlink.s:        buf.h
Xlink.s:        file.h
Xlink.s:        fproc.h
Xlink.s:        glo.h
Xlink.s:        inode.h
Xlink.s:        param.h
X
Xmain.s:        const.h type.h $h/const.h $h/type.h
Xmain.s:        $h/callnr.h
Xmain.s:        $h/com.h
Xmain.s:        $h/error.h
Xmain.s:        buf.h
Xmain.s:        file.h
Xmain.s:        fproc.h
Xmain.s:        glo.h
Xmain.s:        inode.h
Xmain.s:        param.h
Xmain.s:        super.h
X
Xmisc.s:        const.h type.h $h/const.h $h/type.h
Xmisc.s:        $h/callnr.h
Xmisc.s:        $h/com.h
Xmisc.s:        $h/error.h
Xmisc.s:        buf.h
Xmisc.s:        file.h
Xmisc.s:        fproc.h
Xmisc.s:        glo.h
Xmisc.s:        inode.h
Xmisc.s:        param.h
Xmisc.s:        super.h
X
Xmount.s:    const.h type.h $h/const.h $h/type.h
Xmount.s:    $h/error.h
Xmount.s:    buf.h
Xmount.s:    file.h
Xmount.s:    fproc.h
Xmount.s:    glo.h
Xmount.s:    inode.h
Xmount.s:    param.h
Xmount.s:    super.h
X
Xopen.s:        const.h type.h $h/const.h $h/type.h
Xopen.s:        $h/callnr.h
Xopen.s:        $h/error.h
Xopen.s:        buf.h
Xopen.s:        file.h
Xopen.s:        fproc.h
Xopen.s:        glo.h
Xopen.s:        inode.h
Xopen.s:        param.h
X
Xpath.s:        const.h type.h $h/const.h $h/type.h
Xpath.s:        $h/error.h
Xpath.s:        buf.h
Xpath.s:        file.h
Xpath.s:        fproc.h
Xpath.s:        glo.h
Xpath.s:        inode.h
Xpath.s:        super.h
X
Xpipe.s:        const.h type.h $h/const.h $h/type.h
Xpipe.s:        $h/callnr.h
Xpipe.s:        $h/com.h
Xpipe.s:        $h/error.h
Xpipe.s:        $h/signal.h
Xpipe.s:        file.h
Xpipe.s:        fproc.h
Xpipe.s:        glo.h
Xpipe.s:        inode.h
Xpipe.s:        param.h
X
Xprotect.s:    const.h type.h $h/const.h $h/type.h
Xprotect.s:    $h/error.h
Xprotect.s:    buf.h
Xprotect.s:    file.h
Xprotect.s:    fproc.h
Xprotect.s:    glo.h
Xprotect.s:    inode.h
Xprotect.s:    param.h
Xprotect.s:    super.h
X
Xputc.s:        const.h type.h $h/const.h $h/type.h
Xputc.s:        $h/com.h
X
Xread.s:        const.h type.h $h/const.h $h/type.h
Xread.s:        $h/com.h
Xread.s:        $h/error.h
Xread.s:        buf.h
Xread.s:        file.h
Xread.s:        fproc.h
Xread.s:        glo.h
Xread.s:        inode.h
Xread.s:        param.h
Xread.s:        super.h
X
Xstadir.s:    const.h type.h $h/const.h $h/type.h
Xstadir.s:    $h/error.h
Xstadir.s:    $h/stat.h
Xstadir.s:    file.h
Xstadir.s:    fproc.h
Xstadir.s:    glo.h
Xstadir.s:    inode.h
Xstadir.s:    param.h
X
Xsuper.s:    const.h type.h $h/const.h $h/type.h
Xsuper.s:    $h/error.h
Xsuper.s:    buf.h
Xsuper.s:    inode.h
Xsuper.s:    super.h
X
Xtable.s:    const.h type.h $h/const.h $h/type.h
Xtable.s:    $h/com.h
Xtable.s:    $h/callnr.h
Xtable.s:    $h/error.h
Xtable.s:    $h/stat.h
Xtable.s:    buf.h
Xtable.s:    dev.h
Xtable.s:    file.h
Xtable.s:    fproc.h
Xtable.s:    glo.h
Xtable.s:    inode.h
Xtable.s:    super.h
X
Xtime.s:        const.h type.h $h/const.h $h/type.h
Xtime.s:        $h/callnr.h
Xtime.s:        $h/com.h
Xtime.s:        $h/error.h
Xtime.s:        file.h
Xtime.s:        fproc.h
Xtime.s:        glo.h
Xtime.s:        inode.h
Xtime.s:        param.h
X
Xutility.s:    const.h type.h $h/const.h $h/type.h
Xutility.s:    $h/com.h
Xutility.s:    $h/error.h
Xutility.s:    buf.h
Xutility.s:    file.h
Xutility.s:    fproc.h
Xutility.s:    glo.h
Xutility.s:    inode.h
Xutility.s:    param.h
Xutility.s:    super.h
X
Xwrite.s:    const.h type.h $h/const.h $h/type.h
Xwrite.s:    $h/error.h
Xwrite.s:    buf.h
Xwrite.s:    file.h
Xwrite.s:    fproc.h
Xwrite.s:    glo.h
Xwrite.s:    inode.h
Xwrite.s:    super.h
+ END-OF-FILE at_makefile
chmod 'u=rw,g=r,o=r' 'at_makefile'
set `wc -c 'at_makefile'`
count=$1
case $count in
4197)    :;;
*)    echo 'Bad character count in ''at_makefile' >&2
        echo 'Count should be 4197' >&2
esac
echo Extracting 'inode.c.cdif'
sed 's/^X//' > 'inode.c.cdif' << '+ END-OF-FILE ''inode.c.cdif'
X*** /local/ast/minix/tape3b/fs/inode.c    Tue Jul 12 23:42:51 1988
X--- inode.c    Mon Sep 26 13:04:05 1988
X***************
X*** 111,117 ****
X
X    /* Acquire an inode from the bit map. */
X    sp = get_super(dev);        /* get pointer to super_block */
X!   b=alloc_bit(sp->s_imap, (bit_nr)sp->s_ninodes+1, sp->s_imap_blocks,
(bit_nr)0);
X    if (b == NO_BIT) {
X      err_code = ENFILE;
X      major = (int) (sp->s_dev >> MAJOR) & BYTE;
X--- 111,117 ----
X
X    /* Acquire an inode from the bit map. */
X    sp = get_super(dev);        /* get pointer to super_block */
X!   b=alloc_bit(sp->s_imap,(bit_nr)sp->s_ninodes+1, sp->s_imap_blocks,
(bit_nr)0);
X    if (b == NO_BIT) {
X      err_code = ENFILE;
X      major = (int) (sp->s_dev >> MAJOR) & BYTE;
X***************
X*** 129,142 ****
X      /* No inode table slots available.  Free the inode just allocated. */
X      free_bit(sp->s_imap, b);
X    } else {
X!     /* An inode slot is available.  Put the inode just allocated into it. */
X      rip->i_mode = bits;
X      rip->i_nlinks = (links) 0;
X      rip->i_uid = fp->fp_effuid;
X      rip->i_gid = fp->fp_effgid;
X      rip->i_dev = dev;    /* was provisionally set to NO_DEV */
X
X!     /* The fields not cleared already are cleared in wipe_inode().  They have
X       * been put there because truncate() needs to clear the same fields if
X       * the file happens to be open while being truncated.  It saves space
X       * not to repeat the code twice.
X--- 129,142 ----
X      /* No inode table slots available.  Free the inode just allocated. */
X      free_bit(sp->s_imap, b);
X    } else {
X!     /* An inode slot is available. Put the inode just allocated into it. */
X      rip->i_mode = bits;
X      rip->i_nlinks = (links) 0;
X      rip->i_uid = fp->fp_effuid;
X      rip->i_gid = fp->fp_effgid;
X      rip->i_dev = dev;    /* was provisionally set to NO_DEV */
X
X!     /* Fields not cleared already are cleared in wipe_inode().  They have
X       * been put there because truncate() needs to clear the same fields if
X       * the file happens to be open while being truncated.  It saves space
X       * not to repeat the code twice.
X***************
X*** 212,220 ****
X
X    /* Do the read or write. */
X    if (rw_flag == READING) {
X!     copy((char *)rip, (char *) dip, INODE_SIZE); /* copy from blk to inode */
X    } else {
X!     copy((char *)dip, (char *) rip, INODE_SIZE); /* copy from inode to blk */
X      bp->b_dirt = DIRTY;
X    }
X
X--- 212,220 ----
X
X    /* Do the read or write. */
X    if (rw_flag == READING) {
X!     copy((char *)rip, (char *)dip, INODE_SIZE); /* copy from blk to inode*/
X    } else {
X!     copy((char *)dip, (char *)rip, INODE_SIZE); /* copy from inode to blk*/
X      bp->b_dirt = DIRTY;
X    }
X
+ END-OF-FILE inode.c.cdif
chmod 'u=rw,g=r,o=r' 'inode.c.cdif'
set `wc -c 'inode.c.cdif'`
count=$1
case $count in
2585)    :;;
*)    echo 'Bad character count in ''inode.c.cdif' >&2
        echo 'Count should be 2585' >&2
esac
echo Extracting 'link.c.cdif'
sed 's/^X//' > 'link.c.cdif' << '+ END-OF-FILE ''link.c.cdif'
X*** /local/ast/minix/tape3b/fs/link.c    Tue Jul 12 23:42:51 1988
X--- link.c    Mon Sep 26 13:04:06 1988
X***************
X*** 11,16 ****
X--- 11,17 ----
X  #include "../h/const.h"
X  #include "../h/type.h"
X  #include "../h/error.h"
X+ #include "../h/stat.h"
X  #include "const.h"
X  #include "type.h"
X  #include "buf.h"
X***************
X*** 144,159 ****
X  {
X  /* Remove all the zones from the inode 'rip' and mark it dirty. */
X
X-   register file_pos position;
X-   register zone_type zone_size;
X    register block_nr b;
X    register zone_nr z, *iz;
X!   register int scale;
X!   register struct buf *bp;
X!   register dev_nr dev;
X    extern struct buf *get_block();
X    extern block_nr read_map();
X
X    dev = rip->i_dev;        /* device on which inode resides */
X    scale = scale_factor(rip);
X    zone_size = (zone_type) BLOCK_SIZE << scale;
X--- 145,163 ----
X  {
X  /* Remove all the zones from the inode 'rip' and mark it dirty. */
X
X    register block_nr b;
X    register zone_nr z, *iz;
X!   file_pos position;
X!   zone_type zone_size;
X!   int scale, file_type;
X!   struct buf *bp;
X!   dev_nr dev;
X!   unshort modewd;
X    extern struct buf *get_block();
X    extern block_nr read_map();
X
X+   file_type = rip->i_mode & S_IFMT;    /* check to see if file is special */
X+   if (file_type == S_IFCHR || file_type == S_IFBLK) return;
X    dev = rip->i_dev;        /* device on which inode resides */
X    scale = scale_factor(rip);
X    zone_size = (zone_type) BLOCK_SIZE << scale;
+ END-OF-FILE link.c.cdif
chmod 'u=rw,g=r,o=r' 'link.c.cdif'
set `wc -c 'link.c.cdif'`
count=$1
case $count in
1449)    :;;
*)    echo 'Bad character count in ''link.c.cdif' >&2
        echo 'Count should be 1449' >&2
esac
echo Extracting 'pc_makefile'
sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile'
X# On a PC, cpp and cem are in /lib and will be removed to make space while
X# linking the kernel.  On an AT, they are in /usr/lib are are not removed.
X# This is because they have to be in /lib on a PC; the diskette is too small
X# for them to be in /usr/lib.
X
XCFLAGS= -Di8088 -F -T.
Xh=../h
Xl=/usr/lib
X
Xobj =    main.s open.s read.s write.s pipe.s device.s \
X    path.s mount.s link.s super.s inode.s cache.s filedes.s \
X    stadir.s protect.s time.s misc.s utility.s table.s putc.s
X
Xfs:    makefile   $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "Start linking FS.  "
X    @echo "If disk fills up, remove some files or use asld -Tsomething"
X    @asld  -o fs -T. $l/head.s $(obj) $l/libc.a $l/end.s
X    @echo "FS done.  "
X
Xclean:
X    rm -f $(obj)
X
Xcache.s:    const.h type.h $h/const.h $h/type.h
Xcache.s:    $h/error.h
Xcache.s:    buf.h
Xcache.s:    file.h
Xcache.s:    fproc.h
Xcache.s:    glo.h
Xcache.s:    inode.h
Xcache.s:    super.h
X
Xdevice.s:    const.h type.h $h/const.h $h/type.h
Xdevice.s:    $h/com.h
Xdevice.s:    $h/error.h
Xdevice.s:    dev.h
Xdevice.s:    file.h
Xdevice.s:    fproc.h
Xdevice.s:    glo.h
Xdevice.s:    inode.h
Xdevice.s:    param.h
X
Xfiledes.s:    const.h type.h $h/const.h $h/type.h
Xfiledes.s:    $h/error.h
Xfiledes.s:    file.h
Xfiledes.s:    fproc.h
Xfiledes.s:    glo.h
Xfiledes.s:    inode.h
X
Xinode.s:    const.h type.h $h/const.h $h/type.h
Xinode.s:    $h/error.h
Xinode.s:    buf.h
Xinode.s:    file.h
Xinode.s:    fproc.h
Xinode.s:    glo.h
Xinode.s:    inode.h
Xinode.s:    super.h
X
Xlink.s:        const.h type.h $h/const.h $h/type.h
Xlink.s:        $h/error.h
Xlink.s:        buf.h
Xlink.s:        file.h
Xlink.s:        fproc.h
Xlink.s:        glo.h
Xlink.s:        inode.h
Xlink.s:        param.h
X
Xmain.s:        const.h type.h $h/const.h $h/type.h
Xmain.s:        $h/callnr.h
Xmain.s:        $h/com.h
Xmain.s:        $h/error.h
Xmain.s:        buf.h
Xmain.s:        file.h
Xmain.s:        fproc.h
Xmain.s:        glo.h
Xmain.s:        inode.h
Xmain.s:        param.h
Xmain.s:        super.h
X
Xmisc.s:        const.h type.h $h/const.h $h/type.h
Xmisc.s:        $h/callnr.h
Xmisc.s:        $h/com.h
Xmisc.s:        $h/error.h
Xmisc.s:        buf.h
Xmisc.s:        file.h
Xmisc.s:        fproc.h
Xmisc.s:        glo.h
Xmisc.s:        inode.h
Xmisc.s:        param.h
Xmisc.s:        super.h
X
Xmount.s:    const.h type.h $h/const.h $h/type.h
Xmount.s:    $h/error.h
Xmount.s:    buf.h
Xmount.s:    file.h
Xmount.s:    fproc.h
Xmount.s:    glo.h
Xmount.s:    inode.h
Xmount.s:    param.h
Xmount.s:    super.h
X
Xopen.s:        const.h type.h $h/const.h $h/type.h
Xopen.s:        $h/callnr.h
Xopen.s:        $h/error.h
Xopen.s:        buf.h
Xopen.s:        file.h
Xopen.s:        fproc.h
Xopen.s:        glo.h
Xopen.s:        inode.h
Xopen.s:        param.h
X
Xpath.s:        const.h type.h $h/const.h $h/type.h
Xpath.s:        $h/error.h
Xpath.s:        buf.h
Xpath.s:        file.h
Xpath.s:        fproc.h
Xpath.s:        glo.h
Xpath.s:        inode.h
Xpath.s:        super.h
X
Xpipe.s:        const.h type.h $h/const.h $h/type.h
Xpipe.s:        $h/callnr.h
Xpipe.s:        $h/com.h
Xpipe.s:        $h/error.h
Xpipe.s:        $h/signal.h
Xpipe.s:        file.h
Xpipe.s:        fproc.h
Xpipe.s:        glo.h
Xpipe.s:        inode.h
Xpipe.s:        param.h
X
Xprotect.s:    const.h type.h $h/const.h $h/type.h
Xprotect.s:    $h/error.h
Xprotect.s:    buf.h
Xprotect.s:    file.h
Xprotect.s:    fproc.h
Xprotect.s:    glo.h
Xprotect.s:    inode.h
Xprotect.s:    param.h
Xprotect.s:    super.h
X
Xputc.s:        const.h type.h $h/const.h $h/type.h
Xputc.s:        $h/com.h
X
Xread.s:        const.h type.h $h/const.h $h/type.h
Xread.s:        $h/com.h
Xread.s:        $h/error.h
Xread.s:        buf.h
Xread.s:        file.h
Xread.s:        fproc.h
Xread.s:        glo.h
Xread.s:        inode.h
Xread.s:        param.h
Xread.s:        super.h
X
Xstadir.s:    const.h type.h $h/const.h $h/type.h
Xstadir.s:    $h/error.h
Xstadir.s:    $h/stat.h
Xstadir.s:    file.h
Xstadir.s:    fproc.h
Xstadir.s:    glo.h
Xstadir.s:    inode.h
Xstadir.s:    param.h
X
Xsuper.s:    const.h type.h $h/const.h $h/type.h
Xsuper.s:    $h/error.h
Xsuper.s:    buf.h
Xsuper.s:    inode.h
Xsuper.s:    super.h
X
Xtable.s:    const.h type.h $h/const.h $h/type.h
Xtable.s:    $h/com.h
Xtable.s:    $h/callnr.h
Xtable.s:    $h/error.h
Xtable.s:    $h/stat.h
Xtable.s:    buf.h
Xtable.s:    dev.h
Xtable.s:    file.h
Xtable.s:    fproc.h
Xtable.s:    glo.h
Xtable.s:    inode.h
Xtable.s:    super.h
X
Xtime.s:        const.h type.h $h/const.h $h/type.h
Xtime.s:        $h/callnr.h
Xtime.s:        $h/com.h
Xtime.s:        $h/error.h
Xtime.s:        file.h
Xtime.s:        fproc.h
Xtime.s:        glo.h
Xtime.s:        inode.h
Xtime.s:        param.h
X
Xutility.s:    const.h type.h $h/const.h $h/type.h
Xutility.s:    $h/com.h
Xutility.s:    $h/error.h
Xutility.s:    buf.h
Xutility.s:    file.h
Xutility.s:    fproc.h
Xutility.s:    glo.h
Xutility.s:    inode.h
Xutility.s:    param.h
Xutility.s:    super.h
X
Xwrite.s:    const.h type.h $h/const.h $h/type.h
Xwrite.s:    $h/error.h
Xwrite.s:    buf.h
Xwrite.s:    file.h
Xwrite.s:    fproc.h
Xwrite.s:    glo.h
Xwrite.s:    inode.h
Xwrite.s:    super.h
+ END-OF-FILE pc_makefile
chmod 'u=rw,g=r,o=r' 'pc_makefile'
set `wc -c 'pc_makefile'`
count=$1
case $count in
4266)    :;;
*)    echo 'Bad character count in ''pc_makefile' >&2
        echo 'Count should be 4266' >&2
esac
echo Extracting 'read.c.cdif'
sed 's/^X//' > 'read.c.cdif' << '+ END-OF-FILE ''read.c.cdif'
X*** /local/ast/minix/tape3b/fs/read.c    Tue Jul 12 23:42:55 1988
X--- read.c    Mon Sep 26 13:04:10 1988
X***************
X*** 143,164 ****
X
X    /* On write, update file size and access time. */
X    if (rw_flag == WRITING) {
X!     if (char_spec == 0 && block_spec == 0 && position > f_size)
X!         rip->i_size = position;
X!     rip->i_modtime = clock_time();
X!     rip->i_dirt = DIRTY;
X    } else {
X      if (rip->i_pipe && position >= rip->i_size) {
X          /* Reset pipe pointers. */
X          rip->i_size = 0;    /* no data left */
X          position = 0;        /* reset reader(s) */
X!         if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos = 0;
X      }
X    }
X    f->filp_pos = position;
X
X    /* Check to see if read-ahead is called for, and if so, set it up. */
X!   if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE
 == 0
X          && (mode_word == I_REGULAR || mode_word == I_DIRECTORY)) {
X      rdahed_inode = rip;
X      rdahedpos = position;
X--- 143,165 ----
X
X    /* On write, update file size and access time. */
X    if (rw_flag == WRITING) {
X!     if (char_spec == 0 && block_spec == 0) {
X!         if (position > f_size) rip->i_size = position;
X!         rip->i_modtime = clock_time();
X!         rip->i_dirt = DIRTY;
X!     }
X    } else {
X      if (rip->i_pipe && position >= rip->i_size) {
X          /* Reset pipe pointers. */
X          rip->i_size = 0;    /* no data left */
X          position = 0;        /* reset reader(s) */
X!         if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos =0;
X      }
X    }
X    f->filp_pos = position;
X
X    /* Check to see if read-ahead is called for, and if so, set it up. */
X!   if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE==
 0
X          && (mode_word == I_REGULAR || mode_word == I_DIRECTORY)) {
X      rdahed_inode = rip;
X      rdahedpos = position;
+ END-OF-FILE read.c.cdif
chmod 'u=rw,g=r,o=r' 'read.c.cdif'
set `wc -c 'read.c.cdif'`
count=$1
case $count in
1736)    :;;
*)    echo 'Bad character count in ''read.c.cdif' >&2
        echo 'Count should be 1736' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Wed, 28 Sep 88 19:09 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4805 for
 EAMATEO@EBRUPC51; Wed, 28 Sep 88 19:07 N
Received: by EB0UB011 (Mailer X1.25) id 0044; Wed, 28 Sep 88 19:04:26 HOE
Date: Tue, 27 Sep 88 20:54:37 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #6 - tools
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 28
X-rw-r--r--  1 ast          2249 Sep 26 22:44 at_makefile.new
X-rwxr-xr-x  1 ast          8072 Sep 26 22:44 bootblok.s.new
X-rw-r--r--  1 ast          2201 Sep 26 22:44 changemem.cdif
X-rw-r--r--  1 ast          4777 Sep 26 22:44 fsck.c.cdif
X-rw-r--r--  1 ast            44 Sep 26 22:44 group.new
X-rw-r--r--  1 ast          1111 Sep 26 22:44 init.c.cdif
X-rw-r--r--  1 ast           770 Sep 26 22:44 message.cdif
X-rw-r--r--  1 ast          2249 Sep 26 22:45 pc_makefile.new
X-rw-r--r--  1 ast           149 Sep 26 22:45 ttys.cdif
X-rw-r--r--  1 ast            22 Sep 26 22:45 ttytype.new
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
590)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 590' >&2
esac
echo Extracting 'at_makefile'
sed 's/^X//' > 'at_makefile' << '+ END-OF-FILE ''at_makefile'
Xl=/usr/lib
XCFLAGS = -F -T.
X
Xall:
X    make init
X    make bootblok
X    make build
X
Xinit:    $l/libc.a init.s $l/head.s
X    asld -o init  $l/head.s init.s $l/libc.a  $l/end.s
X    @echo init done.
X
X# bootblok.s is the source of the MINIX boot block.  The bootblock is the
X# first 512 bytes on the image file and on the boot diskette.  When bootblok.s
X# is assembled, it generates a short binary file (less than 400 bytes) that
X# must be stripped of its header and copied to the file bootblok.  The dd
X# command below does this.  If everything has been done right, the bootblok
X# file should begin with the following 8 words, in hex:
X# c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9
X# The exact procedure for going from bootblok.s to the binary file stripped of
X# its header is somewhat operating system dependent.  Some assemblers make
X# an object (.s) file; others make an a.out file directly. If your boot
X# diskette does not start out by printing 'Booting MINIX 1.0' the problem is
X# probably that you have not made a good boot block.
Xbootblok:    bootblok.s
X    @asld  bootblok.s
X    @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null
X    @rm a.out
X    @echo bootblok done.
X
Xbuild:    build.s
X    cc -o build build.s
X    @echo build done.
X
Xfsck:    fsck.s fsck1.s
X    @echo "Start linking fsck. "
X    asld -o fsck fsck1.s fsck.s $l/libc.a $l/end.s
X    @echo fsck done.
Xfsck.s: fsck.c
X    cc -c -Di8088 -DSTANDALONE -F fsck.c
X
X# 'make image'  combines the bootblock, kernel, memory manager, file
X# system, init and fsck into a single file, called image.  Each of these pieces
X# appears in the image file just as the original does on the disk, except that
X# the header at the front is removed, and each piece is padded out to an
X# integral multiple of 16 bytes.  Build also prints a message telling how big
X# the various pieces (except fsck) are.
X#
X# 'make net' does the same thing, only with the networking code from the
X# 'amoeba directory included
X#
Ximage:    build bootblok
X    @getlf "Insert blank diskette in drive 0 and hit return"
X    @build bootblok ../kernel/kernel ../mm/mm ../fs/fs init fsck image
X    @cp image /dev/fd0
X
Xnet:    build bootblok
X    @getlf "Insert blank diskette in drive 0 and hit return"
X    @build bootblok ../amoeba/kernel/kernel ../amoeba/mm/mm \
X        ../amoeba/fs/fs init fsck /dev/fd0
X
+ END-OF-FILE at_makefile
chmod 'u=rw,g=r,o=r' 'at_makefile'
set `wc -c 'at_makefile'`
count=$1
case $count in
2249)    :;;
*)    echo 'Bad character count in ''at_makefile' >&2
        echo 'Count should be 2249' >&2
esac
echo Extracting 'bootblok.s'
sed 's/^X//' > 'bootblok.s' << '+ END-OF-FILE ''bootblok.s'
X| When the PC is powered on, it reads the first block from the floppy
X| disk into address 0x7C00 and jumps to it.  This boot block must contain
X| the boot program in this file.  The boot program first copies itself to
X| address 192K - 512 (to get itself out of the way).  Then it loads the
X| operating system from the boot diskette into memory, and then jumps to fsck.
X| Loading is not trivial because the PC is unable to read a track into
X| memory across a 64K boundary, so the positioning of everything is critical.
X| The number of sectors to load is contained at address 504 of this block.
X| The value is put there by the build program after it has discovered how
X| big the operating system is.  When the bootblok program is finished loading,
X| it jumps indirectly to the program (fsck) which address is given by the
X| last two words in the boot block.
X|
X| Summary of the words patched into the boot block by build:
X| Word at 504: # sectors to load
X| Word at 506: # DS value for fsck
X| Word at 508: # PC value for fsck
X| Word at 510: # CS value for fsck
X|
X| This version of the boot block must be assembled without separate I & D
X| space.
X
X        LOADSEG = 0x0060         | here the boot block will start loading
X        BIOSSEG = 0x07C0         | here the boot block itself is loaded
X        BOOTSEG = 0x2FE0         | here it will copy itself (192K-512b)
X        DSKBASE = 120            | 120 = 4 * 0x1E = ptr to disk parameters
X
Xfinal   = 504
Xfsck_ds = 506
Xfsck_pc = 508
Xfsck_cs = 510
X
X
X.globl begtext, begdata, begbss, endtext, enddata, endbss  | asld needs these
X.text
Xbegtext:
X.data
Xbegdata:
X.bss
Xbegbss:
X.text
X
X| copy bootblock to bootseg
X        mov     ax,#BIOSSEG
X        mov     ds,ax
X        xor     si,si           | ds:si - original block
X        mov     ax,#BOOTSEG
X        mov     es,ax
X        xor     di,di           | es:di - new block
X        mov     cx,#256         | #  words to move
X    rep
X    movw            | copy loop
X
X
X| start boot procedure
X    jmpi    start, BOOTSEG    | set cs to BOOTSEG
X
Xstart:
X    mov     dx,cs
X        mov     ds,dx           | set ds to cs
X        xor     ax,ax
X        mov     es,ax           | set es to 0
X        mov     ss,dx           | set ss to cs i.e., stack in high core
X        mov     sp,#1536        | initialize sp to high core
X
X| print greeting
X    mov    ax,#2        | reset video
X    int    0x10
X
X        mov     ax,#0x0200    | BIOS call in put cursor in ul corner
X        xor     bx,bx
X        xor     dx,dx
X        int     0x10
X        mov     bx,#greet
X        call    print
X
X| Initialize disk parameters
X| Try 1.2M diskette by trying to read sector 15
X
X    xor    ax,ax
X    mov    es,ax
X    mov    dx,ds
X    mov    ax,#atpar
X    seg    es
X    mov    DSKBASE,ax
X    seg    es
X    mov    DSKBASE+2,dx
X
X    xor    ax,ax    | reset drive
X    int    0x13
X
X    xor    ax,ax
X    mov    es,ax
X    mov    ax,#0x0201    | read sector, #sector = 1
X    mov    bx,#0x0600    | es:bx buffer
X    mov    cx,#0x000F    | track 0, sector 15
X    mov    dx,#0x0000    | drive 0, head 0
X    int    0x13
X    jnb    L1
X
X| Error. It wasn't 1.2M. Now set up for 720K
X
X    mov    tracksiz,#9
X    xor    ax,ax        | ps disk parameters are in ROM F01520
X    mov    es,ax
X    mov    ax,#0x1520
X    seg    es
X    mov    DSKBASE,ax
X    mov    ax,#0xF000
X    seg    es
X    mov    DSKBASE+2,ax
X
X| Try 720K by trying to read track 64.
X| 360K has 40 tracks, 720 has 80 tracks.
X
X    xor    ax,ax    | diskette reset
X    int    0x13
X    mov    tracksiz,#9
X
X    xor    ax,ax
X    mov    es,ax
X    mov    ax,#0x0201    | read sector, number of sectors is 1
X    mov    bx,#0x0600    | es:bx buffer
X    mov    cx,#0x4001    | track 64, sector 1
X    mov    dx,#0x0000    | drive 0, head 0
X    int    0x13
X    jnb    L1
X
X| Error. It wasn't 720K either. Now set up for 360K
X
X    xor    ax,ax
X    mov    es,ax
X    mov    dx,ds
X    mov    ax,#pcpar
X    seg    es
X    mov    DSKBASE,ax
X    seg    es
X    mov    DSKBASE+2,dx
X    int    0x13        | diskette reset
X
XL1:
X
X| Load the operating system from diskette.
Xload:
X    call    setreg        | set up ah, cx, dx
X    mov    bx,disksec    | bx = number of next sector to read
X    add    bx,#2        | diskette sector 1 goes at 1536 ("sector" 3)
X    shl    bx,#1        | multiply sector number by 32
X    shl    bx,#1        | ditto
X    shl    bx,#1        | ditto
X    shl    bx,#1        | ditto
X    shl    bx,#1        | ditto
X    mov    es,bx        | core address is es:bx (with bx = 0)
X    xor    bx,bx        | see above
X    add    disksec,ax    | ax tells how many sectors to read
X    movb    ah,#2        | opcode for read
X    int    0x13        | call the BIOS for a read
X    jb    error        | jump on diskette error
X    mov    ax,disksec    | see if we are done loading
X    cmp    ax,final    | ditto
X    jb    load        | jump if there is more to load
X
X| Loading done.  Finish up.
X        mov     dx,#0x03F2      | kill the motor
X        mov     ax,#0x000C
X        out
X        cli
X    mov    bx,tracksiz    | fsck expects # sectors/track in bx
X        mov     ax,fsck_ds      | set segment registers
X        mov     ds,ax           | when sep I&D DS != CS
X        mov     es,ax           | otherwise they are the same.
X        mov     ss,ax           | words 504 - 510 are patched by build
X
X    seg cs
X    jmpi    @fsck_pc    | jmp to fsck
X
X| Given the number of the next disk block to read, disksec, compute the
X| cylinder, sector, head, and number of sectors to read as follows:
X| ah = # sectors to read;  cl = sector #;  ch = cyl;  dh = head; dl = 0
Xsetreg:
X    mov    si,tracksiz    | 9 (PC) or 15 (AT) sectors per track
X    mov     ax,disksec    | ax = next sector to read
X    xor    dx,dx        | dx:ax = 32-bit dividend
X    div    si        | divide sector # by track size
X    mov    cx,ax        | cx = track #; dx = sector (0-origin)
X    mov    bx,dx        | bx = sector number (0-origin)
X    mov    ax,disksec    | ax = next sector to read
X    add    ax,si        | ax = last sector to read + 1
X    dec    ax        | ax = last sector to read
X    xor    dx,dx        | dx:ax = 32-bit dividend
X    div    tracksiz    | divide last sector by track size
X    cmpb    al,cl        | is starting track = ending track
X    je    set1        | jump if whole read on 1 cylinder
X    sub    si,dx        | compute lower sector count
X    dec    si        | si = # sectors to read
X
X| Check to see if this read crosses a 64K boundary (128 sectors).
X| Such calls must be avoided.  The BIOS gets them wrong.
Xset1:    mov    ax,disksec    | ax = next sector to read
X    add    ax,#2        | disk sector 1 goes in core sector 3
X    mov    dx,ax        | dx = next sector to read
X    add    dx,si        | dx = one sector beyond end of read
X    dec    dx        | dx = last sector to read
X    shl    ax,#1        | ah = which 64K bank does read start at
X    shl    dx,#1        | dh = which 64K bank foes read end in
X    cmpb    ah,dh        | ah != dh means read crosses 64K boundary
X    je    set2        | jump if no boundary crossed
X    shrb    dl,#1        | dl = excess beyond 64K boundary
X    xorb    dh,dh        | dx = excess beyond 64K boundary
X    sub    si,dx        | adjust si
X    dec    si        | si = number of sectors to read
X
Xset2:    mov    ax,si        | ax = number of sectors to read
X    xor    dx,dx        | dh = head, dl = drive
X    movb    dh,cl        | dh = track
X    andb    dh,#0x01    | dh = head
X    movb    ch,cl        | ch = track to read
X    shrb    ch,#1        | ch = cylinder
X    movb    cl,bl        | cl = sector number (0-origin)
X    incb    cl        | cl = sector number (1-origin)
X    xorb    dl,dl        | dl = drive number (0)
X    ret            | return values in ax, cx, dx
X
X
X|-------------------------------+
X|    error & print routines     |
X|-------------------------------+
X
Xerror:
X        push    ax
X        mov     bx,#fderr
X        call    print           | print msg
X    xor    cx,cx
Xerr1:    mul    0        | delay
X    loop    err1
X    int    0x19
X
X
Xprint:                          | print string (bx)
X        movb    al,(bx)            | al contains char to be printed
X        testb   al,al           | null char?
X        jne     prt1            | no
X        ret                     | else return
Xprt1:   movb    ah,#14          | 14 = print char
X        inc     bx              | increment string pointer
X        push    bx              | save bx
X        movb    bl,#1           | foreground color
X    xorb    bh,bh        | page 0
X        int     0x10            | call BIOS VIDEO_IO
X        pop     bx              | restore bx
X        jmp     print           | next character
X
X
Xdisksec:.word 1
Xpcpar:    .byte    0xDF, 0x02, 25, 2, 9, 0x2A, 0xFF, 0x50, 0xF6, 1, 3 | for pc
Xatpar:    .byte    0xDF, 0x02, 25, 2,15, 0x1B, 0xFF, 0x54, 0xF6, 1, 8 | for at
X
Xfderr:    .asciz "Read error.  Automatic reboot.\r\n"
Xgreet:    .asciz "\rBooting MINIX 1.3.  Copyright 1988 Prentice-Hall, Inc.\r\n"
Xtracksiz:.word 15    | changed to 9 for ps and pc
X
X| Don't forget that words 504 - 510 are filled in by build.  The regular
X| code had better not get that far.
X.text
Xendtext:
X.data
Xenddata:
X.bss
Xendbss:
+ END-OF-FILE bootblok.s
chmod 'u=rwx,g=rx,o=rx' 'bootblok.s'
set `wc -c 'bootblok.s'`
count=$1
case $count in
8072)    :;;
*)    echo 'Bad character count in ''bootblok.s' >&2
        echo 'Count should be 8072' >&2
esac
echo Extracting 'changemem.cdif'
sed 's/^X//' > 'changemem.cdif' << '+ END-OF-FILE ''changemem.cdif'
X*** /local/ast/minix/tape3b/tools/changemem    Wed Jul 13 14:46:51 1988
X--- changemem    Mon Sep 26 13:03:31 1988
X***************
X*** 3,21 ****
X  l=/usr/lib
X  t=../test
X  chmem =50000 $b/ar
X  chmem =60000 $b/asld
X! chmem =2000  $b/cc
X  chmem =52000 $l/cem
X  chmem =30000 $l/cg
X  chmem =60000 $b/cdiff
X  chmem =64000 $b/compress
X! chmem =32000 $b/cpdir
X  chmem =60000 $l/cpp
X  chmem =40000 $b/dd
X  chmem =60000 $b/diff
X  chmem =8000  $b/df
X  chmem =32000 $b/dosread
X  chmem =60000 $b/ed
X  chmem =50000 $b/find
X  chmem =60000 $b/fix
X  chmem =8000  $b/grep
X--- 3,26 ----
X  l=/usr/lib
X  t=../test
X  chmem =50000 $b/ar
X+ chmem =16000 $b/ast
X  chmem =60000 $b/asld
X! chmem =3000  $b/cc
X  chmem =52000 $l/cem
X  chmem =30000 $l/cg
X+ chmem =16000 $b/cp
X  chmem =60000 $b/cdiff
X  chmem =64000 $b/compress
X! chmem =64000 $b/cpdir
X  chmem =60000 $l/cpp
X  chmem =40000 $b/dd
X+ chmem =32000 $b/du
X  chmem =60000 $b/diff
X  chmem =8000  $b/df
X  chmem =32000 $b/dosread
X  chmem =60000 $b/ed
X+ chmem =8000  $b/fgrep
X+ chmem =50000 $b/file
X  chmem =50000 $b/find
X  chmem =60000 $b/fix
X  chmem =8000  $b/grep
X***************
X*** 30,50 ****
X  chmem =8000  $b/mv
X  chmem =16000 $b/nm
X  chmem =40000 $l/opt
X! chmem =24000 $b/pr
X  chmem =8000  $b/prep
X  chmem =50000 $b/readfs
X  chmem =8000  $b/rm
X  chmem =8000  $b/rmdir
X  chmem =16000  $b/roff
X  chmem =16000  $b/strings
X! chmem =20000 $b/sh
X  chmem =60000 $b/sort
X  chmem =8000  $b/tail
X  chmem =8000  $b/time
X  chmem =60000 $b/treecmp
X  chmem =8000  $t/t10a
X  chmem =8000  $t/t11a
X  chmem =8000  $t/t11b
X  chmem =8000  $b/uuencode
X  chmem =8000  $b/uudecode
X  chmem =8000  $b/wc
X--- 35,59 ----
X  chmem =8000  $b/mv
X  chmem =16000 $b/nm
X  chmem =40000 $l/opt
X! chmem =8000  $b/paste
X! chmem =32000 $b/pr
X  chmem =8000  $b/prep
X  chmem =50000 $b/readfs
X  chmem =8000  $b/rm
X  chmem =8000  $b/rmdir
X  chmem =16000  $b/roff
X  chmem =16000  $b/strings
X! chmem =12000 $b/sh
X! chmem =8000  $b/shar
X  chmem =60000 $b/sort
X+ chmem =16000 $b/strip
X  chmem =8000  $b/tail
X  chmem =8000  $b/time
X  chmem =60000 $b/treecmp
X  chmem =8000  $t/t10a
X  chmem =8000  $t/t11a
X  chmem =8000  $t/t11b
X+ chmem =8000  $b/uniq
X  chmem =8000  $b/uuencode
X  chmem =8000  $b/uudecode
X  chmem =8000  $b/wc
+ END-OF-FILE changemem.cdif
chmod 'u=rw,g=r,o=r' 'changemem.cdif'
set `wc -c 'changemem.cdif'`
count=$1
case $count in
2201)    :;;
*)    echo 'Bad character count in ''changemem.cdif' >&2
        echo 'Count should be 2201' >&2
esac
echo Extracting 'fsck.c.cdif'
sed 's/^X//' > 'fsck.c.cdif' << '+ END-OF-FILE ''fsck.c.cdif'
X*** /local/ast/minix/tape3b/tools/fsck.c    Wed Jul 13 14:46:52 1988
X--- fsck.c    Mon Sep 26 13:03:34 1988
X***************
X*** 5,66 ****
X  #include "../fs/const.h"
X  #include "../fs/type.h"
X
X! /* #define DOS            /* compile to run under MS-DOS */
X! /* #define STANDALONE        /* compile for the boot-diskette */
X  #ifndef STANDALONE
X! #include "stdio.h"
X! #endif /*STANDALONE*/
X
X! /* Fsck may be compiled to run in any of two situations. For each
X!  * a different symbol must be defined:
X   *
X!  *   STANDALONE    will compile fsck to be part of the boot-diskette and
X!  *        all necessary routines are contained in the program
X!  *   DOS    will compile fsck to run under MS-DOS, using
X!  *        the standard DOS library for your compiler.
X   *
X!  * The assembler file fsck1.asm must be assembled correspondingly. It has
X!  * only one symbol defined, namely STANDALONE.
X!  *  The assembler file fsck.s is only used under PC/IX to produce
X!  * a version for the boot diskette.
X!  *  When you have a problem look at the preprocessor output to see
X!  * which lines will actually be compiled.
X!  *  To produce an executable/binary version issue one of the following
X!  * commands, depending on your development environment:
X   *
X!  * Development system:    MS-DOS
X   *
X!  * fsck to run under:    MS-DOS
X!  * defined symbols:    fsck.c:       DOS
X!  *            fsck1.asm:  -
X!  * command:        link fsck+fsck1,,,DOS-lib
X!  *
X!  * fsck to run under:    BOOT
X!  * defined symbols:    fsck.c:       STANDALONE
X!  *            fsck1.asm: STANDALONE
X!  * command:        link fsck1+fsck,fsck,, {Minix-lib || DOS-lib}
X!  *            dos2out -d fsck
X!  *
X!  * fsck to run under:    MINIX       -not yet implemented-
X!  * command:        link crtso+fsck,fsck,,Minix-lib
X!  *            dos2out -d fsck
X!  *
X!  *
X!  * Development system:    PC/IX
X!  *
X!  * fsck to run under:    PC/IX
X!  * command:        ld fsck -lc
X!  *
X!  * fsck to run under:    BOOT
X!  * defined symbols:    fsck.c:       STANDALONE
X!  *            fsck1.s:   -
X!  * command:        ld fsck1.o fsck.0 -l../lib/lib.a
X!  *
X!  * fsck to run under:    MINIX
X!  * command:        ld fsck.o -l../lib/lib.a
X!  *
X   */
X
X  #define BITSHIFT      4    /* = 2log(#bits(int)) */
X  #define BITMAPSHIFT     13    /* = 2log(#bits(block)); 13 means 1K blocks */
X  #define MAXPRINT      8    /* max. number of error lines in chkmap */
X--- 5,35 ----
X  #include "../fs/const.h"
X  #include "../fs/type.h"
X
X!
X  #ifndef STANDALONE
X! #include <stdio.h>
X! #endif
X
X! /* Fsck may be compiled to run in any of two situations.
X   *
X!  *   - standalone, as part of the boot diskette used to bring MINIX up
X!  *   - as a running MINIX program.
X   *
X!  * When used for standalone operation, -DSTANDALONE must be used.
X!  * The following commands can be used to build a standalone version:
X   *
X!  *    cc -c -Di8088 -DSTANDALONE fsck.c
X!  *    asld -o fsck fsck1.s fsck.s /usr/lib/libc.a /usr/lib/end.s
X   *
X!  * Fsck1.s contains calls to the BIOS routines used by the standalone
X!  * version.  The production version makes ordinary MINIX reads and writes.
X   */
X
X+
X+ #define HEADS             4    /* # heads per cylinder */
X+ #define TRACKSIZE        17    /* # sectors per track */
X+ #define CYLSIZE (HEADS*TRACKSIZE) /* # sectors per cylinder */
X+
X  #define BITSHIFT      4    /* = 2log(#bits(int)) */
X  #define BITMAPSHIFT     13    /* = 2log(#bits(block)); 13 means 1K blocks */
X  #define MAXPRINT      8    /* max. number of error lines in chkmap */
X***************
X*** 1847,1852 ****
X--- 1816,1823 ----
X      for (;;) {
X          printf("\nHit key as follows:\n\n");
X          printf("    =  start MINIX (root file system in drive 0)\n");
X+         printf("    u  start MINIX on PS/2 Model 30, U.S. keyboard (root file
 sys in drive 0)\n");
X+         printf("    d  start MINIX on PS/2 Model 30, Dutch keyboard (root
 file sys in drive 0)\n");
X          printf("    f  check the file system (first insert any file system
 diskette)\n");
X          printf("    l  check and list file system (first insert any file
 system diskette)\n");
X          printf("    m  make an (empty) file system (first insert blank,
 formatted diskette)\n");
X***************
X*** 1864,1871 ****
X          case 'h':
X              get_partition();
X              drive = (partition < PARB ? 0x80 : 0x81);
X!             cylsiz = 68;    /* sectors per cylinder */
X!             tracksiz = 17;
X              printf("Checking hard disk.  %s\n", answer);
X              if (read_partition() < 0) continue;
X              repair = 1;
X--- 1835,1842 ----
X          case 'h':
X              get_partition();
X              drive = (partition < PARB ? 0x80 : 0x81);
X!             cylsiz = CYLSIZE;    /* sectors per cylinder */
X!             tracksiz = TRACKSIZE;
X              printf("Checking hard disk.  %s\n", answer);
X              if (read_partition() < 0) continue;
X              repair = 1;
X***************
X*** 1896,1901 ****
X--- 1867,1874 ----
X              break;
X
X          case '=': return((c >> 8) & 0xFF);
X+         case 'u': return((c >> 8) & 0xFF);
X+         case 'd': return((c >> 8) & 0xFF);
X          default:
X              printf("Illegal command\n");
X              continue;
+ END-OF-FILE fsck.c.cdif
chmod 'u=rw,g=r,o=r' 'fsck.c.cdif'
set `wc -c 'fsck.c.cdif'`
count=$1
case $count in
4777)    :;;
*)    echo 'Bad character count in ''fsck.c.cdif' >&2
        echo 'Count should be 4777' >&2
esac
echo Extracting 'group.new'
sed 's/^X//' > 'group.new' << '+ END-OF-FILE ''group.new'
Xroot:*:0:
Xdaemon:*:1:
Xsystem:*:2:
Xuser:*:3:
+ END-OF-FILE group.new
chmod 'u=rw,g=r,o=r' 'group.new'
set `wc -c 'group.new'`
count=$1
case $count in
44)    :;;
*)    echo 'Bad character count in ''group.new' >&2
        echo 'Count should be 44' >&2
esac
echo Extracting 'init.c.cdif'
sed 's/^X//' > 'init.c.cdif' << '+ END-OF-FILE ''init.c.cdif'
X*** /local/ast/minix/tape3b/tools/init.c    Wed Jul 13 14:46:53 1988
X--- init.c    Mon Sep 26 13:03:34 1988
X***************
X*** 28,33 ****
X--- 28,35 ----
X  #define NOPARAMS        -100
X  #define WTMPSIZE           8
X
X+ extern long time();
X+ extern long lseek();
X
X  struct uart {
X    int baud;
X***************
X*** 124,129 ****
X--- 126,132 ----
X    for (i = 1; i <= NR_SIGS; i++) signal(i, SIG_IGN);
X
X    while (1) {
X+     sync();
X      k = wait(&status);
X      pidct--;
X
X***************
X*** 154,162 ****
X      /* Child */
X      close(0);        /* /etc/ttys may be open */
X      name[DIGIT] = '0' + linenr;
X!     if (open(name, 0) != 0) exit(-3);    /* standard input */
X!     if (open(name, 1) != 1) exit(-3);    /* standard output */
X!     if (open(name, 1) != 2) exit(-3);    /* standard error */
X
X
X      /* Set line parameters. */
X--- 157,165 ----
X      /* Child */
X      close(0);        /* /etc/ttys may be open */
X      name[DIGIT] = '0' + linenr;
X!     if (open(name, 2) != 0) exit(-3);    /* standard input */
X!     if (open(name, 2) != 1) exit(-3);    /* standard output */
X!     if (open(name, 2) != 2) exit(-3);    /* standard error */
X
X
X      /* Set line parameters. */
+ END-OF-FILE init.c.cdif
chmod 'u=rw,g=r,o=r' 'init.c.cdif'
set `wc -c 'init.c.cdif'`
count=$1
case $count in
1111)    :;;
*)    echo 'Bad character count in ''init.c.cdif' >&2
        echo 'Count should be 1111' >&2
esac
echo Extracting 'message.cdif'
sed 's/^X//' > 'message.cdif' << '+ END-OF-FILE ''message.cdif'
X*** /local/ast/minix/tape3b/tools/message    Wed Jul 13 14:46:54 1988
X--- message    Mon Sep 26 13:03:35 1988
X***************
X*** 1,8 ****
X
X
X! Please see 'doc/READ_ME' for instructions about unpacking the documentation.
X  Then read 'doc/USER_GUIDE' before using the system.  The 'doc' directory is
X! on disk 7 (PC version) or disk 3 (AT version).
X
X  If your screen goes blank periodically, hit the F3 key (see
 'doc/USER_GUIDE').
X
X--- 1,8 ----
X
X
X! Please see 'doc/Read_me' for instructions about unpacking the documentation.
X  Then read 'doc/USER_GUIDE' before using the system.  The 'doc' directory is
X! on disk 8 (PC version) or disk 3 (AT version), in the doc.a.Z archive.
X
X  If your screen goes blank periodically, hit the F3 key (see
 'doc/USER_GUIDE').
X
+ END-OF-FILE message.cdif
chmod 'u=rw,g=r,o=r' 'message.cdif'
set `wc -c 'message.cdif'`
count=$1
case $count in
770)    :;;
*)    echo 'Bad character count in ''message.cdif' >&2
        echo 'Count should be 770' >&2
esac
echo Extracting 'pc_makefile'
sed 's/^X//' > 'pc_makefile' << '+ END-OF-FILE ''pc_makefile'
Xl=/usr/lib
XCFLAGS = -F -T.
X
Xall:
X    make init
X    make bootblok
X    make build
X
Xinit:    $l/libc.a init.s $l/head.s
X    asld -o init  $l/head.s init.s $l/libc.a  $l/end.s
X    @echo init done.
X
X# bootblok.s is the source of the MINIX boot block.  The bootblock is the
X# first 512 bytes on the image file and on the boot diskette.  When bootblok.s
X# is assembled, it generates a short binary file (less than 400 bytes) that
X# must be stripped of its header and copied to the file bootblok.  The dd
X# command below does this.  If everything has been done right, the bootblok
X# file should begin with the following 8 words, in hex:
X# c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9
X# The exact procedure for going from bootblok.s to the binary file stripped of
X# its header is somewhat operating system dependent.  Some assemblers make
X# an object (.s) file; others make an a.out file directly. If your boot
X# diskette does not start out by printing 'Booting MINIX 1.0' the problem is
X# probably that you have not made a good boot block.
Xbootblok:    bootblok.s
X    @asld  bootblok.s
X    @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null
X    @rm a.out
X    @echo bootblok done.
X
Xbuild:    build.s
X    cc -o build build.s
X    @echo build done.
X
Xfsck:    fsck.s fsck1.s
X    @echo "Start linking fsck. "
X    asld -o fsck fsck1.s fsck.s $l/libc.a $l/end.s
X    @echo fsck done.
Xfsck.s: fsck.c
X    cc -c -Di8088 -DSTANDALONE -F fsck.c
X
X# 'make image'  combines the bootblock, kernel, memory manager, file
X# system, init and fsck into a single file, called image.  Each of these pieces
X# appears in the image file just as the original does on the disk, except that
X# the header at the front is removed, and each piece is padded out to an
X# integral multiple of 16 bytes.  Build also prints a message telling how big
X# the various pieces (except fsck) are.
X#
X# 'make net' does the same thing, only with the networking code from the
X# 'amoeba directory included
X#
Ximage:    build bootblok
X    @getlf "Insert blank diskette in drive 0 and hit return"
X    @build bootblok ../kernel/kernel ../mm/mm ../fs/fs init fsck image
X    @cp image /dev/fd0
X
Xnet:    build bootblok
X    @getlf "Insert blank diskette in drive 0 and hit return"
X    @build bootblok ../amoeba/kernel/kernel ../amoeba/mm/mm \
X        ../amoeba/fs/fs init fsck /dev/fd0
X
+ END-OF-FILE pc_makefile
chmod 'u=rw,g=r,o=r' 'pc_makefile'
set `wc -c 'pc_makefile'`
count=$1
case $count in
2249)    :;;
*)    echo 'Bad character count in ''pc_makefile' >&2
        echo 'Count should be 2249' >&2
esac
echo Extracting 'ttys'
sed 's/^X//' > 'ttys' << '+ END-OF-FILE ''ttys'
X100
+ END-OF-FILE ttys
chmod 'u=rw,g=r,o=r' 'ttys'
set `wc -c 'ttys'`
count=$1
case $count in
4)    :;;
*)    echo 'Bad character count in ''ttys' >&2
        echo 'Count should be 4' >&2
esac
echo Extracting 'ttytype.new'
sed 's/^X//' > 'ttytype.new' << '+ END-OF-FILE ''ttytype.new'
Xminix tty0
Xvt100 tty1
+ END-OF-FILE ttytype.new
chmod 'u=rw,g=r,o=r' 'ttytype.new'
set `wc -c 'ttytype.new'`
count=$1
case $count in
22)    :;;
*)    echo 'Bad character count in ''ttytype.new' >&2
        echo 'Count should be 22' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 01:46 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 5623 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 01:45 N
Received: by EB0UB011 (Mailer X1.25) id 1247; Thu, 29 Sep 88 01:40:06 HOE
Date: Tue, 27 Sep 88 20:51:41 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #3 commands (1 of 3)
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 417
X-rw-r--r--  1 ast          6207 Sep 26 22:28 animals.c.new
X-rw-r--r--  1 ast          6631 Sep 26 22:28 ast.c.cdif
X-rw-r--r--  1 ast          9395 Sep 26 22:28 at.c.cdif
X-rw-r--r--  1 ast          6370 Sep 26 22:28 banner.c.new
X-rw-r--r--  1 ast          7822 Sep 26 22:29 cc.c.cdif
X-rw-r--r--  1 ast          1360 Sep 26 22:29 cdiff.c.cdif
X-rw-r--r--  1 ast           270 Sep 26 22:29 chgrp.c.cdif
X-rw-r--r--  1 ast          8525 Sep 26 22:29 chmod.c.cdif
X-rw-r--r--  1 ast           385 Sep 26 22:29 chown.c.cdif
X-rw-r--r--  1 ast          1140 Sep 26 22:29 clr.c.cdif
X-rw-r--r--  1 ast        241152 Sep 26 22:29 commands.a.Z.new
X-rw-r--r--  1 ast          1737 Sep 26 22:29 cp.c.cdif
X-rw-r--r--  1 ast          4265 Sep 26 22:29 cpdir.c.cdif
X-rw-r--r--  1 ast          5528 Sep 26 22:29 date.c.cdif
X-rw-r--r--  1 ast           487 Sep 26 22:30 df.c.cdif
X-rw-r--r--  1 ast           956 Sep 26 22:30 diskcheck.c.cdif
X-rw-r--r--  1 ast         23988 Sep 26 22:30 dosread.c.cdif
X-rw-r--r--  1 ast           282 Sep 26 22:30 factor.c.cdif
X-rw-r--r--  1 ast           457 Sep 26 22:30 fgrep.c.cdif
X-rw-r--r--  1 ast          1189 Sep 26 22:30 file.c.cdif
X-rw-r--r--  1 ast           255 Sep 26 22:30 getlf.c.cdif
X-rw-r--r--  1 ast          4249 Sep 26 22:30 help.c.new
X-rw-r--r--  1 ast           267 Sep 26 22:30 libupack.c.cdif
X-rw-r--r--  1 ast          6360 Sep 26 22:30 login.c.cdif
X-rw-r--r--  1 ast          5992 Sep 26 22:31 ls.c.cdif
X-rw-r--r--  1 ast          5467 Sep 26 22:31 more.c.cdif
X-rw-r--r--  1 ast           602 Sep 26 22:31 mount.c.cdif
X-rw-r--r--  1 ast          4523 Sep 26 22:31 mv.c.cdif
X-rw-r--r--  1 ast          2777 Sep 26 22:31 nm.c.cdif
X-rw-r--r--  1 ast           274 Sep 26 22:31 paste.c.cdif
X-rw-r--r--  1 ast          6596 Sep 26 22:31 pr.c.cdif
X-rw-r--r--  1 ast           260 Sep 26 22:31 readall.c.cdif
X-rw-r--r--  1 ast          4113 Sep 26 22:31 readclock.c.new
X-rw-r--r--  1 ast           561 Sep 26 22:31 readfs.c.cdif
X-rw-r--r--  1 ast           337 Sep 26 22:32 sed.c.cdif
X-rw-r--r--  1 ast          1129 Sep 26 22:32 strip.c.cdif
X-rw-r--r--  1 ast           778 Sep 26 22:32 stty.c.cdif
X-rw-r--r--  1 ast           448 Sep 26 22:32 su.c.cdif
X-rw-r--r--  1 ast           561 Sep 26 22:32 tar.c.cdif
X-rw-r--r--  1 ast           606 Sep 26 22:32 term.c.cdif
X-rw-r--r--  1 ast          2431 Sep 26 22:32 tset.c.new
X-rw-r--r--  1 ast           435 Sep 26 22:32 tty.c.cdif
X-rw-r--r--  1 ast           361 Sep 26 22:32 vol.c.cdif
X-rw-r--r--  1 ast          4209 Sep 26 22:32 x.new
X-rw-r--r--  1 ast          4209 Sep 26 22:32 y.new
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
2579)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 2579' >&2
esac
echo Extracting 'animals.c.new'
sed 's/^X//' > 'animals.c.new' << '+ END-OF-FILE ''animals.c.new'
X/*  animals - guessing game    Authors: Terrence W. Holm & Edwin L. Froese */
X
X#include <stdio.h>
X#include <string.h>
X#include <signal.h>
X#include <sgtty.h>
X#include <ctype.h>
X#include <unistd.h>
X
X#define  ANIMALS    "/usr/lib/animals"
X#define  DEFAULT_ANIMAL    "beaver"
X#define  MAX_NODES    999    /*  Enough for 500 animals  */
X#define  MAX_LINE    90
X
Xint   Abort();
Xchar *Get_Animal();
Xchar *Get_Question();
Xchar *A_or_An();
Xchar *Alloc();
X
Xstruct node
X  {
X  int   question;
X  char *text;
X  int   yes;
X  int   no;
X  } animals[ MAX_NODES ];
X
Xint count = 0;
Xstruct sgttyb old_tty_mode;
X
X
Xmain( argc, argv )
X  int   argc;
X  char *argv[];
X
X  {
X  char *animal_file = ANIMALS;
X
X  if ( argc > 2 )
X    {
X    fprintf( stderr, "Usage:  %s  [ data_base ]\n", argv[0] );
X    exit( 1 );
X    }
X
X  if ( argc == 2 )
X    animal_file = argv[1];
X
X  ioctl( 0, TIOCGETP, &old_tty_mode );
X
X  signal( SIGINT,  Abort );
X  signal( SIGQUIT, Abort );
X
X  if ( access( animal_file, R_OK ) == 0 )
X    Read_Animals( animal_file );
X  else
X    {
X    animals[0].question = 0;
X    animals[0].text = DEFAULT_ANIMAL;
X    count = 1;
X    }
X
X  while ( Ask( "\nAre you thinking of an animal?" ) )
X    {
X    int i = 0;
X
X    while ( 1 )
X      {
X      if ( animals[i].question )
X    {
X    if ( Ask( animals[i].text ) )
X      i = animals[i].yes;
X    else
X      i = animals[i].no;
X    }
X      else
X    {
X    printf( "Were you thinking of %s %s",
X           A_or_An( animals[i].text ), animals[i].text );
X
X    if ( Ask( "?" ) )
X      printf( "I knew it!\n" );
X
X    else
X      {
X      /*  Insert a new question and animal name  */
X
X      if ( count + 2 > MAX_NODES )
X        Error( "Too many animal names" );
X
X      animals[count].question = 0;
X      animals[count].text = animals[i].text;
X      ++count;
X
X      animals[count].question = 0;
X      printf( "What animal were you thinking of? " );
X      animals[count].text = Get_Animal();
X      ++count;
X
X      animals[i].question = 1;
X      printf( "What question would distinguish %s %s from\n%s %s? ",
X        A_or_An( animals[count-2].text ), animals[count-2].text,
X        A_or_An( animals[count-1].text ), animals[count-1].text );
X
X      animals[i].text = Get_Question();
X
X      printf( "For %s %s, the answer would be",
X        A_or_An( animals[count-1].text ), animals[count-1].text );
X
X      if ( Ask( "?" ) )
X        {
X        animals[i].yes = count - 1;
X        animals[i].no  = count - 2;
X        }
X      else
X        {
X        animals[i].yes = count - 2;
X        animals[i].no  = count - 1;
X        }
X      }
X
X    break;
X    }
X      }  /*  End while ( 1 )  */
X
X    }
X
X
X  ioctl( 0, TIOCSETP, &old_tty_mode  );
X
X  printf( "\nThank you for playing \"animals\".\n" );
X  printf( "The animal data base is now being updated.\n" );
X
X  Write_Animals( animal_file );
X
X  sleep( 1 );
X  printf( "\nBye.\n" );
X
X  exit( 0 );
X  }
X
X
X/*
X *  Reading and writing the animal data base
X */
X
X
XRead_Animals( animal_file )
X  char *animal_file;
X
X  {
X  FILE *f;
X  char buffer[ MAX_LINE ];
X
X  if ( (f = fopen( animal_file, "r" )) == NULL )
X    Error( "Can not open animal data base" );
X
X  while ( fgets( buffer, MAX_LINE, f ) != NULL )
X    {
X    int   string_length;
X    char *string;
X
X    buffer[ strlen(buffer) - 1 ] = '\0';
X
X    swab( buffer, buffer, strlen(buffer) );
X
X    if ( buffer[ 0 ] == 'q' )
X      {
X      char *end = strchr( buffer, '?' );
X      string_length = end - buffer;
X      animals[ count ].question = 1;
X      sscanf( end + 1, "%d:%d", &animals[ count ].yes, &animals[ count ].no );
X      }
X    else
X      {
X      animals[ count ].question = 0;
X      string_length = strlen( buffer ) - 1;
X      }
X
X    string = Alloc( string_length + 1 );
X
X    string[ 0 ] = '\0';
X    strncat( string, buffer+1, string_length );
X
X    animals[ count ].text = string;
X
X    count++;
X    }
X
X  fclose( f );
X  }
X
X
XWrite_Animals( animal_file )
X  char *animal_file;
X
X  {
X  FILE *f;
X  int i;
X  char buffer[ MAX_LINE ];
X
X  if ( (f = fopen( animal_file, "w" )) == NULL )
X     Error( "Can not write animal data base" );
X
X  for ( i = 0;  i < count;  ++i )
X    {
X    if ( animals[i].question )
X      sprintf( buffer, "q%s%d:%d", animals[i].text,
X            animals[i].yes, animals[i].no );
X    else
X      sprintf( buffer, "a%s", animals[i].text );
X
X    /*  Make the data base a bit difficult to read  */
X
X    swab( buffer, buffer, strlen(buffer) );
X
X    fprintf( f, "%s\n", buffer );
X    }
X
X  fclose( f );
X
X  chmod( animal_file, 0666 );
X  }
X
X
X/*
X *  Reading data from the user
X */
X
X
Xint Ask( question )
X  char *question;
X
X  {
X  struct sgttyb new_tty_mode;
X  int response;
X
X  new_tty_mode = old_tty_mode;
X  new_tty_mode.sg_flags |= CBREAK;
X  ioctl( 0, TIOCSETP, &new_tty_mode  );
X
X  printf( "%s ", question );
X
X  while ( (response = getchar()) != 'y'  &&  response != 'n' )
X    printf( "\n%s [yn]?", question );
X
X  putchar( '\n' );
X
X  ioctl( 0, TIOCSETP, &old_tty_mode  );
X
X  if ( response == 'y' )
X    return( 1 );
X  else
X    return( 0 );
X  }
X
X
Xchar *Get_Animal()
X  {
X  char  s[ MAX_LINE ];
X  char *text;
X  int   text_length;
X
X  fgets( s, MAX_LINE, stdin );
X
X  text_length = strlen(s);
X
X  text = Alloc( text_length );
X
X  text[ 0 ] = '\0';
X  strncat( text, s, text_length - 1 );
X
X  return( text );
X  }
X
X
Xchar *Get_Question()
X  {
X  char s[ MAX_LINE ];
X  char *end;
X  char *text;
X
X  fgets( s, MAX_LINE, stdin );
X
X  /*  Capitalize the first letter  */
X
X  if ( islower( s[0] ) )
X    s[0] = toupper( s[0] );
X
X  /*  Make sure the question ends with a '?'  */
X
X  if ( (end = strchr( s, '?' )) == NULL )
X    s[ strlen(s) - 1 ] = '?';
X  else
X    end[1] = '\0';
X
X  text = Alloc( strlen(s) + 1 );
X
X  strcpy( text, s );
X
X  return( text );
X  }
X
X
X/*
X *  Utility routines
X */
X
X
Xchar *A_or_An( word )
X  char *word;
X
X  {
X  if ( strchr( "aeiouAEIOU", word[0] ) == NULL )
X    return( "a" );
X  else
X    return( "an" );
X  }
X
X
Xchar *Alloc( size )
X  int size;
X
X  {
X  char *malloc();
X  char *memory;
X
X  if ( (memory = malloc( size )) == NULL )
X    Error( "No room in memory for all the animals" );
X
X  return( memory );
X  }
X
X
XAbort()
X  {
X  ioctl( 0, TIOCSETP, &old_tty_mode  );
X
X  printf( "\nThank you for playing \"animals\".\n" );
X  printf( "Since you aborted, the animal data base will not be updated.\n" );
X
X  sleep( 1 );
X  printf( "\nBye.\n" );
X
X  exit( 1 );
X  }
X
X
XError( message )
X  char *message;
X
X  {
X  ioctl( 0, TIOCSETP, &old_tty_mode  );
X
X  fprintf( stderr, "Error: %s\n", message );
X
X  exit( 1 );
X  }
+ END-OF-FILE animals.c.new
chmod 'u=rw,g=r,o=r' 'animals.c.new'
set `wc -c 'animals.c.new'`
count=$1
case $count in
6207)    :;;
*)    echo 'Bad character count in ''animals.c.new' >&2
        echo 'Count should be 6207' >&2
esac
echo Extracting 'ast.c.cdif'
sed 's/^X//' > 'ast.c.cdif' << '+ END-OF-FILE ''ast.c.cdif'
X*** /local/ast/minix/tape3b/commands/ast.c    Wed Jul 13 13:10:40 1988
X--- ast.c    Sun Sep 25 15:24:42 1988
X***************
X*** 1,12 ****
X! /* ast - add symbol table.    Author: Dick van Veen, veench@cs.vu.nl */
X
X  #include <a.out.h>
X  #include <stdio.h>
X
X  /*
X   * Since the a.out file in MINIX does not contain any symbol table,
X!  * we use the symbol table produced with the -s option of asld, e.g.
X!  *     cc -s file.c >symbol.out
X   *
X   * Read symbol table in memory, remove compiler generated labels,
X   * sort the labels and add it to the a.out file.
X--- 1,11 ----
X! /* ast - add symbol table.        Author: Dick van Veen */
X
X  #include <a.out.h>
X  #include <stdio.h>
X
X  /*
X   * Since the a.out file in MINIX does not contain any symbol table,
X!  * we use the symbol table produced with the -s option of asld.
X   *
X   * Read symbol table in memory, remove compiler generated labels,
X   * sort the labels and add it to the a.out file.
X***************
X*** 17,28 ****
X   */
X
X  /*
X!  * Usage: ast [flags] [file] [symbolfile]
X   *
X   * flags:
X   *    -x    do not preserve local symbols
X   *    -X    preserve local symbols except for those whose name begin
X!  *        with 'I' or 'L', these are compiler generated.
X   *
X   *    -    when no symbol file is present, symbol.out is assumed.
X   *    -    when no file is present, a.out is assumed.
X--- 16,27 ----
X   */
X
X  /*
X!  * ast [flags] [file] [symbolfile]
X   *
X   * flags:
X   *    -x    do not preserve local symbols
X   *    -X    preserve local symbols except for those whose name begin
X!  *        with 'I', these are compiler generated.
X   *
X   *    -    when no symbol file is present, symbol.out is assumed.
X   *    -    when no file is present, a.out is assumed.
X***************
X*** 65,71 ****
X          else if (**argv == 'X') X_flag = 1;
X          else {
X              fprintf(stderr, "illegal flag: -%c\n", **argv);
X!             Exit(-1);
X          }
X          argv++;
X      }
X--- 64,70 ----
X          else if (**argv == 'X') X_flag = 1;
X          else {
X              fprintf(stderr, "illegal flag: -%c\n", **argv);
X!             exit(-1);
X          }
X          argv++;
X      }
X***************
X*** 78,110 ****
X          argv++;
X      }
X      if (*argv != NULL) {
X!         fprintf(stderr, "Usage: ast [-xX] [file] [symbolfile]\n");
X!         Exit(-1);
X      }
X      if (o_file == NULL) o_file = A_OUT;
X      o_fd = fopen(o_file, "a");
X      if (o_fd == NULL) {
X          fprintf(stderr, "can't open %s\n", o_file);
X!         Exit(-1);
X      }
X      if (s_file == NULL) s_file = SYMBOL_FILE;
X      s_fd = fopen(s_file, "r");
X      if (s_fd == NULL) {
X          fprintf(stderr, "can't open %s\n", s_file);
X!         Exit(-1);
X      }
X      setbuf(s_fd, io_buf);
X      ast(s_fd, o_fd);
X!     Exit(0);
X  }
X
X- Exit(val)
X- int val;
X- {
X-     _cleanup();
X-     exit(val);
X- }
X-
X  ast(s_fd, o_fd)
X  FILE *s_fd, *o_fd;
X  {
X--- 77,102 ----
X          argv++;
X      }
X      if (*argv != NULL) {
X!         fprintf(stderr, "Usage: ast [-{x,X}] [file] [symbolfile]\n");
X!         exit(-1);
X      }
X      if (o_file == NULL) o_file = A_OUT;
X      o_fd = fopen(o_file, "a");
X      if (o_fd == NULL) {
X          fprintf(stderr, "can't open %s\n", o_file);
X!         exit(-1);
X      }
X      if (s_file == NULL) s_file = SYMBOL_FILE;
X      s_fd = fopen(s_file, "r");
X      if (s_fd == NULL) {
X          fprintf(stderr, "can't open %s\n", s_file);
X!         exit(-1);
X      }
X      setbuf(s_fd, io_buf);
X      ast(s_fd, o_fd);
X!     exit(0);
X  }
X
X  ast(s_fd, o_fd)
X  FILE *s_fd, *o_fd;
X  {
X***************
X*** 126,132 ****
X  FILE *fd;
X  char *buffer;
X  {
X!     char ch;
X      char *buf1;
X
X      buf1 = buffer;
X--- 118,124 ----
X  FILE *fd;
X  char *buffer;
X  {
X!     int ch;
X      char *buf1;
X
X      buf1 = buffer;
X***************
X*** 185,197 ****
X
X      if (buffer[1] != ' ') {
X          fprintf(stderr, "illegal file format\n");
X!         Exit(-1);
X      }
X      symbol->n_value = get_value(buffer + 2);
X
X      if (buffer[6] != ' ') {
X          fprintf(stderr, "illegal file format\n");
X!         Exit(-1);
X      }
X      get_name(buffer + 7, symbol->n_name);
X      return(0);    /* yeah, found a symbol */
X--- 177,189 ----
X
X      if (buffer[1] != ' ') {
X          fprintf(stderr, "illegal file format\n");
X!         exit(-1);
X      }
X      symbol->n_value = get_value(buffer + 2);
X
X      if (buffer[6] != ' ') {
X          fprintf(stderr, "illegal file format\n");
X!         exit(-1);
X      }
X      get_name(buffer + 7, symbol->n_name);
X      return(0);    /* yeah, found a symbol */
X***************
X*** 203,214 ****
X  {
X      if (!(symbol->n_sclass & C_EXT)) {    /* local symbol */
X          if (x_flag) return;
X!         if (X_flag && (symbol->n_name[0] == 'I' ||
X!                    symbol->n_name[0] == 'L')) return;
X      }
X      if (fwrite(symbol, sizeof(struct nlist), 1, fd) != 1) {
X          fprintf(stderr, "can't write %s\n", o_file);
X!         Exit(-1);
X      }
X      nr_symbols++;
X  }
X--- 195,206 ----
X  {
X      if (!(symbol->n_sclass & C_EXT)) {    /* local symbol */
X          if (x_flag) return;
X!         if (X_flag && symbol->n_name[0] == 'I') return;
X!         if (X_flag && symbol->n_name[0] == 'L') return;
X      }
X      if (fwrite(symbol, sizeof(struct nlist), 1, fd) != 1) {
X          fprintf(stderr, "can't write %s\n", o_file);
X!         exit(-1);
X      }
X      nr_symbols++;
X  }
X***************
X*** 238,244 ****
X      if (ch >= 'a' && ch <= 'f')
X          return (ch - 'a' + 10);
X      fprintf(stderr, "illegal file format\n");
X!     Exit(-1);
X  }
X
X  get_name(str1, str2)
X--- 230,236 ----
X      if (ch >= 'a' && ch <= 'f')
X          return (ch - 'a' + 10);
X      fprintf(stderr, "illegal file format\n");
X!     exit(-1);
X  }
X
X  get_name(str1, str2)
X***************
X*** 263,277 ****
X      fd = open(o_file, 0);
X      if (read(fd, &header, sizeof(struct exec)) != sizeof(struct exec)) {
X          fprintf(stderr, "%s: no executable file\n", o_file);
X!         Exit(-1);
X      }
X      if (BADMAG(header)) {
X          fprintf(stderr, "%s: bad header\n", o_file);
X!         Exit(-1);
X      }
X      if (header.a_syms != 0L) {
X          fprintf(stderr, "%s: symbol table is installed\n", o_file);
X!         Exit(-1);
X      }
X      fseek(o_fd, A_SYMPOS(header), 0);
X      nr_symbols = 0;
X--- 255,269 ----
X      fd = open(o_file, 0);
X      if (read(fd, &header, sizeof(struct exec)) != sizeof(struct exec)) {
X          fprintf(stderr, "%s: no executable file\n", o_file);
X!         exit(-1);
X      }
X      if (BADMAG(header)) {
X          fprintf(stderr, "%s: bad header\n", o_file);
X!         exit(-1);
X      }
X      if (header.a_syms != 0L) {
X          fprintf(stderr, "%s: symbol table is installed\n", o_file);
X!         exit(-1);
X      }
X      fseek(o_fd, A_SYMPOS(header), 0);
X      nr_symbols = 0;
X***************
X*** 281,291 ****
X  redo_header(fd)
X  FILE *fd;
X  {
X!     header.a_syms = nr_symbols * sizeof(struct nlist);
X      fseek(fd, 0L, 0);
X      if (fwrite(&header, sizeof(header), 1, fd) != 1) {
X          fprintf(stderr, "%s: can't write\n", o_file);
X!         Exit(-1);
X      }
X  }
X
X--- 273,283 ----
X  redo_header(fd)
X  FILE *fd;
X  {
X!     header.a_syms = (long) (nr_symbols * sizeof(struct nlist));
X      fseek(fd, 0L, 0);
X      if (fwrite(&header, sizeof(header), 1, fd) != 1) {
X          fprintf(stderr, "%s: can't write\n", o_file);
X!         exit(-1);
X      }
X  }
X
+ END-OF-FILE ast.c.cdif
chmod 'u=rw,g=r,o=r' 'ast.c.cdif'
set `wc -c 'ast.c.cdif'`
count=$1
case $count in
6631)    :;;
*)    echo 'Bad character count in ''ast.c.cdif' >&2
        echo 'Count should be 6631' >&2
esac
echo Extracting 'at.c'
sed 's/^X//' > 'at.c' << '+ END-OF-FILE ''at.c'
X/* at - run a command at a specified time    Author: Jan Looyen */
X
X
X#define        DIR        "/usr/spool/at/
X#define        STARTDAY    0        /*  see ctime(3)    */
X#define        LEAPDAY        STARTDAY+59
X#define        MAXDAYNR    STARTDAY+365
X#define        NODAY        -2
X
X#include    <stdio.h>
X#include    <sys/types.h>
X#include    <time.h>
X
Xmain(argc, argv, envp)
Xint  argc;
Xchar **argv, **envp;
X{
X    int        i, count, ltim, year, getltim(), getlday(), lday = NODAY;
X    char    c, buf[10], job[30], *dp, *sp;
X    struct tm    *p, *localtime();
X    long    clock;
X    FILE    *fp, *pin, *popen();
X
X/*-------------------------------------------------------------------------*
X *    check arguments    & pipe to "pwd"                           *
X *-------------------------------------------------------------------------*/
X    if (argc < 2 || argc > 5) {
X    fprintf(stderr, "Usage: %s time [month day] [file]\n", argv[0]);
X    exit(1);
X    }
X    if ((ltim = getltim(argv[1])) == -1) {
X    fprintf(stderr, "%s: wrong time specification\n", argv[0]);
X    exit(1);
X    }
X    if ((argc==4 || argc==5) && (lday = getlday(argv[2], argv[3]))==-1) {
X    fprintf(stderr, "%s: wrong date specification\n", argv[0]);
X    exit(1);
X    }
X    if ((argc==3 || argc==5) && open(argv[argc-1], 0) == -1) {
X    fprintf(stderr, "%s: cannot find: %s\n", argv[0], argv[argc-1]);
X    exit(1);
X    }
X    if ((pin = popen("pwd", "r")) == NULL) {
X    fprintf(stderr, "%s: cannot open pipe to cmd 'pwd'\n", argv[0]);
X    exit(1);
X    }
X/*-------------------------------------------------------------------------*
X *    determine execution time and create 'at' job file           *
X *-------------------------------------------------------------------------*/
X    time(&clock);
X    p = localtime(&clock);
X    year = p->tm_year;
X    if (lday==NODAY) {                   /* no [month day] given */
X    lday = p->tm_yday;
X    if (ltim <= (p->tm_hour*100 + p->tm_min)) {
X        lday++;
X        if (lday==MAXDAYNR && (year%4) || lday==MAXDAYNR+1) {
X        lday = STARTDAY;
X        year++;
X        }
X    }
X    }
X    else
X    switch (year%4) {
X        case 0: if (lday < p->tm_yday || lday == p->tm_yday &&
X            ltim <= (p->tm_hour*100 + p->tm_min)      ) {
X            year++;
X            if (lday > LEAPDAY) lday-- ;
X            }
X            break;
X        case 1:
X        case 2: if (lday > LEAPDAY) lday-- ;
X            if (lday < p->tm_yday || lday == p->tm_yday &&
X            ltim <= (p->tm_hour*100 + p->tm_min)      )
X            year++;
X            break;
X        case 3: if (lday < ((lday > LEAPDAY) ? p->tm_yday+1 : p->tm_yday) ||
X            lday== ((lday > LEAPDAY) ? p->tm_yday+1 : p->tm_yday) &&
X            ltim <= (p->tm_hour*100 + p->tm_min)            )
X            year++;
X            else if (lday > LEAPDAY) lday--;
X            break;
X    }
X    sprintf(job, DIR%02d.%03d.%04d.%02d", year%100, lday, ltim, getpid()%100);
X    if ((fp = fopen(job, "w")) == NULL) {
X    fprintf(stderr, "%s: cannot create %s\n", argv[0], job);
X    exit(1);
X    }
X/*-------------------------------------------------------------------------*
X *    write environment and command(s) to 'at'job file           *
X *-------------------------------------------------------------------------*/
X    while (envp[i] != NULL) {
X    count = 1;
X    dp = buf;
X    sp = envp[i];
X    while ((*dp++ = *sp++) != '=')
X        count++;
X    *--dp = '\0';
X    fprintf(fp, "export %s; %s='%s'\n", buf, buf, &envp[i++][count]);
X    }
X    fprintf(fp, "cd ");
X    while ((c = getc(pin)) != EOF)
X    putc(c, fp);
X    fprintf(fp, "umask %o\n", umask());
X    if (argc==3 || argc==5)
X    fprintf(fp, "%s\n", argv[argc-1]);
X    else                          /* read from stdinput */
X    while ((c = getchar()) != EOF)
X        putc(c, fp);
X
X    printf("%s: %s created\n", argv[0], job);
X    exit(0);
X}
X
X/*-------------------------------------------------------------------------*
X *    getltim()        return((time OK) ? daytime : -1)       *
X *-------------------------------------------------------------------------*/
Xgetltim(t)
Xchar *t;
X{
X    if (t[4] == '\0' && t[3] >= '0' && t[3] <= '9' &&
X        t[2] >= '0'  && t[2] <= '5' && t[1] >= '0' && t[1] <= '9' &&
X        (t[0] == '0' || t[0] == '1' || t[1] <= '3' && t[0] == '2')   )
X    return(atoi(t));
X    else
X    return(-1);
X}
X
X/*-------------------------------------------------------------------------*
X *    getlday()        return ((date OK) ? yearday : -1)       *
X *-------------------------------------------------------------------------*/
Xgetlday(m, d)
Xchar *m, *d;
X{
X    int i, month, day, im;
X    static int cumday[] = { 0, 0, 31, 60, 91, 121, 152,
X               182, 213, 244, 274, 305, 335 };
X    static struct date {
X       char *mon;
X       int dcnt;
X    }   *pc,
X        kal[] = { "Jan", 31, "Feb", 29, "Mar", 31, "Apr", 30,
X          "May", 31, "Jun", 30, "Jul", 31, "Aug", 31,
X          "Sep", 30, "Oct", 31, "Nov", 30, "Dec", 31
X        };
X
X    pc = kal;
X    im = (digitstring(m)) ? atoi(m) : 0;
X    m[0] &= 0337;
X    for (i = 1; i < 13 && strcmp(m, pc->mon) && im != i; i++, pc++)
X    ;
X    if (i < 13 && (day=(digitstring(d)) ? atoi(d) : 0) && day <= pc->dcnt) {
X    if (!STARTDAY) day--;
X    return(day + cumday[i]);
X    }
X    else
X    return(-1);
X}
X
X
X
Xdigitstring(s)
Xchar *s;
X{
X    while (*s >= '0' && *s <= '9')
X    s++;
X    return((*s=='\0') ? 1 : 0);
X}
X
+ END-OF-FILE at.c
chmod 'u=rw,g=r,o=r' 'at.c'
set `wc -c 'at.c'`
count=$1
case $count in
4941)    :;;
*)    echo 'Bad character count in ''at.c' >&2
        echo 'Count should be 4941' >&2
esac
echo Extracting 'banner.c.new'
sed 's/^X//' > 'banner.c.new' << '+ END-OF-FILE ''banner.c.new'
X/* banner - print a banner        Author: Brian Wallis */
X
X/*****************************************************************
X *
X * SYSVbanner.c
X *
X * This is a PD version of the SYS V banner program (at least I think
X * it is compatible to SYS V) which I wrote to use with the clock
X * program written by:
X **     DCF, Inc.
X **     14623 North 49th Place
X **     Scottsdale, AZ 85254
X * and published in the net comp.sources.misc newsgroup in early July
X * since the BSD banner program works quite differently.
X *
X * There is no copyright or responsibility accepted for the use
X * of this software.
X *
X * Brian Wallis, brw@jim.odr.oz, 4 July 1988
X *
X *****************************************************************/
X
X#include <stdio.h>
X
Xchar *glyphs[] = {
X"         @@@  @@@ @@@  @ @   @@@@@ @@@   @  @@     @@@  ",
X"         @@@  @@@ @@@  @ @  @  @  @@ @  @  @  @    @@@   ",
X"         @@@   @   @ @@@@@@@@  @   @@@ @    @@      @   ",
X"          @            @ @   @@@@@    @    @@@     @    ",
X"                     @@@@@@@   @  @  @ @@@@   @ @       ",
X"         @@@           @ @  @  @  @ @  @ @@    @        ",
X"         @@@           @ @   @@@@@ @   @@@ @@@@ @       ",
X
X"   @@    @@                                            @",
X"  @        @   @   @    @                             @ ",
X" @          @   @ @     @                            @  ",
X" @          @ @@@ @@@ @@@@@   @@@   @@@@@           @   ",
X" @          @   @ @     @     @@@           @@@    @    ",
X"  @        @   @   @    @      @            @@@   @     ",
X"   @@    @@                   @             @@@  @      ",
X
X"  @@@     @    @@@@@  @@@@@ @      @@@@@@@ @@@@@ @@@@@@@",
X" @   @   @@   @     @@     @@    @ @      @     @@    @ ",
X"@ @   @ @ @         @      @@    @ @      @          @  ",
X"@  @  @   @    @@@@@  @@@@@ @@@@@@@ @@@@@ @@@@@@    @   ",
X"@   @ @   @   @            @     @       @@     @  @    ",
X" @   @    @   @      @     @     @ @     @@     @  @    ",
X"  @@@   @@@@@ @@@@@@@ @@@@@      @  @@@@@  @@@@@   @    ",
X
X" @@@@@  @@@@@    @     @@@      @           @     @@@@@ ",
X"@     @@     @  @ @    @@@     @             @   @     @",
X"@     @@     @   @            @     @@@@@     @        @",
X" @@@@@  @@@@@@         @@@   @                 @     @@ ",
X"@     @      @   @     @@@    @     @@@@@     @     @   ",
X"@     @@     @  @ @     @      @             @          ",
X" @@@@@  @@@@@    @     @        @           @       @   ",
X
X" @@@@@    @   @@@@@@  @@@@@ @@@@@@ @@@@@@@@@@@@@@ @@@@@ ",
X"@     @  @ @  @     @@     @@     @@      @      @     @",
X"@ @@@ @ @   @ @     @@      @     @@      @      @      ",
X"@ @ @ @@     @@@@@@@ @      @     @@@@@@  @@@@@  @  @@@@",
X"@ @@@@ @@@@@@@@     @@      @     @@      @      @     @",
X"@     @@     @@     @@     @@     @@      @      @     @",
X" @@@@@ @     @@@@@@@  @@@@@ @@@@@@ @@@@@@@@       @@@@@ ",
X
X"@     @  @*@        @@    @ @      @     @@     @@@@@@@@",
X"@     @   @         @@   @  @      @@   @@@@    @@     @",
X"@     @   @         @@  @   @      @ @ @ @@ @   @@     @",
X"@@@@@@@   @         @@@@    @      @  @  @@  @  @@     @",
X"@     @   @   @     @@  @   @      @     @@   @ @@     @",
X"@     @   @   @     @@   @  @      @     @@    @@@     @",
X"@     @  @@@   @@@@@ @    @ @@@@@@@@     @@     @@@@@@@@",
X
X"@@@@@@  @@@@@ @@@@@@  @@@@@ @@@@@@@@     @@     @@     @",
X"@     @@     @@     @@     @   @   @     @@     @@  @  @",
X"@     @@     @@     @@         @   @     @@     @@  @  @",
X"@@@@@@ @     @@@@@@@  @@@@@    @   @     @@     @@  @  @",
X"@      @   @ @@   @        @   @   @     @ @   @ @  @  @",
X"@      @    @ @    @ @     @   @   @     @  @ @  @  @  @",
X"@       @@@@ @@     @ @@@@@    @    @@@@@    @    @@ @@ ",
X
X"@     @@     @@@@@@@@ @@@@@ @       @@@@@    @          ",
X" @   @  @   @      @  @      @          @   @ @         ",
X"  @ @    @ @      @   @       @         @  @   @        ",
X"   @      @      @    @        @        @               ",
X"  @ @     @     @     @         @       @               ",
X" @   @    @    @      @          @      @               ",
X"@     @   @   @@@@@@@ @@@@@       @ @@@@@        @@@@@@@",
X
X"  @@@                                                   ",
X"  @@@     @@   @@@@@   @@@@  @@@@@  @@@@@@ @@@@@@  @@@@ ",
X"   @     @  @  @    @ @    @ @    @ @      @      @    @",
X"    @   @    @ @@@@@  @      @    @ @@@@@  @@@@@  @     ",
X"        @@@@@@ @    @ @      @    @ @      @      @  @@@",
X"        @    @ @    @ @    @ @    @ @      @      @    @",
X"        @    @ @@@@@   @@@@  @@@@@  @@@@@@ @       @@@@ ",
X
X"                                                        ",
X" @    @    @        @ @    @ @      @    @ @    @  @@@@ ",
X" @    @    @        @ @   @  @      @@  @@ @@   @ @    @",
X" @@@@@@    @        @ @@@@   @      @ @@ @ @ @  @ @    @",
X" @    @    @        @ @  @   @      @    @ @  @ @ @    @",
X" @    @    @   @    @ @   @  @      @    @ @   @@ @    @",
X" @    @    @    @@@@  @    @ @@@@@@ @    @ @    @  @@@@ ",
X
X"                                                        ",
X" @@@@@   @@@@  @@@@@   @@@@   @@@@@ @    @ @    @ @    @",
X" @    @ @    @ @    @ @         @   @    @ @    @ @    @",
X" @    @ @    @ @    @  @@@@     @   @    @ @    @ @    @",
X" @@@@@  @  @ @ @@@@@       @    @   @    @ @    @ @ @@ @",
X" @      @   @  @   @  @    @    @   @    @  @  @  @@  @@",
X" @       @@@ @ @    @  @@@@     @    @@@@    @@   @    @",
X
X"                       @@@     @     @@@   @@    @ @ @ @",
X" @    @  @   @ @@@@@@ @        @        @ @  @  @ @ @ @ ",
X"  @  @    @ @      @  @        @        @     @@ @ @ @ @",
X"   @@      @      @  @@                 @@        @ @ @ ",
X"   @@      @     @    @        @        @        @ @ @ @",
X"  @  @     @    @     @        @        @         @ @ @ ",
X" @    @    @   @@@@@@  @@@     @     @@@         @ @ @ @"};
X
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X  int a,b,c,len,ind;
X  char line[80];
X
X  for(argv++;--argc;argv++){
X    len=strlen(*argv);
X    if(len>10)
X      len=10;
X    for(a=0;a<7;a++){
X      for(b=0;b<len;b++){
X        if((ind=(*argv)[b]-' ')<0)
X          ind=0;
X        for(c=0;c<7;c++){
X          line[b*8+c] = glyphs[(ind/8*7)+a][(ind%8*7)+c];
X        }
X        line[b*8+7] = ' ';
X      }
X      for(b=len*8-1;b>=0;b--){
X        if(line[b]!=' ')
X          break;
X        line[b]='\0';
X      }
X      printf("%s\n", line);
X    }
X    printf("\n");
X  }
X}
+ END-OF-FILE banner.c.new
chmod 'u=rw,g=r,o=r' 'banner.c.new'
set `wc -c 'banner.c.new'`
count=$1
case $count in
6370)    :;;
*)    echo 'Bad character count in ''banner.c.new' >&2
        echo 'Count should be 6370' >&2
esac
echo Extracting 'cc.c.cdif'
sed 's/^X//' > 'cc.c.cdif' << '+ END-OF-FILE ''cc.c.cdif'
X*** /local/ast/minix/tape3b/commands/cc.c    Wed Jul 13 13:10:43 1988
X--- cc.c    Sun Sep 25 15:24:45 1988
X***************
X*** 1,23 ****
X! /*
X!     Driver for the CEMCOM compiler.
X!     Derived from: "cem.c,v 1.5 86/01/20 11:10:29 erikb Exp"
X!     Author: Erik Baalbergen
X
X!     Log:
X!     Date written: Dec 4, 1985
X!     Adapted for PC/IX on Jan 20, 1986
X!     Strongly reduced (May 14, 1986)
X!     Piping output from cpp into cem (Jul 30, 1986)
X!     Create temporary files in TMP directory (Aug 6, 1986)
X!     Pass hint for optimization to cg (Aug 15, 1986)
X!     Throw away intermediate files on interrupts (Aug 15, 1986)
X!     Print file name if there are more than one source files (Sep 22, 1986)
X!     Various minor corrections for MINIX (Mar 18, 1987)
X! */
X!
X  #include <errno.h>
X  #include <signal.h>
X
X  #define MAXARGC    64    /* maximum number of arguments allowed in a list */
X  #define USTR_SIZE    64    /* maximum length of string variable */
X
X--- 1,31 ----
X! /* cc - call the C compiler        Author: Erik Baalbergen */
X
X! #ifndef MEM640K
X! #ifndef MEM512K
X! #ifndef RAMDISK
X! #error !!! AH HA!  I HAVE YOUR ATTENTION!
X! /* This is not an error.  It is a dirty trick to force the user to read this
X!  * comment.  The program cc calls the various passes of the compiler.  To
 call
X!  * them, it must know where they are.  On the 640K PC MINIX, cpp and cem are
X!  * kept in /lib, on the root device.  Thus the symbol PP is defined as
X!  * /lib/cpp, etc.  On the 512K AT, there is no room on the root device, so
 cpp
X!  * and cem are kept in /usr/lib, which means that PP must be /usr/lib/cpp,
X!  * etc.  One of the following two definitions must be uncommented, to
X!  * generate the right paths.  For 640K machines (PCs or ATs), MEM640K should
X!  * be defined.  For 512K machines, MEM512K should be defined.  On ATs with a
X!  * large RAM disk in extended memory, put the whole compiler on the RAM disk
X!  * and define RAMDISK.
X!  */
X! #endif
X! #endif
X! #endif
X!
X!
X  #include <errno.h>
X  #include <signal.h>
X
X+ #define SYMBOL_FILE    "symbol.out"        /* symbol table for prof */
X+
X  #define MAXARGC    64    /* maximum number of arguments allowed in a list */
X  #define USTR_SIZE    64    /* maximum length of string variable */
X
X***************
X*** 28,48 ****
X      char *al_argv[MAXARGC];
X  };
X
X- !!! AH HA!  I HAVE YOUR ATTENTION!
X- /* This is not an error.  It is a dirty trick to force the user to read this
X-  * comment.  The program cc calls the various passes of the compiler.  To
 call
X-  * them, it must know where they are.  On the 640K PC MINIX, cpp and cem are
X-  * kept in /lib, on the root device.  Thus the symbol PP is defined as
X-  * /lib/cpp, etc.  On the 512K AT, there is no room on the root device, so
 cpp
X-  * and cem are kept in /usr/lib, which means that PP must be /usr/lib/cpp,
X-  * etc.  One of the following two definitions must be uncommented, to
X-  * generate the right paths.  For 640K machines (PCs or Ats), MEM640K should
X-  * be defined.  For 512K machines, MEM512K should be defined.
X-  */
X
X- /* #define MEM640K */
X- /* #define MEM512K */
X-
X  #ifdef MEM640K
X  /* MINIX paths for 640K PC (not 512K AT) */
X  char *PP     = "/lib/cpp";
X--- 36,42 ----
X***************
X*** 50,55 ****
X--- 44,50 ----
X  char *OPT    = "/usr/lib/opt";
X  char *CG     = "/usr/lib/cg";
X  char *ASLD   = "/usr/bin/asld";
X+ char *AST    = "/usr/bin/ast";
X  char *SHELL  = "/bin/sh";
X  char *LIBDIR = "/usr/lib";
X  #endif
X***************
X*** 61,88 ****
X  char *OPT    = "/usr/lib/opt";
X  char *CG     = "/usr/lib/cg";
X  char *ASLD   = "/usr/bin/asld";
X  char *SHELL  = "/bin/sh";
X  char *LIBDIR = "/usr/lib";
X  #endif
X
X! struct arglist LD_HEAD = {
X!     1,
X!     {
X!         "/usr/lib/crtso.s",
X!     }
X! };
X
X! struct arglist LD_TAIL = {
X!     2,
X!     {
X!         "/usr/lib/libc.a",
X!         "/usr/lib/end.s"
X!     }
X! };
X
X
X  char *o_FILE = "a.out"; /* default name for executable file */
X
X  #define remove(str)    (unlink(str), (str)[0] = '\0')
X  #define cleanup(str)        (str && remove(str))
X  #define init(al)        (al)->al_argc = 1
X--- 56,95 ----
X  char *OPT    = "/usr/lib/opt";
X  char *CG     = "/usr/lib/cg";
X  char *ASLD   = "/usr/bin/asld";
X+ char *AST    = "/usr/bin/ast";
X  char *SHELL  = "/bin/sh";
X  char *LIBDIR = "/usr/lib";
X  #endif
X
X! #ifdef RAMDISK
X! /* MINIX paths for RAM disk (mostly PC/ATs with large extended memory */
X! char *PP     = "/lib/cpp";
X! char *CEM    = "/lib/cem";
X! char *OPT    = "/lib/opt";
X! char *CG     = "/lib/cg";
X! char *ASLD   = "/bin/asld";
X! char *AST    = "/bin/ast";
X! char *SHELL  = "/bin/sh";
X! char *LIBDIR = "/lib";
X! #endif
X
X! #ifdef RAMDISK
X! struct arglist LD_HEAD =    {1, { "/lib/crtso.s" } };
X! struct arglist M_LD_HEAD =  {1, { "/lib/mrtso.s" } };
X! struct arglist LD_TAIL =    {2, { "/lib/libc.a", "/lib/end.s" } };
X! #else
X! struct arglist LD_HEAD =    {1, { "/usr/lib/crtso.s" } };
X! struct arglist M_LD_HEAD =  {1, { "/usr/lib/mrtso.s" } };
X! struct arglist LD_TAIL =    {2, { "/usr/lib/libc.a", "/usr/lib/end.s" } };
X! #endif
X
X
X+
X  char *o_FILE = "a.out"; /* default name for executable file */
X
X+ #define AST_FLAGS    "-X"
X+ #define AST_TAIL    "symbol.out"
X+
X  #define remove(str)    (unlink(str), (str)[0] = '\0')
X  #define cleanup(str)        (str && remove(str))
X  #define init(al)        (al)->al_argc = 1
X***************
X*** 112,117 ****
X--- 119,126 ----
X  int S_flag = 0;
X  int v_flag = 0;
X  int F_flag = 0;    /* use pipes by default */
X+ int s_flag = 0;
X+ int p_flag = 0;    /* profil flag */
X
X  char *mkstr();
X  char *alloc();
X***************
X*** 141,146 ****
X--- 150,156 ----
X  main(argc, argv)
X      char *argv[];
X  {
X+     register char *f;
X      char *str;
X      char **argvec;
X      int count;
X***************
X*** 199,208 ****
X              append(&ASLD_FLAGS, str);
X              /*FALLTHROUGH*/
X          case 'R':
X-         case 'p':
X          case 'w':
X              append(&CEM_FLAGS, str);
X              break;
X          case 'L':
X              if (strcmp(&str[1], "LIB") == 0) {
X                  append(&OPT_FLAGS, "-L");
X--- 209,224 ----
X              append(&ASLD_FLAGS, str);
X              /*FALLTHROUGH*/
X          case 'R':
X          case 'w':
X              append(&CEM_FLAGS, str);
X              break;
X+         case 's':
X+             s_flag = 1;
X+             break;
X+         case 'p':
X+             p_flag = 1;
X+             s_flag = 1;
X+             break;
X          case 'L':
X              if (strcmp(&str[1], "LIB") == 0) {
X                  append(&OPT_FLAGS, "-L");
X***************
X*** 221,230 ****
X      argvec = &(SRCFILES.al_argv[0]);
X
X      while (count-- > 0) {
X-         register char *f;
X          basename(file = *argvec++, BASE);
X
X!         if (SRCFILES.al_argc > 1) {
X              write(1, file, strlen(file));
X              write(1, ":\n", 2);
X          }
X--- 237,245 ----
X      argvec = &(SRCFILES.al_argv[0]);
X
X      while (count-- > 0) {
X          basename(file = *argvec++, BASE);
X
X!         if (v_flag && SRCFILES.al_argc > 1) {
X              write(1, file, strlen(file));
X              write(1, ":\n", 2);
X          }
X***************
X*** 333,350 ****
X          init(call);
X          append(call, ASLD);
X          concat(call, &ASLD_FLAGS);
X          append(call, "-o");
X          append(call, o_FILE);
X!         concat(call, &LD_HEAD);
X          concat(call, &LDFILES);
X          concat(call, &LD_TAIL);
X!         if (runvec(call, (char *)0)) {
X              register i = GEN_LDFILES.al_argc;
X
X              while (i-- > 0)
X                  remove(GEN_LDFILES.al_argv[i]);
X
X          }
X      }
X      return(RET_CODE);
X  }
X--- 348,380 ----
X          init(call);
X          append(call, ASLD);
X          concat(call, &ASLD_FLAGS);
X+         if (s_flag) append(call, "-s");
X          append(call, "-o");
X          append(call, o_FILE);
X!         if (p_flag)
X!             concat(call, &M_LD_HEAD);
X!         else    concat(call, &LD_HEAD);
X          concat(call, &LDFILES);
X          concat(call, &LD_TAIL);
X!         if (s_flag)
X!             f = SYMBOL_FILE;
X!         else    f = (char *) 0;
X!         if (runvec(call, f)) {
X              register i = GEN_LDFILES.al_argc;
X
X              while (i-- > 0)
X                  remove(GEN_LDFILES.al_argv[i]);
X
X          }
X+     }
X+     /* add symbol table when p_flag is set */
X+     if (s_flag) {
X+         init(call);
X+         append(call, AST);
X+         append(call, AST_FLAGS);
X+         append(call, o_FILE);
X+         append(call, AST_TAIL);
X+         (void) runvec(call, (char *) 0);
X      }
X      return(RET_CODE);
X  }
+ END-OF-FILE cc.c.cdif
chmod 'u=rw,g=r,o=r' 'cc.c.cdif'
set `wc -c 'cc.c.cdif'`
count=$1
case $count in
7822)    :;;
*)    echo 'Bad character count in ''cc.c.cdif' >&2
        echo 'Count should be 7822' >&2
esac
echo Extracting 'cdiff.c.cdif'
sed 's/^X//' > 'cdiff.c.cdif' << '+ END-OF-FILE ''cdiff.c.cdif'
X*** /local/ast/minix/tape3b/commands/cdiff.c    Wed Jul 13 13:10:45 1988
X--- cdiff.c    Mon Sep 26 21:51:52 1988
X***************
X*** 3,21 ****
X  /* cdiff - turns a regular diff into a new-style context diff
X   *
X   * Usage: cdiff file1 file2
X-  *
X-  * $Log:    cdiff.c,v $
X-  * Revision 1.1.1.2  87/06/04  11:21:43  lwall
X-  * Didn't do diffs with less than 3 lines of leading context.
X-  *
X-  * Revision 1.1.1.1  87/06/03  11:52:25  lwall
X-  * Wasn't concatenating overlapping hunks right.
X-  *
X-  * Revision 1.1  87/06/01  16:05:57  lwall
X-  * Initial revision
X-  *
X   */
X- static char rcsid[] = "$Header: cdiff.c,v 1.1.1.2 87/06/04 11:21:43 lwall Exp
 $";
X
X  #define PATCHLEVEL 2
X
X--- 3,9 ----
X***************
X*** 27,32 ****
X--- 15,21 ----
X  char buff[512];
X
X  FILE *inputfp, *oldfp, *newfp;
X+ char *ctime();
X
X  int oldmin, oldmax, newmin, newmax;
X  int oldbeg, oldend, newbeg, newend;
X***************
X*** 70,79 ****
X      for (argc--,argv++; argc; argc--,argv++) {
X      if (argv[0][0] != '-')
X          break;
X!     if (argv[0][1] == 'v') {
X!         printf("%s\n    Patch level: %d\n",rcsid,PATCHLEVEL);
X!         exit(0);
X!     }
X      if (argv[0][1] == 'c')
X          context = atoi(argv[0]+2);
X      }
X--- 59,65 ----
X      for (argc--,argv++; argc; argc--,argv++) {
X      if (argv[0][0] != '-')
X          break;
X!
X      if (argv[0][1] == 'c')
X          context = atoi(argv[0]+2);
X      }
+ END-OF-FILE cdiff.c.cdif
chmod 'u=rw,g=r,o=r' 'cdiff.c.cdif'
set `wc -c 'cdiff.c.cdif'`
count=$1
case $count in
1360)    :;;
*)    echo 'Bad character count in ''cdiff.c.cdif' >&2
        echo 'Count should be 1360' >&2
esac
echo Extracting 'chgrp.c.cdif'
sed 's/^X//' > 'chgrp.c.cdif' << '+ END-OF-FILE ''chgrp.c.cdif'
X*** /local/ast/minix/tape3b/commands/chgrp.c    Wed Jul 13 13:10:45 1988
X--- chgrp.c    Sun Sep 25 15:24:46 1988
X***************
X*** 5,12 ****
X  #include <sys/stat.h>
X  #include <stdio.h>
X
X- extern lseek();
X-
X  main (argc, argv)
X  int   argc;
X  char *argv[];
X--- 5,10 ----
+ END-OF-FILE chgrp.c.cdif
chmod 'u=rw,g=r,o=r' 'chgrp.c.cdif'
set `wc -c 'chgrp.c.cdif'`
count=$1
case $count in
270)    :;;
*)    echo 'Bad character count in ''chgrp.c.cdif' >&2
        echo 'Count should be 270' >&2
esac
echo Extracting 'chmod.c'
sed 's/^X//' > 'chmod.c' << '+ END-OF-FILE ''chmod.c'
X/*
X *  chmod.c             Author: James da Silva
X *                              (ihnp4!killer!jaime)
X *
X *  a (hopefully) 7th Edition Unix compatible chmod for Minix.
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#define isop(c)         ((c=='+')||(c=='-')||(c=='='))
X#define isperm(c)       ((c=='r')||(c=='w')||(c=='x')||(c=='s')||(c=='t')||\
X                         (c=='u')||(c=='g')||(c=='o'))
X
X/* the bits associated with user, group, other */
X
X#define U_MSK   (0700 | S_ISUID)
X#define G_MSK   (0070 | S_ISGID)
X#define O_MSK    0007
X
Xtypedef unsigned short bitset;  /* type used for modes */
X
Xstruct stat st;         /* structure returned by stat() */
Xchar *pname, *arg;
Xbitset newmode, absolute(), symbolic();
Xint isabsolute;
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X    int i;
X
X    pname = *(argv++);
X    if(argc < 3) usage();
X
X    arg = *argv;        /* save pointer to mode arg */
X
X    /* check for octal mode */
X
X    if( isabsolute = ((*arg>='0') && (*arg<='7')) )
X        newmode = absolute();
X
X    /* apply the mode to all files listed */
X
X    for(i=2; i<argc; i++)
X    {
X        argv++;
X        if(stat(*argv, &st))    /* get current file mode */
X        {
X            printf("%s: cannot find `%s'\n", pname, *argv);
X            exit(1);
X        }
X
X        /* calculate new mode for this file */
X
X        if( !isabsolute )
X            newmode = symbolic(st.st_mode);
X
X        if(chmod(*argv, newmode))  /* change the mode */
X        {
X            printf("%s: cannot chmod `%s'\n", pname, *argv);
X            exit(1);
X        }
X    }
X}
X
X
X/*
X * absolute
X *
X * Interprets an octal mode.
X * The file modes will be set to this value.
X */
Xbitset absolute()
X{
X    bitset m;
X    char *s;
X
X    m = 0;
X    s = arg;
X
X    /* convert octal string to integer */
X
X    while((*s>='0') && (*s<='7'))
X        m = m * 8 + (*(s++) - '0');
X
X    /* if something else is there, choke */
X
X    if(*s) badmode(s);
X
X    return m;
X}
X
X
X/*
X * symbolic
X *
X * Processes symbolic mode of the form (in EBNF):
X *      <symbolic> ::= <pgroup> { ',' <pgroup> }.
X *      <pgroup> ::= [ <who> ] <op> <permissions> { <op> <permissions> }.
X *
X *      <who> ::= <whoch> { <whoch> }.
X *      <whoch> ::= 'a' | 'u' | 'g' | 'o'.
X *
X *      <op> ::= '+' | '-' | '='.
X *
X *      <permissions> ::= <permch> { <permch> }.
X *      <permch> ::= 'r' | 'w' | 'x' | 's' | 't' | 'u' | 'g' | 'o'.
X *
X * If <who> is omitted, 'a' is assumed, BUT umask()ed bits are uneffected.
X * If <op> is '=', all unspecified permissions are turned off for this <who>.
X * For permissions 'u', 'g', and 'o', the permissions are taken from the
X * specified set.  i.e.  o=g sets the permissions for other the same as for
X * group.
X *
X * Pain in the duff, isn't it?
X */
Xbitset symbolic(mode)
Xbitset mode;
X{
X    int g,o,u, haswho, haspcopy;
X    bitset u_mask, emask, partial, other, applyop();
X    char *s, c, op;
X
X    s = arg;
X    u_mask = umask(0);  /* get the umasked bits */
X
X    do      /* pgroup */
X    {
X        haswho = u = g = o = 0;
X
X        while(!isop(*s))
X        {
X            /* we must have a 'who' then */
X            haswho = 1;
X            switch(*s)
X            {
X                case 'a': u=g=o=1; break;
X                case 'u': u = 1;   break;
X                case 'g': g = 1;   break;
X                case 'o': o = 1;   break;
X
X                default: badmode(s);
X            }
X            s++;
X        }
X
X        if(!haswho)
X        {
X            u=g=o=1;            /* assume all */
X            emask = ~u_mask;    /* effective umask */
X        }
X        else emask = ~0;
X
X
X        /* process each given operator */
X
X        while(isop(*s))
X        {
X            op = *(s++);
X            other = partial = haspcopy = 0;
X
X            /* collect the specified permissions */
X
X            while(isperm(*s))
X            {
X
X                /* Berkeley only allows one of 'u' 'g' or 'o' as permissions */
X
X                if((*s=='u')||(*s=='g')||(*s=='o'))
X                    if( haspcopy ) badmode(s);
X                    else haspcopy = 1;
X
X                switch(*s)
X                {
X                    case 'r': partial |= 4; break;
X                    case 'w': partial |= 2; break;
X                    case 'x': partial |= 1; break;
X
X                    case 'u': partial |= (mode & U_MSK &~S_ISUID) >> 6;
X                              other |= mode & S_ISUID;
X                              break;
X                    case 'g': partial |= (mode & G_MSK &~S_ISGID) >> 3;
X                              other |= mode & S_ISGID;
X                              break;
X                    case 'o': partial |= (mode & O_MSK);
X                              break;
X
X
X                    case 't': other |= S_ISVTX; break;
X
X                    case 's': if(u) other |= S_ISUID;
X                              if(g) other |= S_ISGID;
X                              break;
X
X                    default: badmode(s);
X                }
X                s++;
X            }
X
X            /* apply the op using the affected bits and masks */
X
X            if(u)
X                mode = applyop(mode,op,(other | (partial << 6)),emask,U_MSK);
X            if(g)
X                mode = applyop(mode,op,(other | (partial << 3)),emask,G_MSK);
X            if(o)
X                mode = applyop(mode,op,(other | partial),emask,O_MSK);
X        }
X
X    } while(*(s++) == ',');
X
X    /* not at end - choke */
X
X    if(*(--s)) badmode(s);
X
X    return mode;
X}
X
X
X/*
X * applyop
X *
X * applies the operator to the current mode using the specified bitset
X * and mask.  'bits' will contain 1's in every bit affected by the
X * operator '+', '-', or '='.  In the case of '=', msk is used to
X * determine which bits will be forced off. 'emask' is the effective
X * umask.
X */
Xbitset applyop(mode, op, bits, emask, msk)
Xchar op;
Xbitset mode, bits, emask, msk;
X{
X    switch(op)
X    {
X        case '+': mode |= bits & emask;      /* turn these bits on */
X                  break;
X        case '-': mode &= ~(bits & emask);   /* turn these off */
X                  break;
X        case '=': mode |= bits & emask;      /* turn these bits on */
X                  mode &= ~(~bits & msk & emask);    /* others off */
X                  break;
X        default: /* should never get here (famous last words) */
X                printf("%s: panic: bad op `%c' passed\n", pname, op);
X    }
X    return mode;
X}
X
X
X/*
X * usage
X *
X * Prints a terse usage message and exits.
X */
Xusage()
X{
X    printf("Usage: %s [absolute-mode | symbolic-mode] files\n", pname);
X    exit(1);
X}
X
X
X/*
X * badmode
X *
X * Called when the parser chokes on the given mode.
X * Prints a message showing the offending character and exits.
X */
Xbadmode(s)
Xchar *s;
X{
X    int i,sp;
X    char buffer[80], *bp;
X
X    sp = s - arg + strlen(pname) + 21;
X    sp = sp > 79 ? 79 : sp;          /* check for buffer overflow */
X
X    for(i=0, bp = buffer; i<sp; i++, bp++) *bp = ' ';
X    *bp = '\0';
X
X    printf("%s: badly formed mode `%s'\n", pname, arg);
X    printf("%s^\n", buffer);
X    exit(1);
X}
X
+ END-OF-FILE chmod.c
chmod 'u=rw,g=r,o=r' 'chmod.c'
set `wc -c 'chmod.c'`
count=$1
case $count in
6964)    :;;
*)    echo 'Bad character count in ''chmod.c' >&2
        echo 'Count should be 6964' >&2
esac
echo Extracting 'chown.c.cdif'
sed 's/^X//' > 'chown.c.cdif' << '+ END-OF-FILE ''chown.c.cdif'
X*** /local/ast/minix/tape3b/commands/chown.c    Wed Jul 13 13:10:46 1988
X--- chown.c    Sun Sep 25 15:24:46 1988
X***************
X*** 1,9 ****
X! /*
X!  * chown username file ...
X!  *
X!  * By Patrick van Kleef
X!  *
X!  */
X
X  #include <pwd.h>
X  #include <sys/types.h>
X--- 1,4 ----
X! /* chown - change file ownership        Author: Patrick van Kleef */
X
X  #include <pwd.h>
X  #include <sys/types.h>
+ END-OF-FILE chown.c.cdif
chmod 'u=rw,g=r,o=r' 'chown.c.cdif'
set `wc -c 'chown.c.cdif'`
count=$1
case $count in
385)    :;;
*)    echo 'Bad character count in ''chown.c.cdif' >&2
        echo 'Count should be 385' >&2
esac
echo Extracting 'clr.c.cdif'
sed 's/^X//' > 'clr.c.cdif' << '+ END-OF-FILE ''clr.c.cdif'
X*** /local/ast/minix/tape3b/commands/clr.c    Wed Jul 13 13:10:46 1988
X--- clr.c    Sun Sep 25 15:24:47 1988
X***************
X*** 1,9 ****
X  /* clr - clear the screen        Author: Andy Tanenbaum */
X
X  main()
X! {
X! /* Clear the screen. */
X
X!   prints("\033[H\033[J");
X    exit(0);
X! }
X--- 1,46 ----
X  /* clr - clear the screen        Author: Andy Tanenbaum */
X
X+ /* Changed for termcap.       1988-Apr-2          efth         */
X+
X+
X+ #include <stdio.h>
X+
X+ #define  TC_BUFFER  1024    /* Size of termcap(3) buffer    */
X+
X+ extern char *getenv();
X+ extern char *tgetstr();
X+
X+ char  buffer[ TC_BUFFER ];
X+
X+
X  main()
X!   {
X!   char *term;
X!   char  clear[ 30 ];
X!   char *p = &clear[0];
X
X!   if ( (term = getenv( "TERM" )) == NULL )
X!     Error( "$TERM not defined" );
X!
X!   if ( tgetent( buffer, term ) != 1 )
X!     Error( "No termcap definition for $TERM" );
X!
X!   if ( (tgetstr( "cl", &p )) == NULL )
X!     Error( "No clear (cl) entry for $TERM" );
X!
X!   /*  Clear the screen  */
X!
X!   printf( "%s", clear );
X!
X    exit(0);
X!   }
X!
X!
X!
X! Error( str )
X!   char *str;
X!
X!   {
X!   fprintf( stderr, "clr: %s\n", str );
X!   exit( 1 );
X!   }
+ END-OF-FILE clr.c.cdif
chmod 'u=rw,g=r,o=r' 'clr.c.cdif'
set `wc -c 'clr.c.cdif'`
count=$1
case $count in
1140)    :;;
*)    echo 'Bad character count in ''clr.c.cdif' >&2
        echo 'Count should be 1140' >&2
esac
echo Extracting 'cp.c.cdif'
sed 's/^X//' > 'cp.c.cdif' << '+ END-OF-FILE ''cp.c.cdif'
X*** /local/ast/minix/tape3b/commands/cp.c    Wed Jul 13 13:10:49 1988
X--- cp.c    Sun Sep 25 15:24:49 1988
X***************
X*** 99,105 ****
X  int fd1, fd2;
X  char *name;
X  {
X!   int n, m;
X
X    do {
X      n = read(fd1, cpbuf, TRANSFER_UNIT);
X--- 99,106 ----
X  int fd1, fd2;
X  char *name;
X  {
X!   int n, m, mode;
X!   struct stat sbuf;
X
X    do {
X      n = read(fd1, cpbuf, TRANSFER_UNIT);
X***************
X*** 107,114 ****
X      if (n > 0) {
X          m = write(fd2, cpbuf, n);
X          if (m != n) {
X              perror("cp");
X!             unlink(name);    /* don't leave truncated file around */
X              exit(1);
X          }
X          if (isfloppy) sync();    /* purge the cache all at once */
X--- 108,118 ----
X      if (n > 0) {
X          m = write(fd2, cpbuf, n);
X          if (m != n) {
X+             /* Write failed.  Don't keep truncated regular file. */
X              perror("cp");
X!             fstat(fd2, &sbuf);    /* check for special files */
X!             mode = sbuf.st_mode & S_IFMT;
X!             if (mode == S_IFREG) unlink(name);
X              exit(1);
X          }
X          if (isfloppy) sync();    /* purge the cache all at once */
X***************
X*** 124,132 ****
X--- 128,146 ----
X    exit(-1);
X  }
X
X+ typedef char *cptr;
X+
X  int equal(s1, s2)
X  char *s1, *s2;
X  {
X+   struct stat sb1, sb2;
X+
X+  /* same file, different name? */
X+   stat(s1, &sb1);
X+   stat(s2, &sb2);
X+   if (memcmp((cptr)&sb1, (cptr)&sb2, sizeof(struct stat)) == 0)
X+       return(1);
X+  /* same file, same name? */
X    while (1) {
X      if (*s1 == 0 && *s2 == 0) return(1);
X      if (*s1 != *s2) return(0);
X***************
X*** 154,157 ****
X--- 168,185 ----
X    std_err(s1);
X    std_err(s2);
X    std_err(s3);
X+ }
X+
X+
X+ int memcmp(b1, b2, n)
X+ cptr b1, b2;
X+ int n;
X+ {
X+   while (n--) {
X+     if (*b1 != *b2)
X+         return ((int) (*b1 - *b2));
X+     ++b1;
X+     ++b2;
X+   }
X+   return (0);
X  }
+ END-OF-FILE cp.c.cdif
chmod 'u=rw,g=r,o=r' 'cp.c.cdif'
set `wc -c 'cp.c.cdif'`
count=$1
case $count in
1737)    :;;
*)    echo 'Bad character count in ''cp.c.cdif' >&2
        echo 'Count should be 1737' >&2
esac
echo Extracting 'cpdir.c.cdif'
sed 's/^X//' > 'cpdir.c.cdif' << '+ END-OF-FILE ''cpdir.c.cdif'
X*** /local/ast/minix/tape3b/commands/cpdir.c    Wed Jul 13 13:10:50 1988
X--- cpdir.c    Sun Sep 25 15:24:50 1988
X***************
X*** 3,19 ****
X  /* Use "cpdir [-v] src dst" to make a copy dst of directory src.
X     Cpdir should behave like the UNIX shell command
X      (cd src; tar cf - .) | (mkdir dst; cd dst; tar xf -)
X!    but the linking structure of the tree is not yet preserved.
X!    (See the work-yet-to-be-done list below.)
X     The -m "merge" flag enables you to copy into an existing directory.
X     The -s "similar" flag preserves the full mode, uid, gid and times.
X     The -v "verbose" flag enables you to see what's going on when running
 cpdir.
X
X     Work yet to be done:
X!   - preserve link structure
X    - link checks, i.e. am I not overwriting a file/directory by itself?
X-   - handle character and block special files
X-     * they're simply not copied
X
X    Please report bugs and suggestions to erikb@cs.vu.nl
X  */
X--- 3,16 ----
X  /* Use "cpdir [-v] src dst" to make a copy dst of directory src.
X     Cpdir should behave like the UNIX shell command
X      (cd src; tar cf - .) | (mkdir dst; cd dst; tar xf -)
X!
X     The -m "merge" flag enables you to copy into an existing directory.
X     The -s "similar" flag preserves the full mode, uid, gid and times.
X     The -v "verbose" flag enables you to see what's going on when running
 cpdir.
X
X     Work yet to be done:
X!
X    - link checks, i.e. am I not overwriting a file/directory by itself?
X
X    Please report bugs and suggestions to erikb@cs.vu.nl
X  */
X***************
X*** 29,39 ****
X--- 26,46 ----
X  #define PLEN    256
X  #define DIRSIZ    16
X
X+ #define MAXLINKS 512
X+
X+ struct {
X+     unsigned short ino;
X+     unsigned short dev;
X+     char *path;
X+ } links[MAXLINKS];
X+ int nlinks = 0;
X+
X  char *prog;
X  int vflag = 0;    /* verbose */
X  int mflag = 0;    /* force */
X  int sflag = 0;    /* similar */
X  char *strcpy();
X+ char *malloc();
X
X  main(argc, argv)
X      char *argv[];
X***************
X*** 125,130 ****
X--- 132,139 ----
X              strcpy(dend, ent + 2);
X              if (stat(spath, &st) < 0)
X                  fatal("can't get file status of %s", spath);
X+             if ((st.st_mode & S_IFMT)!=S_IFDIR && st.st_nlink>1)
X+                 if (cplink(st,spath,dpath)==1) continue;
X              switch (st.st_mode & S_IFMT) {
X              case S_IFDIR:
X                  cpdir(&st, spath, dpath);
X***************
X*** 133,139 ****
X                  cp(&st, spath, dpath);
X                  break;
X              default:
X!                 nonfatal("can't copy special file %s", spath);
X              }
X          }
X      }
X--- 142,149 ----
X                  cp(&st, spath, dpath);
X                  break;
X              default:
X!                 cpspec(&st, spath, dpath);
X!                 break;
X              }
X          }
X      }
X***************
X*** 215,218 ****
X--- 225,290 ----
X      exit(1);
X  }
X
X+ cpspec(sp, s, d)
X+     struct stat *sp;
X+     char *s, *d;
X+ {
X+     if (vflag)
X+     {
X+         printf("copy special file %s to %s.", s, d);
X+         printf(" Major/minor = %d/%d.",
X+             sp->st_rdev>>8, sp->st_rdev&0177);
X+         printf(" Mode = %o.\n", sp->st_mode);
X+     }
X+     if (mknod(d, sp->st_mode, sp->st_rdev)<0)
X+     {
X+         perror("mknod");
X+         nonfatal("Cannot create special file %s.\n",d);
X+     }
X+     if (sflag)
X+         similar(sp, d);
X+ }
X+
X+ cplink(st,spath,dpath)
X+     struct stat st;
X+     char *spath, *dpath;
X+ {
X+     /* Handle files that are links.
X+      * Returns 0 if file must be copied.
X+      * Returns 1 if file has been successfully linked.
X+      */
X+     int i;
X+     int linkent;
X+
X+     linkent = -1;
X+     for (i=0; i<nlinks; i++)
X+     {
X+         if (links[i].dev==st.st_dev
X+             && links[i].ino==st.st_ino)
X+                 linkent=i;
X+     }
X+     if (linkent>=0) /* It's already in the link table */
X+     { /* we must have copied it earlier.
X+        * So just link to the saved dest path.
X+        * Don't copy it twice.
X+        */
X+         if (vflag)
X+             printf("ln %s %s\n", links[linkent].path,dpath);
X+         if (link(links[linkent].path,dpath) < 0)
X+             fatal("Could not link to %s\n",dpath);
X+         return(1); /* Don't try to copy it */
X+     } else { /* Make an entry in the link table */
X+         if (nlinks >= MAXLINKS)
X+             fatal("Too many links at %s\n",dpath);
X+         links[nlinks].dev = st.st_dev;
X+         links[nlinks].ino = st.st_ino;
X+         links[nlinks].path = malloc(strlen(dpath)+1);
X+         if (links[nlinks].path == NULL)
X+             fatal("No more memory at %s\n",dpath);
X+         strcpy(links[nlinks].path,dpath);
X+         nlinks++;
X+         /* Go ahead and copy it the first time */
X+         return(0);
X+     }
X+ }
X
+ END-OF-FILE cpdir.c.cdif
chmod 'u=rw,g=r,o=r' 'cpdir.c.cdif'
set `wc -c 'cpdir.c.cdif'`
count=$1
case $count in
4265)    :;;
*)    echo 'Bad character count in ''cpdir.c.cdif' >&2
        echo 'Count should be 4265' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 02:56 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 5780 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 02:56 N
Received: by EB0UB011 (Mailer X1.25) id 1513; Thu, 29 Sep 88 02:50:26 HOE
Date: Tue, 27 Sep 88 20:52:29 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #4 - commands (2 of 3)
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'date.c'
sed 's/^X//' > 'date.c' << '+ END-OF-FILE ''date.c'
X/* date - print or set time and date        Author: Jan Looyen */
X
X#include <stdio.h>
X#include <time.h>
X
X#define    MIN    60L        /* # seconds in a minute */
X#define    HOUR    (60 * MIN)    /* # seconds in an hour */
X#define    DAY    (24 * HOUR)    /* # seconds in a day */
X#define    YEAR    (365 * DAY)    /* # seconds in a year */
X
Xchar *ctime();
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X  int qflag;
X  long t, time();
X  char time_buf[15];
X
X  if (argc  > 2) usage();
X  if (argc == 2) {
X    if (*argv[1] == '-' && (argv[1][1] | 0x60) == 'q') {
X        freopen(stdin, "/dev/tty0", "r");
X        printf("\nPlease enter date: MMDDYYhhmmss. Then hit RETURN.\n");
X        gets(time_buf);
X        set_time(time_buf);
X    }
X    else
X        set_time(argv[1]);
X  }
X  time(&t);
X  printf("%s", ctime(&t));
X  exit(0);
X}
X
X
Xset_time(t)
Xchar *t;
X{
X  char *tp;
X  long ct, time();
X  int len;
X  static int days_per_month[] = {
X      31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
X  };
X  struct tm *p, *localtime();
X
X  time(&ct);
X  p = localtime(&ct);
X  p->tm_year -= 1970;
X  p->tm_mon++;
X  len = strlen(t);
X  if (len != 12 && len != 10 && len != 6 && len != 4) usage();
X  tp = t;
X  while (*tp)
X    if (!isdigit(*tp++))
X        bad();
X  if (len == 6 || len == 12)
X      p->tm_sec = conv(&tp, 59);
X  p->tm_min = conv(&tp, 59);
X  p->tm_hour = conv(&tp, 23);
X  if (len == 12 || len == 10) {
X      p->tm_year = conv(&tp, 99);
X      p->tm_mday = conv(&tp, 31);
X      p->tm_mon = conv(&tp, 12);
X      p->tm_year -= 70;
X    if (p->tm_year < 0)
X        p->tm_year += 100;
X  }
X  ct = p->tm_year * YEAR;
X  ct += ((p->tm_year + 1) / 4) * DAY;
X  days_per_month[1] = 28;
X  if (((p->tm_year + 2) % 4) == 0)
X    days_per_month[1]++;
X  len = 0;
X  p->tm_mon--;
X  while (len < p->tm_mon)
X    ct += days_per_month[len++] * DAY;
X  ct += --p->tm_mday * DAY;
X  ct += p->tm_hour * HOUR;
X  ct += p->tm_min * MIN;
X  ct += p->tm_sec;
X  if (stime(&ct))
X    fprintf(stderr, "Set date not allowed\n");
X}
X
Xconv(ptr, max)
Xchar **ptr;
Xint max;
X{
X  int buf;
X
X  *ptr -=2;
X  buf = atoi(*ptr);
X  **ptr = 0;
X  if (buf < 0 || buf > max)
X    bad();
X  return(buf);
X}
X
Xbad()
X{
X  fprintf(stderr, "Date: bad conversion\n");
X  exit(1);
X}
X
Xusage()
X{
X  fprintf(stderr, "Usage: date [-q] [[MMDDYY]hhmm[ss]]\n");
X  exit(1);
X}
X
Xisdigit(c)
Xchar c;
X{
X  if (c >= '0' && c <= '9')
X    return(1);
X  else
X    return(0);
X}
+ END-OF-FILE date.c
chmod 'u=rw,g=r,o=r' 'date.c'
set `wc -c 'date.c'`
count=$1
case $count in
2223)    :;;
*)    echo 'Bad character count in ''date.c' >&2
        echo 'Count should be 2223' >&2
esac
echo Extracting 'df.c.cdif'
sed 's/^X//' > 'df.c.cdif' << '+ END-OF-FILE ''df.c.cdif'
X*** /local/ast/minix/tape3b/commands/df.c    Wed Jul 13 13:10:51 1988
X--- df.c    Sun Sep 25 15:24:55 1988
X***************
X*** 178,187 ****
X  char *p;
X  {
X    char c;
X
X    while (1) {
X!     c = getchar();
X!     if (c < 0) exit(0);
X      if (c == ' ') c = 0;
X      *p++ = c;
X      if (c == '\n') return;
X--- 178,189 ----
X  char *p;
X  {
X    char c;
X+   char ch;
X
X    while (1) {
X!     ch = getchar();
X!     if (ch == EOF) exit(0);
X!     c = (char) ch;
X      if (c == ' ') c = 0;
X      *p++ = c;
X      if (c == '\n') return;
+ END-OF-FILE df.c.cdif
chmod 'u=rw,g=r,o=r' 'df.c.cdif'
set `wc -c 'df.c.cdif'`
count=$1
case $count in
487)    :;;
*)    echo 'Bad character count in ''df.c.cdif' >&2
        echo 'Count should be 487' >&2
esac
echo Extracting 'diskcheck.c.cdif'
sed 's/^X//' > 'diskcheck.c.cdif' << '+ END-OF-FILE ''diskcheck.c.cdif'
X*** /local/ast/minix/tape3b/commands/diskcheck.c    Wed Jul 13 13:10:51 1988
X--- diskcheck.c    Sun Sep 25 15:24:55 1988
X***************
X*** 15,20 ****
X--- 15,21 ----
X  int pfd;            /* file descriptor for purging */
X  int fd;                /* file descriptor for data I/O */
X  unsigned initblock;        /* first block to test */
X+ unsigned curblock;        /* current block */
X  unsigned limit;            /* first block beyond test zone */
X  unsigned errors;        /* # errors so far */
X  unsigned ct;            /* # blocks read so far */
X***************
X*** 62,67 ****
X--- 63,69 ----
X              write(fd, buf, BLOCK_SIZE);
X          }
X      }
X+     curblock = b;
X      ct++;
X      if (ct % PRINTFREQ == 0) status();
X    }
X***************
X*** 120,126 ****
X
X  status()
X  {
X!   printf("%5u blocks tested, %u errors detected\n",ct,errors);
X  }
X
X  nonfatal(s, b)
X--- 122,129 ----
X
X  status()
X  {
X!   printf("%5u blocks tested, %u errors detected (last block tested = %5u)\n",
X!                         ct,errors,curblock);
X  }
X
X  nonfatal(s, b)
+ END-OF-FILE diskcheck.c.cdif
chmod 'u=rw,g=r,o=r' 'diskcheck.c.cdif'
set `wc -c 'diskcheck.c.cdif'`
count=$1
case $count in
956)    :;;
*)    echo 'Bad character count in ''diskcheck.c.cdif' >&2
        echo 'Count should be 956' >&2
esac
echo Extracting 'dosread.c'
sed 's/^X//' > 'dosread.c' << '+ END-OF-FILE ''dosread.c'
X/* dos{read|write|dir} - handle DOS disks    Author: Michiel Huisjes */
X
X/* dosdir - list MS-DOS directories.
X * doswrite - write stdin to DOS-file
X * dosread - read DOS-file to stdout
X *
X * Author: Michiel Huisjes.
X *
X * Usage: dos... [-lra] drive [file/dir]
X *      l: Give long listing.
X *      r: List recursively.
X *      a: Set ASCII bit.
X *
X *    Modified by Tim Kachel 4-88
X *        drive can be 0,1, a, b, c, d, e, f
X *        program will automatically configure to different hard disks
X *          and the partitions for such (could change drive name for
X *          a second hard disk if you have one)
X *            (has been tested on a 16 bit FAT AT drive)
X *            (High density AT diskettes and regular 360K)
X *        compile with cc -O -i
X *        hard disk is named /dev/hd0 to avoid accidents
X *          To test FAT sizes on your hard disk first try dir -lr c
X *            (or what ever your dos partition is)  if this works
X *            properly then all the rest should be okay.
X *        If there are any problems there is debugging information
X *          in fdinit() -- please let me know of any problems
X */
X
X#include <sys/stat.h>
X
X#define DRIVE0        "/dev/at0"
X#define DRIVE1        "/dev/at1"
X#define FDRIVE        "/dev/hd0"
X
X#define DDDD    0xFD
X#define DDHD    0xF9
X#define DDFD    0xF8
X
X#define    MAX_CLUSTER_SIZE    4096
X#define MAX_FAT_SIZE        23552    /* 46 sectoren */
X#define HMASK        0xFF00
X#define LMASK        0x00FF
X
X#define MAX_ROOT_ENTRIES    512    /* 32 sectoren */
X#define FAT_START        512L    /* After bootsector */
X#define clus_add(cl_no)        ((long) (((long) cl_no - 2L) \
X                    * (long) cluster_size \
X                    + (long) data_start \
X                       ))
Xstruct dir_entry {
X    unsigned char d_name[8];
X    unsigned char d_ext[3];
X    unsigned char d_attribute;
X    unsigned char d_reserved[10];
X    unsigned short d_time;
X    unsigned short d_date;
X    unsigned short d_cluster;
X    unsigned long d_size;
X};
X
Xtypedef struct dir_entry DIRECTORY;
X
X#define NOT_USED    0x00
X#define ERASED        0xE5
X#define DIR        0x2E
X#define DIR_SIZE    (sizeof (struct dir_entry))
X#define SUB_DIR        0x10
X#define NIL_DIR        ((DIRECTORY *) 0)
X
X#define LAST_CLUSTER    0x0FFF
X#define MASK        0xFF8        /* FF8 - FFF are last cluster */
X#define FREE        0x000
X#define BAD        0xFF0        /* Includes reserved */
X
X#define LAST_16        0xFFFF
X#define MASK_16        0xFFF8
X#define FREE_16        0x0000
X#define BAD_16        0xFFF0        /* Includes reserved */
X
Xtypedef char BOOL;
X
X#define TRUE    1
X#define FALSE    0
X#define NIL_PTR    ((char *) 0)
X
X#define DOS_TIME    315532800L     /* 1970 - 1980 */
X
X#define READ            0
X#define WRITE            1
X#define disk_read(s, a, b)    disk_io(READ, s, a, b)
X#define disk_write(s, a, b)    disk_io(WRITE, s, a, b)
X
X#define FIND    3
X#define LABEL    4
X#define ENTRY    5
X#define find_entry(d, e, p)    directory(d, e, FIND, p)
X#define list_dir(d, e, f)    (void) directory(d, e, f, NIL_PTR)
X#define label()            directory(root, root_entries, LABEL, NIL_PTR)
X#define new_entry(d, e)        directory(d, e, ENTRY, NIL_PTR)
X
X#define is_dir(d)        ((d)->d_attribute & SUB_DIR)
X
X#define EOF            0400
X#define EOF_MARK        '\032'
X#define STD_OUT            1
X#define flush()            print(STD_OUT, NIL_PTR, 0)
X
Xshort disk;
Xunion tbl
X{
X    unsigned char  twelve[4096];
X    unsigned short sixteen[MAX_FAT_SIZE / 2 ];
X} fat;
X
XDIRECTORY root[MAX_ROOT_ENTRIES], save_entry, *directory(), *read_cluster();
Xchar null[MAX_CLUSTER_SIZE], *device, path[128];
Xshort total_clusters, cluster_size, fat_size, root_entries, sub_entries;
X
XBOOL Rflag, Lflag, Aflag, dos_read, dos_write, dos_dir, Tfat = TRUE;
X
Xunsigned short free_cluster(), next_cluster();
Xchar *make_name(), *num_out(), *slash(), *brk();
Xlong mark, data_start, lseek(), time(), f_start;
X
Xleave(nr)
Xshort nr;
X{
X    (void) umount(device);
X    exit(nr);
X}
X
Xusage(prog_name)
Xregister char *prog_name;
X{
X    print_string(TRUE, "Usage: %s [%s\n", prog_name,
X             dos_dir ? "-lr] drive [dir]" : "-a] drive file");
X    exit(1);
X}
X
Xmain(argc, argv)
Xint argc;
Xregister char *argv[];
X{
X    register char *arg_ptr = slash(argv[0]);
X    DIRECTORY *entry;
X    short index = 1;
X    char dev_nr;
X    unsigned char fat_type, fat_check;
X    BOOL fdisk = FALSE;
X    int i;
X
X    if (!strcmp(arg_ptr, "dosdir"))
X        dos_dir = TRUE;
X    else if (!strcmp(arg_ptr, "dosread"))
X        dos_read = TRUE;
X    else if (!strcmp(arg_ptr, "doswrite"))
X        dos_write = TRUE;
X    else {
X        print_string(TRUE, "Program should be named dosread, doswrite or
 dosdir.\n");
X        exit(1);
X    }
X
X    if (argc == 1)
X        usage(argv[0]);
X
X    if (argv[1][0] == '-') {
X        for (arg_ptr = &argv[1][1]; *arg_ptr; arg_ptr++) {
X            if (*arg_ptr == 'l' && dos_dir)
X                Lflag = TRUE;
X            else if (*arg_ptr == 'r' && dos_dir)
X                Rflag = TRUE;
X            else if (*arg_ptr == 'a' && !dos_dir)
X                Aflag = TRUE;
X            else
X                usage(argv[0]);
X        }
X        index++;
X    }
X
X    if (index == argc)
X        usage(argv[0]);
X
X    switch (dev_nr = *argv[index++])
X    {
X        case '0':
X        case 'a':    device = DRIVE0; break;
X        case '1':
X        case 'b':    device = DRIVE1; break;
X        case 'c':
X        case 'd':
X        case 'e':
X        case 'f':    fdisk = TRUE; device = FDRIVE; break;
X        default :    usage(argv[0]);
X    }
X
X    if ((disk = open(device, 2)) < 0) {
X        print_string(TRUE, "Cannot open %s\n", device);
X        exit(1);
X    }
X
X    if (fdisk) {        /* fixed disk */
X        fdinit(dev_nr);
X        disk_read(f_start, &fat_type, sizeof(fat_type));
X        if (fat_type != DDFD) {
X            print_string(TRUE, "Fixed disk is not DOS\n");
X            leave(1);
X        }
X    }
X    else {        /* use standard start for floppies */
X        f_start = FAT_START;
X        disk_read(f_start, &fat_type, sizeof(fat_type));
X        if (fat_type == DDDD) {        /* Double-sided double-density 9 s/t */
X            total_clusters = 355;    /* 720 - 7 - 2 - 2 - 1 */
X            cluster_size = 1024;    /* 2 sectors per cluster */
X            fat_size = 1024;    /* 2 sectors */
X            data_start = 6144L;    /* Starts on sector #12 */
X            root_entries = 112;
X            sub_entries = 32;    /* 1024 / 32 */
X        }
X        else if (fat_type == DDHD) {    /* Double-sided high-density 15 s/t */
X            total_clusters = 2372;    /* 2400 - 14 - 7 - 7 - 1 */
X            cluster_size = 512;    /* 1 sector per cluster */
X            fat_size = 3584;    /* 7 sectors */
X            data_start = 14848L;    /* Starts on sector #29 */
X            root_entries = 224;
X            sub_entries = 16;    /* 512 / 32 */
X        }
X        else {
X                print_string(TRUE, "Diskette is not DOS 2.0 360K or 1.2M\n");
X            leave(1);
X        }
X    }
X
X    disk_read(f_start + (long) fat_size, &fat_check, sizeof(fat_check));
X    if (fat_check != fat_type) {
X        print_string(TRUE, "Disk type in FAT copy differs from disk type in FAT
 original.\n");
X        leave(1);
X    }
X
X    if (Tfat)    /* twelve bit FAT entries */
X        disk_read(f_start, fat.twelve, fat_size);
X    else        /* sixteen bit */
X        disk_read(f_start, fat.sixteen, fat_size);
X/*******
X    for (i=0; i<= 30; i++){
X        printf("%x\t%c", fat.sixteen[i], (i % 10) ? ' ':'\n');
X    }
X    leave(1);
X/*******/
X    disk_read(f_start + 2L * (long) fat_size, root, DIR_SIZE * root_entries);
X/*******
X    for (i=0; i<2; i++){
X        printf("%s d_name\n", root[i].d_name);
X        printf("%s d_ext\n",  root[i].d_ext);
X        printf("%d d_attr\n",  root[i].d_attribute);
X        printf("%s d_reserved\n",  root[i].d_reserved);
X        printf("%d d_time\n",  root[i].d_time);
X        printf("%d d_date\n",  root[i].d_date);
X        printf("%d d_cluster\n",  root[i].d_cluster);
X        printf("%D d_size\n",  root[i].d_size);
X    }
X
X
X/*********/
X    if (dos_dir) {
X        entry = label();
X        print_string(FALSE, "Volume in drive %c ", dev_nr);
X        if (entry == NIL_DIR)
X            print(STD_OUT, "has no label.\n\n", 0);
X        else
X            print_string(FALSE, "is %S\n\n", entry->d_name);
X    }
X
X    if (argv[index] == NIL_PTR) {
X        if (!dos_dir)
X            usage(argv[0]);
X        print(STD_OUT, "Root directory:\n", 0);
X        list_dir(root, root_entries, FALSE);
X        free_blocks();
X        flush();
X        leave(0);
X    }
X
X    for (arg_ptr = argv[index]; *arg_ptr; arg_ptr++)
X        if (*arg_ptr == '\\')
X            *arg_ptr = '/';
X        else if (*arg_ptr >= 'a' && *arg_ptr <= 'z')
X            *arg_ptr += ('A' - 'a');
X    if (*--arg_ptr == '/')
X        *arg_ptr = '\0';       /* skip trailing '/' */
X
X    add_path(argv[index], FALSE);
X    add_path("/", FALSE);
X
X    if (dos_dir)
X        print_string(FALSE, "Directory %s:\n", path);
X
X    entry = find_entry(root, root_entries, argv[index]);
X
X    if (dos_dir) {
X        list_dir(entry, sub_entries, FALSE);
X        free_blocks();
X    }
X    else if (dos_read)
X        extract(entry);
X    else {
X        if (entry != NIL_DIR) {
X            flush();
X            if (is_dir(entry))
X                print_string(TRUE, "%s is a directory.\n", path);
X            else
X                print_string(TRUE, "%s already exists.\n", argv[index]);
X            leave(1);
X        }
X
X        add_path(NIL_PTR, TRUE);
X
X        if (*path)
X            make_file(find_entry(root, root_entries, path),
X                  sub_entries, slash(argv[index]));
X        else
X            make_file(root, root_entries, argv[index]);
X    }
X
X    (void) close(disk);
X    flush();
X    leave(0);
X}
X
Xfdinit(part_nr)        /* Fixed Disk Initializations */
Xchar part_nr;
X{
X
X#define    SECSIZE        512        /* sector size        */
X#define TABLEOFFSET    0x1be      /* offset in boot sector*/
X
X    /*
X     * Description of entry in partition table
X     */
X    struct part_entry {
X        char    bootind;    /* boot indicator 0/0x80    */
X        char    start_head;    /* head value for first sector    */
X        char    start_sec;    /* sector value for first sector*/
X        char    start_cyl;    /* track value for first sector    */
X        char    sysind;        /* system indicator 00=?? 01=DOS*/
X        char    last_head;    /* head value for last sector    */
X        char    last_sec;    /* sector value for last sector    */
X        char    last_cyl;    /* track value for last sector    */
X        long    lowsec;        /* logical first sector        */
X        long    size;        /* size of partion in sectors    */
X    } *pe;
X
X    char    secbuf[SECSIZE];
X
X    /*
X     *    Description of the boot block
X     */
X    struct {
X        unsigned char jump[3];
X        unsigned char oem[8];
X        unsigned char bytes_sector[2];
X        unsigned char cluster_size;
X        unsigned char res_sectors[2];
X        unsigned char num_fats;
X        unsigned char root_entries[2];
X        unsigned char logical_sectors[2];
X        unsigned char media_type;
X        unsigned char fat_sectors[2];
X        unsigned char track_sectors[2];
X        unsigned char num_heads[2];
X        unsigned char hidden_sectors[2];
X    } boot;
X
X    short block_size, reserved;    long boot_loc;
X
X    disk_read(0L, secbuf, SECSIZE);    /* get boot sector */
X        /* offset into boot sector for the partition table */
X    pe = (struct part_entry *)&secbuf[TABLEOFFSET];
X        /* get the proper partition */
X    switch(part_nr) {
X        case 'f': pe++;
X        case 'e': pe++;
X        case 'd': pe++;
X        case 'c': boot_loc = pe->lowsec * 512L; break;
X            default:  printf("Error: unknown partition\n"); leave();
X    }
X        /* now read the boot block for the partition needed */
X    disk_read(boot_loc, &boot, sizeof(boot));
X
X    /* this section can be used to print drive information */
X/**************
X    printf("OEM = %s\n", boot.oem);
X    printf("Bytes/sector = %d\n",
X        (boot.bytes_sector[1] << 8 & HMASK) + (boot.bytes_sector[0] & LMASK));
X    printf("Sectors/cluster = %d\n", boot.cluster_size);
X    printf("Number of Reserved Clusters = %d\n",
X        (boot.res_sectors[1] << 8 & HMASK) + (boot.res_sectors[0] & LMASK));
X    printf("Number of FAT's = %d\n", boot.num_fats);
X    printf("Number of root-directory entries = %d\n",
X        (boot.root_entries[1] << 8 & HMASK) + (boot.root_entries[0] & LMASK));
X    printf("Total sectors in logical volume = %D\n",
X        (long) (boot.logical_sectors[1] << 8 & HMASK) +
(boot.logical_sectors[0] & LMASK));
X    printf("Media Descriptor = %x\n", boot.media_type);
X    printf("Number of sectors/FAT = %d\n",
X        (boot.fat_sectors[1] << 8 & HMASK) + (boot.fat_sectors[0] & LMASK));
X    printf("Sectors/track = %d\n",
X        (boot.track_sectors[1] << 8 & HMASK) + (boot.track_sectors[0] &
 LMASK));
X    printf("Number of Heads = %d\n",
X        (boot.num_heads[1] << 8 & HMASK) + (boot.num_heads[0] & LMASK));
X    printf("Number of hidden sectors = %d\n",
X        (boot.hidden_sectors[1]  << 8 & HMASK) + (boot.hidden_sectors[0] &
 LMASK));
X    leave(1);
X/**************/
X    if (boot.media_type != DDFD) {
X        printf("DISK is not DOS Format.\n");
X        leave(1);
X    }
X    if (boot.num_fats != 2) {
X        printf("Disk does not have two FAT Tables!\n");
X        leave(1);
X    }
X    block_size = (boot.bytes_sector[1] << 8 & HMASK) +
X             (boot.bytes_sector[0] & LMASK);
X    if ((cluster_size = block_size * boot.cluster_size)
X                    > MAX_CLUSTER_SIZE) {
X        printf("Cluster size is larger than MAX_CLUSTER_SIZE.\n");
X        leave(1);
X    }
X    reserved =  ((boot.res_sectors[1] << 8 & HMASK) +
X            (boot.res_sectors[0] & LMASK));
X    f_start = boot_loc + (long) block_size * (long) reserved;
X    root_entries = (boot.root_entries[1] << 8 & HMASK) +
X            (boot.root_entries[0] & LMASK);
X    fat_size = (boot.fat_sectors[1] << 8 & HMASK) +
X             (boot.fat_sectors[0] & LMASK);
X        /* (sectors - rootdir - fats - reserved) / blocks/cluster */
X    total_clusters = (int) ((long) ((boot.logical_sectors[1] << 8 & HMASK) +
X                   (boot.logical_sectors[0] & LMASK)) -
X          (root_entries * 32 / block_size) -
X          (fat_size * 2) - reserved) / boot.cluster_size;
X    if (total_clusters > 4096)
X        Tfat = FALSE;        /* sixteen bit fat entries */
X    if ( (fat_size *= block_size) > MAX_FAT_SIZE) {
X        printf("Disk FAT is larger than MAX_FAT_SIZE.\n");
X        leave(1);
X    }
X    sub_entries = cluster_size / 32;
X    data_start = f_start + (long) (fat_size * 2L) +
X            (long) (root_entries * 32L);
X/**********
X    printf("f_start = %D\n", f_start);
X    printf("total_clusters = %d\n", total_clusters);
X    printf("cluster_size = %d\n", cluster_size);
X    printf("fat_size = %d\n", fat_size);
X    printf("data_start = %D\n", data_start);
X    printf("root_entries = %d\n", root_entries);
X    printf("sub_entries = %d\n", sub_entries);
X    printf("Tfat = %d\n", Tfat);
X    leave(1);
X/*********/
X}
X
XDIRECTORY *directory(dir, entries, function, pathname)
XDIRECTORY *dir;
Xshort entries;
XBOOL function;
Xregister char *pathname;
X{
X    register DIRECTORY *dir_ptr = dir;
X    DIRECTORY *mem = NIL_DIR;
X    unsigned short cl_no = dir->d_cluster;
X    unsigned short type, last;
X    char file_name[14];
X    char *name;
X    int i = 0;
X
X    if (function == FIND) {
X        while (*pathname != '/' && *pathname && i < 12)
X            file_name[i++] = *pathname++;
X        while (*pathname != '/' && *pathname)
X            pathname++;
X        file_name[i] = '\0';
X    }
X
X    do {
X        if (entries != root_entries) {
X            mem = dir_ptr = read_cluster(cl_no);
X            last = cl_no;
X            cl_no = next_cluster(cl_no);
X        }
X
X        for (i = 0; i < entries; i++, dir_ptr++) {
X            type = dir_ptr->d_name[0] & 0x0FF;
X            if (function == ENTRY) {
X                if (type == NOT_USED || type == ERASED) {
X                    mark = lseek(disk, 0L, 1) -
X                        (long) cluster_size +
X                        (long) i * (long) DIR_SIZE;
X                    if (!mem)
X                        mark += (long) cluster_size - (long) (root_entries *
 sizeof (DIRECTORY));
X                    return dir_ptr;
X                }
X                continue;
X            }
X            if (type == NOT_USED)
X                break;
X            if (dir_ptr->d_attribute & 0x08) {
X                if (function == LABEL)
X                    return dir_ptr;
X                continue;
X            }
X            if (type == DIR || type == ERASED || function == LABEL)
X                continue;
X            type = is_dir(dir_ptr);
X            name = make_name(dir_ptr, (function == FIND) ?
X                     FALSE : type);
X            if (function == FIND) {
X                if (strcmp(file_name, name) != 0)
X                    continue;
X                if (!type) {
X                    if (dos_dir || *pathname) {
X                        flush();
X                        print_string(TRUE, "Not a directory: %s\n", file_name);
X                        leave(1);
X                    }
X                }
X                else if (*pathname == '\0' && dos_read) {
X                    flush();
X                    print_string(TRUE, "%s is a directory.\n", path);
X                    leave(1);
X                }
X                if (*pathname) {
X                    dir_ptr = find_entry(dir_ptr,
X                           sub_entries, pathname + 1);
X                }
X                if (mem) {
X                    if (dir_ptr) {
X                        bcopy(dir_ptr, &save_entry, DIR_SIZE);
X                        dir_ptr = &save_entry;
X                    }
X                    (void) brk(mem);
X                }
X                return dir_ptr;
X            }
X            else {
X                if (function == FALSE)
X                    show(dir_ptr, name);
X                else if (type) {    /* Recursive */
X                    print_string(FALSE, "Directory %s%s:\n", path, name);
X                    add_path(name, FALSE);
X                    list_dir(dir_ptr, sub_entries, FALSE);
X                    add_path(NIL_PTR, FALSE);
X                }
X            }
X        }
X        if (mem)
X            (void) brk(mem);
X    } while ((Tfat && cl_no != LAST_CLUSTER && mem) ||
X         (!Tfat && cl_no != LAST_16 && mem));
X
X    switch (function) {
X        case FIND:
X            if (dos_write && *pathname == '\0')
X                return NIL_DIR;
X            flush();
X            print_string(TRUE, "Cannot find `%s'.\n", file_name);
X            leave(1);
X        case LABEL:
X            return NIL_DIR;
X        case ENTRY:
X            if (!mem) {
X                flush();
X                print_string(TRUE, "No entries left in root directory.\n");
X                leave(1);
X            }
X
X            cl_no = free_cluster(TRUE);
X            link_fat(last, cl_no);
X            if (Tfat)
X                link_fat(cl_no, LAST_CLUSTER);
X            else
X                link_fat(cl_no, LAST_16);
X            disk_write(clus_add(cl_no), null, cluster_size);
X
X            return new_entry(dir, entries);
X        case FALSE:
X            if (Rflag) {
X                print(STD_OUT, "\n", 0);
X                list_dir(dir, entries, TRUE);
X            }
X    }
X}
X
Xextract(entry)
Xregister DIRECTORY *entry;
X{
X    register unsigned short cl_no = entry->d_cluster;
X    char buffer[MAX_CLUSTER_SIZE];
X    short rest;
X
X    if (entry->d_size == 0)           /* Empty file */
X        return;
X
X    do {
X        disk_read(clus_add(cl_no), buffer, cluster_size);
X        rest = (entry->d_size > (long) cluster_size) ? cluster_size : (short)
 entry->d_size;
X        print(STD_OUT, buffer, rest);
X        entry->d_size -= (long) rest;
X        cl_no = next_cluster(cl_no);
X        if ((Tfat && cl_no == BAD) || (!Tfat && cl_no == BAD_16)){
X            flush();
X            print_string(TRUE, "Reserved cluster value encountered.\n");
X            leave(1);
X        }
X    } while ((Tfat && entry->d_size && cl_no != LAST_CLUSTER) ||
X         (!Tfat && entry->d_size && cl_no != LAST_16));
X
X    if ((Tfat && cl_no != LAST_CLUSTER) || (!Tfat && cl_no != LAST_16))
X        print_string(TRUE, "Too many clusters allocated for file.\n");
X    else if (entry->d_size != 0)
X        print_string(TRUE, "Premature EOF: %L bytes left.\n",
X                 entry->d_size);
X}
X
Xprint(fd, buffer, bytes)
Xshort fd;
Xregister char *buffer;
Xregister short bytes;
X{
X    static short index;
X    static BOOL lf_pending = FALSE;
X    static char output[MAX_CLUSTER_SIZE + 1];
X
X    if (buffer == NIL_PTR) {
X        if (dos_read && Aflag && lf_pending) {
X            output[index++] = '\r';
X            lf_pending = FALSE;
X        }
X        if (write(fd, output, index) != index)
X            bad();
X        index = 0;
X        return;
X    }
X
X    if (bytes == 0)
X        bytes = strlen(buffer);
X
X    while (bytes--) {
X        if (index >= MAX_CLUSTER_SIZE) {
X            if (write(fd, output, index) != index)
X                bad ();
X            index = 0;
X        }
X        if (dos_read && Aflag) {
X            if (*buffer == '\r') {
X                if (lf_pending)
X                    output[index++] = *buffer++;
X                else {
X                    lf_pending = TRUE;
X                    buffer++;
X                }
X            }
X            else if (*buffer == '\n') {
X                output[index++] = *buffer++;
X                lf_pending = FALSE;
X            }
X            else if (lf_pending) {
X                output[index++] = '\r';
X                output[index++] = *buffer++;
X            }
X            else if ((output[index++] = *buffer++) == EOF_MARK) {
X                if (lf_pending) {
X                    output[index - 1] = '\r';
X                    index++;
X                    lf_pending = FALSE;
X                }
X                index--;
X                return;
X            }
X        }
X        else
X            output[index++] = *buffer++;
X    }
X}
X
Xmake_file(dir_ptr, entries, name)
XDIRECTORY *dir_ptr;
Xint entries;
Xchar *name;
X{
X    register DIRECTORY *entry = new_entry(dir_ptr, entries);
X    register char *ptr;
X    char buffer[MAX_CLUSTER_SIZE];
X    unsigned short cl_no, next;
X    short i, r;
X    long size = 0L;
X
X    bcopy("           ",&entry->d_name[0],11);    /* clear entry */
X    for (i = 0, ptr = name; i < 8 && *ptr != '.' && *ptr; i++)
X        entry->d_name[i] = *ptr++;
X    while (*ptr != '.' && *ptr)
X        ptr++;
X    if (*ptr == '.')
X        ptr++;
X    for (i=0;i < 3 && *ptr; i++)
X        entry->d_ext[i] = *ptr++;
X
X    for (i = 0; i < 10; i++)
X        entry->d_reserved[i] = '\0';
X    entry->d_attribute = '\0';
X
X    entry->d_cluster = 0;
X
X    while ((r = fill(buffer)) > 0) {
X        if ((next = free_cluster(FALSE)) > total_clusters) {
X            print_string(TRUE, "Disk full. File truncated.\n");
X            break;
X        }
X
X        disk_write(clus_add(next), buffer, r);
X
X        if (entry->d_cluster == 0)
X            cl_no = entry->d_cluster = next;
X        else {
X            link_fat(cl_no, next);
X            cl_no = next;
X        }
X
X        size += r;
X    }
X
X    if (entry->d_cluster != 0) {
X        if (Tfat)
X            link_fat(cl_no, LAST_CLUSTER);
X        else
X            link_fat(cl_no, LAST_16);
X    }
X
X    entry->d_size = Aflag ? (size - 1) : size;    /* Strip added ^Z */
X    fill_date(entry);
X    disk_write(mark, entry, DIR_SIZE);
X    if (Tfat) {
X        disk_write(f_start, fat.twelve, fat_size);
X        disk_write(f_start + (long) fat_size, fat.twelve, fat_size);
X    } else {
X        disk_write(f_start, fat.sixteen, fat_size);
X        disk_write(f_start + (long) fat_size, fat.sixteen, fat_size);
X    }
X}
X
X
X#define SEC_MIN    60L
X#define SEC_HOUR    (60L * SEC_MIN)
X#define SEC_DAY    (24L * SEC_HOUR)
X#define SEC_YEAR    (365L * SEC_DAY)
X#define SEC_LYEAR    (366L * SEC_DAY)
X
Xshort mon_len[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
X
Xfill_date(entry)
XDIRECTORY *entry;
X{
X    register long cur_time = time((long *) 0) - DOS_TIME;
X    unsigned short year = 0, month = 1, day, hour, minutes, seconds;
X    int i;
X    long tmp;
X
X    if (cur_time < 0)           /* Date not set on booting ... */
X        cur_time = 0;
X    for (;;) {
X        tmp = (year % 4 == 0) ? SEC_LYEAR : SEC_YEAR;
X        if (cur_time < tmp)
X            break;
X        cur_time -= tmp;
X        year++;
X    }
X
X    day = (unsigned short) (cur_time / SEC_DAY);
X    cur_time -= (long) day *SEC_DAY;
X
X    hour = (unsigned short) (cur_time / SEC_HOUR);
X    cur_time -= (long) hour *SEC_HOUR;
X
X    minutes = (unsigned short) (cur_time / SEC_MIN);
X    cur_time -= (long) minutes *SEC_MIN;
X
X    seconds = (unsigned short) cur_time;
X
X    mon_len[1] = (year % 4 == 0) ? 29 : 28;
X    i = 0;
X    while (day >= mon_len[i]) {
X        month++;
X        day -= mon_len[i++];
X    }
X    day++;
X
X    entry->d_date = (year << 9) | (month << 5) | day;
X    entry->d_time = (hour << 11) | (minutes << 5) | seconds;
X}
X
Xchar *make_name(dir_ptr, dir_fl)
Xregister DIRECTORY *dir_ptr;
Xshort dir_fl;
X{
X    static char name_buf[14];
X    register char *ptr = name_buf;
X    short i;
X
X    for (i = 0; i < 8; i++)
X        *ptr++ = dir_ptr->d_name[i];
X
X    while (*--ptr == ' ');
X
X    ptr++;
X    if (dir_ptr->d_ext[0] != ' ') {
X        *ptr++ = '.';
X        for (i = 0; i < 3; i++)
X            *ptr++ = dir_ptr->d_ext[i];
X        while (*--ptr == ' ');
X        ptr++;
X    }
X    if (dir_fl)
X        *ptr++ = '/';
X    *ptr = '\0';
X
X    return name_buf;
X}
X
Xfill(buffer)
Xregister char *buffer;
X{
X    static BOOL eof_mark = FALSE;
X    char *last = &buffer[cluster_size];
X    char *begin = buffer;
X    register short c;
X
X    if (eof_mark)
X        return 0;
X
X    while (buffer < last) {
X        if ((c = get_char()) == EOF) {
X            eof_mark = TRUE;
X            if (Aflag)
X                *buffer++ = EOF_MARK;
X            break;
X        }
X        *buffer++ = c;
X    }
X
X    return (int) (buffer - begin);
X}
X
Xget_char()
X{
X    static short read_chars, index;
X    static char input[MAX_CLUSTER_SIZE];
X    static BOOL new_line = FALSE;
X
X    if (new_line == TRUE) {
X        new_line = FALSE;
X        return '\n';
X    }
X
X    if (index == read_chars) {
X        if ((read_chars = read(0, input, cluster_size)) == 0)
X            return EOF;
X        index = 0;
X    }
X
X    if (Aflag && input[index] == '\n') {
X        new_line = TRUE;
X        index++;
X        return '\r';
X    }
X
X    return input[index++];
X}
X
X#define HOUR    0xF800               /* Upper 5 bits */
X#define MIN    0x07E0               /* Middle 6 bits */
X#define YEAR    0xFE00               /* Upper 7 bits */
X#define MONTH    0x01E0               /* Mid 4 bits */
X#define DAY    0x01F               /* Lowest 5 bits */
X
Xchar *month[] = {
X         "Jan", "Feb", "Mar", "Apr", "May", "Jun",
X         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
X};
X
Xmodes(mode)
Xregister unsigned char mode;
X{
X    print_string(FALSE, "\t%c%c%c%c%c", (mode & SUB_DIR) ? 'd' : '-',
X             (mode & 02) ? 'h' : '-', (mode & 04) ? 's' : '-',
X             (mode & 01) ? '-' : 'w', (mode & 0x20) ? 'a' : '-');
X}
X
Xshow(dir_ptr, name)
XDIRECTORY *dir_ptr;
Xchar *name;
X{
X    register unsigned short e_date = dir_ptr->d_date;
X    register unsigned short e_time = dir_ptr->d_time;
X    unsigned short next;
X    char bname[20];
X    short i = 0;
X
X    while (*name && *name != '/')
X        bname[i++] = *name++;
X    bname[i] = '\0';
X    if (!Lflag) {
X        print_string(FALSE, "%s\n", bname);
X        return;
X    }
X    modes(dir_ptr->d_attribute);
X    print_string(FALSE, "\t%s%s", bname, strlen(bname) < 8 ? "\t\t" : "\t");
X    i = 1;
X    if (is_dir(dir_ptr)) {
X        next = dir_ptr->d_cluster;
X        while (((next = next_cluster(next)) != LAST_CLUSTER && Tfat) ||
X            (!Tfat && next != LAST_16))
X            i++;
X        print_string(FALSE, "%L", (long) i * (long) cluster_size);
X    }
X    else
X        print_string(FALSE, "%L", dir_ptr->d_size);
X    print_string(FALSE, "\t%N:%N %P %s %d\n", ((e_time & HOUR) >> 11),
X             ((e_time & MIN) >> 5), (e_date & DAY),
X       month[((e_date & MONTH) >> 5) - 1], ((e_date & YEAR) >> 9) + 1980);
X}
X
Xfree_blocks()
X{
X    register unsigned short cl_no;
X    register short free = 0;
X    short bad = 0;
X    if (Tfat)
X        for (cl_no = 2; cl_no <= total_clusters; cl_no++) {
X            switch (next_cluster(cl_no)) {
X                case FREE:
X                    free++;
X                    break;
X                case BAD:
X                    bad++;
X            }
X        }
X    else
X        for (cl_no = 2; cl_no <= total_clusters; cl_no++) {
X            switch (next_cluster(cl_no)) {
X                case FREE_16:
X                    free++;
X                    break;
X                case BAD_16:
X                    bad++;
X            }
X        }
X
X    print_string(FALSE, "Free space: %L bytes.\n", (long) free * (long)
 cluster_size);
X    if (bad)
X        print_string(FALSE, "Bad sectors: %L bytes.\n", (long) bad * (long)
 cluster_size);
X}
X
Xchar *num_out(number)
Xregister long number;
X{
X    static char num_buf[13];
X    char temp[13];
X    register short i = 0;
X    short j;
X
X    if (number == 0)
X        temp[i++] = '0';
X
X    while (number) {
X        temp[i++] = (char) (number % 10L + '0');
X        number /= 10L;
X    }
X
X    for (j = 0; j < 11; j++)
X        num_buf[j] = temp[i - j - 1];
X
X    num_buf[i] = '\0';
X    return num_buf;
X}
X
X/* VARARGS */
Xprint_string(err_fl, fmt, args)
XBOOL err_fl;
Xchar *fmt;
Xint args;
X{
X    char buf[200];
X    register char *buf_ptr = buf;
X    char *scan_ptr;
X    register int *arg_ptr = &args;
X    short i;
X
X    while (*fmt) {
X        if (*fmt == '%') {
X            fmt++;
X            if (*fmt == 'c') {
X                *buf_ptr++ = (char) *arg_ptr++;
X                fmt++;
X                continue;
X            }
X            if (*fmt == 'S') {
X                scan_ptr = (char *) *arg_ptr;
X                for (i = 0; i < 11; i++)
X                    *buf_ptr++ = *scan_ptr++;
X                fmt++;
X                continue;
X            }
X            if (*fmt == 's')
X                scan_ptr = (char *) *arg_ptr;
X            else if (*fmt == 'L') {
X                scan_ptr = num_out(*((long *) arg_ptr));
X                arg_ptr++;
X            }
X            else {
X                scan_ptr = num_out((long) *arg_ptr);
X                if (*fmt == 'P' && *arg_ptr < 10)
X                    *buf_ptr++ = ' ';
X                else if (*fmt == 'N' && *arg_ptr < 10)
X                    *buf_ptr++ = '0';
X            }
X            while (*buf_ptr++ = *scan_ptr++);
X            buf_ptr--;
X            arg_ptr++;
X            fmt++;
X        }
X        else
X            *buf_ptr++ = *fmt++;
X    }
X
X    *buf_ptr = '\0';
X
X    if (err_fl) {
X        flush();
X        write(2, buf, (int) (buf_ptr - buf));
X    }
X    else
X        print(STD_OUT, buf, 0);
Xflush();
X}
X
XDIRECTORY *read_cluster(cluster)
Xregister unsigned short cluster;
X{
X    register DIRECTORY *sub_dir;
X    extern char *sbrk();
X
X    if ((sub_dir = (DIRECTORY *) sbrk(cluster_size)) < 0) {
X        print_string(TRUE, "Cannot set break!\n");
X        leave(1);
X    }
X    disk_read(clus_add(cluster), sub_dir, cluster_size);
X
X    return sub_dir;
X}
X
Xunsigned short free_cluster(leave_fl)
XBOOL leave_fl;
X{
X    static unsigned short cl_index = 2;
X
X    if (Tfat)
X        while (cl_index <= total_clusters && next_cluster(cl_index) != FREE)
X            cl_index++;
X    else        /* Sixteen bit */
X        while (cl_index <= total_clusters && next_cluster(cl_index) != FREE_16)
X            cl_index++;
X
X    if (leave_fl && cl_index > total_clusters) {
X        flush();
X        print_string(TRUE, "Disk full. File not added.\n");
X        leave(1);
X    }
X
X    return cl_index++;
X}
X
X/* ****************FIX FOR SIXTEEN BIT ***************** */
Xlink_fat(cl_1, cl_2)
Xunsigned short cl_1;
Xregister unsigned short cl_2;
X{
X    if (Tfat) {
X        register unsigned char *fat_index = &fat.twelve[(cl_1 >> 1) * 3 + 1];
X        if (cl_1 & 0x01) {
X            *(fat_index + 1) = cl_2 >> 4;
X            *fat_index = (*fat_index & 0x0F) | ((cl_2 & 0x0F) << 4);
X        }
X        else {
X            *(fat_index - 1) = cl_2 & 0x0FF;
X            *fat_index = (*fat_index & 0xF0) | (cl_2 >> 8);
X        }
X    }
X    else {
X        fat.sixteen[cl_1] = cl_2;
X    }
X}
X
X
Xunsigned short next_cluster(cl_no)
Xregister unsigned short cl_no;
X{
X    if (Tfat) {
X        register unsigned char *fat_index = &fat.twelve[(cl_no >> 1) * 3 + 1];
X
X        if (cl_no & 0x01)
X            cl_no = (*(fat_index + 1) << 4) | (*fat_index >> 4);
X        else
X            cl_no = ((*fat_index & 0x0F) << 8) | *(fat_index - 1);
X
X        if ((cl_no & MASK) == MASK)
X            cl_no = LAST_CLUSTER;
X        else if ((cl_no & BAD) == BAD)
X            cl_no = BAD;
X    }
X    else {
X        /*cl_no = fat.sixteen[cl_no << 1];*/
X        cl_no = fat.sixteen[cl_no];
X        if ((cl_no & MASK_16) == MASK_16)
X            cl_no = LAST_16;
X        else if ((cl_no & BAD_16) == BAD_16)
X            cl_no = BAD_16;
X    }
X
X    return cl_no;
X}
X
Xchar *slash(str)
Xregister char *str;
X{
X    register char *result = str;
X
X    while (*str)
X        if (*str++ == '/')
X            result = str;
X
X    return result;
X}
X
Xadd_path(file, slash_fl)
Xregister char *file;
XBOOL slash_fl;
X{
X    register char *ptr = path;
X
X    while (*ptr)
X        ptr++;
X
X    if (file == NIL_PTR) {
X        ptr--;
X        do {
X            ptr--;
X        } while (*ptr != '/' && ptr != path);
X        if (ptr != path && !slash_fl)
X            ptr++;
X        *ptr = '\0';
X    }
X    else
X        while (*ptr++ = *file++);
X}
X
Xbcopy(src, dest, bytes)
Xregister char *src, *dest;
Xshort bytes;
X{
X    while (bytes--)
X        *dest++ = *src++;
X}
X
Xdisk_io(op, seek, address, bytes)
Xregister BOOL op;
Xunsigned long seek;
XDIRECTORY *address;
Xregister unsigned bytes;
X{
X    unsigned int r;
X
X    if (lseek(disk, seek, 0) < 0L) {
X        flush();
X        print_string(TRUE, "Bad lseek\n");
X        leave(1);
X    }
X
X    if (op == READ)
X        r = read(disk, address, bytes);
X    else
X        r = write(disk, address, bytes);
X
X    if (r != bytes)
X        bad();
X}
X
Xbad()
X{
X    flush();
X    perror("I/O error");
X    leave(1);
X}
+ END-OF-FILE dosread.c
chmod 'u=rw,g=r,o=r' 'dosread.c'
set `wc -c 'dosread.c'`
count=$1
case $count in
28473)    :;;
*)    echo 'Bad character count in ''dosread.c' >&2
        echo 'Count should be 28473' >&2
esac
echo Extracting 'factor.c.cdif'
sed 's/^X//' > 'factor.c.cdif' << '+ END-OF-FILE ''factor.c.cdif'
X*** /local/ast/minix/tape3b/commands/factor.c    Wed Jul 13 13:10:54 1988
X--- factor.c    Sun Sep 25 15:24:59 1988
X***************
X*** 1,3 ****
X--- 1,5 ----
X+ /* factor - print the prime factors of a number      Author: Andy Tanenbaum
 */
X+
X  main(argc, argv)
X  int argc;
X  char *argv[];
+ END-OF-FILE factor.c.cdif
chmod 'u=rw,g=r,o=r' 'factor.c.cdif'
set `wc -c 'factor.c.cdif'`
count=$1
case $count in
282)    :;;
*)    echo 'Bad character count in ''factor.c.cdif' >&2
        echo 'Count should be 282' >&2
esac
echo Extracting 'fgrep.c.cdif'
sed 's/^X//' > 'fgrep.c.cdif' << '+ END-OF-FILE ''fgrep.c.cdif'
X*** /local/ast/minix/tape3b/commands/fgrep.c    Wed Jul 13 13:10:55 1988
X--- fgrep.c    Sun Sep 25 15:24:59 1988
X***************
X*** 25,31 ****
X    int find();
X    void exparg();
X    void getargs();
X-   void maktbl();
X    void gotone();
X
X    argc=oargc;
X--- 25,30 ----
X***************
X*** 72,77 ****
X--- 71,77 ----
X  void getargs()
X  {
X    int tmp;
X+   void maktbl();
X    for (i=1; i< argc && argv[i][0]=='-'; i++) {
X      switch (argv[i][1]) {
X      case 'e':
+ END-OF-FILE fgrep.c.cdif
chmod 'u=rw,g=r,o=r' 'fgrep.c.cdif'
set `wc -c 'fgrep.c.cdif'`
count=$1
case $count in
457)    :;;
*)    echo 'Bad character count in ''fgrep.c.cdif' >&2
        echo 'Count should be 457' >&2
esac
echo Extracting 'file.c.cdif'
sed 's/^X//' > 'file.c.cdif' << '+ END-OF-FILE ''file.c.cdif'
X*** /local/ast/minix/tape3b/commands/file.c    Wed Jul 13 13:10:55 1988
X--- file.c    Sun Sep 25 15:25:00 1988
X***************
X*** 28,33 ****
X--- 28,34 ----
X  char *name;
X  {
X    int i, fd, n, magic, second, mode, nonascii, special, funnypct, etaoins;
X+   int symbols;
X    long engpct;
X    char c;
X    struct stat st_buf;
X***************
X*** 86,97 ****
X    /* Check to see if file is an executable binary. */
X    if (magic == A_OUT) {
X      /* File is executable.  Check for split I/D. */
X!     printf("executable ");
X      second = (buf[3]<<8) | (buf[2]&0377);
X      if (second == SPLIT)
X!         printf(" separate I & D space\n");
X      else
X!         printf(" combined I & D space\n");
X      close(fd);
X       return;
X    }
X--- 87,103 ----
X    /* Check to see if file is an executable binary. */
X    if (magic == A_OUT) {
X      /* File is executable.  Check for split I/D. */
X!     printf("executable");
X      second = (buf[3]<<8) | (buf[2]&0377);
X      if (second == SPLIT)
X!         printf("   separate I & D space");
X      else
X!         printf("   combined I & D space");
X!     symbols = buf[28] | buf[29] | buf[30] | buf[31];
X!     if (symbols != 0)
X!         printf("   not stripped\n");
X!     else
X!         printf("   stripped\n");
X      close(fd);
X       return;
X    }
+ END-OF-FILE file.c.cdif
chmod 'u=rw,g=r,o=r' 'file.c.cdif'
set `wc -c 'file.c.cdif'`
count=$1
case $count in
1189)    :;;
*)    echo 'Bad character count in ''file.c.cdif' >&2
        echo 'Count should be 1189' >&2
esac
echo Extracting 'getlf.c.cdif'
sed 's/^X//' > 'getlf.c.cdif' << '+ END-OF-FILE ''getlf.c.cdif'
X*** /local/ast/minix/tape3b/commands/getlf.c    Wed Jul 13 13:10:56 1988
X--- getlf.c    Sun Sep 25 15:25:01 1988
X***************
X*** 1,3 ****
X--- 1,5 ----
X+ /* getlf - get a line feed        Author: Andy Tanenbaum */
X+
X  main(argc, argv)
X  int argc;
X  char *argv[];
+ END-OF-FILE getlf.c.cdif
chmod 'u=rw,g=r,o=r' 'getlf.c.cdif'
set `wc -c 'getlf.c.cdif'`
count=$1
case $count in
255)    :;;
*)    echo 'Bad character count in ''getlf.c.cdif' >&2
        echo 'Count should be 255' >&2
esac
echo Extracting 'help.c.new'
sed 's/^X//' > 'help.c.new' << '+ END-OF-FILE ''help.c.new'
X/* help - provide assistance about keywords    Author: Wolf N. Paul */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#define MAXLINE    134
X#define HELPDIR    "/usr/lib"      /* Added by John Plocher */
X#define HELPFILE   "helpfile"      /* .. */
X#define INDEX      ".idx"          /* .. */
X
Xchar *helpfilename = "/usr/lib/helpfile";
Xchar *helpidxname  = "/usr/lib/helpfile.idx";
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X   struct
X   {
X       char name[15];
X       long offset;
X   } entry;                /* helpindex entries for each command */
X
X   struct stat sbuf1, sbuf2;   /* stat buffers for helpfile & helpindex */
X   char *command, *line, Line[MAXLINE];
X   register char   *cp;        /* John Plocher */
X   extern char *getenv();      /* .. */
X   int status;
X   FILE *ifp, *hfp;        /* file pointers for helpfile and helpindex */
X
X   if (argc > 2) {
X    fprintf(stderr, "Usage: help subject\n");
X    exit(1);
X   }
X
X   if ( argc == 1 )        /* If no arguments, ... */
X       command = "help";   /* ... default to "help help" */
X   else
X       command = argv[1];  /* else look for command in argv[1] */
X
X   stat(helpfilename, &sbuf1); /* get mtime for helpfile */
X   status=access(helpidxname, 0);
X   if ( status == 0 )  /* if helpindex exists ... */
X   {
X       stat(helpidxname, &sbuf2);  /* get mtime for helpindex */
X   }
X   if ( (status != 0) ||           /* if there is no helpindex ... */
X       (sbuf1.st_mtime > sbuf2.st_mtime) )
X                                   /* or if it is older than helpfile */
X   {
X       buildindex();       /* build a new helpindex */
X   }
X
X   system("clr");        /* clear the screen */
X
X   if ( (ifp=fopen(helpidxname, "r")) == NULL )
X   {
X       fprintf(stderr, "Can't read %s\n", helpidxname);
X       exit(-1);
X   }
X
X   while ( 1 )     /* look for index entry for "command" */
X   {
X       status=fread(&entry, sizeof(entry), 1, ifp);
X       if ( status==0 ) /* quit at end of index file */
X       {
X           fprintf(stderr, "No help for %s\n", command);
X           fclose(ifp);
X           exit(1);        }
X       if ( strcmp(entry.name, command) == 0 ) /* quit when we find it */
X       {
X           fclose(ifp);
X           break;
X       }
X   }
X
X   if ((hfp=fopen(helpfilename, "r")) == NULL )
X   {
X       fprintf(stderr, "Can't open %s\n", helpfilename);
X       exit(-1);
X   }
X
X   fseek(hfp, entry.offset, 0);    /* go to the help entry */
X
X   while ( 1 )         /* just copy lines to stdout */
X   {
X       line = fgets(Line, MAXLINE, hfp);
X       if ( line == (char *) NULL || line[0] == '#' )
X                       /* until another entry starts */
X           break;
X       fputs(line,stdout);
X   }
X
X   fclose(hfp);
X}
X
Xbuildindex()
X{
X   FILE *hfp, *ifp;
X   struct {
X       char name[15];
X       long offset;
X   } entry;
X   char Line[MAXLINE];
X   char *line;
X   int i,j;
X
X
X   unlink(helpidxname); /* remove old index file */
X   if ( (hfp=fopen(helpfilename, "r")) == NULL )
X   {
X       fprintf(stderr,"buildindex: Can't read %s\n", helpfilename);
X       exit(-1);
X   }
X   if ( (ifp=fopen(helpidxname, "w")) == NULL )
X   {
X       fprintf(stderr, "buildindex: Can't write %s\n", helpidxname);
X       exit(-1);
X   }
X
X   while (1)   /* Read thru helpfile ... */
X   {
X       entry.offset=(long) 0;
X       line = fgets(Line, MAXLINE, hfp);
X       if ( line == (char *) NULL ) break;
X       if ( line[0] == '#' )   /* and for each help entry ... */
X       {
X           line++;
X           while ( isspace(line[0]) ) line++;
X           i=j=0;
X           while ( line[i] != '\0' )
X           {
X               if ( line[i] == '\n' ) break;
X               while ( line[i] == ' ' || line[i] == ',' ) i++;
X               while ( !isspace(line[i] ) &&
X                       line[i] != ',') /* save its name ... */
X               {
X                   entry.name[j] = line[i];
X                   i++; j++;
X               }
X               while ( j < 15 )
X                   entry.name[j++] = '\0';
X               j = 0;
X               entry.offset=ftell(hfp);    /* and its offset ... */
X               fwrite(&entry, sizeof(entry), 1, ifp);
X                                       /* and write it to indexfile */
X           }
X       }
X   }
X   fclose(hfp);
X   fclose(ifp);
X}
+ END-OF-FILE help.c.new
chmod 'u=rw,g=r,o=r' 'help.c.new'
set `wc -c 'help.c.new'`
count=$1
case $count in
4249)    :;;
*)    echo 'Bad character count in ''help.c.new' >&2
        echo 'Count should be 4249' >&2
esac
echo Extracting 'libupack.c.cdif'
sed 's/^X//' > 'libupack.c.cdif' << '+ END-OF-FILE ''libupack.c.cdif'
X*** /local/ast/minix/tape3b/commands/libupack.c    Wed Jul 13 13:10:58 1988
X--- libupack.c    Sun Sep 25 15:25:03 1988
X***************
X*** 1,3 ****
X--- 1,5 ----
X+ /* libupack - unpack a packed .s file        Author: Andy Tanenbaum */
X+
X  char *table[] = {
X  "push ax",
X  "ret",
+ END-OF-FILE libupack.c.cdif
chmod 'u=rw,g=r,o=r' 'libupack.c.cdif'
set `wc -c 'libupack.c.cdif'`
count=$1
case $count in
267)    :;;
*)    echo 'Bad character count in ''libupack.c.cdif' >&2
        echo 'Count should be 267' >&2
esac
echo Extracting 'login.c'
sed 's/^X//' > 'login.c' << '+ END-OF-FILE ''login.c'
X/* login - log into the system        Author: Patrick van Kleef */
X
X/* Peter S. Housel   Jan. 1988
X *  - Set up $USER, $HOME and $TERM.
X *  - Set signals to SIG_DFL.
X *
X * Terrence W. Holm   June 1988
X *  - Allow a username as an optional argument.
X *  - Time out if a password is not typed within 30 seconds.
X *  - Perform a dummy delay after a bad username is entered.
X *  - Don't allow a login if "/etc/nologin" exists.
X *  - Cause a failure on bad "pw_shell" fields.
X *  - Record the login in "/usr/adm/wtmp".
X */
X
X#include <signal.h>
X#include <sgtty.h>
X#include <pwd.h>
X#include <sys/stat.h>
X
X#define  NULL   (char *) 0
X#define WTMPSIZE           8
X#define DIGIT 3
X
Xextern char *crypt();
Xextern struct passwd *getpwnam();
Xextern long time();
Xextern long lseek();
Xint Time_out();
X
Xint  time_out;
X
Xchar user[ 32 ];
Xchar logname[ 35 ];
Xchar home[ 64 ];
Xchar shell[ 64 ];
X
Xchar *env[] = {
X          user,
X          logname,
X          home,
X          shell,
X          "TERM=minix",
X          NULL
X};
Xchar wtmpfile[] = {"/usr/adm/wtmp"};
Xchar ttyname[] = {"tty?"};
X
X
Xmain( argc, argv )
Xint   argc;
Xchar *argv[];
X{
X    char    name[30];
X    char    password[30];
X    int     bad;
X    int    n;
X    int     ttynr;
X    struct  sgttyb args;
X    struct  passwd *pwd;
X    struct stat statbuf;
X    char   *sh = "/bin/sh";
X
X    /* Reset some of the line parameters in case they have been mashed */
X    if ( ioctl(0, TIOCGETP, &args) < 0 ) exit( 1 );
X
X    args.sg_kill  = '@';
X    args.sg_erase = '\b';
X    args.sg_flags = (args.sg_flags & 01700) | XTABS | CRMOD | ECHO;
X    ioctl (0, TIOCSETP, &args);
X
X    /* Get login name and passwd. */
X    for (;;) {
X        bad = 0;
X
X        if ( argc > 1 ) {
X            strcpy( name, argv[1] );
X            argc = 1;
X        } else {
X            do {
X            write(1,"login: ",7);
X            n = read (0, name, 30);
X            } while (n < 2);
X            name[n - 1] = 0;
X        }
X
X        /* Look up login/passwd. */
X        if ((pwd = getpwnam (name)) == 0) bad++;
X
X        /* If login name wrong or password exists, ask for pw. */
X        if (bad || strlen (pwd->pw_passwd) != 0) {
X            args.sg_flags &= ~ECHO;
X            ioctl (0, TIOCSETP, &args);
X            write(1,"Password: ",10);
X
X            time_out = 0;
X            signal( SIGALRM, Time_out );
X            alarm( 30 );
X
X            n = read (0, password, 30);
X
X            alarm( 0 );
X            if ( time_out ) {
X                n = 1;
X                bad++;
X            }
X
X            password[n - 1] = 0;
X            write(1,"\n",1);
X            args.sg_flags |= ECHO;
X            ioctl (0, TIOCSETP, &args);
X
X            if (bad && crypt(password, "aaaa") ||
X             strcmp (pwd->pw_passwd, crypt(password, pwd->pw_passwd))) {
X                write (1,"Login incorrect\n",16);
X                continue;
X            }
X        }
X
X        /*  Check if the system is going down  */
X        if ( access( "/etc/nologin", 0 ) == 0  &&
X                        strcmp( name, "root" ) != 0 ) {
X            write( 1, "System going down\n\n", 19 );
X            continue;
X        }
X
X
X        /* Look up /dev/tty number. */
X        fstat(0, &statbuf);
X        ttynr = statbuf.st_rdev & 0377;
X        ttyname[DIGIT] = '0' + ttynr;
X
X        /*  Write login record to /usr/adm/wtmp  */
X        wtmp(ttyname, name);
X
X        setgid( pwd->pw_gid );
X        setuid( pwd->pw_uid );
X
X        if (pwd->pw_shell[0]) sh = pwd->pw_shell;
X
X        /*  Set the environment  */
X        strcpy( user,  "USER=" );
X        strcat( user,   name );
X        strcpy( logname, "LOGNAME=" );
X        strcat( logname, name );
X        strcpy( home,  "HOME=" );
X        strcat( home,  pwd->pw_dir );
X        strcpy( shell, "SHELL=" );
X        strcat( shell, sh );
X
X        chdir( pwd->pw_dir );
X
X        /* Reset signals to default values. */
X
X        for ( n = 1;  n <= NR_SIGS;  ++n )
X            signal( n, SIG_DFL );
X
X        execle( sh, "-", NULL, env );
X        write(1,"exec failure\n",13);
X        exit(1);
X    }
X}
X
X
X
XTime_out( )
X{
X  time_out = 1;
X}
X
Xwtmp(tty, name)
X{
X/* Make an entry in /usr/adm/wtmp. */
X
X  int i, fd;
X  long t, time();
X  char ttybuff[WTMPSIZE], namebuff[WTMPSIZE];
X
X  fd = open(wtmpfile, 2);
X  if (fd < 0) return;        /* if wtmp does not exist, no accounting */
X  lseek(fd, 0L, 2);        /* append to file */
X
X  for (i = 0; i < WTMPSIZE; i++) {
X    ttybuff[i] = 0;
X    namebuff[i] = 0;
X  }
X  strncpy(ttybuff, tty, 8);
X  strncpy(namebuff, name, 8);
X  time(&t);
X  write(fd, ttybuff, WTMPSIZE);
X  write(fd, namebuff, WTMPSIZE);
X  write(fd, &t, sizeof(t));
X  close(fd);
X}
+ END-OF-FILE login.c
chmod 'u=rw,g=r,o=r' 'login.c'
set `wc -c 'login.c'`
count=$1
case $count in
3973)    :;;
*)    echo 'Bad character count in ''login.c' >&2
        echo 'Count should be 3973' >&2
esac
echo Extracting 'ls.c.cdif'
sed 's/^X//' > 'ls.c.cdif' << '+ END-OF-FILE ''ls.c.cdif'
X*** /local/ast/minix/tape3b/commands/ls.c    Wed Jul 13 13:11:02 1988
X--- ls.c    Sun Sep 25 15:25:05 1988
X***************
X*** 1,4 ****
X--- 1,5 ----
X  /* ls - list files and directories     Author: Andy Tanenbaum */
X+ /* Version: Minix 1.3 */
X
X  #include <stdio.h>
X  #include <sys/types.h>
X***************
X*** 23,28 ****
X--- 24,30 ----
X    long modtime;
X    long size;
X    short link;
X+   char is_path;            /* 1 => fp_name is null terminated */
X  } file[NFILE+1];
X
X  struct dir {
X***************
X*** 99,105 ****
X    statflag = (topfiles == 0 ? 0 : 1);
X    if (present('c') || present('t') || present('u')) statflag = 1;
X    if (present('s') || present('l')) statflag = 1;
X!   while (k < argc) fill_file("", argv[k++], statflag);
X  }
X
X
X--- 101,107 ----
X    statflag = (topfiles == 0 ? 0 : 1);
X    if (present('c') || present('t') || present('u')) statflag = 1;
X    if (present('s') || present('l')) statflag = 1;
X!   while (k < argc) fill_file("", argv[k++], statflag,1);
X  }
X
X
X***************
X*** 212,218 ****
X      fp = &file[sort_index[k]];
X      if (present('l') || present('s') || present('i'))
X          if (fp->size == -1L)    /* -1 means stat not done */
X!             if (stat_file(dirname, fp) < 0) continue;
X
X      m = fp->mode & I_TYPE;    /* 'm' may be junk if 'expand' = 0 */
X      if (present('f')) m = I_DIRECTORY;
X--- 214,220 ----
X      fp = &file[sort_index[k]];
X      if (present('l') || present('s') || present('i'))
X          if (fp->size == -1L)    /* -1 means stat not done */
X!             if (stat_file(dirname, fp, fp->is_path) < 0) continue;
X
X      m = fp->mode & I_TYPE;    /* 'm' may be junk if 'expand' = 0 */
X      if (present('f')) m = I_DIRECTORY;
X***************
X*** 223,229 ****
X          /* Expand and print directory. */
X          exp_dir(fp);
X          sort(nrf, nrfiles - nrf, 0);
X!         if (topfiles > 1) fprintf(stdout, "\n%s:\n", fp->name);
X          print_total(nrf, nrfiles - nrf);
X          print(nrf, nrfiles - nrf, 0, fp->name);    /* recursion ! */
X          nrfiles = nrf;
X--- 225,235 ----
X          /* Expand and print directory. */
X          exp_dir(fp);
X          sort(nrf, nrfiles - nrf, 0);
X!         if (topfiles > 1) {
X!             fprintf(stdout, "\n");
X!             pfname(fp->name,fp->is_path);
X!             fprintf(stdout, ":\n");
X!         }
X          print_total(nrf, nrfiles - nrf);
X          print(nrf, nrfiles - nrf, 0, fp->name);    /* recursion ! */
X          nrfiles = nrf;
X***************
X*** 270,276 ****
X              if (*p == '.' && *(p+1) == 0) continue;
X              if (*p == '.' && *(p+1) == '.' && *(p+2) == 0) continue;
X          }
X!         fill_file(fp->name, p, statflag);
X      }
X    }
X    close(fd);
X--- 276,282 ----
X              if (*p == '.' && *(p+1) == 0) continue;
X              if (*p == '.' && *(p+1) == '.' && *(p+2) == 0) continue;
X          }
X!         fill_file(fp->name, p, statflag,0);
X      }
X    }
X    close(fd);
X***************
X*** 280,288 ****
X
X
X
X! fill_file(prefix, postfix, statflag)
X  char *prefix, *postfix;
X! int statflag;
X  {
X  /* Fill the next 'file' struct entry with the file whose name is formed by
X   * concatenating 'prefix' and 'postfix'.  Stat only if needed.
X--- 286,294 ----
X
X
X
X! fill_file(prefix, postfix, statflag, pathflag)
X  char *prefix, *postfix;
X! int statflag, pathflag;
X  {
X  /* Fill the next 'file' struct entry with the file whose name is formed by
X   * concatenating 'prefix' and 'postfix'.  Stat only if needed.
X***************
X*** 297,304 ****
X    }
X    fp = &file[nrfiles++];
X    fp->name = postfix;
X    if(statflag) {
X!     if (stat_file(prefix, fp) < 0) nrfiles--;
X    } else {
X      fp->size = -1L;        /* mark file as not yet stat'ed */
X    }
X--- 303,311 ----
X    }
X    fp = &file[nrfiles++];
X    fp->name = postfix;
X+   fp->is_path = pathflag;
X    if(statflag) {
X!     if (stat_file(prefix, fp, pathflag) < 0) nrfiles--;
X    } else {
X      fp->size = -1L;        /* mark file as not yet stat'ed */
X    }
X***************
X*** 308,315 ****
X
X
X
X! print_line(fp)
X  struct file *fp;
X  {
X    int blks, m, prot, s;
X    char *p1, *p2, *p3, c;
X--- 315,323 ----
X
X
X
X! print_line(fp,is_path)
X  struct file *fp;
X+ int  is_path;
X  {
X    int blks, m, prot, s;
X    char *p1, *p2, *p3, c;
X***************
X*** 358,376 ****
X
X      /* Print file name. */
X      m = 0;
X!     p1 = fp->name;
X!     while (*p1 != 0 && (m < DIRNAMELEN || *p1 == '/') ) {
X!         fprintf(stdout, "%c", *p1);
X!         m = (*p1 == '/' ? 0 : m + 1);
X!         p1++;
X!     }
X      fprintf(stdout, "\n");
X  }
X
X
X
X
X-
X  owngrp(fp)
X  struct file *fp;
X  {
X--- 366,394 ----
X
X      /* Print file name. */
X      m = 0;
X!     pfname(fp->name,fp->is_path);
X      fprintf(stdout, "\n");
X  }
X
X+ pfname(ptr,pathflag)
X+ char *ptr;
X+ int  pathflag;
X+ {
X+     int  m;
X+     if (pathflag) {
X+         fprintf(stdout,"%s",ptr);
X+     } else {
X+         /* dirname entry is null terminated if length < 14 */
X+         m = 0;
X+         while (*ptr && m < DIRNAMELEN) {
X+             putc(*ptr++, stdout);
X+             ++m;
X+         }
X+     }
X+ }
X
X
X
X  owngrp(fp)
X  struct file *fp;
X  {
X***************
X*** 393,405 ****
X
X
X
X! int stat_file(prefix, fp)
X  char *prefix;
X  struct file *fp;
X  {
X  /* Stat a file and enter it in 'file'. */
X
X!   char namebuf[MAXPATHLEN], *p, *org, *q;
X    struct stat sbuf;
X    int m, ctr;
X
X--- 411,424 ----
X
X
X
X! int stat_file(prefix, fp, pathflag)
X  char *prefix;
X  struct file *fp;
X+ int pathflag;
X  {
X  /* Stat a file and enter it in 'file'. */
X
X!   char namebuf[MAXPATHLEN], *p, *q;
X    struct stat sbuf;
X    int m, ctr;
X
X***************
X*** 408,421 ****
X    q = prefix;
X    while (*q != 0 && p - namebuf < MAXPATHLEN) *p++ = *q++;
X    if (*prefix != 0) *p++ = '/';
X-   org = fp->name;
X    q = fp->name;
X    ctr = 0;
X!   while (*q != 0 && p - namebuf < MAXPATHLEN) {
X!     ctr++;
X!     if (*q == '/') ctr = 0;
X!     if (ctr > DIRNAMELEN) break;
X!     *p++ = *q++;
X    }
X    *p = 0;
X
X--- 427,445 ----
X    q = prefix;
X    while (*q != 0 && p - namebuf < MAXPATHLEN) *p++ = *q++;
X    if (*prefix != 0) *p++ = '/';
X    q = fp->name;
X    ctr = 0;
X!
X!   if (pathflag) {
X!     /* fp->name is null terminated */
X!     while (*q) *p++ = *q++;
X!   } else {
X!     /* fp->name is char[14] */
X!     while (*q != 0 && p - namebuf < MAXPATHLEN) {
X!         ctr++;
X!         if (ctr > DIRNAMELEN) break;
X!         *p++ = *q++;
X!     }
X    }
X    *p = 0;
X
+ END-OF-FILE ls.c.cdif
chmod 'u=rw,g=r,o=r' 'ls.c.cdif'
set `wc -c 'ls.c.cdif'`
count=$1
case $count in
5992)    :;;
*)    echo 'Bad character count in ''ls.c.cdif' >&2
        echo 'Count should be 5992' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 04:00 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 4987 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 04:00 N
Received: by EB0UB011 (Mailer X1.25) id 0199; Wed, 28 Sep 88 22:07:45 HOE
Date: Wed, 28 Sep 88 19:08:07 GMT
From: Charles Hedrick <hedrick@ATHOS.RUTGERS.EDU>
Subject: Simplifying the EGA code
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

>I hope somebody can attack that problem directly.  I would very much like to
>have 2 scrolling algorithms included, toggled by F3:  6845 hardware, and
>software.

As the author of the EGA stuff, I now agree that it should go away.
The version that is going out with these diffs (assuming ast took my
latest changes) should in fact be fairly good about supporting a
variety of hardware, but it does so by getting various information
about the display adapter, including peeking inside the BIOS to see
how many scan lines are needed per character.  The problem is that
this takes us deeper and deeper into code that is intertwined with the
hardware and BIOS.  I think there was a time warp, or possibly a lost
mail message, because I've already suggested a way to simplify things.
However I think it's right not to hold up the release of 1.3c for
this.  I have promised ast that I'll code up a replacement for the EGA
hacks as soon as possible.  (I'd also like him to evaluate hannam's
proposed code.  I can't because testing it requires me to recompile
too much code.  I don't even have source to elle.)  The idea is to
avoid depending upon the hardware's ability to wrap at all.  Software
scrolling of course does this, but at the expense of having to copy
the whole screen for every line scrolled.  As far as I can tell, all
known tty adapters implement the video origin correctly.  So there's
no problem scrolling for the first few lines using the hardware.  It's
just what happens when you get to the end of memory that causes
trouble.  So the obvious fix is to copy the screen just once: when
scrolling has gotten to the end of available memory.  I conjecture
that the overhead of doing this would not be noticable.  Software
scrolling is unacceptable because when you display a page of output,
you have to wait for a big copy operation for every line.  If you do
the same operation, but only once every 25 or 50 lines, I doubt that
anyone would notice.  At any rate, even if we had to support both this
and the original 1.1 hardware scrolling, the differences could be
hidden in a very small section of code, and most of the current cruft
would go away.  I'm still not entirely sure that I understand the code
that hannam posted a week or so ago (attempts to get mail to him seem
to have failed).  However if it works at all for non-wrapping EGA
clones, it works by a slight variant of the same mechanism, where the
copying is done a line at a time for the last 25 scroll operations
rather than for the whole screen when the end of memory is reach.  The
amount of data moved would be the same.

You should expect to hear more from me in a week or two, after I have
a chance to try out these ideas.

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 07:14 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6148 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 07:14 N
Received: by EB0UB011 (Mailer X1.25) id 2079; Thu, 29 Sep 88 07:13:37 HOE
Date: Wed, 28 Sep 88 12:02:12 GMT
From: Karel van Houten <tnsgvdp@DUTRUN.UUCP>
Subject: Re: Float f'ns & system calls
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

In article <273@gara.une.oz> wtoomey@gara.une.oz (Warren Toomey) writes:
>I'd like to be able to do floating point in Minix

***** I WOULD LIKE THAT TOO!!!!!!! ******

******************************************************************************
  Ronald van der Pol
UUCP:     ...!mcvax!dutrun!tnsgvdp
DOMAIN:   tnsgvdp@dutrun.surf
  Be careful! This is an extremely primitive and paranoid culture! - J.T.Kirk
******************************************************************************

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 07:50 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6190 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 07:50 N
Received: by EB0UB011 (Mailer X1.25) id 2149; Thu, 29 Sep 88 07:49:39 HOE
Date: Wed, 28 Sep 88 00:57:26 GMT
From: Warren Toomey <wtoomey@GARA.UNE.OZ>
Subject: Re: csh on minix
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

In several articles to date:
> >>>::> I want to put csh on my minix.
> >>>:: Why on Earth would anyone want to clone that mess? :-)
> >>> Because they're smart?
> >>No.  Because they've never used ksh.
> >- Because they're used to csh from another system.

Ok, let's solve this debate by saying, if you want <particular shell> on
Minix, then you should write it. If you look back a few weeks, you'll
see that I posted an article asking for some system calls which haven't
been implemented on Minix yet, so I could do a port of my friend's tcsh
clone. Haven't noticed any replies, either!

Re: this shell is better than that, if you write <particular shell> and
post it to this newsgroup, we'll be able to try it ourselves, and see
if it is better.

Right, now let's get back to Minix..

+--------------------------------------------------------------------------+
|Warren Toomey                                                             |
|Dept. of Computing Science  ACSNET: wtoomey@gara.une.oz                   |
|University of New England   UUCP: ...!uunet!munnari!gara.une.oz!wtoomey   |
|Armidale Australia 2351     ARPA: wtoomey%gara.une.oz@uunet.uu.net        |
+--------------------------------------------------------------------------+
|      "Life isn't as trivial as it seems, it only appears to be."         |
+--------------------------------------------------------------------------+

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 09:05 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6230 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 09:04 N
Received: by EB0UB011 (Mailer X1.25) id 2195; Thu, 29 Sep 88 08:43:10 HOE
Date: Wed, 28 Sep 88 10:48:40 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: Re: 1.3a/b update, comp.sources.minix?
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

In article <2545@sultra.UUCP> dtynan@sultra.UUCP (Der Tynan) writes:
>The last thing I have to say is directed at Dr. Tanenbaum
In general, when you have a message for a small number of people, it is
considered polite to use mail, not news.  Since the request came via news
I might as well answer that way.

>I only ordered the disks, I have a plethora of OS books, and wasn't in a
>hurry to extend the collection.
Unfortunately, the manual is included in the book and one is expected to
read it.  We could have bound the software and book together (and in fact
P-H now has such a package), but we thought it more flexible to make them
available separately.

[Discussion of physical security]
In general, I sort of regard "physical methods" such as using external
computers, xray machines, magnets, operator torture, bribing secretaries,
breaking into my office in the dead of night, and such like as bordering
on cheating, but I'll keep my word.  You get a rijksdaalder, which is a
Dutch coin currently retailing for about 47 Belgian Franks.

Andy Tanenbaum (ast@cs.vu.nl)

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 08:34 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 6181 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 08:33 N
Received: by EB0UB011 (Mailer X1.25) id 2141; Thu, 29 Sep 88 07:25:11 HOE
Date: Wed, 28 Sep 88 10:24:35 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: Useful new program and 1.3 checksums
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

Johan Stevenson (the person who was the driving force behind Atari MINIX)
just sent me a very useful little program that combines ls -l and sum.  It
is called crc, and the call:  crc file1 ...   prints for each argument both
the file length and a checksum.  The checksum uses a crc algorithm, and is not
compatible with sum.  Below is a shell archive containing both the program
and the crc output for the full 1.3 distribution as it is on my Sun workstation
at the university.  After you apply all the 1.3 updates, compare your
distribution to this list to see if you got it right.  One of these days I
will compare my disk at home (the master machine) with the Sun to see if I
got it right.

Andy Tanenbaum (ast@cs.vu.nl)

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'crc.c'
sed 's/^X//' > 'crc.c' << '+ END-OF-FILE ''crc.c'
X/* crc - list length and checksum        Author: Johan W. Stevenson */
X
X
X#include <stdio.h>
X
Xint    errs;
X
Xmain(argc,argv)
Xchar **argv;
X{
X
X    if (argc <= 1)
X        crc((char *)0);
X    else
X        do {
X            if (freopen(argv[1], "r", stdin) == NULL)
X                error("cannot open %s", argv[1]);
X            else
X                crc(argv[1]);
X            argv++;
X            argc--;
X        } while (argc > 1);
X    exit(errs != 0);
X}
X
X/* crctab calculated by Mark G. Mendel, Network Systems Corporation */
Xstatic unsigned short crctab[256] = {
X    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
X    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
X    0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
X    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
X    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
X    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
X    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
X    0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
X    0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
X    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
X    0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
X    0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
X    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
X    0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
X    0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
X    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
X    0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
X    0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
X    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
X    0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
X    0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
X    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
X    0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
X    0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
X    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
X    0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
X    0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
X    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
X    0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
X    0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
X    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
X    0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
X};
X
X/*
X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell.
X *  NOTE: First argument must be in range 0 to 255.
X *        Second argument is referenced twice.
X *
X * Programmers may incorporate any or all code into their programs,
X * giving proper credit within the source. Publication of the
X * source routines is permitted so long as proper credit is given
X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
X * Omen Technology.
X */
X
X#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)
X
Xcrc(fname)
Xchar *fname;
X{
X    register int        c;
X    register int        i;
X    register long        len = 0;
X    register unsigned short    crc = 0;
X
X    while ((c = getc(stdin)) != EOF) {
X        len++;
X        crc = updcrc(c, crc);
X    }
X    printf("%05u %6ld", crc, len, fname);
X    if (fname)
X        printf(" %s", fname);
X    printf("\n");
X}
X
Xerror(s, a1, a2, a3, a4)
Xchar *s;
X{
X
X    fprintf(stderr, "crc: ");
X    fprintf(stderr, s, a1, a2, a3, a4);
X    fprintf(stderr, "\n");
X    errs++;
X}
+ END-OF-FILE crc.c
chmod 'u=rw,g=r,o=r' 'crc.c'
set `wc -c 'crc.c'`
count=$1
case $count in
3512)    :;;
*)    echo 'Bad character count in ''crc.c' >&2
        echo 'Count should be 3512' >&2
esac
echo Extracting 'log'
sed 's/^X//' > 'log' << '+ END-OF-FILE ''log'
X41007   6207 commands/animals.c
X48404  19498 commands/ar.c
X16433   1615 commands/ascii.c
X16506   5839 commands/ast.c
X60664   4941 commands/at.c
X30600   1730 commands/atrun.c
X11818  14134 commands/badblocks.c
X09785   6370 commands/banner.c
X01345    622 commands/basename.c
X03957   7987 commands/cal.c
X10463   1439 commands/cat.c
X36776  11781 commands/cc.c
X42817   5931 commands/cdiff.c
X57375    732 commands/chgrp.c
X27811   2687 commands/chmem.c
X34212   6964 commands/chmod.c
X46813    727 commands/chown.c
X05561    757 commands/clr.c
X06733   2220 commands/cmp.c
X06836   3433 commands/comm.c
X31356  38532 commands/compress.c
X63905   3546 commands/cp.c
X54611   5843 commands/cpdir.c
X27715   5143 commands/cron.c
X11198   2223 commands/date.c
X49446   5662 commands/dd.c
X22124   3577 commands/df.c
X16917   5383 commands/diff.c
X39760    512 commands/dis88
X37626   3982 commands/diskcheck.c
X26190  28473 commands/dosread.c
X02565   4395 commands/du.c
X48277    723 commands/echo.c
X07544  42036 commands/ed.c
X23787   2763 commands/expr.c
X47116    773 commands/factor.c
X41725   9890 commands/fdisk.c
X18084   5493 commands/fgrep.c
X61039   3220 commands/file.c
X28049  12342 commands/find.c
X04128   4592 commands/fix.c
X51360    299 commands/getlf.c
X10255   2751 commands/grep.c
X32905   3148 commands/gres.c
X01913   1159 commands/head.c
X54112   4249 commands/help.c
X55302    557 commands/kill.c
X20222   4005 commands/libpack.c
X44726   2074 commands/libupack.c
X18018   1111 commands/ln.c
X59287   3973 commands/login.c
X60732   7645 commands/lorder.c
X06347   1647 commands/lpr.c
X49285  13438 commands/ls.c
X37830    512 commands/make
X56643    512 commands/mined
X01732   1319 commands/mkdir.c
X52749  25884 commands/mkfs.c
X05593    555 commands/mknod.c
X39898   5582 commands/more.c
X25884   1163 commands/mount.c
X37282   3733 commands/mv.c
X53701   3923 commands/nm.c
X21321   5148 commands/od.c
X65009   2392 commands/passwd.c
X25508  12000 commands/paste.c
X46629  12100 commands/pr.c
X44668   2025 commands/prep.c
X32932    190 commands/printenv.c
X24885   1646 commands/pwd.c
X11400    507 commands/readall.c
X52678   4113 commands/readclock.c
X12013  14455 commands/readfs.c
X56057   1456 commands/rev.c
X44299   2929 commands/rm.c
X33027   2958 commands/rmdir.c
X58915  20224 commands/roff.c
X30068  45809 commands/sed.c
X33160    512 commands/sh
X05947   1146 commands/shar.c
X08693   1521 commands/size.c
X13037    427 commands/sleep.c
X47291  31413 commands/sort.c
X45875   2073 commands/split.c
X44600   4052 commands/strings.c
X20678   2829 commands/strip.c
X45523   4700 commands/stty.c
X03641   1140 commands/su.c
X59580   1781 commands/sum.c
X57610    140 commands/sync.c
X50173   4209 commands/tail.c
X19539   9656 commands/tar.c
X51512   1178 commands/tee.c
X28429   4140 commands/term.c
X14056   3832 commands/termcap.c
X29234   4230 commands/test.c
X49230   2638 commands/time.c
X58865   1282 commands/touch.c
X10498   3267 commands/tr.c
X01207   1737 commands/traverse.c
X05558   6938 commands/treecmp.c
X47860   2431 commands/tset.c
X30205   6563 commands/tsort.c
X59715    382 commands/tty.c
X20827   1114 commands/umount.c
X06117   3263 commands/uniq.c
X30359    424 commands/update.c
X54324   3180 commands/uudecode.c
X02849   1808 commands/uuencode.c
X55996   2966 commands/vol.c
X56043   2880 commands/wc.c
X28719   1686 commands/who.c
X25742    279 commands/whoami.c
X58277  23674 doc/USER_GUIDE
X36003   3239 doc/dis88.man
X33297  14653 doc/elle.man
X42220  39018 doc/lib.doc
X40393  38509 doc/man_pages
X63945  44305 doc/net.man
X19878   4197 fs/at_makefile
X61318   2988 fs/buf.h
X31034  10863 fs/cache.c
X49601   2925 fs/const.h
X32651    273 fs/dev.h
X54203   8530 fs/device.c
X43804    474 fs/file.h
X08379   3225 fs/filedes.c
X03291   1502 fs/fproc.h
X32100   1013 fs/glo.h
X62665   7839 fs/inode.c
X05436   1943 fs/inode.h
X37259   5662 fs/link.c
X15515  15303 fs/main.c
X05005   4190 fs/makefile
X43484   7670 fs/misc.c
X59037   6257 fs/mount.c
X08819   9226 fs/open.c
X59312   1557 fs/param.h
X44200  10716 fs/path.c
X46842   4266 fs/pc_makefile
X08656   8462 fs/pipe.c
X01700   5864 fs/protect.c
X11848   1440 fs/putc.c
X15755  12205 fs/read.c
X14710   5397 fs/stadir.c
X11343   8912 fs/super.c
X10348   2081 fs/super.h
X46563   4312 fs/table.c
X03667   2620 fs/time.c
X56368    710 fs/type.h
X42080   5396 fs/utility.c
X00551   7367 fs/write.c
X45442   1683 h/callnr.h
X55177   7424 h/com.h
X21531   4403 h/const.h
X48562   2191 h/error.h
X03794   1412 h/sgtty.h
X06265   1115 h/signal.h
X51139    861 h/stat.h
X16557   4001 h/type.h
X32234   3646 include/a.out.h
X50166    133 include/ar.h
X61900    152 include/assert.h
X26992    673 include/ctype.h
X36672   1133 include/errno.h
X40434    351 include/fcntl.h
X08357     66 include/grp.h
X09580   2132 include/limits.h
X47777     81 include/memory.h
X64720    128 include/pwd.h
X65152    634 include/regexp.h
X62754     98 include/setjmp.h
X03794   1412 include/sgtty.h
X06265   1115 include/signal.h
X56753   1307 include/stdio.h
X42727    263 include/string.h
X34166    139 include/time.h
X08000    352 include/unistd.h
X54909     74 include/utime.h
X13220    217 include/utmp.h
X17574   3026 kernel/at_makefile
X64098  16075 kernel/at_wini.c
X61767   9461 kernel/clock.c
X35525  40525 kernel/console.c
X46559   2880 kernel/const.h
X09961   3543 kernel/dmp.c
X37030  26551 kernel/floppy.c
X57617    941 kernel/glo.h
X24617  27165 kernel/klib88.s
X01335  11156 kernel/main.c
X42475   3015 kernel/makefile
X36060   5296 kernel/memory.c
X09331  13834 kernel/mpx88.s
X50370   3183 kernel/pc_makefile
X56408   9952 kernel/printer.c
X33362  13732 kernel/proc.c
X21644   2324 kernel/proc.h
X12176  18813 kernel/ps_wini.c
X61265  18997 kernel/rs232.c
X14553  19824 kernel/system.c
X38305   3634 kernel/table.c
X61842  28048 kernel/tty.c
X61705   7512 kernel/tty.h
X44806   4708 kernel/ttymaps.h
X27554    742 kernel/type.h
X14198  26433 kernel/xt_wini.c
X38561    653 lib/READ_ME
X44585     67 lib/abort.c
X62378     35 lib/abs.c
X00847    116 lib/access.c
X53180    130 lib/alarm.c
X15118   2103 lib/amoeba.c
X02865   1052 lib/atoi.c
X09958    308 lib/atol.c
X05346    495 lib/bcmp.c
X46098    116 lib/bcopy.c
X32077    526 lib/brk.c
X45837    128 lib/brk2.c
X32537    998 lib/bsearch.c
X13825    329 lib/bzero.c
X45333   2076 lib/call.c
X38438     95 lib/chdir.c
X24400    114 lib/chmod.c
X35694    160 lib/chown.c
X52416     97 lib/chroot.c
X63814    142 lib/cleanup.c
X09772    117 lib/close.c
X17351    113 lib/creat.c
X52070    880 lib/crypt.c
X19954    619 lib/ctermid.c
X40552   1960 lib/ctime.c
X29735    609 lib/ctype.c
X00864    553 lib/cuserid.c
X00979   4102 lib/doprintf.c
X44155    112 lib/dup.c
X07247    130 lib/dup2.c
X29888   2327 lib/exec.c
X32310   1858 lib/execlp.c
X25467    298 lib/exit.c
X09724    314 lib/fclose.c
X45926    830 lib/fdopen.c
X61312    356 lib/fflush.c
X12779    224 lib/ffs.c
X58025    617 lib/fgetc.c
X56675    305 lib/fgets.c
X36305    985 lib/fopen.c
X41218    103 lib/fork.c
X34967    309 lib/fprintf.c
X12884    721 lib/fputc.c
X23657    102 lib/fputs.c
X26759    350 lib/fread.c
X10093    175 lib/freopen.c
X46552    969 lib/fseek.c
X24992    156 lib/fstat.c
X58766    407 lib/ftell.c
X34432    315 lib/fwrite.c
X23802   2784 lib/getcwd.c
X49079    172 lib/getegid.c
X11147    494 lib/getenv.c
X20964    172 lib/geteuid.c
X30382    133 lib/getgid.c
X35565   2051 lib/getgrent.c
X30802    429 lib/getlogin.c
X14641    445 lib/getpass.c
X01525    107 lib/getpid.c
X47346   1734 lib/getpwent.c
X34634    228 lib/gets.c
X42731    133 lib/getuid.c
X01733     96 lib/gtty.c
X38698    113 lib/index.c
X34565   1710 lib/ioctl.c
X41007    187 lib/isatty.c
X49081    438 lib/itoa.c
X62370    205 lib/kill.c
X36738    293 lib/lib.h
X18984    146 lib/link.c
X34936    811 lib/lsearch.c
X53203    261 lib/lseek.c
X19750   4607 lib/malloc.c
X08173    296 lib/memccpy.c
X18528    280 lib/memchr.c
X58142    331 lib/memcmp.c
X02386    691 lib/memcpy.c
X27776    260 lib/memset.c
X60920    139 lib/message.c
X31402    160 lib/mknod.c
X23306    420 lib/mktemp.c
X63119    181 lib/mount.c
X39272    111 lib/open.c
X33919    105 lib/pause.c
X43918   1474 lib/perror.c
X10862    215 lib/pipe.c
X11127   1048 lib/popen.c
X04176    360 lib/printdat.c
X50919   4044 lib/printk.c
X11770   1225 lib/prints.c
X36117    117 lib/puts.c
X50428   2820 lib/qsort.c
X65186    172 lib/rand.c
X49122    179 lib/read.c
X55285  27651 lib/regexp.c
X06232   2106 lib/regsub.c
X10614    156 lib/rindex.c
X65445   1643 lib/run
X18260   5928 lib/scanf.c
X33815    299 lib/setbuf.c
X06203    121 lib/setgid.c
X13969    121 lib/setuid.c
X16064    843 lib/signal.c
X47616    235 lib/sleep.c
X06501    294 lib/sprintf.c
X12818    164 lib/stat.c
X03184    211 lib/stb.c
X32278     91 lib/stderr.c
X07568    100 lib/stime.c
X46909    267 lib/strcat.c
X54813    276 lib/strchr.c
X21978    167 lib/strcmp.c
X60457    159 lib/strcpy.c
X46371    698 lib/strcspn.c
X37192    124 lib/strlen.c
X50373    442 lib/strncat.c
X09417    486 lib/strncmp.c
X24852    541 lib/strncpy.c
X64825    670 lib/strpbrk.c
X51316    301 lib/strrchr.c
X31009    705 lib/strspn.c
X29781    856 lib/strstr.c
X47083   1663 lib/strtok.c
X10475     96 lib/stty.c
X01903    278 lib/swab.c
X40136    103 lib/sync.c
X43423   4481 lib/syslib.c
X38766    436 lib/system.c
X39955   5964 lib/termcap.c
X33646    258 lib/time.c
X49116    304 lib/times.c
X23871   1367 lib/ttyname.c
X15882    137 lib/umask.c
X08177     96 lib/umount.c
X28421    286 lib/ungetc.c
X42356    374 lib/uniqport.c
X32976     96 lib/unlink.c
X12074    187 lib/utime.c
X18953    189 lib/wait.c
X47336    154 lib/write.c
X59150   7857 mm/alloc.c
X49710   1833 mm/at_makefile
X05784   7234 mm/break.c
X43289    744 mm/const.h
X37617  17077 mm/exec.c
X17024   9871 mm/forkexit.c
X34366   1572 mm/getset.c
X06761    799 mm/glo.h
X41965   7272 mm/main.c
X24264   1826 mm/makefile
X46388   1661 mm/mproc.h
X21684    677 mm/param.h
X39295   1890 mm/pc_makefile
X54292   1487 mm/putc.c
X55828  13811 mm/signal.c
X09215   3143 mm/table.c
X17333    238 mm/type.h
X20567   4181 mm/utility.c
X59092    251 test/makefile
X29539    100 test/run
X20503     22 test/t10a.c
X51001    840 test/t11a.c
X42075    462 test/t11b.c
X01801   5927 test/test0.c
X45629   1116 test/test1.c
X32574   1765 test/test10.c
X11430   1821 test/test11.c
X39909    432 test/test12.c
X55929    736 test/test13.c
X64882  39248 test/test17.c
X07191  32979 test/test18.c
X03527   4544 test/test19.c
X23963   1016 test/test2.c
X49300   1461 test/test3.c
X19872   1019 test/test4.c
X26501   4532 test/test5.c
X47521   1253 test/test6.c
X43244    526 test/test7.c
X27162   1882 test/test8.c
X54372   3466 test/test9.c
X59520   2249 tools/at_makefile
X24715   8072 tools/bootblok.s
X12808   1298 tools/changemem
X51921  45901 tools/fsck.c
X34431   3158 tools/fsck1.s
X39871     44 tools/group
X21308   6082 tools/init.c
X43560    327 tools/message
X52749  25884 tools/mkfs.c
X52059     97 tools/passwd
X59520   2249 tools/pc_makefile
X00735    105 tools/profile
X09800    197 tools/rc
X12541      4 tools/ttys
X10241     22 tools/ttytype
X17960  11073 commands/dis88/README
X19257   7600 commands/dis88/dis.h
X42961  20594 commands/dis88/dis88
X03273   5589 commands/dis88/disfp.c
X61857  25688 commands/dis88/dishand.c
X58032  17458 commands/dis88/dismain.c
X16516    777 commands/dis88/disrel.c
X12188  30238 commands/dis88/distabs.c
X55558   1473 commands/dis88/makefile
X18912   1803 commands/make/ReadMe
X05068   2100 commands/make/check.c
X14691   2457 commands/make/h.h
X36629   6577 commands/make/input.c
X30757   2366 commands/make/macro.c
X32093   4332 commands/make/main.c
X05145   7681 commands/make/make.c
X22415    498 commands/make/makefile
X12045   1795 commands/make/reader.c
X27048   4916 commands/make/rules.c
X43569     96 commands/mined/makefile
X63267   6878 commands/mined/mined.h
X49653  60035 commands/mined/mined1.c
X09064  44895 commands/mined/mined2.c
X58305    127 commands/sh/makefile
X38542   7321 commands/sh/sh.h
X35063  14561 commands/sh/sh1.c
X12818  11571 commands/sh/sh2.c
X13189  16895 commands/sh/sh3.c
X34776  12321 commands/sh/sh4.c
X24520   9258 commands/sh/sh5.c
X26188     92 commands/sh/sh6.c
+ END-OF-FILE log
chmod 'u=rw,g=r,o=r' 'log'
set `wc -c 'log'`
count=$1
case $count in
11822)    :;;
*)    echo 'Bad character count in ''log' >&2
        echo 'Count should be 11822' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (09/29/88)

The message could not be delivered to:

Addressee: EAMATEO
Reason:
  %MAIL-E-NOSUCHUSR, no such user EAMATEO at node GAUDI

----------------------------------------

Received: from JNET-DAEMON by EBRUPC51; Thu, 29 Sep 88 08:38 N
Received: From EB0UB011(MAILER) by EBRUPC51 with Jnet id 5872 for
 EAMATEO@EBRUPC51; Thu, 29 Sep 88 08:38 N
Received: by EB0UB011 (Mailer X1.25) id 1633; Thu, 29 Sep 88 03:50:41 HOE
Date: Tue, 27 Sep 88 20:55:30 GMT
From: Andy Tanenbaum <ast@CS.VU.NL>
Subject: V1.3c posting #7 - doc
Sender: Minix operating system <MINIX-L@FINHUTC.BITNET>
To: NACHO NAVARRO <EAMATEO@EBRUPC51>
Reply-to: INFO-MINIX@UDEL.EDU
Comments:     Warning -- original Sender: tag was info-minix-request@UDEL.EDU
Comments: To: info-minix@UDEL.EDU

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 52
X-rw-r--r--  1 ast         23674 Sep 26 22:48 USER_GUIDE
X-rw-r--r--  1 ast         23520 Sep 26 22:47 man_pages.cdif
X-rw-r--r--  1 ast          4967 Sep 26 22:47 net.man.cdif
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
183)    :;;
*)    echo 'Bad character count in ''LISTING' >&2
        echo 'Count should be 183' >&2
esac
echo Extracting 'USER_GUIDE'
sed 's/^X//' > 'USER_GUIDE' << '+ END-OF-FILE ''USER_GUIDE'
XThis file contains important information not present in the book or elsewhere.
XPlease read it VERY carefully.
X
X
X 1. GENERAL
X       There were a number of changes made to the code after the book
X    was printed.  As a result, line X of file Y in the book may actually
X    appear at X+3, or X-5, etc. on the disk version.  New features have also
X    been added in various places.
X
X 2. PC-AT
X       The distribution for the PC-AT differs from that for the PC in minor
X    ways.  For example, there is no /user diskette.  Most the files that would
X    normally be on /user fit on /usr.  Furthermore, the number and organization
X    of the source diskettes is different, but the same programs are available.
X    Two additional special files are present in /dev: /dev/at0 and /dev/at1.
X    These should be used to access 1.2M diskettes.  To access 360K diskettes
X    on the PC-AT, use /dev/fd0 and /dev/fd1.  Special files are used by
X    commands such as mount, mkfs, and df, among others.  For example, to
X    copy part of a 1.2M diskette, type dd if=/dev/at0 of=file count=100.
X    The difference between /dev/at0 and /dev/fd0 is that in MINIX, special
X    files have sizes to prevent access beyond the end.  For /dev/fd0 the
X    size is 360K.  For /dev/at0 it is 1.2M.  Finally, the executable binary
X    for the PC-AT contains at_wini.c instead of xt_wini.c (see below).
X
X 3. HARD DISK DRIVERS
X       MINIX supports the use of the standard IBM hard disks.  Unfortunately,
X    IBM chose to use different (and incompatible) disks and controllers on the
X    XT and AT.  To find out if MINIX works with your disk, give the command:
X        dd if=/dev/hd0 of=/dev/null count=1000
X    If this runs to the end without errors, the driver embedded in your
X    MINIX binary is appropriate for your controller and drive.  If it gives
X    errors, do a sync, turn the computer off and reboot MINIX.  This time run
X    a hard disk check from the initial menu.  Start MINIX (even if this check
X    gives errors).  Run dd again.  If it still fails, try the following.
X    Copy kernel/xt_wini.c to wini.c and recompile the operating system.
X    If this fails, then try kernel/at_wini.c and recompile it once more.
X    Usually, one of these will work.  If neither works, your disk is not
X    compatible with either the XT or AT.  You will have to modify the driver.
X    For PS/2 Model 30 users, a driver ps_wini.c has been provided for use.
X    You MUST have a kernel/wini.c to recompile the system, even if you do not
X    have a hard disk (in which case, any one will do).
X
X 4. INSTALLING MINIX ON A HARD DISK
X      After you have made sure that you have a working hard disk driver, as
X    described above, proceed as follows. To use MINIX on a hard disk, you need
X    a MINIX partition.  You may also have MS-DOS, PC-IX, OS/2, XENIX, or other
X    partitions as well if you like.  If you understand about making partitions,
X    make one any way you are used to.  Otherwise use the MINIX fdisk program.
X    All partitions on the disk must be an even number of sectors even DOS ones.
X    Be warned that the MINIX, MS-DOS, PC-IX, and XENIX parition numbering
X    schemes all differ.  Be very careful here, lest you overwrite useful data.
X       It is suggested that you use the program diskcheck to inspect the MINIX
X    partition for bad blocks.  The program badblocks will help deal with them.
X    The file man_pages in this directory discusses their use.
X       Once you have a partition available for MINIX (the type does not matter
X    as MINIX does not check), make a file system by booting MINIX from floppy
X    the usual way and run mkfs.  If, for example, you have chosen partition 2,
X    which has, say, 40 cylinders (i.e., 40 x 68 = 2720 sectors or 1360 1K
X    blocks), type:
X        mkfs /dev/hd2 1360
X    to make an empty file system.  However, for partition 1 use 1 block less
X    because block 0 is not available (it contains the MS-DOS partition table).
X    In other words, a 40 cylinder partition 1 has 1359 blocks but a 40 cylinder
X    partition 2 or higher has 1360 blocks. Then mount the file system by typing
X        /etc/mount /dev/hd2 /user
X    Next, make whatever directories you like, typically bin, lib, and others,
X    and copy files to the hard disk.  With the /usr floppy in drive 0, the
X    command
X        cp /usr/bin/* /user/bin
X    will copy all the binaries from /usr/bin to the hard disk, for example.
X       Alternatively, the cpdir program can be used to copy entire trees, e.g.
X        cpdir /usr/bin /user/bin
X    will create a new directory /user/bin, and put /usr/bin with all its files
X    and subdirectories in it.
X       A few of the files in /usr/bin must be owned by the root (instead of
X    bin) and have mode 4755. Check to make sure. These files are:
X        badblocks chgrp df fsck mkdir mv passwd readall rmdir su
X       Finally, edit /etc/rc to have the hard disk mounted when the system
X    is booted.  A line such as
X        /etc/mount /dev/hd2 /usr
X    can be used as a replacement for the mount command initially in /etc/rc.
X    After editing /etc/rc, mount the root file system diskette and copy it
X    to the diskette; otherwise the changes will be lost when the system is
X    rebooted.  (There is nothing special about the root file system except
X    its size; it can be mounted and written on like any other file system.)
X       After these steps have been taken, the system can be booted from
X    floppy in the usual way, and the root file system also read in from
X    floppy.  The hard disk will automatically be mounted by the /etc/rc.
X    The root device remains on the RAM disk, and the boot process still
X    goes via floppy (for compatibility and to prevent disaster in the event
X    that something goes wrong with the hard disk file system).  Hard disk
X    file systems can be checked using fsck, the same as floppies.  However,
X    fsck assumes you have 4 heads and 17 sectors/track.  If this is not so,
X    change the code accordingly or fsck will give spurious errors.
X       The special file /dev/hd0 refers to the whole disk, without regard to
X    partitions, whereas /dev/hd1 ... /dev/hd4 refer to partitions 1 to 4.  If
X    you have a second hard disk, you can make /dev/hd5 ... /dev/hd9 with mknod
X    (major device 3, minor device 5 ... 9) for the second drive, with hd5 for
X    the whole drive, hd6 for partition 1, etc.  Fsck also uses this convention.
X
X  5. CONFIGURING MINIX ON A HARD DISK
X       When setting up MINIX on a hard disk, the following set of directories
X    is recommended, although the MINIX source tree can go elsewhere if desired.
X    Be sure to edit the cc.c program to make sure it knows where to find the
X    various compiler passes and libraries, which may be in /bin, lib, /usr/bin,
X    or /usr/bin.  When a large RAM disk is available, put /bin and /lib on the
X    RAM disk, and include the compiler parts in them.  When extracting files
X    from the distribution, note carefully that there is a lib directory on the
X    /usr diskette (for /lib and /usr/lib) and another one among the sources
X    (for /usr/src/minix/lib).  Many of the directories listed below have sub-
X    directories.
X
X    /bin            - most common binaries
X    /dev            - special files
X    /etc            - system administration
X    /lib            - most important libraries
X    /tmp            - scratch files go here
X    /usr            - mount usr file system here
X    /usr/bin        - rest of the binaries
X    /usr/include        - system include files
X    /usr/lib        - rest of the libraries
X    /usr/src        - sources go here
X    /usr/src/minix        - minix sources go here
X    /usr/src/minix/amoeba    - all networking code is here
X    /usr/src/minix/commands    - utility program sources
X    /usr/src/minix/fs    - file system sources
X    /usr/src/minix/h    - operating system header files
X    /usr/src/minix/kernel    - kernel and device driver sources
X    /usr/src/minix/lib    - libc.a sources
X    /usr/src/minix/mm    - memory manager sources
X    /usr/src/minix/test    - test programs
X    /usr/src/minix/tools    - tools for building new operating systems
X    /usr/tmp        - (optional) alternative place for temporaries
X
X  6. PUTTING THE ROOT FILE SYSTEM ON A HARD DISK
X       To speed up the boot procedure, you may copy the root file system to
X    /dev/hd3 with the commands
X        cp /dev/fd0 /dev/hd3     or    cp /dev/at0 /dev/hd3
X    The former is for the PC, the latter is for the AT.  /dev/hd3 must not be
X    mounted. When booting, leave the boot diskette in the drive when typing the
X    = sign.  MINIX will see that the diskette is not a valid file system, and
X    take the root file system from the default device, /dev/hd3.  You can
X    change the choice of default by modifying RAM_IMAGE in fs/main.c
X
X  7. USING MS-DOS AS A DEVELOPMENT SYSTEM
X       MINIX is now completely self supporting, so the C86 and PC-IX
X    directories have been deleted.  The only time you might need MS-DOS is
X    for formatting blank diskettes.  MINIX does not have a format program.
X
X  8. EDITING LARGE PROGRAMS WITH MINED
X       Mined has a limit on the size of programs it can edit.  To edit
X     larger ones, they must be broken up with split, edited separately and
X     recombined later.  Better yet, use elle, which is a much better editor,
X     is emacs compatible, and can handle files as large as the disk.
X
X  9. MKNOD
X        MINIX differs from UNIX in that block special files (and even some
X    character special files, such as /dev/kmem) can have sizes.  A 360K floppy
X    disk special file, such as /dev/fd0 can have size 360K.  Unfortunately, the
X    mknod system call (and mknod program) have no way to express the size,
X    so it uses size 0, which is equal to infinity.  When you read past the
X    end of a block special file WITH a size, the file system returns zero
X    bytes.  When you go off the end of a device WITHOUT a size, some drivers
X    return end-of-file (e.g., hard disk, RAM disk), but others (e.g., floppy
X    disk) return an I/O error code.  Thus if you make a new block special file
X    for 2/0 and 2/1 (floppy disk) with mknod (i.e., no size) the command
X        cp /dev/fd0 /dev/fd1
X    will terminate with an error on block 360 (but it will copy the disk
X    perfectly).  The only way to make a special file with a size is by making
X    a file system with mkfs.
X
X10. NONEXISTENT DEVICES
X       If you try to open /dev/fd1 on a system with only one floppy disk drive,
X    the system may hang.  To avoid this problem, the first time you log in, go
X    to the /dev directory, and rename special files that you do not have to
X    something unusual.  For example, if you do not have a hard disk, rename
X    hd0 to HARD_DISK_0, hd1 to HARD_DISK_1, etc.  Similarly with one one floppy
X    disk, rename fd1 to FLOPPY_DISK_1 to prevent it being typed by accident.
X    You can also remove them, but due to the mknod problem described above, you
X    can not get them back easily, so it is best just to get them out of the
X    way in case you ever need them again later.
X
X11. PRINTER
X       In order to accommodate buffered and unbuffered printers, the printer
X    driver uses a combination of delay loops and interrupts.  The net result
X    is that the driver consumes a fair number of CPU cyles when running.  If
X    you expect to do a lot of printing, you might want to consider rewriting
X    the printer interrupt handler, pr_char, in assembly code.  Note that some
X    printers that are not IBM compatible give spurious out-of-paper messages.
X
X12. DISK SPACE
X       The /usr disk as distributed is nearly full.  If you have two floppy
X    disk drives, be sure to mount /user on drive 1 and move your working
X    directory there.  If you have only 1 floppy disk drive, remove some files
X    from /usr/bin to make more space.  If you have a hard disk, there is no
X    problem.
X
X13. RUNNING /USER TESTS ON A FLOPPY
X       Before running the tests in /user/test, remove the files in
X    /user/commands to create some free space on the disk.  Run the tests as
X    superuser.
X
X14. COMMAND LINE LENGTH
X       The maximum initial stack size is 2K.  Calls to EXEC which require a
X    larger stack will fail.  Thus if you do ls -l * in a large directory,
X    the shell may expand the * so that the command line exceeds 2K and the
X    EXEC will fail, resulting in a message such as "Cannot execute ls".
X
X15. ARCHIVES ON THE DISTRIBUTION DISKETTES
X       To save space on the distribution diskettes, some of the sources have
X    been archived and compressed.  Files ending with .Z are compressed files,
X    and can be decompressed by typing: compress -d file.Z
X    In some cases, the resulting file is an archive, ending with the .a suffix.
X    Remove the files with: ar xv file.a   Thus a file like fs.a.Z must first be
X    uncompressed to get fs.a and then dearchived.
X
X16. RECOMPILING FSCK AND OTHER LARGE PROGRAMS
X      If for some reason you don't like the tools/fsck binary and want to
X    recompile it, make sure you have plenty of free space for the compiler's
X    temporary files.  On a floppy disk system, this may mean putting fsck on
X    an almost empty diskette before compiling it.  When the disk is full, the
X    quality of the compiler's error messages deteriorates rapidly.  If you
X    are compiling fsck and getting strange results, check for disk space.
X    Normally /tmp is used for temporaries, but the -T flag can override that.
X
X17. NEWS GROUP
X      If you have access to USENET, you may be interested in knowing
X    that there is a news group, comp.os.minix devoted to discussions of MINIX.
X    This is one of the largest news groups, with over 10,000 readers.
X    If you have access to the Arpanet, Bitnet, or EARN, the news group is
X    gatewayed there.  Contact info-minix-request@udel.edu to join or send
X    email to ast@cs.vu.nl requesting the MINIX information sheet.
X
X18. SYSTEM PROBLEMS
X      The IBM PC does not have any hardware for checking for stack overflow.
X    The user must allocate the amount of stack for each program with chmem
X    or use the compiler default (64K - program - data size).  Some programs
X    in the distribution have been set to a smaller value, and may, in rare
X    instances with certain arguments, hang.  If the system ever gets into a
X    situation where it echoes keystrokes, but ignores DEL and CTRL-\ and
X    appears otherwise to be hung up, hit F1 to see what is going on.  If
X    some process is running and there is no way to interrupt it, hit CTRL-F9.
X    This key is equivalent to the super-user typing:  kill -1 9.  The result
X    of CTRL-F9 is that every process in the system is killed, including update
X    and all the shells.  Although drastic, CTRL-F9 will dehang the system
X    instantly.  Log in again and then type /etc/update & to restart update.
X    The reason for requiring CTRL to be held down while hitting F9 is to
X    prevent F9 from being hit by accident.
X
X19. USE OF EXTENDED MEMORY ON ATs
X       If the size of the root file system (either taken from floppy or from
X    /dev/hd3, as described above), is 256K or more, MINIX puts the root
X    device in extended memory, above 1M, leaving the entire 512K or 640K
X    free for MINIX and user programs.  To get full advantage of the extended
X    memory, the size of the root file system should be the same as the amount
X    of extended memory present.  If the root file system is < 256K, MINIX
X    assumes that there is no extended memory, and puts the root file system
X    in "low" core (below 640K).  This feature only works on ATs, so PCs must
X    never have root file systems >= 256K.  If you have a large extended memory,
X    you may want to put the root file system on hard disk, as described above,
X    so the extended memory can be loaded from hard disk quickly at boot time.
X
X20. SOFTWARE SCROLLING FOR EGA CARDS
X       MINIX works with monochrome cards, CGA cards, and IBM compatible EGA
X    cards.  However, it does not work with some nonstandard EGA cards.  With
X    some cards, the screen will go blank every 25 lines.  MINIX can be made to
X    work with these EGA cards by hitting the F3 key to use software scrolling.
X    This is slower than hardware scrolling, so only use it if you have to.  You
X    can toggle between the two modes by hitting F3 repeatedly. If you want soft
X    scrolling to be the default, recompile kernel/tty.c  with the variable
X    softscroll initialized to 1, and make a new kernel.
X
X21. NEW FLAGS AND FEATURES
X       Various programs have acquired new flags and features and new programs
X    have been included.  Please read all the files in this directory carefully.
X
X22. ANSI ESCAPE SEQUENCES
X      The escape sequences used by the tty driver for both input and output
X    have been changed to the ANSI standard ones.  To manipulate the cursor
X    etc., print the following (among others):
X    ESC M:        scroll a line backwards (cursor must be on line 1)
X    ESC [ y ; x H    move to column x, row y;  (1,1) is upper right corner
X    ESC [0J        clear from cursor to end of screen
X    ESC [7m        go to reverse video
X    ESC [0m        go to normal video
X
X    The 9 numeric pad keys, as well as numeric + and - now generate ESC [ x
X    for some x.  Just type them to see which x goes with each key.  There is
X    an /etc/termcap file for MINIX that uses the allowed sequences.
X
X23. _CLEANUP NO LONGER NEEDED
X       The exit routine has been changed to call _cleanup automatically.
X    As a result, programs using stdio no longer have to call it explicitly.
X    All calls to _cleanup have been removed from the standard distribution.
X
X24. DISTRIBUTION CHANGES
X       The subdirectories PC-IX and C86 have been deleted, as mentioned above.
X    In a few cases, a subdirectory IBM_PC is present for files specific to the
X    IBM PC/XT/AT/386 version of MINIX (as opposed to the Atari ST). These files
X    should be moved up one directory level.  In some cases, two makefiles are
X    provided, called pc_makefile and at_makefile.  Copy the appropriate one to
X    makefile, depending on whether you have (1) a PC or XT or (2) an AT.
X    Study them both and delete the inappropriate one.  The differences are
X    usually related to the assumed size of the RAM disk, rather than any
X    differences between the two processors.
X
X25. LINKS
X       The directory /usr/include now contains several subdirectories and also
X    linked files.  If you copy this directory to hard disk, link the following
X    files, if possible.
X
X        /usr/include/sgtty.h        to    minix/h/sgtty.h
X        /usr/include/signal.h        to    minix/h/signal.h
X        /usr/include/minix/callnr.h    to    minix/h/callnr.h
X        /usr/include/minix/com.h    to    minix/h/com.h
X        /usr/include/minix/const.h    to    minix/h/const.h
X        /usr/include/minix/type.h    to    minix/h/type.h
X        /usr/include/sys/stat.h        to    minix/h/stat.h
X        /usr/include/fs/buf.h        to    minix/fs/buf.h
X        /usr/include/fs/const.h        to    minix/fs/const.h
X        /usr/include/fs/super.h        to    minix/fs/super.h
X        /usr/include/fs/type.h        to    minix/fs/type.h
X
X    In addition, the files dosread, dosdir, and doswrite in /usr/bin should all
X    be links to the same file. It determines which it is by looking at argv[0].
X
X26. LACK OF SPACE
X    If you are running on a system with limited memory, either 512K RAM
X    or no hard disk, you may encounter difficulties trying to recompile the
X    system.  However, there are steps you can take to improve the situation.
X    First, various passes of the compiler are configured with ample stack
X    space.  Using chmem you can reduce this stack space to reduce the program's
X    memory requirements.  Be careful about not reducing it too much, or strange
X    things will happen.  Second, the compiler flag -T can be used to place
X    temporary files in a place other than /tmp.  This flag may be useful if
X    /tmp is on the RAM disk, which is too small.  Third, the compiler flag -F
X    can be used to run cpp and cem sequentially instead of in parallel.  This
X    approach is slower but uses less memory. Fourth, the library, libc.a
X    contains several large routines that are rarely used.  By removing these,
X    you can reduce the amount of space the library requires. Fifth, if you are
X    able to compile but not link, after having created all the *.s files, you
X    can remove some of the larger *.c files, replacing them with null files to
X    keep make happy, and then link.  Sixth, the size of the RAM disk is
X    determined by the size of the root file system.  If the default size is not
X    suitable for your configuration, you can make a new root file system with
X    mkfs.  In particular, on an XT, you may wish to move cpp and cem from /lib
X    (RAM disk) to /usr/lib (hard disk), thus making it possible to build a new
X    and smaller RAM disk to free up more "core."  If you do this, be sure to
X    modify cc.c, since it has to know where to find cpp and cem.
X
X27. MULTIPLE BIN DIRECTORIES IN THE DISTRIBUTION
X       Since the distribution disks are nearly full, a few of the programs that
X    logically ought to be in the /usr/bin directory have been put on one of the
X    other distribution diskettes in a separate bin directory.  On a hard disk
X    system, these programs should be put in /usr/bin.
X
X28. LIBRARY
X       Not all the sources in minix/lib have been included in libc.a (to save
X    space).  If you have a hard disk and enough space, compare the sources and
X    binaries and add the missing files.  Remember to compile all library
X    routines with cc -c -LIB file.c.  The -LIB flag is essential for libraries.
X    The library sources are contained in the lib/libsrc.a archive.
X
X29. RS232 LINES
X       MINIX supports RS232 lines to terminals and modems.  Baudrate, parity,
X    and bits/character are user settable.  The special files /dev/tty[12] are
X    used to access the RS232 lines. They can be opened for reading and writing.
X       As shipped, the system is configured for only one line, /dev/tty1.  To
X    enable the second one, change NR_RS_LINES in tty.c to 2.  Doing so will
X    increase kernel size by 1K, due to the extra table and buffer space needed.
X       The file /etc/ttys can be configured to have a shell be started for
X    either line, thus making MINIX a multi-terminal system.  The second char
X    of the three-character /etc/ttys entry gives the line parameters.  See
X    the comment at the start of tools/init.c for details.
X       The program stty can be used to set baud rates, bits/character and
X    parity for its standard input, e.g.  stty 9600 8 -even -odd </dev/tty1
X    sets line 1 to 9600 baud, 8 bits/char, no parity.  The stty program does
X    its work using the ioctl system call.
X
X30. MISSING SOURCES
X       The sources for the C compiler (including all its parts), the editor
X    elle, and patch are not included in the distribution.  The compiler sources
X    are available from Transmediair and UniPress (see below).  The elle and
X    patch sources were too large to be included and are only available via the
X    USENET online archives.
X
X31. C SYMBOL TABLE
X       A new flag, -s, has been added to cc to generate a symbol table in the
X    a.out file.  It can be printed using nm and removed using strip.  Do not
X    confuse -s (lower case, symbol table) with -S (upper case, assembly code).
X
X32. PASCAL AND MODULA 2 COMPILERS FOR MINIX
X       A MINIX compiler for Pascal is available.  A MINIX compiler for Modula 2
X    will available during the course of 1988-9. Neither is part of the standard
X    distribution.  They may be purchased from either of:
X
X    Unipress Software        Transmediair Utrecht B.V.
X    2025 Lincoln Highway        Melkweg 3
X    Edison, NJ 08817        3721 RG Bilthoven
X    USA                Holland
X    Tel: (201) 985-8000        Tel: (30) 78 18 20
X
X    These companies also sell the sources to the MINIX C compiler, and the
X    Amsterdam Compiler Kit, from which all the compilers have been derived.
X
+ END-OF-FILE USER_GUIDE
chmod 'u=rw,g=r,o=r' 'USER_GUIDE'
set `wc -c 'USER_GUIDE'`
count=$1
case $count in
23674)    :;;
*)    echo 'Bad character count in ''USER_GUIDE' >&2
        echo 'Count should be 23674' >&2
esac
echo Extracting 'man_pages.cdif'
sed 's/^X//' > 'man_pages.cdif' << '+ END-OF-FILE ''man_pages.cdif'
X*** /local/ast/minix/tape3b/doc/man_pages    Wed Jul 13 11:50:43 1988
X--- man_pages    Mon Sep 26 13:03:23 1988
X***************
X*** 1,7 ****
X  This file contains the man pages for those programs not listed in the book or
X! which have been significantly modified since the first release.
X  ---------------------------------------------------------------------------
X
X  Command:    ar - archiver
X  Syntax:        ar [qrxdpmt][abivulc] [posname] archive file ...
X  Flags:        (none)
X--- 1,22 ----
X  This file contains the man pages for those programs not listed in the book or
X! which have been significantly modified since the first release.  It should be
X! installed as /usr/lib/helpfile.
X  ---------------------------------------------------------------------------
X
X+ # animals
X+ Command:    animals - twenty questions type guessing game about animals
X+ Syntax:        animals [database]
X+ Flags:        (none)
X+ Example:    animals
X+
X+      Animals is a guessing game.  The user picks an animal and the computer
X+ tries to guess it by posing questions that should be answered by typing "y"
X+ for yes and "n" for no.  Whenever the computer loses, it asks some questions
X+ that allow it to improve its data base, so as time goes on, it learns.  The
X+ default data base should be in /usr/lib/animals.
X+
X+
X+ # ar
X  Command:    ar - archiver
X  Syntax:        ar [qrxdpmt][abivulc] [posname] archive file ...
X  Flags:        (none)
X***************
X*** 29,34 ****
X--- 44,50 ----
X        u: replace only if dated later than member in archive
X
X
X+ # ascii
X  Command:    ascii - strip all the pure ASCII lines from a file
X  Syntax:        ascii [-n] [file]
X  Flags:        -n Extract the lines containing nonASCII characters
X***************
X*** 42,47 ****
X--- 58,64 ----
X  if the file is pure ASCII, and false otherwise.
X
X
X+ # ast
X  Command:    ast - add symbol table to executable file
X  Syntax:        ast -xX [file] [symbol_file]
X  Flags:        -x do not preserve local symbols
X***************
X*** 54,59 ****
X--- 71,77 ----
X  cc -s file.c >symbol.out.
X
X
X+ # at
X  Command:    at - execute commands at a later time
X  Syntax:        at time [month day] [file]
X  Flags:        (none)
X***************
X*** 74,79 ****
X--- 92,98 ----
X  at.
X
X
X+ # badblocks
X  Command:    badblocks - put a list of bad blocks in a file
X  Syntax:        badblocks block_special
X  Flags:        (none)
X***************
X*** 85,91 ****
X--- 104,120 ----
X  file.  When the program starts up, it asks for a list of bad blocks.  Then
X  it creates a file whose name is of the form .Bad_xxxxx, where xxxxx is a pid.
X
X+ # banner
X+ Command:    banner - print a banner
X+ Syntax:        banner arg ...
X+ Flags:        (none)
X+ Example:    banner happy birthday    # print a banner saying happy birthday
X
X+      Banner prints its arguments on standard output using a matrix of 6 x 6
X+ pixels per character.  The @ sign is used for the pixels.
X+
X+
X+ # cal
X  Command:    cal - print a calendar
X  Syntax:        cal [month] year
X  Flags:        (none)
X***************
X*** 99,104 ****
X--- 128,134 ----
X  good encyclopedia.
X
X
X+ # cdiff
X  Command:    cdiff - context diff
X  Syntax:        cdiff [-c] old new
X  Flags:        -cN how much context to provide
X***************
X*** 109,114 ****
X--- 139,183 ----
X  files, even in the presence of other, independent changes.
X
X
X+ #chmod
X+ Command:  chmod - change access mode for files
X+ Syntax:   chmod octal-number files
X+           chmod [augo][+-=][rwxst] files
X+ Flags:    (none)
X+ Examples: chmod 755 file            # Owner: rwx Group: r-x Others: r-x
X+           chmod +x file1 file2      # Make file1 and file2 executable
X+           chmod a-w file            # Make file read only
X+           chmod u+s file            # Turn on SETUID for file
X+           chmod g=u                 # group perms set to same as user perms.
X+
X+      The given mode is applied to each file in the file list.  The mode can
 be
X+ either absolute or symbolic.  Absolute modes are given as an octal number
X+ that represents the new file mode.  The mode bits are defined as follows:
X+         4000    Set effective user id on execution to file's owner id
X+         2000    Set effective group id on execution to file's group id
X+         0400    file is readable by the owner of the file
X+         0200    writeable by owner
X+         0100    executable by owner
X+         0070    same as above, for other users in the same group
X+         0007    same as above, for all other users
X+
X+ Symbolic modes modify the current file mode in a specified way.  They take
X+ the form:
X+         [who] op permissions { op permissions }
X+ The possibilities for [who] are 'u', 'g', 'o', and 'a'; standing for user,
X+ group, other and all, respectively.  If who is omitted, 'a' is assumed, but
X+ the current umask is used.  The op can be '+', '-', or '=';  '+' turns on the
X+ given permissions, '-' turns them off; '=' sets the permissions exclusively
X+ for the given who.  For example 'g=x' sets the group permissions to '--x'.
X+      The possible permissions are 'r', 'w', 'x'; which stand for read, write,
X+ and execute;  's' turns on the set effective user/group id bits.  'u',
X+ 'g' and 'o' in the permissions field stand for the current user, group, or
X+ other permission bits, respectively.  Only one of these may be used at a
 time.
X+ 's' only makes sense with 'u' and 'g'; 'o+s' is harmless and does nothing.
X+ Multiple symbolic modes may be specified, separated by commas.
X+
X+
X+ # compress
X  Command:    compress - compress a file using modified Lempel-Ziv coding
X  Syntax:        compress [-cdfv] [file] ...
X  Flags:        -c Put output on standard output instead of on file.Z
X***************
X*** 120,128 ****
X
X       The listed files (or standard input, if none are given) are compressed
X  using the Ziv-Lempel algorithm.  If the output is smaller than the input,
X! the output is put on file.Z or standard output if no files are listed.
X
X
X  Command:    cpdir - copy a directory and its subdirectories
X  Syntax:        cpdir [-v] srcdir destdir
X  Flags:        -v Verbose; cpdir tells what it is doing
X--- 189,200 ----
X
X       The listed files (or standard input, if none are given) are compressed
X  using the Ziv-Lempel algorithm.  If the output is smaller than the input,
X! the output is put on file.Z or standard output if no files are listed.  If
X! compress is linked to uncompress, the latter is the same as "compress -d".
X! Similarly, a link to "zcat" decompresses to standard output.
X
X
X+ # cpdir
X  Command:    cpdir - copy a directory and its subdirectories
X  Syntax:        cpdir [-v] srcdir destdir
X  Flags:        -v Verbose; cpdir tells what it is doing
X***************
X*** 134,139 ****
X--- 206,212 ----
X  Recursively. Links and special files are ignored.
X
X
X+ # cron
X  Command:    cron - clock daemon
X  Syntax:        cron
X  Flags:        (none)
X***************
X*** 154,159 ****
X--- 227,233 ----
X      0  9  25 12   *    /usr/bin/sing >/dev/tty0   #Xmas morning at 0900 only
X
X
X+ # diff
X  Command:    diff - print differences between two files
X  Syntax:        diff file1 file2
X  Flags:        (none)
X***************
X*** 163,168 ****
X--- 237,243 ----
X  the two files differ.  Lines may not be longer than 128 characters.
X
X
X+ # diskcheck
X  Command:    diskcheck - check a disk for bad sectors
X  Syntax:        diskcheck device start count
X  Flags:        (none)
X***************
X*** 171,180 ****
X
X       Diskcheck checks a disk for bad sectors by reading in each sector,
X  writing a known bit pattern onto it, reading it back in and comparing with
X! what was written.  This check is then a second time.  Bad sectors are
 reported
X! After each sector is tested, the original sector is restored.
X
X
X  Command:    dis88 - disassembler
X  Syntax:        dis88 [-o] infile [outfile]
X  Flags:        -o List the object code along with the assembly code
X--- 246,256 ----
X
X       Diskcheck checks a disk for bad sectors by reading in each sector,
X  writing a known bit pattern onto it, reading it back in and comparing with
X! what was written.  This check is then done a second time.  Bad sectors are
X! reported.  After each sector is tested, the original sector is restored.
X
X
X+ # dis88
X  Command:    dis88 - disassembler
X  Syntax:        dis88 [-o] infile [outfile]
X  Flags:        -o List the object code along with the assembly code
X***************
X*** 187,192 ****
X--- 263,281 ----
X  to give a more readable asembly listing.
X
X
X+ # dosdir
X+ Command:    dosdir - read a DOS directory
X+ Syntax:        du [-lr] drive dir
X+ Flags:        -l long
X+         -r recursive
X+ Example:    dosdir -l c        # list drive c
X+
X+      Dosdir/dosread/doswrite have been extended to handle hard disks using
 the
X+ letters c,d,e, and f.  The letters a and b can be used for floppies as
 synonyms
X+ for 0 and 1.
X+
X+
X+ # du
X  Command:    du - print disk usage
X  Syntax:        du [-s] dir
X  Flags:        -s Summary only
X***************
X*** 196,201 ****
X--- 285,291 ----
X  files in that directory and its subdirectories.
X
X
X+ # ed
X  Command:    ed - editor
X  Syntax:        ed file
X  Flags:        (none)
X***************
X*** 235,240 ****
X--- 325,331 ----
X      q            # exit the editor
X
X
X+ # expr
X  Command:    expr - evaluate experession
X  Syntax:        expr arg ...
X  Flags:        (none)
X***************
X*** 247,252 ****
X--- 338,344 ----
X       Note that the V7 ":" operator is missing.  Parentheses are permitted.
X
X
X+ # factor
X  Command:    factor - factor an integer less than 2**31
X  Syntax:        factor number
X  Flags:        (none)
X***************
X*** 256,261 ****
X--- 348,354 ----
X  Each factor is printed as many times as it appears in the number.
X
X
X+ # fgrep
X  Command:    fgrep - fast grep
X  Syntax:        fgrep [-cfhlnsv] [file] [string] [file] ...
X  Flags:        -c count matching lines and only print count, not the lines
X***************
X*** 273,278 ****
X--- 366,372 ----
X  faster.
X
X
X+ # file
X  Command:    file - make a guess as to a file's type based on contents
X  Syntax:        file name ...
X  Flags:        (none)
X***************
X*** 283,288 ****
X--- 377,383 ----
X  source programs, executable binaries, shell scripts, and English text.
X
X
X+ # find
X  Command:    find - find files meeting a given condition
X  Syntax:        find directory expression
X  Flags:        (none)
X***************
X*** 316,321 ****
X--- 411,417 ----
X    -ok        prompts before executing the command
X
X
X+ # fdisk
X  Command:    fdisk - partition a hard disk
X  Syntax:        fdisk file
X  Flags:        (none)
X***************
X*** 331,336 ****
X--- 427,433 ----
X  MS-DOS all have different ideas about how partitions are numbered.
X
X
X+ # fix
X  Command:    fix - generate new file from old one and diff listing
X  Syntax:        fix oldfile difflist >newfile
X  Flags:        (none)
X***************
X*** 348,353 ****
X--- 445,451 ----
X  will generate a file new2 that is identical to newfile.
X
X
X+ # from
X  Command:    from - input half of a connection
X  Syntax:        from port
X  Flags:        (none)
X***************
X*** 361,366 ****
X--- 459,465 ----
X  receiving pipeline, making pipelines work across the network.
X
X
X+ #fsck
X  Command:       fsck - perform file system consistency check
X  Syntax:           fsck [-aclmrs] [device] ...
X  Flags:           -a automatically repair inconsistencies
X***************
X*** 372,384 ****
X  Examples:     fsck /dev/hd4    # check file system on /dev/hd4
X           fsck -a /dev/at0    # automatically fix errors on /dev/at0
X             fsck -l /dev/fd0    # list the contents of /dev/fd0
X!            fsck -c 2 3 /dev/hd3    # check and list inodes 2 & 3 on /dev/hd3
X
X       Fsck performs consistency checks on the file systems which reside on the
X  specified devices.  It may also be used to list the contents of a file system
X! or to make a new file system.
X
X
X  Command:    lorder - compute the order for library modules
X  Syntax:        lorder file ...
X  Flags:        (none)
X--- 471,501 ----
X  Examples:     fsck /dev/hd4    # check file system on /dev/hd4
X           fsck -a /dev/at0    # automatically fix errors on /dev/at0
X             fsck -l /dev/fd0    # list the contents of /dev/fd0
X!            fsck -c 2 3 /dev/hd3    # check and list /dev/hd3 inodes 2 & 3
X
X       Fsck performs consistency checks on the file systems which reside on the
X  specified devices.  It may also be used to list the contents of a file system
X! or to make a new file system.  Fsck can be run from the initial menu and
 during
X! normal production.  The number of heads and sectors/track are built in to
X! the program (4 and 17, respectively).  To change these, modify the code and
X! recompile.  If they are set wrong, fsck will give absurd errors.
X
X
X+ # help
X+ Command:    help - give help about a command
X+ Syntax:        help [name]
X+ Flags:        (none)
X+ Example:    help uuencode
X+
X+      Help gives help about a given command name (or help itself, if none is
X+ specified).  It gets its information from /usr/lib/helpfile, which should be
X+ linked to doc/man_pages.  To improve performance, it builds an index file,
X+ /usr/lib/helpfile.idx, which is updated when it is observed to be older than
X+ /usr/lib/helpfile.  The lines beginning with # are the keywords for help.
X+ The helpfile contains all the manual pages not present in the book.
X+
X+
X+ # lorder
X  Command:    lorder - compute the order for library modules
X  Syntax:        lorder file ...
X  Flags:        (none)
X***************
X*** 388,393 ****
X--- 505,511 ----
X  and produces a partial ordering suitable for processing by tsort.
X
X
X+ # master
X  Command:    master - control the creation of shervers
X  Syntax:        master count uid gid command
X  Flags:        (none)
X***************
X*** 403,408 ****
X--- 521,527 ----
X  new shervers (usually) instead of new login programs.  Master must run as
 root
X  to be able to do setuid and setgid.
X
X+ # more
X  Command:    more - pager
X  Syntax:        more file ...
X  Flags:        (none)
X***************
X*** 415,420 ****
X--- 534,540 ----
X     q        - exit more
X
X
X+ # nm
X  Command:    nm - print name list
X  Syntax:        nm [-gnopru] [file] ...
X  Flags:        -g print only external symbols.
X***************
X*** 433,438 ****
X--- 553,559 ----
X  Note that assembly language files don't have symbol tables.
X
X
X+ # paste
X  Command:    paste - paste multiple files together
X  Syntax:        paste [-s] [-ddelim] file ...
X  Flags:        -s print files sequentially, file k on line k
X***************
X*** 448,453 ****
X--- 569,575 ----
X  files sideways.
X
X
X+ # patch
X  Command:    patch - patches up a file from the original and a diff
X  Syntax:        patch [-bcdDefFlnNop]
X  Flags:        -b next argument is backup extension, instead of .orig
X***************
X*** 474,479 ****
X--- 596,602 ----
X  on 'file~.
X
X
X+ # prep
X  Command:    prep - prepare a text file for statistical analysis
X  Syntax:        prep [file]
X  Flags:        (none)
X***************
X*** 486,491 ****
X--- 609,615 ----
X  checker), or used for statistical analyses.
X
X
X+ # printenv
X  Command:    printenv - print out the current environment
X  Syntax:        printenv
X  Flags:        (none)
X***************
X*** 494,499 ****
X--- 618,624 ----
X       Printenv prints out the current environment strings, one per line.
X
X
X+ # rcp
X  Command:    rcp - remote copy
X  Syntax:        rcp [mach1]!file1 [mach2]!file2
X  Flags:        (none)
X***************
X*** 504,509 ****
X--- 629,658 ----
X  makes use of the programs 'to' and 'from'.
X
X
X+ # readall
X+ Command:    readall - read a device quickly to check for bad blocks
X+ Syntax:        readall file
X+ Flags:        (none)
X+ Example:    readall /dev/hd0        # read all of /dev/hd0
X+
X+      Readall reads all of the named device in large chunks.  It reports about
X+ blocks that it cannot read.  Unlike diskcheck, it does not attempt to write
 on
X+ the disk, making it "safer" to use when one is worried about a sick system.
X+
X+
X+ # readclock
X+ Command:    readclock - read the AT's real time clock
X+ Syntax:        readclock
X+ Flags:        (none)
X+ Example:    date `/usr/bin/readclock` </dev/tty    # useful in /etc/rc
X+
X+      Readclock reads the AT's real time clock and prints the result in a form
X+ useful to date, namely, MMDDYYhhmmss.  If the clock does not exist (e.g., on
 a
X+ PC), it outputs "-q" to query the user for the time.  The example given above
X+ can be put in /etc/rc to load the real time when the system is booted.
X+
X+
X+ # readfs
X  Command:    readfs - read a MINIX file system
X  Syntax:        readfs [-il] block_special [dir]
X  Flags:        -i Give information about the file, but do not extract files
X***************
X*** 516,521 ****
X--- 665,671 ----
X  directory).  If subdirectories are needed, they will be created
 automatically.
X
X
X+ # rsh
X  Command:    rsh - remote shell for networking
X  Syntax:        rsh port [-beil]
X  Flags:        -b start the rsh in the background
X***************
X*** 534,539 ****
X--- 684,690 ----
X  to log onto a remote machine.
X
X
X+ # sherver
X  Command:    sherver - shell server
X  Syntax:        sherver port
X  Flags:        (none)
X***************
X*** 546,551 ****
X--- 697,703 ----
X  cannot be sent down a pipe.
X
X
X+ # spell
X  Command:    spell - print all words in a file not present in the dictionary
X  Syntax:        spell file
X  Flags:        (none)
X***************
X*** 559,574 ****
X  dictionary should be located in /usr/lib (or the shell script changed).
X
X
X  Command:    strings - print all the strings in a binary file
X  Syntax:        strings file ...
X! Flags:        (none)
X! Example:    strings a.out        # print the strings in a.out
X
X       Strings looks for sequences of ASCII characters followed by a zero byte.
X  These are usually strings.  This program is typically used to help identify
X  unknown binary programs
X
X
X  Command:    strip - remove symbol table from executable file
X  Syntax:        strip [file] ...
X  Flags:        (none)
X--- 711,731 ----
X  dictionary should be located in /usr/lib (or the shell script changed).
X
X
X+ # strings
X  Command:    strings - print all the strings in a binary file
X  Syntax:        strings file ...
X! Flags:        -            # search whole file, not just data seg
X!         -o            # print octal offset of each string
X!         -n            # n is minimum length string (def. = 4)
X! Examples:    strings -5 a.out    # print the strings >= 5 chars in a.out
X!         strings - /bin/sh    # search entire shell file
X
X       Strings looks for sequences of ASCII characters followed by a zero byte.
X  These are usually strings.  This program is typically used to help identify
X  unknown binary programs
X
X
X+ # strip
X  Command:    strip - remove symbol table from executable file
X  Syntax:        strip [file] ...
X  Flags:        (none)
X***************
X*** 578,585 ****
X  copy of the file being stripped, so links are lost.
X
X
X  Command:    term - turn PC into a dumb terminal
X! Syntax:        test [baudrate] [parity] [bits_per_character]
X  Flags:        (none)
X  Examples:    term 2400        # talk to modem at 2400 baud
X          term 1200 7 even    # 1200 baud, 7 bits/char, even parity
X--- 735,743 ----
X  copy of the file being stripped, so links are lost.
X
X
X+ # term
X  Command:    term - turn PC into a dumb terminal
X! Syntax:        term [baudrate] [parity] [bits_per_character]
X  Flags:        (none)
X  Examples:    term 2400        # talk to modem at 2400 baud
X          term 1200 7 even    # 1200 baud, 7 bits/char, even parity
X***************
X*** 599,613 ****
X  term will try to read from /dev/tty1, and nothing will work.
X
X
X  Command:    termcap - print the current termcap entry
X! Syntax:        termcap
X  Flags:        (none)
X  Example:    termcap            # print the termcap entry
X
X!      Termcap reads the /etc/termcap entry corresponding to the current shell
X! variable $TERM.  It then prints out all the parameters that apply.
X
X
X  Command:    test - test for a condition
X  Syntax:        test expr
X  Flags:        (none)
X--- 757,774 ----
X  term will try to read from /dev/tty1, and nothing will work.
X
X
X+ # termcap
X  Command:    termcap - print the current termcap entry
X! Syntax:        termcap [type]
X  Flags:        (none)
X  Example:    termcap            # print the termcap entry
X
X!      Termcap reads the /etc/termcap entry corresponding to the terminal type
X! supplied as the argument.  If none is given, the current $TERM is used.
X! It then prints out all the parameters that apply.
X
X
X+ # test
X  Command:    test - test for a condition
X  Syntax:        test expr
X  Flags:        (none)
X***************
X*** 634,639 ****
X--- 795,801 ----
X  permitted, but must be escaped to keep the shell from trying to interpret
 them.
X
X
X+ # to
X  Command:    to - output half of a connection
X  Syntax:        to port
X  Flags:        (none)
X***************
X*** 653,658 ****
X--- 815,821 ----
X  which sender goes with which receiver; any unique string can be used.
X
X
X+ # traverse
X  Command:    traverse - print directory tree under the named directory
X  Syntax:        traverse dir
X  Flags:        (none)
X***************
X*** 662,667 ****
X--- 825,842 ----
X  the subdirectories are listed, with the depth shown by indentation.
X
X
X+ # tset
X+ Command:    tset - set the $TERM variable
X+ Syntax:        tset [device]
X+ Flags:        (none)
X+ Example:    eval `tset`        # set TERM
X+
X+      Tset is used almost exclusively to set the shell variable TERM from
X+ inside profiles.  If an argument is supplied, that is used as the value of
X+ TERM.  Otherwise it looks in /etc/ttytype.
X+
X+
X+ # tsort
X  Command:    tsort - topological sort
X  Syntax:        tsort file
X  Flags:        (none)
X***************
X*** 671,676 ****
X--- 846,852 ----
X  total ordering from the partial orderings.
X
X
X+ # treecmp
X  Command:    treecmp - recursively list differences in two directory trees
X  Syntax:        treecmp [-v] dir1 dir2
X  Flags:        -v (verbose) list all directories processed
X***************
X*** 684,697 ****
X  are not identical in both are printed.
X
X
X  Command:    tty - print the device name of this tty
X  Syntax:        tty
X! Flags:        (none)
X  Example:    tty
X
X!      Print the name of the controlling tty.
X
X
X  Command:    vol - split standard input into diskette-sized volumes
X  Syntax:        vol [-u] size block-special
X  Flags:        -u unsave from diskettes
X--- 860,875 ----
X  are not identical in both are printed.
X
X
X+ # tty
X  Command:    tty - print the device name of this tty
X  Syntax:        tty
X! Flags:        -s silent mode (return status only)
X  Example:    tty
X
X!      Print the name of the controlling tty
X
X
X+ # vol
X  Command:    vol - split standard input into diskette-sized volumes
X  Syntax:        vol [-u] size block-special
X  Flags:        -u unsave from diskettes
X***************
X*** 705,710 ****
X--- 883,889 ----
X  streams on a series of diskettes, as shown in the examples above.
X
X
X+ # whereis
X  Command:    whereis - examine system directories for a given file
X  Syntax:        whereis file
X  Flags:        (none)
X***************
X*** 714,719 ****
X--- 893,899 ----
X  and others, and prints all occurrences of the argument name in any of them.
X
X
X+ # which
X  Command:    which - examine $PATH to see which file will be executed
X  Syntax:        which name
X  Flags:        (none)
X***************
X*** 726,731 ****
X--- 906,912 ----
X  path of the program that will be chosen.
X
X
X+ # who
X  Command:    who - print list of currently logged in users
X  Syntax:        who
X  Flags:        (none)
X***************
X*** 740,745 ****
X--- 921,927 ----
X  manually truncate it from time to time.
X
X
X+ # whoami
X  Command:    whoami - print current user name
X  Syntax:        whoami
X  Flags:        (none)
X***************
X*** 750,755 ****
X--- 932,938 ----
X  user.
X
X
X+ # uuencode
X  Command:    uuencode - encode a binary file to ASCII (e.g., for mailing)
X  Syntax:        uuencode [input] output
X  Flags:        (none)
X***************
X*** 760,765 ****
X--- 943,949 ----
X  different characters are used, all of them valid ASCII characters.
X
X
X+ # uudecode
X  Command:    uudecode - decode a binary file encoded with uuencode
X  Syntax:        uudecode file
X  Flags:        (none)
X***************
X*** 769,772 ****
X--- 953,966 ----
X  converts it back to the original file.  The decoded file is given the name
X  that the original file had.  The name information is part of the encoded
 file.
X
X+
X+ # write
X+ Command:    write - write a message to a terminal
X+ Syntax:        write ttyn
X+ Flags:        (none)
X+ Example:    write tty1        # write to /dev/tty1
X+
X+      Write is a shell script that is used to send a message to another logged
X+ in user on the system.  The user is identified by tty number.  After the
X+ message has been typed, the user types CTRL-D to exit.
X
+ END-OF-FILE man_pages.cdif
chmod 'u=rw,g=r,o=r' 'man_pages.cdif'
set `wc -c 'man_pages.cdif'`
count=$1
case $count in
23520)    :;;
*)    echo 'Bad character count in ''man_pages.cdif' >&2
        echo 'Count should be 23520' >&2
esac
echo Extracting 'net.man.cdif'
sed 's/^X//' > 'net.man.cdif' << '+ END-OF-FILE ''net.man.cdif'
X*** /local/ast/minix/tape3b/doc/net.man    Wed Jul 13 14:58:05 1988
X--- net.man    Mon Sep 26 13:03:24 1988
X***************
X*** 585,626 ****
X  You must do the following important steps carefully.
X
X
X!  1. Make sure that you are in the amoeba directory.
X!     Run the command:
X
X      install
X
X!  2. If you do not have much free disk space then do the following:
X!     Go to the fs directory (ie. ../fs) and type
X!     make clean
X!     Then go to the mm directory (ie. ../mm) and type:
X!     make clean
X!     Then go to the kernel directory (ie. ../kernel) and type:
X!     make clean
X
X!  3. Go to the amoeba/mm directory and run make.
X
X!  4. Go to the amoeba/fs directory and run make.
X
X!  5. Go to the amoeba/kernel directory (NOT the regular kernel directory).
X!     If you do NOT have an ethernet card but still wish to have local Amoeba
X!     transactions then edit the makefile and add -DNONET to the CFLAGS.
X!     If you do have an ethernet card and would like to keep ethernet
 statistics
X!     then add -DSTATISTICS to CFLAGS.
X!
X!  6. Now run make.
X!
X!  7. Go to the tools directory and build a new boot floppy.
X!     The command to do this is:
X!     make net
X!
X!  8. Reboot your machine using the new boot floppy.
X!
X!  9. Test the system.  The directory amoeba/examples contains several programs
X      to test the reliability of transactions.  The READ_ME file in the
 directory
X      gives more details.
X
X! 10. If you have an ethernet card then install the network tools.  The
 directory
X      amoeba/util contains utilities for remote shells, remote file copying and
X      message sending.  These only work with machines that have Amoeba
X      transactions installed.  The READ_ME file there gives more details.
X--- 585,606 ----
X  You must do the following important steps carefully.
X
X
X!  1. Make sure that you are in the amoeba directory and that there is plenty
X!     of free disk space.  Run the command:
X
X      install
X
X!  2. Type:  make
X
X!  3. When you are instructed to do so, insert a blank diskette and hit return.
X
X!  4. Reboot your machine using the new boot floppy.
X
X!  5. Test the system.  The directory amoeba/examples contains several programs
X      to test the reliability of transactions.  The READ_ME file in the
 directory
X      gives more details.
X
X!  6. If you have an ethernet card then install the network tools.  The
 directory
X      amoeba/util contains utilities for remote shells, remote file copying and
X      message sending.  These only work with machines that have Amoeba
X      transactions installed.  The READ_ME file there gives more details.
X***************
X*** 727,733 ****
X
X      /usr/bin/master 1 2 2 /etc/sherver mumbo
X
X! will start a single sherver listening to the port `jumbo' and ensure that
X  there is always a sherver running.  This sherver will have uid=2 and gid=2,
X  so that rsh calls to mumbo will be executed with this uid/gid combination.
X  It is suggested to start up master in the /etc/rc file of any machine
X--- 707,713 ----
X
X      /usr/bin/master 1 2 2 /etc/sherver mumbo
X
X! will start a single sherver listening to the port `mumbo' and ensure that
X  there is always a sherver running.  This sherver will have uid=2 and gid=2,
X  so that rsh calls to mumbo will be executed with this uid/gid combination.
X  It is suggested to start up master in the /etc/rc file of any machine
X***************
X*** 793,806 ****
X       then bufread will not be called again until an eth_release has been
 done.
X
X    3. The ethernet driver generates no write interrupts.  This is because we
X!      found that the chip on the ethernet card was so much faster than the CPU
X!      on the Zenith AT clone that it was always sent before the next packet is
X!      ready.  If necessary the high level code busy-waits until the ethernet
X!      write buffer is free.  If write interrupts are required then pkt_sent()
X!      in amoeba.c should be modified.
X!      This is rather disgusting, but was done for efficiency reasons.
 Interrupt
X!      handling is expensive under Minix and so it was much faster to not
X!      generate interrupts and just wait for the buffer to become free.
X
X  There are several routines used by the high level code which should be
X  provided by the ethernet driver.  Unless otherwise stated, these routines are
X--- 773,783 ----
X       then bufread will not be called again until an eth_release has been
 done.
X
X    3. The ethernet driver generates no write interrupts.  This is because we
X!      found that busy waiting was more efficient than doing a context switch
 and
X!      waiting for an interrupt.  By the time the context switch was done, the
X!      interrupt had already happened, so we had to switch back.  It's faster
 to
X!      just wait for it.  On a very slow machine, a different strategy might be
X!      appropriate.
X
X  There are several routines used by the high level code which should be
X  provided by the ethernet driver.  Unless otherwise stated, these routines are
+ END-OF-FILE net.man.cdif
chmod 'u=rw,g=r,o=r' 'net.man.cdif'
set `wc -c 'net.man.cdif'`
count=$1
case $count in
4967)    :;;
*)    echo 'Bad character count in ''net.man.cdif' >&2
        echo 'Count should be 4967' >&2
esac
exit 0

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (10/01/88)

Your message could not be delivered to:

    EAMATEO

Your message has been enqueued and undeliverable for 9 days.
The mail system will continue to try to deliver your message
for an additional 3 days.

The beginning of your message follows:

Postmaster%EBRUPC51.BITNET@cunyvm.cuny.edu (PMDF Mail Server) (10/04/88)

Your message could not be delivered to:

    EAMATEO

Your message has been enqueued and undeliverable for 12 days.
No further attempts will be made to deliver your messsage.

Your entire message follows:

Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (02/20/89)

Your message could not be delivered to:

    EANACHO

Your message has been enqueued and undeliverable for 3 days.
The mail system will continue to try to deliver your message
for an additional 9 days.

The beginning of your message follows:

Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (02/23/89)

Your message could not be delivered to:

    EANACHO

Your message has been enqueued and undeliverable for 6 days.
The mail system will continue to try to deliver your message
for an additional 6 days.

The beginning of your message follows:

Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (02/27/89)

Your message could not be delivered to:

    EANACHO

Your message has been enqueued and undeliverable for 9 days.
The mail system will continue to try to deliver your message
for an additional 3 days.

The beginning of your message follows:

Postmaster%TOP.UPC.ES@cunyvm.cuny.edu (PMDF Mail Server) (03/01/89)

Your message could not be delivered to:

    EANACHO

Your message has been enqueued and undeliverable for 12 days.
No further attempts will be made to deliver your messsage.

Your entire message follows: