mwm@hasler.ascom.ch (Mike McGann) (05/17/91)
Submitted-by: Mike McGann <mwm@hasler.ascom.ch> Posting-number: Volume 19, Issue 74 Archive-name: gnuchess/part02 #!/bin/sh # do not concatenate these parts, unpack them in order with /bin/sh # file Makefile.dos continued # if test ! -r _shar_seq_.tmp; then echo 'Please unpack part 1 first!' exit 1 fi (read Scheck if test "$Scheck" != 2; then echo Please unpack part "$Scheck" next! exit 1 else exit 0 fi ) < _shar_seq_.tmp || exit 1 if test ! -f _shar_wnt_.tmp; then echo 'x - still skipping Makefile.dos' else echo 'x - continuing file Makefile.dos' sed 's/^X//' << 'SHAR_EOF' >> 'Makefile.dos' && CFLAGS = -AC -Oita -Gs -G2 -W3 X # The `-Ol' flag (enable loop optimization) is not recommended: # gnuchess.c(430) : fatal error C1001: Internal Compiler Error # (compiler file '@(#)ctypes.c:1.107', line 474) # Contact Microsoft Technical Support X sources = gnuchess.c gnuchess.d gnuchess.h uxdsp.c nuxdsp.c nondsp.c version.h X # Commands all: gnuchess.exe gnuchesr.exe gnucheso.exe X gnuchess.exe: gnuchess.obj nuxdsp.obj X $(CC) gnuchess.obj nuxdsp.obj -o gnuchess.exe -link /e /st:0x9000 X gnuchesr.exe: gnuchess.obj nondsp.obj X $(CC) gnuchess.obj nondsp.obj -o gnuchesr.exe -link /e /st:0x9000 X gnucheso.exe: gnuchess.obj uxdsp.obj X $(CC) gnuchess.obj uxdsp.obj -o gnucheso.exe -link /e /st:0x9000 X gnuchess.obj: gnuchess.c gnuchess.h X $(CC) $(CFLAGS) $(HASH) $(BOOK) -c gnuchess.c X uxdsp.obj: uxdsp.c gnuchess.h X $(CC) $(CFLAGS) -c uxdsp.c X nuxdsp.obj: nuxdsp.c gnuchess.h X $(CC) $(CFLAGS) -c nuxdsp.c X nondsp.obj: nondsp.c gnuchess.h X $(CC) $(CFLAGS) -c nondsp.c X # Utilities X install: X cp gnuchess.exe $(BINDIR)/gnuchess.exe X cp gnuchess.book $(LIBDIR)/gnuchess.book X clean: X del *.obj X del *.exe X tags: $(sources) X etags -t $(sources) X zip: X pkzip -fpr chess-30 X disk: X copy chess-30.zip b: /v X pkunzip -t b:chess-30 | grep -vw OK X SHAR_EOF echo 'File Makefile.dos is complete' && chmod 0664 Makefile.dos || echo 'restore of Makefile.dos failed' Wc_c="`wc -c < 'Makefile.dos'`" test 3150 -eq "$Wc_c" || echo 'Makefile.dos: original size 3150, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= README ============== if test -f 'README' -a X"$1" != X"-c"; then echo 'x - skipping README (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting README (Text)' sed 's/^X//' << 'SHAR_EOF' > 'README' && This is an update of gnuchess version 3.1. X It fixes all known bugs with pawn promotion, undo, and win/draw determination. X It adds the capability of reading xboard position files (xget). X It adds specification of save and load files on the command line (gnuchessr). X Save file format is now human readable. X 'white' and 'black' no longer start play but only set the players. If the computer is to move first use the 'go' command. X X New commands are xget and hashlevel. X X xget reads an xboard position file. X X hashlevel allows you to specify parameters for using the hashfile. X New Programs - X X postprint - allows printing of hashfile contents on a postscript printer X for each position it prints tha board and the recommended move X flags and depth. X To run: just execute the program (pathname for hashfile is X build in. Output comes out stdout. Then cat it with X ChessFonts and sent it to the printer. It prints 16 X positions per page. X X postprint >t X cat ChessFonts t >p X lpr p X X gnuan - a modified version of Truman Collins gnuan program with fixes X for the gnuchess bugs. In addition it shows the best line for X each move instead of just the next move. It will accept input X files produced by xboard (xboard.game.save) or from gnuchess X (chess.lst) files directly. X X Output looks like this: X Move White Black Score Depth Best Line ------------------------------------------------------------------ X 1 e2e4 13 5 g1f3 g8f6 b1c3 b8c6 e2e3 X c7c5 -2 5 e7e6 b1c3 b8c6 d2d4 f8b4 X 2 b1c3 37 5 b1c3 b8c6 g1f3 g8f6 f1c4 X b8c6 -34 5 b8c6 g1f3 g8f6 f1b5 c6b4 X 3 g1f3 44 5 g1f3 g8f6 f1b5 h7h6 d2d3 X g8f6 -38 5 g8f6 f1b5 a7a6 b5c6 d7c6 X 4 f1c4 38 5 f1b5 c6d4 d2d3 d4b5 c3b5 X d7d6 -20 5 d7d6 d2d3 c8g4 h2h3 g4h5 X X White's percentage was 50.00%. Black's percentage was 75.00%. X X Elapsed time was 128 seconds. SHAR_EOF chmod 0664 README || echo 'restore of README failed' Wc_c="`wc -c < 'README'`" test 2119 -eq "$Wc_c" || echo 'README: original size 2119, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= gnuan.c ============== if test -f 'gnuan.c' -a X"$1" != X"-c"; then echo 'x - skipping gnuan.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting gnuan.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'gnuan.c' && /* X gnuan.c - Analysis interface for gnuchess. X X Revision: 1991-04-15 X X Copyright (C) 1986, 1987, 1988, 1989, 1990 Free Software Foundation, Inc. X Copyright (c) 1988, 1989, 1990 John Stanback X X This file is part of CHESS. X X CHESS is distributed in the hope that it will be useful, but WITHOUT ANY X WARRANTY. No author or distributor accepts responsibility to anyone for X the consequences of using it or for whether it serves any particular X purpose or works at all, unless he says so in writing. Refer to the CHESS X General Public License for full details. X X Everyone is granted permission to copy, modify and redistribute CHESS, but X only under the conditions described in the CHESS General Public License. X A copy of this license is supposed to have been given to you along with X CHESS so you can know your rights and responsibilities. It should be in a X file named COPYING. Among other things, the copyright notice and this X notice must be preserved on all copies. */ X /* X This is a front end for a chess analysis program. It takes a file of moves X in algebraic notation and creates a file containing each move that was X made, the move it would have made, the score it would give itself after X making the move it recommended, and the depth it searched for the move. X X This is a modification of nondsp.c. I have cut out code that was not needed X for this application such as the help and edit functions. Most of the X modifications were done in InputCommand. */ X /* X This file will generate two different analysis programs. One is meant to X be run as a background process inwhich the in and out files are predefined. X The other is meant to be run in the foreground where it will prompt you for X the name of the file with the game in it, the maximum depth the search should X be conducted to and the time limit per move. It would be nice to be able to X give these parameters on the command line, but that would mean changing main X which is in the gnuchess.c file. X X For each move it will analyse the move until either it has run out of time X or it has reached the maximum depth. X X To build the version for background processing define BACKGROUND_ANALYSIS X either at the top of this file, or in compilation. The files and depth X used are defined below. They are MAX_DEPTH, MAX_TIME, OUT_FILE, IN_FILE X and PROG_FILE. The PROG_FILE is a file that will be updated as each move is X analysed so you can check its progress. This is only updated when running X the BACKGROUND_ANALYSIS version. In the version where the filename and X depth are entered at runtime, the output goes to stdout. */ X /* #define BACKGROUND_ANALYSIS 1 */ X #define MAX_DEPTH 15 #define MAX_TIME 20 #define OUT_FILE "/pad/gnuan.out" #define IN_FILE "/pad/gnuan.in" #define PROG_FILE "/pad/gnuan.prog" X X #include <ctype.h> #include <signal.h> #ifdef MSDOS #include <dos.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <time.h> #else #include <sys/param.h> #include <sys/types.h> #include <sys/file.h> #include <sys/ioctl.h> void TerminateSearch (int), Die (int); #endif /* MSDOS */ X #include "gnuchess.h" X #define pxx " PNBRQK" #define qxx " pnbrqk" #define rxx "12345678" #define cxx "abcdefgh" #define printz printf #define scanz scanf X static char mvstr[4][6]; static char* ColorStr[2] = {"White", "Black"}; static long evrate; static int mycnt1, mycnt2; static int ahead; X static FILE *fpin; static FILE *fpout; char *DRAW; unsigned short int MV[30]; enum {XBOARD, GNUCHESS, OTHER} InFileType; char InBuf[256]; X #ifdef BACKGROUND_ANALYSIS static FILE *fpprog; #endif static char white_actual_move[20]; static char black_actual_move[20]; static char white_suggest_move[20]; static char black_suggest_move[20]; static int white_score; static int black_score; static int white_moving; static int current_depth; static int current_score; static int enable_update_display = 0; X X void Initialize (void) { X mycnt1 = mycnt2 = 0; } X void ExitChess (void) { X ListGame (); X exit (0); } X #ifndef MSDOS /* never called!!! */ void Die (int sig) { X ExitChess (); } #endif /* MSDOS */ X void TerminateSearch (int sig) { #ifdef MSDOS X sig++; /* shut up the compiler */ #endif /* MSDOS */ X flag.timeout = true; X flag.bothsides = false; } X void algbr (short int f, short int t, short int flag) X /* X Generate move strings in different formats. */ X { X int m3p; X X if (f != t) X { X /* algebraic notation */ X mvstr[0][0] = cxx[column (f)]; X mvstr[0][1] = rxx[row (f)]; X mvstr[0][2] = cxx[column (t)]; X mvstr[0][3] = rxx[row (t)]; X mvstr[0][4] = mvstr[3][0] = '\0'; X if (((mvstr[1][0] = pxx[board[f]]) == 'P') || (flag & promote)) X { X if (mvstr[0][0] == mvstr[0][2]) /* pawn did not eat */ X { X mvstr[2][0] = mvstr[1][0] = mvstr[0][2]; /* to column */ X mvstr[2][1] = mvstr[1][1] = mvstr[0][3]; /* to row */ X m3p = 2; X } X else X /* pawn ate */ X { X mvstr[2][0] = mvstr[1][0] = mvstr[0][0]; /* from column */ X mvstr[2][1] = mvstr[1][1] = mvstr[0][2]; /* to column */ X mvstr[2][2] = mvstr[0][3]; X m3p = 3; /* to row */ X } X mvstr[2][m3p] = mvstr[1][2] = '\0'; X if (flag & promote) X { X mvstr[0][4] = mvstr[1][2] = mvstr[2][m3p] = qxx[flag & pmask]; X mvstr[1][3] = mvstr[2][m3p + 1] = mvstr[0][5] = '\0'; X } X } X else X /* not a pawn */ X { X mvstr[2][0] = mvstr[1][0]; X mvstr[2][1] = mvstr[0][1]; X mvstr[2][2] = mvstr[1][1] = mvstr[0][2]; /* to column */ X mvstr[2][3] = mvstr[1][2] = mvstr[0][3]; /* to row */ X mvstr[2][4] = mvstr[1][3] = '\0'; X strcpy (mvstr[3], mvstr[2]); X mvstr[3][1] = mvstr[0][0]; X if (flag & cstlmask) X { X if (t > f) X { X strcpy (mvstr[1], "o-o"); X strcpy (mvstr[2], "O-O"); X } X else X { X strcpy (mvstr[1], "o-o-o"); X strcpy (mvstr[2], "O-O-O"); X } X } X } X } X else X mvstr[0][0] = mvstr[1][0] = mvstr[2][0] = mvstr[3][0] = '\0'; } X X int VerifyMove (char *s, short int iop, unsigned short int *mv) X /* X Compare the string 's' to the list of legal moves available for the X opponent. If a match is found, make the move on the board. */ X { X static short pnt, tempb, tempc, tempsf, tempst, cnt; X static struct leaf xnode; X struct leaf *node; X X *mv = 0; X if (iop == 2) X { X UnmakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst); X return (false); X } X cnt = 0; X MoveList (opponent, 2); X pnt = TrPnt[2]; X while (pnt < TrPnt[3]) X { X node = &Tree[pnt++]; X algbr (node->f, node->t, (short) node->flags); X if (strcmp (s, mvstr[0]) == 0 || strcmp (s, mvstr[1]) == 0 || X strcmp (s, mvstr[2]) == 0 || strcmp (s, mvstr[3]) == 0) X { X cnt++; X xnode = *node; X } X } X if (cnt == 1) X { X MakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst, &INCscore); X if (SqAtakd (PieceList[opponent][0], computer)) X { X UnmakeMove (opponent, &xnode, &tempb, &tempc, &tempsf, &tempst); X printz ("Illegal move\n"); X return (false); X } X else X { X if (iop == 1) X return (true); /* UpdateDisplay (xnode.f, xnode.t, 0, (short) xnode.flags); */ X if ((board[xnode.t] == pawn) X || (xnode.flags & capture) X || (xnode.flags & cstlmask)) X { X Game50 = GameCnt; X ZeroRPT (); X } X GameList[GameCnt].depth = GameList[GameCnt].score = 0; X GameList[GameCnt].nodes = 0; X ElapsedTime (1); X GameList[GameCnt].time = (short) et; X TimeControl.clock[opponent] -= et; X --TimeControl.moves[opponent]; X *mv = (xnode.f << 8) | xnode.t; X algbr (xnode.f, xnode.t, false); X return (true); X } X } #ifdef CHESSTOOL X printz ("Illegal move\n"); #else X if (cnt > 1) X ShowMessage ("Ambiguous Move!"); #endif X return (false); } X void help (void) { } X void EditBoard (void) /* X Set up a board position. Pieces are entered by typing the piece followed X by the location. For example, Nf3 will place a knight on square f3. */ X { } X void SetupBoard (void) X /* X Compatibility with Unix chess and the nchesstool. X Set up a board position. Eight lines of eight characters are used X to setup the board. a8-h8 is the first line. X Black pieces are represented by uppercase characters. */ X { } X void ShowDepth (char ch) { #ifdef MSDOS X ch++; /* shut up the compiler */ #endif /* MSDOS */ } X void ShowResults (short int score, unsigned short int *bstline, char ch) { X int i; X current_score = score; X current_depth = Sdepth; X for (i = 1; bstline[i] > 0; i++) { MV[i] = bstline[i];} MV[i] = 0; } X void SearchStartStuff (short int side) { X signal (SIGINT, TerminateSearch); #ifndef MSDOS X signal (SIGQUIT, TerminateSearch); #endif /* MSDOS */ X if (flag.post) X { X fprintf (stderr, "\nMove# %d Target= %ld Clock: %ld\n", X TCmoves - TimeControl.moves[side] + 1, X ResponseTime, TimeControl.clock[side]); X } } X void OutputMove (void) { X if(white_moving) { X strcpy(white_suggest_move, mvstr[0]); X white_score = current_score; X } else { X strcpy(black_suggest_move, mvstr[0]); X black_score = current_score; X } } X void ElapsedTime (short int iop) /* X Determine the time that has passed since the search was started. If the X elapsed time exceeds the target (ResponseTime+ExtraTime) then set timeout X to true which will terminate the search. */ { X if (ahead) X { #ifndef MSDOS X long nchar; X ioctl(0, FIONREAD, &nchar); X if (nchar) #else X if (kbhit()) #endif /* MSDOS */ X { X flag.timeout = true; X flag.bothsides = false; X } X } X et = time ((long *) 0) - time0; X if (et < 0) X et = 0; X ETnodes += 50; X if (et > et0 || iop == 1) X { X if (et > ResponseTime + ExtraTime && Sdepth > 1) X flag.timeout = true; X et0 = et; X if (iop == 1) X { X time0 = time ((long *) 0); X et0 = 0; X } X if (et > 0) X /* evrate used to be Nodes / cputime I dont` know why */ X evrate = NodeCnt / (et + ft); X else X evrate = 0; X ETnodes = NodeCnt + 50; X } } X void SetTimeControl (void) { X if (TCflag) X { X TimeControl.moves[white] = TimeControl.moves[black] = TCmoves; X TimeControl.clock[white] = TimeControl.clock[black] = 60L * TCminutes; X } X else X { X TimeControl.moves[white] = TimeControl.moves[black] = 0; X TimeControl.clock[white] = TimeControl.clock[black] = 0; X Level = 60L * TCminutes; X } X et = 0; X ElapsedTime (1); } X void ClrScreen (void) { #ifndef CHESSTOOL X printz ("\n"); #endif } X void UpdateDisplay (short int f, short int t, short int redraw, short int isspec) { #ifndef CHESSTOOL X short r, c, l; X if(!enable_update_display) return; X if (redraw) X { X fprintf(fpout, "\n"); X for (r = 7; r >= 0; r--) X { X for (c = 0; c <= 7; c++) X { X if (flag.reverse) X l = locn (7 - r, 7 - c); X else X l = locn (r, c); X if (color[l] == neutral) X fprintf (fpout, " -"); X else if (color[l] == white) X fprintf (fpout, " %c", qxx[board[l]]); X else X fprintf (fpout, " %c", pxx[board[l]]); X } X fprintf(fpout, "\n"); X } X fprintf(fpout, "\n"); X } #endif /* CHESSTOOL */ #ifdef MSDOS X f++; t++; isspec++; /* shut up the compiler */ #endif /* MSDOS */ } X void GetGame (void) { } X void SaveGame (void) { } X void ListGame (void) { } X X X void Undo (void) /* X Undo the most recent half-move. */ X { X short f, t; X f = GameList[GameCnt].gmove >> 8; X t = GameList[GameCnt].gmove & 0xFF; X if (board[t] == king && distance (t, f) > 1) (void) castle (GameList[GameCnt].color, f, t, 2); X else X { X /* Check for promotion: */ X if(GameList[GameCnt].flags & promote){board[t] = pawn; } X board[f] = board[t]; X color[f] = color[t]; X board[t] = GameList[GameCnt].piece; X color[t] = GameList[GameCnt].color; X if (color[t] != neutral) Mvboard[t]--; X Mvboard[f]--; X } X if(GameList[GameCnt].flags & epmask)EnPassant(color[t],f,t,2); X if (TCflag) ++TimeControl.moves[color[f]]; X GameCnt--; X computer = otherside[computer]; X opponent = otherside[opponent]; X flag.mate = false; X Sdepth = 0; X InitializeStats (); } X void ShowMessage (char *s) { X fprintf (stderr, "%s\n", s); } X void ShowSidetoMove (void) { } X void PromptForMove (void) { #ifndef CHESSTOOL X printz ("\nYour move is? "); #endif /* CHESSTOOL */ } X X void ShowCurrentMove (short int pnt, short int f, short int t) { #ifdef MSDOS X f++; t++; pnt++; /* shut up the compiler */ #endif /* MSDOS */ } X void ChangeAlphaWindow (void) { X printz ("window: "); X scanz ("%hd", &Awindow); } X void ChangeBetaWindow (void) { X printz ("window: "); X scanz ("%hd", &Bwindow); } X void GiveHint (void) { X algbr ((short) (hint >> 8), (short) (hint & 0xFF), false); X fprintf (stderr, "Hint: %s\n", mvstr[0]); } X void SelectLevel (void) { } X void ChangeSearchDepth (void) { X printz ("depth= "); X scanz ("%hd", &MaxSearchDepth); } X void SetContempt (void) { X printz ("contempt= "); X scanz ("%hd", &contempt); } X void ChangeXwindow (void) { X printz ("xwndw= "); X scanz ("%hd", &xwndw); } X void TestSpeed(void (*f) (short int side, short int ply)) { X short i; X long cnt, rate, t1, t2; X X t1 = time (0); X for (i = 0; i < 10000; i++) X { X f (opponent, 2); X } X t2 = time (0); X cnt = 10000L * (TrPnt[3] - TrPnt[2]); X rate = cnt / (t2 - t1); X printz ("Nodes= %ld Nodes/sec= %ld\n", cnt, rate); } X X int GetNextMove(char *buffer) X { X char current; X X while(true){ X while((current = fgetc(fpin) ) == ' ' || current == '\n'); X if ((current != EOF) && (isdigit(current) || current == '-')) X { while((current = fgetc(fpin) ) != ' ' && current != EOF); X if(current == EOF)return 0; else continue;} X if(current == EOF) return(0); X while(current != ' ' && current != '\n' && current != EOF) { X if(!(current == '-' || current == 'x' || current == 'X')) { *buffer++ = current; } X current = fgetc(fpin); X } X *buffer = '\0'; X return(1); X } X } X void InputCommand(void) /* X Open the file of moves to analyse. Go through the file move by move X and do the following for each move. See what gnuchess would have done X in that position. Record the move it would have made along with the X score it would have given and the search depth. Take back its move. X Force the move that was actually made. Keep track of statistics such X as how many moves agreed. */ X { X int i; X short ok,tmp; X int search_depth, max_minutes; X long cnt,rate,t1,t2; X unsigned short mv; X char s[80]; X char infilename[255]; X char outfilename[255]; X char progfilename[255]; X int move_number = 1; X long start_time, end_time, elapsed_time; X int total_black_moves, total_white_moves; X int same_black_moves, same_white_moves; X float white_percent, black_percent; X X /* Initialize necessary variables. */ X X flag.quit = false; X flag.beep = false; X player = opponent; X enable_update_display = 1; X ft = 0; X Book = NULL; X total_black_moves = 0; X total_white_moves = 0; X same_black_moves = 0; X same_white_moves = 0; X #ifdef BACKGROUND_ANALYSIS X X /* Set the in files to standard ones for analysis if background processing selected. */ X X strcpy(infilename, IN_FILE); X strcpy(outfilename, OUT_FILE); X strcpy(progfilename, PROG_FILE); X fpout = fopen(outfilename, "w"); X if(fpout == NULL) { X fprintf(fpout,"This file does not exist : %s\n", outfilename); X flag.quit = 1; X return; X } X X MaxSearchDepth = MAX_DEPTH; X TCminutes = MAX_TIME; X #else X X /* Request information on where the file is and the depth an time. */ X X fpout = stderr; X fprintf(fpout, "Input the file with the algebraic moves of the game.\n"); X scanf("%s", infilename); X X fprintf(fpout, "\n"); X do { X fprintf(fpout, "Input the search depth you want to use. (1 to 29)\n"); X scanf("%d", &search_depth); X } while(search_depth < 1 || search_depth > 29); X MaxSearchDepth = search_depth; X X fprintf(fpout, "\n"); X do { X fprintf(fpout, "Input the maximun number of minutes per move you want to use.\n"); X scanf("%d", &max_minutes); X } while(max_minutes < 1); X TCminutes = max_minutes; X X fprintf(fpout, "\n\n"); X #endif X X fpin = fopen(infilename, "r"); X if(fpin == NULL) { X fprintf(fpout,"This file does not exist : %s\n", infilename); X flag.quit = 1; X return; X } /* lets find out about this file */ X fgets(InBuf,256,fpin); X InFileType = OTHER; X if(strncmp(InBuf,"xboard",6)){InFileType = XBOARD; fgets(InBuf,256,fpin); fgets(InBuf,256,fpin);} X else if(strncmp(InBuf,"gnuchess",6)){InFileType = GNUCHESS; fgets(InBuf,256,fpin); fgets(InBuf,256,fpin);} X else rewind(fpin); X TCmoves = 1; X TCflag = (TCmoves > 1); X OperatorTime = 0; X SetTimeControl(); X X fpout = stdout; X X fprintf(fpout, "Move White Black Score Depth Best Line\n"); X fprintf(fpout, "------------------------------------------------------------------\n"); X #ifdef BACKGROUND_ANALYSIS X X /* Update progress in the progress file if this is running in the background. */ X X fpprog = fopen(progfilename, "w"); X fprintf(fpprog, "Done with move #%d.\n", move_number-1); X fclose(fpprog); X #endif X X time(&start_time); X while(1) { X opponent = black; X computer = white; X player = computer; X white_moving = 1; X if(!GetNextMove(s)) { X flag.quit = 1; X break; X } X flag.force = 0; X SelectMove(computer,1); X Undo(); X flag.force = 1; X opponent = white; X computer = black; X player = opponent; X ok = VerifyMove(s,0,&mv); X if(!ok) { X fprintf(fpout, "\nBad move. %s Board position is: \n",s); X UpdateDisplay(0, 0, 1, 0); X flag.quit = 1; X break; X } else { X strcpy(white_actual_move, s); X fprintf(fpout, "%3d %-9s %5d%5d ",move_number, white_actual_move, white_score, current_depth); X for (i = 1; MV[i] > 0; i++) X { algbr ((short) (MV[i] >> 8), (short) (MV[i] & 0xFF), false); X printf ("%5s ", mvstr[0]); } X printf("\n"); X fflush(fpout); X move_number++; X total_white_moves++; X if(!strcmp(white_actual_move, white_suggest_move)) same_white_moves++; X Sdepth = 0; X ft = 0; X } X player = computer; X white_moving = 0; X if(!GetNextMove(s)) { X flag.quit = 1; X break; X } X flag.force = 0; X SelectMove(computer,1); X Undo(); X flag.force = 1; X opponent = black; X computer = white; X player = opponent; X ok = VerifyMove(s,0,&mv); X if(!ok) { X fprintf(fpout, "\nBad move. %s Board position is: \n",s); X UpdateDisplay(0, 0, 1, 0); X flag.quit = 1; X break; X } else { X strcpy(black_actual_move, s); X fprintf(fpout, " %-9s%5d%5d ", black_actual_move, black_score, current_depth); X for (i = 1; MV[i] > 0; i++) X { algbr ((short) (MV[i] >> 8), (short) (MV[i] & 0xFF), false); X printf ("%5s ", mvstr[0]); } X printf("\n"); X fflush(fpout); X #ifdef BACKGROUND_ANALYSIS X X /* Update progress in the progress file if this is running in the background. */ X X fpprog = fopen(progfilename, "w"); X fprintf(fpprog, "Done with move #%d.\n", move_number-1); X fclose(fpprog); #else /* fprintf(stderr, "Done with move #%d.\n", move_number-1); */ X #endif X X total_black_moves++; X if(!strcmp(black_actual_move, black_suggest_move)) same_black_moves++; X Sdepth = 0; X ft = 0; X } X } X X white_percent = ((float) same_white_moves) * 100 / (float) total_white_moves; X black_percent = ((float) same_black_moves) * 100 / (float) total_black_moves; X fprintf(fpout, "\n White's percentage was %5.2f%%. Black's percentage was %5.2f%%.\n", white_percent, black_percent); X time(&end_time); X elapsed_time = end_time - start_time; X fprintf(fpout, "\n Elapsed time was %d seconds.\n", elapsed_time); X fclose(fpin); X fclose(fpout); X return; } X SHAR_EOF chmod 0664 gnuan.c || echo 'restore of gnuan.c failed' Wc_c="`wc -c < 'gnuan.c'`" test 21324 -eq "$Wc_c" || echo 'gnuan.c: original size 21324, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= gnuan.hlp ============== if test -f 'gnuan.hlp' -a X"$1" != X"-c"; then echo 'x - skipping gnuan.hlp (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting gnuan.hlp (Text)' sed 's/^X//' << 'SHAR_EOF' > 'gnuan.hlp' && X Gnuan is a program which takes as input a file contianing all of the moves of a chess game in algebraic notation in the following way: X e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 etc... X Run gnuan and it will ask you for the path to the source file, the maximum depth it should analyse a move to and a maximum time per move. The output will go to standard out, but you can always redirect it to a file. X The depth that you specify is in plys or half moves. The time is in minutes. X The file gnuan.c is based on nondsp.c which came with gnuchess. The modifications for gnuan.c were made by: X X Truman Collins X July 1990 X CIS 71121,3343 X tcollins@pdx.mentor.com X If anyone makes any improvements to this, I would appreciate hearing about them. SHAR_EOF chmod 0664 gnuan.hlp || echo 'restore of gnuan.hlp failed' Wc_c="`wc -c < 'gnuan.hlp'`" test 743 -eq "$Wc_c" || echo 'gnuan.hlp: original size 743, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= gnuchess.book ============== if test -f 'gnuchess.book' -a X"$1" != X"-c"; then echo 'x - skipping gnuchess.book (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting gnuchess.book (Text)' sed 's/^X//' << 'SHAR_EOF' > 'gnuchess.book' && ! ! Opening Library for CHESS ! ! Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. ! Copyright (c) 1987 by Stuart Cracraft and John Stanback ! ! This file is part of CHESS. ! ! CHESS is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY. No author or distributor ! accepts responsibility to anyone for the consequences of using it ! or for whether it serves any particular purpose or works at all, ! unless he says so in writing. Refer to the CHESS General Public ! License for full details. ! ! Everyone is granted permission to copy, modify and redistribute ! CHESS, but only under the conditions described in the ! CHESS General Public License. A copy of this license is ! supposed to have been given to you along with CHESS so you ! can know your rights and responsibilities. It should be in a ! file named COPYING. Among other things, the copyright notice ! and this notice must be preserved on all copies. ! ! ! ! Four Knight's Game e2e4 e7e5 g1f3 b8c6 b1c3 g8f6 f1b5 f8b4 o-o o-o d2d3 b4c3 b2c3 d7d6 c1g5 d8e7 f1e1 c6d8 d3d4 d8e6 ! Giuoco Piano e2e4 e7e5 g1f3 b8c6 f1c4 f8c5 d2d3 g8f6 b1c3 d7d6 c1g5 h7h6 g5f6 d8f6 c3d5 f6d8 ! Two Knights Defence e2e4 e7e5 g1f3 b8c6 f1c4 g8f6 f3g5 d7d5 e4d5 c6a5 c4b5 c7c6 d5c6 b7c6 b5e2 h7h6 ! Two Knights Defence -- Max Lange Attack e2e4 e7e5 g1f3 b8c6 f1c4 g8f6 d2d4 e5d4 o-o f8c5 e4e5 d7d5 e5f6 d5c4 f6g7 h8g8 ! Petrov's Defence e2e4 e7e5 g1f3 g8f6 f3e5 d7d6 e5f3 f6e4 d2d4 d6d5 f1d3 f8d6 o-o o-o c2c4 c8g4 c4d5 f7f5 b1c3 b8d7 ! Petrov's Defence e2e4 e7e5 g1f3 g8f6 d2d4 e5d4 e4e5 f6e4 d1d4 d7d5 ! ! Vienna Game e2e4 e7e5 b1c3 f8c5 g1f3 d7d6 d2d4 e5d4 f3d4 g8f6 c1g5 h7h6 g5h4 b1c3 ! e2e4 e7e5 b1c3 b8c6 g1f3 g7g6 d2d4 e5d4 c3d5 f8g7 c1g5 c6e7 f3d4 c7c6 d5c3 h7h6 ! - - - - - - ! ECO C25/1-2 e2e4 e7e5 b1c3 f8c5 f1c4 d7d6 d2d3 c8e6 c4e6 f7f6 d1h5 e7d7 c1e3 c5b6 g1e2 b8c6 o-o g8f6 h5h3 d8e8 ! e2e4 e7e5 b1c3 f8c5 g1f3 d7d6 d2d4 e5d4 f3d4 g8f6 c1g5 h7h6 g5h4 b8c6 d4c6 b7c6 f1d3 e8e7 o-o g7g5 ! ECO C25/3-9 e2e4 e7e5 b1c3 b8c6 f2f4 e5f4 g1f3 g7g5 h2h4 g5g4 f3g5 h7h6 g5f7 e7f7 d2d4 d7d5 c1f4 f8b4 f1e2 b4c3 b2c3 g8f6 ! e2e4 e7e5 b1c3 b8c6 f2f4 e5f4 g1f3 g7g5 d2d4 g5g4 f1c4 g4f3 o-o d7d5 e4d5 c8g4 d1d2 c6e7 d2f4 g8h6 ! e2e4 e7e5 b1c3 b8c6 f2f4 e5f4 d2d4 d8h4 e1e2 d7d5 e4d5 c8g4 g1f3 o-o-o d5c6 f8c5 d1e1 h4h5 c6b7 e8b8 e2d2 g4f3 ! e2e4 e7e5 b1c3 b8c6 f2f4 e5f4 d2d4 d8h4 e1e2 d7d6 g1f3 c8g4 c1f4 o-o-o e2e3 h4h5 f1e2 g7g5 f3g5 f7f5 h2h3 g4e2 ! e2e4 e7e5 b1c3 b8c6 g2g3 f8c5 f1g2 a7a6 g1e2 d7d6 d1d3 c8g4 h2h3 g4e6 o-o g8e7 c3d5 o-o c2c3 c5a7 g1h2 f7f6 ! e2e4 e7e5 b1c3 b8c6 g2g3 f8c5 f1g2 d7d6 c3a4 g8e7 a4c5 d6c5 d2d3 o-o g2e3 b7b6 d1d2 c8e6 g1e2 d8d7 o-o a8d8 ! e2e4 e7e5 b1c3 b8c6 f1c4 f8c5 d1g4 g7g6 d4f3 g8f6 g1e2 d7d6 d2d3 c8g4 f3g3 h7h6 f2f4 d7e7 c3d5 f6d5 g3g4 d5e3 ! ECO C26/1-10 e2e4 e7e5 b1c3 g8f6 g2g3 c7c6 f1g2 d7d6 g1e2 b7b5 o-o b8d7 h2h3 d8c7 g3g4 b5b4 c3b1 a7a5 a2a3 c8a6 a3b4 a5b4 ! e2e4 e7e5 b1c3 g8f6 g2g3 d7d5 e4d5 f6d5 f1g2 c8e6 g1f3 b8c6 o-o f8e7 f1e1 e7f6 c3e4 o-o d2d3 f6e7 a2a3 d5b6 ! e2e4 e7e5 b1c3 g8f6 g2g3 d7d5 e4d5 f6d5 f1g2 d5c3 b2c3 f8d6 g1f3 o-o o-o b8d7 d2d3 a1b8 a2a4 b7b6 a4a5 c8b7 ! e2e4 e7e5 b1c3 g8f6 g2g3 f8b4 f1g2 c7c6 g1e2 o-o o-o d7d5 e4d5 c6d5 d2d4 e5d4 e2d4 b8c6 c1g5 b4e7 f1e1 h7h6 ! e2e4 e7e5 b1c3 g8f6 g2g3 f8c5 f1g2 b8c6 g1e2 d7d6 o-o o-o d2d3 c8e6 c3d5 e6d5 e4d5 c6e7 c1g5 f6d7 d3d4 e5d4 ! e2e4 e7e5 b1c3 g8f6 g2g3 f8c5 f1g2 b8c6 g1f3 d7d6 d2d3 a7a6 o-o o-o c1g5 h7h6 g5e3 c5e3 f2e3 d6d5 e4d5 f6d5 ! e2e4 e7e5 b1c3 g8f6 g2g3 f8c5 f1g2 o-o d2d3 f8e8 g1e2 c7c6 o-o d7d5 e5d5 f6d5 g1h1 c8g4 h2h3 g4e6 c3e4 c5e7 ! e2e4 e7e5 b1c3 g8f6 f1c4 f8b4 g1e2 o-o d2d3 c7c6 o-o d7d5 c4b3 d5e4 c3e4 b8d7 e2g3 f6e4 d3e4 d7c5 d1h5 c5b3 ! e2e4 e7e5 b1c3 g8f6 f1c4 f8c5 d2d3 d7d6 c1g5 c8e6 d1d2 b8d7 g1e2 e6c4 d3c4 h7h6 g5e3 d8e7 e2g3 c5e3 f2e3 g7g6 ! e2e4 e7e5 b1c3 g8f6 f1c4 f8c5 d2d3 d7d6 f2f4 b8c6 f4f5 b6d4 g1f3 c7c6 f3d4 c5d4 d1f3 b7b5 c4b3 a7a5 a2a3 a5a4 ! ECO C27/1-2 e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 h5e5 d8e7 e5e7 f8e7 c4b3 d6f5 c3d5 e7d8 d5e3 f5d4 b3c4 c7c6 g1e2 d4e2 c4e2 d7d5 ! e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 c4b3 b8c6 c3b5 g7g6 h5f3 f7f6 b5c7 d8c7 f3f6 b7b6 g1f3 c8a6 f3e5 c6e5 f6e5 e8d8 ! ECO C27/3-5 e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 c4b3 b8c6 c3b5 g7g6 h5f3 f7f5 f3d5 d8e7 b5c7 e8d8 c7a8 b7b6 d2d3 c8b7 h2h4 f5f4 d5f3 f8h6 b3d5 b7a8 f3g4 h8f8 g1e2 e5e4 c1f4 h6f4 e2f4 e7e5 g4g5 e5g5 ! e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 c4b3 b8c6 c3b5 g7g6 h5f3 f7f5 f3d5 d8e7 b5c7 e8d8 c7a8 b7b6 g1f3 c8b7 d3d4 c6d4 c1g5 d4f3 d5f3 e7g5 b3d5 e5e4 f3b3 b7a6 b3a4 f8h6 a4d4 h8e8 g2g3 g5g4 ! e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 c4b3 b8c6 c3b5 g7g6 h5f3 f7f5 f3d5 d8e7 b5c7 e8d8 c7a8 b7b6 a8b6 a7b6 d5f3 c8b7 d2d3 c6d4 f3h3 e5e4 c1e3 e4d3 o-o-o d4c2 e3b6 d8e8 h3d3 f8h6 c1b1 b7e4 ! ECO C27/6-7 e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 c4b3 f8e7 g1f3 b8c6 f3e5 o-o o-o c6d4 c3d5 d4b3 a2b3 d6e8 h5e2 e8f6 e5c6 d7c6 d5e7 g8h8 e7c8 d8c8 ! e2e4 e7e5 b1c3 g8f6 f1c4 f6e4 d1h5 e4d6 c4b3 f8e7 g1f3 o-o h2h4 b8c6 f3g5 h7h6 h5g6 e7g5 h4g5 d8g5 d2d3 d6f5 c1g5 c6d4 c3d5 d4b3 ! ECO C28/1-7 e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 f2f3 f6e4 g1f3 e4c3 d2c3 d8e7 b2b4 d7d6 o-o c8e6 c4e6 e7e6 b4b5 c6d8 f4e5 d6e5 f3e5 f8d6 ! e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 d2d3 c6a5 g1e2 a5c4 d3c4 d7d6 o-o c8e6 b2b3 c7c6 e2g3 g7g6 h2h3 h7h5 d1d3 f8e7 c1e3 d8d7 ! e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 d2d3 f8c5 c1g5 h7h6 g5h4 d7d6 c3a4 c8e6 a4c5 d6c5 b2b3 e6c4 b3c4 d8d6 g1e2 c6d4 h4f6 ! e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 d2d3 f8b4 g1e2 d7d5 e4d5 f6d5 c4d5 d8d5 o-o d5d8 f2f4 e5f4 c1f4 o-o d1e1 b4d6 e1g3 b6f4 ! e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 d2d3 f8b4 c1g5 d7d6 g1e2 c8e6 o-o h7h6 g5f6 d8f6 c3d5 e6d5 c4d5 b4c5 c2c3 o-o g1h1 c6e7 ! e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 d2d3 f8b4 c1g5 h7h6 g5f6 b4c3 b2c3 d8f6 g1e2 d7d6 d1d2 c1e6 c4b5 f6g5 e2g3 o-o b5c6 b7c6 ! e2e4 e7e5 b1c3 g8f6 f1c4 b8c6 d2d3 f8b4 g1f3 d7d6 o-o b4c3 b2c3 c6a5 c4b3 a5b3 a2b3 o-o c3c4 b7b6 d1e2 f6d7 c1g5 f7f6 ! ECO C29/1 e2e4 e7e5 b1c3 g8f6 f1f4 d7d5 d2d3 e5f4 e4d5 f6d5 c3d5 d8d5 c1f4 f8d6 f4d6 d5d6 d1d2 o-o g1f3 c8g4 f1e2 g4f3 ! ECO C29/2-12 e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 d1f3 b8c6 f1b5 e4c3 b2c3 f8e7 d2d4 o-o b5d3 f7f6 f3h5 g7g6 d3g6 h7g6 h5g6 g8h8 g6h6 h8g8 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 d1f3 f7f5 d2d3 e4c3 b2c3 d5d4 f3g3 b8c6 f1e2 c8e6 e2f3 d8d7 g1e2 f8c5 c3c4 o-o o-o e6c4 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 d2d3 d8h4 g2g3 e4g3 g1f3 h4h5 c3d5 c8g4 f1g2 g3h1 d5c7 e8d7 c7h8 b8c6 c1e3 f7f6 d3d4 f6e5 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 d2d3 f1b4 d3e4 d8h4 e1e2 b8c6 g1f3 c8g4 c3d5 o-o-o c2c3 f7f5 e5f6 h8e8 c3b4 e8e4 c1e3 g7f6 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 d2d3 e4c3 b2c3 d5d4 g1f3 b8c6 c3d4 f8b4 c1d2 b4d2 d1d2 c6d4 c2c3 d4f3 g2f3 d8h4 d2f2 h4f2 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 g1f3 f1b4 d1e2 b4c3 b2c3 o-o e2e3 b8c6 f1d3 f7f5 o-o c8e6 c1a3 f8e8 a1b1 a8b8 a3b5 e6d7 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 g1f3 b8c6 f1b5 f8c5 d2d4 c5b4 c1d2 b4c3 b2c3 o-o o-o c1g4 d1e1 f7f6 d2e3 g4d7 e5f6 d8f6 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 g1f3 f8c5 d1e2 c5f2 e1d1 e4c3 d2c3 f2b6 c3g5 d8d7 d1d2 o-o a1d1 d7a4 a2a3 c7c5 d2c1 c8e6 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 g1f3 c8g4 d1e2 e4g5 h2h4 g5f3 g2f3 g4e6 d2d4 b8c6 c1e3 f8e7 e2f2 d8d7 o-o-o o-o-o f1b5 a7a6 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 g1f3 f8e7 d1e2 e4c3 d2c3 o-o c1f4 c7c5 o-o-o d8a5 c1b1 b8c6 a4b5 c8e6 b5a5 f3g5 ! e2e4 e7e5 b1c3 g8f6 f2f4 d7d5 f4e5 f6e4 g1f3 f8e7 d2d4 o-o f1d3 f7f6 e5f6 e7f6 o-o b8c6 c3e4 d5e4 d3e4 c6d4 f3g5 c8f5 c2c3 f7g5 ! ! Vienna Game e2e4 e7e5 b1c3 f8c5 g1f3 d7d6 d2d4 e5d4 f3d4 g8f6 c1g5 h7h6 g5h4 b1c3 ! Three Knights Game e2e4 e7e5 b1c3 b8c6 g1f3 g7g6 d2d4 e5d4 c3d5 f8g7 c1g5 c6e7 f3d4 c7c6 d5c3 h7h6 ! Bishop's Opening e2e4 e7e5 f1c4 g8f6 d2d4 e5d4 g1f3 f6e4 d1d4 e4c5 o-o c5e6 f1e1 c7c6 b1c3 d7d5 c4d3 f8e7 ! Ruy Lopez -- Classical Defence e2e4 e7e5 g1f3 b8c6 f1b5 f8c5 c2c3 g8f6 d2d4 e5d4 e4e5 f6e4 o-o d7d5 ! Ruy Lopez -- Birds Defence e2e4 e7e5 g1f3 b8c6 f1b5 c6d4 b5a4 f8c5 o-o d4f3 d1f3 g8e7 d2d3 o-o c1e3 c5b6 b1c3 d7d6 ! Ruy Lopez -- Schliemann Defence e2e4 e7e5 g1f3 b8c6 f1b5 f7f5 b1c3 f5e4 c3e4 d7d5 f3e5 d5e4 e5c6 d8d5 c2c4 d5d6 c6a7 c8d7 ! Ruy Lopez -- Old Steinitz Defence e2e4 e7e5 g1f3 b8c6 f1b5 d7d6 d2d4 c8d7 b1c3 g8f6 o-o f8e7 f1e1 e5d4 f3d4 o-o d4f5 f8e8 ! Ruy Lopez -- Old Steinitz Defence e2e4 e7e5 g1f3 b8c6 f1b5 d7d6 d2d4 c8d7 b1c3 g8f6 b5c6 d7c6 d1d3 e5d4 f3d4 f8e7 c1g5 c6d7 ! Ruy Lopez -- Modern Steinitz Defence e2e4 e7e5 g1f3 b8c6 f1b5 a7a6 b5a4 d7d6 d2d4 b7b5 a4b3 c6d4 f3d4 e5d4 c2c3 d4c3 b1c3 c8b7 ! Ruy Lopez -- Open Defence e2e4 e7e5 g1f3 b8c6 f1b5 a7a6 b5a4 g8f6 o-o f6e4 d2d4 b7b5 a4b3 d7d5 d4e5 c8e6 c2c3 f8c5 b1d2 o-o ! Ruy Lopez -- Open Defence e2e4 e7e5 g1f3 b8c6 f1b5 a7a6 b5a4 g8f6 o-o f8e7 f1e1 b7b5 a4b3 d7d6 c2c3 o-o h2h3 c6a5 b3c2 c2c4 d2d4 d8c7 ! Ruy Lopez e2e4 e7e5 g1f3 b8c6 f1b5 a7a6 b5c6 d7c6 d2d4 e5d4 d1d4 d8d4 f3d4 c8d7 c1e3 o-o-o b1d2 g8e7 ! Scotch Game e2e4 e7e5 g1f3 b8c6 d2d4 e5d4 f3d4 f8c5 c1e3 d8f6 c2c3 g8e7 b1d2 d7d6 e3c5 d6c5 ! Philidor's Defence e2e4 e7e5 g1f3 d7d6 d2d4 g8f6 b8c6 b1d2 f8c5 f1e2 o-o o-o d1e2 c7c6 ! Alekhine's Defence e2e4 g8f6 e4e5 f6d5 c2c4 d5b6 d2d4 d7d6 f2f4 d6e5 f4e5 b8c6 c1e3 c8f5 b1c3 e7e6 g1f3 f8e7 ! Alekhine's Defence e2e4 g8f6 e4e5 f6d5 d2d4 d7d6 g1f3 c8g4 f1e2 e7e6 o-o f8e7 h2h3 g4h5 c2c4 d5b6 ! Kings Gambit Accepted e2e4 e7e5 f2f4 e5f4 g1f3 d7d6 f1c4 h7h6 d2d4 g7g5 o-o f8g7 c2c3 b8c6 d1b3 d8e7 ! Ponziani's Opening e2e4 e7e5 g1f3 b8c6 c2c3 d7d5 d1a4 g8f6 f3e5 f8d6 e5c6 b7c6 d2d3 o-o c1g5 h7h6 ! Caro-Kann Defence e2e4 c7c6 d2d4 d7d5 e4d5 c6d5 c2c4 g8f6 b1c3 b8c6 c1g5 e7e6 c4c5 f8e7 f1b5 o-o g1f3 f6e4 ! Caro-Kann Defence e2e4 c7c6 d2d4 d7d5 e4e5 c8f5 f1d3 f5d3 d1d3 e7e6 b1c3 d8b6 b1d2 c6c5 d4c5 f8c5 ! Caro-Kann Defence e2e4 c7c6 b1c3 d7d5 g1f3 c8g4 h2h3 g4f3 d1f3 e7e6 d2d4 g8f6 f1d3 d5e4 c3e4 d8d4 c2c3 d4d8 ! French Defence -- Classical e2e4 e7e6 d2d4 d7d5 b1c3 g8f6 c1g5 f8e7 e4e5 f6d7 g5e7 d8e7 d1d2 o-o f2f4 c7c5 g1f3 b8c6 o-o-o c5c4 ! French Defence -- MacCutcheon e2e4 e7e6 d2d4 d7d5 b1c3 g8f6 c1g5 c8g4 e4e5 h7h6 g5d2 g4f3 g2f3 f6e4 d1g4 e8f8 h2h4 c7c5 ! French Defence -- Rubenstein e2e4 e7e6 d2d4 d7d5 b1c3 d5e4 c3e4 b8d7 g1f3 g8f6 e4f6 d7f6 f1d3 b7b6 d1e2 c8b7 c1g5 f8e7 ! French Defence -- Winawer e2e4 e7e6 d2d4 d7d5 b1c3 f8b4 e4e5 c7c5 a2a3 b4c3 b2c3 b8d7 d1g4 o-o g1f3 b8c6 f1e3 f7f5 ! French Defence -- Tarrasch e2e4 e7e6 d2d4 d7d5 b1d2 b8c6 g1f3 g8f6 e4e5 f6d7 d2b3 f7f6 f1b5 f8e7 c1f4 o-o ! Sicilian Defence -- Dragon Variation e2e4 c7c5 g1f3 b8c6 d2d4 c5d4 f3d4 g8f6 b1c3 d7d6 f1e2 g7g6 c1e3 f8g7 o-o o-o d4b3 c8e6 f2f4 c6a5 f4f5 e6c4 ! Sicilian Defence -- Dragon Variation e2e4 c7c5 g1f3 b8c6 d2d4 c5d4 f3d4 g7g6 b1c3 f8g7 c1e3 g8f6 f1c4 o-o ! Sicilian Defence -- Boleslavsky Variation e2e4 c7c5 g1f3 b8c6 d2d4 c5d4 f3d4 g8f6 b1c3 d7d6 f1e2 e7e5 d4b3 f8e7 o-o o-o c1e3 c8e6 ! Sicilian Defence -- Najdorf e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 d1d2 f8e7 o-o-o o-o ! Sicilian Defence -- Najdorf e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 f1e2 e7e5 d4b3 f8e7 o-o o-o f2f4 b7b5 a2a3 c8b7 ! Sicilian Defence -- Najdorf e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 g2g3 e7e5 d4e2 c8e6 f1g2 b7b5 o-o b8d7 ! Sicilian Defence -- Closed e2e4 c7c5 b1c3 b8c6 g2g3 g7g6 f1g2 f8g7 d2d3 e7e6 c1e3 d7d6 g1e2 c6d4 d1d2 d8h4 o-o g8d7 ! Nimzowitsch Defence e2e4 b8c6 d2d4 d7d5 e4e5 f7f6 g1f3 c1g4 f1e2 e7e6 e5f6 g8f6 c2c3 f8d6 c1g5 d8d7 ! Queens Gambit Accepted d2d4 d7d5 c2c4 d5c4 g1f3 g8f6 e2e3 e7e6 f1c4 c7c5 o-o a7a6 d1e2 b7b5 c4d3 c5d4 e3d4 b8c6 ! Queens Gambit -- Catalan d2d4 d7d5 c2c4 e7e6 g2g3 g8f6 g1f3 f8e7 f1g2 o-o o-o f6d7 d1c2 c7c6 b1d2 b7b6 e2e4 c8b7 b2b3 a8c8 ! Queens Gambit Declined -- Orthodox d2d4 d7d5 c2c4 e7e6 b1c3 g8f6 c1g5 f8e7 e2e3 o-o g1f3 b8d7 a1c1 c7c6 f8d3 d5c4 f1c4 f6d5 ! Queens Gambit Declined -- Cambridge Springs d2d4 d7d5 c2c4 e7e6 b1c3 g8f6 c1g5 b8d7 e2e3 c7c6 g1f3 d8a5 f3d2 f8b4 d1c2 o-o g5h4 c6c5 ! Queens Gambit Declined -- Exchange Var. d2d4 d7d5 c2c4 e7e6 b1c3 g8f6 c1g5 b8d7 c4d5 e6d5 e2e3 c7c6 f1d3 f8e7 d1c2 o-o g1e2 f8e8 ! Queens Gambit Declined -- Semi-Tarrasch d2d4 d7d5 c2c4 e7e6 b1c3 g8f6 g1f3 c7c5 c4d5 c5d4 d1d4 e6d5 e2e4 b8c6 f1b5 f6e4 ! Queens Gambit Declined -- Tarrasch d2d4 d7d5 c2c4 e7e6 b1c3 c7c5 c4d5 e6d5 g1f3 b8c6 g2g3 g8f6 f1g2 f8e7 o-o o-o ! Queens Gambit Declined -- Vienna d2d4 d7d5 c2c4 e7e6 g1f3 g8f6 f1b5 f8b4 b1c3 d5c4 e2e4 c7c5 e4e5 c5d4 d1a4 b8c6 o-o-o c1d2 ! Queens Gambit Declined -- Slav (Marshall Gambit) d2d4 d7d5 c2c4 c7c6 b1c3 e7e6 e2e4 d4e4 c3e4 f8b4 c1d2 d8d4 d2b4 d4e4 f1e2 b8a6 b4d6 b7b6 ! Queens Gambit --Slav (Krause) d2d4 d7d5 c2c4 c7c6 g1f3 g8f6 b1c3 d5c4 a2a4 c8f5 f3e5 e7e6 f2f3 f8b4 c1g5 h7h6 g5f6 d8f6 e2e4 f5h7 ! Mach 3 Opening. Var 1 (3. g5h4) d2d4 g8f6 c1g5 f6e4 g5h4 g7g5 f2f3 g5h4 f3e4 c7c5 e2e3 d8b6 b2b3 b8c6 g1f3 f8h6 d1d3 c6b4 d3c3 c5d4 ! Mach 3 Opening. Var 2 (3. g5f4) d2d4 g8f6 c1g5 f6e4 g5f4 d7d5 f2f3 e4f6 e2e4 d5e4 b1c3 f6e4 c3e4 d8d5 c2c4 d5a5 f4d2 a5f5 f3f4 b8c6 ! Mach 3 Opening. Var 2a (5. b1c3) d2d4 g8f6 c1g5 f6e4 g5f4 d7d5 f2f3 e4f6 b1c3 e7e6 f4g5 f8g7 g1h3 o-o e2e3 c7c5 h3f2 c5d4 e3d4 b8c6 ! Mach 3 (Avoid Queen trap) d2d4 g8f6 c1g5 f6e4 g5h4 g7g5 f2f3 g5h4 f3e4 c7c5 e2e3 d8b6 g1f3 b6b2 b1d2 f8g7 ! Modern Benoni Counter Gambit d2d4 g8f6 c2c4 c7c5 d4d5 e7e6 b1c3 e6d5 c4d5 d7d6 e2e4 g7g6 f1d3 f8g7 g1e2 o-o o-o a7a6 a2a4 d8c7 ! Queens Pawn Game d2d4 d7d5 g1f3 g8f6 c1f4 c7c5 e2e3 b8c6 c2c3 d8b6 d1c1 c8f5 d4c5 b6c5 b1d2 a8c8 f3d4 c6d4 e3d4 c5b6 ! Pirc-Robatsch Defence d2d4 d7d6 e2e4 g8f6 b1c3 g7g6 c1g5 f8g7 d1d2 b8d7 o-o-o e7e5 d4e5 d6e5 g1f3 h7h6 g5h4 g6g5 h4g3 d8e7 ! Pirc-Robatsch Defence d2d4 d7d6 e2e4 g8f6 b1c3 g7g6 f1c4 c7c6 d1e2 f8g7 g1f3 o-o c1g5 b7b5 c4d3 d8c7 ! Queens Indian Defence d2d4 g8f6 c2c4 e7e6 g1f3 b7b6 g2g3 c8b7 f1g2 f8e7 o-o o-o b1c3 f6e4 d1c2 e4c3 c2c3 d7d6 c3c2 f7f5 ! Queens Indian Defence d2d4 g8f6 c2c4 e7e6 g1f3 b7b6 e2e3 c8b7 f1d3 f8e7 b1c3 d7d5 o-o o-o d1e2 b8d7 ! Nimzo-Indian Defence d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 d1c2 d7d5 a2a3 b4c3 c2c3 b8c6 g1f3 f6e4 c3b3 c6a5 b3a4 c7c6 ! Nimzo-Indian Defence (Rubenstein) d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 e2e3 o-o f1d3 d7d5 g1f3 c7c5 o-o b8c6 a2a3 b4c3 b2c3 d5c4 d3c4 d8c7 ! Nimzo-Indian Defence -- Samisch d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 a2a3 b4c3 b2c3 o-o f2f3 d7d5 c4d5 e6d5 e2e3 c8f5 g1e2 b8d7 e2g3 f5g6 ! Nimzo-Indian Defence d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 c1d2 o-o e2e3 d7d5 g1f3 c7c5 a2a3 b4c3 d2c3 f6e4 a1c1 e4c3 c1c3 c5d4 ! Grunfeld Defence d2d4 g8f6 c2c4 g7g6 b1c3 d7d5 c4d5 f6d5 e2e4 d5c3 b2c3 c7c5 f1c4 f8g7 g1e2 o-o o-o c5d4 c3d4 b8c6 ! Grunfeld Defence -- Smyslov d2d4 g8f6 c2c4 g7g6 b1c3 d7d5 g1f3 f8g7 d1b3 d5c4 b3c4 o-o e2e4 c8g4 c1e3 f6d7 o-o-o b8c6 ! Grunfeld Defence d2d4 g8f6 c2c4 g7g6 b1c3 d7d5 c1f4 f8g7 d2d3 o-o c4d5 f6d5 c3d5 d8d5 f4c7 b8c6 ! Kings Indian Defence -- Classical d2d4 g8f6 c2c4 g7g6 b1c3 f8g7 e2e4 d7d6 g1f3 o-o f1e2 e7e5 o-o b8c6 c1e3 f8e8 d4e5 d6e5 ! Kings Indian Defence -- 4 pawns attack d2d4 g8f6 c2c4 g7g6 b1c3 f8g7 e2e4 d7d6 f2f4 c7c5 g1f3 o-o d4d5 e7e6 f1d3 e6d5 c4d5 d8b6 ! Kings Indian Defence -- Samisch d2d4 g8f6 c2c4 g7g6 b1c3 f8g7 e2e4 d7d6 f2f3 o-o c1e3 e7e5 d4d5 c7c6 g1e2 c6d5 c3d5 f6d5 ! Kings Indian Defence -- Main Line d2d4 g8f6 c2c4 g7g6 g2g3 f8g7 f1g2 o-o b1c3 d7d6 g1f3 b8d7 o-o e7e5 e2e4 c7c6 h2h3 d8b6 ! Kings Indian Defence d2d4 g8f6 c2c4 g7g6 b1c3 f8g7 g1f3 o-o c1f4 d7d6 h2h3 b8d7 e2e3 c7c6 ! Dutch Defence d2d4 f7f5 g2g3 e7e6 f1g2 g8f6 g1f3 f8e7 o-o o-o c2c4 d7d6 b1c3 d8e8 d1c2 e8h5 b2b3 b8c6 c1a3 a7a5 ! English Opening c2c4 e7e5 b1c3 g8f6 g1f3 b8c6 e2e4 f8b4 d2d3 d7d6 f1e2 o-o o-o b4c3 b2c3 d8e7 ! English Opening c2c4 g8f6 b1c3 d7d5 c4d5 f6d5 e2e4 d5f4 f1c4 c8e6 c4e6 f7e6 ! English Opening c2c4 e7e5 b1c3 g8f6 g1f3 b8c6 g2g3 d7d5 c4d5 f6d5 f1g2 d5b6 o-o f8e7 d2d3 o-o c1e3 f7f5 ! Reti -- Accepted g1f3 d7d5 c2c4 d5c4 e2e3 c7c5 f1c4 e7e6 o-o g8f6 b2b3 b8c6 c1b2 a7a6 a2a4 f8e7 ! Reti -- Neo Catalan g1f3 d7d5 c2c4 e7e6 g2g3 g8f6 f1g2 f8e7 o-o o-o b2b3 c7c5 c4d5 f6d5 c1b2 b8c6 d2d4 b7b6 b1c3 d5c3 ! Reti -- Barcza g1f3 d7d5 g2g3 g8f6 f1g2 g7g6 o-o f8g7 d2d3 o-o b1d2 b8c6 e2e4 e7e5 c2c3 a7a5 f1e1 d5e4 d3e4 f6d7 ! Sicilian Najdorf e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 e4e5 d6e5 f4e5 f6d7 c3e4 h7h6 g5h4 a3a2 b1b3 b8c6 d4c6 b7c6 e4d6 f8d6 e5d6 a6a5 f1e2 a5a4 b3c3 a2a1 e2d1 a4a3 o-o a3a2 d2e3 o-o ! # Sicilian Defense col. 2f p. 176 MCO 12. (Incomplete game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 e4e5 d6e5 f4e5 f6d7 f1c4 f8b4 b1b3 a3a5 o-o o-o g5f6 d7f6 e5f6 f8d8 b3b4 a5b4 d2g5 g7g6 f1f4 b7b6 f4h4 b4f8 g1f1 a8a7 ! # Sicilian Defense col. 3g p. 176 MCO (Incomplete Game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 e4e5 d6e5 f4e5 f6d7 f1c4 a3a5 c4e6 f7e6 d4e6 d7e5 c3d5 a5d2 e1d2 e8d7 e6c7 a8a7 h1e1 e5c4 ! # Parma vs. Fischer, Havana 1965. Sicilian Defense col. 4j p. 176 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 g5f6 g7f6 f1e2 f8g7 o-o f6f5 f1d1 b8c6 d4c6 g7c3 d2e3 b7c6 b1b3 a3c5 e3c5 d6c5 b3c3 f5e4 c3c5 c8d7 c5e5 f7f5 g2g4 h8g8 g1g2 f5g4 e5e4 h7h5 g2g3 e8e7 ! # Matanovic, Sicilian Defense col. 5k p. 176 MCO (partial game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 g5f6 g7f6 f1e2 b8c6 d4c6 b7c6 o-o a3a5 g1h1 f8e7 f4f5 e6f5 e4f5 c8f5 e2a6 a5a6 f1f5 d6d5 b1e1 a6b7 d2h6 o-o-o h6h3 b7d7 c3a4 ! # col. 6a e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 f4f5 b8c6 f5e6 f7e6 d4c6 b7c6 e4e5 d6e5 g5f6 g7f6 c3e4 f8e7 f1e2 h7h6 c2c4 f6f5 b1b3 a3a4 o-o f5e4 g1h1 c6c5 d2c3 a4c6 c3e5 h8f8 ! # col. 7d e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 a1b1 b2a3 f4f5 b8c6 f5e6 f7e6 d4c6 b7c6 e4e5 f6d5 c3d5 c6d5 f1e2 d6e5 o-o a8a7 g1h1 a3c5 c2c4 d5d4 e2h5 g7g6 h5d1 f8e7 d1a4 e8d8 f1f7 h7h6 g5h6 e5e4 ! # col. 8 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 d4b3 b8d7 g5f6 g7f6 f1e2 h7h5 o-o b2a3 a1d1 f8e7 g1h1 d7c5 e2f3 a8a7 b3c5 a3c5 ! # col. 9g; Minic-Barczay, Varna 1967 (partial game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 d4b3 b8c6 f1d3 d6d5 g5f6 g7f6 c3a4 b2a3 a4b6 d5d4 o-o a8b8 f4f5 a3b4 d2b4 f8b4 b6c8 b8c8 f5e6 f7e6 f1f6 e8e7 a1f1 c6e5 ! # col. 10i; Matulovic-Kavalek, Sousse 1967 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d1d2 b6b2 d4b3 b8c6 a1b1 b2a3 g5f6 g7f6 f1d3 f8g7 o-o o-o f1f3 g8h8 f3h3 c6e7 f4f5 e6f5 e4f5 c8f5 d3f5 e7f5 c3d5 ! # col. 11b; Joppen-Bronstein, Belgrade 1954 (partial game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d4b3 b6e3 d1e2 e3e2 f1e2 b8d7 a2a4 f8e7 o-o-o h7h6 g5h4 e6e5 f4f5 b7b6 e2f3 c8b7 ! # col. 12e; Rajkovic-Udovcic, Yugoslav Chp. 1962 (partial game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 d8b6 d4b3 b8d7 d1f3 f8e7 o-o-o b6c7 f1d3 h7h6 g5h4 g7g5 f4g5 d7e5 f3e2 f6g4 b3d4 h6g5 h4g3 c8d7 d4f3 c7c5 ! # col. 13i; Fischer-Vukovic (partial game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 f8e7 d1f3 d8c7 o-o-o b8d7 g2g4 b7b5 g5f6 d7f6 g4g5 f6d7 a2a3 a8b8 h2h4 b5b4 a3b4 b8b4 f1h3 o-o d4e6 f7e6 h3e6 g8h8 c3d5 c7c4 e6f5 f8f5 e4f5 c8b7 h1e1 e7f8 ! # col. 14m Parma-Tatai, Athens 1968 (partial game) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 b7b5 e4e5 d6e5 f4e5 d8c7 e5f6 c7e5 f1e2 e5g5 d1d3 a8a7 c3e4 g5e5 d4f3 e5b2 o-o a7d7 d3e3 c8b7 a1b1 b2c2 f3g5 c2c6 f6g7 f8g7 ! # col. 15; slight advantage for white. e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 f2f4 h7h6 g5h4 d8b6 d1d3 b6b2 a1b1 b2a3 e4e5 f6d5 c3d5 a3d3 f1d3 e6d5 e5e6 ! # col. 16c; Fichtl-Dolezal, CSSR 1954 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 d1f3 b8d7 o-o-o d8c7 f3g3 b7b5 f1b5 a6b5 d4b5 c7b8 b5d6 f8d6 g3d6 b8d6 d1d6 h7h6 g5f6 d7f6 h1d1 c8b7 f2f3 ! # col. 17e; Vasyukov-Zukharov, USSR 1960 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 e7e6 d1d2 b8c6 o-o-o h7h6 g5h4 f6e4 d2f4 e4g5 d4c6 b7c6 f4a4 d8b6 f2f4 g5h7 f4f5 a8b8 f5e6 c8e6 f1c4 ! # col. 18g (somewhat questionable) e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 c1g5 b8d7 f1c4 d8a5 d1d2 e7e6 o-o-o b7b5 c4b3 c8b7 h1e1 a8c8 e4e5 d7e5 d4e6 f7e6 e1e5 d6e5 g5f6 ! # col. 19m; Yanofsky-Bolbochan, Stockholm 1962 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 f1e2 e7e5 d4b3 f8e7 o-o o-o f2f4 b7b5 a2a3 c8b7 e2f3 b8d7 g2g3 a8c8 d1e1 d7b6 g1h1 b6c4 b3d2 d8d7 d2c4 c8c4 c1d2 d6d5 ! # col. 20p e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 f1e2 e7e5 d4b3 f8e7 o-o o-o c1e3 b8d7 a2a4 b7b6 d1d2 c8b7 f2f3 d8c7 f1d1 f8c8 b3c1 ! # col. 21b e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 g2g3 e7e5 d4e2 f8e7 f1g2 o-o o-o b7b5 h2h3 c8b7 c3d5 f6d5 e4d5 b8d7 a2a4 d7c5 e2c3 d8d7 a4b5 a6b5 a1a8 f8a8 ! # col. 22 e2e4 c7c5 g1f3 d7d6 d2d4 c5d4 f3d4 g8f6 b1c3 a7a6 SHAR_EOF true || echo 'restore of gnuchess.book failed' fi echo 'End of part 2' echo 'File gnuchess.book is continued in part 3' echo 3 > _shar_seq_.tmp exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.