1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-30 22:14:58 +03:00

Made use of new web_md API in foundation

This commit is contained in:
Graham Nelson 2020-04-02 13:31:21 +01:00
parent a1e28495b3
commit 0eb9935979
5 changed files with 116 additions and 250 deletions

View file

@ -144,10 +144,10 @@ stages — before and after — they are accumulated.
<span class="plain">#</span><span class="identifier">endif</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">TEMPLATE_READING</span><span class="plain">, </span><span class="string">"Intervention at stage %d Segment %S Part %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">stage</span><span class="plain">, </span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">part</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i6ti</span><span class="plain">-</span><span class="element">&gt;I6T_matter</span><span class="plain">) {</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">i6ti</span><span class="plain">-</span><span class="element">&gt;I6T_matter</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">i6ti</span><span class="plain">-</span><span class="element">&gt;I6T_matter</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">i6ti</span><span class="plain">-</span><span class="element">&gt;alternative_segment</span><span class="plain">) &gt; 0)</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">i6ti</span><span class="plain">-</span><span class="element">&gt;alternative_segment</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">i6ti</span><span class="plain">-</span><span class="element">&gt;alternative_segment</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain"> == 0) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
@ -313,7 +313,7 @@ and therefore no interventions will have happened.)
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TemplateReader::extract</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">template_file</span><span class="plain">, </span><span class="reserved">I6T_kit</span><span class="plain"> *</span><span class="identifier">kit</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">SP</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">SP</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">template_file</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">SP</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">template_file</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">(*(</span><span class="identifier">kit</span><span class="plain">-</span><span class="element">&gt;raw_callback</span><span class="plain">))(</span><span class="identifier">SP</span><span class="plain">, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="plain">}</span>
@ -323,27 +323,23 @@ and therefore no interventions will have happened.)
<span class="plain">} </span><span class="reserved">contents_section_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">sf</span><span class="plain">,</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N_escape</span><span class="plain">, </span><span class="reserved">I6T_kit</span><span class="plain"> *</span><span class="identifier">kit</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N_escape</span><span class="plain">, </span><span class="reserved">I6T_kit</span><span class="plain"> *</span><span class="identifier">kit</span><span class="plain">, </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">Input_Filename</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">segment_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"all"</span><span class="plain">)) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">=0; </span><span class="identifier">area</span><span class="plain">&lt;</span><span class="identifier">kit</span><span class="plain">-</span><span class="element">&gt;no_i6t_file_areas</span><span class="plain">; </span><span class="identifier">area</span><span class="plain">++) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Pathnames::up</span><span class="plain">(</span><span class="identifier">kit</span><span class="plain">-</span><span class="element">&gt;i6t_files</span><span class="plain">[</span><span class="identifier">area</span><span class="plain">]);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) {</span>
<span class="reserved">contents_section_state</span><span class="plain"> </span><span class="identifier">CSS</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.active</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">CSS</span><span class="element">.sects</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain">);</span>
<span class="identifier">TextFiles::read</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="functiontext">TemplateReader::read_contents</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &amp;</span><span class="identifier">CSS</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">segment</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">CSS</span><span class="element">.sects</span><span class="plain">)</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sf</span><span class="plain">, </span><span class="identifier">segment</span><span class="plain">, </span><span class="identifier">N_escape</span><span class="plain">, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="identifier">WebMetadata::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">V2_SYNTAX</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="identifier">chapter_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-&gt;</span><span class="identifier">chapters_md</span><span class="plain">) {</span>
<span class="identifier">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="identifier">section_md</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-&gt;</span><span class="identifier">sections_md</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">SF</span><span class="plain"> = </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="identifier">source_file_for_section</span><span class="plain">;</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">sf</span><span class="plain">, </span><span class="identifier">Sm</span><span class="plain">-&gt;</span><span class="identifier">sect_title</span><span class="plain">, </span><span class="identifier">N_escape</span><span class="plain">, </span><span class="identifier">kit</span><span class="plain">, </span><span class="identifier">SF</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"unable to find a contents section to read 'all'"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">heading_name</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">skip_part</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">col</span><span class="plain"> = 1, </span><span class="identifier">cr</span><span class="plain">, </span><span class="identifier">sfp</span><span class="plain"> = 0;</span>
@ -354,7 +350,8 @@ and therefore no interventions will have happened.)
<span class="plain">(</span><span class="functiontext">TemplateReader::I6T_file_intervene</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">INSTEAD_LINK_STAGE</span><span class="plain">, </span><span class="identifier">segment_name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">kit</span><span class="plain">)))</span>
<span class="reserved">goto</span><span class="plain"> </span><span class="identifier">OmitFile</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">segment_name</span><span class="plain">) &gt; 0) {</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">segment_name</span><span class="plain">) &gt; 0) || (</span><span class="identifier">Input_Filename</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Open the I6 template file</span> <span class="cwebmacronumber">10.1</span>&gt;<span class="plain">;</span>
<span class="identifier">comment</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">comment</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
@ -392,7 +389,8 @@ part of the I6T kit.
<pre class="displaydefn">
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Input_Filename</span><span class="plain">)</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">Input_Filename</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">area</span><span class="plain">=0; </span><span class="identifier">area</span><span class="plain">&lt;</span><span class="identifier">kit</span><span class="plain">-</span><span class="element">&gt;no_i6t_file_areas</span><span class="plain">; </span><span class="identifier">area</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Input_File</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">Input_File</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span>
@ -717,7 +715,7 @@ safely between <code class="display"><span class="extract">{-open-index}</span><
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"segment"</span><span class="plain">)) {</span>
<span class="plain">(*(</span><span class="identifier">kit</span><span class="plain">-</span><span class="element">&gt;raw_callback</span><span class="plain">))(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">argument</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="functiontext">TemplateReader::interpret</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">argument</span><span class="plain">, -1, </span><span class="identifier">kit</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">(*(</span><span class="identifier">kit</span><span class="plain">-</span><span class="element">&gt;raw_callback</span><span class="plain">))(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kit</span><span class="plain">);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
@ -747,7 +745,7 @@ safely between <code class="display"><span class="extract">{-open-index}</span><
<p class="inwebparagraph"></p>
<p class="endnote">The function TemplateReader::read_contents is used in <a href="#SP10">&#167;10</a>.</p>
<p class="endnote">The function TemplateReader::read_contents appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Template errors. </b>Errors here used to be basically failed assertions, but inevitably people
reported that as a bug (0001596). It was never intended that I6T coding

View file

@ -35,7 +35,7 @@
<!--Weave of '2/pc' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">inpolicy</a></li><li><a href="index.html#2">Chapter 2: Policies</a></li><li><b>Problem Coverage</b></li></ul><p class="purpose">To see which problem messages have test cases and which are linked to the documentation.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Observation</a></li><li><a href="#SP3">&#167;3. Problems which have test cases</a></li><li><a href="#SP4">&#167;4. Problems mentioned in documentation</a></li><li><a href="#SP5">&#167;5. Problems generated in the I7 source</a></li><li><a href="#SP8">&#167;8. Checking</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Observation</a></li><li><a href="#SP3">&#167;3. Problems which have test cases</a></li><li><a href="#SP4">&#167;4. Problems mentioned in documentation</a></li><li><a href="#SP5">&#167;5. Problems generated in the I7 source</a></li><li><a href="#SP7">&#167;7. Checking</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Observation. </b>Problem messages are identified by their code-names, e.g., <code class="display"><span class="extract">PM_MisplacedFrom</span></code>;
those names should be unique, but any number of problems can instead be
@ -99,7 +99,7 @@ and augment its bitmap of known contexts:
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::observe_problem is used in <a href="#SP3">&#167;3</a>, <a href="#SP4">&#167;4</a>, <a href="#SP7">&#167;7</a>.</p>
<p class="endnote">The function Coverage::observe_problem is used in <a href="#SP3">&#167;3</a>, <a href="#SP4">&#167;4</a>, <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Problems which have test cases. </b>Here we ask Intest to produce a roster of all known test cases, then parse
this back to look for cases whose names have the <code class="display"><span class="extract">PM_...</span></code> format. Those are
@ -129,7 +129,7 @@ the problem message test cases, so we observe them.
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::which_problems_have_test_cases is used in <a href="#SP8_1">&#167;8.1</a>.</p>
<p class="endnote">The function Coverage::which_problems_have_test_cases is used in <a href="#SP7_1">&#167;7.1</a>.</p>
<p class="endnote">The function Coverage::test_case_harvester appears nowhere else.</p>
@ -160,88 +160,45 @@ to problem messages:
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::which_problems_are_referenced is used in <a href="#SP8_1">&#167;8.1</a>.</p>
<p class="endnote">The function Coverage::which_problems_are_referenced is used in <a href="#SP7_1">&#167;7.1</a>.</p>
<p class="endnote">The function Coverage::xref_harvester appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Problems generated in the I7 source. </b>Which is to say, actually existing problem messages. Ideally, this code
should find the modules included in Inform in some more sophisticated way.
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Problems generated in the I7 source. </b>Which is to say, actually existing problem messages.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Coverage::which_problems_exist</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">Coverage::which_problems_exist_inner</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform7"</span><span class="plain">));</span>
<span class="functiontext">Coverage::which_problems_exist_inner</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform7/core-module"</span><span class="plain">));</span>
<span class="functiontext">Coverage::which_problems_exist_inner</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform7/if-module"</span><span class="plain">));</span>
<span class="functiontext">Coverage::which_problems_exist_inner</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform7/multimedia-module"</span><span class="plain">));</span>
<span class="functiontext">Coverage::which_problems_exist_inner</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inter/codegen-module"</span><span class="plain">));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::which_problems_exist is used in <a href="#SP8_1">&#167;8.1</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>So now we have to read the contents page of a web, to see what section
files it contains:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">existence_state</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">web_path</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">chapter_path</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">section</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">existence_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Coverage::which_problems_exist_inner</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">existence_state</span><span class="plain"> </span><span class="identifier">es</span><span class="plain">;</span>
<span class="identifier">es</span><span class="element">.web_path</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">;</span>
<span class="identifier">es</span><span class="element">.chapter_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read contents page of 'inform7' web"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Coverage::section_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">es</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Coverage::section_harvester</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">existence_state</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain"> = (</span><span class="reserved">existence_state</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(Chapter %d+)%c+"</span><span class="plain">))</span>
<span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;chapter_path</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;web_path</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Appendix%c+"</span><span class="plain">)) </span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;chapter_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Preliminaries%c+"</span><span class="plain">)) </span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;chapter_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;chapter_path</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" (%c+?) *"</span><span class="plain">))) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+?) %[%[%c+"</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">".w"</span><span class="plain">);</span>
<span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;section</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;chapter_path</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;section</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read section page from 'inform7' web"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Coverage::existence_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">es</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">tools</span><span class="plain"> = </span><span class="functiontext">Pathnames::up</span><span class="plain">(</span><span class="identifier">path_to_inpolicy</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Pathnames::up</span><span class="plain">(</span><span class="identifier">tools</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"inweb"</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inform7</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">tools</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inform7"</span><span class="plain">);</span>
<span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain"> = </span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="identifier">path_to_inform7</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">,</span>
<span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">path_to_inweb</span><span class="plain">);</span>
<span class="reserved">chapter_md</span><span class="plain"> *</span><span class="identifier">Cm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Cm</span><span class="plain">, </span><span class="reserved">chapter_md</span><span class="plain">, </span><span class="identifier">Wm</span><span class="plain">-</span><span class="element">&gt;chapters_md</span><span class="plain">) {</span>
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">Sm</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">Sm</span><span class="plain">, </span><span class="reserved">section_md</span><span class="plain">, </span><span class="identifier">Cm</span><span class="plain">-</span><span class="element">&gt;sections_md</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">SF</span><span class="plain"> = </span><span class="identifier">Sm</span><span class="plain">-</span><span class="element">&gt;source_file_for_section</span><span class="plain">;</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">SF</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read section page from 'inform7'"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, &amp;</span><span class="functiontext">Coverage::existence_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">SF</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::which_problems_exist_inner is used in <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The function Coverage::which_problems_exist is used in <a href="#SP7_1">&#167;7.1</a>.</p>
<p class="endnote">The function Coverage::section_harvester appears nowhere else.</p>
<p class="endnote">The structure existence_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>So now we're working through individual section files. The exclusion of
the case called <code class="display"><span class="extract">sigil</span></code> throws out a macro definition in the source code,
not a specific problem case.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>So now we have to read a section, looking for the existence of problem
messages:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Coverage::existence_harvester</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">existence_state</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain"> = (</span><span class="reserved">existence_state</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">SF</span><span class="plain"> = (</span><span class="reserved">filename</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)_p_%((%c+?)%)(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
@ -252,13 +209,13 @@ not a specific problem case.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">context</span><span class="plain"> = </span><span class="constant">CODE_MENTIONS_PCON</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"BelievedImpossible"</span><span class="plain">)) {</span>
<span class="identifier">context</span><span class="plain"> = </span><span class="constant">IMPOSSIBLE_PCON</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"_%f_line%d"</span><span class="plain">, </span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;section</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">-</span><span class="element">&gt;line_count</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"_%f_line%d"</span><span class="plain">, </span><span class="identifier">SF</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">-</span><span class="element">&gt;line_count</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Untestable"</span><span class="plain">)) {</span>
<span class="identifier">context</span><span class="plain"> = </span><span class="constant">UNTESTABLE_PCON</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"_%f_line%d"</span><span class="plain">, </span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;section</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">-</span><span class="element">&gt;line_count</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"_%f_line%d"</span><span class="plain">, </span><span class="identifier">SF</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">-</span><span class="element">&gt;line_count</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"..."</span><span class="plain">)) {</span>
<span class="identifier">context</span><span class="plain"> = </span><span class="constant">NAMELESS_PCON</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"_%f_line%d"</span><span class="plain">, </span><span class="identifier">es</span><span class="plain">-</span><span class="element">&gt;section</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">-</span><span class="element">&gt;line_count</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"_%f_line%d"</span><span class="plain">, </span><span class="identifier">SF</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">-</span><span class="element">&gt;line_count</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Coverage::observe_problem</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">context</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
@ -269,9 +226,9 @@ not a specific problem case.
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::existence_harvester is used in <a href="#SP6">&#167;6</a>.</p>
<p class="endnote">The function Coverage::existence_harvester is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Checking. </b>So the actual policy-enforcement routine is here:
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Checking. </b>So the actual policy-enforcement routine is here:
</p>
@ -279,12 +236,12 @@ not a specific problem case.
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">observations_made</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Coverage::check</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">observations_made</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Perform the observations</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Perform the observations</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
<span class="identifier">observations_made</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">all_is_well</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Report and decide how grave the situation is</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Report and decide how grave the situation is</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">all_is_well</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"All is well.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"This needs attention.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
@ -296,8 +253,8 @@ not a specific problem case.
<p class="endnote">The function Coverage::check is used in 1/mn (<a href="1-mn.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform the observations</span> <span class="cwebmacronumber">8.1</span>&gt; =
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform the observations</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
@ -309,14 +266,14 @@ not a specific problem case.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b>Okay, so that's all of the scanning done; now to report on it.
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>Okay, so that's all of the scanning done; now to report on it.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Report and decide how grave the situation is</span> <span class="cwebmacronumber">8.2</span>&gt; =
&lt;<span class="cwebmacrodefn">Report and decide how grave the situation is</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
@ -372,9 +329,9 @@ not a specific problem case.
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
<pre class="display">
@ -403,9 +360,9 @@ not a specific problem case.
<p class="inwebparagraph"></p>
<p class="endnote">The function Coverage::cite is used in <a href="#SP8_2">&#167;8.2</a>.</p>
<p class="endnote">The function Coverage::cite is used in <a href="#SP7_2">&#167;7.2</a>.</p>
<p class="endnote">The function Coverage::list is used in <a href="#SP8_2">&#167;8.2</a>.</p>
<p class="endnote">The function Coverage::list is used in <a href="#SP7_2">&#167;7.2</a>.</p>
<hr class="tocbar">
<!--End of weave-->

View file

@ -99,64 +99,32 @@ void Coverage::xref_harvester(text_stream *text, text_file_position *tfp, void *
}
@h Problems generated in the I7 source.
Which is to say, actually existing problem messages. Ideally, this code
should find the modules included in Inform in some more sophisticated way.
Which is to say, actually existing problem messages.
=
void Coverage::which_problems_exist(void) {
Coverage::which_problems_exist_inner(Pathnames::from_text(I"inform7"));
Coverage::which_problems_exist_inner(Pathnames::from_text(I"inform7/core-module"));
Coverage::which_problems_exist_inner(Pathnames::from_text(I"inform7/if-module"));
Coverage::which_problems_exist_inner(Pathnames::from_text(I"inform7/multimedia-module"));
Coverage::which_problems_exist_inner(Pathnames::from_text(I"inter/codegen-module"));
}
@ So now we have to read the contents page of a web, to see what section
files it contains:
=
typedef struct existence_state {
struct pathname *web_path;
struct pathname *chapter_path;
struct filename *section;
} existence_state;
void Coverage::which_problems_exist_inner(pathname *D) {
filename *C = Filenames::in_folder(D, I"Contents.w");
existence_state es;
es.web_path = D;
es.chapter_path = NULL;
TextFiles::read(C, FALSE, "unable to read contents page of 'inform7' web", TRUE,
&Coverage::section_harvester, NULL, &es);
}
void Coverage::section_harvester(text_stream *text, text_file_position *tfp, void *state) {
existence_state *es = (existence_state *) state;
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, text, L"(Chapter %d+)%c+"))
es->chapter_path = Pathnames::subfolder(es->web_path, mr.exp[0]);
if (Regexp::match(&mr, text, L"Appendix%c+")) es->chapter_path = NULL;
if (Regexp::match(&mr, text, L"Preliminaries%c+")) es->chapter_path = NULL;
if ((es->chapter_path) && (Regexp::match(&mr, text, L" (%c+?) *"))) {
TEMPORARY_TEXT(leaf);
Str::copy(leaf, mr.exp[0]);
if (Regexp::match(&mr, leaf, L"(%c+?) %[%[%c+")) Str::copy(leaf, mr.exp[0]);
WRITE_TO(leaf, ".w");
es->section = Filenames::in_folder(es->chapter_path, leaf);
DISCARD_TEXT(leaf);
TextFiles::read(es->section, FALSE, "unable to read section page from 'inform7' web", TRUE,
&Coverage::existence_harvester, NULL, es);
pathname *tools = Pathnames::up(path_to_inpolicy);
pathname *path_to_inweb = Pathnames::subfolder(Pathnames::up(tools), I"inweb");
pathname *path_to_inform7 = Pathnames::subfolder(tools, I"inform7");
web_md *Wm = WebMetadata::get(path_to_inform7, NULL, V2_SYNTAX,
NULL, FALSE, TRUE, path_to_inweb);
chapter_md *Cm;
LOOP_OVER_LINKED_LIST(Cm, chapter_md, Wm->chapters_md) {
section_md *Sm;
LOOP_OVER_LINKED_LIST(Sm, section_md, Cm->sections_md) {
filename *SF = Sm->source_file_for_section;
TextFiles::read(SF, FALSE, "unable to read section page from 'inform7'",
TRUE, &Coverage::existence_harvester, NULL, (void *) SF);
}
}
Regexp::dispose_of(&mr);
}
@ So now we're working through individual section files. The exclusion of
the case called |sigil| throws out a macro definition in the source code,
not a specific problem case.
@ So now we have to read a section, looking for the existence of problem
messages:
=
void Coverage::existence_harvester(text_stream *text, text_file_position *tfp, void *state) {
existence_state *es = (existence_state *) state;
filename *SF = (filename *) state;
match_results mr = Regexp::create_mr();
while (Regexp::match(&mr, text, L"(%c*?)_p_%((%c+?)%)(%c*)")) {
Str::clear(text);
@ -167,13 +135,13 @@ void Coverage::existence_harvester(text_stream *text, text_file_position *tfp, v
int context = CODE_MENTIONS_PCON;
if (Str::eq(name, I"BelievedImpossible")) {
context = IMPOSSIBLE_PCON;
WRITE_TO(name, "_%f_line%d", es->section, tfp->line_count);
WRITE_TO(name, "_%f_line%d", SF, tfp->line_count);
} else if (Str::eq(name, I"Untestable")) {
context = UNTESTABLE_PCON;
WRITE_TO(name, "_%f_line%d", es->section, tfp->line_count);
WRITE_TO(name, "_%f_line%d", SF, tfp->line_count);
} else if (Str::eq(name, I"...")) {
context = NAMELESS_PCON;
WRITE_TO(name, "_%f_line%d", es->section, tfp->line_count);
WRITE_TO(name, "_%f_line%d", SF, tfp->line_count);
}
Coverage::observe_problem(name, context);
DISCARD_TEXT(name);

View file

@ -71,10 +71,10 @@ int TemplateReader::I6T_file_intervene(OUTPUT_STREAM, int stage, text_stream *se
#endif
LOGIF(TEMPLATE_READING, "Intervention at stage %d Segment %S Part %S\n", stage, segment, part);
if (i6ti->I6T_matter) {
TemplateReader::interpret(OUT, i6ti->I6T_matter, NULL, -1, kit);
TemplateReader::interpret(OUT, i6ti->I6T_matter, NULL, -1, kit, NULL);
}
if (Str::len(i6ti->alternative_segment) > 0)
TemplateReader::interpret(OUT, NULL, i6ti->alternative_segment, -1, kit);
TemplateReader::interpret(OUT, NULL, i6ti->alternative_segment, -1, kit, NULL);
if (stage == 0) rv = TRUE;
}
return rv;
@ -200,7 +200,7 @@ and therefore no interventions will have happened.)
=
void TemplateReader::extract(text_stream *template_file, I6T_kit *kit) {
text_stream *SP = Str::new();
TemplateReader::interpret(SP, NULL, template_file, -1, kit);
TemplateReader::interpret(SP, NULL, template_file, -1, kit, NULL);
(*(kit->raw_callback))(SP, kit);
}
@ -210,27 +210,23 @@ typedef struct contents_section_state {
} contents_section_state;
void TemplateReader::interpret(OUTPUT_STREAM, text_stream *sf,
text_stream *segment_name, int N_escape, I6T_kit *kit) {
text_stream *segment_name, int N_escape, I6T_kit *kit, filename *Input_Filename) {
if (Str::eq(segment_name, I"all")) {
for (int area=0; area<kit->no_i6t_file_areas; area++) {
pathname *P = Pathnames::up(kit->i6t_files[area]);
filename *F = Filenames::in_folder(P, I"Contents.w");
if (TextFiles::exists(F)) {
contents_section_state CSS;
CSS.active = FALSE;
CSS.sects = NEW_LINKED_LIST(text_stream);
TextFiles::read(F, FALSE,
NULL, FALSE, TemplateReader::read_contents, NULL, (void *) &CSS);
text_stream *segment;
LOOP_OVER_LINKED_LIST(segment, text_stream, CSS.sects)
TemplateReader::interpret(OUT, sf, segment, N_escape, kit);
return;
web_md *Wm = WebMetadata::get(P, NULL, V2_SYNTAX, NULL, FALSE, TRUE, NULL);
chapter_md *Cm;
LOOP_OVER_LINKED_LIST(Cm, chapter_md, Wm->chapters_md) {
section_md *Sm;
LOOP_OVER_LINKED_LIST(Sm, section_md, Cm->sections_md) {
filename *SF = Sm->source_file_for_section;
TemplateReader::interpret(OUT, sf, Sm->sect_title, N_escape, kit, SF);
}
}
}
TemplateReader::error("unable to find a contents section to read 'all'", I"Contents.w");
return;
}
FILE *Input_File = NULL;
TEMPORARY_TEXT(heading_name);
int skip_part = FALSE, comment = TRUE;
int col = 1, cr, sfp = 0;
@ -241,7 +237,8 @@ void TemplateReader::interpret(OUTPUT_STREAM, text_stream *sf,
(TemplateReader::I6T_file_intervene(OUT, INSTEAD_LINK_STAGE, segment_name, NULL, kit)))
goto OmitFile;
if (Str::len(segment_name) > 0) {
FILE *Input_File = NULL;
if ((Str::len(segment_name) > 0) || (Input_Filename)) {
@<Open the I6 template file@>;
comment = TRUE;
} else comment = FALSE;
@ -263,7 +260,8 @@ void TemplateReader::interpret(OUTPUT_STREAM, text_stream *sf,
part of the I6T kit.
@<Open the I6 template file@> =
Input_File = NULL;
if (Input_Filename)
Input_File = Filenames::fopen(Input_Filename, "r");
for (int area=0; area<kit->no_i6t_file_areas; area++)
if (Input_File == NULL)
Input_File = Filenames::fopen(
@ -486,7 +484,7 @@ safely between |{-open-index}| and |{-close-index}|.
if (Str::eq_wide_string(command, L"segment")) {
(*(kit->raw_callback))(OUT, kit);
Str::clear(OUT);
TemplateReader::interpret(OUT, NULL, argument, -1, kit);
TemplateReader::interpret(OUT, NULL, argument, -1, kit, NULL);
(*(kit->raw_callback))(OUT, kit);
Str::clear(OUT);
continue;

View file

@ -66,50 +66,18 @@ INBUILDX = inbuild/Tangled/inbuild
# After its declaration, we list all modules needed to compile the tool.
{tool} INBLORB inblorb inblorb
{dep} INBLORB on FOUNDATION
{tool} INDOC indoc indoc
{dep} INDOC on FOUNDATION
{tool} INFORM7 inform7 inform7
{dep} INFORM7 on FOUNDATION
{dep} INFORM7 on WORDS
{dep} INFORM7 on INFLECTIONS
{dep} INFORM7 on SYNTAX
{dep} INFORM7 on LINGUISTICS
{dep} INFORM7 on KINDS
{dep} INFORM7 on PROBLEMS
{dep} INFORM7 on CORE
{dep} INFORM7 on IF
{dep} INFORM7 on MULTIMEDIA
{dep} INFORM7 on INDEX
{dep} INFORM7 on HTML
{dep} INFORM7 on ARCH
{dep} INFORM7 on INTER
{dep} INFORM7 on BUILDING
{dep} INFORM7 on CODEGEN
{dep} INFORM7 on INBUILD
{tool} INPOLICY inpolicy inpolicy
{dep} INPOLICY on FOUNDATION
{tool} INRTPS inrtps inrtps
{dep} INRTPS on FOUNDATION
{tool} INBUILDTOOL inbuild inbuild
{dep} INBUILDTOOL on FOUNDATION
{dep} INBUILDTOOL on WORDS
{dep} INBUILDTOOL on SYNTAX
{dep} INBUILDTOOL on HTML
{dep} INBUILDTOOL on ARCH
{dep} INBUILDTOOL on INBUILD
{tool} INTERTOOL inter inter
{dep} INTERTOOL on FOUNDATION
{dep} INTERTOOL on ARCH
{dep} INTERTOOL on INTER
{dep} INTERTOOL on BUILDING
{dep} INTERTOOL on CODEGEN
# Inform 6 is not a web, so we have to give it special treatment:
@ -118,41 +86,18 @@ INFORM6X = inform6/Tangled/inform6
# While these are also executables, they only provide unit tests for modules:
{tool} INFLECTIONSTEST inflections-test inform7/inflections-test
{dep} INFLECTIONSTEST on FOUNDATION
{dep} INFLECTIONSTEST on WORDS
{dep} INFLECTIONSTEST on INFLECTIONS
{tool} LINGUISTICSTEST linguistics-test inform7/linguistics-test
{dep} LINGUISTICSTEST on FOUNDATION
{dep} LINGUISTICSTEST on WORDS
{dep} LINGUISTICSTEST on INFLECTIONS
{dep} LINGUISTICSTEST on SYNTAX
{dep} LINGUISTICSTEST on LINGUISTICS
{tool} PROBLEMSTEST problems-test inform7/problems-test
{dep} PROBLEMSTEST on FOUNDATION
{dep} PROBLEMSTEST on WORDS
{dep} PROBLEMSTEST on SYNTAX
{dep} PROBLEMSTEST on PROBLEMS
{tool} SYNTAXTEST syntax-test inbuild/syntax-test
{dep} SYNTAXTEST on FOUNDATION
{dep} SYNTAXTEST on WORDS
{dep} SYNTAXTEST on SYNTAX
{tool} WORDSTEST words-test inbuild/words-test
{dep} WORDSTEST on FOUNDATION
{dep} WORDSTEST on WORDS
{tool} BUILDINGTEST building-test inter/building-test
{dep} BUILDINGTEST on FOUNDATION
{dep} BUILDINGTEST on BUILDING
{dep} BUILDINGTEST on INTER
{dep} BUILDINGTEST on WORDS
{tool} ARCHTEST arch-test inbuild/arch-test
{dep} ARCHTEST on FOUNDATION
{dep} ARCHTEST on ARCH
# -----------------------------------------------------------------------------
# Targets "all" and "force"
@ -181,15 +126,15 @@ inform7/Internal/Languages/English/Syntax.preform: inform7/Tangled/Syntax.prefor
# -----------------------------------------------------------------------------
# Each individual tool has its own makefile, stored inside its individual web.
# "make makers" runs through each tool in turn and creates this makefile.
# Note the repeatblock feature: the line in the block is repeated once for each
# Note the repeat-tools-block feature: the line in the block is repeated once for each
# defined tool. Inside the block, an asterisk expands to the tool's symbol
# name: so for example, for inblorb, *WEB would become INBLORBWEB.
.PHONY: makers
makers:
{repeatblock}
{repeat-tools-block}
$(INWEBX) $(*WEB) -makefile $(*MAKER)
{endblock}
{end-block}
$(INWEBX) -prototype inform6/makescript.txt -makefile inform6/inform6.mk
$(INWEBX) -prototype retrospective/makescript.txt -makefile retrospective/makefile
@ -201,9 +146,9 @@ makers:
.PHONY: gitignores
gitignores:
$(INWEBX) -prototype scripts/gitignorescript.txt -gitignore .gitignore
{repeatblock}
{repeat-tools-block}
$(INWEBX) $(*WEB) -gitignore $(*WEB)/.gitignore
{endblock}
{end-block}
$(INWEBX) -prototype inform6/gitignorescript.txt -gitignore inform6/.gitignore
# -----------------------------------------------------------------------------
@ -213,9 +158,9 @@ gitignores:
.PHONY: versions
versions:
{repeatblock}
{repeat-tools-block}
$(*X) -version
{endblock}
{end-block}
$(INFORM6X) -V
# -----------------------------------------------------------------------------
@ -261,13 +206,13 @@ forcekits:
# Note the use of repeat to make a list: $(INBLORBX) $(INDOCX) ..., etc.
.PHONY: tools
tools: {repeatspan}$(*X){endspan} $(INFORM6X)
tools: {repeat-tools-span}$(*X){end-span} $(INFORM6X)
{repeatblock}
$(*X): {dependent-files-for}*
{repeat-tools-block}
$(*X): {dependent-files-for-tool}*
$(MAKE) -f $(*MAKER)
{endblock}
{end-block}
# As ever, Inform 6 needs special handling:
@ -292,10 +237,10 @@ retrospective:
.PHONY: forcetools
forcetools:
{repeatblock}
{repeat-tools-block}
$(MAKE) -f $(*MAKER) force
$(MAKE) -f inform6/inform6.mk force
{endblock}
{end-block}
# -----------------------------------------------------------------------------
# Target "check"
@ -309,9 +254,9 @@ forcetools:
check:
$(MAKE) -f inform6/inform6.mk test
$(INPOLICYX) -silence -check-problems
{repeatblock}
{repeat-tools-block}
$(MAKE) -f $(*MAKER) test
{endblock}
{end-block}
# -----------------------------------------------------------------------------
# Target "tangle"
@ -324,9 +269,9 @@ tangle:
$(call tangle-webs)
define tangle-webs
{repeatblock}
{repeat-tools-block}
$(INWEBX) $(*WEB) -tangle
{endblock}
{end-block}
endef
# -----------------------------------------------------------------------------
@ -342,9 +287,9 @@ weave:
$(call weave-webs)
define weave-webs
{repeatblock}
{repeat-tools-block}
$(INWEBX) $(*WEB) $(WEAVEOPTS)
{endblock}
{end-block}
endef
# -----------------------------------------------------------------------------
@ -468,9 +413,9 @@ clean:
$(call clean-up)
define clean-up
{repeatblock}
{repeat-tools-block}
$(MAKE) -f $(*MAKER) clean
{endblock}
{end-block}
$(MAKE) -f inform6/inform6.mk clean
endef
@ -485,9 +430,9 @@ purge:
$(call purge-up)
define purge-up
{repeatblock}
{repeat-tools-block}
$(MAKE) -f $(*MAKER) purge
{endblock}
{end-block}
$(MAKE) -f inform6/inform6.mk purge
endef