1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-02 23:14:57 +03:00

Tidied up pipeline code further

This commit is contained in:
Graham Nelson 2019-06-10 23:22:09 +01:00
parent 1353ee13db
commit 19c6f33802
17 changed files with 103 additions and 95 deletions

View file

@ -26,7 +26,7 @@
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">I6T_intervention_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">codegen_pipeline_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">stage_step_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">pipeline_step_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">uniqueness_count_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">text_literal_holder_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">inter_schema_MT</span>
@ -42,7 +42,7 @@
<pre class="display">
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">I6T_intervention</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">codegen_pipeline</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">uniqueness_count</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">text_literal_holder</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">inter_schema</span><span class="plain">)</span>

View file

@ -21,8 +21,8 @@ have no meaningful contents when the step is not running.
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">stage_step</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pipeline_stage</span><span class="plain"> *</span><span class="identifier">step_code</span><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">pipeline_step</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pipeline_stage</span><span class="plain"> *</span><span class="identifier">step_stage</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">step_argument</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">parsed_filename</span><span class="plain">;</span>
@ -31,11 +31,11 @@ have no meaningful contents when the step is not running.
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text_out_file</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">repository</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">stage_step</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">pipeline_step</span><span class="plain">;</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="functiontext">CodeGen::Pipeline::new_step</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain">);</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="functiontext">CodeGen::Pipeline::new_step</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain">);</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="functiontext">CodeGen::Pipeline::clean_step</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">step</span><span class="plain">;</span>
@ -46,14 +46,14 @@ have no meaningful contents when the step is not running.
<p class="endnote">The function CodeGen::Pipeline::new_step is used in <a href="#SP3">&#167;3</a>.</p>
<p class="endnote">The structure stage_step is accessed in 1/stg, 2/imp, 2/lnk, 2/plm, 2/rcc, 2/alm, 2/res, 2/unq, 2/rv, 2/erm, 2/inv, 4/cg and here.</p>
<p class="endnote">The structure pipeline_step is accessed in 1/stg, 2/imp, 2/lnk, 2/plm, 2/rcc, 2/alm, 2/res, 2/unq, 2/rv, 2/erm, 2/inv, 4/cg and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>This wipes clean the temporary storage for a step.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::clean_step</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::clean_step</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;parsed_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;the_N</span><span class="plain"> = -1;</span>
@ -72,16 +72,16 @@ logging:
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::write_step</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">NO_STAGE_ARG</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_name</span><span class="plain">);</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::write_step</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">NO_STAGE_ARG</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_name</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S:%S"</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_name</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S:%S"</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_name</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="functiontext">CodeGen::Pipeline::read_step</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="functiontext">CodeGen::Pipeline::read_step</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Stage::make_stages</span><span class="plain">();</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">CodeGen::Pipeline::new_step</span><span class="plain">();</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">CodeGen::Pipeline::new_step</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">step</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+?) *: *(%c*)"</span><span class="plain">)) {</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
@ -92,8 +92,8 @@ logging:
<span class="reserved">pipeline_stage</span><span class="plain"> *</span><span class="identifier">stage</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">stage</span><span class="plain">, </span><span class="reserved">pipeline_stage</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">step</span><span class="plain">, </span><span class="identifier">stage</span><span class="plain">-</span><span class="element">&gt;stage_name</span><span class="plain">))</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain"> = </span><span class="identifier">stage</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such step code"</span><span class="plain">);</span>
<span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain"> = </span><span class="identifier">stage</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such step code"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">ST</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -110,13 +110,13 @@ logging:
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">codegen_pipeline</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">steps</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">stage_step</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">steps</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">pipeline_step</span></code></span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">codegen_pipeline</span><span class="plain">;</span>
<span class="reserved">codegen_pipeline</span><span class="plain"> *</span><span class="functiontext">CodeGen::Pipeline::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">codegen_pipeline</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">codegen_pipeline</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">}</span>
@ -133,21 +133,21 @@ logging:
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">instructions</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">while</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">T</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c+?) *, *(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">CodeGen::Pipeline::read_step</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">leafname</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ST</span><span class="plain">, </span><span class="reserved">stage_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">);</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">CodeGen::Pipeline::read_step</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">leafname</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ST</span><span class="plain">, </span><span class="reserved">pipeline_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">T</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">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">T</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c+?) *"</span><span class="plain">)) {</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">CodeGen::Pipeline::read_step</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">leafname</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ST</span><span class="plain">, </span><span class="reserved">stage_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">);</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">CodeGen::Pipeline::read_step</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">leafname</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">ST</span><span class="plain">, </span><span class="reserved">pipeline_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Pipeline::port_direction</span><span class="plain">(</span><span class="reserved">codegen_pipeline</span><span class="plain"> *</span><span class="identifier">pipeline</span><span class="plain">) {</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">SS</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">SS</span><span class="plain">, </span><span class="reserved">stage_step</span><span class="plain">, </span><span class="identifier">pipeline</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SS</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;port_direction</span><span class="plain"> != 0)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">SS</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;port_direction</span><span class="plain">;</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">SS</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">SS</span><span class="plain">, </span><span class="reserved">pipeline_step</span><span class="plain">, </span><span class="identifier">pipeline</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SS</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;port_direction</span><span class="plain"> != 0)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">SS</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;port_direction</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="plain">}</span>
@ -158,11 +158,11 @@ logging:
<span class="functiontext">CodeGen::Pipeline::prepare_to_run</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">step_count</span><span class="plain"> = 0, </span><span class="identifier">step_total</span><span class="plain"> = 0;</span>
<span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="reserved">stage_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">) </span><span class="identifier">step_total</span><span class="plain">++;</span>
<span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="reserved">pipeline_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">) </span><span class="identifier">step_total</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">active</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="reserved">stage_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="reserved">pipeline_step</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">active</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">text_output_struct</span><span class="plain">; </span> <span class="comment">For any text file we might write</span>
<span class="functiontext">CodeGen::Pipeline::clean_step</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">);</span>
@ -177,8 +177,8 @@ logging:
<span class="identifier">Log::new_stage</span><span class="plain">(</span><span class="identifier">STAGE_NAME</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">STAGE_NAME</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">FILE_STAGE_ARG</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">FILE_STAGE_ARG</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">slashes</span><span class="plain"> = </span><span class="identifier">FALSE</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">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain">)</span>
<span class="reserved">if</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="character">'/'</span><span class="plain">)</span>
@ -187,7 +187,7 @@ logging:
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;parsed_filename</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">FM</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_argument</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">) {</span>
<span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain"> = &amp;</span><span class="identifier">text_output_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;parsed_filename</span><span class="plain">, </span><span class="identifier">ISO_ENC</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">PROBLEMS_MODULE</span>
@ -200,9 +200,9 @@ logging:
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">active</span><span class="plain"> = (*(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;execute</span><span class="plain">))(</span><span class="identifier">step</span><span class="plain">);</span>
<span class="identifier">active</span><span class="plain"> = (*(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;execute</span><span class="plain">))(</span><span class="identifier">step</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_code</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;step_stage</span><span class="plain">-</span><span class="element">&gt;stage_arg</span><span class="plain"> == </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">) {</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>

View file

@ -11,7 +11,7 @@
<!--Weave of '1/stg' 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#1">Chapter 1: Setting Up</a></li><li><b>Stages</b></li></ul><p class="purpose">To create the stages through which code generation proceeds.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Stages</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Stages</a></li><li><a href="#SP3">&#167;3. Creation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Stages. </b>Each possible pipeline stage is represented by a single instance of the
following. Some stages are invoked with an argument, often the filename to
@ -35,7 +35,7 @@ write output to; others are not.
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">pipeline_stage</span><span class="plain">;</span>
<span class="reserved">pipeline_stage</span><span class="plain"> *</span><span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> (*</span><span class="identifier">X</span><span class="plain">)(</span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">stage_step</span><span class="plain"> *), </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="reserved">pipeline_stage</span><span class="plain"> *</span><span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> (*</span><span class="identifier">X</span><span class="plain">)(</span><span class="reserved">struct</span><span class="plain"> </span><span class="identifier">stage_step</span><span class="plain"> *), </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="reserved">pipeline_stage</span><span class="plain"> *</span><span class="identifier">stage</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">pipeline_stage</span><span class="plain">);</span>
<span class="identifier">stage</span><span class="plain">-</span><span class="element">&gt;stage_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">stage</span><span class="plain">-</span><span class="element">&gt;execute</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain"> (*)(</span><span class="reserved">void</span><span class="plain"> *)) </span><span class="identifier">X</span><span class="plain">;</span>
@ -56,7 +56,7 @@ write output to; others are not.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::stage_disabled</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::stage_disabled</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="string">"Currently disabled\</span><span class="plain">n</span><span class="string">"</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>
@ -66,7 +66,10 @@ write output to; others are not.
<p class="endnote">The function CodeGen::Stage::stage_disabled is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Creation. </b>To add a new pipeline stage, put the code for it into a new section in
Chapter 2, and then add a call to its <code class="display"><span class="extract">create_pipeline_stage</span></code> routine
to the routine below.
</p>
<pre class="display">
@ -109,7 +112,7 @@ the pipeline:
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_stop_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_stop_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</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>
</pre>
@ -119,32 +122,32 @@ the pipeline:
<p class="endnote">The function CodeGen::Stage::run_stop_stage is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The remaining stages declared here are all just wrappers for features of the
Inter module.
Inter module. (It doesn't seem worth making 10-line sections for each of them.)
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_show_dependencies_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_show_dependencies_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">Inter::Graph::show_dependencies</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_log_dependencies_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_log_dependencies_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">Inter::Graph::show_dependencies</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_generate_inter_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_generate_inter_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">Inter::Textual::write</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 1);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_generate_inter_binary_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_generate_inter_binary_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">Inter::Binary::write</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;parsed_filename</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_summarise_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Stage::run_summarise_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">Inter::Summary::write</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"assimilate"</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</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::Bookmarks::new_IRS</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::assimilate</span><span class="plain">(&amp;</span><span class="identifier">IRS</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"eliminate-redundant-code"</span><span class="plain">, </span><span class="functiontext">CodeGen::Eliminate::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Eliminate::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Eliminate::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Eliminate::go</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -22,7 +22,7 @@
<span class="identifier">im</span><span class="plain">-</span><span class="element">&gt;port_direction</span><span class="plain"> = -1;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Import::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Import::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Import::import</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;parsed_filename</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inventory"</span><span class="plain">, </span><span class="functiontext">CodeGen::Inventory::run_pipeline_stage</span><span class="plain">, </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Inventory::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Inventory::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Inventory::print</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Inventory::print</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"link"</span><span class="plain">, </span><span class="functiontext">CodeGen::Link::run_pipeline_stage</span><span class="plain">, </span><span class="constant">TEMPLATE_FILE_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Link::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Link::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</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::Bookmarks::new_IRS</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="identifier">IRS</span><span class="plain">.</span><span class="identifier">current_package</span><span class="plain"> = </span><span class="identifier">Inter::Packages::main</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="identifier">IRS</span><span class="plain">.</span><span class="identifier">cp_indent</span><span class="plain"> = 1;</span>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"parse-linked-matter"</span><span class="plain">, </span><span class="functiontext">CodeGen::PLM::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::PLM::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::PLM::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::PLM::parse</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"resolve-conditional-compilation"</span><span class="plain">, </span><span class="functiontext">CodeGen::RCC::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::RCC::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::RCC::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::RCC::resolve</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"resolve-external-symbols"</span><span class="plain">, </span><span class="functiontext">CodeGen::Externals::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Externals::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Externals::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Externals::resolve</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"reconcile-verbs"</span><span class="plain">, </span><span class="functiontext">CodeGen::ReconcileVerbs::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::ReconcileVerbs::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::ReconcileVerbs::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::ReconcileVerbs::reconcile</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"make-identifiers-unique"</span><span class="plain">, </span><span class="functiontext">CodeGen::Uniqueness::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Uniqueness::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Uniqueness::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Uniqueness::ensure</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</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>

View file

@ -21,7 +21,7 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"generate-i6"</span><span class="plain">, </span><span class="functiontext">CodeGen::run_pipeline_stage</span><span class="plain">, </span><span class="constant">TEXT_OUT_STAGE_ARG</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::run_pipeline_stage</span><span class="plain">(</span><span class="identifier">stage_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::to_I6</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</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>

View file

@ -11,7 +11,7 @@ We need to itemise the structures we'll want to allocate:
@e I6T_intervention_MT
@e codegen_pipeline_MT
@e stage_step_MT
@e pipeline_step_MT
@e uniqueness_count_MT
@e text_literal_holder_MT
@e inter_schema_MT
@ -25,7 +25,7 @@ We need to itemise the structures we'll want to allocate:
=
ALLOCATE_INDIVIDUALLY(I6T_intervention)
ALLOCATE_INDIVIDUALLY(codegen_pipeline)
ALLOCATE_INDIVIDUALLY(stage_step)
ALLOCATE_INDIVIDUALLY(pipeline_step)
ALLOCATE_INDIVIDUALLY(uniqueness_count)
ALLOCATE_INDIVIDUALLY(text_literal_holder)
ALLOCATE_INDIVIDUALLY(inter_schema)

View file

@ -9,8 +9,8 @@ are all temporary storage for information needed when the step is run; they
have no meaningful contents when the step is not running.
=
typedef struct stage_step {
struct pipeline_stage *step_code;
typedef struct pipeline_step {
struct pipeline_stage *step_stage;
struct text_stream *step_argument;
struct filename *parsed_filename;
@ -19,11 +19,11 @@ typedef struct stage_step {
struct text_stream *text_out_file;
struct inter_repository *repository;
MEMORY_MANAGEMENT
} stage_step;
} pipeline_step;
stage_step *CodeGen::Pipeline::new_step(void) {
stage_step *step = CREATE(stage_step);
step->step_code = NULL;
pipeline_step *CodeGen::Pipeline::new_step(void) {
pipeline_step *step = CREATE(pipeline_step);
step->step_stage = NULL;
step->step_argument = NULL;
CodeGen::Pipeline::clean_step(step);
return step;
@ -32,7 +32,7 @@ stage_step *CodeGen::Pipeline::new_step(void) {
@ This wipes clean the temporary storage for a step.
=
void CodeGen::Pipeline::clean_step(stage_step *step) {
void CodeGen::Pipeline::clean_step(pipeline_step *step) {
step->parsed_filename = NULL;
step->text_out_file = NULL;
step->the_N = -1;
@ -44,16 +44,16 @@ void CodeGen::Pipeline::clean_step(stage_step *step) {
logging:
=
void CodeGen::Pipeline::write_step(OUTPUT_STREAM, stage_step *step) {
if (step->step_code->stage_arg == NO_STAGE_ARG)
WRITE("%S", step->step_code->stage_name);
void CodeGen::Pipeline::write_step(OUTPUT_STREAM, pipeline_step *step) {
if (step->step_stage->stage_arg == NO_STAGE_ARG)
WRITE("%S", step->step_stage->stage_name);
else
WRITE("%S:%S", step->step_code->stage_name, step->step_argument);
WRITE("%S:%S", step->step_stage->stage_name, step->step_argument);
}
stage_step *CodeGen::Pipeline::read_step(text_stream *step, text_stream *leafname) {
pipeline_step *CodeGen::Pipeline::read_step(text_stream *step, text_stream *leafname) {
CodeGen::Stage::make_stages();
stage_step *ST = CodeGen::Pipeline::new_step();
pipeline_step *ST = CodeGen::Pipeline::new_step();
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, step, L"(%c+?) *: *(%c*)")) {
ST->step_argument = Str::new();
@ -64,8 +64,8 @@ stage_step *CodeGen::Pipeline::read_step(text_stream *step, text_stream *leafnam
pipeline_stage *stage;
LOOP_OVER(stage, pipeline_stage)
if (Str::eq(step, stage->stage_name))
ST->step_code = stage;
if (ST->step_code == NULL) internal_error("no such step code");
ST->step_stage = stage;
if (ST->step_stage == NULL) internal_error("no such step code");
return ST;
}
@ -74,13 +74,13 @@ And then a pipeline is just a linked list of steps.
=
typedef struct codegen_pipeline {
struct linked_list *steps; /* of |stage_step| */
struct linked_list *steps; /* of |pipeline_step| */
MEMORY_MANAGEMENT
} codegen_pipeline;
codegen_pipeline *CodeGen::Pipeline::new(void) {
codegen_pipeline *S = CREATE(codegen_pipeline);
S->steps = NEW_LINKED_LIST(stage_step);
S->steps = NEW_LINKED_LIST(pipeline_step);
return S;
}
@ -97,21 +97,21 @@ void CodeGen::Pipeline::parse_into(codegen_pipeline *S, text_stream *instruction
Str::copy(T, instructions);
match_results mr = Regexp::create_mr();
while (Regexp::match(&mr, T, L" *(%c+?) *, *(%c*)")) {
stage_step *ST = CodeGen::Pipeline::read_step(mr.exp[0], leafname);
ADD_TO_LINKED_LIST(ST, stage_step, S->steps);
pipeline_step *ST = CodeGen::Pipeline::read_step(mr.exp[0], leafname);
ADD_TO_LINKED_LIST(ST, pipeline_step, S->steps);
Str::copy(T, mr.exp[1]);
}
if (Regexp::match(&mr, T, L" *(%c+?) *")) {
stage_step *ST = CodeGen::Pipeline::read_step(mr.exp[0], leafname);
ADD_TO_LINKED_LIST(ST, stage_step, S->steps);
pipeline_step *ST = CodeGen::Pipeline::read_step(mr.exp[0], leafname);
ADD_TO_LINKED_LIST(ST, pipeline_step, S->steps);
}
}
int CodeGen::Pipeline::port_direction(codegen_pipeline *pipeline) {
stage_step *SS;
LOOP_OVER_LINKED_LIST(SS, stage_step, pipeline->steps)
if (SS->step_code->port_direction != 0)
return SS->step_code->port_direction;
pipeline_step *SS;
LOOP_OVER_LINKED_LIST(SS, pipeline_step, pipeline->steps)
if (SS->step_stage->port_direction != 0)
return SS->step_stage->port_direction;
return 0;
}
@ -122,11 +122,11 @@ void CodeGen::Pipeline::run(pathname *P, codegen_pipeline *S, inter_repository *
CodeGen::Pipeline::prepare_to_run(I);
int step_count = 0, step_total = 0;
stage_step *step;
LOOP_OVER_LINKED_LIST(step, stage_step, S->steps) step_total++;
pipeline_step *step;
LOOP_OVER_LINKED_LIST(step, pipeline_step, S->steps) step_total++;
int active = TRUE;
LOOP_OVER_LINKED_LIST(step, stage_step, S->steps)
LOOP_OVER_LINKED_LIST(step, pipeline_step, S->steps)
if (active) {
text_stream text_output_struct; /* For any text file we might write */
CodeGen::Pipeline::clean_step(step);
@ -141,8 +141,8 @@ void CodeGen::Pipeline::run(pathname *P, codegen_pipeline *S, inter_repository *
Log::new_stage(STAGE_NAME);
DISCARD_TEXT(STAGE_NAME);
if ((step->step_code->stage_arg == FILE_STAGE_ARG) ||
(step->step_code->stage_arg == TEXT_OUT_STAGE_ARG)) {
if ((step->step_stage->stage_arg == FILE_STAGE_ARG) ||
(step->step_stage->stage_arg == TEXT_OUT_STAGE_ARG)) {
int slashes = FALSE;
LOOP_THROUGH_TEXT(pos, step->step_argument)
if (Str::get(pos) == '/')
@ -151,7 +151,7 @@ void CodeGen::Pipeline::run(pathname *P, codegen_pipeline *S, inter_repository *
else step->parsed_filename = Filenames::in_folder(FM, step->step_argument);
}
if (step->step_code->stage_arg == TEXT_OUT_STAGE_ARG) {
if (step->step_stage->stage_arg == TEXT_OUT_STAGE_ARG) {
step->text_out_file = &text_output_struct;
if (STREAM_OPEN_TO_FILE(step->text_out_file, step->parsed_filename, ISO_ENC) == FALSE) {
#ifdef PROBLEMS_MODULE
@ -164,9 +164,9 @@ void CodeGen::Pipeline::run(pathname *P, codegen_pipeline *S, inter_repository *
}
}
active = (*(step->step_code->execute))(step);
active = (*(step->step_stage->execute))(step);
if (step->step_code->stage_arg == TEXT_OUT_STAGE_ARG) {
if (step->step_stage->stage_arg == TEXT_OUT_STAGE_ARG) {
STREAM_CLOSE(step->text_out_file);
}
}

View file

@ -38,7 +38,12 @@ int CodeGen::Stage::stage_disabled(stage_step *step) {
return TRUE;
}
@ =
@h Creation.
To add a new pipeline stage, put the code for it into a new section in
Chapter 2, and then add a call to its |create_pipeline_stage| routine
to the routine below.
=
int stages_made = FALSE;
void CodeGen::Stage::make_stages(void) {
if (stages_made == FALSE) {
@ -76,7 +81,7 @@ int CodeGen::Stage::run_stop_stage(stage_step *step) {
}
@ The remaining stages declared here are all just wrappers for features of the
Inter module.
Inter module. (It doesn't seem worth making 10-line sections for each of them.)
=
int CodeGen::Stage::run_show_dependencies_stage(stage_step *step) {