1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/codegen-module/4-fi.html

163 lines
21 KiB
HTML
Raw Normal View History

2019-04-23 01:29:02 +03:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2019-08-28 12:35:44 +03:00
<title>4/fbi</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-04-23 01:29:02 +03:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2019-04-23 01:29:02 +03:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
2019-04-23 01:29:02 +03:00
2020-03-19 02:11:25 +02:00
</nav>
<main role="main">
2019-08-28 12:35:44 +03:00
<!--Weave of '4/fi' generated by 7-->
2020-03-22 12:50:19 +02:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Final Code</a></li><li><b>Final Inventory</b></li></ul><p class="purpose">To print a summary of the contents of a repository.</p>
2019-04-23 01:29:02 +03:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This target is fairly simple: when we get the message to begin generation,
we simply ask the Inter module to output some text, and return true to
tell the generator that nothing more need be done.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Inventory::create_target</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">inv_cgt</span><span class="plain"> = </span><span class="functiontext">CodeGen::Targets::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inventory"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">inv_cgt</span><span class="plain">, </span><span class="constant">BEGIN_GENERATION_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::Inventory::inv</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Inventory::inv</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-&gt;</span><span class="element">from_step</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"temporary generations cannot be output"</span><span class="plain">);</span>
2019-07-13 16:17:48 +03:00
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">-&gt;</span><span class="element">from</span><span class="plain">, </span><span class="functiontext">CodeGen::Inventory::visitor</span><span class="plain">,</span>
<span class="identifier">gen</span><span class="plain">-&gt;</span><span class="element">from_step</span><span class="plain">-&gt;</span><span class="element">text_out_file</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">-&gt;</span><span class="element">just_this_package</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Inventory::visitor</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = (</span><span class="identifier">text_stream</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
2019-06-29 19:36:49 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ptype</span><span class="plain"> = </span><span class="identifier">Inter::Packages::type</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">);</span>
2019-07-13 16:17:48 +03:00
2019-06-29 19:36:49 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">ptype</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_module"</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Module '%S'\n"</span><span class="plain">, </span><span class="identifier">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain"> = </span><span class="identifier">Inter::Packages::read_metadata</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"`title"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">title</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"From extension '%S by %S' version %S\n"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">,</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">Inter::Packages::read_metadata</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"`author"</span><span class="plain">),</span>
<span class="identifier">Inter::Packages::read_metadata</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"`version"</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain">;</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">ptype</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_submodule"</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">contents</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">) </span><span class="identifier">contents</span><span class="plain">++;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">contents</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S:\n"</span><span class="plain">, </span><span class="identifier">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span>
2019-06-29 19:36:49 +03:00
<span class="identifier">INDENT</span><span class="plain">;</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">Inter::Packages::unmark_all</span><span class="plain">();</span>
<span class="identifier">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">) {</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
2019-07-26 21:20:27 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Packages::get_flag</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">MARK_PACKAGE_FLAG</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ptype</span><span class="plain"> = </span><span class="identifier">Inter::Packages::type</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">);</span>
<span class="identifier">OUTDENT</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" %S "</span><span class="plain">, </span><span class="identifier">ptype</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">) {</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Packages::type</span><span class="plain">(</span><span class="identifier">R2</span><span class="plain">) == </span><span class="identifier">ptype</span><span class="plain">) </span><span class="identifier">N</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"x %d: "</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">);</span>
<span class="identifier">INDENT</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">ptype</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">) + </span><span class="constant">7</span><span class="plain">;</span>
2019-07-13 16:17:48 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">first</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">) {</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Packages::type</span><span class="plain">(</span><span class="identifier">R2</span><span class="plain">) == </span><span class="identifier">ptype</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain"> = </span><span class="identifier">Inter::Packages::read_metadata</span><span class="plain">(</span><span class="identifier">R2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"`name"</span><span class="plain">);</span>
2019-07-26 12:14:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">name</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">name</span><span class="plain"> = </span><span class="identifier">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">R2</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pos</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">first</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="identifier">pos</span><span class="plain"> += </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">) + </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain"> &gt; </span><span class="constant">80</span><span class="plain">) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">); </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">) + </span><span class="constant">2</span><span class="plain">; }</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
2019-07-26 21:20:27 +03:00
<span class="identifier">Inter::Packages::set_flag</span><span class="plain">(</span><span class="identifier">R2</span><span class="plain">, </span><span class="identifier">MARK_PACKAGE_FLAG</span><span class="plain">);</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">first</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
2019-04-24 01:31:35 +03:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\n"</span><span class="plain">);</span>
2019-04-24 01:31:35 +03:00
<span class="plain">}</span>
2019-06-29 19:36:49 +03:00
<span class="plain">}</span>
2019-07-13 16:17:48 +03:00
<span class="identifier">Inter::Packages::unmark_all</span><span class="plain">();</span>
2019-06-29 19:36:49 +03:00
<span class="identifier">OUTDENT</span><span class="plain">;</span>
2019-04-23 11:25:00 +03:00
<span class="plain">}</span>
2019-07-13 16:17:48 +03:00
<span class="reserved">return</span><span class="plain">;</span>
2019-04-23 01:29:02 +03:00
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-08-28 12:35:44 +03:00
<p class="endnote">The function CodeGen::Inventory::create_target is used in 4/ft (<a href="4-ft.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Inventory::inv appears nowhere else.</p>
2019-07-13 16:17:48 +03:00
<p class="endnote">The function CodeGen::Inventory::visitor appears nowhere else.</p>
2019-04-23 01:29:02 +03:00
<hr class="tocbar">
2019-08-28 12:35:44 +03:00
<ul class="toc"><li><a href="4-fbi.html">Back to 'Final Binary Inter'</a></li><li><a href="4-gi6.html">Continue with 'Generating Inform 6'</a></li></ul><hr class="tocbar">
2019-04-23 01:29:02 +03:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2019-04-23 01:29:02 +03:00
</body>
</html>