shithub: puzzles

Download patch

ref: ed682bd5c608156d12ebaa2d84c4ce2e2877c10a
parent: ed0e4c304bed990948541fc0cf87309d75653806
author: Ben Harris <bjh21@bjh21.me.uk>
date: Thu Feb 2 16:58:10 EST 2023

Tighten validation of Tents game descriptions

Specifically, TENT and NONTENT markers ('!' and '-') cannot appear as
the first or last character of a description, because that would
attempt to place them on squares outside the grid.  This was caught by
assertions in new_game(), as can be demonstrated by feeding these
descriptions to older versions of Tents: "4:-p,0,0,0,0,0,0,0,0"
("new_game: Assertion `i >= 0 && i <= w*h' failed.") and
4:p-,0,0,0,0,0,0,0,0 ("new_game: Assertion `*desc == ','' failed.").

--- a/tents.c
+++ b/tents.c
@@ -1191,6 +1191,21 @@
     return ret;
 }
 
+/*
+ * Grid description format:
+ * 
+ * _ = tree
+ * a = 1 BLANK then TREE
+ * ...
+ * y = 25 BLANKs then TREE
+ * z = 25 BLANKs
+ * ! = set previous square to TENT
+ * - = set previous square to NONTENT
+ *
+ * Last character must be one that would insert a tree as the first
+ * square after the grid.
+ */
+
 static const char *validate_desc(const game_params *params, const char *desc)
 {
     int w = params->w, h = params->h;
@@ -1204,9 +1219,10 @@
             area += *desc - 'a' + 2;
 	else if (*desc == 'z')
             area += 25;
-        else if (*desc == '!' || *desc == '-')
-            /* do nothing */;
-        else
+        else if (*desc == '!' || *desc == '-') {
+            if (area == 0 || area > w * h)
+                return "Tent or non-tent placed off the grid";
+        } else
             return "Invalid character in grid specification";
 
 	desc++;