diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2023-01-28 23:45:48 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2023-01-28 23:45:48 +0000 |
| commit | 4359f59dd22770a94e29b2ddd54b533ad1713550 (patch) | |
| tree | 507c07505d41c9e1c5ad842d274d24b1652f737f | |
| parent | 75e8a1a9cabe7567f6019b1226783b61ba1ac42f (diff) | |
| download | puzzles-4359f59dd22770a94e29b2ddd54b533ad1713550.zip puzzles-4359f59dd22770a94e29b2ddd54b533ad1713550.tar.gz puzzles-4359f59dd22770a94e29b2ddd54b533ad1713550.tar.bz2 puzzles-4359f59dd22770a94e29b2ddd54b533ad1713550.tar.xz | |
Validate the number of pegs and holes in a Pegs game ID
Without this, "1:O" causes an assertion violation, '!"new_ui found
nowhere for cursor"'. We may as well require two pegs and one hole,
since that's the minimum for a game in which there are any moves to
make.
| -rw-r--r-- | pegs.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -663,7 +663,7 @@ static char *new_game_desc(const game_params *params, random_state *rs, static const char *validate_desc(const game_params *params, const char *desc) { - int len; + int len, i, npeg = 0, nhole = 0; len = params->w * params->h; @@ -671,6 +671,15 @@ static const char *validate_desc(const game_params *params, const char *desc) return "Game description is wrong length"; if (len != strspn(desc, "PHO")) return "Invalid character in game description"; + for (i = 0; i < len; i++) { + npeg += desc[i] == 'P'; + nhole += desc[i] == 'H'; + } + /* The minimal soluble game has two pegs and a hole: "3x1:PPH". */ + if (npeg < 2) + return "Too few pegs in game description"; + if (nhole < 1) + return "Too few holes in game description"; return NULL; } |