version 1.4.30b
[polyglot.git] / piece.c
diff --git a/piece.c b/piece.c
new file mode 100644 (file)
index 0000000..82ed76a
--- /dev/null
+++ b/piece.c
@@ -0,0 +1,203 @@
+\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