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

Better finding of extensions on case-sensitive file systems

This commit is contained in:
Graham Nelson 2022-05-04 08:02:34 +01:00
parent a751fed71c
commit f61aa8b6df
6 changed files with 68 additions and 46 deletions

View file

@ -1,6 +1,6 @@
# Inform 7 # Inform 7
v10.1.0-beta+6U96 'Krypton' (3 May 2022) v10.1.0-beta+6U97 'Krypton' (4 May 2022)
## About Inform 7 ## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: beta Prerelease: beta
Build Date: 3 May 2022 Build Date: 4 May 2022
Build Number: 6U96 Build Number: 6U97

View file

@ -168,7 +168,9 @@ requirements.
<p class="commentary">For efficiency's sake, since the nest could contain many hundreds of <p class="commentary">For efficiency's sake, since the nest could contain many hundreds of
extensions, we narrow down to the author's subfolder if a specific extensions, we narrow down to the author's subfolder if a specific
author is required. author is required. We cannot safely assume that the author's name specified
in <span class="extract"><span class="extract-syntax">req</span></span> has the same casing as in the subfolder name, so we go about this
cautiously for the sake of case-sensitive file systems.
</p> </p>
<p class="commentary">Nobody should any longer be storing extension files without the file <p class="commentary">Nobody should any longer be storing extension files without the file
@ -182,8 +184,18 @@ so we'll quietly allow for it.
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">genre</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">genre</span><span class="plain-syntax"> != </span><span class="identifier-syntax">extension_genre</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span> <span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">genre</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">genre</span><span class="plain-syntax"> != </span><span class="identifier-syntax">extension_genre</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="4-em.html#SP3" class="function-link"><span class="function-syntax">ExtensionManager::path_within_nest</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="4-em.html#SP3" class="function-link"><span class="function-syntax">ExtensionManager::path_within_nest</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">author_name</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span> <span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">author_name</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Q</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">author_name</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Directories::listing</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-em.html#SP6" class="function-link"><span class="function-syntax">ExtensionManager::search_nest_for_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Q</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_results</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">entry</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Platform::is_folder_separator</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::get_last_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_last_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::ne</span><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Reserved"</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq_insensitive</span><span class="plain-syntax">(</span><span class="identifier-syntax">entry</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">work</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">author_name</span><span class="plain-syntax">))) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Q</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Pathnames::down</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">entry</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-em.html#SP6" class="function-link"><span class="function-syntax">ExtensionManager::search_nest_for_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Q</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_results</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span> <span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="4-em.html#SP6" class="function-link"><span class="function-syntax">ExtensionManager::search_nest_for_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_results</span><span class="plain-syntax">);</span> <span class="plain-syntax"> </span><a href="4-em.html#SP6" class="function-link"><span class="function-syntax">ExtensionManager::search_nest_for_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">, </span><span class="identifier-syntax">req</span><span class="plain-syntax">, </span><span class="identifier-syntax">search_results</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span> <span class="plain-syntax"> }</span>

View file

@ -104,7 +104,9 @@ requirements.
For efficiency's sake, since the nest could contain many hundreds of For efficiency's sake, since the nest could contain many hundreds of
extensions, we narrow down to the author's subfolder if a specific extensions, we narrow down to the author's subfolder if a specific
author is required. author is required. We cannot safely assume that the author's name specified
in |req| has the same casing as in the subfolder name, so we go about this
cautiously for the sake of case-sensitive file systems.
Nobody should any longer be storing extension files without the file Nobody should any longer be storing extension files without the file
extension |.i7x|, but this was allowed in the early days of Inform 7, extension |.i7x|, but this was allowed in the early days of Inform 7,
@ -116,8 +118,18 @@ void ExtensionManager::search_nest_for(inbuild_genre *gen, inbuild_nest *N,
if ((req->work->genre) && (req->work->genre != extension_genre)) return; if ((req->work->genre) && (req->work->genre != extension_genre)) return;
pathname *P = ExtensionManager::path_within_nest(N); pathname *P = ExtensionManager::path_within_nest(N);
if (Str::len(req->work->author_name) > 0) { if (Str::len(req->work->author_name) > 0) {
pathname *Q = Pathnames::down(P, req->work->author_name); linked_list *L = Directories::listing(P);
ExtensionManager::search_nest_for_r(Q, N, req, search_results); text_stream *entry;
LOOP_OVER_LINKED_LIST(entry, text_stream, L) {
if (Platform::is_folder_separator(Str::get_last_char(entry))) {
Str::delete_last_character(entry);
if ((Str::ne(entry, I"Reserved")) &&
(Str::eq_insensitive(entry, req->work->author_name))) {
pathname *Q = Pathnames::down(P, entry);
ExtensionManager::search_nest_for_r(Q, N, req, search_results);
}
}
}
} else { } else {
ExtensionManager::search_nest_for_r(P, N, req, search_results); ExtensionManager::search_nest_for_r(P, N, req, search_results);
} }

View file

@ -1,10 +1,10 @@
Total memory consumption was 123289K = 120 MB Total memory consumption was 123294K = 120 MB
---- was used for 2043757 objects, in 362472 frames in 0 x 800K = 0K = 0 MB: ---- was used for 2043753 objects, in 362468 frames in 0 x 800K = 0K = 0 MB:
33.1% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes 33.1% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
20.5% text_stream_array 4600 x 100 = 460000 objects, 25907200 bytes 20.5% text_stream_array 4600 x 100 = 460000 objects, 25907200 bytes
19.2% linked_list 43442 objects, 24327520 bytes 19.2% linked_list 43446 objects, 24329760 bytes
11.1% inter_symbol_array 132 x 1024 = 135168 objects, 14061696 bytes 11.1% inter_symbol_array 132 x 1024 = 135168 objects, 14061696 bytes
10.4% inter_error_stash_array 101 x 1024 = 103424 objects, 13241504 bytes 10.4% inter_error_stash_array 101 x 1024 = 103424 objects, 13241504 bytes
8.2% parse_node 129584 objects, 10366720 bytes 8.2% parse_node 129584 objects, 10366720 bytes
@ -32,7 +32,7 @@ Total memory consumption was 123289K = 120 MB
0.6% individual_form 2562 objects, 860832 bytes 0.6% individual_form 2562 objects, 860832 bytes
0.6% inter_schema_node 8917 objects, 856032 bytes 0.6% inter_schema_node 8917 objects, 856032 bytes
0.5% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes 0.5% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.3% scan_directory 112 objects, 462336 bytes 0.3% scan_directory 116 objects, 478848 bytes
0.3% local_variable_array 47 x 100 = 4700 objects, 452704 bytes 0.3% local_variable_array 47 x 100 = 4700 objects, 452704 bytes
0.3% verb_usage 1128 objects, 388032 bytes 0.3% verb_usage 1128 objects, 388032 bytes
0.2% rule 470 objects, 368480 bytes 0.2% rule 470 objects, 368480 bytes
@ -111,8 +111,8 @@ Total memory consumption was 123289K = 120 MB
---- adjective 137 objects, 15344 bytes ---- adjective 137 objects, 15344 bytes
---- generated_segment 14 objects, 14784 bytes ---- generated_segment 14 objects, 14784 bytes
---- booking_list 407 objects, 13024 bytes ---- booking_list 407 objects, 13024 bytes
---- pathname 324 objects, 12960 bytes
---- adjective_iname_holder 320 objects, 12800 bytes ---- adjective_iname_holder 320 objects, 12800 bytes
---- pathname 312 objects, 12480 bytes
---- uniqueness_count 454 objects, 10896 bytes ---- uniqueness_count 454 objects, 10896 bytes
---- inter_construct 30 objects, 10320 bytes ---- inter_construct 30 objects, 10320 bytes
---- filename 246 objects, 9840 bytes ---- filename 246 objects, 9840 bytes
@ -237,9 +237,9 @@ Total memory consumption was 123289K = 120 MB
100.0% was used for memory not allocated for objects: 100.0% was used for memory not allocated for objects:
57.7% text stream storage 72856620 bytes in 477518 claims 57.7% text stream storage 72862020 bytes in 477538 claims
4.1% dictionary storage 5227008 bytes in 7517 claims 4.1% dictionary storage 5227008 bytes in 7517 claims
---- sorting 1448 bytes in 145 claims ---- sorting 1448 bytes in 149 claims
5.7% source text 7200000 bytes in 3 claims 5.7% source text 7200000 bytes in 3 claims
8.5% source text details 10800000 bytes in 2 claims 8.5% source text details 10800000 bytes in 2 claims
0.2% documentation fragments 262144 bytes in 1 claim 0.2% documentation fragments 262144 bytes in 1 claim
@ -255,5 +255,5 @@ Total memory consumption was 123289K = 120 MB
---- code generation workspace for objects 1336 bytes in 4 claims ---- code generation workspace for objects 1336 bytes in 4 claims
0.2% emitter array storage 280032 bytes in 1997 claims 0.2% emitter array storage 280032 bytes in 1997 claims
-145.-5% was overhead - -183740600 bytes = -179434K = -175 MB -145.-5% was overhead - -183758872 bytes = -179452K = -175 MB

View file

@ -1,34 +1,32 @@
100.0% in inform7 run 100.0% in inform7 run
71.2% in compilation to Inter 71.0% in compilation to Inter
50.8% in //Sequence::undertake_queued_tasks// 50.6% in //Sequence::undertake_queued_tasks//
4.3% in //MajorNodes::pre_pass// 4.5% in //MajorNodes::pre_pass//
3.5% in //MajorNodes::pass_1// 3.4% in //MajorNodes::pass_1//
1.8% in //ImperativeDefinitions::assess_all// 1.9% in //ImperativeDefinitions::assess_all//
1.8% in //RTPhrasebook::compile_entries// 1.9% in //RTPhrasebook::compile_entries//
1.5% in //RTKindConstructors::compile// 1.5% in //RTKindConstructors::compile//
1.1% in //Sequence::lint_inter// 1.0% in //Sequence::lint_inter//
0.5% in //ImperativeDefinitions::compile_first_block// 0.4% in //ImperativeDefinitions::compile_first_block//
0.5% in //MajorNodes::pass_2// 0.4% in //MajorNodes::pass_2//
0.5% in //Sequence::undertake_queued_tasks// 0.4% in //Sequence::undertake_queued_tasks//
0.5% in //World::stage_V// 0.4% in //Sequence::undertake_queued_tasks//
0.3% in //Sequence::undertake_queued_tasks// 0.4% in //World::stage_V//
0.1% in //CompletionModule::compile// 0.2% in //CompletionModule::compile//
0.1% in //InferenceSubjects::emit_all// 0.2% in //InferenceSubjects::emit_all//
0.1% in //RTKindConstructors::compile_permissions// 0.2% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors// 0.2% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III// 3.0% not specifically accounted for
2.6% not specifically accounted for 26.1% in running Inter pipeline
26.0% in running Inter pipeline
10.3% in step 14/15: generate inform6 -> auto.inf 10.3% in step 14/15: generate inform6 -> auto.inf
5.6% in step 5/15: load-binary-kits 5.7% in step 5/15: load-binary-kits
5.4% in step 6/15: make-synoptic-module 5.5% in step 6/15: make-synoptic-module
1.5% in step 9/15: make-identifiers-unique 1.5% in step 9/15: make-identifiers-unique
0.3% in step 12/15: eliminate-redundant-operations 0.4% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats 0.4% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring 0.4% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls 0.2% in step 11/15: eliminate-redundant-labels
0.1% in step 10/15: reconcile-verbs 0.2% in step 8/15: detect-indirect-calls
0.1% in step 11/15: eliminate-redundant-labels
1.3% not specifically accounted for 1.3% not specifically accounted for
2.2% in supervisor 2.3% in supervisor
0.4% not specifically accounted for 0.5% not specifically accounted for