From 54713bb29c5182f9e7f18e754f97c0a4869e9e3c Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Wed, 11 Aug 2021 12:06:05 +0100 Subject: [PATCH] Revised to pave way for ctags files --- .gitignore | 2 +- docs-src/compiler.inweb | 27 +- docs/compiler.html | 27 +- docs/core-module/P-wtmd.html | 2 - docs/docs-assets/Extracts-Colours.css | 39 ++ docs/final-module/5-fnc.html | 538 ++++++++++++++++++ inblorb/.gitignore | 1 + inbuild/.gitignore | 1 + indoc/.gitignore | 1 + inform7/.gitignore | 1 + inform7/Figures/timings-diagnostics.txt | 8 +- inform7/Internal/Miscellany/inform7_clib.h | 1 - .../Preliminaries/What This Module Does.w | 2 - inpolicy/.gitignore | 1 + inrtps/.gitignore | 1 + inter/.gitignore | 1 + inter/building-test/.gitignore | 1 + inter/final-module/Chapter 5/Final C.w | 536 +++++++++++++++++ scripts/gitignorescript.txt | 2 +- scripts/makescript.txt | 12 +- services/arch-test/.gitignore | 1 + services/calculus-test/.gitignore | 1 + services/inflections-test/.gitignore | 1 + services/kinds-test/.gitignore | 1 + services/linguistics-test/.gitignore | 1 + services/problems-test/.gitignore | 1 + services/syntax-test/.gitignore | 1 + services/words-test/.gitignore | 1 + 28 files changed, 1172 insertions(+), 40 deletions(-) create mode 100644 docs/docs-assets/Extracts-Colours.css diff --git a/.gitignore b/.gitignore index fb9f31c26..28de63db9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ gameinfo.dbg gametext.txt makefile - +tags *.glkdata resources/Changes/Output/ diff --git a/docs-src/compiler.inweb b/docs-src/compiler.inweb index 646c3b8fd..f29162d46 100755 --- a/docs-src/compiler.inweb +++ b/docs-src/compiler.inweb @@ -23,22 +23,21 @@ or other standard C compilers. \ / \|/ \|/ syntax tree - | kit sources | - (in Inform 6 code) | INFORM7 Stages 2 to 4 + (in Inform 6 code) | INFORM7 Stages 2 to 5 INTER | | \|/ \|/ precompiled Inter trees Inter tree \ / - \ / INFORM7 Stage 5 or INTER + \ / INFORM7 Stage 6 or INTER \|/ \|/ single linked Inter tree / | \ - I / | \ INFORM7 Stage 6 or INTER + / | \ INFORM7 Stage 7 or INTER \|/ \|/ \|/ Inform 6 code C code index mini-website | | - INFORM6 | | CLANG/GCC + INFORM6 | | CLANG or GCC \|/ \|/ story file executable | @@ -48,7 +47,7 @@ or other standard C compilers. = @ The Inform 7 transpiler, then, occupies the top two-thirds of the above diagram. -Broadly speaking, it runs in six stages, and the code for each stage is made +Broadly speaking, it runs in seven stages, and the code for each stage is made up of one or more "modules", as follows: (*) Stage 1. A build manager called //supervisor// gathers what must be compiled. (*) Stage 2. //core// organises compilation of a single Inform project, @@ -60,15 +59,16 @@ provide "plugins" to this process with additional features, adapting the languag for interactive fiction. (*) Stage 4. //imperative// and //runtime// turn the constructs from Stage 3 into an intermediate bytecode format called Inter. -(*) Stage 5. //bytecode//, //building// and //pipeline// manage, create, link -and optimise this Inter code. -(*) Stage 6. //final// generates final code and //index// generates human-readable +(*) Stage 5. //bytecode// and //building// manage and create Inter code. This is +more of a layer than a stage, providing services to Stages 4, 6 and 7. +(*) Stage 6. //pipeline// links and optimises this Inter code. +(*) Stage 7. //final// generates final code and //index// generates human-readable Index pages, which forn a small website about the project. Inform 7 presents as three command-line tools, not one: //inbuild//, //inform7// and //inter//. Really, though, they are three points of access to the same code base. //inbuild// contains Stage 1 as a stand-alone tool, //inter// contains Stages -5 and 6 as a stand-alone tool, and //inform7// is the entire compiler (Stages 1 to 6) +5 to 7 as a stand-alone tool, and //inform7// is the entire compiler (Stages 1 to 7) in one. Each tool has its own CLI (or "command-line interface"): see //inbuild: Manual//, //inform7: Manual//, //inter: Manual// and //inbuild: Reference Card//, //inform7: Reference Card//, //inter: Reference Card//. @@ -97,10 +97,11 @@ The full breakdown of these three tools into modules is as follows: . . +------------------+ +------------------------+ . . . . | //bytecode//-module | } . . . . | //building//-module | } Stage 5 - . . . . | //pipeline//-module | } . . . . | ------------------------- | - . . . . | //final//-module | } - . . . . | //index//-module | } Stage 6 + . . . . | //pipeline//-module | } Stage 6 + . . . . | ------------------------- | + . . . . | //final//-module | } Stage 7 + . . . . | //index//-module | } . . . . +---------------------------+ . . . . . . +-----------------------------------------------------------------------+ diff --git a/docs/compiler.html b/docs/compiler.html index dc4df6210..c82da13fc 100644 --- a/docs/compiler.html +++ b/docs/compiler.html @@ -88,22 +88,21 @@ or other standard C compilers. \ / \|/ \|/ syntax tree - | kit sources | - (in Inform 6 code) | INFORM7 Stages 2 to 4 + (in Inform 6 code) | INFORM7 Stages 2 to 5 INTER | | \|/ \|/ precompiled Inter trees Inter tree \ / - \ / INFORM7 Stage 5 or INTER + \ / INFORM7 Stage 6 or INTER \|/ \|/ single linked Inter tree / | \ - I / | \ INFORM7 Stage 6 or INTER + / | \ INFORM7 Stage 7 or INTER \|/ \|/ \|/ Inform 6 code C code index mini-website | | - INFORM6 | | CLANG/GCC + INFORM6 | | CLANG or GCC \|/ \|/ story file executable | @@ -112,7 +111,7 @@ or other standard C compilers. playable website

§2. The Inform 7 transpiler, then, occupies the top two-thirds of the above diagram. -Broadly speaking, it runs in six stages, and the code for each stage is made +Broadly speaking, it runs in seven stages, and the code for each stage is made up of one or more "modules", as follows:

@@ -126,15 +125,16 @@ provide "plugins" to this process with additional features, adapting the languag for interactive fiction.
  • ● Stage 4. imperative and runtime turn the constructs from Stage 3 into an intermediate bytecode format called Inter. -
  • ● Stage 5. bytecode, building and pipeline manage, create, link -and optimise this Inter code. -
  • ● Stage 6. final generates final code and index generates human-readable +
  • ● Stage 5. bytecode and building manage and create Inter code. This is +more of a layer than a stage, providing services to Stages 4, 6 and 7. +
  • ● Stage 6. pipeline links and optimises this Inter code. +
  • ● Stage 7. final generates final code and index generates human-readable Index pages, which forn a small website about the project.
  • Inform 7 presents as three command-line tools, not one: inbuild, inform7 and inter. Really, though, they are three points of access to the same code base. inbuild contains Stage 1 as a stand-alone tool, inter contains Stages -5 and 6 as a stand-alone tool, and inform7 is the entire compiler (Stages 1 to 6) +5 to 7 as a stand-alone tool, and inform7 is the entire compiler (Stages 1 to 7) in one. Each tool has its own CLI (or "command-line interface"): see Manual (in inbuild), Manual (in inform7), Manual (in inter) and Reference Card (in inbuild), Reference Card (in inform7), Reference Card (in inter). @@ -166,10 +166,11 @@ in one. Each tool has its own CLI (or "command-line interface"): see . . +------------------+ +------------------------+ . . . . | bytecode-module | } . . . . | building-module | } Stage 5 - . . . . | pipeline-module | } . . . . | ------------------------- | - . . . . | final-module | } - . . . . | index-module | } Stage 6 + . . . . | pipeline-module | } Stage 6 + . . . . | ------------------------- | + . . . . | final-module | } Stage 7 + . . . . | index-module | } . . . . +---------------------------+ . . . . . . +-----------------------------------------------------------------------+ diff --git a/docs/core-module/P-wtmd.html b/docs/core-module/P-wtmd.html index 500b3fcd7..91f91c273 100644 --- a/docs/core-module/P-wtmd.html +++ b/docs/core-module/P-wtmd.html @@ -107,8 +107,6 @@ values and descriptions are parsed and then stored within the compiler. imperative module, the part of Inform most resembling a conventional compiler.

  • ● The runtime module compiles run-time support functions and data structures needed to make Inform's many concepts work at run-time. -
  • ● Last and least, the index module makes the browsable HTML-format index -for a compiled project, viewable in the Inform user interface applications.
  • There are then two expansion packs, as it were: the if and multimedia modules, which do nothing essential but add support for interactive fiction diff --git a/docs/docs-assets/Extracts-Colours.css b/docs/docs-assets/Extracts-Colours.css new file mode 100644 index 000000000..a6038534f --- /dev/null +++ b/docs/docs-assets/Extracts-Colours.css @@ -0,0 +1,39 @@ +/* The following correspond to the Inweb colours !definition, ..., !comment: */ + +span.Extracts-definition-syntax { color: #444444; } +span.Extracts-function-syntax { color: #C00000; } +span.Extracts-identifier-syntax { color: #4040ff; } +span.Extracts-element-syntax { color: #40407f; } +span.Extracts-reserved-syntax { color: #600000; } +span.Extracts-string-syntax { color: #408040; } +span.Extracts-character-syntax { color: #204020; } +span.Extracts-constant-syntax { color: #804020; } +span.Extracts-plain-syntax { color: #000000; } +span.Extracts-extract-syntax { color: #444444; } +span.Extracts-comment-syntax { color: #404040; font-style:italic; } + +/* This is used for the "define" or "enum" keyword on Inweb-defined constants: */ + +span.Extracts-definition-keyword { color:#801010; font-weight:bold; } + +/* These are for the angle-bracketed paragraph names: */ + +span.Extracts-named-paragraph, span.Extracts-named-paragraph-defn { color: #000000; font-size: 90%; } +span.Extracts-named-paragraph-number { color: #000000; font-size: 70%; font-style:italic; } +span.Extracts-named-paragraph-container { + background: #ececf8; border: 1px solid #888888; +} +a.named-paragraph-link:link, a.named-paragraph-link:visited { + text-decoration: none; +} +a.named-paragraph-link:active, a.named-paragraph-link:hover { + background: #c8c8e8; +} + +/* This is the box into which multi-line stretches of code are put: */ + +pre.Extracts-displayed-code { + background: #FFFFE0; + border: 1px dashed #cccccc; +} + diff --git a/docs/final-module/5-fnc.html b/docs/final-module/5-fnc.html index db23a411e..4be3bd2b7 100644 --- a/docs/final-module/5-fnc.html +++ b/docs/final-module/5-fnc.html @@ -21,6 +21,7 @@ function togglePopup(material_id) { + @@ -77,6 +78,543 @@ function togglePopup(material_id) {

    §1. Target.

    +
    +#include <stdlib.h>
    +#include <stdio.h>
    +
    +typedef int i7val;
    +typedef unsigned char i7byte;
    +typedef struct i7varargs {
    +    i7val args[10];
    +} i7varargs;
    +
    +i7val i7_tmp = 0;
    +int i7_seed = 197;
    +
    +i7val i7_prop_value(i7val obj, i7val pr) {
    +    printf("Unimplemented: i7_prop_value.\n");
    +    return 0;
    +}
    +
    +#define i7_cpv_SET 1
    +#define i7_cpv_PREDEC 2
    +#define i7_cpv_POSTDEC 3
    +#define i7_cpv_PREINC 4
    +#define i7_cpv_POSTINC 5
    +
    +void i7_assign(i7val owner, i7val prop, i7val val, i7val inst) {
    +    printf("Unimplemented: i7_assign.\n");
    +}
    +
    +i7val i7_change_prop_value(i7val obj, i7val pr, i7val to, int way) {
    +    i7val val = i7_prop_value(obj, pr), new_val = val;
    +    switch (way) {
    +        case i7_cpv_SET:     i7_assign(obj, pr, to, 1); new_val = to; break;
    +        case i7_cpv_PREDEC:  new_val = val; i7_assign(obj, pr, val-1, 1); break;
    +        case i7_cpv_POSTDEC: new_val = val-1; i7_assign(obj, pr, new_val, 1); break;
    +        case i7_cpv_PREINC:  new_val = val; i7_assign(obj, pr, val+1, 1); break;
    +        case i7_cpv_POSTINC: new_val = val+1; i7_assign(obj, pr, new_val, 1); break;
    +    }
    +    return new_val;
    +}
    +
    +void i7_give(i7val owner, i7val prop, i7val val) {
    +    i7_assign(owner, prop, val, 1);
    +}
    +
    +i7val i7_prop_len(i7val obj, i7val pr) {
    +    printf("Unimplemented: i7_prop_len.\n");
    +    return 0;
    +}
    +
    +i7val i7_prop_addr(i7val obj, i7val pr) {
    +    printf("Unimplemented: i7_prop_addr.\n");
    +    return 0;
    +}
    +
    +#define I7BYTE_3(V) ((V & 0xFF000000) >> 24)
    +#define I7BYTE_2(V) ((V & 0x00FF0000) >> 16)
    +#define I7BYTE_1(V) ((V & 0x0000FF00) >> 8)
    +#define I7BYTE_0(V) (V & 0x000000FF)
    +
    +i7val i7_lookup(i7byte i7bytes[], i7val offset, i7val ind) {
    +    ind = offset + 4*ind;
    +    return ((i7val) i7bytes[ind]) + 0x100*((i7val) i7bytes[ind+1]) +
    +        0x10000*((i7val) i7bytes[ind+2]) + 0x1000000*((i7val) i7bytes[ind+3]);
    +}
    +
    +i7val write_i7_lookup(i7byte i7bytes[], i7val offset, i7val ind, i7val V, int way) {
    +    i7val val = i7_lookup(i7bytes, offset, ind);
    +    i7val RV = V;
    +    switch (way) {
    +        case i7_cpv_PREDEC:  RV = val; V = val-1; break;
    +        case i7_cpv_POSTDEC: RV = val-1; V = val-1; break;
    +        case i7_cpv_PREINC:  RV = val; V = val+1; break;
    +        case i7_cpv_POSTINC: RV = val+1; V = val+1; break;
    +    }
    +    ind = offset + 4*ind;
    +    i7bytes[ind]   = I7BYTE_0(V);
    +    i7bytes[ind+1] = I7BYTE_1(V);
    +    i7bytes[ind+2] = I7BYTE_2(V);
    +    i7bytes[ind+3] = I7BYTE_3(V);
    +    return RV;
    +}
    +
    +void glulx_accelfunc(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_accelfunc.\n");
    +}
    +
    +void glulx_accelparam(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_accelparam.\n");
    +}
    +
    +void glulx_call(i7val x, i7val i7varargc, i7val z) {
    +    printf("Unimplemented: glulx_call.\n");
    +}
    +
    +void glulx_copy(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_copy.\n");
    +}
    +
    +void glulx_div(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_div.\n");
    +}
    +
    +void glulx_exp(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_exp.\n");
    +}
    +
    +void glulx_fadd(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_fadd.\n");
    +}
    +
    +void glulx_fdiv(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_fdiv.\n");
    +}
    +
    +void glulx_floor(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_floor.\n");
    +}
    +
    +void glulx_fmod(i7val x, i7val y, i7val z, i7val w) {
    +    printf("Unimplemented: glulx_fmod.\n");
    +}
    +
    +void glulx_fmul(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_fmul.\n");
    +}
    +
    +void glulx_fsub(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_fsub.\n");
    +}
    +
    +void glulx_ftonumn(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_ftonumn.\n");
    +}
    +
    +void glulx_ftonumz(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_ftonumz.\n");
    +}
    +
    +void glulx_gestalt(i7val x, i7val y, i7val *z) {
    +    *z = 1;
    +}
    +
    +void glulx_glk(i7val glk_api_selector, i7val i7varargc, i7val *z) {
    +    int rv = 0;
    +    switch (glk_api_selector) {
    +        case 4: // selectpr for glk_gestalt
    +            rv = 1; break;
    +        case 32: // selector for glk_window_iterate
    +            rv = 0; break;
    +        case 35: // selector for glk_window_open
    +            rv = 1; break;
    +        case 47: // selector for glk_set_window
    +            rv = 0; break;
    +        case 64: // selector for glk_stream_iterate
    +            rv = 0; break;
    +        case 100: // selector for glk_fileref_iterate
    +            rv = 0; break;
    +        case 176: // selector for glk_stylehint_set
    +            rv = 0; break;
    +        case 240: // selector for glk_schannel_iterate
    +            rv = 0; break;
    +        case 242: // selector for glk_schannel_create
    +            rv = 0; break;
    +        default:
    +            printf("Unimplemented: glulx_glk %d.\n", glk_api_selector);
    +            rv = 0; break;
    +    }
    +    if (z) *z = rv;
    +}
    +
    +int glulx_jeq(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_jeq.\n");
    +    return 0;
    +}
    +
    +int glulx_jfeq(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_jfeq.\n");
    +    return 0;
    +}
    +
    +int glulx_jfge(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_jfge.\n");
    +    return 0;
    +}
    +
    +int glulx_jflt(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_jflt.\n");
    +    return 0;
    +}
    +
    +int glulx_jisinf(i7val x) {
    +    printf("Unimplemented: glulx_jisinf.\n");
    +    return 0;
    +}
    +
    +int glulx_jisnan(i7val x) {
    +    printf("Unimplemented: glulx_jisnan.\n");
    +    return 0;
    +}
    +
    +int glulx_jleu(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_jleu.\n");
    +    return 0;
    +}
    +
    +int glulx_jnz(i7val x) {
    +    printf("Unimplemented: glulx_jnz.\n");
    +    return 0;
    +}
    +
    +int glulx_jz(i7val x) {
    +    printf("Unimplemented: glulx_jz.\n");
    +    return 0;
    +}
    +
    +void glulx_log(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_log.\n");
    +}
    +
    +void glulx_malloc(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_malloc.\n");
    +}
    +
    +void glulx_mcopy(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_mcopy.\n");
    +}
    +
    +void glulx_mfree(i7val x) {
    +    printf("Unimplemented: glulx_mfree.\n");
    +}
    +
    +void glulx_mod(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_mod.\n");
    +}
    +
    +void glulx_neg(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_neg.\n");
    +}
    +
    +void glulx_numtof(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_numtof.\n");
    +}
    +
    +void glulx_quit(void) {
    +    printf("Unimplemented: glulx_quit.\n");
    +}
    +
    +void glulx_random(i7val x, i7val y) {
    +    printf("Unimplemented: glulx_random.\n");
    +}
    +
    +void glulx_setiosys(i7val x, i7val y) {
    +    // Deliberately ignored: we are using stdout, not glk
    +}
    +
    +void glulx_setrandom(i7val x) {
    +    i7_seed = (int) x;
    +}
    +
    +void glulx_streamchar(i7val x) {
    +    printf("%c", (int) x);
    +}
    +
    +void glulx_streamnum(i7val x) {
    +    printf("Unimplemented: glulx_streamnum.\n");
    +}
    +
    +void glulx_streamstr(i7val x) {
    +    printf("Unimplemented: glulx_streamstr.\n");
    +}
    +
    +void glulx_streamunichar(i7val x) {
    +    printf("%c", (int) x);
    +}
    +
    +void glulx_sub(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_sub.\n");
    +}
    +
    +void glulx_ushiftr(i7val x, i7val y, i7val z) {
    +    printf("Unimplemented: glulx_ushiftr.\n");
    +}
    +
    +void glulx_acos(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_acos\n");
    +}
    +
    +void glulx_aload(i7val x, i7val y, i7val *z) {
    +    printf("Unimplemented: glulx_aload\n");
    +}
    +
    +void glulx_aloadb(i7val x, i7val y, i7val *z) {
    +    printf("Unimplemented: glulx_aloadb\n");
    +}
    +
    +void glulx_aloads(i7val x, i7val y, i7val *z) {
    +    printf("Unimplemented: glulx_aloads\n");
    +}
    +
    +void glulx_asin(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_asin\n");
    +}
    +
    +void glulx_atan(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_atan\n");
    +}
    +
    +void glulx_binarysearch(i7val l1, i7val l2, i7val l3, i7val l4, i7val l5, i7val l6, i7val l7, i7val *s1) {
    +    printf("Unimplemented: glulx_binarysearch\n");
    +}
    +
    +void glulx_ceil(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_ceil\n");
    +}
    +
    +void glulx_cos(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_cos\n");
    +}
    +
    +void glulx_pow(i7val x, i7val y, i7val *z) {
    +    printf("Unimplemented: glulx_pow\n");
    +}
    +
    +void glulx_shiftl(i7val x, i7val y, i7val *z) {
    +    printf("Unimplemented: glulx_shiftl\n");
    +}
    +
    +void glulx_sin(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_sin\n");
    +}
    +
    +void glulx_sqrt(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_sqrt\n");
    +}
    +
    +void glulx_tan(i7val x, i7val *y) {
    +    printf("Unimplemented: glulx_tan\n");
    +}
    +
    +
    +
    +int i7_has(i7val obj, i7val attr) {
    +    printf("Unimplemented: i7_has.\n");
    +    return 0;
    +}
    +
    +int i7_ofclass(i7val obj, i7val cl) {
    +    printf("Unimplemented: i7_ofclass.\n");
    +    return 0;
    +}
    +
    +void i7_print_address(i7val x) {
    +    printf("Unimplemented: i7_print_address.\n");
    +}
    +
    +void i7_print_char(i7val x) {
    +    printf("%c", (int) x);
    +}
    +
    +void i7_print_def_art(i7val x) {
    +    printf("Unimplemented: i7_print_def_art.\n");
    +}
    +
    +void i7_print_cdef_art(i7val x) {
    +    printf("Unimplemented: i7_print_cdef_art.\n");
    +}
    +
    +void i7_print_indef_art(i7val x) {
    +    printf("Unimplemented: i7_print_indef_art.\n");
    +}
    +
    +void i7_print_name(i7val x) {
    +    printf("Unimplemented: i7_print_name.\n");
    +}
    +
    +void i7_print_object(i7val x) {
    +    printf("Unimplemented: i7_print_object.\n");
    +}
    +
    +void i7_print_property(i7val x) {
    +    printf("Unimplemented: i7_print_property.\n");
    +}
    +
    +int i7_provides(i7val obj, i7val prop) {
    +    printf("Unimplemented: i7_provides.\n");
    +    return 0;
    +}
    +
    +i7val i7_pull(void) {
    +    printf("Unimplemented: i7_pull.\n");
    +    return (i7val) 0;
    +}
    +
    +void i7_push(i7val x) {
    +    printf("Unimplemented: i7_push.\n");
    +}
    +
    +#define i7_bold 1
    +#define i7_roman 2
    +
    +void i7_style(int what) {
    +}
    +
    +i7val fn_i7_mgl_metaclass(int n, i7val v) {
    +    printf("Unimplemented: fn_i7_mgl_metaclass.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_random(int n, i7val v) {
    +    if (i7_seed < 1000) return ((i7val) ((i7_seed++) % n));
    +    i7_seed = i7_seed*i7_seed;
    +    return (((i7_seed*i7_seed) & 0xFF00) / 0x100) % n;
    +}
    +
    +i7val i7_gen_call(i7val fn_ref, i7val *args, int argc, int call_message) {
    +    printf("Unimplemented: i7_gen_call.\n");
    +    return 0;
    +}
    +
    +i7val i7_call_0(i7val fn_ref) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    return i7_gen_call(fn_ref, args, 0, 0);
    +}
    +
    +i7val fn_i7_mgl_indirect(int n, i7val v) {
    +    return i7_call_0(v);
    +}
    +
    +i7val i7_call_1(i7val fn_ref, i7val v) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v;
    +    return i7_gen_call(fn_ref, args, 1, 0);
    +}
    +
    +i7val i7_call_2(i7val fn_ref, i7val v, i7val v2) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v; args[1] = v2;
    +    return i7_gen_call(fn_ref, args, 2, 0);
    +}
    +
    +i7val i7_call_3(i7val fn_ref, i7val v, i7val v2, i7val v3) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v; args[1] = v2; args[2] = v3;
    +    return i7_gen_call(fn_ref, args, 3, 0);
    +}
    +
    +i7val i7_call_4(i7val fn_ref, i7val v, i7val v2, i7val v3, i7val v4) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v; args[1] = v2; args[2] = v3; args[3] = v4;
    +    return i7_gen_call(fn_ref, args, 4, 0);
    +}
    +
    +i7val i7_call_5(i7val fn_ref, i7val v, i7val v2, i7val v3, i7val v4, i7val v5) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v; args[1] = v2; args[2] = v3; args[3] = v4; args[4] = v5;
    +    return i7_gen_call(fn_ref, args, 5, 0);
    +}
    +
    +i7val i7_ccall_0(i7val fn_ref) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    return i7_gen_call(fn_ref, args, 0, 1);
    +}
    +
    +i7val i7_ccall_1(i7val fn_ref, i7val v) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v;
    +    return i7_gen_call(fn_ref, args, 1, 1);
    +}
    +
    +i7val i7_ccall_2(i7val fn_ref, i7val v, i7val v2) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v; args[1] = v2;
    +    return i7_gen_call(fn_ref, args, 2, 1);
    +}
    +
    +i7val i7_ccall_3(i7val fn_ref, i7val v, i7val v2, i7val v3) {
    +    i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +    args[0] = v; args[1] = v2; args[2] = v3;
    +    return i7_gen_call(fn_ref, args, 3, 1);
    +}
    +
    +i7val fn_i7_mgl_Z__Region(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_Z__Region.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_CP__Tab(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_CP__Tab.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_RA__Pr(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_RA__Pr.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_RL__Pr(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_RL__Pr.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_OC__Cl(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_OC__Cl.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_RV__Pr(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_RV__Pr.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_OP__Pr(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_OP__Pr.\n");
    +    return 0;
    +}
    +
    +i7val fn_i7_mgl_CA__Pr(int argc, i7val x) {
    +    printf("Unimplemented: fn_i7_mgl_CA__Pr.\n");
    +    return 0;
    +}
    +
    +i7val i7_mgl_sharp_classes_table = 0;
    +i7val i7_mgl_NUM_ATTR_BYTES = 0;
    +i7val i7_mgl_sharp_cpv__start = 0;
    +i7val i7_mgl_sharp_identifiers_table = 0;
    +i7val i7_mgl_sharp_globals_array = 0;
    +i7val i7_mgl_sharp_gself = 0;
    +i7val i7_mgl_sharp_dict_par2 = 0;
    +i7val i7_mgl_sharp_dictionary_table = 0;
    +i7val i7_mgl_sharp_grammar_table = 0;
    +
    +#define i7_mgl_FLOAT_NAN 0
    +
    + +

    And then: +

    +
     code_generation_target *c_target = NULL;
     void CodeGen::C::create_target(void) {
    diff --git a/inblorb/.gitignore b/inblorb/.gitignore
    index f2af04c86..c7cfec19b 100644
    --- a/inblorb/.gitignore
    +++ b/inblorb/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inbuild/.gitignore b/inbuild/.gitignore
    index 63078e2e4..d9b2ee171 100644
    --- a/inbuild/.gitignore
    +++ b/inbuild/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/indoc/.gitignore b/indoc/.gitignore
    index 96ac53b90..8be9c0c80 100644
    --- a/indoc/.gitignore
    +++ b/indoc/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inform7/.gitignore b/inform7/.gitignore
    index d16eab089..e7d7836df 100644
    --- a/inform7/.gitignore
    +++ b/inform7/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inform7/Figures/timings-diagnostics.txt b/inform7/Figures/timings-diagnostics.txt
    index fbc41ee86..96f03180e 100644
    --- a/inform7/Figures/timings-diagnostics.txt
    +++ b/inform7/Figures/timings-diagnostics.txt
    @@ -1,6 +1,6 @@
     100.0% in inform7 run
          55.5% in compilation to Inter
    -         40.4% in //Sequence::undertake_queued_tasks//
    +         40.6% in //Sequence::undertake_queued_tasks//
               3.4% in //MajorNodes::pre_pass//
               2.6% in //MajorNodes::pass_1//
               1.5% in //RTPhrasebook::compile_entries//
    @@ -20,8 +20,8 @@
          42.5% in running Inter pipeline
              10.7% in step preparation
               9.6% in inter step 7/14: consolidate-text
    -          8.2% in inter step 14/14: generate inform6 -> auto.inf
    -          8.1% in inter step 2/14: link
    +          8.1% in inter step 14/14: generate inform6 -> auto.inf
    +          8.0% in inter step 2/14: link
               1.5% in inter step 10/14: make-identifiers-unique
               0.4% in inter step 11/14: reconcile-verbs
               0.2% in inter step 13/14: eliminate-redundant-operations
    @@ -32,6 +32,6 @@
               0.1% in inter step 3/14: merge-template <- none
               0.1% in inter step 4/14: parse-linked-matter
               0.1% in inter step 5/14: resolve-conditional-compilation
    -          2.1% not specifically accounted for
    +          2.4% not specifically accounted for
           1.6% in supervisor
           0.3% not specifically accounted for
    diff --git a/inform7/Internal/Miscellany/inform7_clib.h b/inform7/Internal/Miscellany/inform7_clib.h
    index 7e32a2749..b832efcde 100644
    --- a/inform7/Internal/Miscellany/inform7_clib.h
    +++ b/inform7/Internal/Miscellany/inform7_clib.h
    @@ -10,7 +10,6 @@ typedef struct i7varargs {
     i7val i7_tmp = 0;
     int i7_seed = 197;
     
    -
     i7val i7_prop_value(i7val obj, i7val pr) {
     	printf("Unimplemented: i7_prop_value.\n");
     	return 0;
    diff --git a/inform7/core-module/Preliminaries/What This Module Does.w b/inform7/core-module/Preliminaries/What This Module Does.w
    index c8c9376ad..b4a68231d 100644
    --- a/inform7/core-module/Preliminaries/What This Module Does.w	
    +++ b/inform7/core-module/Preliminaries/What This Module Does.w	
    @@ -39,8 +39,6 @@ values and descriptions are parsed and then stored within the compiler.
     //imperative// module, the part of Inform most resembling a conventional compiler.
     (*) The //runtime// module compiles run-time support functions and data structures
     needed to make Inform's many concepts work at run-time.
    -(*) Last and least, the //index// module makes the browsable HTML-format index
    -for a compiled project, viewable in the Inform user interface applications.
     
     There are then two expansion packs, as it were: the //if// and //multimedia//
     modules, which do nothing essential but add support for interactive fiction
    diff --git a/inpolicy/.gitignore b/inpolicy/.gitignore
    index d5629e680..06434a4fe 100644
    --- a/inpolicy/.gitignore
    +++ b/inpolicy/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inrtps/.gitignore b/inrtps/.gitignore
    index 6bb4e8527..ff343bc26 100644
    --- a/inrtps/.gitignore
    +++ b/inrtps/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inter/.gitignore b/inter/.gitignore
    index 2f1a6a778..ad82cd649 100644
    --- a/inter/.gitignore
    +++ b/inter/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inter/building-test/.gitignore b/inter/building-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/inter/building-test/.gitignore
    +++ b/inter/building-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/inter/final-module/Chapter 5/Final C.w b/inter/final-module/Chapter 5/Final C.w
    index e9e3964eb..102239f7d 100644
    --- a/inter/final-module/Chapter 5/Final C.w	
    +++ b/inter/final-module/Chapter 5/Final C.w	
    @@ -4,6 +4,542 @@ To generate I6 code from intermediate code.
     
     @h Target.
     
    += (text to inform7_clib.h)
    +#include 
    +#include 
    +
    +typedef int i7val;
    +typedef unsigned char i7byte;
    +typedef struct i7varargs {
    +	i7val args[10];
    +} i7varargs;
    +
    +i7val i7_tmp = 0;
    +int i7_seed = 197;
    +
    +i7val i7_prop_value(i7val obj, i7val pr) {
    +	printf("Unimplemented: i7_prop_value.\n");
    +	return 0;
    +}
    +
    +#define i7_cpv_SET 1
    +#define i7_cpv_PREDEC 2
    +#define i7_cpv_POSTDEC 3
    +#define i7_cpv_PREINC 4
    +#define i7_cpv_POSTINC 5
    +
    +void i7_assign(i7val owner, i7val prop, i7val val, i7val inst) {
    +	printf("Unimplemented: i7_assign.\n");
    +}
    +
    +i7val i7_change_prop_value(i7val obj, i7val pr, i7val to, int way) {
    +	i7val val = i7_prop_value(obj, pr), new_val = val;
    +	switch (way) {
    +		case i7_cpv_SET:     i7_assign(obj, pr, to, 1); new_val = to; break;
    +		case i7_cpv_PREDEC:  new_val = val; i7_assign(obj, pr, val-1, 1); break;
    +		case i7_cpv_POSTDEC: new_val = val-1; i7_assign(obj, pr, new_val, 1); break;
    +		case i7_cpv_PREINC:  new_val = val; i7_assign(obj, pr, val+1, 1); break;
    +		case i7_cpv_POSTINC: new_val = val+1; i7_assign(obj, pr, new_val, 1); break;
    +	}
    +	return new_val;
    +}
    +
    +void i7_give(i7val owner, i7val prop, i7val val) {
    +	i7_assign(owner, prop, val, 1);
    +}
    +
    +i7val i7_prop_len(i7val obj, i7val pr) {
    +	printf("Unimplemented: i7_prop_len.\n");
    +	return 0;
    +}
    +
    +i7val i7_prop_addr(i7val obj, i7val pr) {
    +	printf("Unimplemented: i7_prop_addr.\n");
    +	return 0;
    +}
    +
    +#define I7BYTE_3(V) ((V & 0xFF000000) >> 24)
    +#define I7BYTE_2(V) ((V & 0x00FF0000) >> 16)
    +#define I7BYTE_1(V) ((V & 0x0000FF00) >> 8)
    +#define I7BYTE_0(V) (V & 0x000000FF)
    +
    +i7val i7_lookup(i7byte i7bytes[], i7val offset, i7val ind) {
    +	ind = offset + 4*ind;
    +	return ((i7val) i7bytes[ind]) + 0x100*((i7val) i7bytes[ind+1]) +
    +		0x10000*((i7val) i7bytes[ind+2]) + 0x1000000*((i7val) i7bytes[ind+3]);
    +}
    +
    +i7val write_i7_lookup(i7byte i7bytes[], i7val offset, i7val ind, i7val V, int way) {
    +	i7val val = i7_lookup(i7bytes, offset, ind);
    +	i7val RV = V;
    +	switch (way) {
    +		case i7_cpv_PREDEC:  RV = val; V = val-1; break;
    +		case i7_cpv_POSTDEC: RV = val-1; V = val-1; break;
    +		case i7_cpv_PREINC:  RV = val; V = val+1; break;
    +		case i7_cpv_POSTINC: RV = val+1; V = val+1; break;
    +	}
    +	ind = offset + 4*ind;
    +	i7bytes[ind]   = I7BYTE_0(V);
    +	i7bytes[ind+1] = I7BYTE_1(V);
    +	i7bytes[ind+2] = I7BYTE_2(V);
    +	i7bytes[ind+3] = I7BYTE_3(V);
    +	return RV;
    +}
    +
    +void glulx_accelfunc(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_accelfunc.\n");
    +}
    +
    +void glulx_accelparam(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_accelparam.\n");
    +}
    +
    +void glulx_call(i7val x, i7val i7varargc, i7val z) {
    +	printf("Unimplemented: glulx_call.\n");
    +}
    +
    +void glulx_copy(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_copy.\n");
    +}
    +
    +void glulx_div(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_div.\n");
    +}
    +
    +void glulx_exp(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_exp.\n");
    +}
    +
    +void glulx_fadd(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_fadd.\n");
    +}
    +
    +void glulx_fdiv(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_fdiv.\n");
    +}
    +
    +void glulx_floor(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_floor.\n");
    +}
    +
    +void glulx_fmod(i7val x, i7val y, i7val z, i7val w) {
    +	printf("Unimplemented: glulx_fmod.\n");
    +}
    +
    +void glulx_fmul(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_fmul.\n");
    +}
    +
    +void glulx_fsub(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_fsub.\n");
    +}
    +
    +void glulx_ftonumn(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_ftonumn.\n");
    +}
    +
    +void glulx_ftonumz(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_ftonumz.\n");
    +}
    +
    +void glulx_gestalt(i7val x, i7val y, i7val *z) {
    +	*z = 1;
    +}
    +
    +void glulx_glk(i7val glk_api_selector, i7val i7varargc, i7val *z) {
    +	int rv = 0;
    +	switch (glk_api_selector) {
    +		case 4: // selectpr for glk_gestalt
    +			rv = 1; break;
    +		case 32: // selector for glk_window_iterate
    +			rv = 0; break;
    +		case 35: // selector for glk_window_open
    +			rv = 1; break;
    +		case 47: // selector for glk_set_window
    +			rv = 0; break;
    +		case 64: // selector for glk_stream_iterate
    +			rv = 0; break;
    +		case 100: // selector for glk_fileref_iterate
    +			rv = 0; break;
    +		case 176: // selector for glk_stylehint_set
    +			rv = 0; break;
    +		case 240: // selector for glk_schannel_iterate
    +			rv = 0; break;
    +		case 242: // selector for glk_schannel_create
    +			rv = 0; break;
    +		default:
    +			printf("Unimplemented: glulx_glk %d.\n", glk_api_selector);
    +			rv = 0; break;
    +	}
    +	if (z) *z = rv;
    +}
    +
    +int glulx_jeq(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_jeq.\n");
    +	return 0;
    +}
    +
    +int glulx_jfeq(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_jfeq.\n");
    +	return 0;
    +}
    +
    +int glulx_jfge(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_jfge.\n");
    +	return 0;
    +}
    +
    +int glulx_jflt(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_jflt.\n");
    +	return 0;
    +}
    +
    +int glulx_jisinf(i7val x) {
    +	printf("Unimplemented: glulx_jisinf.\n");
    +	return 0;
    +}
    +
    +int glulx_jisnan(i7val x) {
    +	printf("Unimplemented: glulx_jisnan.\n");
    +	return 0;
    +}
    +
    +int glulx_jleu(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_jleu.\n");
    +	return 0;
    +}
    +
    +int glulx_jnz(i7val x) {
    +	printf("Unimplemented: glulx_jnz.\n");
    +	return 0;
    +}
    +
    +int glulx_jz(i7val x) {
    +	printf("Unimplemented: glulx_jz.\n");
    +	return 0;
    +}
    +
    +void glulx_log(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_log.\n");
    +}
    +
    +void glulx_malloc(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_malloc.\n");
    +}
    +
    +void glulx_mcopy(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_mcopy.\n");
    +}
    +
    +void glulx_mfree(i7val x) {
    +	printf("Unimplemented: glulx_mfree.\n");
    +}
    +
    +void glulx_mod(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_mod.\n");
    +}
    +
    +void glulx_neg(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_neg.\n");
    +}
    +
    +void glulx_numtof(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_numtof.\n");
    +}
    +
    +void glulx_quit(void) {
    +	printf("Unimplemented: glulx_quit.\n");
    +}
    +
    +void glulx_random(i7val x, i7val y) {
    +	printf("Unimplemented: glulx_random.\n");
    +}
    +
    +void glulx_setiosys(i7val x, i7val y) {
    +	// Deliberately ignored: we are using stdout, not glk
    +}
    +
    +void glulx_setrandom(i7val x) {
    +	i7_seed = (int) x;
    +}
    +
    +void glulx_streamchar(i7val x) {
    +	printf("%c", (int) x);
    +}
    +
    +void glulx_streamnum(i7val x) {
    +	printf("Unimplemented: glulx_streamnum.\n");
    +}
    +
    +void glulx_streamstr(i7val x) {
    +	printf("Unimplemented: glulx_streamstr.\n");
    +}
    +
    +void glulx_streamunichar(i7val x) {
    +	printf("%c", (int) x);
    +}
    +
    +void glulx_sub(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_sub.\n");
    +}
    +
    +void glulx_ushiftr(i7val x, i7val y, i7val z) {
    +	printf("Unimplemented: glulx_ushiftr.\n");
    +}
    +
    +void glulx_acos(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_acos\n");
    +}
    +
    +void glulx_aload(i7val x, i7val y, i7val *z) {
    +	printf("Unimplemented: glulx_aload\n");
    +}
    +
    +void glulx_aloadb(i7val x, i7val y, i7val *z) {
    +	printf("Unimplemented: glulx_aloadb\n");
    +}
    +
    +void glulx_aloads(i7val x, i7val y, i7val *z) {
    +	printf("Unimplemented: glulx_aloads\n");
    +}
    +
    +void glulx_asin(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_asin\n");
    +}
    +
    +void glulx_atan(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_atan\n");
    +}
    +
    +void glulx_binarysearch(i7val l1, i7val l2, i7val l3, i7val l4, i7val l5, i7val l6, i7val l7, i7val *s1) {
    +	printf("Unimplemented: glulx_binarysearch\n");
    +}
    +
    +void glulx_ceil(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_ceil\n");
    +}
    +
    +void glulx_cos(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_cos\n");
    +}
    +
    +void glulx_pow(i7val x, i7val y, i7val *z) {
    +	printf("Unimplemented: glulx_pow\n");
    +}
    +
    +void glulx_shiftl(i7val x, i7val y, i7val *z) {
    +	printf("Unimplemented: glulx_shiftl\n");
    +}
    +
    +void glulx_sin(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_sin\n");
    +}
    +
    +void glulx_sqrt(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_sqrt\n");
    +}
    +
    +void glulx_tan(i7val x, i7val *y) {
    +	printf("Unimplemented: glulx_tan\n");
    +}
    +
    +
    +
    +int i7_has(i7val obj, i7val attr) {
    +	printf("Unimplemented: i7_has.\n");
    +	return 0;
    +}
    +
    +int i7_ofclass(i7val obj, i7val cl) {
    +	printf("Unimplemented: i7_ofclass.\n");
    +	return 0;
    +}
    +
    +void i7_print_address(i7val x) {
    +	printf("Unimplemented: i7_print_address.\n");
    +}
    +
    +void i7_print_char(i7val x) {
    +	printf("%c", (int) x);
    +}
    +
    +void i7_print_def_art(i7val x) {
    +	printf("Unimplemented: i7_print_def_art.\n");
    +}
    +
    +void i7_print_cdef_art(i7val x) {
    +	printf("Unimplemented: i7_print_cdef_art.\n");
    +}
    +
    +void i7_print_indef_art(i7val x) {
    +	printf("Unimplemented: i7_print_indef_art.\n");
    +}
    +
    +void i7_print_name(i7val x) {
    +	printf("Unimplemented: i7_print_name.\n");
    +}
    +
    +void i7_print_object(i7val x) {
    +	printf("Unimplemented: i7_print_object.\n");
    +}
    +
    +void i7_print_property(i7val x) {
    +	printf("Unimplemented: i7_print_property.\n");
    +}
    +
    +int i7_provides(i7val obj, i7val prop) {
    +	printf("Unimplemented: i7_provides.\n");
    +	return 0;
    +}
    +
    +i7val i7_pull(void) {
    +	printf("Unimplemented: i7_pull.\n");
    +	return (i7val) 0;
    +}
    +
    +void i7_push(i7val x) {
    +	printf("Unimplemented: i7_push.\n");
    +}
    +
    +#define i7_bold 1
    +#define i7_roman 2
    +
    +void i7_style(int what) {
    +}
    +
    +i7val fn_i7_mgl_metaclass(int n, i7val v) {
    +	printf("Unimplemented: fn_i7_mgl_metaclass.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_random(int n, i7val v) {
    +	if (i7_seed < 1000) return ((i7val) ((i7_seed++) % n));
    +	i7_seed = i7_seed*i7_seed;
    +	return (((i7_seed*i7_seed) & 0xFF00) / 0x100) % n;
    +}
    +
    +i7val i7_gen_call(i7val fn_ref, i7val *args, int argc, int call_message) {
    +	printf("Unimplemented: i7_gen_call.\n");
    +	return 0;
    +}
    +
    +i7val i7_call_0(i7val fn_ref) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	return i7_gen_call(fn_ref, args, 0, 0);
    +}
    +
    +i7val fn_i7_mgl_indirect(int n, i7val v) {
    +	return i7_call_0(v);
    +}
    +
    +i7val i7_call_1(i7val fn_ref, i7val v) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v;
    +	return i7_gen_call(fn_ref, args, 1, 0);
    +}
    +
    +i7val i7_call_2(i7val fn_ref, i7val v, i7val v2) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v; args[1] = v2;
    +	return i7_gen_call(fn_ref, args, 2, 0);
    +}
    +
    +i7val i7_call_3(i7val fn_ref, i7val v, i7val v2, i7val v3) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v; args[1] = v2; args[2] = v3;
    +	return i7_gen_call(fn_ref, args, 3, 0);
    +}
    +
    +i7val i7_call_4(i7val fn_ref, i7val v, i7val v2, i7val v3, i7val v4) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v; args[1] = v2; args[2] = v3; args[3] = v4;
    +	return i7_gen_call(fn_ref, args, 4, 0);
    +}
    +
    +i7val i7_call_5(i7val fn_ref, i7val v, i7val v2, i7val v3, i7val v4, i7val v5) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v; args[1] = v2; args[2] = v3; args[3] = v4; args[4] = v5;
    +	return i7_gen_call(fn_ref, args, 5, 0);
    +}
    +
    +i7val i7_ccall_0(i7val fn_ref) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	return i7_gen_call(fn_ref, args, 0, 1);
    +}
    +
    +i7val i7_ccall_1(i7val fn_ref, i7val v) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v;
    +	return i7_gen_call(fn_ref, args, 1, 1);
    +}
    +
    +i7val i7_ccall_2(i7val fn_ref, i7val v, i7val v2) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v; args[1] = v2;
    +	return i7_gen_call(fn_ref, args, 2, 1);
    +}
    +
    +i7val i7_ccall_3(i7val fn_ref, i7val v, i7val v2, i7val v3) {
    +	i7val args[10]; for (int i=0; i<10; i++) args[i] = 0;
    +	args[0] = v; args[1] = v2; args[2] = v3;
    +	return i7_gen_call(fn_ref, args, 3, 1);
    +}
    +
    +i7val fn_i7_mgl_Z__Region(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_Z__Region.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_CP__Tab(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_CP__Tab.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_RA__Pr(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_RA__Pr.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_RL__Pr(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_RL__Pr.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_OC__Cl(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_OC__Cl.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_RV__Pr(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_RV__Pr.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_OP__Pr(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_OP__Pr.\n");
    +	return 0;
    +}
    +
    +i7val fn_i7_mgl_CA__Pr(int argc, i7val x) {
    +	printf("Unimplemented: fn_i7_mgl_CA__Pr.\n");
    +	return 0;
    +}
    +
    +i7val i7_mgl_sharp_classes_table = 0;
    +i7val i7_mgl_NUM_ATTR_BYTES = 0;
    +i7val i7_mgl_sharp_cpv__start = 0;
    +i7val i7_mgl_sharp_identifiers_table = 0;
    +i7val i7_mgl_sharp_globals_array = 0;
    +i7val i7_mgl_sharp_gself = 0;
    +i7val i7_mgl_sharp_dict_par2 = 0;
    +i7val i7_mgl_sharp_dictionary_table = 0;
    +i7val i7_mgl_sharp_grammar_table = 0;
    +
    +#define i7_mgl_FLOAT_NAN 0
    +=
    +
    +And then:
    +
     =
     code_generation_target *c_target = NULL;
     void CodeGen::C::create_target(void) {
    diff --git a/scripts/gitignorescript.txt b/scripts/gitignorescript.txt
    index 5952deae0..953f2a5c2 100644
    --- a/scripts/gitignorescript.txt
    +++ b/scripts/gitignorescript.txt
    @@ -6,7 +6,7 @@ gameinfo.dbg
     gametext.txt
     
     makefile
    -
    +tags
     *.glkdata
     
     resources/Changes/Output/
    diff --git a/scripts/makescript.txt b/scripts/makescript.txt
    index 999701534..674153721 100644
    --- a/scripts/makescript.txt
    +++ b/scripts/makescript.txt
    @@ -122,19 +122,25 @@ INFORM6X = inform6/Tangled/inform6
     # makes everything, disregarding all timestamps on files.
     
     .PHONY: all
    -
     all: tools kits srules localintegration
     
     .PHONY: force
    -
     force: forcetools forcekits forcesrules localintegration
     
     .PHONY: localintegration
    -localintegration: inform7/Internal/Languages/English/Syntax.preform
    +localintegration: \
    +	inform7/Internal/Languages/English/Syntax.preform \
    +	inform7/Internal/Miscellany/inform7_clib.h
     
     inform7/Internal/Languages/English/Syntax.preform: inform7/Tangled/Syntax.preform
     	cp -f 'inform7/Tangled/Syntax.preform' "inform7/Internal/Languages/English/Syntax.preform"
     
    +inform7/Internal/Miscellany/inform7_clib.h: inform7/Tangled/inform7_clib.h
    +	cp -f 'inform7/Tangled/inform7_clib.h' "inform7/Internal/Miscellany/inform7_clib.h"
    +
    +inform7/Tangled/inform7_clib.h: inter/final-module/Chapter\ 5/*.w
    +	$(INWEBX) $(INTERTOOLWEB) -tangle
    +
     # (Of course those other four phony targets are yet to be defined.)
     
     # -----------------------------------------------------------------------------
    diff --git a/services/arch-test/.gitignore b/services/arch-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/arch-test/.gitignore
    +++ b/services/arch-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/calculus-test/.gitignore b/services/calculus-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/calculus-test/.gitignore
    +++ b/services/calculus-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/inflections-test/.gitignore b/services/inflections-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/inflections-test/.gitignore
    +++ b/services/inflections-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/kinds-test/.gitignore b/services/kinds-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/kinds-test/.gitignore
    +++ b/services/kinds-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/linguistics-test/.gitignore b/services/linguistics-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/linguistics-test/.gitignore
    +++ b/services/linguistics-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/problems-test/.gitignore b/services/problems-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/problems-test/.gitignore
    +++ b/services/problems-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/syntax-test/.gitignore b/services/syntax-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/syntax-test/.gitignore
    +++ b/services/syntax-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform
    diff --git a/services/words-test/.gitignore b/services/words-test/.gitignore
    index e97c0de53..bd0c53264 100644
    --- a/services/words-test/.gitignore
    +++ b/services/words-test/.gitignore
    @@ -2,6 +2,7 @@
     # and is not intended for human editing
     
     debug-log.txt
    +tags
     Woven/
     Tangled/
     !Tangled/*.preform