[comp.sources.unix] v10i007: Crypt Breaker's Workbench, Part07/11

rs@uunet.UU.NET (Rich Salz) (06/19/87)

Submitted by: Robert W. Baldwin <BALDWIN@XX.LCS.MIT.EDU>
Mod.sources: Volume 10, Issue 7
Archive-name: cbw/Part07


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 7 (of 11)."
# Contents:  dblock.c test3.perm
# Wrapped by rs@uunet on Wed Jun 17 18:17:24 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f dblock.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dblock.c\"
else
echo shar: Extracting \"dblock.c\" \(18401 characters\)
sed "s/^X//" >dblock.c <<'END_OF_dblock.c'
X/*
X * Decrytion block and its label.
X *
X * Robert W. Baldwin, December 1984.
X */
X
X
X#include	<stdio.h>
X#include	"window.h"
X#include	"terminal.h"
X#include	"layout.h"
X#include	"specs.h"
X
X
X/* Relative layout constants. */
X
X#define	TOPROW		2		/* First non-blank row. */
X#define	BOTROW		(TOPROW+2*(NLINES-1))	/* First non-blank row. */
X#define DBSHELP	\
X	"^G: undo, ^T: tryall, ^W: wrdsrch, F2 F1: next prev block"
X#define WIREWIDTH	23	/* Number of chars from WIREFORMAT */
X#define WIREFORMAT	"Know %3d of 128 wires  "
X#define	WIRECOL		(LINELEN - WIREWIDTH + 1)  /* Starting column. */
X#define	BLOCKFORMAT	"Block - %d"
X
X/* Keystroke handler for decryption block storage. */
X
Xextern	dbsup(), dbsdown(), dbsleft(), dbsright();
Xextern	dbskey();
Xextern	dbsundo();
Xextern	dbsdelf();
Xextern	dbsdelb();
Xextern	dbsnxtblk();
Xextern	dbsprvblk();
Xextern	dbstryall();
Xextern	dbswrdsrch();
X
Xkeyer	dbsktab[] = {
X		{CTRYALL, dbstryall},
X		{CWRDSRCH, dbswrdsrch},
X		{CNEXTBLOCK, dbsnxtblk},
X		{CPREVBLOCK, dbsprvblk},
X		{CGO_UP, dbsup},
X		{CGO_DOWN, dbsdown},
X		{CGO_LEFT, dbsleft},
X		{CGO_RIGHT, dbsright},
X		{CUNDO, dbsundo},
X		{CDELF, dbsdelf},
X		{CDELB, dbsdelb},
X		{CINSERT, dbskey},
X		{CRETURN, dbskey},	/* Special case return key. */
X		{0, NULL},
X		};
X
X
X
X/* Private data for the decryption block storage. */
X
X#include 	"dblock.h"
X
Xchar	mcbuf[BLOCKSIZE+1];		/* Static buffer for now. */
Xint	mpbuf[BLOCKSIZE+1];		/* Static buffer for now. */
Xint	moperm[BLOCKSIZE+1];		/* Static buffer for now. */
Xchar	mmbuf[BLOCKSIZE+1];		/* Static buffer for now. */
Xint	mcmdbuf[BLOCKSIZE+1];		/* Static buffer for now. */
X
Xdbsinfo dbsprivate;
X
X
X
X/* Window for the decryption block label. */
X
Xdispline	dblline1 = {
X		DBLROW,1,		/* Origin. */
X		1,DBWIDTH,		/* Height and width. */
X		1,1,			/* Init (relative) cursor position */
X		NULL,			/* No private data. */
X		wl_setcur,		/* Firstime = restore cursor pos. */
X		wl_noop,		/* Lasttime = do nothing. */
X		wl_dldraw,		/* Default dispaly line draw routine */
X		dokey,			/* Default keystroke handler. */
X		arwktab,		/* Basic arrow keystroke handler. */
X		1,DBWIDTH,		/* Min and Max col for cursor. */
X};
X
Xdispline	*dbllines[] = {
X		&dblline1,		/* List of lines for the label. */
X		NULL,
X};
X
Xtwindow		dblabel = {
X		DBLROW,1,		/* Origin. */
X		1,DBWIDTH,		/* Height and width. */
X		1,1,			/* Init (relative) cursor position */
X		NULL,			/* No private info. */
X		wl_setcur,		/* Firstime = restore cursor pos. */
X		wl_noop,		/* Lasttime = do nothing. */
X		wl_twdraw,		/* Simple draw routine. */
X		dokey,			/* Default keystroke handler. */
X		arwktab,		/* Basic arrow keystroke handler. */
X		dbllines,
X};
X
X
X/* Window for the decrytion block. */
X
Xextern	int	dbsdraw();
Xextern	int	dbsfirst();
Xextern	int	dbslast();
X
Xgwindow		dbstore = {
X		DBSROW,1,		/* Origin. */
X		DBHEIGHT,DBWIDTH,	/* Height and width. */
X		TOPROW,1,		/* Initial cursor position */
X		((char *)&dbsprivate),	/* Info about current block. */
X		dbsfirst,		/* Firstime */
X		dbslast,		/* Lasttime */
X		dbsdraw,		/* Draw routine. */
X		dokey,			/* Default keystroke handler. */
X		dbsktab,		/* Arrow keystroke handler. */
X};
X
X
X
X/* Initialize the decrypted block label, and return a ptr to it.
X */
Xgwindow	*(idblabel())
X{
X	displine	*line;
X
X	line = dblabel.dlines[0];
X	clrdline(line);
X	return ((gwindow *) &dblabel);
X}
X
X
X/* Set the block number in the label.
X * The argument, num, is displayed as it, it is not zero adjusted.
X * The cursor is not moved, and the window is redisplayed.
X */
Xdblbnum(label, num)
Xtwindow	*label;
Xint	num;
X{
X	int	row,col;
X
X	row = rowcursor();
X	col = colcursor();
X
X	sprintf(statmsg, BLOCKFORMAT, num);
X	setrange(label->dlines[0], statmsg, 1, WIRECOL-1);
X	wl_dldraw(label->dlines[0]);
X	setcursor(row, col);
X}
X
X
X/* Set the known wire number in the label.
X * The argument, num, is displayed as it, it is not zero adjusted.
X * The cursor is not moved, and the window is redisplayed.
X */
Xdblpcount(label, num)
Xtwindow	*label;
Xint	num;
X{
X	int	row,col;
X
X	row = rowcursor();
X	col = colcursor();
X
X	sprintf(statmsg, WIREFORMAT, num);
X	setnadline(label->dlines[0], statmsg, WIRECOL);
X	wl_dldraw(label->dlines[0]);
X	setcursor(row, col);
X}
X
X
X
X/* Initialize the decryption block storage, and return a ptr to it.
X * Reads in cipher block from the file named by cipherfile.
X * If errors occur, a message is put in the status area.
X */
Xgwindow	*(idbstore())
X{
X	gwindow		*dbs;
X	dbsinfo		*dbsi;
X	FILE		*fd;
X
X	dbs = &dbstore;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	dbsi->cbuf = mcbuf;
X	dbsi->blknum = 0;
X	fillcbuf(dbsi->blknum, dbsi->cbuf);
X	dbsi->perm = refperm(dbsi->blknum);
X	dbsi->pbuf = mpbuf;
X	dbsi->mbuf = mmbuf;
X	dbsi->cmdbuf = mcmdbuf;
X	dbsi->operm = moperm;
X
X	dbsinit(dbsi);
X
X	return (dbs);
X}
X
X
X/* Initialize the private data.
X * Requires that the cipherblock and permutation have already been loaded.
X * The plaintext is decoded from the ciphertext and permutation.
X * Updates the label display.
X */
Xdbsinit(dbsi)
Xdbsinfo	*dbsi;
X{
X	int		i;
X
X	dbsi->wirecnt = permwcount(dbsi->perm);
X	dbsi->cmdloc = 0;
X	dbsi->cmdnext = 0;
X	dbsi->cmdbuf[0] = 0;
X	dblbnum(&dblabel, dbsi->blknum);
X	dblpcount(&dblabel, dbsi->wirecnt);
X
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		dbsi->operm[i] = dbsi->perm[i];
X		dbsi->mbuf[i] = FALSE;
X		}
X
X	decode(dbsi->cbuf, dbsi->pbuf, dbsi->perm);
X}
X
X
X
X/* Atomically merge the given permutation into the current one.
X * The current one is not changed if any conflicts are detected.
X * Updates the display and plaintext buffer.
X * Does setup to allow an undo.
X * Return TRUE if suceesful.
X */
Xint	dbsmerge(dbs, perm)
Xgwindow	*dbs;		/* Ptr to dbstore */
Xint	perm[];		/* Permutation */
X{
X	int	i;
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	/* Check for conflicts, display msg if so. */
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if (perm[i] != NONE  &&  dbsi->perm[i] != NONE
X		 && perm[i] != dbsi->perm[i]) {
X			sprintf(statmsg, "Guess conflicts with current plaintext!");
X			usrstatus(&user, statmsg);
X			return(FALSE);
X			}
X		}
X
X	/* Use dbssperm to set the guess.  Save old perm for undo. */
X	dbsi->cmdnext = 0;
X	dbsi->cmdloc = dbsrc2pos(dbs->wcur_row, dbs->wcur_col);
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		dbsi->operm[i] = dbsi->perm[i];
X		}
X
X	dbsrmarks(dbs);
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if (perm[i] != NONE  &&  perm[i] > i  &&  dbsi->perm[i] == NONE) {
X			dbsswire(dbs, i, perm[i]);
X			}
X		}
X
X	sprintf(statmsg, "Sucessful merge.");
X	usrstatus(&user, statmsg);
X	dbsi->wirecnt = permwcount(dbsi->perm);
X	dblpcount(&dblabel, dbsi->wirecnt);
X	return(TRUE);
X}
X
X
X/* Undo the last command.
X * Copy the old permutation into the current one,
X * recompute the plaintext, and update the display.
X * Move the cursor back to where it was.
X */
Xdbsundo(dbs)
Xgwindow	*dbs;
X{
X	int	i;
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		dbsi->mbuf[i] = FALSE;
X		dbsi->perm[i] = dbsi->operm[i];
X		}
X	decode(dbsi->cbuf, dbsi->pbuf, dbsi->perm);
X	dbsdraw(dbs);
X
X	dbsi->wirecnt = permwcount(dbsi->perm);
X	dblpcount(&dblabel, dbsi->wirecnt);
X	usrstatus(&user, "Command undone.");
X	wl_setcur(dbs, dbsp2row(dbsi->cmdloc), dbsp2col(dbsi->cmdloc));
X}
X
X
X
X/* (re)Draw the window.
X */
Xdbsdraw(dbs)
Xgwindow	*dbs;
X{
X	int	i;
X	int	row, col;
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if (i%LINELEN == 0) {
X			wl_setcur(dbs, dbsp2row(i), dbsp2col(i));
X			}
X		plnchars(1, char2sym(dbsi->pbuf[i]));
X		}
X
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if (i%LINELEN == 0) {
X			wl_setcur(dbs, dbsp2row(i)+1, dbsp2col(i));
X			}
X		if (dbsi->mbuf[i]) {
X			plnchars(1, SUNDERLINE);
X			}
X		else  {
X			plnchars(1, ' ');
X			}
X		}
X
X	for (i = dbsp2row(BLOCKSIZE) ; i <= DBHEIGHT ; i++) {
X		wl_setcur(dbs, i, 1);
X		plnchars(LINELEN, ' ');
X		}
X	for (i = 1 ; i < dbsp2row(0) ; i++) {
X		wl_setcur(dbs, i, 1);
X		plnchars(LINELEN, ' ');
X		}
X
X	for (i = 1 ; i <= DBHEIGHT ; i++) {
X		wl_setcur(dbs, i, LINELEN+1);
X		plnchars(dbs->wwidth - LINELEN, ' ');
X		}
X
X	wl_setcur(dbs, row, col);
X
X}
X
X
X
X/* Draw the plaintext characters on the screen.
X * Does not change the cursor position.
X */
Xdbsdpbuf(dbs)
Xgwindow	*dbs;
X{
X	int	i;
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		dbsdpchar(dbs, i, dbsi->pbuf[i]);
X		}
X}
X
X
X/* Display the given plaintext character at the given cipher block position.
X * Cipher block positions are zero-based.
X * Handles mapping of block positions to window coordinates.
X * It does not move the cursor.
X * It does set pbuf.
X */
Xdbsdpchar(dbs, pos, pchar)
Xgwindow	*dbs;
Xint		pos;
Xint		pchar;				/* -1 means no char. */
X{
X	int	row, col;			/* Original position. */
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X
X	wl_setcur(dbs, dbsp2row(pos), dbsp2col(pos));
X	plnchars(1, char2sym(pchar));
X	dbsi->pbuf[pos] = pchar;
X	wl_setcur(dbs, row, col);
X}
X
X
X
X/* Convert cipher block position to window row coordinate.
X */
Xdbsp2row(pos)
Xint		pos;
X{
X	return(TOPROW + 2*(pos/LINELEN));
X}
X
X
X/* Convert cipher block position to window column coordinate.
X */
Xdbsp2col(pos)
Xint		pos;
X{
X	return(1 + (pos%LINELEN));
X}
X
X
X/* Convert window row and column positions into a  cipher block position.
X */
Xint	dbsrc2pos(row, col)
Xint		row, col;
X{
X	return( ((row-TOPROW)/2)*LINELEN  +  (col-1) );
X}
X
X
X
X/* Reset all the character marks that are set and update the display.
X */
Xdbsrmarks(dbs)
Xgwindow	*dbs;
X{
X	int	i;
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if (dbsi->mbuf[i])  dbscmark(dbs, i);
X		}
X}
X
X
X/* (re)Draw all the set character marks.
X * Assumes that the window has been erased.
X * Cursor restored to its original place.
X */
Xdbsdmarks(dbs)
Xgwindow	*dbs;
X{
X	int	i;
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if (dbsi->mbuf[i])  {
X			dbssmark(dbs, i);
X			}
X		}
X}
X
X
X/* Set a mark under the given cipher block position and
X * update the mark flags.
X * Doesn't change the cursor position.
X */
Xdbssmark(dbs, pos)
Xgwindow	*dbs;
X{
X	int	row, col;			/* Original position. */
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X
X	wl_setcur(dbs, 1+dbsp2row(pos), dbsp2col(pos));
X	plnchars(1, SUNDERLINE);
X	dbsi->mbuf[pos] = TRUE;
X
X	wl_setcur(dbs, row, col);
X}
X
X
X/* Clear the mark under the given cipher block position and
X * update the mark flags.
X * Doesn't change the cursor position.
X */
Xdbscmark(dbs, pos)
Xgwindow	*dbs;
X{
X	int	row, col;			/* Original position. */
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X
X	wl_setcur(dbs, 1+dbsp2row(pos), dbsp2col(pos));
X	plnchars(1,' ');
X	dbsi->mbuf[pos] = FALSE;
X
X	wl_setcur(dbs, row, col);
X}
X
X
X
X/* Set the permutation to reflect the fact that the
X * character at pos is pchar.
X * Update the display to reflect the changes.
X * Highlight all changes.
X * Add the character to the command string, clearing the old
X * marks if this is the first command character.
X * By setting pchar to NONE, this can be used to clear the permutation.
X * The cursor position is not changed.
X */
Xdbssperm(dbs, pos, pchar)
Xgwindow	*dbs;
Xint	pos;
Xint	pchar;
X{
X	int	i;
Xreg	dbsinfo	*dbsi;
X	char	*p;
X	int	x;		/* Shifted up cipher text character. */
X	int	y;		/* Shifted up plain text character. */
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	if (dbsi->cmdnext == 0)  {		/* Starting new command. */
X		dbsrmarks(dbs);
X		for (i = 0 ; i < BLOCKSIZE ; i++)  {
X			dbsi->operm[i] = dbsi->perm[i];
X			}
X		dbsi->cmdloc = pos;
X		}
X	dbsi->cmdbuf[dbsi->cmdnext++] = pchar;
X
X	if (pchar == NONE) {		/* Just clear the permutation. */
X		x = (dbsi->cbuf[pos] + pos) & MODMASK;
X		y = dbsi->perm[x];
X		if (y != NONE)  dbscwire(dbs, x, y&MODMASK);
X		return;
X		}
X
X	x = (dbsi->cbuf[pos] + pos) & MODMASK;
X	y = (pchar + pos) & MODMASK;
X	dbsswire(dbs, x, y);
X}
X
X
X/* Clear the wiring for perm[x] equals y and update the display.
X * Requires that x be in fact wired to y.
X */
Xdbscwire(dbs, x, y)
Xgwindow	*dbs;
Xint	x, y;
X{
X	int	i;
X	dbsinfo	*dbsi;
X	char	*p;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	if (dbsi->perm[x] != y  ||  x == NONE)  return;
X	if (y != NONE)  dbsi->wirecnt--;
X
X	permchgflg = TRUE;
X	x = x&MODMASK;
X	y = y&MODMASK;
X	dbsi->perm[x] = NONE;
X	dbsi->perm[y] = NONE;
X
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if ( ((((dbsi->cbuf[i])+i)&MODMASK) == x)
X		  || ((((dbsi->cbuf[i])+i)&MODMASK) == y) ) {
X			dbsdpchar(dbs, i, NONE);
X			dbscmark(dbs, i);
X			}
X		}
X
X}
X
X
X/* Set the wiring for perm[x] equals y and update the display.
X * Clear any wiring that was set.
X * Requires x and y not be NONE.
X */
Xdbsswire(dbs, x, y)
Xgwindow	*dbs;
Xint	x, y;
X{
X	int	i;
X	char	*p;
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	if (x == NONE  ||  y == NONE)  return;
X	x = x&MODMASK;
X	y = y&MODMASK;
X	permchgflg = TRUE;
X
X	if (dbsi->perm[x] != y)  {
X		if (dbsi->perm[x] != NONE)  dbscwire(dbs, x, dbsi->perm[x]);
X		if (dbsi->perm[y] != NONE)  dbscwire(dbs, y, dbsi->perm[y]);
X		}
X	if (dbsi->perm[x] == NONE)  dbsi->wirecnt++;
X	dbsi->perm[x] = y;
X	dbsi->perm[y] = x;
X
X	for (i = 0 ; i < BLOCKSIZE ; i++)  {
X		if ((((dbsi->cbuf[i])+i)&MODMASK) == x)  {
X			dbsi->pbuf[i] = (y - i) & MODMASK;
X			}
X		else if ((((dbsi->cbuf[i])+i)&MODMASK) == y)  {
X			dbsi->pbuf[i] = (x - i) & MODMASK;
X			}
X		else  {continue;}
X		dbsdpchar(dbs, i, dbsi->pbuf[i]);	/* Found one. */
X		dbssmark(dbs, i);
X		}
X}
X
X
X
X/* Behavior when cursor enters the window.
X * Indicate that we are at the beginning of a command.
X * Put up help message.
X */
Xdbsfirst(dbs, row, col)
Xgwindow	*dbs;
Xint	row, col;		/* Relative to window's origin. */
X{
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	dbsi->cmdnext = 0;
X	usrhelp(&user, DBSHELP);
X	wl_setcur(dbs, dbs->wcur_row, col);
X}
X
X
X/* Behavior when cursor leaves the window.
X * Complete the command and give it to the history window.
X */
Xdbslast(dbs)
Xgwindow	*dbs;
X{
X	dbscmddone(dbs);
X}
X
X
X/* A command may be done, if so, send it to the history window.
X * Setup for undo.
X */
Xdbscmddone(dbs)
Xgwindow	*dbs;
X{
X	int		i;
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	if (dbsi->cmdnext != 0)  {
X		dbsi->cmdbuf[dbsi->cmdnext++] = 0;
X/*		hstadd(&history, dbsi->cmdbuf);
X*/
X		dbsi->cmdnext = 0;
X		}
X}
X
X
X
X/* Cursor movement commands.
X * Keep the cursor on the pchar lines.
X * Moving off the end of a line advances to the next or previous line.
X * Moving the cursor also terminates any command that might
X * have been entered.
X */
Xdbsup(dbs, k)
Xgwindow	*dbs;
X{
X	int	row, col;		/* Current relative cursor position. */
X	
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X	
X	if (row <= TOPROW)  {
X		wl_setcur(dbs, 1, col);
X		dbs->wcur_row = TOPROW;
X		jogcursor(1);
X		if (wl_hascur(dbs))
X		  	wl_rcursor(dbs);
X	}
X	else {
X		jogup(dbs, k);
X		jogup(dbs, k);
X	}
X	dbscmddone(dbs);
X}
X
Xdbsdown(dbs, k)
Xgwindow	*dbs;
X{
X	int	row, col;		/* Current relative cursor position. */
X	
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X	
X	if (row >= BOTROW)  {
X		wl_setcur(dbs, DBHEIGHT, col);
X		dbs->wcur_row = BOTROW;
X		jogcursor(2);
X		if (wl_hascur(dbs))
X		  	wl_rcursor(dbs);
X		}
X	else {
X		jogdown(dbs, k);
X		jogdown(dbs, k);
X		}
X	dbscmddone(dbs);
X}
X
Xdbsleft(dbs, k)
Xgwindow	*dbs;
X{
X	int	row, col;		/* Current relative cursor position. */
X	
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X	
X	dbsprev(dbs);
X	dbscmddone(dbs);
X}
X
Xdbsright(dbs, k)
Xgwindow	*dbs;
X{
X	int	row, col;		/* Current relative cursor position. */
X	
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X	
X	dbsnext(dbs);
X	dbscmddone(dbs);
X}
X
X
X/* Backup the cursor to the previous position without terminating
X * a command.
X */
Xdbsprev(dbs)
Xgwindow	*dbs;
X{
X	int	row, col;		/* Current relative cursor position. */
X
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X
X	if (col <= 1  &&  row <= TOPROW)  {
X		}
X	else if (col <= 1)  {
X		wl_setcur(dbs, row-2, LINELEN);
X		}
X	else {
X		jogleft(dbs);
X		}
X}
X
X
X/* Advance the cursor to the next position without terminating
X * a command.
X */
Xdbsnext(dbs)
Xgwindow	*dbs;
X{
X	int	row, col;		/* Current relative cursor position. */
X
X	row = dbs->wcur_row;
X	col = dbs->wcur_col;
X
X	if (col >= LINELEN  &&  row >= BOTROW)  {
X		}
X	else if (col >= LINELEN)  {
X		wl_setcur(dbs, row+2, 1);
X		}
X	else {
X		jogright(dbs);
X		}
X}
X
X
X
X/* Add the character to the permutation.
X */
Xdbskey(dbs, k)
Xgwindow	*dbs;
Xint	k;
X{
X	int	pos;		/* plaintext block position. */
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	pos = dbsrc2pos(dbs->wcur_row, dbs->wcur_col);
X	dbssperm(dbs, pos, k & CHARM);
X	dbsnext(dbs);
X	dblpcount(&dblabel, dbsi->wirecnt);
X}
X
X
X
X/* Delete forward.
X * Clear the wiring due to the character at the current position,
X * and update the display.
X * The cursor moves forward one position.
X */
Xdbsdelf(dbs)
Xgwindow	*dbs;
X{
X	int	pos;		/* plaintext block position. */
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	pos = dbsrc2pos(dbs->wcur_row, dbs->wcur_col);
X
X	dbssperm(dbs, pos, NONE);
X	dbsnext(dbs);
X	dblpcount(&dblabel, dbsi->wirecnt);
X}
X
X
X
X/* Delete backwards.
X * Clear the wiring due to the character at the previous position,
X * and update the display.
X * The cursor moves backwards one position.
X */
Xdbsdelb(dbs)
Xgwindow	*dbs;
X{
X	int	pos;		/* plaintext block position. */
X	dbsinfo	*dbsi;
X
X	dbsi = ((dbsinfo *) dbs->wprivate);
X	pos = dbsrc2pos(dbs->wcur_row, dbs->wcur_col);
X	if (pos == 0)  return;
X	pos = pos - 1;
X
X	dbssperm(dbs, pos, NONE);
X	dbsprev(dbs);
X	dblpcount(&dblabel, dbsi->wirecnt);
X}
X
X
X
X/* Advance to the next cipher text block (if any).
X */
Xdbsnxtblk(dbs)
Xgwindow	*dbs;
X{
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	dbssetblk(dbs, dbsi->blknum + 1);
X}
X
X
X/* Backup to the previous cipher text block (if any).
X */
Xdbsprvblk(dbs)
Xgwindow	*dbs;
X{
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	dbssetblk(dbs, dbsi->blknum - 1);
X}
X
X
X/* Jump to a particular block number.
X * Get a new permutation and update the display.
X * Even if the block number hasn't change, the permutation may have,
X * so we must re-decode the block.
X */
Xdbssetblk(dbs, blocknum)
Xgwindow	*dbs;
Xint	blocknum;
X{
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	if (fillcbuf(blocknum, dbsi->cbuf)
X	 && (dbsi->perm = refperm(blocknum))) {
X		dbsi->blknum = blocknum;
X		dbsinit(dbsi);
X		dbsdraw(dbs);
X		usrstatus(&user, "Ready.");
X		}
X	else {
X		usrstatus(&user, "Block number is out of range.");
X		}
X}
X
X
X/* Return the number of the current block.
X */
Xdbsgetblk(dbs)
Xgwindow	*dbs;
X{
X	dbsinfo	*dbsi;
X	dbsi = ((dbsinfo *) dbs->wprivate);
X
X	return(dbsi->blknum);
X}
END_OF_dblock.c
if test 18401 -ne `wc -c <dblock.c`; then
    echo shar: \"dblock.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f test3.perm -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"test3.perm\"
else
echo shar: Extracting \"test3.perm\" \(16800 characters\)
sed "s/^X//" >test3.perm <<'END_OF_test3.perm'
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X 96 114 124 223  97  19  -1  13  43  44 
X -1  38 231   7  -1 207 179 134 133   5 
X -1  -1  48 160 152  93 162  -1 191 127 
X 65 103 183  -1  -1 193 243 242  11 180 
X 87 173 154   8   9  99 112  58  22 108 
X199  95  77  66  -1  62 128 190  47  79 
X215 109  55 245  73  30  53 178 214  82 
X201 138 206  64 240  -1 228  52 140  59 
X197  -1  69 203  -1 111 137  40  -1 139 
X -1 195 212  25  -1  51   0   4 251  45 
X -1 122 148  31 227 234 167 202  49  61 
X219  85  46 246   1  -1  -1 254 211 249 
X144 255 101 218   2 150 186  29  56  -1 
X -1 247 164  18  17  -1  -1  86  71  89 
X 78 205  -1 222 120 216 226 158 102 189 
X125 225  24  -1  42 159 221 188 147 155 
X 23 210  26  -1 132 232 184 106  -1  -1 
X -1 196 253  41 204  -1  -1 235  67  16 
X 39 192  -1  32 166  -1 126 224 157 149 
X 57  28 181  35 241  91 171  80  -1  50 
X -1  70 107  83 174 141  72  15  -1 233 
X161 118  92 244  68  60 145  -1 123 110 
X237 156 143   3 187 151 146 104  76 239 
X -1  12 165 209 105 177  -1 220  -1 229 
X 74 194  37  36 213  63 113 131  -1 119 
X -1  98  -1 172 117 121 
X 20 122 118 119  -1 229 158  -1 223  -1 
X215  -1 197 249  82 126 237  23  87  93 
X  0  -1 252  17  -1  -1  -1 225  -1 163 
X 52 171  -1 155 214  -1  84  -1 216  85 
X 45 152  -1 181  -1  40 241 235 142 210 
X -1  69  30  83  99 134 212 253  70 144 
X -1  -1 234  -1 132 250 173 114  95  51 
X 58  -1  73  72 175 168 211  -1  92 169 
X176 166  14  53  36  39  -1  18 148 117 
X129 255  78  19 110  68 151 154 101  54 
X244  98 242 147 227 204 128 203 188 254 
X 94 217 170 251  67 231  -1  89   2   3 
X206 146   1 183  -1 209  15 150 106  90 
X184 159  64 141  55 238 195  -1 162 205 
X245 133  48  -1  59 165 121 103  88  -1 
X127  96  41  -1  97  33  -1  -1   6 131 
X187 194 138  29 167 145  81 164  75  79 
X112  31 178  66  -1  74  80  -1 172  -1 
X -1  43 224 123 130 236  -1 160 108 246 
X192 230 190 222 161 136  -1  12 200 213 
X198 239 248 107 105 139 120  -1 247 125 
X 49  76  56 199  34  10  38 111 233  -1 
X -1  -1 193   8 182  27  -1 104 240   5 
X191 115  -1 218  62  47 185  16 135 201 
X228  46 102  -1 100 140 189 208 202  13 
X 65 113  22  57 109  91 
X 90  49  26 132 156 140 212 129  -1 122 
X198  -1  97 148  38  79  25 154  80  -1 
X214 216 248 184 161  16   2 107  66 168 
X 33  -1 195  30  -1  -1  65  -1  14  84 
X222  -1 123  53 136  47  69  45  -1   1 
X125  -1 134  43  -1 102 145 126 238 194 
X 78 232 138 246 224  36  28 225  -1  46 
X130 215 120 188 119 105 231 209  60  15 
X 18  87 185 176  39 160 182  81  -1 158 
X  0 151 235 192 183 200 118  12 174  -1 
X106  -1  55  -1  -1  75 100  27 249 187 
X163 242  -1 230 254 205 179 190  96  74 
X 72  -1   9  42 241  50  57 228 142   7 
X 70 206   3 149  52 227  44 220  62 245 
X  5 221 128 186 244  56 204  -1  13 133 
X -1  91 197 165  17  -1   4 180  89  -1 
X 85  24 193 110 199 153  -1  -1  29 255 
X177 247 226  -1  98 252  83 170 237 116 
X157 191  86  94  23  82 143 109  73 219 
X117 181  93 162  59  32  -1 152  10 164 
X 95  -1 250 239 146 115 131  -1 217  77 
X234  -1   6 251  20  71  21 208  -1 189 
X137 141  40 253  64  67 172 135 127 240 
X113  76  61  -1 210  92  -1 178  58 203 
X229 124 111  -1 144 139  63 171  22 108 
X202 213 175 223 114 169 
X 60  -1  26  79 203 204 122  -1  15  97 
X -1 238 133  33 159   8 165 145  27 191 
X192  69 250  -1  -1 183   2  18  50  65 
X218  57 143  13  -1  -1  -1  93 116 213 
X -1 199  -1 171 109  74  -1 177  56  -1 
X 28  -1  -1 196  -1 227  48  31  80 221 
X  0 248 202 103 233  29 140  -1 170  21 
X216 164 137 190  45 189  -1 193 188   3 
X 58 160 155 181 176  -1 186 104 111 225 
X198 125  -1  37  -1  -1 252   9 231 223 
X169  -1 255  63  87 154  -1  -1 152  44 
X201  88  -1  -1 179 118  38  -1 115 161 
X247 123   6 121 187  91  -1 240 241 239 
X197 207  -1  12  -1 185 138  72 136  -1 
X 66  -1 234  32 150  17 254  -1  -1 226 
X144  -1 108  -1 105  82 228 172 173  14 
X 81 119  -1  -1  71  16 208 246 242 100 
X 68  43 157 158  -1  -1  84  47 229 114 
X -1  83  -1  25 230 135  86 124  78  75 
X 73  19  20  77 245  -1  53 130  90  41 
X210 110  62   4   5 244 211 131 166 219 
X200 206 220  39  -1  -1  70  -1  30 209 
X212  59  -1  99 232  89 149  55 156 178 
X184  98 224  64 142 236 235  -1  11 129 
X127 128 168 249 205 194 167 120  61 243 
X 22  -1  96  -1 146 102 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1  -1  -1  -1  -1 
X -1  -1  -1  -1  -1  -1 
END_OF_test3.perm
if test 16800 -ne `wc -c <test3.perm`; then
    echo shar: \"test3.perm\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 7 \(of 11\).
cp /dev/null ark7isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 11 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive-1c;
60 1