From 3ff276f2cd88e6f3a6fe08f95f6147abbe3fcfd4 Mon Sep 17 00:00:00 2001 From: jacob Date: Tue, 5 Jul 2005 21:27:19 +0000 Subject: [PATCH] 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'). git-svn-id: svn://svn.tartarus.org/sgt/puzzles@6068 cda61777-01e9-0310-a592-d414129be87e --- cube.c | 2 +- fifteen.c | 2 +- flip.c | 2 +- gtk.c | 2 +- guess.c | 2 +- midend.c | 18 +++++++++++++----- mines.c | 4 ++-- net.c | 4 ++-- netslide.c | 2 +- nullgame.c | 2 +- pattern.c | 2 +- pegs.c | 11 ++++++++--- puzzles.h | 2 +- rect.c | 2 +- samegame.c | 2 +- sixteen.c | 2 +- solo.c | 2 +- twiddle.c | 2 +- 18 files changed, 39 insertions(+), 26 deletions(-) diff --git a/cube.c b/cube.c index 768f53f..2003163 100644 --- a/cube.c +++ b/cube.c @@ -525,7 +525,7 @@ static void count_grid_square_callback(void *ctx, struct grid_square *sq) classes[thisclass]++; } -static char *validate_params(game_params *params) +static char *validate_params(game_params *params, int full) { int classes[5]; int i; diff --git a/fifteen.c b/fifteen.c index 319a585..3a387bb 100644 --- a/fifteen.c +++ b/fifteen.c @@ -129,7 +129,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/flip.c b/flip.c index b38aff1..4125d6d 100644 --- a/flip.c +++ b/flip.c @@ -182,7 +182,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/gtk.c b/gtk.c index 1a79f0e..8ebddd6 100644 --- a/gtk.c +++ b/gtk.c @@ -1676,7 +1676,7 @@ int main(int argc, char **argv) *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; } diff --git a/guess.c b/guess.c index 39241b0..dddd052 100644 --- a/guess.c +++ b/guess.c @@ -212,7 +212,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/midend.c b/midend.c index 8223d87..7ef05cb 100644 --- a/midend.c +++ b/midend.c @@ -789,7 +789,7 @@ int midend_num_presets(midend_data *me) 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 @@ static char *midend_game_id_int(midend_data *me, char *id, int defmode) 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 @@ char *midend_set_config(midend_data *me, int which, config_item *cfg) 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,16 +1480,24 @@ char *midend_deserialise(midend_data *me, 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"; goto cleanup; diff --git a/mines.c b/mines.c index b70167e..f3e216c 100644 --- a/mines.c +++ b/mines.c @@ -237,7 +237,7 @@ static game_params *custom_params(config_item *cfg) 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 @@ static char *validate_params(game_params *params) * _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"; diff --git a/net.c b/net.c index cb8e613..5d0806c 100644 --- a/net.c +++ b/net.c @@ -293,7 +293,7 @@ static game_params *custom_params(config_item *cfg) 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 @@ static char *validate_params(game_params *params) * 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"; diff --git a/netslide.c b/netslide.c index b16cb0b..12fabd7 100644 --- a/netslide.c +++ b/netslide.c @@ -309,7 +309,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/nullgame.c b/nullgame.c index bdf0e07..8af76ce 100644 --- a/nullgame.c +++ b/nullgame.c @@ -78,7 +78,7 @@ static game_params *custom_params(config_item *cfg) return NULL; } -static char *validate_params(game_params *params) +static char *validate_params(game_params *params, int full) { return NULL; } diff --git a/pattern.c b/pattern.c index e9b6f98..f83746a 100644 --- a/pattern.c +++ b/pattern.c @@ -165,7 +165,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/pegs.c b/pegs.c index 0874d1d..5ed30d0 100644 --- a/pegs.c +++ b/pegs.c @@ -120,6 +120,11 @@ static void decode_params(game_params *params, char const *string) 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 @@ static game_params *custom_params(config_item *cfg) 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 @@ static char *validate_params(game_params *params) * 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"; } diff --git a/puzzles.h b/puzzles.h index d41d964..57b5c33 100644 --- a/puzzles.h +++ b/puzzles.h @@ -265,7 +265,7 @@ struct game { 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); diff --git a/rect.c b/rect.c index 952f133..fbe5b79 100644 --- a/rect.c +++ b/rect.c @@ -212,7 +212,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/samegame.c b/samegame.c index 35f2ae2..5a52303 100644 --- a/samegame.c +++ b/samegame.c @@ -209,7 +209,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/sixteen.c b/sixteen.c index f293fab..5eb0715 100644 --- a/sixteen.c +++ b/sixteen.c @@ -172,7 +172,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/solo.c b/solo.c index 47b4c39..881589e 100644 --- a/solo.c +++ b/solo.c @@ -321,7 +321,7 @@ static game_params *custom_params(config_item *cfg) 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"; diff --git a/twiddle.c b/twiddle.c index ce3d0ec..ac6f385 100644 --- a/twiddle.c +++ b/twiddle.c @@ -209,7 +209,7 @@ static game_params *custom_params(config_item *cfg) 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"; -- 2.11.0