updated upstream url, changed to value types for vectors, added checked mallocs
Minclude/simple-go/simple-go.h
@@ -37,8 +37,8 @@ typedef struct game_state
typedef struct go_score
{
Vector* white_groups;
Vector* black_groups;
Vector white_groups;
Vector black_groups;
double white_points;
double black_points;
} go_score;
Mmeson.build
@@ -1,6 +1,6 @@
project('simple-go', 'c')
CFLAGS = ['-std=c11', '-fstrict-aliasing', '-Wall', '-Wpedantic', '-Wextra', '-Wno-unused-parameter', '-Wconversion', '-Wstrict-aliasing', '-Wstrict-overflow=5']
CFLAGS = ['-std=c11', '-fstrict-aliasing', '-Wall', '-Wpedantic', '-Wextra', '-Wno-unused-parameter', '-Wconversion', '-Wstrict-aliasing=1', '-Wstrict-overflow=5']
cutils_dep = dependency('cutils', fallback : ['cutils', 'cutils_dep'])
Msrc/simple-go.c
@@ -2,10 +2,8 @@
go_board* create_board(go_coordinate size)
{
go_board* board = malloc(sizeof(*board));
assert(board);
board->field_array = malloc(size*size*sizeof(*board->field_array));
assert(board->field_array);
go_board* board = malloc_die(sizeof(*board));
board->field_array = malloc_die(size*size*sizeof(*board->field_array));
for(go_coordinate i = 0; i < size*size; i++)
{
board->field_array[i] = EMPTY;
@@ -23,7 +21,7 @@ void delete_board(go_board* board)
game_state* create_game(go_coordinate size, float komi)
{
game_state* game = malloc(sizeof(*game));
game_state* game = malloc_die(sizeof(*game));
game->board = create_board(size);
game->black_turn = true;
game->komi = komi;
@@ -342,12 +340,26 @@ go_coordinate count_liberties(const go_board* board, const go_board* overlay)
return liberties;
}
void delete_board_wrapper(void* board)
{
delete_board(board);
}
go_score* score_game(const game_state* game)
{
go_score* ret = malloc(sizeof(*ret));
go_score* ret = malloc_die(sizeof(*ret));
if(!new_vector_adv(&ret->white_groups, VECTOR_DEFAULT_SIZE, delete_board_wrapper))
{
perror("malloc");
exit(EXIT_FAILURE);
}
if(!new_vector_adv(&ret->black_groups, VECTOR_DEFAULT_SIZE, delete_board_wrapper))
{
perror("malloc");
exit(EXIT_FAILURE);
}
ret->white_groups = new_vector();
ret->black_groups = new_vector();
ret->white_points = game->white_captured + game->komi;
ret->black_points = game->black_captured;
@@ -363,15 +375,15 @@ go_score* score_game(const game_state* game)
if(get_board_at(board, y, x) == EMPTY)
{
//check if field is already counted
for(go_coordinate i = 0; i < ret->white_groups->length; i++)
for(go_coordinate i = 0; i < ret->white_groups.length; i++)
{
current = vector_at(ret->white_groups, i);
current = vector_at(&ret->white_groups, i);
if(get_board_at(current, y, x) == GROUP)
goto next_loop;
}
for(go_coordinate i = 0; i < ret->black_groups->length; i++)
for(go_coordinate i = 0; i < ret->black_groups.length; i++)
{
current = vector_at(ret->black_groups, i);
current = vector_at(&ret->black_groups, i);
if(get_board_at(current, y, x) == GROUP)
goto next_loop;
}
@@ -382,10 +394,10 @@ go_score* score_game(const game_state* game)
//check if field belongs to a group
if((belongs = group_belongs(board, overlay)) == WHITE)
{
vector_push(ret->white_groups, overlay);
vector_push(&ret->white_groups, overlay);
ret->white_points += (double)group_size(overlay);
} else if(belongs == BLACK) {
vector_push(ret->black_groups, overlay);
vector_push(&ret->black_groups, overlay);
ret->black_points += (double)group_size(overlay);
} else {
delete_board(overlay);
@@ -398,15 +410,10 @@ go_score* score_game(const game_state* game)
return ret;
}
void delete_board_wrapper(void* board)
{
delete_board(board);
}
void delete_score(go_score* score)
{
delete_vector(score->white_groups, delete_board_wrapper);
delete_vector(score->black_groups, delete_board_wrapper);
delete_vector(&score->white_groups);
delete_vector(&score->black_groups);
free(score);
}
Msrc/simple-gtp-func.c
@@ -5,7 +5,7 @@ const char* known_commands_array[] = {"protocol_version","name","version","known
static char* cmd_error(const char* msg, const char* id)
{
char* ret = malloc(strlen("? ") + (msg ? strlen(msg) : 0) + (id ? strlen(id) : 0) + 3);
char* ret = malloc_die(strlen("? ") + (msg ? strlen(msg) : 0) + (id ? strlen(id) : 0) + 3);
strcpy(ret, "?");
if(id)
@@ -22,7 +22,7 @@ static char* cmd_error(const char* msg, const char* id)
static char* cmd_success(const char* msg, const char* id)
{
char* ret = malloc(strlen("= ") + (msg ? strlen(msg) : 0) + (id ? strlen(id) : 0) + 3);
char* ret = malloc_die(strlen("= ") + (msg ? strlen(msg) : 0) + (id ? strlen(id) : 0) + 3);
strcpy(ret, "=");
if(id)
@@ -109,7 +109,7 @@ char* clear_board_func(const Vector* arguments, const char* id, game_state* game
char* play_func(const Vector* arguments, const char* id, game_state* game)
{
char* color = malloc(6);
char* color = malloc_die(6);
char xchar;
size_t x;
size_t y;
@@ -118,8 +118,8 @@ char* play_func(const Vector* arguments, const char* id, game_state* game)
goto error;
if(snprintf(color, 6, "%s", (char*)vector_at(arguments,0)) <= 0) //"white" and "black" are only 6 chars
goto error;
if(!(strcmp_nocase(color, "white") == 0 || strcmp_nocase(color, "black") == 0 || // check color
strcmp_nocase(color, "w") == 0 || strcmp_nocase(color, "b") == 0))
if(!(cutil_strcasecmp(color, "white") == 0 || cutil_strcasecmp(color, "black") == 0 || // check color
cutil_strcasecmp(color, "w") == 0 || cutil_strcasecmp(color, "b") == 0))
goto error;
if(sscanf(vector_at(arguments,1), "%c", &xchar) <= 0) // get horizontal coordinate
goto error;
@@ -150,7 +150,7 @@ error:
char* genmove_func(const Vector* arguments, const char* id, game_state* game)
{
char* color = malloc(6);
char* color = malloc_die(6);
if(arguments->length == 1 &&
(snprintf(color, 6, "%s", (char*)vector_at(arguments,0)) > 0) &&
(strcmp(color, "white") == 0 || strcmp(color, "black") == 0 ||
Msrc/simple-gtp.c
@@ -4,7 +4,7 @@
typedef struct msg_formatted
{
char* command;
Vector* arguments;
Vector arguments;
char* id;
} msg_formatted;
@@ -20,17 +20,21 @@ static msg_formatted format_msg(const char* msg)
if(index)
{
formatted.id = malloc(index+1);
formatted.id = malloc_die(index+1);
strncpy(formatted.id, msg, index);
formatted.id[index] = '\0';
}
formatted.command = malloc(strlen(msg+index) + 1);
formatted.command = malloc_die(strlen(msg+index) + 1);
sscanf(msg+index, "%s", formatted.command);
formatted.arguments = new_vector();
if(!new_vector_adv(&formatted.arguments, VECTOR_DEFAULT_SIZE, free))
{
perror("malloc");
exit(EXIT_FAILURE);
}
char* tmp_msg = malloc(strlen(msg+index)+1);
char* tmp_msg = malloc_die(strlen(msg+index)+1);
strcpy(tmp_msg, msg+index);
@@ -39,14 +43,14 @@ static msg_formatted format_msg(const char* msg)
while(current)
{
tmp_arg = malloc(strlen(current)+1);
tmp_arg = malloc_die(strlen(current)+1);
strcpy(tmp_arg, current);
vector_push(formatted.arguments, tmp_arg);
vector_push(&formatted.arguments, tmp_arg);
current = strtok(NULL, " ");
}
if(formatted.arguments->length > 1)
vector_remove(formatted.arguments, 0, free);
if(formatted.arguments.length > 1)
vector_remove(&formatted.arguments, 0);
free(tmp_msg);
@@ -85,7 +89,7 @@ char* handle_gtp_cmd(const char* msg, game_state* game)
msg_formatted formatted = format_msg(msg_san);
char* command = formatted.command;
Vector* arguments = formatted.arguments;
Vector arguments = formatted.arguments;
char* id = formatted.id;
char* ret;
@@ -118,12 +122,12 @@ char* handle_gtp_cmd(const char* msg, game_state* game)
func_ptr = final_score_func;
}
ret = func_ptr(arguments, id, game);
ret = func_ptr(&arguments, id, game);
free(command);
free(msg_san);
free(id);
delete_vector(arguments, free);
delete_vector(&arguments);
return ret;
}
Msrc/test.c
@@ -164,9 +164,9 @@ static void test5(void)
go_score* score = score_game(game);
print_board(game->board);
printf("White groups: %ld\n", score->white_groups->length);
printf("White groups: %ld\n", score->white_groups.length);
printf("White points: %lf\n", score->white_points);
printf("Black groups: %ld\n", score->black_groups->length);
printf("Black groups: %ld\n", score->black_groups.length);
printf("Black points: %lf\n", score->black_points);