Moved dungeon.c and dungeon.h templates into external files. 259/head
authorAaron Traas <aaron@traas.org>
Sun, 23 Jul 2017 16:07:10 +0000 (12:07 -0400)
committerAaron Traas <aaron@traas.org>
Sun, 23 Jul 2017 16:15:25 +0000 (12:15 -0400)
Also refactored to use named vars in the templates, so it's easier to
refactor, as order when you call .format() isn't important.

make_dungeon.py
templates/coverage_dungeon.html.tpl [new file with mode: 0644]
templates/dungeon.c.tpl [new file with mode: 0644]
templates/dungeon.h.tpl [new file with mode: 0644]
tests/coverage_dungeon.html.tpl [deleted file]
tests/coverage_dungeon.py

index 03b5b04229fc60023a378208cc8525fb8873bb97..6ac5ba15dc9c90dcf4e54dfe82c96237ffda951b 100755 (executable)
 
 import sys, yaml
 
-yaml_name = "adventure.yaml"
-h_name = "dungeon.h"
-c_name = "dungeon.c"
+YAML_NAME = "adventure.yaml"
+H_NAME = "dungeon.h"
+C_NAME = "dungeon.c"
+H_TEMPLATE_PATH = "templates/dungeon.h.tpl"
+C_TEMPLATE_PATH = "templates/dungeon.c.tpl"
 
-statedefines = ""
-
-h_template = """/* Generated from adventure.yaml - do not hand-hack! */
-#ifndef DUNGEON_H
-#define DUNGEON_H
-
-#include <stdio.h>
-#include <stdbool.h>
-
-#define SILENT -1      /* no sound */
-
-/* Symbols for cond bits */
-#define COND_LIT       0       /* Light */
-#define COND_OILY      1       /* If bit 2 is on: on for oil, off for water */
-#define COND_FLUID     2       /* Liquid asset, see bit 1 */
-#define COND_NOARRR    3       /* Pirate doesn't go here unless following */
-#define COND_NOBACK    4       /* Cannot use "back" to move away */
-#define COND_ABOVE     5
-#define COND_DEEP      6       /* Deep - e.g where dwarves are active */
-#define COND_FOREST    7       /* In the forest */
-#define COND_FORCED    8       /* Only one way in or out of here */
-/* Bits past 10 indicate areas of interest to "hint" routines */
-#define COND_HBASE     10      /* Base for location hint bits */
-#define COND_HCAVE     11      /* Trying to get into cave */
-#define COND_HBIRD     12      /* Trying to catch bird */
-#define COND_HSNAKE    13      /* Trying to deal with snake */
-#define COND_HMAZE     14      /* Lost in maze */
-#define COND_HDARK     15      /* Pondering dark room */
-#define COND_HWITT     16      /* At Witt's End */
-#define COND_HCLIFF    17      /* Cliff with urn */
-#define COND_HWOODS    18      /* Lost in forest */
-#define COND_HOGRE     19      /* Trying to deal with ogre */
-#define COND_HJADE     20      /* Found all treasures except jade */
-
-typedef struct {{
-  const char** strs;
-  const int n;
-}} string_group_t;
-
-typedef struct {{
-  const string_group_t words;
-  const char* inventory;
-  int plac, fixd;
-  bool is_treasure;
-  const char** descriptions;
-  const char** sounds;
-  const char** texts;
-  const char** changes;
-}} object_t;
-
-typedef struct {{
-  const char* small;
-  const char* big;
-}} descriptions_t;
-
-typedef struct {{
-  descriptions_t description;
-  const long sound;
-  const bool loud;
-}} location_t;
-
-typedef struct {{
-  const char* query;
-  const char* yes_response;
-}} obituary_t;
-
-typedef struct {{
-  const int threshold;
-  const int point_loss;
-  const char* message;
-}} turn_threshold_t;
-
-typedef struct {{
-  const int threshold;
-  const char* message;
-}} class_t;
-
-typedef struct {{
-  const int number;
-  const int turns;
-  const int penalty;
-  const char* question;
-  const char* hint;
-}} hint_t;
-
-typedef struct {{
-  const string_group_t words;
-}} motion_t;
-
-typedef struct {{
-  const string_group_t words;
-  const char* message;
-  const bool noaction;
-}} action_t;
-
-enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}};
-enum desttype_t {{dest_goto, dest_special, dest_speak}};
-
-typedef struct {{
-  const long motion;
-  const long condtype;
-  const long condarg1;
-  const long condarg2;
-  const enum desttype_t desttype;
-  const long destval;
-  const bool nodwarves;
-  const bool stop;
-}} travelop_t;
-
-/* Abstract out the encoding of words in the travel array.  Gives us
- * some hope of getting to a less cryptic representation than we
- * inherited from FORTRAN, someday. To understand these, read the
- * encoding description for travel.
- */
-#define T_TERMINATE(entry)     ((entry).motion == 1)
-
-extern const location_t locations[];
-extern const object_t objects[];
-extern const char* arbitrary_messages[];
-extern const class_t classes[];
-extern const turn_threshold_t turn_thresholds[];
-extern const obituary_t obituaries[];
-extern const hint_t hints[];
-extern long conditions[];
-extern const motion_t motions[];
-extern const action_t actions[];
-extern const travelop_t travel[];
-extern const long tkey[];
-extern const char *ignore;
-
-#define NLOCATIONS     {}
-#define NOBJECTS       {}
-#define NHINTS         {}
-#define NCLASSES       {}
-#define NDEATHS                {}
-#define NTHRESHOLDS    {}
-#define NMOTIONS    {}
-#define NACTIONS       {}
-#define NTRAVEL                {}
-#define NKEYS          {}
-
-#define BIRD_ENDSTATE  {}
-
-enum arbitrary_messages_refs {{
-{}
-}};
-
-enum locations_refs {{
-{}
-}};
-
-enum object_refs {{
-{}
-}};
-
-enum motion_refs {{
-{}
-}};
-
-enum action_refs {{
-{}
-}};
-
-/* State definitions */
-
-{}
-#endif /* end DUNGEON_H */
-"""
-
-c_template = """/* Generated from adventure.yaml - do not hand-hack! */
-
-#include "{}"
-
-const char* arbitrary_messages[] = {{
-{}
-}};
-
-const class_t classes[] = {{
-{}
-}};
-
-const turn_threshold_t turn_thresholds[] = {{
-{}
-}};
-
-const location_t locations[] = {{
-{}
-}};
-
-const object_t objects[] = {{
-{}
-}};
-
-const obituary_t obituaries[] = {{
-{}
-}};
-
-const hint_t hints[] = {{
-{}
-}};
-
-long conditions[] = {{
-{}
-}};
+DONOTEDIT_COMMENT = "/* Generated from adventure.yaml - do not hand-hack! */\n\n"
 
-const motion_t motions[] = {{
-{}
-}};
-
-const action_t actions[] = {{
-{}
-}};
-
-const long tkey[] = {{{}}};
-
-const travelop_t travel[] = {{
-{}
-}};
-
-const char *ignore = \"{}\";
-
-/* end */
-"""
+statedefines = ""
 
 def make_c_string(string):
     """Render a Python string into C string literal format."""
@@ -738,7 +520,7 @@ def get_travel(travel):
     return out
 
 if __name__ == "__main__":
-    with open(yaml_name, "r") as f:
+    with open(YAML_NAME, "r") as f:
         db = yaml.load(f)
 
     locnames = [x[0] for x in db["locations"]]
@@ -749,21 +531,32 @@ if __name__ == "__main__":
     (travel, tkey) = buildtravel(db["locations"],
                                  db["objects"])
     ignore = ""
+    try:
+        with open(H_TEMPLATE_PATH, "r") as htf:
+            # read in dungeon.h template
+            h_template = DONOTEDIT_COMMENT + htf.read()
+        with open(C_TEMPLATE_PATH, "r") as ctf:
+            # read in dungeon.c template
+            c_template = DONOTEDIT_COMMENT + ctf.read()
+    except IOError as e:
+        print('ERROR: reading template failed ({})'.format(e.strerror))
+        exit(-1)
+
     c = c_template.format(
-        h_name,
-        get_arbitrary_messages(db["arbitrary_messages"]),
-        get_class_messages(db["classes"]),
-        get_turn_thresholds(db["turn_thresholds"]),
-        get_locations(db["locations"]),
-        get_objects(db["objects"]),
-        get_obituaries(db["obituaries"]),
-        get_hints(db["hints"], db["arbitrary_messages"]),
-        get_condbits(db["locations"]),
-        get_motions(db["motions"]),
-        get_actions(db["actions"]),
-        bigdump(tkey),
-        get_travel(travel), 
-        ignore,
+        h_file             = H_NAME,
+        arbitrary_messages = get_arbitrary_messages(db["arbitrary_messages"]),
+        classes            = get_class_messages(db["classes"]),
+        turn_thresholds    = get_turn_thresholds(db["turn_thresholds"]),
+        locations          = get_locations(db["locations"]),
+        objects            = get_objects(db["objects"]),
+        obituaries         = get_obituaries(db["obituaries"]),
+        hints              = get_hints(db["hints"], db["arbitrary_messages"]),
+        conditions         = get_condbits(db["locations"]),
+        motions            = get_motions(db["motions"]),
+        actions            = get_actions(db["actions"]),
+        tkeys              = bigdump(tkey),
+        travel             = get_travel(travel), 
+        ignore             = ignore
     )
 
     # 0-origin index of birds's last song.  Bird should
@@ -771,29 +564,29 @@ if __name__ == "__main__":
     deathbird = len(dict(db["objects"])["BIRD"]["sounds"]) - 1
 
     h = h_template.format(
-        len(db["locations"])-1,
-        len(db["objects"])-1,
-        len(db["hints"]),
-        len(db["classes"])-1,
-        len(db["obituaries"]),
-        len(db["turn_thresholds"]),
-        len(db["motions"]),
-        len(db["actions"]),
-        len(travel),
-        len(tkey),
-        deathbird,
-        get_refs(db["arbitrary_messages"]),
-        get_refs(db["locations"]),
-        get_refs(db["objects"]),
-        get_refs(db["motions"]),
-        get_refs(db["actions"]),
-        statedefines,
+        num_locations      = len(db["locations"])-1,
+        num_objects        = len(db["objects"])-1,
+        num_hints          = len(db["hints"]),
+        num_classes        = len(db["classes"])-1,
+        num_deaths         = len(db["obituaries"]),
+        num_thresholds     = len(db["turn_thresholds"]),
+        num_motions        = len(db["motions"]),
+        num_actions        = len(db["actions"]),
+        num_travel         = len(travel),
+        num_keys           = len(tkey),
+        bird_endstate      = deathbird,
+        arbitrary_messages = get_refs(db["arbitrary_messages"]),
+        locations          = get_refs(db["locations"]),
+        objects            = get_refs(db["objects"]),
+        motions            = get_refs(db["motions"]),
+        actions            = get_refs(db["actions"]),
+        state_definitions  = statedefines
     )
 
-    with open(h_name, "w") as hf:
+    with open(H_NAME, "w") as hf:
         hf.write(h)
 
-    with open(c_name, "w") as cf:
+    with open(C_NAME, "w") as cf:
         cf.write(c)
 
 # end
diff --git a/templates/coverage_dungeon.html.tpl b/templates/coverage_dungeon.html.tpl
new file mode 100644 (file)
index 0000000..372c43f
--- /dev/null
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html lang="en">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>Coverage - adventure.yaml</title>
+    <link rel="stylesheet" type="text/css" href="gcov.css">
+    <style>
+        .covered {{
+            text-align: center;
+            background-color: #A7FC9D;
+        }}
+        .covered::before {{
+            content: '\002714';
+        }}
+        .uncovered {{
+            text-align: center;
+            background-color: #FF0000;
+        }}
+        .uncovered::before {{
+            content: '\002715';
+        }}
+    </style>
+</head>
+<body>
+    <table width="100%" border=0 cellspacing=0 cellpadding=0>
+        <tr>
+            <td class="title" colspan="2">adventure.yaml Coverage report</td>
+        </tr>
+        <tr>
+            <td class="ruler" colspan="2"><img src="glass.png" width=3 height=3 alt=""></td>
+        </tr>
+        <tr valign="top">
+            <td>
+                <table cellpadding=1 border=0 width="100%">
+                    <tr>
+                        <td width="10%" class="headerItem">Test:</a></td>
+                        <td width="35%" class="headerValue">adventure.yaml</td>
+                        <td width="65%"></td>
+                    </tr>
+                    <tr>
+                        <td class="headerItem">Date:</a></td>
+                        <td class="headerValue">2017-07-07 21:47:56</td>
+                        <td></td>
+                    </tr>
+                </table>
+            </td>
+            <td>
+                <table cellpadding=1 border=0 width="100%">
+                    <tr>
+                        <td width="55%"></td>
+                        <td width="15%" class="headerCovTableHead">Total</td>
+                        <td width="15%" class="headerCovTableHead">Covered</td>
+                        <td width="15%" class="headerCovTableHead">% Coverage</td>
+                    </tr>
+                    {summary}
+                </table>
+            </td>
+        </tr>
+        <tr>
+            <td><img src="glass.png" width=3 height=3 alt=""></td>
+        </tr>
+        <tr>
+            <td class="ruler" colspan="2"><img src="glass.png" width=3 height=3 alt=""></td>
+        </tr>
+    </table>
+    <br>
+    <center>
+        <table width="60%" border=0 cellpadding=1 cellspacing=1>
+        {categories}
+        </table>
+    </center>
+    <br>
+    <table width="100%" border=0 cellspacing=0 cellpadding=0>
+        <tr>
+            <td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td>
+        </tr>
+        <tr>
+            <td class="versionInfo">Generated by: <a href="https://gitlab.com/esr/open-adventure/blob/master/tests/coverage_dungeon.py">Open Adventure Dungeon Coverage Generator</a></td>
+        </tr>
+    </table>
+    <br>
+</body>
+</html>
diff --git a/templates/dungeon.c.tpl b/templates/dungeon.c.tpl
new file mode 100644 (file)
index 0000000..dbc28a6
--- /dev/null
@@ -0,0 +1,51 @@
+#include "{h_file}"
+
+const char* arbitrary_messages[] = {{
+{arbitrary_messages}
+}};
+
+const class_t classes[] = {{
+{classes}
+}};
+
+const turn_threshold_t turn_thresholds[] = {{
+{turn_thresholds}
+}};
+
+const location_t locations[] = {{
+{locations}
+}};
+
+const object_t objects[] = {{
+{objects}
+}};
+
+const obituary_t obituaries[] = {{
+{obituaries}
+}};
+
+const hint_t hints[] = {{
+{hints}
+}};
+
+long conditions[] = {{
+{conditions}
+}};
+
+const motion_t motions[] = {{
+{motions}
+}};
+
+const action_t actions[] = {{
+{actions}
+}};
+
+const long tkey[] = {{{tkeys}}};
+
+const travelop_t travel[] = {{
+{travel}
+}};
+
+const char *ignore = "{ignore}";
+
+/* end */
\ No newline at end of file
diff --git a/templates/dungeon.h.tpl b/templates/dungeon.h.tpl
new file mode 100644 (file)
index 0000000..4dde750
--- /dev/null
@@ -0,0 +1,165 @@
+#ifndef DUNGEON_H
+#define DUNGEON_H
+
+#include <stdio.h>
+#include <stdbool.h>
+
+#define SILENT -1      /* no sound */
+
+/* Symbols for cond bits */
+#define COND_LIT       0       /* Light */
+#define COND_OILY      1       /* If bit 2 is on: on for oil, off for water */
+#define COND_FLUID     2       /* Liquid asset, see bit 1 */
+#define COND_NOARRR    3       /* Pirate doesn't go here unless following */
+#define COND_NOBACK    4       /* Cannot use "back" to move away */
+#define COND_ABOVE     5
+#define COND_DEEP      6       /* Deep - e.g where dwarves are active */
+#define COND_FOREST    7       /* In the forest */
+#define COND_FORCED    8       /* Only one way in or out of here */
+/* Bits past 10 indicate areas of interest to "hint" routines */
+#define COND_HBASE     10      /* Base for location hint bits */
+#define COND_HCAVE     11      /* Trying to get into cave */
+#define COND_HBIRD     12      /* Trying to catch bird */
+#define COND_HSNAKE    13      /* Trying to deal with snake */
+#define COND_HMAZE     14      /* Lost in maze */
+#define COND_HDARK     15      /* Pondering dark room */
+#define COND_HWITT     16      /* At Witt's End */
+#define COND_HCLIFF    17      /* Cliff with urn */
+#define COND_HWOODS    18      /* Lost in forest */
+#define COND_HOGRE     19      /* Trying to deal with ogre */
+#define COND_HJADE     20      /* Found all treasures except jade */
+
+typedef struct {{
+  const char** strs;
+  const int n;
+}} string_group_t;
+
+typedef struct {{
+  const string_group_t words;
+  const char* inventory;
+  int plac, fixd;
+  bool is_treasure;
+  const char** descriptions;
+  const char** sounds;
+  const char** texts;
+  const char** changes;
+}} object_t;
+
+typedef struct {{
+  const char* small;
+  const char* big;
+}} descriptions_t;
+
+typedef struct {{
+  descriptions_t description;
+  const long sound;
+  const bool loud;
+}} location_t;
+
+typedef struct {{
+  const char* query;
+  const char* yes_response;
+}} obituary_t;
+
+typedef struct {{
+  const int threshold;
+  const int point_loss;
+  const char* message;
+}} turn_threshold_t;
+
+typedef struct {{
+  const int threshold;
+  const char* message;
+}} class_t;
+
+typedef struct {{
+  const int number;
+  const int turns;
+  const int penalty;
+  const char* question;
+  const char* hint;
+}} hint_t;
+
+typedef struct {{
+  const string_group_t words;
+}} motion_t;
+
+typedef struct {{
+  const string_group_t words;
+  const char* message;
+  const bool noaction;
+}} action_t;
+
+enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}};
+enum desttype_t {{dest_goto, dest_special, dest_speak}};
+
+typedef struct {{
+  const long motion;
+  const long condtype;
+  const long condarg1;
+  const long condarg2;
+  const enum desttype_t desttype;
+  const long destval;
+  const bool nodwarves;
+  const bool stop;
+}} travelop_t;
+
+/* Abstract out the encoding of words in the travel array.  Gives us
+ * some hope of getting to a less cryptic representation than we
+ * inherited from FORTRAN, someday. To understand these, read the
+ * encoding description for travel.
+ */
+#define T_TERMINATE(entry)     ((entry).motion == 1)
+
+extern const location_t locations[];
+extern const object_t objects[];
+extern const char* arbitrary_messages[];
+extern const class_t classes[];
+extern const turn_threshold_t turn_thresholds[];
+extern const obituary_t obituaries[];
+extern const hint_t hints[];
+extern long conditions[];
+extern const motion_t motions[];
+extern const action_t actions[];
+extern const travelop_t travel[];
+extern const long tkey[];
+extern const char *ignore;
+
+#define NLOCATIONS     {num_locations}
+#define NOBJECTS       {num_objects}
+#define NHINTS         {num_hints}
+#define NCLASSES       {num_classes}
+#define NDEATHS                {num_deaths}
+#define NTHRESHOLDS    {num_thresholds}
+#define NMOTIONS    {num_motions}
+#define NACTIONS       {num_actions}
+#define NTRAVEL                {num_travel}
+#define NKEYS          {num_keys}
+
+#define BIRD_ENDSTATE {bird_endstate}
+
+enum arbitrary_messages_refs {{
+{arbitrary_messages}
+}};
+
+enum locations_refs {{
+{locations}
+}};
+
+enum object_refs {{
+{objects}
+}};
+
+enum motion_refs {{
+{motions}
+}};
+
+enum action_refs {{
+{actions}
+}};
+
+/* State definitions */
+
+{state_definitions}
+
+#endif /* end DUNGEON_H */
\ No newline at end of file
diff --git a/tests/coverage_dungeon.html.tpl b/tests/coverage_dungeon.html.tpl
deleted file mode 100644 (file)
index 372c43f..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html lang="en">
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <title>Coverage - adventure.yaml</title>
-    <link rel="stylesheet" type="text/css" href="gcov.css">
-    <style>
-        .covered {{
-            text-align: center;
-            background-color: #A7FC9D;
-        }}
-        .covered::before {{
-            content: '\002714';
-        }}
-        .uncovered {{
-            text-align: center;
-            background-color: #FF0000;
-        }}
-        .uncovered::before {{
-            content: '\002715';
-        }}
-    </style>
-</head>
-<body>
-    <table width="100%" border=0 cellspacing=0 cellpadding=0>
-        <tr>
-            <td class="title" colspan="2">adventure.yaml Coverage report</td>
-        </tr>
-        <tr>
-            <td class="ruler" colspan="2"><img src="glass.png" width=3 height=3 alt=""></td>
-        </tr>
-        <tr valign="top">
-            <td>
-                <table cellpadding=1 border=0 width="100%">
-                    <tr>
-                        <td width="10%" class="headerItem">Test:</a></td>
-                        <td width="35%" class="headerValue">adventure.yaml</td>
-                        <td width="65%"></td>
-                    </tr>
-                    <tr>
-                        <td class="headerItem">Date:</a></td>
-                        <td class="headerValue">2017-07-07 21:47:56</td>
-                        <td></td>
-                    </tr>
-                </table>
-            </td>
-            <td>
-                <table cellpadding=1 border=0 width="100%">
-                    <tr>
-                        <td width="55%"></td>
-                        <td width="15%" class="headerCovTableHead">Total</td>
-                        <td width="15%" class="headerCovTableHead">Covered</td>
-                        <td width="15%" class="headerCovTableHead">% Coverage</td>
-                    </tr>
-                    {summary}
-                </table>
-            </td>
-        </tr>
-        <tr>
-            <td><img src="glass.png" width=3 height=3 alt=""></td>
-        </tr>
-        <tr>
-            <td class="ruler" colspan="2"><img src="glass.png" width=3 height=3 alt=""></td>
-        </tr>
-    </table>
-    <br>
-    <center>
-        <table width="60%" border=0 cellpadding=1 cellspacing=1>
-        {categories}
-        </table>
-    </center>
-    <br>
-    <table width="100%" border=0 cellspacing=0 cellpadding=0>
-        <tr>
-            <td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td>
-        </tr>
-        <tr>
-            <td class="versionInfo">Generated by: <a href="https://gitlab.com/esr/open-adventure/blob/master/tests/coverage_dungeon.py">Open Adventure Dungeon Coverage Generator</a></td>
-        </tr>
-    </table>
-    <br>
-</body>
-</html>
index 0a24865c7abbe7e41a7b66a42d4d863e7169d232..6484fa79b008f0ff15d95bd6e530c0cc5275e3a3 100755 (executable)
@@ -14,7 +14,7 @@ import re
 
 TEST_DIR = "."
 YAML_PATH = "../adventure.yaml"
-HTML_TEMPLATE_PATH = "coverage_dungeon.html.tpl"
+HTML_TEMPLATE_PATH = "../templates/coverage_dungeon.html.tpl"
 DEFAULT_HTML_OUTPUT_PATH = "../coverage/adventure.yaml.html"
 
 STDOUT_REPORT_CATEGORY = "  {name:.<19}: {percent:5.1f}% covered ({covered} of {total})\n"