From 19ef4855cd8681b43024a9df144c22aae91abc4f Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 22 Jan 2005 15:29:01 +0000 Subject: [PATCH] Arrange that we really _can_ compile all the puzzles into a single binary if we choose: fix bugs in cube.c and sixteen.c that manifest when compiled that way, and introduce list.c which provides a global list of all the available puzzles. git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5169 cda61777-01e9-0310-a592-d414129be87e --- cube.c | 10 +++++----- list.c | 38 ++++++++++++++++++++++++++++++++++++++ puzzles.h | 8 ++++++-- sixteen.c | 4 ++++ 4 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 list.c diff --git a/cube.c b/cube.c index 71c56d8..145a1e5 100644 --- a/cube.c +++ b/cube.c @@ -25,7 +25,7 @@ struct solid { float border; /* border required around arena */ }; -static const struct solid tetrahedron = { +static const struct solid s_tetrahedron = { 4, { 0.0F, -0.57735026919F, -0.20412414523F, @@ -46,7 +46,7 @@ static const struct solid tetrahedron = { 0.0F, 0.3F }; -static const struct solid cube = { +static const struct solid s_cube = { 8, { -0.5F,-0.5F,-0.5F, -0.5F,-0.5F,+0.5F, @@ -66,7 +66,7 @@ static const struct solid cube = { 0.3F, 0.5F }; -static const struct solid octahedron = { +static const struct solid s_octahedron = { 6, { -0.5F, -0.28867513459472505F, 0.4082482904638664F, @@ -93,7 +93,7 @@ static const struct solid octahedron = { 0.0F, 0.5F }; -static const struct solid icosahedron = { +static const struct solid s_icosahedron = { 12, { 0.0F, 0.57735026919F, 0.75576131408F, @@ -145,7 +145,7 @@ enum { TETRAHEDRON, CUBE, OCTAHEDRON, ICOSAHEDRON }; static const struct solid *solids[] = { - &tetrahedron, &cube, &octahedron, &icosahedron + &s_tetrahedron, &s_cube, &s_octahedron, &s_icosahedron }; enum { diff --git a/list.c b/list.c new file mode 100644 index 0000000..9438c7e --- /dev/null +++ b/list.c @@ -0,0 +1,38 @@ +/* + * list.c: List of puzzles. + */ + +#include "puzzles.h" + +/* + * The available games can be most easily enumerated by searching + * for the line in each game source file saying "#define thegame + * ". Hence, the following piece of shell/Perl should + * regenerate this list automatically: + +perl -ne '/^#define thegame (\S+)/ and $1 ne "nullgame" and print "extern const game $1;\n"' *.c +echo -e '\nconst game *gamelist[] = {' +perl -ne '/^#define thegame (\S+)/ and $1 ne "nullgame" and print " &$1,\n"' *.c +echo -e '};\n\nconst int gamecount = lenof(gamelist);' + + */ + +extern const game cube; +extern const game fifteen; +extern const game net; +extern const game netslide; +extern const game pattern; +extern const game rect; +extern const game sixteen; + +const game *gamelist[] = { + &cube, + &fifteen, + &net, + &netslide, + &pattern, + &rect, + &sixteen, +}; + +const int gamecount = lenof(gamelist); diff --git a/puzzles.h b/puzzles.h index a9f1a92..4de81a7 100644 --- a/puzzles.h +++ b/puzzles.h @@ -201,9 +201,13 @@ struct game { /* * For one-game-at-a-time platforms, there's a single structure - * like the above, under a fixed name. + * like the above, under a fixed name. For all-at-once platforms, + * there's a list of all available puzzles in array form. */ -#ifndef COMBINED +#ifdef COMBINED +extern const game *gamelist[]; +extern const int gamecount; +#else extern const game thegame; #endif diff --git a/sixteen.c b/sixteen.c index ddafdd6..828168e 100644 --- a/sixteen.c +++ b/sixteen.c @@ -769,6 +769,10 @@ static int game_wants_statusbar(void) return TRUE; } +#ifdef COMBINED +#define thegame sixteen +#endif + const struct game thegame = { "Sixteen", "games.sixteen", TRUE, default_params, -- 2.11.0