+static game_state *execute_move(game_state *from, char *move)
+{
+ int i, nc_place;
+ game_state *ret;
+ char *p;
+
+ if (!strcmp(move, "S")) {
+ ret = dup_game(from);
+ ret->solved = 1;
+ return ret;
+ } else if (move[0] == 'G') {
+ p = move+1;
+
+ ret = dup_game(from);
+
+ for (i = 0; i < from->solution->npegs; i++) {
+ int val = atoi(p);
+ int min_colour = from->params.allow_blank? 0 : 1;
+ if (val < min_colour || val > from->params.ncolours) {
+ free_game(ret);
+ return NULL;
+ }
+ ret->guesses[from->next_go]->pegs[i] = atoi(p);
+ while (*p && isdigit((unsigned char)*p)) p++;
+ if (*p == ',') p++;
+ }
+
+ nc_place = mark_pegs(ret->guesses[from->next_go], ret->solution, ret->params.ncolours);
+
+ if (nc_place == ret->solution->npegs) {
+ ret->solved = 1; /* win! */
+ } else {
+ ret->next_go = from->next_go + 1;
+ if (ret->next_go >= ret->params.nguesses)
+ ret->solved = 1; /* 'lose' so we show the pegs. */
+ }
+
+ return ret;
+ } else
+ return NULL;
+}
+