*** gnuchess-4.0.pl77/src/game.c Sun May 19 21:39:37 1996 --- gnuchess-4.0.pl77/src/game.c.s-max Wed Jan 27 21:14:20 1999 *************** *** 36,41 **** --- 36,45 ---- #include #include #endif /* MSDOS */ + + #define MOVE2FROM(mv) (((mv) >> 8) & 0x7F) + #define MOVE2TO(mv) ((mv) & 0x7F) + FILE *fd; #define truescore 0x0001 *************** *** 78,84 **** void skip () { ! while (*InPtr != ' ') InPtr++; while (*InPtr == ' ') InPtr++; --- 82,88 ---- void skip () { ! while (*InPtr && (*InPtr != ' ')) InPtr++; while (*InPtr == ' ') InPtr++; *************** *** 205,210 **** --- 209,243 ---- mvstr[0][0] = mvstr[1][0] = mvstr[2][0] = mvstr[3][0] = '\0'; } + static void + readMove (int side, UTSHORT * flags) + { + int f, t; + struct GameRec * const g = &GameList[++GameCnt]; + + g->gmove = parser (InPtr, side, flags); + skip (); + g->score = atoi (InPtr); + skip (); + g->depth = atoi (InPtr); + skip (); + g->nodes = atol (InPtr); + skip (); + g->time = atol (InPtr); + g->flags = *flags; + + /* Now ensure that (from, to) are in range so we can assume that later. */ + f = MOVE2FROM(g->gmove); + t = MOVE2TO(g->gmove); + + if ((f < 0) || (f > 63) || (t < 0) || (t > 63)) + { + printf ("From/to out of range in move %d: f = %d, t = %d.\n", + GameCnt, f, t); + exit (1); + } + } + void GetGame () { *************** *** 215,254 **** fgets (fb, 256, fd); while (fgets (fb, 256, fd)) { - struct GameRec *g; int side = white; side = otherside[side]; if (fb[0] == '\n') return; - ++GameCnt; InPtr = fb; skipb (); - g = &GameList[GameCnt]; - g->gmove = parser (InPtr, side, &flags); - skip (); - g->score = atoi (InPtr); - skip (); - g->depth = atoi (InPtr); - skip (); - g->nodes = atol (InPtr); - skip (); - g->time = atol (InPtr); - g->flags = flags; - skip (); - ++GameCnt; - g = &GameList[GameCnt]; - g->gmove = parser (InPtr, side, &flags); - skip (); - g->score = atoi (InPtr); - skip (); - g->depth = atoi (InPtr); - skip (); - g->nodes = atol (InPtr); - skip (); - g->time = atol (InPtr); - g->flags = flags; } } SHORT xside, side; --- 248,264 ---- fgets (fb, 256, fd); while (fgets (fb, 256, fd)) { int side = white; side = otherside[side]; if (fb[0] == '\n') return; InPtr = fb; skipb (); + readMove (side, &flags); + skip (); + readMove (side, &flags); } } SHORT xside, side; *************** *** 266,273 **** * should really check the moves as we do this, but??? */ mv = GameList[mvno].gmove; ! f = mv >> 8 & 0x7F; ! t = mv & 0xFF; /* can only capture other side */ if (board[t] != no_piece) { --- 276,283 ---- * should really check the moves as we do this, but??? */ mv = GameList[mvno].gmove; ! f = MOVE2FROM(mv); ! t = MOVE2TO(mv); /* can only capture other side */ if (board[t] != no_piece) { *************** *** 397,404 **** /* decode flags */ printf ("L V moveto\n"); mv = GameList[i].gmove; ! from = mv >> 8 & 0x7F; ! to = mv & 0x7F; algbr (from, to, 0); if (i % 2) printf ("R (%d %s score %d time %d", (i + 1) / 2, mvstr[0], GameList[i].score, GameList[i].time); --- 407,414 ---- /* decode flags */ printf ("L V moveto\n"); mv = GameList[i].gmove; ! from = MOVE2FROM(mv); ! to = MOVE2TO(mv); algbr (from, to, 0); if (i % 2) printf ("R (%d %s score %d time %d", (i + 1) / 2, mvstr[0], GameList[i].score, GameList[i].time);