Copy-to-clipboard facility for Fifteen, Sixteen and Twiddle.
[sgt/puzzles] / sixteen.c
index 828168e..4611e3c 100644 (file)
--- a/sixteen.c
+++ b/sixteen.c
@@ -379,6 +379,45 @@ static void free_game(game_state *state)
     sfree(state);
 }
 
+static char *game_text_format(game_state *state)
+{
+    char *ret, *p, buf[80];
+    int x, y, col, maxlen;
+
+    /*
+     * First work out how many characters we need to display each
+     * number.
+     */
+    col = sprintf(buf, "%d", state->n);
+
+    /*
+     * Now we know the exact total size of the grid we're going to
+     * produce: it's got h rows, each containing w lots of col, w-1
+     * spaces and a trailing newline.
+     */
+    maxlen = state->h * state->w * (col+1);
+
+    ret = snewn(maxlen, char);
+    p = ret;
+
+    for (y = 0; y < state->h; y++) {
+       for (x = 0; x < state->w; x++) {
+           int v = state->tiles[state->w*y+x];
+           sprintf(buf, "%*d", col, v);
+           memcpy(p, buf, col);
+           p += col;
+           if (x+1 == state->w)
+               *p++ = '\n';
+           else
+               *p++ = ' ';
+       }
+    }
+
+    assert(p - ret == maxlen);
+    *p = '\0';
+    return ret;
+}
+
 static game_ui *new_ui(game_state *state)
 {
     return NULL;
@@ -774,21 +813,21 @@ static int game_wants_statusbar(void)
 #endif
 
 const struct game thegame = {
-    "Sixteen", "games.sixteen", TRUE,
+    "Sixteen", "games.sixteen",
     default_params,
     game_fetch_preset,
     decode_params,
     encode_params,
     free_params,
     dup_params,
-    game_configure,
-    custom_params,
+    TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
     validate_seed,
     new_game,
     dup_game,
     free_game,
+    TRUE, game_text_format,
     new_ui,
     free_ui,
     make_move,