From: simon Date: Sun, 1 May 2005 13:22:44 +0000 (+0000) Subject: Copy-to-clipboard facility for Fifteen, Sixteen and Twiddle. X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/commitdiff_plain/af52394ee99f751e8a23169d70e9d742efc6e949 Copy-to-clipboard facility for Fifteen, Sixteen and Twiddle. git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5725 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/fifteen.c b/fifteen.c index 3fad78a..8439faa 100644 --- 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, diff --git a/sixteen.c b/sixteen.c index 3a5d722..4611e3c 100644 --- 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, diff --git a/twiddle.c b/twiddle.c index 4bfd30c..162f68b 100644 --- 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 & 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,