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