[comp.os.minix] V1.3c posting #2 - library routines

ast@cs.vu.nl (Andy Tanenbaum) (09/28/88)

: 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 46
X-rw-r--r--  1 ast           495 Sep 26 22:23 bcmp.c.new
X-rw-r--r--  1 ast           998 Sep 26 22:24 bsearch.c.new
X-rw-r--r--  1 ast           329 Sep 26 22:24 bzero.c.new
X-rw-r--r--  1 ast           619 Sep 26 22:24 ctermid.c.new
X-rw-r--r--  1 ast          3297 Sep 26 22:24 ctime.c.cdif
X-rw-r--r--  1 ast           553 Sep 26 22:24 cuserid.c.new
X-rw-r--r--  1 ast           915 Sep 26 22:24 doprintf.c.cdif
X-rw-r--r--  1 ast          1858 Sep 26 22:24 execlp.c.new
X-rw-r--r--  1 ast           224 Sep 26 22:24 ffs.c.new
X-rw-r--r--  1 ast           617 Sep 26 22:24 fgetc.c.new
X-rw-r--r--  1 ast           313 Sep 26 22:24 fopen.c.cdif
X-rw-r--r--  1 ast           721 Sep 26 22:24 fputc.c.new
X-rw-r--r--  1 ast          2784 Sep 26 22:24 getcwd.c.new
X-rw-r--r--  1 ast          1133 Sep 26 22:24 getenv.c.cdif
X-rw-r--r--  1 ast           391 Sep 26 22:24 getgrent.c.cdif
X-rw-r--r--  1 ast           429 Sep 26 22:24 getlogin.c.new
X-rw-r--r--  1 ast           980 Sep 26 22:24 getpass.c.cdif
X-rw-r--r--  1 ast           811 Sep 26 22:24 lsearch.c.new
X-rw-r--r--  1 ast           296 Sep 26 22:24 memccpy.c.new
X-rw-r--r--  1 ast           280 Sep 26 22:24 memchr.c.new
X-rw-r--r--  1 ast           331 Sep 26 22:24 memcmp.c.new
X-rw-r--r--  1 ast           691 Sep 26 22:24 memcpy.c.new
X-rw-r--r--  1 ast           260 Sep 26 22:24 memset.c.new
X-rw-r--r--  1 ast          1845 Sep 26 22:24 scanf.c.cdif
X-rw-r--r--  1 ast           276 Sep 26 22:25 strchr.c.new
X-rw-r--r--  1 ast           698 Sep 26 22:25 strcspn.c.new
X-rw-r--r--  1 ast           670 Sep 26 22:25 strpbrk.c.new
X-rw-r--r--  1 ast           301 Sep 26 22:25 strrchr.c.new
X-rw-r--r--  1 ast           705 Sep 26 22:25 strspn.c.new
X-rw-r--r--  1 ast           856 Sep 26 22:25 strstr.c.new
X-rw-r--r--  1 ast          1663 Sep 26 22:25 strtok.c.new
X-rw-r--r--  1 ast           278 Sep 26 22:25 swab.c.new
X-rw-r--r--  1 ast          2104 Sep 26 22:25 termcap.c.cdif
X-rw-r--r--  1 ast          1367 Sep 26 22:25 ttyname.c.new
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
1993)	:;;
*)	echo 'Bad character count in ''LISTING' >&2
		echo 'Count should be 1993' >&2
esac
echo Extracting 'bcmp.c.new'
sed 's/^X//' > 'bcmp.c.new' << '+ END-OF-FILE ''bcmp.c.new'
X/*  bcmp(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xint bcmp( vector1, vector2, count )
X  char *vector1;
X  char *vector2;
X  int   count;
X
X  {
X  int word_count = count / sizeof(int);
X  int byte_count = count & ( sizeof(int) - 1 );
X
X  if ( vector1 == vector2 )
X    return( 0 );
X
X  while( --word_count >= 0 )
X    if (  *((int *) vector1)++ != *((int *) vector2)++ )
X	return( 1 );
X
X  while( --byte_count >= 0 )
X    if (  *vector1++ != *vector2++ )
X	return( 1 );
X
X  return( 0 );
X  }
+ END-OF-FILE bcmp.c.new
chmod 'u=rw,g=r,o=r' 'bcmp.c.new'
set `wc -c 'bcmp.c.new'`
count=$1
case $count in
495)	:;;
*)	echo 'Bad character count in ''bcmp.c.new' >&2
		echo 'Count should be 495' >&2
esac
echo Extracting 'bsearch.c.new'
sed 's/^X//' > 'bsearch.c.new' << '+ END-OF-FILE ''bsearch.c.new'
X/*  bsearch(3)
X *
X *  Author: Terrence Holm          Aug. 1988
X *
X *
X *  Performs a binary search for a given <key> within a sorted
X *  table. The table contains <count> entries of size <width>
X *  and starts at <base>.
X *
X *  Entries are compared using keycmp( key, entry ), each argument
X *  is a (char *), the function returns an int < 0, = 0 or > 0
X *  according to the order of the two arguments.
X *
X *  Bsearch(3) returns a pointer to the matching entry, if found,
X *  otherwise NULL is returned.
X */
X
X#define  NULL	(char *) 0
X
X
Xchar *bsearch( key, base, count, width, keycmp )
X  char *key;
X  char *base;
X  unsigned int count;
X  unsigned int width;
X  int  (*keycmp)();
X
X  {
X  char *mid_point;
X  int  cmp;
X
X  while ( count > 0 )
X    {
X    mid_point = base + width * (count >> 1);
X
X    cmp = keycmp( key, mid_point );
X
X    if ( cmp == 0 )
X	return( mid_point );
X
X    if ( cmp < 0 )
X	count >>= 1;
X    else
X	{
X	base  = mid_point + width;
X	count = (count - 1) >> 1;
X	}
X    }
X
X  return( NULL );
X  }
+ END-OF-FILE bsearch.c.new
chmod 'u=rw,g=r,o=r' 'bsearch.c.new'
set `wc -c 'bsearch.c.new'`
count=$1
case $count in
998)	:;;
*)	echo 'Bad character count in ''bsearch.c.new' >&2
		echo 'Count should be 998' >&2
esac
echo Extracting 'bzero.c.new'
sed 's/^X//' > 'bzero.c.new' << '+ END-OF-FILE ''bzero.c.new'
X/*  bzero(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xbzero( vector, count )
X  char *vector;
X  int   count;
X
X  {
X  int word_count = count / sizeof(int);
X  int byte_count = count & ( sizeof(int) - 1 );
X
X  while( --word_count >= 0 )
X    *((int *) vector)++ = 0;
X
X  while( --byte_count >= 0 )
X    *vector++ = 0;
X  }
+ END-OF-FILE bzero.c.new
chmod 'u=rw,g=r,o=r' 'bzero.c.new'
set `wc -c 'bzero.c.new'`
count=$1
case $count in
329)	:;;
*)	echo 'Bad character count in ''bzero.c.new' >&2
		echo 'Count should be 329' >&2
esac
echo Extracting 'ctermid.c.new'
sed 's/^X//' > 'ctermid.c.new' << '+ END-OF-FILE ''ctermid.c.new'
X/*  ctermid(3)
X *
X *  Author: Terrence Holm          Aug. 1988
X *
X *
X *  Ctermid(3) returns a pointer to a string naming the controlling
X *  terminal. If <name_space> is NULL then local static storage
X *  is used, otherwise <name_space> must point to storage of at
X *  least L_ctermid characters.
X *
X *  Returns a pointer to "/dev/tty".
X */
X
X#include  <stdio.h>
X
X#ifndef L_ctermid
X#define L_ctermid  9
X#endif
X
X
Xchar *ctermid( name_space )
X  char *name_space;
X
X  {
X  static char termid[ L_ctermid ];
X
X  if ( name_space == NULL )
X    name_space = termid;
X
X  strcpy( name_space, "/dev/tty" );
X
X  return( name_space );
X  }
+ END-OF-FILE ctermid.c.new
chmod 'u=rw,g=r,o=r' 'ctermid.c.new'
set `wc -c 'ctermid.c.new'`
count=$1
case $count in
619)	:;;
*)	echo 'Bad character count in ''ctermid.c.new' >&2
		echo 'Count should be 619' >&2
esac
echo Extracting 'ctime.c.cdif'
sed 's/^X//' > 'ctime.c.cdif' << '+ END-OF-FILE ''ctime.c.cdif'
X*** /local/ast/minix/tape3b/lib/ctime.c	Wed Jul 13 11:55:43 1988
X--- ctime.c	Mon Sep 26 13:04:55 1988
X***************
X*** 8,27 ****
X  	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
X  };
X  static char *days[] = {
X! 	"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
X  };
X  
X- /* To compute which date falls on which day of the week, we need to know the
X-  * day of the week corresponding to Jan 1 of each year 1970 - 1999. The table
X-  * newyear[] gives this, with 0 = Mon, 1 = Tue, 2 = Wed, ..., 6 = Sun.  After
X-  * Jan 1, 2000 this program will screw up.  It probably won't be the only one.
X-  */
X- static int newyear[] = {
X- 	3, 4, 5, 0, 1, 2, 3, 5, 6, 0, 	/* 1970 - 1979 */
X- 	1, 3, 4, 5, 6, 1, 2, 3, 4, 6,	/* 1980 - 1989 */
X- 	0, 1, 2, 4, 5, 6, 0, 2, 3, 4	/* 1990 - 1999 */
X- };
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--- 8,16 ----
X  	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
X  };
X  static char *days[] = {
X! 	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
X  };
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***************
X*** 35,40 ****
X--- 24,31 ----
X  {
X  	register long t = *pt;
X  
X+ 	long year;
X+ 
X  	tm.tm_year = 0;
X  	tm.tm_mon = 0;
X  	tm.tm_mday = 1;
X***************
X*** 43,63 ****
X  	tm.tm_sec = 0;
X  
X  	/* t is elapsed time in seconds since Jan 1, 1970. */
X! 	while (t >= YEAR) {	/* how many years can we subtract from t? */
X! 		if ((tm.tm_year % 4) == 2)
X! 		{
X! 			if ( t < YEAR + DAY )
X! 				break;
X! 			t -= DAY;
X! 		}
X  		tm.tm_year += 1;
X! 		t -= YEAR;
X  	}
X  	tm.tm_year += 1970;
X  
X  	/* t is now the offset into the current year, in seconds. */
X! 	tm.tm_yday = (t/DAY);	/* day # of the year, Jan 1 = 0 */
X! 	tm.tm_wday = ((newyear[tm.tm_year - 1970] + tm.tm_yday - 1) % 7) + 1;
X  
X  	days_per_month[1] = 28;
X  	if ((tm.tm_year % 4) == 0)	/* check for leap year */
X--- 34,48 ----
X  	tm.tm_sec = 0;
X  
X  	/* t is elapsed time in seconds since Jan 1, 1970. */
X! 	tm.tm_wday = (int) (t/DAY + 4L) % 7;	/* Jan 1, 1970 is 4th wday */
X! 	while (t >= (year=((tm.tm_year%4)==2) ? YEAR+DAY : YEAR)) {
X  		tm.tm_year += 1;
X! 		t -= year;
X  	}
X  	tm.tm_year += 1970;
X  
X  	/* t is now the offset into the current year, in seconds. */
X! 	tm.tm_yday = (t/DAY);		/* day # of the year, Jan 1 = 0 */
X  
X  	days_per_month[1] = 28;
X  	if ((tm.tm_year % 4) == 0)	/* check for leap year */
X***************
X*** 66,72 ****
X  	/* Compute month. */
X  	while (t >= (days_per_month[tm.tm_mon] * DAY))
X  		t -= days_per_month[tm.tm_mon++] * DAY;
X- 	tm.tm_mon++;			/* Jan is month 1, not month 0 */
X  
X  	/* Month established, now compute day of the month */
X  	while (t >= DAY) {
X--- 51,56 ----
X***************
X*** 91,97 ****
X  
X  	/* Generate output in ASCII in buf. */
X  	sprintf(buf, "%s %s %2d %02d:%02d:%02d %d\n",
X! 		days[tm.tm_wday - 1], months[tm.tm_mon-1],
X  		tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year); 
X  	return buf;
X  }
X--- 75,81 ----
X  
X  	/* Generate output in ASCII in buf. */
X  	sprintf(buf, "%s %s %2d %02d:%02d:%02d %d\n",
X! 		days[tm.tm_wday], months[tm.tm_mon],
X  		tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year); 
X  	return buf;
X  }
+ END-OF-FILE ctime.c.cdif
chmod 'u=rw,g=r,o=r' 'ctime.c.cdif'
set `wc -c 'ctime.c.cdif'`
count=$1
case $count in
3297)	:;;
*)	echo 'Bad character count in ''ctime.c.cdif' >&2
		echo 'Count should be 3297' >&2
esac
echo Extracting 'cuserid.c.new'
sed 's/^X//' > 'cuserid.c.new' << '+ END-OF-FILE ''cuserid.c.new'
X/*  cuserid(3)
X *
X *  Author: Terrence W. Holm          Sept. 1987
X */
X
X#include <stdio.h>
X#include <pwd.h>
X
X#ifndef  L_cuserid
X#define  L_cuserid   9
X#endif
X
Xextern struct passwd *getpwuid();
X
X
Xchar *cuserid( user_name )
X  char *user_name;
X
X  {
X  static  char   userid[ L_cuserid ];
X  struct passwd *pw_entry;
X
X  if ( user_name == NULL )
X    user_name = userid;
X
X  pw_entry = getpwuid( geteuid() );
X
X  if ( pw_entry == NULL )
X    {
X    *user_name = '\0';
X    return( NULL );
X    }
X
X  strcpy( user_name, pw_entry->pw_name );
X
X  return( user_name );
X  }
+ END-OF-FILE cuserid.c.new
chmod 'u=rw,g=r,o=r' 'cuserid.c.new'
set `wc -c 'cuserid.c.new'`
count=$1
case $count in
553)	:;;
*)	echo 'Bad character count in ''cuserid.c.new' >&2
		echo 'Count should be 553' >&2
esac
echo Extracting 'doprintf.c.cdif'
sed 's/^X//' > 'doprintf.c.cdif' << '+ END-OF-FILE ''doprintf.c.cdif'
X*** /local/ast/minix/tape3b/lib/doprintf.c	Wed Jul 13 11:55:43 1988
X--- doprintf.c	Mon Sep 26 13:04:55 1988
X***************
X*** 16,22 ****
X  #endif
X  
X  static char *
X! itoa(p, num, radix)
X  register char *p;
X  register unsigned num;
X  register radix;
X--- 16,22 ----
X  #endif
X  
X  static char *
X! _itoa(p, num, radix)
X  register char *p;
X  register unsigned num;
X  register radix;
X***************
X*** 182,188 ****
X  				break;
X  			}
X  #endif
X! 			p = itoa(p, GETARG(int), c);
X  			break;
X  		case 'D':
X  #ifndef NO_LONGD
X--- 182,188 ----
X  				break;
X  			}
X  #endif
X! 			p = _itoa(p, GETARG(int), c);
X  			break;
X  		case 'D':
X  #ifndef NO_LONGD
X***************
X*** 203,209 ****
X  				*p++ = '-';
X  				i = -i;
X  			}
X! 			p = itoa(p, i, 10);
X  			break;
X  #ifdef NO_FLOAT
X  		case 'e':
X--- 203,209 ----
X  				*p++ = '-';
X  				i = -i;
X  			}
X! 			p = _itoa(p, i, 10);
X  			break;
X  #ifdef NO_FLOAT
X  		case 'e':
+ END-OF-FILE doprintf.c.cdif
chmod 'u=rw,g=r,o=r' 'doprintf.c.cdif'
set `wc -c 'doprintf.c.cdif'`
count=$1
case $count in
915)	:;;
*)	echo 'Bad character count in ''doprintf.c.cdif' >&2
		echo 'Count should be 915' >&2
esac
echo Extracting 'execlp.c.new'
sed 's/^X//' > 'execlp.c.new' << '+ END-OF-FILE ''execlp.c.new'
X/* execlp(3) and execvp(3)
X *
X * Author: Terrence W. Holm      July 1988
X */
X
X/*
X *  Execlp(3) and execvp(3) are like execl(3) and execv(3),
X *  except that they use the environment variable $PATH as
X *  a search list of possible locations for the executable
X *  file, if <file> does not start with a '/'.
X *
X *  The path search list is a list of directory names separated
X *  by ':'s. If a colon appears at the beginning or end of the
X *  list, or two appear together, then an empty prefix is
X *  tried. If $PATH is not in the environment, it defaults to
X *  ":/bin:/usr/bin".
X *
X *  For example, if <file> is "sh", and the $PATH is
X *  ":/bin:/usr/local:/usr/bin", then the attempts will be:
X *  "sh", "/bin/sh", "/usr/local/sh" and "/usr/bin/sh".
X *
X *  If the <file> is not an executable file in one of the
X *  directories, then -1 is returned.
X */
X
X#include <errno.h>
X/* #include <string.h> */
X/* #include <unistd.h> */
X
X#ifndef X_OK
X#define X_OK 1
X#endif
X
X#define  NULL  (char *) 0
X
Xextern char *index();
Xextern char *getenv();
X
Xextern char **environ;
Xextern int    errno;
X
X
Xexeclp( file, arg0 )
X  char *file;
X  char *arg0;
X
X  {
X  return( execvp( file, &arg0 ) );
X  }
X
X
Xexecvp( file, argv )
X  char *file;
X  char *argv[];
X
X  {
X  char path_name[100];
X  char *next;
X  char *path = getenv( "PATH" );
X
X  if ( path == NULL )
X    path = ":/bin:/usr/bin";
X
X  if ( file[0] == '/' )
X    path = "";
X
X  do  {
X      next = index( path, ':' );
X
X      if ( next == NULL )
X	  strcpy( path_name, path );
X      else
X	  {
X	  *path_name = '\0';
X	  strncat( path_name, path, next - path );
X	  path = next + 1;
X	  }
X
X      if ( *path_name != '\0' )
X          strcat( path_name, "/" );
X
X      strcat( path_name, file );
X
X      if ( access( path_name, X_OK ) == 0 )
X	  execve( path_name, argv, environ );
X      } while ( next != NULL );
X
X  errno = ENOENT;
X  return( -1 );
X  }
+ END-OF-FILE execlp.c.new
chmod 'u=rw,g=r,o=r' 'execlp.c.new'
set `wc -c 'execlp.c.new'`
count=$1
case $count in
1858)	:;;
*)	echo 'Bad character count in ''execlp.c.new' >&2
		echo 'Count should be 1858' >&2
esac
echo Extracting 'ffs.c.new'
sed 's/^X//' > 'ffs.c.new' << '+ END-OF-FILE ''ffs.c.new'
X/*  ffs(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xint ffs( word )
X  int word;
X
X  {
X  int i;
X 
X  if ( word == 0 )
X    return( 0 );
X
X  for ( i = 1;  ;  ++i, word >>= 1 )
X    if ( word & 1 )
X	return( i );
X  }
+ END-OF-FILE ffs.c.new
chmod 'u=rw,g=r,o=r' 'ffs.c.new'
set `wc -c 'ffs.c.new'`
count=$1
case $count in
224)	:;;
*)	echo 'Bad character count in ''ffs.c.new' >&2
		echo 'Count should be 224' >&2
esac
echo Extracting 'fgetc.c.new'
sed 's/^X//' > 'fgetc.c.new' << '+ END-OF-FILE ''fgetc.c.new'
X#include <stdio.h>
X
X
X
Xfgetc(iop)
XFILE *iop;
X{
X	int ch;
X
X	if ( testflag(iop, (_EOF | _ERR )))
X		return (EOF); 
X
X	if ( !testflag(iop, READMODE) ) 
X		return (EOF);
X
X	if (iop->_count <= 0){
X
X		if ( testflag(iop, UNBUFF) )
X			iop->_count = read(iop->_fd,&ch,1);
X		else 
X			iop->_count = read(iop->_fd,iop->_buf,BUFSIZ);
X
X		if (iop->_count <= 0){
X			if (iop->_count == 0)
X				iop->_flags |= _EOF;
X			else 
X				iop->_flags |= _ERR;
X
X			return (EOF);
X		}
X		else 
X			iop->_ptr = iop->_buf;
X	}
X
X	iop->_count--;		/* account one char */
X	if (testflag(iop,UNBUFF))
X		return (ch & CMASK);
X	else
X		return (*iop->_ptr++ & CMASK);
X}
X
+ END-OF-FILE fgetc.c.new
chmod 'u=rw,g=r,o=r' 'fgetc.c.new'
set `wc -c 'fgetc.c.new'`
count=$1
case $count in
617)	:;;
*)	echo 'Bad character count in ''fgetc.c.new' >&2
		echo 'Count should be 617' >&2
esac
echo Extracting 'fopen.c.cdif'
sed 's/^X//' > 'fopen.c.cdif' << '+ END-OF-FILE ''fopen.c.cdif'
X*** /local/ast/minix/tape3b/lib/fopen.c	Wed Jul 13 11:55:45 1988
X--- fopen.c	Mon Sep 26 13:04:57 1988
X***************
X*** 27,32 ****
X--- 27,33 ----
X  		break;
X  
X  	case 'a': 
X+ 		flags |= WRITEMODE;
X  		if (( fd = open(name,1)) < 0 )
X  			if(errno != ENOENT || (fd = creat(name, PMODE)) < 0)
X  				return(NULL);
+ END-OF-FILE fopen.c.cdif
chmod 'u=rw,g=r,o=r' 'fopen.c.cdif'
set `wc -c 'fopen.c.cdif'`
count=$1
case $count in
313)	:;;
*)	echo 'Bad character count in ''fopen.c.cdif' >&2
		echo 'Count should be 313' >&2
esac
echo Extracting 'fputc.c.new'
sed 's/^X//' > 'fputc.c.new' << '+ END-OF-FILE ''fputc.c.new'
X#include <stdio.h>
X
Xextern int (*__cleanup)();
Xextern int _cleanup();
X
Xfputc(ch, iop)
Xchar ch;
XFILE *iop;
X{
X	int n,
X	didwrite = 0;
X
X	if (testflag(iop, (_ERR | _EOF)))
X		return (EOF); 
X
X	if ( !testflag(iop,WRITEMODE))
X		return(EOF);
X
X	if ( testflag(iop,UNBUFF)){
X		n = write(iop->_fd,&ch,1);
X		iop->_count = 1;
X		didwrite++;
X	}
X	else{
X		__cleanup = _cleanup;
X		*iop->_ptr++ = ch;
X		if ((++iop->_count) >= BUFSIZ && !testflag(iop,STRINGS) ){
X			n = write(iop->_fd,iop->_buf,iop->_count);
X			iop->_ptr = iop->_buf;
X			didwrite++;
X		}
X	}
X
X	if (didwrite){
X		if (n<=0 || iop->_count != n){
X			if (n < 0)
X				iop->_flags |= _ERR;
X			else
X				iop->_flags |= _EOF;
X			return (EOF);
X		}
X		iop->_count=0;
X	}
X	return(ch & CMASK);
X}
X
+ END-OF-FILE fputc.c.new
chmod 'u=rw,g=r,o=r' 'fputc.c.new'
set `wc -c 'fputc.c.new'`
count=$1
case $count in
721)	:;;
*)	echo 'Bad character count in ''fputc.c.new' >&2
		echo 'Count should be 721' >&2
esac
echo Extracting 'getcwd.c.new'
sed 's/^X//' > 'getcwd.c.new' << '+ END-OF-FILE ''getcwd.c.new'
X/*  getcwd(3)
X *
X *  Author: Terrence W. Holm          Aug. 1988
X *
X *  Directly derived from Adri Koppes' pwd(1).
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <sys/dir.h>
X#include <errno.h>
X
X#define  NULL         (char *) 0
X#define  O_RDONLY     0
X#define  DIRECT_SIZE  (sizeof (struct direct))
X#define  PATH_MAX     127
X
Xextern char *rindex();
X
Xextern int errno;
X
X
Xchar *getcwd( buffer, size )
X  char *buffer;
X  int   size;
X
X  {
X  static char path[ PATH_MAX + 1 ];
X  struct stat current;
X
X  if ( buffer == NULL  ||  size == 0 )
X    {
X    errno = EINVAL;
X    return( NULL );
X    }
X
X  path[0] = '\0';
X
X  /*  Get the inode for the current directory  */
X   
X  if ( stat( ".", &current ) == -1 )
X    return( NULL );
X
X  if ( (current.st_mode & S_IFMT) != S_IFDIR )
X    return( NULL );
X
X
X  /*  Run backwards up the directory tree, grabbing 	*/
X  /*  directory names on the way.			*/
X
X  while (1)
X    {
X    struct stat parent;
X    struct direct d;
X    int same_device = 0;
X    int found = 0;
X    int fd;
X
X    /*  Get the inode for the parent directory  */
X
X    if ( chdir( ".." ) == -1 )
X	return( NULL );
X
X    if ( stat( ".", &parent ) == -1 )
X	return( NULL );
X
X    if ( (parent.st_mode & S_IFMT) != S_IFDIR )
X	return( NULL );
X
X    if ( current.st_dev == parent.st_dev )
X	same_device = 1;
X
X
X    /*  At the root, "." is the same as ".."  */
X
X    if ( same_device  &&  current.st_ino == parent.st_ino )
X	break;
X
X
X    /*  Search the parent directory for the current entry  */
X
X    if ( (fd = open( ".", O_RDONLY )) == -1 )
X	return( NULL );
X
X    while ( ! found  &&  read(fd, &d, DIRECT_SIZE) == DIRECT_SIZE )
X	{
X	if ( same_device )
X	    {
X	    if ( current.st_ino == d.d_ino )
X		found = 1;
X	    }
X	else
X	    {
X	    static char temp_name[ DIRSIZ + 1 ];
X	    static struct stat dir_entry;
X
X	    temp_name[0] = '\0';
X	    strncat( temp_name, d.d_name, DIRSIZ );
X
X	    if ( stat( temp_name, &dir_entry ) == -1 )
X		{
X		close( fd );
X		return( NULL );
X		}
X
X	    if ( current.st_dev == dir_entry.st_dev  &&
X	         current.st_ino == dir_entry.st_ino )
X		found = 1;
X	    }
X	}
X
X    close( fd );
X
X    if ( ! found )
X    	return( NULL );
X
X    if ( strlen(path) + DIRSIZ + 1 > PATH_MAX )
X	{
X	errno = ERANGE;
X	return( NULL );
X	}
X
X    strcat( path, "/" );
X    strncat( path, d.d_name, DIRSIZ );
X 
X    current.st_dev = parent.st_dev;
X    current.st_ino = parent.st_ino;
X    }
X
X
X  /*  Copy the reversed path name into <buffer>  */
X
X  if ( strlen(path) + 1 > size )
X    {
X    errno = ERANGE;
X    return( NULL );
X    }
X
X  if ( strlen(path) == 0 )
X    {
X    strcpy( buffer, "/" );
X    return( buffer );
X    }
X
X  *buffer = '\0';
X
X  {
X  char *r;
X
X  while ( (r = rindex( path, '/' )) != NULL )
X    {
X    strcat( buffer, r );
X    *r = '\0';
X    }
X  }
X
X  return( chdir( buffer ) ? NULL : buffer );
X  }
+ END-OF-FILE getcwd.c.new
chmod 'u=rw,g=r,o=r' 'getcwd.c.new'
set `wc -c 'getcwd.c.new'`
count=$1
case $count in
2784)	:;;
*)	echo 'Bad character count in ''getcwd.c.new' >&2
		echo 'Count should be 2784' >&2
esac
echo Extracting 'getenv.c.cdif'
sed 's/^X//' > 'getenv.c.cdif' << '+ END-OF-FILE ''getenv.c.cdif'
X*** /local/ast/minix/tape3b/lib/getenv.c	Wed Jul 13 11:55:48 1988
X--- getenv.c	Mon Sep 26 13:05:01 1988
X***************
X*** 1,21 ****
X! #define NULL  (char *) 0
X  
X! char *getenv(name)
X! register char *name;
X! {
X!   extern char **environ;
X!   register char **v = environ, *p, *q;
X  
X!   if (v && name) {			/* added if statement */
X! 	while ((p = *v++) != NULL) {	/* was, while((p = *v) != NULL */
X! 	  q = name;
X! 	  while (*p++ == *q)
X! 		if (*q++ == 0)
X! 		  continue;
X! 	  if (*(p - 1) != '=')
X! 		continue;
X! 	  return(p);
X! 	}
X    }
X-   return(0);
X- }
X--- 1,34 ----
X! /*  getenv(3)
X!  *
X!  *  Author: Terrence W. Holm          Aug. 1988
X!  */
X  
X! #define  NULL   (char *) 0
X  
X! extern char **environ;
X! 
X! 
X! char *getenv( name )
X!   char *name;
X!   {
X!   char **v;
X!   register char *n;
X!   register char *p;
X! 
X!   if ( environ == (char **) NULL  ||  name == NULL )
X!     return(NULL);
X! 
X!   for ( v = environ;  *v != NULL;  ++v )
X!     {
X!     n = name;
X!     p = *v;
X! 
X!     while ( *n == *p  &&  *n != '\0' )
X! 	++n, ++p;
X! 
X!     if ( *n == '\0'  &&  *p == '=' )
X! 	return( p + 1 );
X!     }
X! 
X!   return(NULL);
X    }
+ END-OF-FILE getenv.c.cdif
chmod 'u=rw,g=r,o=r' 'getenv.c.cdif'
set `wc -c 'getenv.c.cdif'`
count=$1
case $count in
1133)	:;;
*)	echo 'Bad character count in ''getenv.c.cdif' >&2
		echo 'Count should be 1133' >&2
esac
echo Extracting 'getgrent.c.cdif'
sed 's/^X//' > 'getgrent.c.cdif' << '+ END-OF-FILE ''getgrent.c.cdif'
X*** /local/ast/minix/tape3b/lib/getgrent.c	Wed Jul 13 11:55:49 1988
X--- getgrent.c	Mon Sep 26 13:05:04 1988
X***************
X*** 63,69 ****
X  
X  static skip_period () 
X  {
X!         while (*_buf != ':')
X  	        _buf++;
X          *_buf++ = '\0';
X  }
X--- 63,69 ----
X  
X  static skip_period () 
X  {
X!         while ((*_buf) && (*_buf != ':'))
X  	        _buf++;
X          *_buf++ = '\0';
X  }
+ END-OF-FILE getgrent.c.cdif
chmod 'u=rw,g=r,o=r' 'getgrent.c.cdif'
set `wc -c 'getgrent.c.cdif'`
count=$1
case $count in
391)	:;;
*)	echo 'Bad character count in ''getgrent.c.cdif' >&2
		echo 'Count should be 391' >&2
esac
echo Extracting 'getlogin.c.new'
sed 's/^X//' > 'getlogin.c.new' << '+ END-OF-FILE ''getlogin.c.new'
X/*  getlogin(3)
X *
X *  Author: Terrence W. Holm          Aug. 1988
X */
X
X#include <stdio.h>
X#include <pwd.h>
X
X#ifndef  L_cuserid
X#define  L_cuserid   9
X#endif
X
Xextern struct passwd *getpwuid();
X
X
Xchar *getlogin()
X  {
X  static  char   userid[ L_cuserid ];
X  struct passwd *pw_entry;
X
X  pw_entry = getpwuid( getuid() );
X
X  if ( pw_entry == NULL )
X    return( NULL );
X
X  strcpy( userid, pw_entry->pw_name );
X
X  return( userid );
X  }
+ END-OF-FILE getlogin.c.new
chmod 'u=rw,g=r,o=r' 'getlogin.c.new'
set `wc -c 'getlogin.c.new'`
count=$1
case $count in
429)	:;;
*)	echo 'Bad character count in ''getlogin.c.new' >&2
		echo 'Count should be 429' >&2
esac
echo Extracting 'getpass.c.cdif'
sed 's/^X//' > 'getpass.c.cdif' << '+ END-OF-FILE ''getpass.c.cdif'
X*** /local/ast/minix/tape3b/lib/getpass.c	Wed Jul 13 11:55:49 1988
X--- getpass.c	Mon Sep 26 13:05:04 1988
X***************
X*** 5,22 ****
X  char * getpass(prompt)
X  char *prompt;
X  {
X! 	int i = 0;
X  	struct sgttyb tty;
X  
X  	prints(prompt);
X  	ioctl(0, TIOCGETP, &tty);
X! 	tty.sg_flags = 06020;
X  	ioctl(0, TIOCSETP, &tty);
X  	i = read(0, pwdbuf, 9);
X  	while (pwdbuf[i - 1] != '\n')
X  		read(0, &pwdbuf[i - 1], 1);
X  	pwdbuf[i - 1] = '\0';
X! 	tty.sg_flags = 06030;
X  	ioctl(0, TIOCSETP, &tty);
X  	prints("\n");
X  	return(pwdbuf);
X--- 5,23 ----
X  char * getpass(prompt)
X  char *prompt;
X  {
X! 	int i = 0, save;
X  	struct sgttyb tty;
X  
X  	prints(prompt);
X  	ioctl(0, TIOCGETP, &tty);
X! 	save = tty.sg_flags;
X! 	tty.sg_flags = tty.sg_flags & ~ECHO;
X  	ioctl(0, TIOCSETP, &tty);
X  	i = read(0, pwdbuf, 9);
X  	while (pwdbuf[i - 1] != '\n')
X  		read(0, &pwdbuf[i - 1], 1);
X  	pwdbuf[i - 1] = '\0';
X! 	tty.sg_flags = save;
X  	ioctl(0, TIOCSETP, &tty);
X  	prints("\n");
X  	return(pwdbuf);
+ END-OF-FILE getpass.c.cdif
chmod 'u=rw,g=r,o=r' 'getpass.c.cdif'
set `wc -c 'getpass.c.cdif'`
count=$1
case $count in
980)	:;;
*)	echo 'Bad character count in ''getpass.c.cdif' >&2
		echo 'Count should be 980' >&2
esac
echo Extracting 'lsearch.c.new'
sed 's/^X//' > 'lsearch.c.new' << '+ END-OF-FILE ''lsearch.c.new'
X/*  lsearch(3)  and  lfind(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X#define  NULL  (char *) 0
X
X
Xchar *lsearch( key, base, count, width, keycmp )
X  char *key;
X  char *base;
X  unsigned *count;
X  unsigned  width;
X  int  (*keycmp)();
X
X  {
X  char *entry;
X  char *last = base + *count * width;
X
X  for ( entry = base;  entry < last;  entry += width )
X    if ( keycmp( key, entry ) == 0 )
X	return( entry );
X
X  bcopy( key, last, width );
X  *count += 1;
X  return( last );
X  }
X
X
X
Xchar *lfind( key, base, count, width, keycmp )
X  char *key;
X  char *base;
X  unsigned *count;
X  unsigned  width;
X  int  (*keycmp)();
X
X  {
X  char *entry;
X  char *last = base + *count * width;
X
X  for ( entry = base;  entry < last;  entry += width )
X    if ( keycmp( key, entry ) == 0 )
X	return( entry );
X
X  return( NULL );
X  }
+ END-OF-FILE lsearch.c.new
chmod 'u=rw,g=r,o=r' 'lsearch.c.new'
set `wc -c 'lsearch.c.new'`
count=$1
case $count in
811)	:;;
*)	echo 'Bad character count in ''lsearch.c.new' >&2
		echo 'Count should be 811' >&2
esac
echo Extracting 'memccpy.c.new'
sed 's/^X//' > 'memccpy.c.new' << '+ END-OF-FILE ''memccpy.c.new'
X/*  memccpy(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X#define  NULL  (char *) 0
X
X
Xchar *memccpy( to, from, chr, count )
X  char *to;
X  char *from;
X  int   chr;
X  int   count;
X
X  {
X  while( --count >= 0 )
X    if ( (*to++ = *from++) == chr )
X	return( from );
X
X  return( NULL );
X  }
+ END-OF-FILE memccpy.c.new
chmod 'u=rw,g=r,o=r' 'memccpy.c.new'
set `wc -c 'memccpy.c.new'`
count=$1
case $count in
296)	:;;
*)	echo 'Bad character count in ''memccpy.c.new' >&2
		echo 'Count should be 296' >&2
esac
echo Extracting 'memchr.c.new'
sed 's/^X//' > 'memchr.c.new' << '+ END-OF-FILE ''memchr.c.new'
X/*  memchr(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X#define  NULL  (char *) 0
X
X
Xchar *memchr( vector, chr, count )
X  char *vector;
X  int   chr;
X  int   count;
X
X  {
X  while( --count >= 0 )
X    if ( *vector++ == chr )
X	return( vector - 1 );
X
X  return( NULL );
X  }
+ END-OF-FILE memchr.c.new
chmod 'u=rw,g=r,o=r' 'memchr.c.new'
set `wc -c 'memchr.c.new'`
count=$1
case $count in
280)	:;;
*)	echo 'Bad character count in ''memchr.c.new' >&2
		echo 'Count should be 280' >&2
esac
echo Extracting 'memcmp.c.new'
sed 's/^X//' > 'memcmp.c.new' << '+ END-OF-FILE ''memcmp.c.new'
X/*  memcmp(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xint memcmp( vector1, vector2, count )
X  char *vector1;
X  char *vector2;
X  int   count;
X
X  {
X  register int cmp;
X
X  if ( vector1 == vector2 )
X    return( 0 );
X
X  while( --count >= 0 )
X    if ( cmp = *vector1++ - *vector2++ )
X	return( cmp );
X
X  return( 0 );
X  }
+ END-OF-FILE memcmp.c.new
chmod 'u=rw,g=r,o=r' 'memcmp.c.new'
set `wc -c 'memcmp.c.new'`
count=$1
case $count in
331)	:;;
*)	echo 'Bad character count in ''memcmp.c.new' >&2
		echo 'Count should be 331' >&2
esac
echo Extracting 'memcpy.c.new'
sed 's/^X//' > 'memcpy.c.new' << '+ END-OF-FILE ''memcpy.c.new'
X/*  memcpy(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xchar *memcpy( to, from, count )
X  char *to;
X  char *from;
X  int   count;
X
X  {
X  int word_count = count / sizeof(int);
X  int byte_count = count & ( sizeof(int) - 1 );
X  char *temp_to  = to;
X  
X  if ( to > from  &&  to < from + count )
X    {
X    /*  Must copy backwards  */
X    from += count;
X    to   += count;
X
X    while( --byte_count >= 0 )
X      *--to = *--from;
X
X    while( --word_count >= 0 )
X      *--((int *) to) = *--((int *) from);
X    }
X  else
X    {
X    while( --word_count >= 0 )
X      *((int *) to)++ = *((int *) from)++;
X
X    while( --byte_count >= 0 )
X      *to++ = *from++;
X    }
X
X  return( temp_to );
X  }
+ END-OF-FILE memcpy.c.new
chmod 'u=rw,g=r,o=r' 'memcpy.c.new'
set `wc -c 'memcpy.c.new'`
count=$1
case $count in
691)	:;;
*)	echo 'Bad character count in ''memcpy.c.new' >&2
		echo 'Count should be 691' >&2
esac
echo Extracting 'memset.c.new'
sed 's/^X//' > 'memset.c.new' << '+ END-OF-FILE ''memset.c.new'
X/*  memset(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xchar *memset( vector, chr, count )
X  char *vector;
X  int   chr;
X  int   count;
X
X  {
X  register char *memory = vector;
X
X  while( --count >= 0 )
X    *memory++ = chr;
X
X  return( vector );
X  }
+ END-OF-FILE memset.c.new
chmod 'u=rw,g=r,o=r' 'memset.c.new'
set `wc -c 'memset.c.new'`
count=$1
case $count in
260)	:;;
*)	echo 'Bad character count in ''memset.c.new' >&2
		echo 'Count should be 260' >&2
esac
echo Extracting 'scanf.c.cdif'
sed 's/^X//' > 'scanf.c.cdif' << '+ END-OF-FILE ''scanf.c.cdif'
X*** /local/ast/minix/tape3b/lib/scanf.c	Wed Jul 13 11:56:01 1988
X--- scanf.c	Mon Sep 26 13:05:15 1988
X***************
X*** 162,168 ****
X  				goto all_done;
X  			++format;
X  			rnc ();
X- 			++done;
X  			continue;
X  		}
X  		++format;
X--- 162,167 ----
X***************
X*** 234,241 ****
X  				else
X  					*(argp++)->uint_p = (unsigned) val;
X  			}
X! 			if (done_some)
X! 				++done;
X  			else
X  				goto all_done;
X  			break;
X--- 233,241 ----
X  				else
X  					*(argp++)->uint_p = (unsigned) val;
X  			}
X! 			if (done_some) {
X! 				if(do_assign) ++done;
X! 			}
X  			else
X  				goto all_done;
X  			break;
X***************
X*** 250,256 ****
X  			}
X  			if (do_assign)
X  				argp++;	/* done with this one */
X! 			if (done_some)
X  				++done;
X  			break;
X  		case 's':
X--- 250,256 ----
X  			}
X  			if (do_assign)
X  				argp++;	/* done with this one */
X! 			if (done_some && do_assign)
X  				++done;
X  			break;
X  		case 's':
X***************
X*** 264,272 ****
X  			}
X  			if (do_assign)		/* terminate the string */
X  				*(argp++)->chr_p = '\0';	
X! 			if (done_some)
X! 				++done;
X! 			else
X  				goto all_done;
X  			break;
X  		case '[':
X--- 264,272 ----
X  			}
X  			if (do_assign)		/* terminate the string */
X  				*(argp++)->chr_p = '\0';	
X! 			if (done_some) {
X! 				if(do_assign) ++done;
X! 			} else
X  				goto all_done;
X  			break;
X  		case '[':
X***************
X*** 299,307 ****
X  			*format = ']';		/* put it back */
X  			if (do_assign)		/* terminate the string */
X  				*(argp++)->chr_p = '\0';	
X! 			if (done_some)
X! 				++done;
X! 			else
X  				goto all_done;
X  			break;
X  		}		/* end switch */
X--- 299,307 ----
X  			*format = ']';		/* put it back */
X  			if (do_assign)		/* terminate the string */
X  				*(argp++)->chr_p = '\0';	
X! 			if (done_some) {
X! 				if(do_assign) ++done;
X! 			} else
X  				goto all_done;
X  			break;
X  		}		/* end switch */
+ END-OF-FILE scanf.c.cdif
chmod 'u=rw,g=r,o=r' 'scanf.c.cdif'
set `wc -c 'scanf.c.cdif'`
count=$1
case $count in
1845)	:;;
*)	echo 'Bad character count in ''scanf.c.cdif' >&2
		echo 'Count should be 1845' >&2
esac
echo Extracting 'strchr.c.new'
sed 's/^X//' > 'strchr.c.new' << '+ END-OF-FILE ''strchr.c.new'
X/*  strchr(3) 
X *
X *  Derived from MINIX index(3)
X */
X
X
X#define  NULL  (char *) 0
X
X
Xchar *strchr( string, chr )
X  register char *string;
X  register char  chr;
X
X  {
X  do {
X     if ( *string == chr )
X	return( string );
X     } while ( *string++ != '\0' );
X
X  return( NULL );
X  }
+ END-OF-FILE strchr.c.new
chmod 'u=rw,g=r,o=r' 'strchr.c.new'
set `wc -c 'strchr.c.new'`
count=$1
case $count in
276)	:;;
*)	echo 'Bad character count in ''strchr.c.new' >&2
		echo 'Count should be 276' >&2
esac
echo Extracting 'strcspn.c.new'
sed 's/^X//' > 'strcspn.c.new' << '+ END-OF-FILE ''strcspn.c.new'
X/*  strcspn(3)
X *
X *  Author:  Terrence W. Holm          July 1988
X *
X *
X *  This function determines the length of a span from the
X *  beginning of <string> which contains none of the
X *  characters specified in <char_set>. The length of the
X *  span is returned.
X */
X
X#define NULL (char *) 0
X
X
Xint strcspn( string, char_set )
X  char *string;
X  char *char_set;
X
X  {
X  register char *str;
X  register char *chr;
X
X  if ( string == NULL )
X      return( 0 );
X
X  if ( char_set == NULL )
X      return( strlen(string) );
X
X  for ( str = string;  *str != '\0';  ++str )
X      for ( chr = char_set;  *chr != '\0';  ++chr )
X	  if ( *str == *chr )
X	      return( str - string );
X
X  return( str - string );
X  }
+ END-OF-FILE strcspn.c.new
chmod 'u=rw,g=r,o=r' 'strcspn.c.new'
set `wc -c 'strcspn.c.new'`
count=$1
case $count in
698)	:;;
*)	echo 'Bad character count in ''strcspn.c.new' >&2
		echo 'Count should be 698' >&2
esac
echo Extracting 'strpbrk.c.new'
sed 's/^X//' > 'strpbrk.c.new' << '+ END-OF-FILE ''strpbrk.c.new'
X/*  strpbrk(3)
X *
X *  Author:  Terrence W. Holm          July 1988
X *
X *
X *  Strpbrk(3) scans <string> for the first occurrence of a
X *  character from the string <char_set>. If a character from
X *  the <char_set> was found then a pointer to it within
X *  <string> is returned, otherwise NULL is returned.
X */
X
X#define NULL (char *) 0
X
X
Xchar *strpbrk( string, char_set )
X  char *string;
X  char *char_set;
X
X  {
X  register char  c;
X  register char *p;
X
X  if ( string == NULL  ||  char_set == NULL )
X      return( NULL );
X
X  while ( (c = *string++) != '\0' )
X      for ( p = char_set;  *p != '\0';  ++p )
X	  if ( c == *p )
X	    return( string - 1 );
X
X  return( NULL );
X  }
+ END-OF-FILE strpbrk.c.new
chmod 'u=rw,g=r,o=r' 'strpbrk.c.new'
set `wc -c 'strpbrk.c.new'`
count=$1
case $count in
670)	:;;
*)	echo 'Bad character count in ''strpbrk.c.new' >&2
		echo 'Count should be 670' >&2
esac
echo Extracting 'strrchr.c.new'
sed 's/^X//' > 'strrchr.c.new' << '+ END-OF-FILE ''strrchr.c.new'
X/*  strrchr(3) 
X *
X *  Derived from MINIX rindex(3)
X */
X
X
X#define  NULL  (char *) 0
X
X
Xchar *strrchr( string, chr )
X  register char *string;
X  register char  chr;
X
X  {
X  char *index = NULL;
X
X  do {
X     if ( *string == chr )
X	index = string;
X     } while ( *string++ != '\0' );
X
X  return( index );
X  }
+ END-OF-FILE strrchr.c.new
chmod 'u=rw,g=r,o=r' 'strrchr.c.new'
set `wc -c 'strrchr.c.new'`
count=$1
case $count in
301)	:;;
*)	echo 'Bad character count in ''strrchr.c.new' >&2
		echo 'Count should be 301' >&2
esac
echo Extracting 'strspn.c.new'
sed 's/^X//' > 'strspn.c.new' << '+ END-OF-FILE ''strspn.c.new'
X/*  strspn(3)
X *
X *  Author:  Terrence W. Holm          July 1988
X *
X *
X *  This function determines the length of a span from the
X *  beginning of <string> which contains only characters
X *  specified in <char_set>. The length of the span is
X *  returned.
X */
X
X#define NULL (char *) 0
X
X
Xint strspn( string, char_set )
X  char *string;
X  char *char_set;
X
X  {
X  register char *str;
X  register char *chr;
X
X  if ( string == NULL  ||  char_set == NULL )
X      return( 0 );
X
X  for ( str = string;  *str != '\0';  ++str )
X      {
X      for ( chr = char_set;  *chr != '\0';  ++chr )
X	  if ( *str == *chr )
X	      break;
X
X      if ( *chr == '\0' )
X	  return( str - string );
X      }
X
X  return( str - string );
X  }
+ END-OF-FILE strspn.c.new
chmod 'u=rw,g=r,o=r' 'strspn.c.new'
set `wc -c 'strspn.c.new'`
count=$1
case $count in
705)	:;;
*)	echo 'Bad character count in ''strspn.c.new' >&2
		echo 'Count should be 705' >&2
esac
echo Extracting 'strstr.c.new'
sed 's/^X//' > 'strstr.c.new' << '+ END-OF-FILE ''strstr.c.new'
X/*  strstr(3)
X *
X *  Author: Terrence W. Holm          July 1988
X *
X *
X *  Finds the first occurrence of a substring, pointed to by
X *  <substr>, within a string pointed to by <string>.
X *  If the substring is found then a pointer to it within
X *  <string> is returned, otherwise NULL is returned.
X */
X
X#define NULL (char *) 0
X
X
Xchar *strstr( string, substr )
X  char *string;
X  char *substr;
X
X  {
X  register char head_string;
X  register char head_substr;
X
X  if ( string == NULL  ||  substr == NULL )
X      return( NULL );
X
X  head_substr = *substr++;
X
X  while ( (head_string = *string++) != '\0' )
X    if ( head_string == head_substr )
X	{
X	register char *tail_string = string;
X	register char *tail_substr = substr;
X
X	do  {
X	    if ( *tail_substr == '\0' )
X		return( string - 1 );
X	    } while ( *tail_string++ == *tail_substr++ );
X	}
X
X  return( NULL );
X  }
+ END-OF-FILE strstr.c.new
chmod 'u=rw,g=r,o=r' 'strstr.c.new'
set `wc -c 'strstr.c.new'`
count=$1
case $count in
856)	:;;
*)	echo 'Bad character count in ''strstr.c.new' >&2
		echo 'Count should be 856' >&2
esac
echo Extracting 'strtok.c.new'
sed 's/^X//' > 'strtok.c.new' << '+ END-OF-FILE ''strtok.c.new'
X/*  strtok(3)
X *
X *  Author: Terrence W. Holm          July 1988
X *
X *
X *  This function is used to divide up a string into tokens.
X *  Strtok(3) is called with <string> pointing to the string
X *  to be scanned and <char_set> pointing to a string which
X *  consists of the set of separator characters. Tokens are
X *  substrings bordered by separator characters. A pointer to
X *  the first token encountered is returned. If <string> is
X *  NULL then the scan is continued from the last token
X *  returned. Each token is terminated by a '\0'. If there are
X *  no tokens remaining in the string then NULL is returned.
X */
X
X#define NULL (char *) 0
X
X
Xchar *strtok( string, char_set )
X  char *string;
X  char *char_set;
X
X  {
X  static char *last_string = "";
X  register char *chr;
X  char *next_token;
X
X  if ( string == NULL )
X      string = last_string;
X
X  if ( char_set == NULL )
X      return( NULL );
X
X
X  /*  First skip over any separator characters  */
X
X  while ( *string != '\0' )
X      {
X      for ( chr = char_set;  *chr != '\0';  ++chr )
X	  if ( *string == *chr )
X	      break;
X
X      if ( *chr == '\0' )
X	  break;
X
X      ++string;
X      }
X
X
X  /*  Check if we have reached the end of the string  */
X
X  if ( *string == '\0' )
X      return( NULL );
X
X
X  /*  If not, then we have found the next token  */
X
X  next_token = string;
X
X
X  /*  Scan for the end of this token  */
X
X  while ( *string != '\0' )
X      {
X      for ( chr = char_set;  *chr != '\0';  ++chr )
X	  if ( *string == *chr )
X	      {
X	      *string = '\0';
X	      last_string = string + 1;
X	      return( next_token );
X	      }
X
X      ++string;
X      }
X
X  last_string = string;
X  return( next_token );
X  }
+ END-OF-FILE strtok.c.new
chmod 'u=rw,g=r,o=r' 'strtok.c.new'
set `wc -c 'strtok.c.new'`
count=$1
case $count in
1663)	:;;
*)	echo 'Bad character count in ''strtok.c.new' >&2
		echo 'Count should be 1663' >&2
esac
echo Extracting 'swab.c.new'
sed 's/^X//' > 'swab.c.new' << '+ END-OF-FILE ''swab.c.new'
X/*  swab(3)
X *
X *  Author: Terrence W. Holm          Sep. 1988
X */
X
X
Xswab( from, to, count )
X  char *from;
X  char *to;
X  int   count;
X
X  {
X  register char temp;
X
X  count >>= 1;
X
X  while( --count >= 0 )
X    {
X    temp  = *from++;
X    *to++ = *from++;
X    *to++ = temp;
X    }
X  }
+ END-OF-FILE swab.c.new
chmod 'u=rw,g=r,o=r' 'swab.c.new'
set `wc -c 'swab.c.new'`
count=$1
case $count in
278)	:;;
*)	echo 'Bad character count in ''swab.c.new' >&2
		echo 'Count should be 278' >&2
esac
echo Extracting 'termcap.c.cdif'
sed 's/^X//' > 'termcap.c.cdif' << '+ END-OF-FILE ''termcap.c.cdif'
X*** /local/ast/minix/tape3b/lib/termcap.c	Wed Jul 13 11:56:07 1988
X--- termcap.c	Mon Sep 26 13:05:23 1988
X***************
X*** 13,18 ****
X--- 13,19 ----
X      - Correct when TERM != name and TERMCAP is defined   [tgetent]
X      - Correct the comparison for the terminal name       [tgetent]
X      - Correct the value of ^x escapes                    [tgetstr]
X+     - Added %r to reverse row/column			 [tgoto]
X  */
X  
X  #include <stdio.h>
X***************
X*** 23,29 ****
X  #define ISDIGIT(x)	((x) >= '0' && (x) <= '9')
X  
X  char		*capab;		/* the capability itself */
X- int		incr;		/* set by %i flag */
X  
X  extern char	*getenv();	/* new, improved getenv */
X  extern FILE	*fopen();	/* old fopen */
X--- 24,29 ----
X***************
X*** 233,239 ****
X  {
X  	register char	*rp;
X  	static char	ret[24];
X! 	int		*dp = &destcol;
X  	int 		argno = 0, numval;
X  
X  	for (rp = ret ; *cm ; cm++) {
X--- 233,239 ----
X  {
X  	register char	*rp;
X  	static char	ret[24];
X! 	int		incr = 0;
X  	int 		argno = 0, numval;
X  
X  	for (rp = ret ; *cm ; cm++) {
X***************
X*** 241,250 ****
X  		case '%' :
X  			switch(*++cm) {
X  			case '+' :
X! 				if (dp == NULL)
X! 					return("OOPS");
X! 				*rp++ = *dp + *++cm;
X! 				dp = (dp == &destcol) ? &destline : NULL;
X  				break;
X  
X  			case '%' :
X--- 241,249 ----
X  		case '%' :
X  			switch(*++cm) {
X  			case '+' :
X! 				numval = (argno == 0 ? destline : destcol);
X! 				argno = 1 - argno;
X! 				*rp++ = numval + incr + *++cm;
X  				break;
X  
X  			case '%' :
X***************
X*** 252,267 ****
X  				break;
X  
X  			case 'i' :
X- 
X  				incr = 1;
X  				break;
X  
X  			case 'd' :
X  				numval = (argno == 0 ? destline : destcol);
X  				numval += incr;
X! 				argno++;
X  				*rp++ = '0' + (numval/10);
X  				*rp++ = '0' + (numval%10);
X  				break;
X  			}
X  
X--- 251,269 ----
X  				break;
X  
X  			case 'i' :
X  				incr = 1;
X  				break;
X  
X  			case 'd' :
X  				numval = (argno == 0 ? destline : destcol);
X  				numval += incr;
X! 				argno = 1 - argno;
X  				*rp++ = '0' + (numval/10);
X  				*rp++ = '0' + (numval%10);
X+ 				break;
X+ 
X+ 			case 'r' :
X+ 				argno = 1;
X  				break;
X  			}
X  
+ END-OF-FILE termcap.c.cdif
chmod 'u=rw,g=r,o=r' 'termcap.c.cdif'
set `wc -c 'termcap.c.cdif'`
count=$1
case $count in
2104)	:;;
*)	echo 'Bad character count in ''termcap.c.cdif' >&2
		echo 'Count should be 2104' >&2
esac
echo Extracting 'ttyname.c.new'
sed 's/^X//' > 'ttyname.c.new' << '+ END-OF-FILE ''ttyname.c.new'
X/*  ttyname(3)
X */
X
X#include <sys/types.h>
X#include <sys/dir.h>
X#include <sys/stat.h>
X
X#define  NULL 	(char *) 0
X#define  DEV	"/dev/"
X
Xstatic char file_name[40];
X
X
Xchar *ttyname( tty_file_desc )
X  int tty_file_desc;
X
X  {
X  int dev_dir_desc;
X  struct direct dir_entry;
X  struct stat tty_stat;
X  struct stat dev_stat;
X
X  /*  Make sure the supplied file descriptor is for a terminal  */
X
X  if ( fstat(tty_file_desc, &tty_stat) < 0 )
X	return( NULL );
X
X  if ( (tty_stat.st_mode & S_IFMT) != S_IFCHR )
X	return( NULL );
X
X
X  /*  Open /dev for reading  */
X
X  if ( (dev_dir_desc = open(DEV,0)) < 0 )
X	return( NULL );
X
X  while( read(dev_dir_desc, (char *) &dir_entry, sizeof (struct direct)) > 0 )
X	{
X	/*  Find an entry in /dev with the same inode number  */
X
X	if ( tty_stat.st_ino != dir_entry.d_ino )
X		continue;
X
X	/*  Put the name of the device in static storage  */
X
X	strcpy( file_name, DEV );
X	strncat( file_name, dir_entry.d_name, sizeof (dir_entry.d_name) );
X
X	/*  Be absolutely certain the inodes match  */
X
X  	if ( stat(file_name, &dev_stat) < 0 )
X		continue;
X
X  	if ( (dev_stat.st_mode & S_IFMT) != S_IFCHR )
X		continue;
X
X  	if ( tty_stat.st_ino  == dev_stat.st_ino  &&
X	     tty_stat.st_dev  == dev_stat.st_dev  &&
X	     tty_stat.st_rdev == dev_stat.st_rdev )
X		{
X		close( dev_dir_desc );
X		return( file_name );
X		}
X	}
X
X  close( dev_dir_desc );
X  return( NULL );
X  }
+ END-OF-FILE ttyname.c.new
chmod 'u=rw,g=r,o=r' 'ttyname.c.new'
set `wc -c 'ttyname.c.new'`
count=$1
case $count in
1367)	:;;
*)	echo 'Bad character count in ''ttyname.c.new' >&2
		echo 'Count should be 1367' >&2
esac
exit 0