v01i007: xtclient: use a 3b1 as a layers terminal, Part04/04

Merlin J Mathesius merlinm at i88.isc.com
Fri Feb 15 13:28:10 AEST 1991


Submitted-by: merlinm at i88.isc.com (Merlin J Mathesius)
Posting-number: Volume 1, Issue 7
Archive-name: xtclient/part04

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is part 04 of xtclient
# ============= pty/interface.c ==============
if test ! -d 'pty'; then
    echo 'x - creating directory pty'
    mkdir 'pty'
fi
if test -f 'pty/interface.c' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/interface.c (File already exists)'
else
echo 'x - extracting pty/interface.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/interface.c' &&
/*
X *  interface.c - extra system calls interface.
X *
X *  This started life as a file written by Alex Crain.
X *
X */
X
#include "pty.h"
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/user.h>
#include <sys/conf.h>
X
#include "sysent.h"
X
void dosyscall();
X
/* stuff to wake up on */
Xextern int select_sleep;
Xextern nulldev();
Xextern int se_register();
Xextern int ptyopen();
X
int (*old_locsys)();	/* saved value of sysent[SYSL_LOCSYS].sy_call */
int pty_major = 0; /* major number of pty device for use by select */
X
void
ptyinit ()
{
X   int i;
X
X   /*
X    * add our own system call processor.
X    */
X   old_locsys = sysent[SYSL_LOCSYS].sy_call;
X   sysent[SYSL_LOCSYS].sy_call = (int (*)()) dosyscall;
X
X
X   /*
X    * find out where the pty major device is
X    */
X   for(i=0;i<cdevcnt;i++) {
X	if(cdevsw[i].d_open == ptyopen)
X		pty_major = i; /* got it */
X   }
#  ifdef DEBUGA
X   eprintf("ptyinit: pty_major = %d\n", pty_major);
#  endif
X
X   se_linesw_setup();	/* initalize line switch */
X   cdevsw[pty_major].d_ttys = pts_tty;	/* tell gettty where to find us */
X
X   /*
X    * tell other drivers how to register for select service (polling)
X    */
X   ldmisc[SEL_REGISTER] = se_register;
}
X
void
dosyscall()
{
X   int index = u.u_ap[0] - SYSL_FIRST;
X   /*
X    * Intercept our calls
X    */
X
X   if (index >= 0 && index <= (SYSL_LAST - SYSL_FIRST))
X    {
X       /*
X	*  syscall arguments are available via the users %sp, at u.u_ar0[15].
X	*  These arguments must be copied to the argument vector u.u_arg[]
X	*  for access by the kernal. Noting that the stack looks like:
X	*	%sp -> [ frame link, &68, arg1, arg2 ... ]
X	*/
X       int arg = 0;
X       int * ap = (int *) (u.u_ar0[15]) + 2;
X       while (arg < sysentries[index].sy_narg)
X	   u.u_arg[arg++] = fuword(ap++);
X
X       /*
X	*  Perform the call.
X	*/
#	ifdef DEBUGA
X	eprintf("pty.select: calling sysentries[%d].sy_call", index);
#	endif
X       (* sysentries[index].sy_call) ();
X    }
X   else
X       (*old_locsys) ();
}
X
X
int
serelease ()
{
X   int s = spl5();
X
#  ifdef DEBUGA
X      eprintf("pty.select: in serelease\n");
#  endif
X   /* Did we get here without going through our system call interface? */
X   if (sysent[SYSL_LOCSYS].sy_call != old_locsys) {
X      /* check if any other system call drivers were loaded after us but not
X       * unloaded yet.  Drivers which add system calls through SYSL_LOCSYS
X       * must be uninstalled in the oposite order that they are installed
X       */
X      if (sysent[SYSL_LOCSYS].sy_call != (int (*)()) dosyscall) {
X	 u.u_error = EBUSY;	/* order of driver unloads must be wrong! */
X	 return;
X      }
X      sysent[SYSL_LOCSYS].sy_call = old_locsys;
X      ldmisc[SEL_REGISTER] = nulldev;
#     ifdef DEBUG
X         eprintf("pty.select: calling se_linesw_release and setting error\n");
#     endif
X      se_linesw_release();
X      u.u_error = EAGAIN;	/* we can't release our memory yet, since we
X				   still have stuff on the kernel return
X				   stack.  The next call will succeed. */
X   }
X   splx (s);
X   return;
}
SHAR_EOF
chmod 0644 pty/interface.c ||
echo 'restore of pty/interface.c failed'
Wc_c="`wc -c < 'pty/interface.c'`"
test 3028 -eq "$Wc_c" ||
	echo 'pty/interface.c: original size 3028, current size' "$Wc_c"
fi
# ============= pty/linesw.c ==============
if test -f 'pty/linesw.c' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/linesw.c (File already exists)'
else
echo 'x - extracting pty/linesw.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/linesw.c' &&
/*
X * This file contains hooks to intercept tty line input and notify selecting
X * processes to poll for fd's ready to read.
X */
#include	<sys/types.h>
#include	<sys/sysmacros.h>
#include	<sys/conf.h>
#include	<sys/tty.h>
#include	"select.h"
X
int (*real_linesw_l_input)();
X
/* extern int selecting; */
X
se_linesw_l_input(tp)
struct tty *tp;
{
X	/* check for wakeup maybe? */
X
X	if((SELPROC(tp) & 0xffffffL) != 0xffffffL) {
#		ifdef DEBUGA
X		    eprintf("select: linesw: got input wakeing up select\n");
#		endif
X		selwakeup(SELPROC(tp) & 0xffffffL);
X		SELPROC(tp) |= 0xffffffL;
X	}
X	/* call real input routine */
X	(*real_linesw_l_input)(tp);
}
se_linesw_setup()
{
X	/* setup to route tty input to here */
X
X	real_linesw_l_input = linesw[0].l_input;
X	linesw[0].l_input = se_linesw_l_input;
}
se_linesw_release()
{
X	/* setup to route tty back to normal */
X
X	linesw[0].l_input = real_linesw_l_input;
}
SHAR_EOF
chmod 0644 pty/linesw.c ||
echo 'restore of pty/linesw.c failed'
Wc_c="`wc -c < 'pty/linesw.c'`"
test 894 -eq "$Wc_c" ||
	echo 'pty/linesw.c: original size 894, current size' "$Wc_c"
fi
# ============= pty/number-ptys.h ==============
if test -f 'pty/number-ptys.h' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/number-ptys.h (File already exists)'
else
echo 'x - extracting pty/number-ptys.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/number-ptys.h' &&
/* number-ptys.h - Eric H. Herrin II
X *
X * define the number of ptys here so the actual number only has to be in
X * one place.
X * 
X * Version 2.1
X */
#define NUMBER_OF_PTYS 32
SHAR_EOF
chmod 0644 pty/number-ptys.h ||
echo 'restore of pty/number-ptys.h failed'
Wc_c="`wc -c < 'pty/number-ptys.h'`"
test 176 -eq "$Wc_c" ||
	echo 'pty/number-ptys.h: original size 176, current size' "$Wc_c"
fi
# ============= pty/pty.c ==============
if test -f 'pty/pty.c' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/pty.c (File already exists)'
else
echo 'x - extracting pty/pty.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/pty.c' &&
/*
X * pty.c - Berkeley style pseudo tty driver for system V
X *
X * Copyright (c) 1987, Jens-Uwe Mager, FOCUS Computer GmbH
X * Not derived from licensed software.
X *
X * Permission is granted to freely use, copy, modify, and redistribute
X * this software, provided that no attempt is made to gain profit from it,
X * the author is not construed to be liable for any results of using the
X * software, alterations are clearly marked as such, and this notice is
X * not modified.
X */
X
/*
X * Modified for use on the UnixPC by:
X * Eric H. Herrin II
X * University of Kentucky Mathematical Sciences Laboratories
X * eric at ms.uky.edu, eric at ms.uky.csnet, !cbosgd!ukma!eric
X *
X * See README.3b1 for details of port and installation.
X * Version 2.1
X */
X
#include "pty.h"
#include "sys/param.h"
#include "sys/types.h"
#include "sys/sysmacros.h"
#include "sys/systm.h"
#include "sys/file.h"
#include "sys/conf.h"
#include "sys/proc.h"
#include "sys/dir.h"
#include "sys/tty.h"
#include "sys/signal.h"
#include "sys/user.h"
#include "sys/errno.h"
#include "sys/termio.h"
#include "sys/ttold.h"
X
#ifdef SELECT
struct proc *pty_proc[PTYCNT]; /* selecting process for each master */
#endif
X
X
/* The tty structures must be local to this driver.  One doesn't have
X * conf.c
X */
struct tty pts_tty[PTYCNT];
int pts_cnt = PTYCNT;
int ptystate[PTYCNT];
X
ptyopen(dev, flag)
X	register dev_t		dev;
X	register int		flag;
{
X	register struct tty *tp;
X
X	dev = minor(dev);
X	if (Master(dev) == True) {
#		ifdef DEBUG
X		eprintf("open(master): \n");
#		endif
X		dev -= PTYCNT; 
X		tp = &pts_tty[dev];
X		if (dev >= pts_cnt) {
X			u.u_error = ENXIO;
X			return;
X		}
X		/*
X	 	* allow only one controlling process
X	 	*/
X		if (ptystate[dev] & MOPEN) {
X			u.u_error = EBUSY;
X			return;
X		}
X		pty_proc[dev] = (struct proc *) -1L;
X		if (tp->t_state & WOPEN)
X			wakeup((caddr_t)&tp->t_canq);
X		tp->t_state |= CARR_ON;
X		ptystate[dev] |= MOPEN;
#ifdef SELECT
X		ptystate[dev] &= ~(SCLOSED);
#endif
X	} else {
#		ifdef DEBUG
X		eprintf("open(slave): \n");
#		endif
X		tp = &pts_tty[dev];
X		if (dev >= pts_cnt) {
X			u.u_error = ENXIO;
X			return;
X		}
X		if ((tp->t_state & (ISOPEN|WOPEN)) == 0) {
X			ttinit(tp);
X			tp->t_proc = ptsproc;
X		}
X		/*
X	  	 * if master is still open, don't wait for carrier
X	 	 */
X		if (ptystate[dev] & MOPEN)
X			tp->t_state |= CARR_ON;
X		if (!(flag & FNDELAY)) {
X			while ((tp->t_state & CARR_ON) == 0) {
X				tp->t_state |= WOPEN;
X				sleep((caddr_t)&tp->t_canq, TTIPRI);
X			}
X		}
X		(*linesw[tp->t_line].l_open)(tp);
X	}
}
X
ptyclose(dev, flag)
X	register dev_t		dev;
X	register int		flag;
{
X        register struct tty     *tp;
X
X	dev = minor(dev);
X	if (Master(dev) == True) {
#		ifdef DEBUG
X		eprintf("close(master): \n");
#		endif
X		dev -= PTYCNT;
X		tp = &pts_tty[dev];
X		if (tp->t_state & ISOPEN) {
X			signal(tp->t_pgrp, SIGHUP);
X			ttyflush(tp, FREAD|FWRITE);
X		}
X		else {	/* must get rid of buffered output */
X			while (tp->t_tbuf.c_count) {
#			    ifdef DEBUG
X				eprintf("c_count = %d\n", tp->t_tbuf.c_count);
#			    endif
X				ptsproc(tp, T_WFLUSH); 	/* side effects? */
X			}
X		}
X		/*
X	 	 * virtual carrier gone
X	 	 */
X		tp->t_state &= ~(CARR_ON);
X		ptystate[dev] &= ~MOPEN;
X	} else {
#		ifdef DEBUG
X		eprintf("close(slave): \n");
#		endif
X		tp = &pts_tty[dev];
X		(*linesw[tp->t_line].l_close)(tp);
X		tp->t_state &= ~CARR_ON;
#		ifdef SELECT
X		ptystate[dev] |= SCLOSED;
X		{
X		  int indx = tp - pts_tty;
X		  /*
X		   * We just closed the slave device.  The master won't block
X		   * on a read.  Now Wake up any processes which might be
X		   * selecting so it can poll again.
X		   */
X		  if (indx >= 0 && indx < PTYCNT
X		    && pty_proc[indx] != (struct proc *) -1L) {
X			selwakeup(pty_proc[indx]);
X			pty_proc[indx] = (struct proc *) -1L;
X		  }
X		}
#		endif
X
X	}
}
X
ptyread(dev)
X        register dev_t		dev;
{
X	register struct tty     *tp;
X	register                n;
X
X	dev = minor(dev);
X	if (Master(dev) == True) {
#		ifdef DEBUG
X		eprintf("read(master): \n");
#		endif
X		dev -= PTYCNT;		
X                tp = &pts_tty[dev];
X
X		/* added fix for hanging master side when the slave hangs
X		 * up too early.  Fix by Michael Bloom (mb at ttidca.tti.com).
X		 */
/*		if ((tp->t_state & (ISOPEN|TTIOW)) == 0) { */
X		if (ptystate[dev] & SCLOSED) {
X			u.u_error = EIO;
X			return;
X		}
X		while (u.u_count > 0) {
X			ptsproc(tp, T_OUTPUT);
X			if ((tp->t_state & (TTSTOP|TIMEOUT))
X			    || tp->t_tbuf.c_ptr == NULL || tp->t_tbuf.c_count == 0) {
X				if (u.u_fmode & FNDELAY)
X					break;
#				ifdef DEBUG
X				eprintf("read(master): master going to sleep\n");
#				endif
X				ptystate[dev] |= MRWAIT;
X				sleep((caddr_t)&tp->t_rloc, TTIPRI);
#				ifdef DEBUG
X				eprintf("read(master): master woke up\n");
#				endif
X
X				continue;
X			}
X			n = min(u.u_count, tp->t_tbuf.c_count);
X			if (n) {
#				ifdef DEBUG
X				eprintf("read(master): got some stuff\n");
#				endif
X				if (copyout(tp->t_tbuf.c_ptr, u.u_base, n)) {
X					u.u_error = EFAULT;
X					break;
X				}
X				tp->t_tbuf.c_count -= n;
X				tp->t_tbuf.c_ptr += n;
X				u.u_base += n;
X				u.u_count -= n;
X			}
X		}
X		/* wakeup slave write if required */
X		ptsproc(tp, T_OUTPUT);
X	} else {
#		ifdef DEBUG
X		eprintf("read(slave): \n");
#		endif
X		tp = &pts_tty[dev];
#		ifdef DEBUG
X		eprintf("read(slave): got some stuff\n");
#		endif
X		(*linesw[tp->t_line].l_read)(tp);
X	}
}
X	
ptywrite(dev)
X	register dev_t		dev;
{
X	register struct tty     *tp;
X	register                n;
X
X	dev = minor(dev);
X	if (Master(dev) == True) {
#		ifdef DEBUG
X		eprintf("write(master): \n");
#		endif
X		dev -= PTYCNT;
X		tp = &pts_tty[dev];
X		
X		if ((tp->t_state & ISOPEN) == 0) {
X			u.u_error = EIO;
X			return;
X		}
X		while (u.u_count > 0) {
X			if ((tp->t_state & TBLOCK) || tp->t_rbuf.c_ptr == NULL) {
X				if (u.u_fmode & FNDELAY)
X					break;
X				ptystate[dev] |= MWWAIT;
#				ifdef DEBUG
X				eprintf("write(master): going to sleep\n");
#				endif
X
X				sleep((caddr_t)&tp->t_wloc, TTOPRI);
X
#				ifdef DEBUG
X				eprintf("write: waking up\n");
#				endif
X
X				continue;
X			}
X			n = min(u.u_count, tp->t_rbuf.c_count);
X			if (n) {
#				ifdef DEBUG
X				eprintf("write(master): sending some stuff\n");
#				endif
X				if (copyin(u.u_base,tp->t_rbuf.c_ptr, n)) {
X					u.u_error = EFAULT;
X					break;
X				}
X				if (tp->t_iflag & IXON) {
X				    /* check for flow control */
X				    register char c;
X				    register int i;
X				    for (i = 0; i < n; i++) {
X					c = tp->t_rbuf.c_ptr[i];
X					if (tp->t_state & TTSTOP)
X					{
X					    if ((c == CSTART)
X						|| (tp->t_iflag & IXANY) ) {
X						(*tp->t_proc)(tp, T_RESUME);
X					    }
X					}
X					else
X					{
X					    if (c==CSTOP) {
X						(*tp->t_proc)(tp, T_SUSPEND);
X					    }
X					}
X					if (c==CSTART || c==CSTOP) {
X					    /* through away this char and proc
X						remaining on next while loop*/
X					    n = i;
X					    u.u_count -= 1;
X					    if (u.u_count == 0) {
X						return;
X					    }
X					    break;	/* exit for loop */
X					}
X				    }
X				}
X
X				tp->t_rbuf.c_count -= n;
X				u.u_base += n;
X				u.u_count -= n;
X			}
X			(*linesw[tp->t_line].l_input)(tp);
X		}
X	} else {
#		ifdef DEBUG
X		eprintf("write(slave): \n");
#		endif
X		tp = &pts_tty[dev];
#		ifdef DEBUG
X		eprintf("write(slave): sending some stuff\n");
#		endif
X		(*linesw[tp->t_line].l_write)(tp);
X	}
}
X
ptyioctl(dev, cmd, arg, mode)
X	dev_t		dev;
X	int		cmd, arg, mode;
{
X	register struct tty *tp;
X
X	dev = minor(dev);
X	if (Master(dev) == True) {
#		ifdef DEBUG
X		eprintf("ioctl(master): \n");
#		endif
X		dev -= PTYCNT;
X		tp = &pts_tty[dev];
X		/*
X	 	 * sorry, but we can't fiddle with the tty struct without
X	 	 * having done LDOPEN
X	 	 */
X		if (tp->t_state & ISOPEN) {
X			if (cmd == TCSBRK && arg ==  NULL) {
X				signal(tp->t_pgrp, SIGINT);
X				if ((tp->t_iflag & NOFLSH) == 0)
X					ttyflush(tp, FREAD|FWRITE);
X			} else {
X				/*
X			 	 * we must flush output to avoid hang in ttywait
X			 	 */
X				if (cmd == TCSETAW || cmd == TCSETAF || 
X				   cmd == TCSBRK || cmd == TIOCSETP)
X					ttyflush(tp, FWRITE);
X				ttiocom(tp, cmd, arg, mode);
X			}
X		}
X	} else {
#		ifdef DEBUG
X		eprintf("ioctl(slave): \n");
#		endif
X		tp = &pts_tty[dev];
X		ttiocom(tp, cmd, arg, mode);
X	}
}
X
ptsproc(tp, cmd)
register struct tty *tp;
{
X	register struct ccblock *tbuf;
X	extern ttrstrt();
X
X	switch (cmd) {
X	case T_TIME:
#		ifdef DEBUG
X		eprintf("ptsproc: T_TIME:\n");
#		endif
X		tp->t_state &= ~TIMEOUT;
X		goto start;
X	case T_WFLUSH:
#		ifdef DEBUG
X		eprintf("ptsproc: T_WFLUSH:\n");
#		endif
X		tp->t_tbuf.c_size  -= tp->t_tbuf.c_count;
X		tp->t_tbuf.c_count = 0;
X		/* fall through */
X	case T_RESUME:
#		ifdef DEBUG
X		eprintf("ptsproc: T_RESUME:\n");
#		endif
X		tp->t_state &= ~TTSTOP;
X		/* fall through */
X	case T_OUTPUT:
start:
#		ifdef DEBUG
X		eprintf("ptsproc: T_OUTPUT:\n");
#		endif
X		if (tp->t_state & (TTSTOP|TIMEOUT))
X			break;
#		ifdef DEBUG
X		eprintf("ptsproc: T_OUTPUT: past(TTSTOP|TIMEOUT)");
#		endif
X		tbuf = &tp->t_tbuf;
X		if (tbuf->c_ptr == NULL || tbuf->c_count == 0) {
#		ifdef DEBUG
X		eprintf("ptsproc: T_OUTPUT: tbuf empty, may break\n");
#		endif
X			if (tbuf->c_ptr)
X				tbuf->c_ptr -= tbuf->c_size;
X			if (!(CPRES & (*linesw[tp->t_line].l_output)(tp)))
X				break;
X		}
#		ifdef SELECT
X		{
X		  int indx = tp - pts_tty;
X		  /*
X		   * We just got some stuff that the master device might want
X		   * to read.  Now Wake up any processes which might be
X		   * selecting so it can poll again.
X		   */
X		  if (indx >= 0 && indx < PTYCNT
X		    && pty_proc[indx] != (struct proc *) -1L) {
X			selwakeup(pty_proc[indx]);
X			pty_proc[indx] = (struct proc *) -1L;
X		  }
X		}
#		endif
X		if (tbuf->c_count && (ptystate[tp-pts_tty] & MRWAIT)) {
#		ifdef DEBUG
X		eprintf("ptsproc: T_OUTPUT: waking up master\n");
#		endif
X			ptystate[tp-pts_tty] &= ~MRWAIT;
X			wakeup((caddr_t)&tp->t_rloc);
X		}
#		ifdef DEBUG
X		eprintf("ptsproc: T_OUTPUT: leaving end\n");
#		endif
X		break;
X	case T_SUSPEND:
#		ifdef DEBUG
X		eprintf("ptsproc: T_SUSPEND:\n");
#		endif
X		tp->t_state |= TTSTOP;
X		break;
X	case T_BLOCK:
#		ifdef DEBUG
X		eprintf("ptsproc: T_BLOCK:\n");
#		endif
X		/*
X		 * the check for ICANON appears to be neccessary
X		 * to avoid a hang when overflowing input
X		 */
X		if ((tp->t_iflag & ICANON) == 0)
X			tp->t_state |= TBLOCK;
X		break;
X	case T_BREAK:
#		ifdef DEBUG
X		eprintf("ptsproc: T_BREAK:\n");
#		endif
X		tp->t_state |= TIMEOUT;
X		timeout(ttrstrt, tp, HZ/4);
X		break;
#ifdef T_LOG_FLUSH
X	case T_LOG_FLUSH:
#endif
X	case T_RFLUSH:
#		ifdef DEBUG
X		eprintf("ptsproc: T_RFLUSH:\n");
#		endif
X		if (!(tp->t_state & TBLOCK))
X			break;
X		/* fall through */
X	case T_UNBLOCK:
#		ifdef DEBUG
X		eprintf("ptsproc: T_UNBLOCK:\n");
#		endif
X		tp->t_state &= ~(TTXOFF|TBLOCK);
X		/* fall through */
X	case T_INPUT:
#		ifdef DEBUG
X		eprintf("ptsproc: T_INPUT:\n");
#		endif
X		if (ptystate[tp-pts_tty] & MWWAIT) {
X			ptystate[tp-pts_tty] &= ~MWWAIT;
#			ifdef DEBUG
X			eprintf("ptsproc: T_INPUT: waking up master\n");
#			endif
X			wakeup((caddr_t)&tp->t_wloc);
X		}
X		break;
X	default:
#		ifdef DEBUG
X		eprintf("ptsproc: default:\n");
#		else
X		;
#		endif
X	}
}
X	
/* This routine used to be a stub, however, an industrious soul found
X * the release routine caused a panic whenever the driver is released
X * and some ptys are still open.  The simple 'for' loop fixes this 
X * problem.
X *
X * Credit should be given to:
X * Mike "Ford" Ditto
X * kenobi!ford at crash.CTS.COM, ...!crash!kenobi!ford
X * for finding the bug and writing the for loop.
X *
X * [Eric H. Herrin II, 10-7-87]
X */
ptyrelease()
{
X	register int 	i;
X
#	ifdef DEBUG
X	eprintf("ptyrelease:\n");
#	endif
X	for (i=0; i<PTYCNT; i++)
X		if ((ptystate[i] & (ISOPEN|MOPEN)) || 
X                   (pts_tty[i].t_state & WOPEN)) {
X			u.u_error = EBUSY;
X			return;
X		}
#	ifdef SELECT
X	serelease();
#	endif
X	return;
}
SHAR_EOF
chmod 0644 pty/pty.c ||
echo 'restore of pty/pty.c failed'
Wc_c="`wc -c < 'pty/pty.c'`"
test 11612 -eq "$Wc_c" ||
	echo 'pty/pty.c: original size 11612, current size' "$Wc_c"
fi
# ============= pty/pty.h ==============
if test -f 'pty/pty.h' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/pty.h (File already exists)'
else
echo 'x - extracting pty/pty.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/pty.h' &&
/* pty.h - Eric H. Herrin II (eric at ms.uky.edu)
X * 
X * some elementary definitions for the pty driver (UnixPC version)
X *
X * Version 2.1
X */
X
/*
X * the following are arbitrary 3 unused bits from t_state
X * in sys/tty.h
X */
/* The UnixPC does not have any extra bits in t_state, thus
X * one must provide other means of storing the state.
X */
#define MRWAIT	01	/* master waiting in read */
#define t_rloc	t_cc[0]		/* wchannel */
#define MWWAIT	02	/* master waiting in write */
#define t_wloc	t_cc[1]		/* wchannel */
#define MOPEN	04	/* master is open */
#ifdef SELECT
#define SCLOSED 010	/* slave was opened and closed */
X			/* cleared in master open, set in slave close */
#endif
X
int ptsproc();
Xextern struct tty pts_tty[];
X
#define True  (1 == 1)
#define False (0 == 1)
X
/*  This is the total number of ptys.  Note the maximum number here is
X *  currently 64 for the UnixPC (128 minor devices/2 minor devices per pty
X *  yields 64 total ptys).  I really don't see the need for more than 32
X *  on the 3B1, however, if someone does, then (s)he can change it.
X */
#include "number-ptys.h"
#define PTYCNT (dev_t)NUMBER_OF_PTYS
X
/* some definitions to include kernel info from system header files.
X */
#define KERNEL 1
#define defined_io 1
/* #define NOSTREAMS 1 Seems that this was not defined in 3.51 */
X
#define UNIXPC 1
X
/* This macro returns True if the parameter is a master minor device number,
X * False otherwise.
X */
#define Master( dev )	(minor(dev) >= PTYCNT)
X
/* Index in ldmisc to use for pointer to se_register
X * se_register(poll_routine, maj_dev) is how other drivers tell us the
X * address of their select polling routine.
X */
#define SEL_REGISTER	(LDMISCSLOTS - 1)
X
/* This is the maximum major device number which can be used above */
#define NUM_SEL_DRIVERS	32
SHAR_EOF
chmod 0644 pty/pty.h ||
echo 'restore of pty/pty.h failed'
Wc_c="`wc -c < 'pty/pty.h'`"
test 1777 -eq "$Wc_c" ||
	echo 'pty/pty.h: original size 1777, current size' "$Wc_c"
fi
# ============= pty/select.c ==============
if test -f 'pty/select.c' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/select.c (File already exists)'
else
echo 'x - extracting pty/select.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/select.c' &&
/*
X *  syscalls.c - system call kernal interface routines.
X *
X *  Written by Alex Crain.
X *  Extensivly hacked by Brad Bosch.
X *
X *  I don't think there is anything left here to which this applies, but...
X *
X *  This file is based in the Berkeley file uipc_syscalls.c,
X *  but is *not* guarenteed to be in any way compatable. It is
X *  close enough to the Berkeley code that the following applies...
X *
X *  Copyright (c) 1982, 1986, 1988 Regents of the University of California.
X *  All rights reserved.
X * 
X *  Redistribution and use in source and binary forms are permitted
X *  provided that this notice is preserved and that due credit is given
X *  to the University of California at Berkeley. The name of the University
X *  may not be used to endorse or promote products derived from this
X *  software without specific prior written permission. This software
X *  is provided "as is" without express or implied warranty.
X *
X */
X
X
#include "pty.h"
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/user.h>
#include <sys/file.h>
#include <sys/buf.h>
#include <sys/errno.h>
#include <sys/systm.h>
#include <sys/tty.h>
#include <sys/conf.h>
#include <sys/var.h>
#include "select.h"
X
void unselect();
X
Xextern int pty_major;	/* we will need this in the select loop */
Xextern int ptystate[];	/* needed to test for slave closed */
Xextern struct proc *pty_proc[]; /* selecting process for each master */
X
X
/* This returns a pointer to the tty structure for a device number.
X * Returns NULL if unknown or error.  This works for tty*, console, and ttyp*.
X * extern struct tty * gettty();
X * The above didn't work for ph*.  Have to write our own.  See below.
X */
X
/* we now sleep on ldmisc[SEL_REGISTER] since this is known to other drivers*/
X
#ifdef NO_LONGER_NEEDED
int	so_win_major = 0; /* major device of window */
unsigned int so_win_tty = 0; /* address of wintty */
#endif /*NO_LONGER_NEEDED*/
X
/* Table of driver's select poll entry points indexed by major number */
static int (*poll_table[NUM_SEL_DRIVERS])();
X
X
/* This routine is no longer needed (Yea!) */
sesetup() /* setup variables */
{
#ifdef NO_LONGER_NEEDED
X   register struct a {
X	int w_major;
X	unsigned int w_tty;
X   } * uap = (struct a *) u.u_ap;
X
X   if (suser()) {	/* must be root to set this stuff */
X      so_win_major = uap->w_major;
X      so_win_tty = uap->w_tty;
X   }
X   else
X       u.u_error = EPERM;
#endif /*NO_LONGER_NEEDED*/
}
X
Xextern struct tty *pser_tty[];
X
/* replacement gettty for broken one in kernel */
struct tty * gettty(dev)
dev_t dev;
{
X    register int maj, min;
X
X    maj = major(dev);
X    if (maj >= cdevcnt)
X	return(NULL);
X    min = minor(dev);
X    switch (maj)
X    {
X	case 0:	/* tty000 */	/* these are hardcoded in kernel too! */
X	    return (pser_tty[min]);
X	case 8:	/* ph* */
X	    return (pser_tty[1]);
X	case 7:	/* win* */
X	    if (min < 12)
X		return (&(cdevsw[maj].d_ttys)[min-1]);
X	    else
X		return (NULL);
X	default:	/* other normal cases */
X	    return (&(cdevsw[maj].d_ttys)[min]);
X    }
}
X
void selwakeup();	/* forward reference comming */
X
/*
X * This is called by other drivers to register their select routine with us.
X * We return the address of the routine which the driver should call when i/o
X * may be possible on a device which is under selection.  The driver should
X * save this address for later use.  The address of se_register is stored in
X * ldmisc[SEL_REGISTER] for reference by other drivers.
X */
void (*se_register (poll_routine, maj_dev))()
int (*poll_routine)();
int maj_dev;
{
#	ifdef DEBUG
X		eprintf("se_register: maj_dev=%d, poll_routine=%x\n",
X			maj_dev, poll_routine);
#	endif
X	if (maj_dev < NUM_SEL_DRIVERS)
X		poll_table[maj_dev] = poll_routine;
X	return(selwakeup);
}
X
seselect ()
{
X   register struct a {
X      int	nfds;
X      int	*readfds;
X      int	*writefds;
X      int	*execptfds;
X      struct timeval *timeout;
X   } * uap = (struct a *) u.u_ap;
X   int mask, cnt, tim, timout, rds;
X   int i, j, k, l, s;
X   dev_t rdev;
X   struct timeval utimeout;
X   struct file *fp;
X   struct inode *ip;
X   struct tty *tp;
X   struct socket *so;
X
/*
X * If timeout specified, convert time to hz and set timer.
X */
/*   select_timed_out = 0; */
X   u.u_procp->p_flag &= ~STIMO;
X   tim = -1;
X   if ( uap->timeout ) {
X	if (copyin(uap->timeout, &utimeout, sizeof(utimeout))) {
X	    u.u_error = EINVAL;
X	    return;
X	}
X	tim = utimeout.tv_sec * HZ + utimeout.tv_usec * 6/100000;
#	ifdef DEBUG
X	   eprintf("select: timeout set to %d\n", tim);
#	endif
X	if (tim)
X	    timout = timeout(unselect, u.u_procp, tim);
X   }
X   if (uap->nfds > 32) uap->nfds = 32;
X
#   ifdef DEBUG
X       eprintf("select: rds=%x  nfds=%d\n", *uap->readfds, uap->nfds);
#   endif
X
poll:
X   u.u_procp->p_flag |= SSEL;
X   cnt = 0;
X   if(uap->readfds) { /* have readbitmask */
X      rds = fuword(uap->readfds);
X
X      for(i=0;i < uap->nfds; i++) {
X	u.u_error = 0; /* reset it */
X	mask = 1 << i;
X	if(rds & mask) { /* is this one? */
#		ifdef DEBUGA
X		    eprintf("select: mask=%d getf=%d ofile=%d, i=%d\n", mask,
X			getf(i), u.u_ofile[i], i);
#		endif
X		if((fp = getf(i)) != 0) { /* valid open file */
X			ip = fp->f_inode;
X			rdev = (dev_t) ip->i_rdev;
#		    ifdef DEBUG
X			eprintf("select: fd=%d  dev id=%x  tp=%x\n",
X			    i, rdev, gettty(rdev));
#		    endif
X			if(major(rdev) == pty_major && Master(rdev) == True) {
X				/* got a master pty file descriptor */
X				/* get slot in tty table */
X				k = minor(rdev) - PTYCNT;
X				tp = &pts_tty[k]; /* ok */
#				ifdef DEBUGB
X				    eprintf("select: mstr min=%d cnt=%d,%d\n",
X				    k, tp->t_tbuf.c_count, tp->t_outq.c_cc);
#				endif
X				/* check buffers */
X				if((tp->t_outq.c_cc || tp->t_tbuf.c_count) &&
X				    !(tp->t_state & TTSTOP)
X				    || ptystate[k] & SCLOSED) {
X					/* ok to read */
X					cnt++;
X				} else {
X					short s=spl7();	/* protect pty_proc */
X					if (pty_proc[k])
X					  if (pty_proc[k]!=(struct proc *) -1L
X					    && pty_proc[k]->p_wchan
X					    == (caddr_t) se_register)
X						pty_proc[k] = NULL;
X					  else
X						pty_proc[k] = u.u_procp;
X					rds &= ~mask;
X					splx(s);
X				}
X			}
X			else if((tp = gettty(rdev)) != NULL) {
X				/* got a tty file descriptor */
X
X				/* check buffers */
#				ifdef DEBUGA
X				    eprintf("select: tty rdev=%x cnt=%d,%d\n",
X				      rdev, tp->t_rawq.c_cc, tp->t_canq.c_cc);
#				endif
X				if(tp->t_rawq.c_cc || tp->t_canq.c_cc ||
X				    !(tp->t_state & CARR_ON))
X				    cnt++;
X				else {
X				  short s=spl7();	/* protect SELPROC */
X				  rds &= ~mask;
X				  if (SELPROC(tp) & 0xffffffL)
X				    if ((SELPROC(tp) & 0xffffffL) != 0xffffffL
X				      && ((struct proc *)SELPROC(tp))->p_wchan
X				      == (caddr_t) ldmisc[SEL_REGISTER]) 
X					SELPROC(tp) &= 0xff000000L; /*clear*/
X				    else	/* no collision */
X					SELPROC(tp) = (long) u.u_procp |
X						((SELPROC(tp) & 0xff000000L));
X				    splx(s);
X				}
X			}
#ifdef NOT_WORKING /* this can't possibly work! */
X			/* here we have pipes */
X			else if(ip->i_mode & IFIFO) {
X				/* if i_count == 1 no opens left
X				 * we notify select of this
X				 */
X				if (ip->i_count == 1) 
X					cnt++;
X				else if (ip->i_fwptr) 
X					cnt++;
X				else
X					rds &= ~mask;
X			}
#endif /*NOT_WORKING*/
X			/* else check to see if a driver has registerd itself
X			 * to provide select for this major number */
X			else if (poll_table[major(rdev)]!=NULL) {
X			    if (!poll_table[major(rdev)](fp,FREAD))
X				rds &= ~mask;
X			    else
X				cnt++;
X			} else {
X			    /* Don't know about this device */
X			    rds &= ~mask;
X			}
X		} else {/* invalid fd */
X			/* should set u.u_error here */
X			rds &= ~mask;
X		}
X	}
X
X      }
X   }
X
X   s = spl7();	/* begin critical section */
X
X   if(cnt || u.u_procp->p_flag & STIMO || ! tim) {
X	   u.u_rval1 = cnt;
X	   if (uap->readfds)
X		suword(uap->readfds, rds);	/* copy rds back to user*/
X	   if ( uap->timeout )
X		untimeout(timout);
X	   splx(s);
X	   return;
X   }
X
X	
X   if (! (u.u_procp->p_flag & SSEL)) {
X      splx(s);
X      goto poll;	/* poll again if we had i/o while polling */
X   }
X
X   /* sleep until timeout or device activity */
#  ifdef DEBUG
X      eprintf("select: going to sleep\n");
#  endif
X   sleep( (caddr_t) ldmisc[SEL_REGISTER], PZERO+1 );
X
X   splx(s);	/* end critical section */
X
X   /* check for activity while we were asleep */
X   goto poll;	/* poll again */
}
X
/* unselect is called when the select timer expires */
void unselect(p)
X   register struct proc *p;
{
#   ifdef DEBUGA
X       eprintf("select: timed out\n");
#   endif
X   /* set select_timed_out process flag*/
X   p->p_flag |= STIMO;
X   selwakeup(p);
}
X
/* Call with p = NULL if collision */
void selwakeup(p)
X   register struct proc *p;
{
X   int s = spl7();
X
X   if (p) {
X	if (p->p_wchan == (caddr_t) ldmisc[SEL_REGISTER]) {
#	   ifdef DEBUG
X	       eprintf("select: in selwakeup p->p_stat = %x\n", p->p_stat);
#	   endif
X	    if (p->p_stat == SSLEEP)
X		setrun(p);
X	    else
X		unsleep(p);
X	}
X	else if (p->p_flag & SSEL)
X	    p->p_flag &= ~SSEL;	/* clear selecting flag for this process */
X   }
X   else {
X	register struct proc *procp;
X	register int i;
#	ifdef DEBUGD
X	    eprintf("select: calling wakeup\n");
#	endif
X	/* collision, clear all selecting flags */
X	procp = proc;
X	for (i = 1; i < v.v_proc; i++, procp ++)
X		procp->p_flag &= ~SSEL;
X	wakeup((caddr_t) ldmisc[SEL_REGISTER]);
X   }
X   splx(s);
}
SHAR_EOF
chmod 0644 pty/select.c ||
echo 'restore of pty/select.c failed'
Wc_c="`wc -c < 'pty/select.c'`"
test 9262 -eq "$Wc_c" ||
	echo 'pty/select.c: original size 9262, current size' "$Wc_c"
fi
# ============= pty/select.h ==============
if test -f 'pty/select.h' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/select.h (File already exists)'
else
echo 'x - extracting pty/select.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/select.h' &&
struct timeval {
X	long	tv_sec;		/* seconds */
X	long	tv_usec;	/* and microseconds */
};
X
/*
X * Operations on timevals.
X *
X * NB: timercmp does not work for >= or <=.
X */
#define	timerisset(tvp)		((tvp)->tv_sec || (tvp)->tv_usec)
#define	timercmp(tvp, uvp, cmp)	\
X	((tvp)->tv_sec cmp (uvp)->tv_sec || \
X	 (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
#define	timerclear(tvp)		(tvp)->tv_sec = (tvp)->tv_usec = 0
X
/* extra masks for p_flag in proc struct */
#define	SSEL	0x400000	/* This process is selecting */
/* #define SELPROC(tp) (*((struct proc **) (& tp->spacer[0]))) */
#define SELPROC(tp) (*((long *) (& tp->spacer[0])))
X
#define select(nfds, reads, writes, excepts, tmout) \
X	syslocal(32, nfds, reads, writes, excepts, tmout)
SHAR_EOF
chmod 0644 pty/select.h ||
echo 'restore of pty/select.h failed'
Wc_c="`wc -c < 'pty/select.h'`"
test 755 -eq "$Wc_c" ||
	echo 'pty/select.h: original size 755, current size' "$Wc_c"
fi
# ============= pty/sysent.h ==============
if test -f 'pty/sysent.h' -a X"$1" != X"-c"; then
	echo 'x - skipping pty/sysent.h (File already exists)'
else
echo 'x - extracting pty/sysent.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pty/sysent.h' &&
/*
X *  sysent.h - system call entry definitions.
X *
X */
X
Xextern seselect();
Xextern sesetup();
X
/* our extra system call table */
struct sysent sysentries[] = {
X
{5,seselect},	/* SYSL_FIRST */
{2,sesetup},	/* SYSL_LAST */
X
};
X
#define SYSL_LOCSYS	68
X
/* Note: it would have been safer to use numbers farther away from the used
X * syslocal numbers, but/because changing them requires recompiling all user
X * code which uses them.
X */
#define SYSL_FIRST	32	/* 18 is the last used syslocal */
#define SYSL_LAST	33
SHAR_EOF
chmod 0644 pty/sysent.h ||
echo 'restore of pty/sysent.h failed'
Wc_c="`wc -c < 'pty/sysent.h'`"
test 510 -eq "$Wc_c" ||
	echo 'pty/sysent.h: original size 510, current size' "$Wc_c"
fi
# ============= font/Makefile ==============
if test ! -d 'font'; then
    echo 'x - creating directory font'
    mkdir 'font'
fi
if test -f 'font/Makefile' -a X"$1" != X"-c"; then
	echo 'x - skipping font/Makefile (File already exists)'
else
echo 'x - extracting font/Makefile (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'font/Makefile' &&
default: xtclient.f
X
xtclient.f: xtclient.ft
X	-cfont xtclient.ft > xtclient.f
SHAR_EOF
chmod 0644 font/Makefile ||
echo 'restore of font/Makefile failed'
Wc_c="`wc -c < 'font/Makefile'`"
test 78 -eq "$Wc_c" ||
	echo 'font/Makefile: original size 78, current size' "$Wc_c"
fi
# ============= font/xtclient.ft ==============
if test -f 'font/xtclient.ft' -a X"$1" != X"-c"; then
	echo 'x - skipping font/xtclient.ft (File already exists)'
else
echo 'x - extracting font/xtclient.ft (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'font/xtclient.ft' &&
# magic 0x18e
# flags 0x0
hs    5
vs    9
basel 9
X
############### Character 0x20, 040, 32                      
char 32
hs   4
vs   9
ha   0
va   -9
hi   5
vi   0
bits     
bits     
bits     
bits     
bits     
bits     
bits     
bits     
bits     
X
############### Character 0x21, 041, 33   ! ! ! ! ! ! ! ! ! !
char 33
hs   1
vs   7
ha   3
va   -8
hi   5
vi   0
bits *
bits *
bits *
bits *
bits *
bits  
bits *
X
############### Character 0x22, 042, 34   " " " " " " " " " "
char 34
hs   3
vs   3
ha   2
va   -8
hi   5
vi   0
bits * *
bits * *
bits * *
X
############### Character 0x23, 043, 35   # # # # # # # # # #
char 35
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits  ** 
bits ****
bits  ** 
bits ****
bits  ** 
bits  ** 
X
############### Character 0x24, 044, 36   $ $ $ $ $ $ $ $ $ $
char 36
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits   * 
bits  ***
bits *   
bits  ** 
bits    *
bits *** 
bits   * 
X
############### Character 0x25, 045, 37   % % % % % % % % % %
char 37
hs   4
vs   6
ha   1
va   -8
hi   5
vi   0
bits **  
bits ** *
bits   * 
bits  *  
bits * **
bits   **
X
############### Character 0x26, 046, 38   & & & & & & & & & &
char 38
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits  ** 
bits  *  
bits *  *
bits * * 
bits ** *
X
############### Character 0x27, 047, 39   ' ' ' ' ' ' ' ' ' '
char 39
hs   2
vs   3
ha   2
va   -8
hi   5
vi   0
bits **
bits  *
bits * 
X
############### Character 0x28, 050, 40   ( ( ( ( ( ( ( ( ( (
char 40
hs   4
vs   7
ha   2
va   -8
hi   5
vi   0
bits   * 
bits  *  
bits *   
bits *   
bits *   
bits  *  
bits   * 
X
############### Character 0x29, 051, 41   ) ) ) ) ) ) ) ) ) )
char 41
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  *  
bits   * 
bits    *
bits    *
bits    *
bits   * 
bits  *  
X
############### Character 0x2a, 052, 42   * * * * * * * * * *
char 42
hs   4
vs   5
ha   1
va   -8
hi   5
vi   0
bits *  *
bits  ** 
bits ****
bits  ** 
bits *  *
X
############### Character 0x2b, 053, 43   + + + + + + + + + +
char 43
hs   3
vs   3
ha   2
va   -6
hi   5
vi   0
bits  * 
bits ***
bits  * 
X
############### Character 0x2c, 054, 44   , , , , , , , , , ,
char 44
hs   2
vs   3
ha   3
va   -3
hi   5
vi   0
bits **
bits  *
bits * 
X
############### Character 0x2d, 055, 45   - - - - - - - - - -
char 45
hs   4
vs   1
ha   1
va   -5
hi   5
vi   0
bits ****
X
############### Character 0x2e, 056, 46   . . . . . . . . . .
char 46
hs   2
vs   1
ha   2
va   -2
hi   5
vi   0
bits **
X
############### Character 0x2f, 057, 47   / / / / / / / / / /
char 47
hs   4
vs   6
ha   1
va   -7
hi   5
vi   0
bits    *
bits   * 
bits   * 
bits  *  
bits  *  
bits *   
X
############### Character 0x30, 060, 48   0 0 0 0 0 0 0 0 0 0
char 48
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits * **
bits ** *
bits *  *
bits *  *
bits  ** 
X
############### Character 0x31, 061, 49   1 1 1 1 1 1 1 1 1 1
char 49
hs   3
vs   7
ha   2
va   -8
hi   5
vi   0
bits  * 
bits ** 
bits  * 
bits  * 
bits  * 
bits  * 
bits ***
X
############### Character 0x32, 062, 50   2 2 2 2 2 2 2 2 2 2
char 50
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits    *
bits   * 
bits  *  
bits *   
bits ****
X
############### Character 0x33, 063, 51   3 3 3 3 3 3 3 3 3 3
char 51
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits ****
bits   * 
bits  *  
bits   * 
bits    *
bits *  *
bits  ** 
X
############### Character 0x34, 064, 52   4 4 4 4 4 4 4 4 4 4
char 52
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *   
bits *   
bits *  *
bits *  *
bits ****
bits    *
bits    *
X
############### Character 0x35, 065, 53   5 5 5 5 5 5 5 5 5 5
char 53
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits ****
bits *   
bits *** 
bits    *
bits    *
bits    *
bits *** 
X
############### Character 0x36, 066, 54   6 6 6 6 6 6 6 6 6 6
char 54
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *   
bits *** 
bits *  *
bits *  *
bits  ** 
X
############### Character 0x37, 067, 55   7 7 7 7 7 7 7 7 7 7
char 55
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits ****
bits    *
bits    *
bits   * 
bits  *  
bits  *  
bits  *  
X
############### Character 0x38, 070, 56   8 8 8 8 8 8 8 8 8 8
char 56
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *  *
bits  ** 
bits *  *
bits *  *
bits  ** 
X
############### Character 0x39, 071, 57   9 9 9 9 9 9 9 9 9 9
char 57
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *  *
bits  ***
bits    *
bits *  *
bits  ** 
X
############### Character 0x3a, 072, 58   : : : : : : : : : :
char 58
hs   1
vs   5
ha   3
va   -6
hi   5
vi   0
bits *
bits *
bits  
bits *
bits *
X
############### Character 0x3b, 073, 59   ; ; ; ; ; ; ; ; ; ;
char 59
hs   2
vs   7
ha   1
va   -7
hi   5
vi   0
bits  *
bits  *
bits   
bits   
bits  *
bits  *
bits * 
X
############### Character 0x3c, 074, 60   < < < < < < < < < <
char 60
hs   4
vs   5
ha   1
va   -7
hi   5
vi   0
bits   * 
bits  *  
bits *   
bits  *  
bits   * 
X
############### Character 0x3d, 075, 61   = = = = = = = = = =
char 61
hs   4
vs   3
ha   1
va   -6
hi   5
vi   0
bits ****
bits     
bits ****
X
############### Character 0x3e, 076, 62   > > > > > > > > > >
char 62
hs   4
vs   5
ha   1
va   -7
hi   5
vi   0
bits  *  
bits   * 
bits    *
bits   * 
bits  *  
X
############### Character 0x3f, 077, 63   ? ? ? ? ? ? ? ? ? ?
char 63
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits    *
bits   * 
bits   * 
bits     
bits   * 
X
############### Character 0x40, 0100, 64   @ @ @ @ @ @ @ @ @ @
char 64
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits * **
bits ** *
bits * **
bits *   
bits  ** 
X
############### Character 0x41, 0101, 65   A A A A A A A A A A
char 65
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *  *
bits *  *
bits ****
bits *  *
bits *  *
X
############### Character 0x42, 0102, 66   B B B B B B B B B B
char 66
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *** 
bits *  *
bits *  *
bits *** 
bits *  *
bits *  *
bits *** 
X
############### Character 0x43, 0103, 67   C C C C C C C C C C
char 67
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *   
bits *   
bits *   
bits *  *
bits  ** 
X
############### Character 0x44, 0104, 68   D D D D D D D D D D
char 68
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *** 
bits *  *
bits *  *
bits *  *
bits *  *
bits *  *
bits *** 
X
############### Character 0x45, 0105, 69   E E E E E E E E E E
char 69
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits ****
bits *   
bits *   
bits *** 
bits *   
bits *   
bits ****
X
############### Character 0x46, 0106, 70   F F F F F F F F F F
char 70
hs   4
vs   7
ha   2
va   -8
hi   5
vi   0
bits ****
bits *   
bits *   
bits *** 
bits *   
bits *   
bits *   
X
############### Character 0x47, 0107, 71   G G G G G G G G G G
char 71
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *   
bits * **
bits *  *
bits *  *
bits  ** 
X
############### Character 0x48, 0110, 72   H H H H H H H H H H
char 72
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits ****
bits *  *
bits *  *
bits *  *
X
############### Character 0x49, 0111, 73   I I I I I I I I I I
char 73
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *** 
bits  *  
bits  *  
bits  *  
bits  *  
bits  *  
bits *** 
X
############### Character 0x4a, 0112, 74   J J J J J J J J J J
char 74
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits    *
bits    *
bits    *
bits    *
bits    *
bits *  *
bits  ** 
X
############### Character 0x4b, 0113, 75   K K K K K K K K K K
char 75
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits * * 
bits **  
bits **  
bits * * 
bits *  *
bits *  *
X
############### Character 0x4c, 0114, 76   L L L L L L L L L L
char 76
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *   
bits *   
bits *   
bits *   
bits *   
bits *   
bits ****
X
############### Character 0x4d, 0115, 77   M M M M M M M M M M
char 77
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits ****
bits ****
bits ****
bits *  *
bits *  *
bits *  *
X
############### Character 0x4e, 0116, 78   N N N N N N N N N N
char 78
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits ** *
bits * **
bits *  *
bits *  *
bits *  *
bits *  *
X
############### Character 0x4f, 0117, 79   O O O O O O O O O O
char 79
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *  *
bits *  *
bits *  *
bits *  *
bits  ** 
X
############### Character 0x50, 0120, 80   P P P P P P P P P P
char 80
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *** 
bits *  *
bits *  *
bits *  *
bits *** 
bits *   
bits *   
X
############### Character 0x51, 0121, 81   Q Q Q Q Q Q Q Q Q Q
char 81
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *  *
bits *  *
bits ** *
bits * * 
bits  * *
X
############### Character 0x52, 0122, 82   R R R R R R R R R R
char 82
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *** 
bits *  *
bits *  *
bits *** 
bits * * 
bits *  *
bits *  *
X
############### Character 0x53, 0123, 83   S S S S S S S S S S
char 83
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits  ** 
bits *  *
bits *   
bits  ** 
bits    *
bits *  *
bits  ** 
X
############### Character 0x54, 0124, 84   T T T T T T T T T T
char 84
hs   3
vs   7
ha   1
va   -8
hi   5
vi   0
bits ***
bits  * 
bits  * 
bits  * 
bits  * 
bits  * 
bits  * 
X
############### Character 0x55, 0125, 85   U U U U U U U U U U
char 85
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits *  *
bits *  *
bits *  *
bits  ** 
X
############### Character 0x56, 0126, 86   V V V V V V V V V V
char 86
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits *  *
bits *  *
bits  ** 
bits   * 
X
############### Character 0x57, 0127, 87   W W W W W W W W W W
char 87
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits ****
bits ****
bits ****
bits *  *
X
############### Character 0x58, 0130, 88   X X X X X X X X X X
char 88
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits *  *
bits  ** 
bits  ** 
bits  ** 
bits *  *
bits *  *
X
############### Character 0x59, 0131, 89   Y Y Y Y Y Y Y Y Y Y
char 89
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits  ** 
bits   * 
bits   * 
bits   * 
X
############### Character 0x5a, 0132, 90   Z Z Z Z Z Z Z Z Z Z
char 90
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits ****
bits    *
bits   * 
bits ****
bits  *  
bits *   
bits ****
X
############### Character 0x5b, 0133, 91   [ [ [ [ [ [ [ [ [ [
char 91
hs   3
vs   7
ha   2
va   -8
hi   5
vi   0
bits ***
bits *  
bits *  
bits *  
bits *  
bits *  
bits ***
X
############### Character 0x5c, 0134, 92   \ \ \ \ \ \ \ \ \ \
char 92
hs   4
vs   6
ha   1
va   -7
hi   5
vi   0
bits *   
bits  *  
bits  *  
bits   * 
bits   * 
bits    *
X
############### Character 0x5d, 0135, 93   ] ] ] ] ] ] ] ] ] ]
char 93
hs   3
vs   7
ha   1
va   -8
hi   5
vi   0
bits ***
bits   *
bits   *
bits   *
bits   *
bits   *
bits ***
X
############### Character 0x5e, 0136, 94   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
char 94
hs   3
vs   2
ha   1
va   -8
hi   5
vi   0
bits  * 
bits * *
X
############### Character 0x5f, 0137, 95   _ _ _ _ _ _ _ _ _ _
char 95
hs   5
vs   1
ha   0
va   -1
hi   5
vi   0
bits *****
X
############### Character 0x60, 0140, 96   ` ` ` ` ` ` ` ` ` `
char 96
hs   3
vs   3
ha   2
va   -8
hi   5
vi   0
bits *  
bits  * 
bits   *
X
############### Character 0x61, 0141, 97   a a a a a a a a a a
char 97
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits  ** 
bits    *
bits  ***
bits *  *
bits  ***
X
############### Character 0x62, 0142, 98   b b b b b b b b b b
char 98
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *   
bits *   
bits *** 
bits *  *
bits *  *
bits *  *
bits *** 
X
############### Character 0x63, 0143, 99   c c c c c c c c c c
char 99
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits  ** 
bits *  *
bits *   
bits *  *
bits  ** 
X
############### Character 0x64, 0144, 100   d d d d d d d d d d
char 100
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits    *
bits    *
bits  ***
bits *  *
bits *  *
bits *  *
bits  ***
X
############### Character 0x65, 0145, 101   e e e e e e e e e e
char 101
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits  ** 
bits *  *
bits ****
bits *   
bits  ***
X
############### Character 0x66, 0146, 102   f f f f f f f f f f
char 102
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits   **
bits  *  
bits  *  
bits ****
bits  *  
bits  *  
bits  *  
X
############### Character 0x67, 0147, 103   g g g g g g g g g g
char 103
hs   4
vs   6
ha   1
va   -6
hi   5
vi   0
bits  ***
bits *  *
bits *  *
bits  ***
bits    *
bits  ** 
X
############### Character 0x68, 0150, 104   h h h h h h h h h h
char 104
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *   
bits *   
bits *** 
bits *  *
bits *  *
bits *  *
bits *  *
X
############### Character 0x69, 0151, 105   i i i i i i i i i i
char 105
hs   3
vs   7
ha   1
va   -8
hi   5
vi   0
bits  * 
bits    
bits ** 
bits  * 
bits  * 
bits  * 
bits ***
X
############### Character 0x6a, 0152, 106   j j j j j j j j j j
char 106
hs   3
vs   8
ha   1
va   -8
hi   5
vi   0
bits   *
bits    
bits  **
bits   *
bits   *
bits   *
bits * *
bits  * 
X
############### Character 0x6b, 0153, 107   k k k k k k k k k k
char 107
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *   
bits *   
bits *  *
bits * * 
bits **  
bits * * 
bits *  *
X
############### Character 0x6c, 0154, 108   l l l l l l l l l l
char 108
hs   3
vs   7
ha   1
va   -8
hi   5
vi   0
bits ** 
bits  * 
bits  * 
bits  * 
bits  * 
bits  * 
bits ***
X
############### Character 0x6d, 0155, 109   m m m m m m m m m m
char 109
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *  *
bits ****
bits ****
bits *  *
bits *  *
X
############### Character 0x6e, 0156, 110   n n n n n n n n n n
char 110
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *** 
bits *  *
bits *  *
bits *  *
bits *  *
X
############### Character 0x6f, 0157, 111   o o o o o o o o o o
char 111
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits  ** 
bits *  *
bits *  *
bits *  *
bits  ** 
X
############### Character 0x70, 0160, 112   p p p p p p p p p p
char 112
hs   4
vs   6
ha   1
va   -6
hi   5
vi   0
bits *** 
bits *  *
bits *  *
bits *** 
bits *   
bits *   
X
############### Character 0x71, 0161, 113   q q q q q q q q q q
char 113
hs   4
vs   6
ha   1
va   -6
hi   5
vi   0
bits  ***
bits *  *
bits *  *
bits  ***
bits    *
bits    *
X
############### Character 0x72, 0162, 114   r r r r r r r r r r
char 114
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *** 
bits *  *
bits *   
bits *   
bits *   
X
############### Character 0x73, 0163, 115   s s s s s s s s s s
char 115
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits  ***
bits *   
bits  ** 
bits    *
bits *** 
X
############### Character 0x74, 0164, 116   t t t t t t t t t t
char 116
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits *   
bits *   
bits *** 
bits *   
bits *   
bits *  *
bits  ** 
X
############### Character 0x75, 0165, 117   u u u u u u u u u u
char 117
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits *  *
bits  ***
X
############### Character 0x76, 0166, 118   v v v v v v v v v v
char 118
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits  ** 
bits   * 
X
############### Character 0x77, 0167, 119   w w w w w w w w w w
char 119
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *  *
bits *  *
bits ****
bits ****
bits *  *
X
############### Character 0x78, 0170, 120   x x x x x x x x x x
char 120
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits *  *
bits *  *
bits  ** 
bits *  *
bits *  *
X
############### Character 0x79, 0171, 121   y y y y y y y y y y
char 121
hs   4
vs   6
ha   1
va   -6
hi   5
vi   0
bits *  *
bits *  *
bits *  *
bits  ***
bits    *
bits  ** 
X
############### Character 0x7a, 0172, 122   z z z z z z z z z z
char 122
hs   4
vs   5
ha   1
va   -6
hi   5
vi   0
bits ****
bits   * 
bits  *  
bits *   
bits ****
X
############### Character 0x7b, 0173, 123   { { { { { { { { { {
char 123
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits   **
bits  *  
bits  *  
bits **  
bits  *  
bits  *  
bits   **
X
############### Character 0x7c, 0174, 124   | | | | | | | | | |
char 124
hs   1
vs   9
ha   4
va   -9
hi   5
vi   0
bits *
bits *
bits *
bits *
bits  
bits *
bits *
bits *
bits *
X
############### Character 0x7d, 0175, 125   } } } } } } } } } }
char 125
hs   4
vs   7
ha   1
va   -8
hi   5
vi   0
bits **  
bits   * 
bits   * 
bits   **
bits   * 
bits   * 
bits **  
X
############### Character 0x7e, 0176, 126   ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
char 126
hs   4
vs   2
ha   1
va   -6
hi   5
vi   0
bits  * *
bits * * 
X
############### Character 0x7f, 0177, 127            
char 127
hs   4
vs   8
ha   3
va   -9
hi   5
vi   0
bits ****
bits ****
bits ****
bits ****
bits ****
bits ****
bits ****
bits ****
X
SHAR_EOF
chmod 0644 font/xtclient.ft ||
echo 'restore of font/xtclient.ft failed'
Wc_c="`wc -c < 'font/xtclient.ft'`"
test 16814 -eq "$Wc_c" ||
	echo 'font/xtclient.ft: original size 16814, current size' "$Wc_c"
fi
exit 0
-- 
David H. Brierley
Home: dave at galaxia.newport.ri.us; Work: dhb at quahog.ssd.ray.com
Send comp.sources.3b1 submissions to comp-sources-3b1 at galaxia.newport.ri.us
%% Can I be excused, my brain is full. **



More information about the Comp.sources.3b1 mailing list