aboutsummaryrefslogtreecommitdiff
path: root/filling.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2009-06-17 20:01:45 +0000
committerSimon Tatham <anakin@pobox.com>2009-06-17 20:01:45 +0000
commit0687980f0c3204d283848ba41761a7724e4a6168 (patch)
treefb454b19acbc55db35dd3087648d2dc0de52f0bb /filling.c
parent3cd83d05e899e62232b68ea95cf7f07505ebd79f (diff)
downloadpuzzles-0687980f0c3204d283848ba41761a7724e4a6168.zip
puzzles-0687980f0c3204d283848ba41761a7724e4a6168.tar.gz
puzzles-0687980f0c3204d283848ba41761a7724e4a6168.tar.bz2
puzzles-0687980f0c3204d283848ba41761a7724e4a6168.tar.xz
Memory management and other fixes from James H.
[originally from svn r8596]
Diffstat (limited to 'filling.c')
-rw-r--r--filling.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/filling.c b/filling.c
index 0209062..a797d09 100644
--- a/filling.c
+++ b/filling.c
@@ -1138,7 +1138,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
static game_state *execute_move(game_state *state, char *move)
{
- game_state *new_state;
+ game_state *new_state = NULL;
const int sz = state->shared->params.w * state->shared->params.h;
if (*move == 's') {
@@ -1149,18 +1149,18 @@ static game_state *execute_move(game_state *state, char *move)
} else {
int value;
char *endptr, *delim = strchr(move, '_');
- if (!delim) return NULL;
+ if (!delim) goto err;
value = strtol(delim+1, &endptr, 0);
- if (*endptr || endptr == delim+1) return NULL;
- if (value < 0 || value > 9) return NULL;
+ if (*endptr || endptr == delim+1) goto err;
+ if (value < 0 || value > 9) goto err;
new_state = dup_game(state);
while (*move) {
const int i = strtol(move, &endptr, 0);
- if (endptr == move) return NULL;
- if (i < 0 || i >= sz) return NULL;
+ if (endptr == move) goto err;
+ if (i < 0 || i >= sz) goto err;
new_state->board[i] = value;
if (*endptr == '_') break;
- if (*endptr != ',') return NULL;
+ if (*endptr != ',') goto err;
move = endptr + 1;
}
}
@@ -1181,6 +1181,10 @@ static game_state *execute_move(game_state *state, char *move)
}
return new_state;
+
+err:
+ if (new_state) free_game(new_state);
+ return NULL;
}
/* ----------------------------------------------------------------------