shithub: puzzles

Download patch

ref: 4359f59dd22770a94e29b2ddd54b533ad1713550
parent: 75e8a1a9cabe7567f6019b1226783b61ba1ac42f
author: Ben Harris <bjh21@bjh21.me.uk>
date: Sat Jan 28 18:45:48 EST 2023

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.

--- a/pegs.c
+++ b/pegs.c
@@ -663,7 +663,7 @@
 
 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 @@
 	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;
 }