From a614347a3e5fe106e69fd697fb08d50cda81f83b Mon Sep 17 00:00:00 2001 From: Kevin Lyles Date: Sat, 16 May 2015 13:51:34 -0500 Subject: [PATCH] Cleaned up execute_move a little --- towers.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/towers.c b/towers.c index 011a406..2b9e4e7 100644 --- a/towers.c +++ b/towers.c @@ -1391,35 +1391,29 @@ static char *interpret_move(const game_state *state, game_ui *ui, static game_state *execute_move(const game_state *from, const char *move) { int w = from->par.w, a = w*w; - game_state *ret; + game_state *ret = dup_game(from); int x, y, i, n; if (move[0] == 'S') { - ret = dup_game(from); ret->completed = ret->cheated = TRUE; for (i = 0; i < a; i++) { - if (move[i+1] < '1' || move[i+1] > '0'+w) { - free_game(ret); - return NULL; - } + if (move[i+1] < '1' || move[i+1] > '0'+w) + goto badmove; ret->grid[i] = move[i+1] - '0'; ret->pencil[i] = 0; } - if (move[a+1] != '\0') { - free_game(ret); - return NULL; - } + if (move[a+1] != '\0') + goto badmove; return ret; } else if ((move[0] == 'P' || move[0] == 'R') && sscanf(move+1, "%d,%d,%d", &x, &y, &n) == 3 && x >= 0 && x < w && y >= 0 && y < w && n >= 0 && n <= w) { if (from->clues->immutable[y*w+x]) - return NULL; + goto badmove; - ret = dup_game(from); if (move[0] == 'P' && n > 0) { ret->pencil[y*w+x] ^= 1L << n; } else { @@ -1437,14 +1431,17 @@ static game_state *execute_move(const game_state *from, const char *move) * starting point when following through a set of * diagnostics output by the standalone solver.) */ - ret = dup_game(from); for (i = 0; i < a; i++) { if (!ret->grid[i]) ret->pencil[i] = (1L << (w+1)) - (1L << 1); } return ret; - } else - return NULL; /* couldn't parse move string */ + } + + badmove: + /* couldn't parse move string */ + free_game(ret); + return NULL; } /* ----------------------------------------------------------------------