--- /dev/null
+\r
+// piece.c\r
+\r
+// includes\r
+\r
+#include <string.h>\r
+\r
+#include "colour.h"\r
+#include "piece.h"\r
+#include "util.h"\r
+\r
+// "constants"\r
+\r
+static const uint8 MakePawn[ColourNb] = { PieceNone256, BlackPawn256, WhitePawn256 }; // -BW\r
+\r
+static const uint8 PieceFrom12[12] = {\r
+ BlackPawn256, WhitePawn256,\r
+ BlackKnight256, WhiteKnight256,\r
+ BlackBishop256, WhiteBishop256,\r
+ BlackRook256, WhiteRook256,\r
+ BlackQueen256, WhiteQueen256,\r
+ BlackKing256, WhiteKing256,\r
+};\r
+\r
+static const char PieceString[12+1] = "pPnNbBrRqQkK";\r
+\r
+// variables\r
+\r
+static sint8 PieceTo12[256];\r
+\r
+// functions\r
+\r
+// piece_init()\r
+\r
+void piece_init() {\r
+\r
+ int piece;\r
+\r
+ for (piece = 0; piece < 256; piece++) PieceTo12[piece] = -1;\r
+\r
+ for (piece = 0; piece < 12; piece++) {\r
+ PieceTo12[PieceFrom12[piece]] = piece;\r
+ }\r
+}\r
+\r
+// piece_is_ok()\r
+\r
+bool piece_is_ok(int piece) {\r
+\r
+ if (piece < 0 || piece >= 256) return FALSE;\r
+\r
+ if (PieceTo12[piece] < 0) return FALSE;\r
+\r
+ return TRUE;\r
+}\r
+\r
+// piece_make_pawn()\r
+\r
+int piece_make_pawn(int colour) {\r
+\r
+ ASSERT(colour_is_ok(colour));\r
+\r
+ return MakePawn[colour];\r
+}\r
+\r
+// piece_pawn_opp()\r
+\r
+int piece_pawn_opp(int piece) {\r
+\r
+ ASSERT(piece==BlackPawn256||piece==WhitePawn256);\r
+\r
+ return piece ^ 15;\r
+}\r
+\r
+// piece_colour()\r
+\r
+int piece_colour(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return piece & 3;\r
+}\r
+\r
+// piece_type()\r
+\r
+int piece_type(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return piece & ~3;\r
+}\r
+\r
+// piece_is_pawn()\r
+\r
+bool piece_is_pawn(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & PawnFlags) != 0;\r
+}\r
+\r
+// piece_is_knight()\r
+\r
+bool piece_is_knight(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & KnightFlag) != 0;\r
+}\r
+\r
+// piece_is_bishop()\r
+\r
+bool piece_is_bishop(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & QueenFlags) == BishopFlag;\r
+}\r
+\r
+// piece_is_rook()\r
+\r
+bool piece_is_rook(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & QueenFlags) == RookFlag;\r
+}\r
+\r
+// piece_is_queen()\r
+\r
+bool piece_is_queen(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & QueenFlags) == QueenFlags;\r
+}\r
+\r
+// piece_is_king()\r
+\r
+bool piece_is_king(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & KingFlag) != 0;\r
+}\r
+\r
+// piece_is_slider()\r
+\r
+bool piece_is_slider(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return (piece & QueenFlags) != 0;\r
+}\r
+\r
+// piece_to_12()\r
+\r
+int piece_to_12(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return PieceTo12[piece];\r
+}\r
+\r
+// piece_from_12()\r
+\r
+int piece_from_12(int piece) {\r
+\r
+ ASSERT(piece>=0&&piece<12);\r
+\r
+ return PieceFrom12[piece];\r
+}\r
+\r
+// piece_to_char()\r
+\r
+int piece_to_char(int piece) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+\r
+ return PieceString[piece_to_12(piece)];\r
+}\r
+\r
+// piece_from_char()\r
+\r
+int piece_from_char(int c) {\r
+\r
+ const char * ptr;\r
+\r
+ ptr = strchr(PieceString,c);\r
+ if (ptr == NULL) return PieceNone256;\r
+\r
+ return piece_from_12(ptr-PieceString);\r
+}\r
+\r
+// char_is_piece()\r
+\r
+bool char_is_piece(int c) {\r
+\r
+ return strchr("PNBRQK",c) != NULL;\r
+}\r
+\r
+// end of piece.cpp\r
+\r