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/2-alm.html

1026 lines
217 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/rcc</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02: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-03-17 14:40:57 +02: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>
</nav>
<main role="main">
2019-03-17 14:40:57 +02:00
<!--Weave of '2/alm' 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#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Assimilate Linked Matter</b></li></ul><p class="purpose">To assimilate the material in parsed non-code splats.</p>
2019-03-17 14:40:57 +02:00
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Parsing</a></li></ul><hr class="tocbar">
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Pipeline stage. </b></p>
2019-03-17 14:40:57 +02:00
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::create_pipeline_stage</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"assimilate"</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</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">current_assimilation_pass</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_assimilated_actions</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_assimilated_commands</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_assimilated_arrays</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
2019-08-09 15:24:05 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">trace_AME</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
2019-06-11 02:38:15 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">step</span><span class="plain">-&gt;</span><span class="element">repository</span><span class="plain">;</span>
<span class="plain">++</span><span class="identifier">current_assimilation_pass</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">no_assimilated_actions</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">no_assimilated_commands</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">no_assimilated_arrays</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">Site::ensure_assimilation_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">plain_ptype_symbol</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_reverse_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_REVERSE"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_slash_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_SLASH"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_divider_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_DIVIDER"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_result_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_RESULT"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_special_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_SPECIAL"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_number_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_NUMBER"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_noun_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_NOUN"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_multi_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_MULTI"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_multiinside_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_MULTIINSIDE"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_multiheld_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_MULTIHELD"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_held_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_HELD"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_creature_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_CREATURE"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_topic_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_TOPIC"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::ensure</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">verb_directive_multiexcept_symbol</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"VERB_DIRECTIVE_MULTIEXCEPT"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"self"</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ss</span><span class="plain"> = </span><span class="identifier">Veneer::find_by_index</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">SELF_VSYMB</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ss</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">"stuck"</span><span class="plain">);</span>
<span class="identifier">Inter::Connectors::socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"self"</span><span class="plain">, </span><span class="identifier">ss</span><span class="plain">);</span>
<span class="plain">}</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::visitor1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SPLAT_IST</span><span class="plain">);</span>
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::visitor2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SPLAT_IST</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::function_bodies</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::visitor3</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SPLAT_IST</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>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::ensure</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_symbol</span><span class="plain"> **</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (*</span><span class="identifier">S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::create_pipeline_stage is used in 1/stg (<a href="1-stg.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Assimilate::run_pipeline_stage appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::ensure appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Parsing. </b></p>
<pre class="display">
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::template_submodule</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">text_stream</span><span class="plain"> *</span><span class="identifier">name</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>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">submodule_ptype_symbol</span><span class="plain">) {</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">template_package</span><span class="plain"> = </span><span class="identifier">Site::ensure_assimilation_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">plain_ptype_symbol</span><span class="plain">);</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">t_p</span><span class="plain"> = </span><span class="identifier">Inter::Packages::by_name</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t_p</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
2019-08-02 20:51:21 +03:00
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::after_this_node</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">t_p</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(&amp;</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">submodule_ptype_symbol</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2019-07-27 13:16:22 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t_p</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">"failed to define"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::Bookmarks::at_end_of_this_package</span><span class="plain">(</span><span class="identifier">t_p</span><span class="plain">);</span>
<span class="plain">}</span>
2019-08-02 20:51:21 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::Bookmarks::after_this_node</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">P</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::Assimilate::visitor1</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>
<span class="reserved">switch</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">PLM_SPLAT_IFLD</span><span class="plain">]) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTY_PLM:</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assimilate definition</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ATTRIBUTE_PLM:</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">truth_state_kind_symbol</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assimilate definition</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ROUTINE_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STUB_PLM:</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">) &amp;&amp; (</span><span class="identifier">unchecked_function_symbol</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Assimilate routine</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</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::Assimilate::visitor2</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>
<span class="reserved">switch</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">PLM_SPLAT_IFLD</span><span class="plain">]) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DEFAULT_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAKEACTION_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECT_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">VERB_PLM:</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assimilate definition</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ARRAY_PLM:</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">list_of_unchecked_kind_symbol</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assimilate definition</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<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::Assimilate::visitor3</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>
<span class="reserved">switch</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">PLM_SPLAT_IFLD</span><span class="plain">]) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GLOBAL_PLM:</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assimilate definition</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::template_submodule is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::visitor1 is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::visitor2 is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::visitor3 is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b></p>
2019-03-17 14:40:57 +02:00
<pre class="definitions">
2020-04-07 03:06:09 +03:00
<span class="definitionkeyword">define</span> <span class="constant">MAX_ASSIMILATED_ARRAY_ENTRIES</span><span class="plain"> </span><span class="constant">2048</span>
2019-03-17 14:40:57 +02:00
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assimilate definition</span> <span class="cwebmacronumber">2.1</span>&gt; =
2019-03-17 14:40:57 +02:00
</code></p>
<pre class="displaydefn">
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">plm</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">PLM_SPLAT_IFLD</span><span class="plain">];</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Parse text of splat for identifier and value</span> <span class="cwebmacronumber">2.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">proceed</span><span class="plain">) &amp;&amp; (</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">plm</span><span class="plain"> = </span><span class="identifier">CONSTANT_PLM</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> != </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) </span>&lt;<span class="cwebmacro">Act on parsed constant definition</span> <span class="cwebmacronumber">2.1.2</span>&gt;<span class="plain">;</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">Inter::Tree::remove_node</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
<span class="identifier">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a> (five times).</p>
<p class="inwebparagraph"><a id="SP2_1_1"></a><b>&#167;2.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse text of splat for identifier and value</span> <span class="cwebmacronumber">2.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2019-07-24 22:29:29 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Inter::Node::ID_to_text</span><span class="plain">(</span><span class="identifier">P</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">MATTER_SPLAT_IFLD</span><span class="plain">]);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">VERB_PLM</span><span class="plain">) {</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ (%c*?) *;%c*"</span><span class="plain">)) {</span>
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"assim_gv"</span><span class="plain">; </span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Stuck on this! %S\n"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ *(%C+?)(--&gt; *%c*?) *;%c*"</span><span class="plain">)) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]; </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ *(%C+?)(-&gt; *%c*?) *;%c*"</span><span class="plain">)) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]; </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ (%C*?) *;%c*"</span><span class="plain">)) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ (%C*) *= *(%c*?) *;%c*"</span><span class="plain">)) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]; </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ (%C*) (%c*?) *;%c*"</span><span class="plain">)) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]; </span><span class="identifier">proceed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Stuck on this! %S\n"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">identifier</span><span class="plain">) </span><span class="identifier">Str::trim_all_white_space_at_end</span><span class="plain">(</span><span class="identifier">identifier</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">FAKEACTION_PLM</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">old</span><span class="plain"> = </span><span class="identifier">identifier</span><span class="plain">;</span>
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">identifier</span><span class="plain">, </span><span class="string">"##%S"</span><span class="plain">, </span><span class="identifier">old</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">OBJECT_PLM</span><span class="plain">) </span><span class="identifier">value</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
</pre>
2019-03-17 14:40:57 +02:00
2019-07-17 02:39:04 +03:00
<p class="inwebparagraph"></p>
2019-07-17 02:39:04 +03:00
<p class="endnote">This code is used in <a href="#SP2_1">&#167;2.1</a>.</p>
2019-07-17 02:39:04 +03:00
<p class="inwebparagraph"><a id="SP2_1_2"></a><b>&#167;2.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Act on parsed constant definition</span> <span class="cwebmacronumber">2.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
2019-08-02 20:51:21 +03:00
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM_d</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::after_this_node</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain"> = &amp;</span><span class="identifier">IBM_d</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">submodule_name</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">suffix</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">subpackage_type</span><span class="plain"> = </span><span class="identifier">plain_ptype_symbol</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">VERB_PLM:</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">command_ptype_symbol</span><span class="plain">) </span><span class="identifier">subpackage_type</span><span class="plain"> = </span><span class="identifier">command_ptype_symbol</span><span class="plain">;</span>
<span class="identifier">submodule_name</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"commands"</span><span class="plain">; </span><span class="identifier">suffix</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ARRAY_PLM:</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">submodule_name</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"arrays"</span><span class="plain">; </span><span class="identifier">suffix</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"arr"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAKEACTION_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECT_PLM:</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">submodule_name</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"constants"</span><span class="plain">; </span><span class="identifier">suffix</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"con"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GLOBAL_PLM:</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">submodule_name</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"variables"</span><span class="plain">; </span><span class="identifier">suffix</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"var"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ATTRIBUTE_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTY_PLM:</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">property_ptype_symbol</span><span class="plain">) </span><span class="identifier">subpackage_type</span><span class="plain"> = </span><span class="identifier">property_ptype_symbol</span><span class="plain">;</span>
<span class="identifier">submodule_name</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"properties"</span><span class="plain">; </span><span class="identifier">suffix</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"prop"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">submodule_name</span><span class="plain">) {</span>
<span class="identifier">IBM_d</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::template_submodule</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">submodule_name</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
2019-07-17 14:16:17 +03:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">subpackage_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">suffix</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">subpackage_name</span><span class="plain">, </span><span class="string">"%S_%S"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">suffix</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">subpackage_name</span><span class="plain">, </span><span class="string">"assim_command_%d"</span><span class="plain">, ++</span><span class="identifier">no_assimilated_commands</span><span class="plain">);</span>
<span class="plain">}</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">Inter::Bookmarks::set_current_package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
<span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">subpackage_name</span><span class="plain">, </span><span class="identifier">subpackage_type</span><span class="plain">));</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">subpackage_name</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">FAKEACTION_PLM</span><span class="plain">)</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">FAKE_ACTION_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">OBJECT_PLM</span><span class="plain">)</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">OBJECT_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">external_name</span><span class="plain"> = </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="identifier">external_name</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain"> = </span><span class="identifier">con_name</span><span class="plain">;</span>
<span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAKEACTION_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECT_PLM:</span><span class="plain"> {</span>
2019-07-17 14:16:17 +03:00
&lt;<span class="cwebmacro">Assimilate a value</span> <span class="cwebmacronumber">2.1.2.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">break</span><span class="plain">;</span>
2019-04-27 13:29:40 +03:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GLOBAL_PLM:</span>
2019-07-17 14:16:17 +03:00
&lt;<span class="cwebmacro">Assimilate a value</span> <span class="cwebmacronumber">2.1.2.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Variable::new</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">break</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ATTRIBUTE_PLM:</span><span class="plain"> {</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="string">"P_%S"</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">attr_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">attr_symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (!</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">attr_symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">attr_symbol</span><span class="plain"> = </span><span class="identifier">con_name</span><span class="plain">;</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Property::new</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">attr_symbol</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">truth_state_kind_symbol</span><span class="plain">),</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">ATTRIBUTE_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">EITHER_OR_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">alias_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_creating</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">alias_symbol</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2019-07-17 14:16:17 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">))) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">alias_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_creating</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">));</span>
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">alias_symbol</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">);</span>
2019-04-10 04:13:29 +03:00
<span class="plain">}</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">)))</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">));</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTY_PLM:</span><span class="plain"> {</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Property::new</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">),</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-09-07 22:43:31 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"absent"</span><span class="plain">))</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"P_absent"</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">VERB_PLM:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ARRAY_PLM:</span><span class="plain"> {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">annot</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr2</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">conts</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">plm</span><span class="plain"> == </span><span class="identifier">ARRAY_PLM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *--&gt; *(%c*?) *"</span><span class="plain">)) </span><span class="identifier">conts</span><span class="plain"> = </span><span class="identifier">mr2</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0];</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *-&gt; *(%c*?) *"</span><span class="plain">)) { </span><span class="identifier">conts</span><span class="plain"> = </span><span class="identifier">mr2</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">annot</span><span class="plain"> = </span><span class="identifier">BYTEARRAY_IANN</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="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *table *(%c*?) *"</span><span class="plain">)) { </span><span class="identifier">conts</span><span class="plain"> = </span><span class="identifier">mr2</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">annot</span><span class="plain"> = </span><span class="identifier">TABLEARRAY_IANN</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="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *buffer *(%c*?) *"</span><span class="plain">)) { </span><span class="identifier">conts</span><span class="plain"> = </span><span class="identifier">mr2</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">annot</span><span class="plain"> = </span><span class="identifier">BUFFERARRAY_IANN</span><span class="plain">; }</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Identifier = &lt;%S&gt;, Value = &lt;%S&gt;"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
<span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"invalid Inform 6 array declaration in the template"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2019-07-17 14:16:17 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">conts</span><span class="plain"> = </span><span class="identifier">value</span><span class="plain">; </span><span class="identifier">annot</span><span class="plain"> = </span><span class="identifier">VERBARRAY_IANN</span><span class="plain">;</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">annot</span><span class="plain"> != </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">annot</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
2019-07-17 14:16:17 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1_pile</span><span class="plain">[</span><span class="constant">MAX_ASSIMILATED_ARRAY_ENTRIES</span><span class="plain">];</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v2_pile</span><span class="plain">[</span><span class="constant">MAX_ASSIMILATED_ARRAY_ENTRIES</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">no_assimilated_array_entries</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
2019-07-17 14:16:17 +03:00
<span class="identifier">string_position</span><span class="plain"> </span><span class="identifier">spos</span><span class="plain"> = </span><span class="identifier">Str::start</span><span class="plain">(</span><span class="identifier">conts</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">NT</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">next_is_action</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">TRUE</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">next_is_action</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="string">"##"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Extract a token</span> <span class="cwebmacronumber">2.1.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">next_is_action</span><span class="plain">) &amp;&amp; (</span><span class="identifier">action_kind_symbol</span><span class="plain">)) {</span>
<span class="functiontext">CodeGen::Assimilate::ensure_action</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">next_is_action</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">ARRAY_PLM</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">value</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"+"</span><span class="plain">)) </span><span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"Inform 6 array declaration in the template using operator '+'"</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::eq</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"-"</span><span class="plain">)) </span><span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"Inform 6 array declaration in the template using operator '-'"</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::eq</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*"</span><span class="plain">)) </span><span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"Inform 6 array declaration in the template using operator '*'"</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::eq</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"/"</span><span class="plain">)) </span><span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"Inform 6 array declaration in the template using operator '/'"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
2019-03-17 14:40:57 +02: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">NT</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">VERB_PLM</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"meta"</span><span class="plain">))) {</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">METAVERB_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
&lt;<span class="cwebmacro">Assimilate a value</span> <span class="cwebmacronumber">2.1.2.2</span>&gt;<span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">NT</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_assimilated_array_entries</span><span class="plain"> &gt;= </span><span class="constant">MAX_ASSIMILATED_ARRAY_ENTRIES</span><span class="plain">) {</span>
<span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"excessively long Inform 6 array in the template"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">v1_pile</span><span class="plain">[</span><span class="identifier">no_assimilated_array_entries</span><span class="plain">] = </span><span class="identifier">v1</span><span class="plain">;</span>
<span class="identifier">v2_pile</span><span class="plain">[</span><span class="identifier">no_assimilated_array_entries</span><span class="plain">] = </span><span class="identifier">v2</span><span class="plain">;</span>
<span class="identifier">no_assimilated_array_entries</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">VERB_PLM</span><span class="plain">) &amp;&amp; (</span><span class="identifier">verb_directive_result_symbol</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Inter::SymbolsTables::symbol_from_data_pair_and_table</span><span class="plain">(</span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">)) == </span><span class="identifier">verb_directive_result_symbol</span><span class="plain">))</span>
<span class="identifier">next_is_action</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
<span class="plain">}</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="plain">}</span>
2019-07-17 02:39:04 +03:00
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">array_in_progress</span><span class="plain"> =</span>
<span class="identifier">Inter::Node::fill_3</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">CONSTANT_IST</span><span class="plain">,</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">list_of_unchecked_kind_symbol</span><span class="plain">),</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">CONSTANT_INDIRECT_LIST</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">array_in_progress</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">extent</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Node::extend</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) (2*</span><span class="identifier">no_assimilated_array_entries</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't extend frame"</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">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">no_assimilated_array_entries</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">array_in_progress</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">pos</span><span class="plain">++] = </span><span class="identifier">v1_pile</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="identifier">array_in_progress</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">pos</span><span class="plain">++] = </span><span class="identifier">v2_pile</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">array_in_progress</span><span class="plain">));</span>
<span class="identifier">Inter::Bookmarks::insert</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">array_in_progress</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">ARRAY_PLM</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
2019-07-17 02:39:04 +03:00
<p class="endnote">This code is used in <a href="#SP2_1">&#167;2.1</a>.</p>
2019-03-17 14:40:57 +02:00
2019-07-17 02:39:04 +03:00
<p class="inwebparagraph"><a id="SP2_1_2_1"></a><b>&#167;2.1.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Extract a token</span> <span class="cwebmacronumber">2.1.2.1</span>&gt; =
2019-03-17 14:40:57 +02:00
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">squoted</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">dquoted</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">bracketed</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">Str::in_range</span><span class="plain">(</span><span class="identifier">spos</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">spos</span><span class="plain">))))</span>
<span class="identifier">spos</span><span class="plain"> = </span><span class="identifier">Str::forward</span><span class="plain">(</span><span class="identifier">spos</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Str::in_range</span><span class="plain">(</span><span class="identifier">spos</span><span class="plain">)) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">spos</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">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">squoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">dquoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">bracketed</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\''</span><span class="plain">) &amp;&amp; (</span><span class="identifier">dquoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">squoted</span><span class="plain"> = (</span><span class="identifier">squoted</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\"'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">squoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">dquoted</span><span class="plain"> = (</span><span class="identifier">dquoted</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'('</span><span class="plain">) &amp;&amp; (</span><span class="identifier">dquoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">squoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">bracketed</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">')'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">dquoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">squoted</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">bracketed</span><span class="plain">--;</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="identifier">spos</span><span class="plain"> = </span><span class="identifier">Str::forward</span><span class="plain">(</span><span class="identifier">spos</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-07-17 02:39:04 +03:00
<p class="endnote">This code is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
2019-03-17 14:40:57 +02:00
2019-07-17 02:39:04 +03:00
<p class="inwebparagraph"><a id="SP2_1_2_2"></a><b>&#167;2.1.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assimilate a value</span> <span class="cwebmacronumber">2.1.2.2</span>&gt; =
2019-03-17 14:40:57 +02:00
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
2019-07-17 02:39:04 +03:00
<span class="functiontext">CodeGen::Assimilate::value</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, &amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">VERB_PLM</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">v1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; </span><span class="identifier">v2</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-07-17 02:39:04 +03:00
<p class="endnote">This code is used in <a href="#SP2_1_2">&#167;2.1.2</a> (three times).</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assimilate routine</span> <span class="cwebmacronumber">2.2</span>&gt; =
2019-03-17 14:40:57 +02:00
</code></p>
<pre class="displaydefn">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">chain</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">body</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Parse the routine or stub header</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">identifier</span><span class="plain">) </span>&lt;<span class="cwebmacro">Act on parsed header</span> <span class="cwebmacronumber">2.2.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Parse the routine or stub header</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2019-07-24 22:29:29 +03:00
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Inter::Node::ID_to_text</span><span class="plain">(</span><span class="identifier">P</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">MATTER_SPLAT_IFLD</span><span class="plain">]);</span>
<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">PLM_SPLAT_IFLD</span><span class="plain">] == </span><span class="identifier">ROUTINE_PLM</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%[ *(%i+) *; *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">body</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1];</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="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%[ *(%i+) *(%c*?); *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]; </span><span class="identifier">chain</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1]; </span><span class="identifier">body</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[2];</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"invalid Inform 6 routine declaration in the template"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</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="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *%C+ *(%i+) (%d+);%c*"</span><span class="plain">)) {</span>
<span class="identifier">identifier</span><span class="plain"> = </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0];</span>
<span class="identifier">chain</span><span class="plain"> = </span><span class="identifier">Str::new</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="identifier">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1], </span><span class="constant">0</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">N</span><span class="plain">&lt;0) || (</span><span class="identifier">N</span><span class="plain">&gt;15)) </span><span class="identifier">N</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=1; </span><span class="identifier">i</span><span class="plain">&lt;=</span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">chain</span><span class="plain">, </span><span class="string">"x%d "</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">body</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"rfalse; ];"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="functiontext">TemplateReader::error</span><span class="plain">(</span><span class="string">"invalid Inform 6 Stub declaration in the template"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"></p>
2019-03-17 14:40:57 +02:00
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP2_2_2"></a><b>&#167;2.2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Act on parsed header</span> <span class="cwebmacronumber">2.2.2</span>&gt; =
</code></p>
2019-03-17 14:40:57 +02:00
<pre class="displaydefn">
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM_d</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::template_submodule</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"functions"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain"> = &amp;</span><span class="identifier">IBM_d</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">fnt</span><span class="plain"> = </span><span class="identifier">function_ptype_symbol</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fnt</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">fnt</span><span class="plain"> = </span><span class="identifier">plain_ptype_symbol</span><span class="plain">;</span>
2019-07-17 02:39:04 +03:00
2019-07-27 13:16:22 +03:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">, </span><span class="string">"%S_fn"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">FP</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">fname</span><span class="plain">, </span><span class="identifier">fnt</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">fname</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">outer_save</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
<span class="identifier">Inter::Bookmarks::set_current_package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">FP</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">bname</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">bname</span><span class="plain">, </span><span class="string">"%S_B"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">IP</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">bname</span><span class="plain">, </span><span class="identifier">code_ptype_symbol</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">bname</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">inner_save</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
<span class="identifier">Inter::Bookmarks::set_current_package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">IP</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">block_bookmark</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">chain</span><span class="plain">) {</span>
<span class="identifier">string_position</span><span class="plain"> </span><span class="identifier">spos</span><span class="plain"> = </span><span class="identifier">Str::start</span><span class="plain">(</span><span class="identifier">chain</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">TRUE</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
&lt;<span class="cwebmacro">Extract a token</span> <span class="cwebmacronumber">2.1.2.1</span>&gt;<span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">loc_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">IP</span><span class="plain">), </span><span class="identifier">value</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::local</span><span class="plain">(</span><span class="identifier">loc_name</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Local::new</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">loc_name</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">value</span><span class="plain">);</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Code::new</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</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">body</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">) - </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">&gt;0) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) != </span><span class="character">']'</span><span class="plain">)) </span><span class="identifier">L</span><span class="plain">--;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">&gt;0) &amp;&amp; (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-1)))) </span><span class="identifier">L</span><span class="plain">--;</span>
<span class="identifier">Str::truncate</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">IP</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">block_bookmark</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">*</span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">inner_save</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rsymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_function</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FP</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FP</span><span class="plain">, </span><span class="identifier">unchecked_function_symbol</span><span class="plain">),</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">IP</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="plain">*</span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">outer_save</span><span class="plain">;</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">Inter::Tree::remove_node</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
2019-03-17 14:40:57 +02:00
2019-07-17 02:39:04 +03:00
<pre class="display">
2019-07-27 13:16:22 +03:00
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(</span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</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_symbol</span><span class="plain"> *</span><span class="identifier">ptype</span><span class="plain">) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">inter_package</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">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Package::new_package_named</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">ptype</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">P</span><span class="plain">));</span>
2019-07-17 02:39:04 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::install_socket</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_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">aka_text</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">socket</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">aka_text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">socket</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Inter::Connectors::socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">aka_text</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</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">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">into_scope</span><span class="plain">) {</span>
2019-07-17 14:16:17 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">new_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">into_scope</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">new_symbol</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
2019-07-17 14:16:17 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_symbol</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::new_package_named is used in <a href="#SP2">&#167;2</a>, <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP4">&#167;4</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function CodeGen::Assimilate::install_socket is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::make_socketed_symbol is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
2019-07-24 22:29:29 +03:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::ensure_action</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="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM_d</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::template_submodule</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"actions"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain"> = &amp;</span><span class="identifier">IBM_d</span><span class="plain">;</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ptype</span><span class="plain"> = </span><span class="identifier">action_ptype_symbol</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ptype</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">ptype</span><span class="plain"> = </span><span class="identifier">plain_ptype_symbol</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="string">"assim_action_%d"</span><span class="plain">, ++</span><span class="identifier">no_assimilated_actions</span><span class="plain">);</span>
2019-07-27 13:16:22 +03:00
<span class="identifier">Inter::Bookmarks::set_current_package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">ptype</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">asymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">, </span><span class="string">"%SSub"</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">txsymb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">unsharped</span><span class="plain">);</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">xsymb</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">txsymb</span><span class="plain">) </span><span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">xsymb</span><span class="plain">, </span><span class="identifier">txsymb</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
2019-07-17 02:39:04 +03:00
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">asymb</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">action_kind_symbol</span><span class="plain">),</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LITERAL_IVAL</span><span class="plain">, </span><span class="constant">10000</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">asymb</span><span class="plain">, </span><span class="identifier">ACTION_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-07-17 02:39:04 +03:00
<p class="endnote">The function CodeGen::Assimilate::ensure_action is used in <a href="#SP2_1_2">&#167;2.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
2019-03-17 14:40:57 +02:00
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::value</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_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> *</span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> *</span><span class="identifier">val2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">Verbal</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">sign</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">base</span><span class="plain"> = </span><span class="constant">10</span><span class="plain">, </span><span class="identifier">from</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">)-1, </span><span class="identifier">bad</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'\''</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">) == </span><span class="character">'\''</span><span class="plain">)) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">from</span><span class="plain">++;</span>
<span class="identifier">to</span><span class="plain">--;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">dw</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">.</span><span class="identifier">index</span><span class="plain"> &lt; </span><span class="identifier">from</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">.</span><span class="identifier">index</span><span class="plain"> &gt; </span><span class="identifier">to</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">dw</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">Inter::Warehouse::create_text</span><span class="plain">(</span><span class="identifier">Inter::Tree::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">pack</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">glob_storage</span><span class="plain"> = </span><span class="identifier">Inter::Warehouse::get_text</span><span class="plain">(</span><span class="identifier">Inter::Tree::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">ID</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">glob_storage</span><span class="plain">, </span><span class="identifier">dw</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">DWORD_IVAL</span><span class="plain">; *</span><span class="identifier">val2</span><span class="plain"> = </span><span class="identifier">ID</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">dw</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::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">)) {</span>
<span class="identifier">from</span><span class="plain">++;</span>
<span class="identifier">to</span><span class="plain">--;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">dw</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">.</span><span class="identifier">index</span><span class="plain"> &lt; </span><span class="identifier">from</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">.</span><span class="identifier">index</span><span class="plain"> &gt; </span><span class="identifier">to</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">dw</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">Inter::Warehouse::create_text</span><span class="plain">(</span><span class="identifier">Inter::Tree::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">pack</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">glob_storage</span><span class="plain"> = </span><span class="identifier">Inter::Warehouse::get_text</span><span class="plain">(</span><span class="identifier">Inter::Tree::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">ID</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">glob_storage</span><span class="plain">, </span><span class="identifier">dw</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">LITERAL_TEXT_IVAL</span><span class="plain">; *</span><span class="identifier">val2</span><span class="plain"> = </span><span class="identifier">ID</span><span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">dw</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::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'('</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">) == </span><span class="character">')'</span><span class="plain">)) { </span><span class="identifier">from</span><span class="plain">++; </span><span class="identifier">to</span><span class="plain">--; }</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">))) </span><span class="identifier">from</span><span class="plain">++;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">))) </span><span class="identifier">to</span><span class="plain">--;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'-'</span><span class="plain">) { </span><span class="identifier">sign</span><span class="plain"> = -1; </span><span class="identifier">from</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="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'$'</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">from</span><span class="plain">++; </span><span class="identifier">base</span><span class="plain"> = </span><span class="constant">16</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">) == </span><span class="character">'$'</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">from</span><span class="plain">++; </span><span class="identifier">base</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><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-03-17 14:40:57 +02:00
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">.</span><span class="identifier">index</span><span class="plain"> &lt; </span><span class="identifier">from</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">.</span><span class="identifier">index</span><span class="plain"> &gt; </span><span class="identifier">to</span><span class="plain">) </span><span class="reserved">continue</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">c</span><span class="plain"> = </span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">), </span><span class="identifier">d</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'a'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'z'</span><span class="plain">)) </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">-</span><span class="character">'a'</span><span class="plain">+10;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'A'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'Z'</span><span class="plain">)) </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">-</span><span class="character">'A'</span><span class="plain">+10;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> &gt;= </span><span class="character">'0'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'9'</span><span class="plain">)) </span><span class="identifier">d</span><span class="plain"> = </span><span class="identifier">c</span><span class="plain">-</span><span class="character">'0'</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> { </span><span class="identifier">bad</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">d</span><span class="plain"> &gt; </span><span class="identifier">base</span><span class="plain">) { </span><span class="identifier">bad</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">base</span><span class="plain">*</span><span class="identifier">N</span><span class="plain"> + (</span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">d</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">.</span><span class="identifier">index</span><span class="plain"> &gt; </span><span class="constant">34</span><span class="plain">) { </span><span class="identifier">bad</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">; }</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bad</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">N</span><span class="plain"> = </span><span class="identifier">sign</span><span class="plain">*</span><span class="identifier">N</span><span class="plain">;</span>
<span class="plain">*</span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; *</span><span class="identifier">val2</span><span class="plain"> = (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">N</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"true"</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="plain">*</span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; *</span><span class="identifier">val2</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"false"</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="plain">*</span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; *</span><span class="identifier">val2</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Verbal</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">verb_directive_divider_symbol</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">verb_directive_divider_symbol</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"-&gt;"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">verb_directive_result_symbol</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">verb_directive_result_symbol</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"reverse"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">verb_directive_reverse_symbol</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">verb_directive_reverse_symbol</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"/"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">verb_directive_slash_symbol</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">verb_directive_slash_symbol</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"special"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">verb_directive_special_symbol</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">verb_directive_special_symbol</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</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">S</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"number"</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">verb_directive_number_symbol</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">verb_directive_number_symbol</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"scope=(%i+)"</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</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">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">SCOPE_FILTER_IANN</span><span class="plain">) != </span><span class="constant">1</span><span class="plain">)</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">SCOPE_FILTER_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"noun=(%i+)"</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</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">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">NOUN_FILTER_IANN</span><span class="plain">) != </span><span class="constant">1</span><span class="plain">)</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">NOUN_FILTER_IANN</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="identifier">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
2019-07-14 12:44:07 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">mcc_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">mcc_name</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">);</span>
<span class="plain">}</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::compute_constant</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_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">) {</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">try</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant_r</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">node_tree</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">try</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">try</span><span class="plain">;</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">InterSchemas::log</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Forced to glob: %S\n"</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">converted_from</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"Forced to glob: %S\n"</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">converted_from</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"Reduced to glob in assimilation"</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">Inter::Warehouse::create_text</span><span class="plain">(</span><span class="identifier">Inter::Tree::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">pack</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">glob_storage</span><span class="plain"> = </span><span class="identifier">Inter::Warehouse::get_text</span><span class="plain">(</span><span class="identifier">Inter::Tree::warehouse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">ID</span><span class="plain">);</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">glob_storage</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">converted_from</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">mcc_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::computed_constant_symbol</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">mcc_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">GLOB_IVAL</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mcc_name</span><span class="plain">;</span>
<span class="plain">}</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::compute_constant_r</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_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_type</span><span class="plain"> == </span><span class="identifier">SUBEXPRESSION_ISNT</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::compute_constant_r</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_type</span><span class="plain"> == </span><span class="identifier">OPERATION_ISNT</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">op</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-08-28 12:35:44 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">PLUS_BIP</span><span class="plain">) </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">CONSTANT_SUM_LIST</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="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">TIMES_BIP</span><span class="plain">) </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">CONSTANT_PRODUCT_LIST</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="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">MINUS_BIP</span><span class="plain">) </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">CONSTANT_DIFFERENCE_LIST</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="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">DIVIDE_BIP</span><span class="plain">) </span><span class="identifier">op</span><span class="plain"> = </span><span class="identifier">CONSTANT_QUOTIENT_LIST</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="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">UNARYMINUS_BIP</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::compute_constant_unary_operation</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i1</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant_r</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i2</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant_r</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">i2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-07-14 12:44:07 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::compute_constant_binary_operation</span><span class="plain">(</span><span class="identifier">op</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">i1</span><span class="plain">, </span><span class="identifier">i2</span><span class="plain">);</span>
<span class="plain">}</span>
2019-08-28 12:35:44 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_type</span><span class="plain"> == </span><span class="identifier">EXPRESSION_ISNT</span><span class="plain">) {</span>
<span class="identifier">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">expression_tokens</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">next</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">next</span><span class="plain">-&gt;</span><span class="identifier">next</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-07-14 12:44:07 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i1</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant_eval</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i2</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant_eval</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">next</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">i1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">i2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-07-14 12:44:07 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::compute_constant_binary_operation</span><span class="plain">(</span><span class="identifier">CONSTANT_SUM_LIST</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">i1</span><span class="plain">, </span><span class="identifier">i2</span><span class="plain">);</span>
<span class="plain">}</span>
2019-07-14 12:44:07 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::compute_constant_eval</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::compute_constant_eval</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_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = </span><span class="identifier">UNDEF_IVAL</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
2019-08-28 12:35:44 +03:00
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">ist_type</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">IDENTIFIER_ISTT:</span><span class="plain"> {</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">symb</span><span class="plain">;</span>
2019-08-28 12:35:44 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">NUMBER_ISTT:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">BIN_NUMBER_ISTT:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HEX_NUMBER_ISTT:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">constant_number</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">v1</span><span class="plain"> = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; </span><span class="identifier">v2</span><span class="plain"> = (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">constant_number</span><span class="plain">; }</span>
2019-08-28 12:35:44 +03:00
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Types::read_I6_decimal</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-&gt;</span><span class="identifier">material</span><span class="plain">, &amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad number"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">v1</span><span class="plain"> == </span><span class="identifier">UNDEF_IVAL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">mcc_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::computed_constant_symbol</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">mcc_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">,</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mcc_name</span><span class="plain">;</span>
<span class="plain">}</span>
2019-08-28 12:35:44 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::compute_constant_unary_operation</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_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">operand1</span><span class="plain">) {</span>
2019-07-14 12:44:07 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i1</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::compute_constant_r</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">operand1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">mcc_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::computed_constant_symbol</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">array_in_progress</span><span class="plain"> =</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Node::fill_3</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">CONSTANT_IST</span><span class="plain">, </span><span class="identifier">Inter::SymbolsTables::id_from_IRS_and_symbol</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">mcc_name</span><span class="plain">), </span><span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">CONSTANT_DIFFERENCE_LIST</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">array_in_progress</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">extent</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">Inter::Node::extend</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">, </span><span class="constant">4</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't extend frame"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">array_in_progress</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">pos</span><span class="plain">] = </span><span class="identifier">LITERAL_IVAL</span><span class="plain">; </span><span class="identifier">array_in_progress</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">pos</span><span class="plain">+1] = </span><span class="constant">0</span><span class="plain">;</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">i1</span><span class="plain">, &amp;(</span><span class="identifier">array_in_progress</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">pos</span><span class="plain">+2]), &amp;(</span><span class="identifier">array_in_progress</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">pos</span><span class="plain">+3]));</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">array_in_progress</span><span class="plain">));</span>
<span class="identifier">Inter::Bookmarks::insert</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">array_in_progress</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mcc_name</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::compute_constant_binary_operation</span><span class="plain">(</span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">op</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_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i1</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">i2</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">mcc_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::computed_constant_symbol</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">array_in_progress</span><span class="plain"> =</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Inter::Node::fill_3</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">CONSTANT_IST</span><span class="plain">, </span><span class="identifier">Inter::SymbolsTables::id_from_IRS_and_symbol</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">mcc_name</span><span class="plain">), </span><span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">op</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + </span><span class="constant">1</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">array_in_progress</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">extent</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">Inter::Node::extend</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">, </span><span class="constant">4</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"can't extend frame"</span><span class="plain">);</span>
2019-07-24 22:29:29 +03:00
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">i1</span><span class="plain">, &amp;(</span><span class="identifier">array_in_progress</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">pos</span><span class="plain">]), &amp;(</span><span class="identifier">array_in_progress</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">pos</span><span class="plain">+1]));</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">i2</span><span class="plain">, &amp;(</span><span class="identifier">array_in_progress</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">pos</span><span class="plain">+2]), &amp;(</span><span class="identifier">array_in_progress</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">pos</span><span class="plain">+3]));</span>
<span class="identifier">Produce::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">array_in_progress</span><span class="plain">));</span>
<span class="identifier">Inter::Bookmarks::insert</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">array_in_progress</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mcc_name</span><span class="plain">;</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">ccs_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::computed_constant_symbol</span><span class="plain">(</span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">NN</span><span class="plain">);</span>
2019-09-07 22:43:31 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">NN</span><span class="plain">, </span><span class="string">"Computed_Constant_Value_%d"</span><span class="plain">, </span><span class="identifier">ccs_count</span><span class="plain">++);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">mcc_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_creating</span><span class="plain">(</span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">), </span><span class="identifier">NN</span><span class="plain">);</span>
2019-09-07 22:43:31 +03:00
<span class="identifier">Inter::Symbols::set_flag</span><span class="plain">(</span><span class="identifier">mcc_name</span><span class="plain">, </span><span class="identifier">MAKE_NAME_UNIQUE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">NN</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mcc_name</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">routine_body_request</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">assimilation_pass</span><span class="plain">;</span>
2019-07-14 12:44:07 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">block_bookmark</span><span class="plain">;</span>
2019-08-28 12:35:44 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">enclosure</span><span class="plain">;</span>
2019-07-27 13:16:22 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">block_package</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pass2_offset</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">body</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">routine_body_request</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">rb_splat_count</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
2019-07-27 13:16:22 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(</span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">block_package</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">bb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2019-05-07 00:32:11 +03:00
<span class="reserved">routine_body_request</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">routine_body_request</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">assimilation_pass</span><span class="plain"> = </span><span class="identifier">current_assimilation_pass</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">block_bookmark</span><span class="plain"> = </span><span class="identifier">bb</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">enclosure</span><span class="plain"> = </span><span class="identifier">Packaging::enclosure</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::tree</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">position</span><span class="plain"> = </span><span class="identifier">Packaging::bubble_at</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">block_package</span><span class="plain"> = </span><span class="identifier">block_package</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">pass2_offset</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">offset</span><span class="plain"> - </span><span class="constant">2</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">body</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">);</span>
2019-05-07 00:32:11 +03:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::function_bodies</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="reserved">routine_body_request</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="reserved">routine_body_request</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">req</span><span class="plain">-&gt;</span><span class="element">assimilation_pass</span><span class="plain"> == </span><span class="identifier">current_assimilation_pass</span><span class="plain">) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">SCHEMA_COMPILATION</span><span class="plain">, </span><span class="string">"=======\n\nRoutine (%S) len %d: '%S'\n\n"</span><span class="plain">, </span><span class="identifier">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">block_package</span><span class="plain">), </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">body</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">body</span><span class="plain">);</span>
<span class="identifier">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="identifier">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">body</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">0</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">Log::aspect_switched_on</span><span class="plain">(</span><span class="identifier">SCHEMA_COMPILATION_DA</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">sch</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"NULL SCH\n"</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="identifier">sch</span><span class="plain">-&gt;</span><span class="identifier">node_tree</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Lint fail: Non-empty text but empty scheme\n"</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"inter schema empty"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">InterSchemas::log</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Site::set_cir</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">block_package</span><span class="plain">);</span>
<span class="identifier">Packaging::set_state</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">position</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">enclosure</span><span class="plain">);</span>
<span class="identifier">Produce::push_code_position</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Produce::new_cip</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">position</span><span class="plain">)), </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">Packaging::at</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)));</span>
<span class="identifier">value_holster</span><span class="plain"> </span><span class="identifier">VH</span><span class="plain"> = </span><span class="identifier">Holsters::new</span><span class="plain">(</span><span class="identifier">INTER_VOID_VHMODE</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope1</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-&gt;</span><span class="element">block_package</span><span class="plain">);</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">template_package</span><span class="plain"> = </span><span class="identifier">Site::assimilation_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope2</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">);</span>
<span class="identifier">EmitInterSchemas::emit</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, &amp;</span><span class="identifier">VH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">scope1</span><span class="plain">, </span><span class="identifier">scope2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">Produce::pop_code_position</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">Site::set_cir</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
2019-07-17 02:39:04 +03:00
<p class="endnote">The function CodeGen::Assimilate::value is used in <a href="#SP2_1_2_2">&#167;2.1.2.2</a>.</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function CodeGen::Assimilate::compute_constant appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::compute_constant_r appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::compute_constant_eval appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::compute_constant_unary_operation appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::compute_constant_binary_operation appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::computed_constant_symbol appears nowhere else.</p>
<p class="endnote">The function CodeGen::Assimilate::routine_body is used in <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::function_bodies is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The structure routine_body_request is private to this section.</p>
2019-03-17 14:40:57 +02:00
<hr class="tocbar">
<ul class="toc"><li><a href="2-rcc.html">Back to 'Resolving Conditional Compilation'</a></li><li><a href="2-res.html">Continue with 'Resolve External Symbols'</a></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>