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