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