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

830 lines
187 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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '2/alm' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Linking</a></li><li><b>Assimilate Linked Matter</b></li></ul><p class="purpose">To generate the initial state of storage for variables.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Parsing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Parsing. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">assim_verb_count</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::assimilate</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">) {</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">read_into</span><span class="plain">;</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</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">outer</span><span class="plain"> = </span><span class="identifier">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">P</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><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">outer</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">outer</span><span class="plain">-&gt;</span><span class="identifier">codelike_package</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">SPLAT_IST</span><span class="plain">)) {</span>
<span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">current_package</span><span class="plain"> = </span><span class="identifier">outer</span><span class="plain">;</span>
<span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> = </span><span class="identifier">Inter::Packages::baseline</span><span class="plain">(</span><span class="identifier">outer</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">baseline</span><span class="plain"> = (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">baseline</span><span class="plain"> = 0;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">P</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="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTY_PLM</span><span class="plain">:</span>
<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">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ATTRIBUTE_PLM</span><span class="plain">:</span>
<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">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ROUTINE_PLM</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STUB_PLM</span><span class="plain">:</span>
<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">1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</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">outer</span><span class="plain"> = </span><span class="identifier">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">outer</span><span class="plain">-&gt;</span><span class="identifier">codelike_package</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">SPLAT_IST</span><span class="plain">)) {</span>
<span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">current_package</span><span class="plain"> = </span><span class="identifier">outer</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><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">outer</span><span class="plain">);</span>
<span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> = </span><span class="identifier">Inter::Packages::baseline</span><span class="plain">(</span><span class="identifier">outer</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">baseline</span><span class="plain"> = (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">baseline</span><span class="plain"> = 0;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">P</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="reserved">case</span><span class="plain"> </span><span class="identifier">DEFAULT_PLM</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_PLM</span><span class="plain">:</span>
2019-04-27 13:29:40 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAKEACTION_PLM</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECT_PLM</span><span class="plain">:</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">VERB_PLM</span><span class="plain">:</span>
<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">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</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">list_of_unchecked_kind_symbol</span><span class="plain">) </span>&lt;<span class="cwebmacro">Assimilate definition</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::Assimilate::routine_bodies</span><span class="plain">();</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</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">outer</span><span class="plain"> = </span><span class="identifier">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (((</span><span class="identifier">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">outer</span><span class="plain">-&gt;</span><span class="identifier">codelike_package</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">SPLAT_IST</span><span class="plain">)) {</span>
<span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">current_package</span><span class="plain"> = </span><span class="identifier">outer</span><span class="plain">;</span>
<span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> = </span><span class="identifier">Inter::Packages::baseline</span><span class="plain">(</span><span class="identifier">outer</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><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">outer</span><span class="plain">);</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">baseline</span><span class="plain"> = (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outer</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">baseline</span><span class="plain"> = 0;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">P</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="reserved">case</span><span class="plain"> </span><span class="identifier">GLOBAL_PLM</span><span class="plain">:</span>
<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">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::assimilate is used in 1/sc (<a href="1-sc.html#SP4">&#167;4</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b></p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_ASSIMILATED_ARRAY_ENTRIES</span><span class="plain"> 2048</span>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Assimilate definition</span> <span class="cwebmacronumber">1.1</span>&gt; =
</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">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>
<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="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Inter::get_text</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">repo_segment</span><span class="plain">-&gt;</span><span class="identifier">owning_repo</span><span class="plain">, </span><span class="identifier">P</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">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">PLM_SPLAT_IFLD</span><span class="plain">] != </span><span class="identifier">VERB_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">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>
<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="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>
<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="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>
<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="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>
<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="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>
<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="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\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</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">"assim_verb_%d"</span><span class="plain">, ++</span><span class="identifier">assim_verb_count</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>
<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="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\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
2019-04-27 13:29:40 +03:00
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">ib</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="identifier">ib</span><span class="plain">.</span><span class="identifier">in_frame_list</span><span class="plain"> = &amp;(</span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">sequence</span><span class="plain">);</span>
<span class="identifier">ib</span><span class="plain">.</span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">P_entry</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">identifier</span><span class="plain">) &amp;&amp; (</span><span class="identifier">unchecked_kind_symbol</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>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">switch_on</span><span class="plain"> = </span><span class="identifier">P</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="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_on</span><span class="plain"> == </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) {</span>
2019-04-25 11:44:40 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain"> = </span><span class="functiontext">CodeGen::Link::find_name</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">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">symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">switch_on</span><span class="plain"> = </span><span class="identifier">CONSTANT_PLM</span><span class="plain">;</span>
<span class="plain">}</span>
2019-04-27 13:29:40 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_on</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">switch_on</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-04-27 13:29:40 +03:00
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_on</span><span class="plain"> != </span><span class="identifier">DEFAULT_PLM</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="functiontext">CodeGen::Assimilate::maybe_extern</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">into_scope</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::annotate_i</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">ASSIMILATED_IANN</span><span class="plain">, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_on</span><span class="plain"> == </span><span class="identifier">FAKEACTION_PLM</span><span class="plain">)</span>
<span class="identifier">Inter::Symbols::annotate_i</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">FAKE_ACTION_IANN</span><span class="plain">, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">switch_on</span><span class="plain"> == </span><span class="identifier">OBJECT_PLM</span><span class="plain">)</span>
<span class="identifier">Inter::Symbols::annotate_i</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">OBJECT_IANN</span><span class="plain">, 1);</span>
2019-03-17 14:40:57 +02: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>
<span class="plain">}</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = 0, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">switch_on</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_PLM</span><span class="plain">:</span>
2019-04-27 13:29:40 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">FAKEACTION_PLM</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OBJECT_PLM</span><span class="plain">:</span>
2019-04-27 13:29:40 +03:00
&lt;<span class="cwebmacro">Assimilate a value</span> <span class="cwebmacronumber">1.1.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(&amp;</span><span class="identifier">ib</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">outer</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">outer</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>
<span class="identifier">baseline</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GLOBAL_PLM</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Assimilate a value</span> <span class="cwebmacronumber">1.1.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Variable::new</span><span class="plain">(&amp;</span><span class="identifier">ib</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">outer</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">outer</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>
<span class="identifier">baseline</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
2019-04-10 04:13:29 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ATTRIBUTE_PLM</span><span class="plain">: {</span>
<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">into_scope</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="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Property::new</span><span class="plain">(&amp;</span><span class="identifier">ib</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">outer</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">outer</span><span class="plain">, </span><span class="identifier">truth_state_kind_symbol</span><span class="plain">),</span>
<span class="identifier">baseline</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">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">, 1);</span>
<span class="identifier">Inter::Symbols::annotate_i</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">EITHER_OR_IANN</span><span class="plain">, 1);</span>
<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">into_scope</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>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Inter::Symbols::annotate_i</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">ASSIMILATED_IANN</span><span class="plain">, 1);</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">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">into_scope</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>
<span class="plain">}</span>
<span class="plain">}</span>
2019-04-10 04:13:29 +03:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">break</span><span class="plain">;</span>
2019-04-10 04:13:29 +03:00
<span class="plain">}</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">PROPERTY_PLM</span><span class="plain">:</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Property::new</span><span class="plain">(&amp;</span><span class="identifier">ib</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">outer</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">outer</span><span class="plain">, </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">),</span>
<span class="identifier">baseline</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="reserved">case</span><span class="plain"> </span><span class="identifier">VERB_PLM</span><span class="plain">:</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"> = 0;</span>
<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">P</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">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>
<span class="plain">}</span>
<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>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">annot</span><span class="plain"> != 0) </span><span class="identifier">Inter::Symbols::annotate_i</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">annot</span><span class="plain">, 1);</span>
<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>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_assimilated_array_entries</span><span class="plain"> = 0;</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">conts</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NT</span><span class="plain"> = 0, </span><span class="identifier">next_is_action</span><span class="plain"> = </span><span class="identifier">FALSE</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>
<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">1.1.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>
2019-04-25 11:44:40 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">CodeGen::Link::find_name</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">TRUE</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">inter_symbol</span><span class="plain"> *</span><span class="identifier">asymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::maybe_extern</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">into_scope</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(&amp;</span><span class="identifier">ib</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">outer</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">outer</span><span class="plain">, </span><span class="identifier">action_kind_symbol</span><span class="plain">),</span>
<span class="identifier">LITERAL_IVAL</span><span class="plain">, 10000, </span><span class="identifier">baseline</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">I</span><span class="plain">, </span><span class="identifier">asymb</span><span class="plain">, </span><span class="identifier">ACTION_IANN</span><span class="plain">, 1);</span>
<span class="plain">}</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>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</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">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>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">NT</span><span class="plain"> == 0) &amp;&amp; (</span><span class="identifier">P</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">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">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">, 1);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
&lt;<span class="cwebmacro">Assimilate a value</span> <span class="cwebmacronumber">1.1.2</span>&gt;<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">value</span><span class="plain">) == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<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">P</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">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">into_scope</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>
<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>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">array_in_progress</span><span class="plain"> =</span>
<span class="identifier">Inter::Frame::fill_3</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">CONSTANT_IST</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">outer</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">outer</span><span class="plain">, </span><span class="identifier">list_of_unchecked_kind_symbol</span><span class="plain">),</span>
<span class="identifier">CONSTANT_INDIRECT_LIST</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">);</span>
<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">.</span><span class="identifier">extent</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Frame::extend</span><span class="plain">(&amp;</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>
<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>
<span class="identifier">array_in_progress</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">.</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>
<span class="plain">}</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">));</span>
<span class="identifier">Inter::Frame::insert</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">, &amp;</span><span class="identifier">ib</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">Inter::Nop::nop_out</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a> (five times).</p>
<p class="inwebparagraph"><a id="SP1_1_1"></a><b>&#167;1.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Extract a token</span> <span class="cwebmacronumber">1.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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"> = 0;</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">)) &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>
<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"> == 0)) </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">'</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</span><span class="plain">:</span><span class="identifier">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">"</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</span><span class="plain">:</span><span class="identifier">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">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>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>, <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_1_2"></a><b>&#167;1.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assimilate a value</span> <span class="cwebmacronumber">1.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<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; 0) {</span>
<span class="functiontext">CodeGen::Assimilate::value</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">outer</span><span class="plain">, &amp;</span><span class="identifier">ib</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>
2019-03-17 14:40:57 +02:00
<span class="plain">(</span><span class="identifier">switch_on</span><span class="plain"> == </span><span class="identifier">VERB_PLM</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="plain">} </span><span class="reserved">else</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"> = 0;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a> (three times).</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Assimilate routine</span> <span class="cwebmacronumber">1.2</span>&gt; =
</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">text_stream</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">text_stream</span><span class="plain"> *</span><span class="identifier">body</span><span class="plain"> = </span><span class="identifier">NULL</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="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Inter::get_text</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">repo_segment</span><span class="plain">-&gt;</span><span class="identifier">owning_repo</span><span class="plain">, </span><span class="identifier">P</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">.</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>
<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>
<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], 0);</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"> = 1;</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">=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>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">identifier</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_symbol</span><span class="plain"> *</span><span class="identifier">block_name</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">bname</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_reading_state</span><span class="plain"> </span><span class="identifier">ib</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::snapshot</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="identifier">ib</span><span class="plain">.</span><span class="identifier">in_frame_list</span><span class="plain"> = &amp;(</span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">sequence</span><span class="plain">);</span>
<span class="identifier">ib</span><span class="plain">.</span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">P_entry</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="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Package::new_package</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">,</span>
<span class="identifier">code_packagetype</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">IP</span><span class="plain">));</span>
<span class="identifier">Inter::Defn::set_current_package</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">IP</span><span class="plain">);</span>
<span class="identifier">inter_reading_state</span><span class="plain"> </span><span class="identifier">block_bookmark</span><span class="plain"> = </span><span class="identifier">ib</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">var_count</span><span class="plain"> = 0;</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>
&lt;<span class="cwebmacro">Extract a token</span> <span class="cwebmacronumber">1.1.1</span>&gt;<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">value</span><span class="plain">) == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">var_count</span><span class="plain">++;</span>
<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::Package::local_symbols</span><span class="plain">(</span><span class="identifier">block_name</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>
2019-03-17 14:40:57 +02:00
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Local::new</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</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">, 0, </span><span class="identifier">baseline</span><span class="plain">+1, </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>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">begin_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">Inter::Package::local_symbols</span><span class="plain">(</span><span class="identifier">block_name</span><span class="plain">), </span><span class="identifier">I</span><span class="string">".begin"</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">end_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">Inter::Package::local_symbols</span><span class="plain">(</span><span class="identifier">block_name</span><span class="plain">), </span><span class="identifier">I</span><span class="string">".end"</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::label</span><span class="plain">(</span><span class="identifier">begin_name</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::label</span><span class="plain">(</span><span class="identifier">end_name</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Label::new</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">begin_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">veto</span><span class="plain"> = </span><span class="identifier">FALSE</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::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">) &gt; 0) {</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">) - 1;</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>
<span class="identifier">veto</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+2, </span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">block_bookmark</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Label::new</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">end_name</span><span class="plain">, </span><span class="identifier">baseline</span><span class="plain">+1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">veto</span><span class="plain">) </span><span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::pass2</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, &amp;</span><span class="identifier">block_bookmark</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">baseline</span><span class="plain">));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Inter::Defn::unset_current_package</span><span class="plain">(&amp;</span><span class="identifier">ib</span><span class="plain">, </span><span class="identifier">IP</span><span class="plain">, 0);</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::maybe_extern</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">into_scope</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::annotate_i</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">ASSIMILATED_IANN</span><span class="plain">, 1);</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_function</span><span class="plain">(&amp;</span><span class="identifier">ib</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">outer</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">outer</span><span class="plain">, </span><span class="identifier">unchecked_function_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">outer</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">), </span><span class="identifier">baseline</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="identifier">Inter::Nop::nop_out</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::maybe_extern</span><span class="plain">(</span><span class="identifier">inter_repository</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-04-25 11:44:40 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rsymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Link::find_name</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">FALSE</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">rsymb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::is_extern</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rsymb</span><span class="plain">-&gt;</span><span class="identifier">definition_status</span><span class="plain"> == </span><span class="identifier">DEFINED_ISYMD</span><span class="plain">) {</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Symbols::defining_frame</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::undefine</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">);</span>
<span class="identifier">Inter::Nop::nop_out</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Q</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rsymb</span><span class="plain">-&gt;</span><span class="identifier">owning_table</span><span class="plain"> != </span><span class="identifier">into_scope</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">nsymb</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="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">nsymb</span><span class="plain">);</span>
<span class="identifier">rsymb</span><span class="plain"> = </span><span class="identifier">nsymb</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">rsymb</span><span class="plain">-&gt;</span><span class="identifier">owning_table</span><span class="plain"> != </span><span class="identifier">into_scope</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">nsymb</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="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">nsymb</span><span class="plain">);</span>
<span class="identifier">rsymb</span><span class="plain"> = </span><span class="identifier">nsymb</span><span class="plain">;</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">rsymb</span><span class="plain">-&gt;</span><span class="identifier">owning_table</span><span class="plain"> != </span><span class="identifier">into_scope</span><span class="plain">) {</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Symbols::defining_frame</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Frame::valid</span><span class="plain">(&amp;</span><span class="identifier">Q</span><span class="plain">)) {</span>
<span class="identifier">Inter::Symbols::undefine</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">);</span>
<span class="identifier">Inter::Nop::nop_out</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Q</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">nsymb</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="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">nsymb</span><span class="plain">);</span>
<span class="identifier">rsymb</span><span class="plain"> = </span><span class="identifier">nsymb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::is_predeclared</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rsymb</span><span class="plain">;</span>
<span class="identifier">rsymb</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">if</span><span class="plain"> (</span><span class="identifier">rsymb</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">rsymb</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="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rsymb</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::maybe_extern is used in <a href="#SP1_1">&#167;1.1</a>, <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<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_repository</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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</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>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">sign</span><span class="plain"> = 1, </span><span class="identifier">base</span><span class="plain"> = 10, </span><span class="identifier">from</span><span class="plain"> = 0, </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">'</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="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>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">Inter::create_text</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">glob_storage</span><span class="plain"> = </span><span class="identifier">Inter::get_text</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<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>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">Inter::create_text</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">glob_storage</span><span class="plain"> = </span><span class="identifier">Inter::get_text</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<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>
<span class="identifier">from</span><span class="plain">++; </span><span class="identifier">base</span><span class="plain"> = 16;</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">from</span><span class="plain">++; </span><span class="identifier">base</span><span class="plain"> = 2;</span>
<span class="plain">}</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">N</span><span class="plain"> = 0;</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">d</span><span class="plain"> = 0;</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">'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>
<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; 34) { </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="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>
<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"> = 1; </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">"false"</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"> = 0; </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">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>
2019-04-25 11:44:40 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Link::find_name</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="identifier">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">symb</span><span class="plain">) {</span>
<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">) != 1)</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">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">, 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">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>
2019-04-25 11:44:40 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Link::find_name</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="identifier">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">symb</span><span class="plain">) {</span>
<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">) != 1)</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">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">, 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">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>
2019-04-25 11:44:40 +03:00
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Link::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">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">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>
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext">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">, 0, </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::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">IRS</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>
<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_repository</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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain">) {</span>
<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">IRS</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;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>
<span class="functiontext">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="identifier">LOG</span><span class="plain">(</span><span class="string">"Forced to glob: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;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-03-17 14:40:57 +02:00
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">Inter::create_text</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">glob_storage</span><span class="plain"> = </span><span class="identifier">Inter::get_text</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<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">-</span><span class="element">&gt;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="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(</span><span class="identifier">IRS</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>
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1, </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>
<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_repository</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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="reserved">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">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">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">IRS</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">OPERATION_ISNT</span><span class="plain">) {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">op</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">plus_interp</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">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">times_interp</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">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">minus_interp</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">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">divide_interp</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">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">unaryminus_interp</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">IRS</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;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>
<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">IRS</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;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">IRS</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;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>
<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">IRS</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>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
<span class="reserved">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">-</span><span class="element">&gt;expression_tokens</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</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">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">IRS</span><span class="plain">, </span><span class="identifier">t</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_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">IRS</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;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>
<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">IRS</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>
<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">IRS</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>
<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_repository</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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">t</span><span class="plain">) {</span>
<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"> = 0;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;ist_type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IDENTIFIER_ISTT</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="functiontext">CodeGen::Link::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">, </span><span class="identifier">TRUE</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>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed to identify %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NUMBER_ISTT</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BIN_NUMBER_ISTT</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">HEX_NUMBER_ISTT</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;constant_number</span><span class="plain"> &gt;= 0) { </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">-</span><span class="element">&gt;constant_number</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">Inter::Types::read_I6_decimal</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;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="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_numerical</span><span class="plain">(</span><span class="identifier">IRS</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>
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1, </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>
<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_repository</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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">operand1</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="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">IRS</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>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">array_in_progress</span><span class="plain"> =</span>
<span class="identifier">Inter::Frame::fill_3</span><span class="plain">(</span><span class="identifier">IRS</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">IRS</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">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1);</span>
<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">.</span><span class="identifier">extent</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Frame::extend</span><span class="plain">(&amp;</span><span class="identifier">array_in_progress</span><span class="plain">, 4) == </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>
<span class="identifier">array_in_progress</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">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">pos</span><span class="plain">+1] = 0;</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">i1</span><span class="plain">, &amp;(</span><span class="identifier">array_in_progress</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">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">pos</span><span class="plain">+3]));</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">));</span>
<span class="identifier">Inter::Frame::insert</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">, </span><span class="identifier">IRS</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_repository</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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</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>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">array_in_progress</span><span class="plain"> =</span>
<span class="identifier">Inter::Frame::fill_3</span><span class="plain">(</span><span class="identifier">IRS</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">IRS</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">IRS</span><span class="plain">-&gt;</span><span class="identifier">cp_indent</span><span class="plain"> + 1);</span>
<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">.</span><span class="identifier">extent</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Frame::extend</span><span class="plain">(&amp;</span><span class="identifier">array_in_progress</span><span class="plain">, 4) == </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>
<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">.</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">.</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">.</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">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">pos</span><span class="plain">+3]));</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::verify_construct</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">));</span>
<span class="identifier">Inter::Frame::insert</span><span class="plain">(</span><span class="identifier">array_in_progress</span><span class="plain">, </span><span class="identifier">IRS</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="reserved">int</span><span class="plain"> </span><span class="identifier">minor_const_count</span><span class="plain"> = 0;</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>
<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">minor_const_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>
<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">struct</span><span class="plain"> </span><span class="identifier">inter_reading_state</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_reading_state</span><span class="plain"> </span><span class="identifier">block_bookmark</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<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>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">block_name</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>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rb_splat_count</span><span class="plain"> = 1;</span>
<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_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">block_name</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_reading_state</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>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</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>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_bookmark</span><span class="plain"> = </span><span class="identifier">bb</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;enclosure</span><span class="plain"> = </span><span class="identifier">Packaging::enclosure</span><span class="plain">();</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;position</span><span class="plain"> = </span><span class="identifier">Packaging::bubble_at</span><span class="plain">(</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain"> = </span><span class="identifier">block_name</span><span class="plain">;</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;pass2_offset</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">offset</span><span class="plain"> - 2;</span>
<span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;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>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
2019-05-07 00:32:11 +03:00
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="functiontext">CodeGen::Link::entire_splat</span><span class="plain">(</span><span class="identifier">IRS</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">offset</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Splat %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">rb_splat_count</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="plain">#</span><span class="identifier">endif</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::routine_bodies</span><span class="plain">(</span><span class="reserved">void</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>
2019-05-07 00:32:11 +03:00
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">SCHEMA_COMPILATION</span><span class="plain">, </span><span class="string">"=======\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">Routine (%S) len %d: '%S'\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</span><span class="plain">);</span>
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;body</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, </span><span class="identifier">NULL</span><span class="plain">);</span>
2019-05-07 00:32:11 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">SCHEMA_COMPILATION_DA</span><span class="plain">)) {</span>
<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\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sch</span><span class="plain">-</span><span class="element">&gt;node_tree</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">"Lint fail: Non-empty text but empty scheme\</span><span class="plain">n</span><span class="string">"</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="functiontext">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>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="identifier">current_inter_routine</span><span class="plain"> = </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</span><span class="plain">;</span>
<span class="identifier">Packaging::set_state</span><span class="plain">(&amp;(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;position</span><span class="plain">), </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;enclosure</span><span class="plain">);</span>
<span class="identifier">Emit::push_code_position</span><span class="plain">(</span><span class="identifier">Emit::new_cip</span><span class="plain">(&amp;(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;position</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>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">scope1</span><span class="plain"> = </span><span class="identifier">Inter::Package::local_symbols</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_name</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">Packaging::incarnate</span><span class="plain">(</span><span class="identifier">Hierarchy::template</span><span class="plain">()));</span>
<span class="identifier">EmitInterSchemas::emit</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">Emit::pop_code_position</span><span class="plain">();</span>
<span class="identifier">current_inter_routine</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">CodeGen::Link::guard</span><span class="plain">(</span><span class="identifier">Inter::Defn::pass2</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_bookmark</span><span class="plain">.</span><span class="identifier">read_into</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, &amp;(</span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;block_bookmark</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">req</span><span class="plain">-</span><span class="element">&gt;pass2_offset</span><span class="plain">));</span>
<span class="plain">#</span><span class="identifier">endif</span>
<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::value is used in <a href="#SP1_1_2">&#167;1.1.2</a>.</p>
<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="#SP1_2">&#167;1.2</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::routine_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-->
2019-03-17 14:40:57 +02:00
</body>
</html>