+static char *encode_ui(game_ui *ui)
+{
+ char *ret, *p, *sep;
+ int i;
+
+ /*
+ * For this game it's worth storing the contents of the current
+ * guess, and the current set of holds.
+ */
+ ret = snewn(40 * ui->curr_pegs->npegs, char);
+ p = ret;
+ sep = "";
+ for (i = 0; i < ui->curr_pegs->npegs; i++) {
+ p += sprintf(p, "%s%d%s", sep, ui->curr_pegs->pegs[i],
+ ui->holds[i] ? "_" : "");
+ sep = ",";
+ }
+ *p++ = '\0';
+ assert(p - ret < 40 * ui->curr_pegs->npegs);
+ return sresize(ret, p - ret, char);
+}
+
+static void decode_ui(game_ui *ui, char *encoding)
+{
+ int i;
+ char *p = encoding;
+ for (i = 0; i < ui->curr_pegs->npegs; i++) {
+ ui->curr_pegs->pegs[i] = atoi(p);
+ while (*p && isdigit((unsigned char)*p)) p++;
+ if (*p == '_') {
+ /* NB: old versions didn't store holds */
+ ui->holds[i] = 1;
+ p++;
+ } else
+ ui->holds[i] = 0;
+ if (*p == ',') p++;
+ }
+ ui->markable = is_markable(&ui->params, ui->curr_pegs);
+}
+