diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-02 21:58:10 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-02 21:58:10 +0000 |
| commit | ed682bd5c608156d12ebaa2d84c4ce2e2877c10a (patch) | |
| tree | 33e12f345b52bba603479de160ee8f70f11d19ab /tents.c | |
| parent | ed0e4c304bed990948541fc0cf87309d75653806 (diff) | |
| download | puzzles-ed682bd5c608156d12ebaa2d84c4ce2e2877c10a.zip puzzles-ed682bd5c608156d12ebaa2d84c4ce2e2877c10a.tar.gz puzzles-ed682bd5c608156d12ebaa2d84c4ce2e2877c10a.tar.bz2 puzzles-ed682bd5c608156d12ebaa2d84c4ce2e2877c10a.tar.xz | |
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.").
Diffstat (limited to 'tents.c')
| -rw-r--r-- | tents.c | 22 |
1 files changed, 19 insertions, 3 deletions
@@ -1191,6 +1191,21 @@ static char *new_game_desc(const game_params *params_in, random_state *rs, 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 @@ static const char *validate_desc(const game_params *params, const char *desc) 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++; |