1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Shared command line options

This commit is contained in:
Graham Nelson 2020-02-10 10:27:24 +00:00
parent 1338ef1cde
commit f432ac019f
12 changed files with 163 additions and 134 deletions

View file

@ -17,47 +17,40 @@ this plan out.
=
pathname *path_to_inbuild = NULL;
pathname *path_to_tools = NULL;
linked_list *nest_list = NULL;
int inbuild_task = INSPECT_TTASK;
int dry_run_mode = FALSE;
linked_list *targets = NULL; /* of |inbuild_copy| */
inbuild_nest *destination_nest = NULL;
text_stream *filter_text = NULL;
linked_list *inbuild_nest_list = NULL;
int main(int argc, char **argv) {
Foundation::start();
WordsModule::start();
InbuildModule::start();
targets = NEW_LINKED_LIST(inbuild_copy);
nest_list = NEW_LINKED_LIST(inbuild_nest);
@<Read the command line@>;
if (FIRST_IN_LINKED_LIST(inbuild_nest, nest_list) == NULL)
Nests::add_to_search_sequence(nest_list,
Nests::new(Pathnames::from_text(I"inform7/Internal")));
path_to_inbuild = Pathnames::installation_path("INBUILD_PATH", I"inbuild");
build_methodology *BM;
if (path_to_tools) BM = BuildSteps::methodology(path_to_tools, FALSE);
else BM = BuildSteps::methodology(Pathnames::up(path_to_inbuild), TRUE);
if (dry_run_mode == FALSE) BM->methodology = SHELL_METHODOLOGY;
if (Str::len(filter_text) > 0) {
if (LinkedLists::len(nest_list) == 0) {
Errors::with_text("can't apply this, since no nests have been given: '%S'", filter_text);
TEMPORARY_TEXT(errors);
inbuild_requirement *req = Requirements::from_text(filter_text, errors);
if (Str::len(errors) > 0) {
Errors::with_text("requirement malformed: %S", errors);
} else {
TEMPORARY_TEXT(errors);
inbuild_requirement *req = Requirements::from_text(filter_text, errors);
if (Str::len(errors) > 0) {
Errors::with_text("requirement malformed: %S", errors);
} else {
linked_list *L = NEW_LINKED_LIST(inbuild_search_result);
Nests::search_for(req, nest_list, L);
inbuild_search_result *R;
LOOP_OVER_LINKED_LIST(R, inbuild_search_result, L) {
ADD_TO_LINKED_LIST(R->copy, inbuild_copy, targets);
}
linked_list *L = NEW_LINKED_LIST(inbuild_search_result);
Nests::search_for(req, inbuild_nest_list, L);
inbuild_search_result *R;
LOOP_OVER_LINKED_LIST(R, inbuild_search_result, L) {
ADD_TO_LINKED_LIST(R->copy, inbuild_copy, targets);
}
DISCARD_TEXT(errors);
}
DISCARD_TEXT(errors);
}
inbuild_copy *C;
LOOP_OVER_LINKED_LIST(C, inbuild_copy, targets) {
@ -96,7 +89,6 @@ int main(int argc, char **argv) {
@e TOOLS_CLSW
@e CONTENTS_OF_CLSW
@e MATCHING_CLSW
@e NEST_CLSW
@e COPY_TO_CLSW
@e SYNC_TO_CLSW
@ -124,11 +116,15 @@ int main(int argc, char **argv) {
L"apply to all works in nest(s) matching requirement X");
CommandLine::declare_switch(CONTENTS_OF_CLSW, L"contents-of", 2,
L"apply to all targets in the directory X");
CommandLine::declare_switch(NEST_CLSW, L"nest", 2,
L"add the nest at pathname X to the search list");
SharedCLI::declare_options();
CommandLine::read(argc, argv, NULL, &Main::option, &Main::bareword);
if (LinkedLists::len(unsorted_nest_list) == 0)
SharedCLI::add_nest(
Pathnames::from_text(I"inform7/Internal"), INTERNAL_NEST_TAG);
inbuild_nest_list = SharedCLI::nest_list();
@ =
void Main::option(int id, int val, text_stream *arg, void *state) {
switch (id) {
@ -140,16 +136,14 @@ void Main::option(int id, int val, text_stream *arg, void *state) {
case MATCHING_CLSW: filter_text = Str::duplicate(arg); break;
case CONTENTS_OF_CLSW: Main::load_many(Pathnames::from_text(arg)); break;
case DRY_CLSW: dry_run_mode = val; break;
case NEST_CLSW: Nests::add_to_search_sequence(nest_list,
Nests::new(Pathnames::from_text(arg))); break;
case COPY_TO_CLSW: inbuild_task = COPY_TO_TTASK;
destination_nest = Nests::new(Pathnames::from_text(arg));
break;
case SYNC_TO_CLSW: inbuild_task = SYNC_TO_TTASK;
destination_nest = Nests::new(Pathnames::from_text(arg));
break;
default: internal_error("unimplemented switch");
}
SharedCLI::option(id, val, arg, state);
}
void Main::bareword(int id, text_stream *arg, void *state) {

View file

@ -0,0 +1,91 @@
[SharedCLI::] Shared CLI.
A subset of command-line options shared by the tools which incorporate this
module.
@ We add the following switches:
@e NEST_CLSW
@e INTERNAL_CLSW
@e EXTERNAL_CLSW
@e TRANSIENT_CLSW
=
void SharedCLI::declare_options(void) {
CommandLine::declare_switch(NEST_CLSW, L"nest", 2,
L"add the nest at pathname X to the search list");
}
pathname *shared_transient_resources = NULL;
void SharedCLI::option(int id, int val, text_stream *arg, void *state) {
switch (id) {
case NEST_CLSW: SharedCLI::add_nest(Pathnames::from_text(arg), GENERIC_NEST_TAG); break;
case INTERNAL_CLSW: SharedCLI::add_nest(Pathnames::from_text(arg), INTERNAL_NEST_TAG); break;
case EXTERNAL_CLSW: SharedCLI::add_nest(Pathnames::from_text(arg), EXTERNAL_NEST_TAG); break;
case TRANSIENT_CLSW: shared_transient_resources = Pathnames::from_text(arg); break;
}
}
linked_list *unsorted_nest_list = NULL;
linked_list *shared_nest_list = NULL;
inbuild_nest *shared_internal_nest = NULL;
inbuild_nest *shared_external_nest = NULL;
inbuild_nest *SharedCLI::add_nest(pathname *P, int tag) {
if (unsorted_nest_list == NULL)
unsorted_nest_list = NEW_LINKED_LIST(inbuild_nest);
inbuild_nest *N = Nests::new(P);
Nests::set_tag(N, tag);
ADD_TO_LINKED_LIST(N, inbuild_nest, unsorted_nest_list);
if ((tag == EXTERNAL_NEST_TAG) && (shared_external_nest == NULL))
shared_external_nest = N;
if ((tag == INTERNAL_NEST_TAG) && (shared_internal_nest == NULL))
shared_internal_nest = N;
if (tag == INTERNAL_NEST_TAG) Nests::protect(N);
return N;
}
inbuild_nest *SharedCLI::internal(void) {
return shared_internal_nest;
}
inbuild_nest *SharedCLI::external(void) {
return shared_external_nest;
}
pathname *SharedCLI::transient(void) {
if (shared_transient_resources == NULL)
if (shared_external_nest)
return shared_external_nest->location;
return shared_transient_resources;
}
@
@e NOT_A_NEST_TAG from 0
@e MATERIALS_NEST_TAG
@e EXTERNAL_NEST_TAG
@e GENERIC_NEST_TAG
@e INTERNAL_NEST_TAG
=
linked_list *SharedCLI::nest_list(void) {
if (shared_nest_list == NULL) {
shared_nest_list = NEW_LINKED_LIST(inbuild_nest);
inbuild_nest *N;
LOOP_OVER_LINKED_LIST(N, inbuild_nest, unsorted_nest_list)
if (Nests::get_tag(N) == MATERIALS_NEST_TAG)
ADD_TO_LINKED_LIST(N, inbuild_nest, shared_nest_list);
LOOP_OVER_LINKED_LIST(N, inbuild_nest, unsorted_nest_list)
if (Nests::get_tag(N) == EXTERNAL_NEST_TAG)
ADD_TO_LINKED_LIST(N, inbuild_nest, shared_nest_list);
LOOP_OVER_LINKED_LIST(N, inbuild_nest, unsorted_nest_list)
if (Nests::get_tag(N) == GENERIC_NEST_TAG)
ADD_TO_LINKED_LIST(N, inbuild_nest, shared_nest_list);
LOOP_OVER_LINKED_LIST(N, inbuild_nest, unsorted_nest_list)
if (Nests::get_tag(N) == INTERNAL_NEST_TAG)
ADD_TO_LINKED_LIST(N, inbuild_nest, shared_nest_list);
}
return shared_nest_list;
}

View file

@ -14,12 +14,12 @@ typedef struct extension_census {
MEMORY_MANAGEMENT
} extension_census;
extension_census *Extensions::Census::new(linked_list *L) {
extension_census *Extensions::Census::new(void) {
extension_census *C = CREATE(extension_census);
C->search_list = L;
C->built_in_tag = -2;
C->materials_tag = -2;
C->external_tag = -2;
C->search_list = SharedCLI::nest_list();
C->built_in_tag = INTERNAL_NEST_TAG;
C->materials_tag = MATERIALS_NEST_TAG;
C->external_tag = EXTERNAL_NEST_TAG;
return C;
}

View file

@ -170,7 +170,8 @@ void Kits::request(text_stream *name) {
}
#ifdef CORE_MODULE
void Kits::determine(linked_list *nest_list) {
void Kits::determine(void) {
linked_list *nest_list = SharedCLI::nest_list();
if (kits_requested == NULL) Kits::request(I"CommandParserKit");
Kits::request(I"BasicInformKit");
Languages::request_required_kits();
@ -283,9 +284,19 @@ linked_list *Kits::list_of_inter_libraries(void) {
requirements_list = NEW_LINKED_LIST(link_instruction);
inform_kit *K;
LOOP_OVER_LINKED_LIST(K, inform_kit, kits_to_include) {
link_instruction *link = CodeGen::LinkInstructions::new(K->as_copy->location_if_path, K->attachment_point);
link_instruction *link = CodeGen::LinkInstructions::new(
K->as_copy->location_if_path, K->attachment_point);
ADD_TO_LINKED_LIST(link, link_instruction, requirements_list);
}
return requirements_list;
}
#endif
linked_list *Kits::inter_paths(void) {
linked_list *inter_paths = NEW_LINKED_LIST(pathname);
inbuild_nest *N;
linked_list *L = SharedCLI::nest_list();
LOOP_OVER_LINKED_LIST(N, inbuild_nest, L)
ADD_TO_LINKED_LIST(KitManager::path_within_nest(N), pathname, inter_paths);
return inter_paths;
}

View file

@ -6,6 +6,7 @@ Licence: Artistic License 2.0
Chapter 1: Setting Up
Inbuild Module
Shared CLI
Chapter 2: Conceptual Framework
Conceptual Model

View file

@ -115,10 +115,8 @@ list is not exhaustive.
@e CENSUS_CLSW
@e CLOCK_CLSW
@e DEBUG_CLSW
@e EXTERNAL_CLSW
@e FORMAT_CLSW
@e CRASHALL_CLSW
@e INTERNAL_CLSW
@e KIT_CLSW
@e NOINDEX_CLSW
@e NOPROGRESS_CLSW
@ -127,7 +125,6 @@ list is not exhaustive.
@e REQUIRE_PROBLEM_CLSW
@e RNG_CLSW
@e SIGILS_CLSW
@e TRANSIENT_CLSW
@e PIPELINE_CLSW
@e PIPELINE_FILE_CLSW
@e PIPELINE_VARIABLE_CLSW
@ -178,11 +175,10 @@ list is not exhaustive.
L"use X as the user's home for installed material such as extensions");
CommandLine::declare_switch(TRANSIENT_CLSW, L"transient", 2,
L"use X for transient data such as the extensions census");
SharedCLI::declare_options();
@<Establish our location in the file system@> =
path_to_inform7 = Pathnames::installation_path("INFORM7_PATH", I"inform7");
pathname *def_int = Pathnames::subfolder(Pathnames::up(path_to_inform7), I"Internal");
Locations::set_default_internal(def_int);
@<With that done, configure all other settings@> =
VirtualMachines::set_identifier(story_filename_extension);
@ -227,7 +223,7 @@ list is not exhaustive.
doc_references_top = lexer_wordcount - 1;
@<Work out our kit requirements@> =
Kits::determine(I7_nest_list);
Kits::determine();
@<Perform lexical analysis@> =
ProgressBar::update_progress_bar(0, 0);
@ -438,11 +434,6 @@ with "Output.i6t".
Str::copy(Dictionaries::create_text(pipeline_vars, I"*in"), I"*memory");
Str::copy(Dictionaries::create_text(pipeline_vars, I"*out"), Filenames::get_leafname(filename_of_compiled_i6_code));
linked_list *inter_paths = NEW_LINKED_LIST(pathname);
inbuild_nest *N;
LOOP_OVER_LINKED_LIST(N, inbuild_nest, I7_nest_list)
ADD_TO_LINKED_LIST(KitManager::path_within_nest(N), pathname, inter_paths);
codegen_pipeline *SS = NULL;
if (Str::len(inter_processing_pipeline) > 0) {
SS = CodeGen::Pipeline::parse(inter_processing_pipeline, pipeline_vars);
@ -452,7 +443,7 @@ with "Output.i6t".
inbuild_requirement *req =
Requirements::any_version_of(Works::new(pipeline_genre, inter_processing_file, NULL));
linked_list *L = NEW_LINKED_LIST(inbuild_search_result);
Nests::search_for(req, I7_nest_list, L);
Nests::search_for(req, SharedCLI::nest_list(), L);
if (LinkedLists::len(L) == 0) {
WRITE_TO(STDERR, "Sought pipeline '%S'\n", inter_processing_file);
Problems::Fatal::issue("The Inter pipeline could not be found");
@ -470,7 +461,7 @@ with "Output.i6t".
}
CodeGen::Pipeline::set_repository(SS, Emit::tree());
CodeGen::Pipeline::run(Filenames::get_path_to(filename_of_compiled_i6_code),
SS, inter_paths, Kits::list_of_inter_libraries());
SS, Kits::inter_paths(), Kits::list_of_inter_libraries());
}
LOG("Back end elapsed time: %dcs\n", ((int) (clock() - front_end)) / (CLOCKS_PER_SEC/100));
}
@ -571,12 +562,8 @@ void CoreMain::switch(int id, int val, text_stream *arg, void *state) {
case PROJECT_CLSW:
if (Str::includes(arg, I"#2oetMiq9bqxoxY")) Kits::request(I"BasicInformKit");
Locations::set_project(arg); break;
case INTERNAL_CLSW: Locations::set_internal(arg); break;
case EXTERNAL_CLSW: Locations::set_external(arg); break;
case TRANSIENT_CLSW: Locations::set_transient(arg); break;
default: internal_error("unimplemented switch");
}
SharedCLI::option(id, val, arg, state);
}
void CoreMain::bareword(int id, text_stream *opt, void *state) {

View file

@ -11,12 +11,7 @@ these are stored in the following globals. Explanations are given below,
not here.
= (early code)
linked_list *I7_nest_list = NULL;
pathname *pathname_of_materials = NULL;
pathname *pathname_of_external_folder = NULL;
pathname *pathname_of_internal_folder = NULL;
pathname *pathname_of_extension_docs = NULL;
pathname *pathname_of_extension_docs_inner = NULL;
pathname *pathname_of_HTML_models = NULL;
@ -30,7 +25,6 @@ pathname *pathname_of_released_figures = NULL;
pathname *pathname_of_released_interpreter = NULL;
pathname *pathname_of_released_sounds = NULL;
pathname *pathname_of_transient_census_data = NULL;
pathname *pathname_of_transient_external_resources = NULL;
@ And secondly, the files:
@ -40,7 +34,6 @@ filename *filename_of_cblorb_report = NULL;
filename *filename_of_cblorb_report_model = NULL;
filename *filename_of_compiled_i6_code = NULL;
filename *filename_of_debugging_log = NULL;
filename *filename_of_default_inter_pipeline = NULL;
filename *filename_of_documentation_snippets = NULL;
filename *filename_of_epsfile = NULL;
filename *filename_of_existing_story_file = NULL;
@ -74,23 +67,6 @@ void Locations::set_project(text_stream *loc) {
pathname_of_project = Pathnames::from_text(loc);
}
void Locations::set_internal(text_stream *loc) {
pathname_of_internal_folder = Pathnames::from_text(loc);
}
void Locations::set_default_internal(pathname *P) {
if (pathname_of_internal_folder == NULL)
pathname_of_internal_folder = P;
}
void Locations::set_external(text_stream *loc) {
pathname_of_external_folder = Pathnames::from_text(loc);
}
void Locations::set_transient(text_stream *loc) {
pathname_of_transient_external_resources = Pathnames::from_text(loc);
}
int Locations::set_I7_source(text_stream *loc) {
if (filename_of_i7_source) return FALSE;
filename_of_i7_source = Filenames::from_text(loc);
@ -115,6 +91,9 @@ and census mode, when it's scanning the file system for extensions.
=
int Locations::set_defaults(int census_mode) {
@<Materials folder@>;
if (pathname_of_materials)
SharedCLI::add_nest(pathname_of_materials, MATERIALS_NEST_TAG);
@<Internal resources@>;
@<External resources@>;
@<Project resources@>;
@ -123,22 +102,6 @@ int Locations::set_defaults(int census_mode) {
Problems::Fatal::issue("Except in census mode, source text must be supplied");
if ((census_mode) && (filename_of_i7_source))
Problems::Fatal::issue("In census mode, no source text may be supplied");
I7_nest_list = NEW_LINKED_LIST(inbuild_nest);
if (pathname_of_materials) {
inbuild_nest *nest = Nests::new(pathname_of_materials);
Nests::set_tag(nest, ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA);
ADD_TO_LINKED_LIST(nest, inbuild_nest, I7_nest_list);
}
if (pathname_of_external_folder) {
inbuild_nest *nest = Nests::new(pathname_of_external_folder);
Nests::set_tag(nest, ORIGIN_WAS_USER_EXTENSIONS_AREA);
ADD_TO_LINKED_LIST(nest, inbuild_nest, I7_nest_list);
}
if (pathname_of_internal_folder) {
inbuild_nest *nest = Nests::new(pathname_of_internal_folder);
Nests::set_tag(nest, ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA);
ADD_TO_LINKED_LIST(nest, inbuild_nest, I7_nest_list);
}
return TRUE;
}
@ -156,18 +119,10 @@ know how to find that folder, and we don't want to make any assumptions.
Inform therefore requires on every run that it be told via the |-internal|
switch where the internal resources folder is.
The main ingredients here are the "EILT" resources: extensions, I6T files,
language definitions, and website templates. The Standard Rules, for
example, live inside the Extensions part of this.
@<Internal resources@> =
if (pathname_of_internal_folder == NULL)
Problems::Fatal::issue("Did not set -internal when calling");
pathname *inter_resources =
Pathnames::subfolder(pathname_of_internal_folder, I"Inter");
filename_of_default_inter_pipeline =
Filenames::in_folder(inter_resources, I"default.interpipeline");
inbuild_nest *I = SharedCLI::internal();
if (I == NULL) Problems::Fatal::issue("Did not set -internal when calling");
pathname *pathname_of_internal_folder = I->location;
@<Miscellaneous other stuff@>;
@ -216,24 +171,25 @@ If |-transient| is not specified, it's the same folder, i.e., Inform does
not distinguish between permanent and transient external resources.
@<External resources@> =
if (pathname_of_external_folder == NULL) {
pathname_of_external_folder = home_path;
inbuild_nest *E = SharedCLI::external();
if (E == NULL) {
pathname *P = home_path;
char *subfolder_within = INFORM_FOLDER_RELATIVE_TO_HOME;
if (subfolder_within[0]) {
TEMPORARY_TEXT(SF);
WRITE_TO(SF, "%s", subfolder_within);
pathname_of_external_folder = Pathnames::subfolder(home_path, SF);
P = Pathnames::subfolder(home_path, SF);
DISCARD_TEXT(SF);
}
pathname_of_external_folder =
Pathnames::subfolder(pathname_of_external_folder, I"Inform");
P = Pathnames::subfolder(P, I"Inform");
E = SharedCLI::add_nest(P, EXTERNAL_NEST_TAG);
}
pathname *pathname_of_external_folder = E->location;
if (Pathnames::create_in_file_system(pathname_of_external_folder) == 0) return FALSE;
@<Permanent external resources@>;
if (pathname_of_transient_external_resources == NULL)
pathname_of_transient_external_resources =
pathname_of_external_folder;
pathname *pathname_of_transient_external_resources = SharedCLI::transient();
if (Pathnames::create_in_file_system(pathname_of_transient_external_resources) == 0) return FALSE;
@<Transient external resources@>;
@ -391,13 +347,11 @@ the index as seen by the user.
filename_of_headings =
Filenames::in_folder(pathname_of_project_index_folder, I"Headings.xml");
@h Materials resources.
@h Materials folder.
The materials folder sits alongside the project folder and has the same name,
but ending |.materials| instead of |.inform|.
For the third and final time, there are EILT resources.
@<Materials resources@> =
@<Materials folder@> =
if (pathname_of_project) {
TEMPORARY_TEXT(mf);
WRITE_TO(mf, "%S", Pathnames::directory_name(pathname_of_project));
@ -415,6 +369,9 @@ For the third and final time, there are EILT resources.
pathname_of_materials = Pathnames::from_text(I"inform.materials");
}
@h Materials resources.
@<Materials resources@> =
@<Figures and sounds@>;
@<The Release folder@>;
@<Existing story file@>;

View file

@ -21,7 +21,7 @@ void NaturalLanguages::scan(void) {
bundle_scan_made = TRUE;
inbuild_requirement *req = Requirements::anything_of_genre(language_genre);
linked_list *L = NEW_LINKED_LIST(inbuild_search_result);
Nests::search_for(req, I7_nest_list, L);
Nests::search_for(req, SharedCLI::nest_list(), L);
language_scan_top = lexer_wordcount - 1;
}
}

View file

@ -67,13 +67,6 @@ int SourceFiles::increase_sentence_count(wording W) {
one of the following values to indicate the source of the source: the value
only really tells us something we didn't know in the case of extensions,
but in that event the Extensions.w routines do indeed want to know this.
(Area 51 is reserved for extensions of alien origin, but the relevant
source code is classified.)
@d ORIGIN_WAS_PRIMARY_SOURCE 0
@d ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA 1
@d ORIGIN_WAS_USER_EXTENSIONS_AREA 2
@d ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA 3
=
int SourceFiles::read_file(filename *F, text_stream *synopsis, extension_file *EF,
@ -82,7 +75,7 @@ int SourceFiles::read_file(filename *F, text_stream *synopsis, extension_file *E
int area = -1;
if (EF)
area = SourceFiles::read_file_inner(F, synopsis,
I7_nest_list, documentation_only, &sf,
SharedCLI::nest_list(), documentation_only, &sf,
STORE_POINTER_extension_file(EF), FALSE, EF);
else
area = SourceFiles::read_file_inner(F, synopsis,

View file

@ -590,10 +590,7 @@ two alternatives are expressed here:
=
void Extensions::Files::handle_census_mode(void) {
if (census_mode) {
extension_census *C = Extensions::Census::new(I7_nest_list);
C->built_in_tag = ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA;
C->materials_tag = ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA;
C->external_tag = ORIGIN_WAS_USER_EXTENSIONS_AREA;
extension_census *C = Extensions::Census::new();
Extensions::Dictionary::load();
Extensions::Census::perform(C);
Extensions::Files::write_top_level_of_extensions_documentation(C);
@ -604,10 +601,7 @@ void Extensions::Files::handle_census_mode(void) {
void Extensions::Files::update_census(void) {
extension_file *ef;
Extensions::Dictionary::load();
extension_census *C = Extensions::Census::new(I7_nest_list);
C->built_in_tag = ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA;
C->materials_tag = ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA;
C->external_tag = ORIGIN_WAS_USER_EXTENSIONS_AREA;
extension_census *C = Extensions::Census::new();
Extensions::Census::perform(C);
Extensions::Files::write_top_level_of_extensions_documentation(C);
LOOP_OVER(ef, extension_file) Extensions::Documentation::write_detailed(ef);

View file

@ -184,10 +184,10 @@ trap-door into Read Source Text, to seek and open the file.
inform_extension *E = Extensions::Files::find(ef);
if (E) {
switch (origin) {
case ORIGIN_WAS_MATERIALS_EXTENSIONS_AREA:
case ORIGIN_WAS_USER_EXTENSIONS_AREA:
case MATERIALS_NEST_TAG:
case EXTERNAL_NEST_TAG:
E->loaded_from_built_in_area = FALSE; break;
case ORIGIN_WAS_BUILT_IN_EXTENSIONS_AREA:
case INTERNAL_NEST_TAG:
E->loaded_from_built_in_area = TRUE; break;
default: /* which can happen if the extension file cannot be found */
E->loaded_from_built_in_area = FALSE; break;

View file

@ -1030,7 +1030,8 @@ with the earliest quoted searched first.
@<Tell Inblorb where to find the website templates@> =
inbuild_nest *N;
LOOP_OVER_LINKED_LIST(N, inbuild_nest, I7_nest_list)
linked_list *L = SharedCLI::nest_list();
LOOP_OVER_LINKED_LIST(N, inbuild_nest, L)
WRITE("template path \"%p\"\n", TemplateManager::path_within_nest(N));
@ Inblorb reports its progress, or lack of it, with an HTML page, just as we do.