Arrange that we really _can_ compile all the puzzles into a single
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 22 Jan 2005 15:29:01 +0000 (15:29 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 22 Jan 2005 15:29:01 +0000 (15:29 +0000)
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
list.c [new file with mode: 0644]
puzzles.h
sixteen.c

diff --git a/cube.c b/cube.c
index 71c56d8..145a1e5 100644 (file)
--- 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 (file)
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
+ * <gamename>". 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);
index a9f1a92..4de81a7 100644 (file)
--- 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
 
index ddafdd6..828168e 100644 (file)
--- 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,