chiark / gitweb /
Copy-to-clipboard facility for Fifteen, Sixteen and Twiddle.
authorSimon Tatham <anakin@pobox.com>
Sun, 1 May 2005 13:22:44 +0000 (13:22 +0000)
committerSimon Tatham <anakin@pobox.com>
Sun, 1 May 2005 13:22:44 +0000 (13:22 +0000)
[originally from svn r5725]

fifteen.c
sixteen.c
twiddle.c

index 3fad78a956e984d4c32fa73f74a322e60dd77b0e..8439faa3a941a8c8527da7ab6a781e4176fb823e 100644 (file)
--- a/fifteen.c
+++ b/fifteen.c
@@ -372,7 +372,44 @@ static void free_game(game_state *state)
 
 static char *game_text_format(game_state *state)
 {
-    return NULL;
+    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-1);
+
+    /*
+     * 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];
+           if (v == 0)
+               sprintf(buf, "%*s", col, "");
+           else
+               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)
@@ -743,7 +780,7 @@ const struct game thegame = {
     new_game,
     dup_game,
     free_game,
-    FALSE, game_text_format,
+    TRUE, game_text_format,
     new_ui,
     free_ui,
     make_move,
index 3a5d722b54504c2cf9f74dcfb21b8e71b4a32e08..4611e3cfa10121ded72d6b7065179ce0b67ead80 100644 (file)
--- a/sixteen.c
+++ b/sixteen.c
@@ -381,7 +381,41 @@ static void free_game(game_state *state)
 
 static char *game_text_format(game_state *state)
 {
-    return NULL;
+    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)
@@ -793,7 +827,7 @@ const struct game thegame = {
     new_game,
     dup_game,
     free_game,
-    FALSE, game_text_format,
+    TRUE, game_text_format,
     new_ui,
     free_ui,
     make_move,
index 4bfd30cd78549d2955646cd76b016611252a45d1..162f68b98efa0e0216e49f13a0adc2a09638f724 100644 (file)
--- a/twiddle.c
+++ b/twiddle.c
@@ -454,7 +454,49 @@ static void free_game(game_state *state)
 
 static char *game_text_format(game_state *state)
 {
-    return NULL;
+    char *ret, *p, buf[80];
+    int i, x, y, col, o, maxlen;
+
+    /*
+     * First work out how many characters we need to display each
+     * number. We're pretty flexible on grid contents here, so we
+     * have to scan the entire grid.
+     */
+    col = 0;
+    for (i = 0; i < state->w * state->h; i++) {
+       x = sprintf(buf, "%d", state->grid[i] / 4);
+       if (col < x) col = x;
+    }
+    o = (state->orientable ? 1 : 0);
+
+    /*
+     * 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+o,
+     * w-1 spaces and a trailing newline.
+     */
+    maxlen = state->h * state->w * (col+o+1);
+
+    ret = snewn(maxlen, char);
+    p = ret;
+
+    for (y = 0; y < state->h; y++) {
+       for (x = 0; x < state->w; x++) {
+           int v = state->grid[state->w*y+x];
+           sprintf(buf, "%*d", col, v/4);
+           memcpy(p, buf, col);
+           p += col;
+           if (o)
+               *p++ = "^<v>"[v & 3];
+           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)
@@ -947,7 +989,7 @@ const struct game thegame = {
     new_game,
     dup_game,
     free_game,
-    FALSE, game_text_format,
+    TRUE, game_text_format,
     new_ui,
     free_ui,
     make_move,