X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/d3a026ed4258c207b6309802cc2c92eb0a812aac..5928817c732d591bd446b6b048702a98f5ec1804:/sixteen.c?ds=sidebyside diff --git a/sixteen.c b/sixteen.c index 7217d10..78bd851 100644 --- a/sixteen.c +++ b/sixteen.c @@ -257,6 +257,58 @@ char *new_game_seed(game_params *params) return ret; } + +char *validate_seed(game_params *params, char *seed) +{ + char *p, *err; + int i, area; + int *used; + + area = params->w * params->h; + p = seed; + err = NULL; + + used = snewn(area, int); + for (i = 0; i < area; i++) + used[i] = FALSE; + + for (i = 0; i < area; i++) { + char *q = p; + int n; + + if (*p < '0' || *p > '9') { + err = "Not enough numbers in string"; + goto leave; + } + while (*p >= '0' && *p <= '9') + p++; + if (i < area-1 && *p != ',') { + err = "Expected comma after number"; + goto leave; + } + else if (i == area-1 && *p) { + err = "Excess junk at end of string"; + goto leave; + } + n = atoi(q); + if (n < 1 || n > area) { + err = "Number out of range"; + goto leave; + } + if (used[n-1]) { + err = "Number used twice"; + goto leave; + } + used[n-1] = TRUE; + + if (*p) p++; /* eat comma */ + } + + leave: + sfree(used); + return err; +} + game_state *new_game(game_params *params, char *seed) { game_state *state = snew(game_state);