ref: f3c95109c7b905f74b5f149eea21f68444c31ef7
parent: 968828283b7a0aacd71d4868846291b381884eb1
author: Jacob Nevins <jacobn@chiark.greenend.org.uk>
date: Tue Jul 5 17:27:19 EDT 2005
Add a `full' parameter to validate_params(), analogous to the one in encode_params(). This is necessary for cases where generation-time parameters that are normally omitted from descriptive IDs can place restrictions on other parameters; in particular, when the default value of a relevant generation-time parameter is not the one used to generate the descriptive ID, validation could reject self-generated IDs (e.g., Net `5x2w:56182ae7c2', and some cases in `Pegs'). [originally from svn r6068]
--- a/cube.c
+++ b/cube.c
@@ -525,7 +525,7 @@
classes[thisclass]++;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
int classes[5];
int i;
--- a/fifteen.c
+++ b/fifteen.c
@@ -129,7 +129,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->w < 2 || params->h < 2)
return "Width and height must both be at least two";
--- a/flip.c
+++ b/flip.c
@@ -182,7 +182,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->w <= 0 || params->h <= 0)
return "Width and height must both be greater than zero";
--- a/gtk.c
+++ b/gtk.c
@@ -1676,7 +1676,7 @@
*seed++ = '\0';
thegame.decode_params(par, params);
}
- if ((error = thegame.validate_params(par)) != NULL) {
+ if ((error = thegame.validate_params(par, TRUE)) != NULL) {
fprintf(stderr, "%s: %s\n", pname, error);
return 1;
}
--- a/guess.c
+++ b/guess.c
@@ -212,7 +212,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->ncolours < 2 || params->npegs < 2)
return "Trivial solutions are uninteresting";
--- a/midend.c
+++ b/midend.c
@@ -789,7 +789,7 @@
preset = me->ourgame->default_params();
me->ourgame->decode_params(preset, val);
- if (me->ourgame->validate_params(preset)) {
+ if (me->ourgame->validate_params(preset, TRUE)) {
/* Drop this one from the list. */
me->ourgame->free_params(preset);
continue;
@@ -955,7 +955,7 @@
if (par) {
newcurparams = me->ourgame->dup_params(me->params);
me->ourgame->decode_params(newcurparams, par);
- error = me->ourgame->validate_params(newcurparams);
+ error = me->ourgame->validate_params(newcurparams, desc == NULL);
if (error) {
me->ourgame->free_params(newcurparams);
return error;
@@ -1046,7 +1046,7 @@
switch (which) {
case CFG_SETTINGS:
params = me->ourgame->custom_params(cfg);
- error = me->ourgame->validate_params(params);
+ error = me->ourgame->validate_params(params, TRUE);
if (error) {
me->ourgame->free_params(params);
@@ -1480,15 +1480,23 @@
params = me->ourgame->default_params();
me->ourgame->decode_params(params, parstr);
- if (me->ourgame->validate_params(params)) {
+ if (me->ourgame->validate_params(params, TRUE)) {
ret = "Long-term parameters in save file are invalid";
goto cleanup;
}
cparams = me->ourgame->default_params();
me->ourgame->decode_params(cparams, cparstr);
- if (me->ourgame->validate_params(cparams)) {
+ if (me->ourgame->validate_params(cparams, FALSE)) {
ret = "Short-term parameters in save file are invalid";
goto cleanup;
+ }
+ if (seed && me->ourgame->validate_params(cparams, TRUE)) {
+ /*
+ * The seed's no use with this version, but we can perfectly
+ * well use the rest of the data.
+ */
+ sfree(seed);
+ seed = NULL;
}
if (!desc) {
ret = "Game description in save file is missing";
--- a/mines.c
+++ b/mines.c
@@ -237,7 +237,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
/*
* Lower limit on grid size: each dimension must be at least 3.
@@ -253,7 +253,7 @@
* _have_ to have a gap somewhere which you can't determine the
* position of.
*/
- if (params->w <= 2 || params->h <= 2)
+ if (full && params->unique && (params->w <= 2 || params->h <= 2))
return "Width and height must both be greater than two";
if (params->n > params->w * params->h - 9)
return "Too many mines for grid size";
--- a/net.c
+++ b/net.c
@@ -293,7 +293,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->width <= 0 || params->height <= 0)
return "Width and height must both be greater than zero";
@@ -347,7 +347,7 @@
* is at least 2^(number of such rows), and in particular is at
* least 2 since there must be at least one such row. []
*/
- if (params->unique && params->wrapping &&
+ if (full && params->unique && params->wrapping &&
(params->width == 2 || params->height == 2))
return "No wrapping puzzle with a width or height of 2 can have"
" a unique solution";
--- a/netslide.c
+++ b/netslide.c
@@ -309,7 +309,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->width <= 1 || params->height <= 1)
return "Width and height must both be greater than one";
--- a/nullgame.c
+++ b/nullgame.c
@@ -78,7 +78,7 @@
return NULL;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
return NULL;
}
--- a/pattern.c
+++ b/pattern.c
@@ -165,7 +165,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->w <= 0 || params->h <= 0)
return "Width and height must both be greater than zero";
--- a/pegs.c
+++ b/pegs.c
@@ -120,6 +120,11 @@
params->h = params->w;
}
+ /*
+ * Assume a random generation scheme unless told otherwise, for the
+ * sake of internal consistency.
+ */
+ params->type = TYPE_RANDOM;
for (i = 0; i < lenof(pegs_lowertypes); i++)
if (!strcmp(p, pegs_lowertypes[i]))
params->type = i;
@@ -178,9 +183,9 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
- if (params->w <= 3 || params->h <= 3)
+ if (full && (params->w <= 3 || params->h <= 3))
return "Width and height must both be greater than three";
/*
@@ -189,7 +194,7 @@
* soluble. For the moment, therefore, I'm going to disallow
* them at any size other than the standard one.
*/
- if (params->type == TYPE_CROSS || params->type == TYPE_OCTAGON) {
+ if (full && (params->type == TYPE_CROSS || params->type == TYPE_OCTAGON)) {
if (params->w != 7 || params->h != 7)
return "This board type is only supported at 7x7";
}
--- a/puzzles.h
+++ b/puzzles.h
@@ -265,7 +265,7 @@
int can_configure;
config_item *(*configure)(game_params *params);
game_params *(*custom_params)(config_item *cfg);
- char *(*validate_params)(game_params *params);
+ char *(*validate_params)(game_params *params, int full);
char *(*new_desc)(game_params *params, random_state *rs,
char **aux, int interactive);
char *(*validate_desc)(game_params *params, char *desc);
--- a/rect.c
+++ b/rect.c
@@ -212,7 +212,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->w <= 0 || params->h <= 0)
return "Width and height must both be greater than zero";
--- a/samegame.c
+++ b/samegame.c
@@ -209,7 +209,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->w < 1 || params->h < 1)
return "Width and height must both be positive";
--- a/sixteen.c
+++ b/sixteen.c
@@ -172,7 +172,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->w < 2 || params->h < 2)
return "Width and height must both be at least two";
--- a/solo.c
+++ b/solo.c
@@ -321,7 +321,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->c < 2 || params->r < 2)
return "Both dimensions must be at least 2";
--- a/twiddle.c
+++ b/twiddle.c
@@ -209,7 +209,7 @@
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params, int full)
{
if (params->n < 2)
return "Rotation radius must be at least two";