From 40a6d193c3e3c8e2fcb18a8c5fdb1debda460aa7 Mon Sep 17 00:00:00 2001
From: Graham Nelson
Date: Thu, 9 Sep 2021 23:06:55 +0100
Subject: [PATCH] First attempts at hybrid C-Inform programming
---
docs/final-module/2-cal.html | 2 +-
docs/final-module/2-cg.html | 8 +++---
docs/final-module/2-ft.html | 2 +-
docs/final-module/5-cas.html | 8 +++---
docs/final-module/5-cfm.html | 8 +++---
docs/final-module/5-cgv.html | 8 +++---
docs/final-module/5-cim.html | 10 +++----
docs/final-module/5-clt.html | 8 +++---
docs/final-module/5-cmm.html | 15 +++++------
docs/final-module/5-cnm.html | 4 +--
docs/final-module/5-com.html | 8 +++---
docs/final-module/5-cpc.html | 2 +-
docs/final-module/5-fnc.html | 17 ++++++------
docs/final-module/index.html | 2 +-
inform7/.gitignore | 3 +++
inform7/Figures/memory-diagnostics.txt | 2 +-
inform7/Figures/timings-diagnostics.txt | 26 +++++++++----------
inform7/Internal/Miscellany/inform7_clib.c | 11 ++++----
inform7/Internal/Miscellany/inform7_clib.h | 4 +--
inform7/Tests/Test Externals/XText.txt | 0
.../Tests/Test Externals/_Makefiles/XText.mk | 18 +++++++++++++
inform7/Tests/Test Externals/_Source/XText.c | 12 +++++++++
inform7/Tests/Test Externals/_Source/XText.i7 | 2 ++
inform7/gitignorescript.txt | 3 +++
.../Chapter 5/C Input-Output Model.w | 2 +-
inter/final-module/Chapter 5/C Memory Model.w | 7 ++---
inter/final-module/Chapter 5/Final C.w | 13 +++++-----
27 files changed, 120 insertions(+), 85 deletions(-)
create mode 100644 inform7/Tests/Test Externals/XText.txt
create mode 100644 inform7/Tests/Test Externals/_Makefiles/XText.mk
create mode 100644 inform7/Tests/Test Externals/_Source/XText.c
create mode 100644 inform7/Tests/Test Externals/_Source/XText.i7
diff --git a/docs/final-module/2-cal.html b/docs/final-module/2-cal.html
index 3c212417f..e6dda0891 100644
--- a/docs/final-module/2-cal.html
+++ b/docs/final-module/2-cal.html
@@ -461,7 +461,7 @@ is 20. We instead compile this as
return symb->symbol_name;
}
-- The function CodeGen::CL::constant_depth appears nowhere else.
- The function CodeGen::CL::constant_depth_inner appears nowhere else.
- The function CodeGen::CL::literal_text_at is used in Frame Control (§1).
- The function CodeGen::CL::compare_tlh appears nowhere else.
- The function CodeGen::CL::sort_literals is used in Code Generation (§8.3).
- The function CodeGen::CL::enter_box_mode is used in Frame Control (§3).
- The function CodeGen::CL::exit_box_mode is used in Frame Control (§3).
- The function CodeGen::CL::enter_print_mode is used in Frame Control (§3).
- The function CodeGen::CL::exit_print_mode is used in Frame Control (§3).
- The function CodeGen::CL::evaluate appears nowhere else.
- The function CodeGen::CL::literal is used in Frame Control (§2), Instances and Properties (§5.8.5.1.1, §8), Generating Inform 6 (§8, §9), C Global Variables (§2).
- The function CodeGen::CL::name is used in Frame Control (§2), Instances and Properties (§4.5, §4.6, §5.5, §5.7, §5.8.4, §5.9, §5.11, §5.11.2, §5.11.2.1, §5.11.2.2, §6, §8), Generating Inform 6 (§7, §8, §9), Generating C (§5), C Global Variables (§2), C Memory Model (§12), C Object Model (§6), C Function Model (§1), C Literals (§2).
- The structure text_literal_holder is private to this section.
+- The function CodeGen::CL::constant_depth appears nowhere else.
- The function CodeGen::CL::constant_depth_inner appears nowhere else.
- The function CodeGen::CL::literal_text_at is used in Frame Control (§1).
- The function CodeGen::CL::compare_tlh appears nowhere else.
- The function CodeGen::CL::sort_literals is used in Code Generation (§8.3).
- The function CodeGen::CL::enter_box_mode is used in Frame Control (§3).
- The function CodeGen::CL::exit_box_mode is used in Frame Control (§3).
- The function CodeGen::CL::enter_print_mode is used in Frame Control (§3).
- The function CodeGen::CL::exit_print_mode is used in Frame Control (§3).
- The function CodeGen::CL::evaluate appears nowhere else.
- The function CodeGen::CL::literal is used in Frame Control (§2), Instances and Properties (§5.8.5.1.1, §8), Generating Inform 6 (§8, §9), C Global Variables (§2).
- The function CodeGen::CL::name is used in Frame Control (§2), Instances and Properties (§4.5, §4.6, §5.5, §5.7, §5.8.4, §5.9, §5.11, §5.11.2, §5.11.2.1, §5.11.2.2, §6, §8), Generating Inform 6 (§7, §8, §9), Final C (§5), C Global Variables (§2), C Memory Model (§12), C Object Model (§6), C Function Model (§1), C Literals (§2).
- The structure text_literal_holder is private to this section.
diff --git a/docs/final-module/2-cg.html b/docs/final-module/2-cg.html
index c59733605..a5a560be2 100644
--- a/docs/final-module/2-cg.html
+++ b/docs/final-module/2-cg.html
@@ -174,7 +174,7 @@ But we abstract it in case it's ever useful for it to be more.
return seg;
}
-void CodeGen::create_segments(code_generation *gen, void *data, int codes[]) {
+void CodeGen::create_segments(code_generation *gen, void *data, int codes[]) {
gen->segment_sequence = NEW_LINKED_LIST(generated_segment);
for (int i=0; codes[i] >= 0; i++) {
if ((codes[i] >= MAX_CG_SEGMENTS) ||
@@ -201,7 +201,7 @@ always be done in a way which is then undone, restoring the previous state:
-generated_segment *CodeGen::select(code_generation *gen, int i) {
+generated_segment *CodeGen::select(code_generation *gen, int i) {
generated_segment *saved = gen->current_segment;
if ((i < 0) || (i >= MAX_CG_SEGMENTS)) internal_error("out of range");
if (gen->temporarily_diverted) internal_error("poorly timed selection");
@@ -209,7 +209,7 @@ always be done in a way which is then undone, restoring the previous state:
return saved;
}
-void CodeGen::deselect(code_generation *gen, generated_segment *saved) {
+void CodeGen::deselect(code_generation *gen, generated_segment *saved) {
if (gen->temporarily_diverted) internal_error("poorly timed deselection");
gen->current_segment = saved;
}
@@ -238,7 +238,7 @@ we also have to direct it to a given text.
-text_stream *CodeGen::current(code_generation *gen) {
+text_stream *CodeGen::current(code_generation *gen) {
if (gen->temporarily_diverted)
return gen->segments[temporary_I7CGS]->generated_code;
if (gen->current_segment == NULL) return NULL;
diff --git a/docs/final-module/2-ft.html b/docs/final-module/2-ft.html
index 295aca91b..810bcdf46 100644
--- a/docs/final-module/2-ft.html
+++ b/docs/final-module/2-ft.html
@@ -85,7 +85,7 @@ function togglePopup(material_id) {
CLASS_DEFINITION
} code_generation_target;
-code_generation_target *CodeGen::Targets::new(text_stream *name) {
+code_generation_target *CodeGen::Targets::new(text_stream *name) {
code_generation_target *cgt = CREATE(code_generation_target);
cgt->target_name = Str::duplicate(name);
cgt->methods = Methods::new_set();
diff --git a/docs/final-module/5-cas.html b/docs/final-module/5-cas.html
index ed534e185..3e871d5a4 100644
--- a/docs/final-module/5-cas.html
+++ b/docs/final-module/5-cas.html
@@ -77,18 +77,18 @@ function togglePopup(material_id) {
-void CAssembly::initialise(code_generation_target *cgt) {
+void CAssembly::initialise(code_generation_target *cgt) {
METHOD_ADD(cgt, ASSEMBLY_MTID, CAssembly::assembly);
}
-void CAssembly::initialise_data(code_generation *gen) {
+void CAssembly::initialise_data(code_generation *gen) {
}
-void CAssembly::begin(code_generation *gen) {
+void CAssembly::begin(code_generation *gen) {
CAssembly::initialise_data(gen);
}
-void CAssembly::end(code_generation *gen) {
+void CAssembly::end(code_generation *gen) {
}
diff --git a/docs/final-module/5-cfm.html b/docs/final-module/5-cfm.html
index 32f01c26e..66fbb5b76 100644
--- a/docs/final-module/5-cfm.html
+++ b/docs/final-module/5-cfm.html
@@ -77,7 +77,7 @@ function togglePopup(material_id) {
-void CFunctionModel::initialise(code_generation_target *cgt) {
+void CFunctionModel::initialise(code_generation_target *cgt) {
METHOD_ADD(cgt, BEGIN_FUNCTION_MTID, CFunctionModel::begin_function);
METHOD_ADD(cgt, DECLARE_LOCAL_VARIABLE_MTID, CFunctionModel::declare_local_variable);
METHOD_ADD(cgt, BEGIN_FUNCTION_CODE_MTID, CFunctionModel::begin_function_code);
@@ -93,18 +93,18 @@ function togglePopup(material_id) {
int compiling_function;
} C_generation_function_model_data;
-void CFunctionModel::initialise_data(code_generation *gen) {
+void CFunctionModel::initialise_data(code_generation *gen) {
C_GEN_DATA(fndata.prototype) = Str::new();
C_GEN_DATA(fndata.argument_count) = 0;
C_GEN_DATA(fndata.current_fcf) = NULL;
C_GEN_DATA(fndata.compiling_function) = FALSE;
}
-void CFunctionModel::begin(code_generation *gen) {
+void CFunctionModel::begin(code_generation *gen) {
CFunctionModel::initialise_data(gen);
}
-void CFunctionModel::end(code_generation *gen) {
+void CFunctionModel::end(code_generation *gen) {
generated_segment *saved = CodeGen::select(gen, c_stubs_at_eof_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("i7val i7_gen_call(i7process *proc, i7val fn_ref, i7val *args, int argc) {\n"); INDENT;
diff --git a/docs/final-module/5-cgv.html b/docs/final-module/5-cgv.html
index 18545a5e1..b714e6c36 100644
--- a/docs/final-module/5-cgv.html
+++ b/docs/final-module/5-cgv.html
@@ -78,7 +78,7 @@ function togglePopup(material_id) {
-void CGlobals::initialise(code_generation_target *cgt) {
+void CGlobals::initialise(code_generation_target *cgt) {
METHOD_ADD(cgt, PREPARE_VARIABLE_MTID, CGlobals::prepare_variable);
METHOD_ADD(cgt, DECLARE_VARIABLE_MTID, CGlobals::declare_variable);
METHOD_ADD(cgt, EVALUATE_VARIABLE_MTID, CGlobals::evaluate_variable);
@@ -87,15 +87,15 @@ function togglePopup(material_id) {
int C_var_count = 1;
text_stream *C_var_vals = NULL;
-void CGlobals::initialise_data(code_generation *gen) {
+void CGlobals::initialise_data(code_generation *gen) {
C_var_count = 1;
C_var_vals = Str::new();
}
-void CGlobals::begin(code_generation *gen) {
+void CGlobals::begin(code_generation *gen) {
}
-void CGlobals::end(code_generation *gen) {
+void CGlobals::end(code_generation *gen) {
generated_segment *saved = CodeGen::select(gen, c_ids_and_maxima_I7CGS);
text_stream *OUT = CodeGen::current(gen);
diff --git a/docs/final-module/5-cim.html b/docs/final-module/5-cim.html
index cfbc3cf94..f33617d82 100644
--- a/docs/final-module/5-cim.html
+++ b/docs/final-module/5-cim.html
@@ -79,16 +79,16 @@ function togglePopup(material_id) {
-void CInputOutputModel::initialise(code_generation_target *cgt) {
+void CInputOutputModel::initialise(code_generation_target *cgt) {
}
-void CInputOutputModel::initialise_data(code_generation *gen) {
+void CInputOutputModel::initialise_data(code_generation *gen) {
}
-void CInputOutputModel::begin(code_generation *gen) {
+void CInputOutputModel::begin(code_generation *gen) {
}
-void CInputOutputModel::end(code_generation *gen) {
+void CInputOutputModel::end(code_generation *gen) {
}
@@ -852,7 +852,7 @@ function togglePopup(material_id) {
-
+
diff --git a/docs/final-module/5-clt.html b/docs/final-module/5-clt.html
index fa03b571e..d7e7d55b1 100644
--- a/docs/final-module/5-clt.html
+++ b/docs/final-module/5-clt.html
@@ -79,7 +79,7 @@ function togglePopup(material_id) {
-void CLiteralsModel::initialise(code_generation_target *cgt) {
+void CLiteralsModel::initialise(code_generation_target *cgt) {
METHOD_ADD(cgt, COMPILE_DICTIONARY_WORD_MTID, CLiteralsModel::compile_dictionary_word);
METHOD_ADD(cgt, COMPILE_LITERAL_NUMBER_MTID, CLiteralsModel::compile_literal_number);
METHOD_ADD(cgt, COMPILE_LITERAL_REAL_MTID, CLiteralsModel::compile_literal_real);
@@ -101,7 +101,7 @@ function togglePopup(material_id) {
struct dictionary *C_vm_dictionary;
} C_generation_literals_model_data;
-void CLiteralsModel::initialise_data(code_generation *gen) {
+void CLiteralsModel::initialise_data(code_generation *gen) {
C_GEN_DATA(litdata.double_quoted_C) = Str::new();
C_GEN_DATA(litdata.no_double_quoted_C_strings) = 0;
C_GEN_DATA(litdata.C_dword_count) = 0;
@@ -116,11 +116,11 @@ function togglePopup(material_id) {
C_GEN_DATA(litdata.C_vm_dictionary) = Dictionaries::new(1024, FALSE);
}
-void CLiteralsModel::begin(code_generation *gen) {
+void CLiteralsModel::begin(code_generation *gen) {
CLiteralsModel::initialise_data(gen);
}
-void CLiteralsModel::end(code_generation *gen) {
+void CLiteralsModel::end(code_generation *gen) {
CLiteralsModel::compile_dwords(gen);
CLiteralsModel::compile_verb_table(gen);
CLiteralsModel::compile_actions_table(gen);
diff --git a/docs/final-module/5-cmm.html b/docs/final-module/5-cmm.html
index bfda6bcdd..3c7cead72 100644
--- a/docs/final-module/5-cmm.html
+++ b/docs/final-module/5-cmm.html
@@ -79,7 +79,7 @@ function togglePopup(material_id) {
-void CMemoryModel::initialise(code_generation_target *cgt) {
+void CMemoryModel::initialise(code_generation_target *cgt) {
METHOD_ADD(cgt, BEGIN_ARRAY_MTID, CMemoryModel::begin_array);
METHOD_ADD(cgt, ARRAY_ENTRY_MTID, CMemoryModel::array_entry);
METHOD_ADD(cgt, COMPILE_LITERAL_SYMBOL_MTID, CMemoryModel::compile_literal_symbol);
@@ -94,7 +94,7 @@ function togglePopup(material_id) {
int next_node_is_a_ref;
} C_generation_memory_model_data;
-void CMemoryModel::initialise_data(code_generation *gen) {
+void CMemoryModel::initialise_data(code_generation *gen) {
C_GEN_DATA(memdata.himem) = 0;
C_GEN_DATA(memdata.array_name) = Str::new();
C_GEN_DATA(memdata.entry_count) = 0;
@@ -120,18 +120,14 @@ of 2 or 4.
(f) Arrays in memory are free to contain a mixture of bytes and words: some do.
(g) Data may be written in byte form and read back in word form, or vice versa.
-
-
-- This is part of the extract file inform7_clib.h.
-void CMemoryModel::begin(code_generation *gen) {
+void CMemoryModel::begin(code_generation *gen) {
generated_segment *saved = CodeGen::select(gen, c_mem_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("i7byte i7_initial_memory[] = {\n");
@@ -146,7 +142,7 @@ in C.
-void CMemoryModel::end(code_generation *gen) {
+void CMemoryModel::end(code_generation *gen) {
generated_segment *saved = CodeGen::select(gen, c_mem_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("0, 0 };\n");
@@ -166,6 +162,7 @@ in C.
- This is part of the extract file inform7_clib.h.
- This is part of the extract file inform7_clib.h.