version 1.4.30b
[polyglot.git] / square.c
diff --git a/square.c b/square.c
new file mode 100644 (file)
index 0000000..f5a0fe9
--- /dev/null
+++ b/square.c
@@ -0,0 +1,246 @@
+\r
+// square.c\r
+\r
+// includes\r
+\r
+#include "colour.h"\r
+#include "square.h"\r
+#include "util.h"\r
+\r
+// "constants"\r
+\r
+static const uint8 SquareFrom64[64] = {\r
+   A1, B1, C1, D1, E1, F1, G1, H1,\r
+   A2, B2, C2, D2, E2, F2, G2, H2,\r
+   A3, B3, C3, D3, E3, F3, G3, H3,\r
+   A4, B4, C4, D4, E4, F4, G4, H4,\r
+   A5, B5, C5, D5, E5, F5, G5, H5,\r
+   A6, B6, C6, D6, E6, F6, G6, H6,\r
+   A7, B7, C7, D7, E7, F7, G7, H7,\r
+   A8, B8, C8, D8, E8, F8, G8, H8,\r
+};\r
+\r
+// variables\r
+\r
+static sint8 SquareTo64[SquareNb];\r
+\r
+// functions\r
+\r
+// square_init()\r
+\r
+void square_init() {\r
+\r
+   int sq;\r
+\r
+   for (sq = 0; sq < SquareNb; sq++) SquareTo64[sq] = -1;\r
+\r
+   for (sq = 0; sq < 64; sq++) {\r
+      SquareTo64[SquareFrom64[sq]] = sq;\r
+   }\r
+}\r
+\r
+// square_is_ok()\r
+\r
+bool square_is_ok(int square) {\r
+\r
+   if (square < 0 || square >= SquareNb) return FALSE;\r
+\r
+   if (SquareTo64[square] < 0) return FALSE;\r
+\r
+   return TRUE;\r
+}\r
+\r
+// square_make()\r
+\r
+int square_make(int file, int rank) {\r
+\r
+   int sq_64;\r
+\r
+   ASSERT(file>=0&&file<8);\r
+   ASSERT(rank>=0&&rank<8);\r
+\r
+   sq_64 = (rank << 3) | file;\r
+\r
+   return square_from_64(sq_64);\r
+}\r
+\r
+// square_file()\r
+\r
+int square_file(int square) {\r
+\r
+   int file;\r
+\r
+   ASSERT(square_is_ok(square));\r
+\r
+   file = (square - 4) & 7;\r
+   ASSERT(file==(square_to_64(square)&7));\r
+\r
+   return file;\r
+}\r
+\r
+// square_rank()\r
+\r
+int square_rank(int square) {\r
+\r
+   int rank;\r
+\r
+   ASSERT(square_is_ok(square));\r
+\r
+   rank = (square >> 4) - 2;\r
+   ASSERT(rank==square_to_64(square)>>3);\r
+\r
+   return rank;\r
+}\r
+\r
+// square_side_rank()\r
+\r
+int square_side_rank(int square, int colour) {\r
+\r
+   int rank;\r
+\r
+   ASSERT(square_is_ok(square));\r
+   ASSERT(colour_is_ok(colour));\r
+\r
+   rank = square_rank(square);\r
+   if (colour_is_black(colour)) rank = 7-rank;\r
+\r
+   return rank;\r
+}\r
+\r
+// square_from_64()\r
+\r
+int square_from_64(int square) {\r
+\r
+   ASSERT(square>=0&&square<64);\r
+\r
+   return SquareFrom64[square];\r
+}\r
+\r
+// square_to_64()\r
+\r
+int square_to_64(int square) {\r
+\r
+   ASSERT(square_is_ok(square));\r
+\r
+   return SquareTo64[square];\r
+}\r
+\r
+// square_is_promote()\r
+\r
+bool square_is_promote(int square) {\r
+\r
+   int rank;\r
+\r
+   ASSERT(square_is_ok(square));\r
+\r
+   rank = square_rank(square);\r
+\r
+   return rank == Rank1 || rank == Rank8;\r
+}\r
+\r
+// square_ep_dual()\r
+\r
+int square_ep_dual(int square) {\r
+\r
+   ASSERT(square_is_ok(square));\r
+   ASSERT(square_rank(square)>=2&&square_rank(square)<=5);\r
+\r
+   return square ^ 16;\r
+}\r
+\r
+// square_colour()\r
+\r
+int square_colour(int square) {\r
+\r
+   ASSERT(square_is_ok(square));\r
+\r
+   return (square ^ (square >> 4)) & 1;\r
+}\r
+\r
+// file_from_char()\r
+\r
+int file_from_char(int c) {\r
+\r
+   ASSERT(c>='a'&&c<='h');\r
+\r
+   return c - 'a';\r
+}\r
+\r
+// rank_from_char()\r
+\r
+int rank_from_char(int c) {\r
+\r
+   ASSERT(c>='1'&&c<='8');\r
+\r
+   return c - '1';\r
+}\r
+\r
+// file_to_char()\r
+\r
+int file_to_char(int file) {\r
+\r
+   ASSERT(file>=0&&file<8);\r
+\r
+   return 'a' + file;\r
+}\r
+\r
+// rank_to_char()\r
+\r
+int rank_to_char(int rank) {\r
+\r
+   ASSERT(rank>=0&&rank<8);\r
+\r
+   return '1' + rank;\r
+}\r
+\r
+// char_is_file()\r
+\r
+bool char_is_file(int c) {\r
+\r
+   return c >= 'a' && c <= 'h';\r
+}\r
+\r
+// char_is_rank()\r
+\r
+bool char_is_rank(int c) {\r
+\r
+   return c >= '1' && c <= '8';\r
+}\r
+\r
+// square_to_string()\r
+\r
+bool square_to_string(int square, char string[], int size) {\r
+\r
+   ASSERT(square_is_ok(square));\r
+   ASSERT(string!=NULL);\r
+   ASSERT(size>=3);\r
+\r
+   if (size < 3) return FALSE;\r
+\r
+   string[0] = 'a' + square_file(square);\r
+   string[1] = '1' + square_rank(square);\r
+   string[2] = '\0';\r
+\r
+   return TRUE;\r
+}\r
+\r
+// square_from_string()\r
+\r
+int square_from_string(const char string[]) {\r
+\r
+   int file, rank;\r
+\r
+   ASSERT(string!=NULL);\r
+\r
+   if (string[0] < 'a' || string[0] > 'h') return SquareNone;\r
+   if (string[1] < '1' || string[1] > '8') return SquareNone;\r
+   if (string[2] != '\0') return SquareNone;\r
+\r
+   file = file_from_char(string[0]);\r
+   rank = rank_from_char(string[1]);\r
+\r
+   return square_make(file,rank);\r
+}\r
+\r
+// end of square.cpp\r
+\r