aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Harris <bjh21@bjh21.me.uk>2023-01-28 23:45:48 +0000
committerBen Harris <bjh21@bjh21.me.uk>2023-01-28 23:45:48 +0000
commit4359f59dd22770a94e29b2ddd54b533ad1713550 (patch)
tree507c07505d41c9e1c5ad842d274d24b1652f737f
parent75e8a1a9cabe7567f6019b1226783b61ba1ac42f (diff)
downloadpuzzles-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.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/pegs.c b/pegs.c
index 54d1a21..2fa9a2a 100644
--- a/pegs.c
+++ b/pegs.c
@@ -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;
}