1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-03 07:24:58 +03:00
inform7/docs/core-module/1-pp.html

149 lines
12 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>
2020-02-27 13:18:25 +02:00
<title>1/htc</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2019-03-17 14:40:57 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2019-03-17 14:40:57 +02:00
<!--Weave of '1/pp' generated by 7-->
2020-03-22 12:50:19 +02:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#1">Chapter 1: Configuration and Control</a></li><li><b>Progress Percentages</b></li></ul><p class="purpose">This tiny section, the Lichtenstein of Inform, prints percentage of completion estimates so that the host application can intercept them and update its graphical progress bar.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Clearly we can only estimate how far Inform has progressed. While we could in
principle measure the number of CPU-seconds it has run for, we don't know
how many more it will need. Instead, we rely on experience to suggest that
its run can be broken down into the following five stages, which a given
percentage of time spent in each stage: thus, for instance, semantic
analysis takes up about ten percent of every run in which problems do
not cause an early halt. Within each stage, we have a reasonable measure
of how far we have got: what proportion of the phrases have been compiled,
for instance, tells us how far "generating code" has got. The result is
that (if the relevant command line setting has been set, so that
<code class="display"><span class="extract">show_progress_indicator</span></code> is true) Inform prints about thirty lines like this
one to <code class="display"><span class="extract">stderr</span></code>:
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">++ 32% (Binding rulebooks)</span></code>
</p>
<p class="inwebparagraph">The Inform application can intercept and parse these lines to display a
progress bar with a rubric beneath it.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_progress_pc</span><span class="plain"> = -100;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">progress_stage_from</span><span class="plain">[] = { </span><span class="constant">0</span><span class="plain">, </span><span class="constant">5</span><span class="plain">, </span><span class="constant">15</span><span class="plain">, </span><span class="constant">20</span><span class="plain">, </span><span class="constant">40</span><span class="plain">, </span><span class="constant">100</span><span class="plain"> };</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">progress_stage_name</span><span class="plain">[] = {</span>
<span class="string">"Reading text"</span><span class="plain">,</span>
<span class="string">"Analysing sentences"</span><span class="plain">,</span>
<span class="string">"Drawing inferences"</span><span class="plain">,</span>
<span class="string">"Binding rulebooks"</span><span class="plain">,</span>
<span class="string">"Generating code"</span>
<span class="plain">};</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProgressBar::update</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">, </span><span class="reserved">float</span><span class="plain"> </span><span class="identifier">proportion</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">r1</span><span class="plain"> = </span><span class="identifier">progress_stage_from</span><span class="plain">[</span><span class="identifier">stage</span><span class="plain">], </span><span class="identifier">r2</span><span class="plain"> = </span><span class="identifier">progress_stage_from</span><span class="plain">[</span><span class="identifier">stage</span><span class="plain">+1];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pc</span><span class="plain"> = </span><span class="identifier">r1</span><span class="plain"> + ((</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">proportion</span><span class="plain">*(</span><span class="identifier">r2</span><span class="plain">-</span><span class="identifier">r1</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">show_progress_indicator</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pc</span><span class="plain">-</span><span class="identifier">last_progress_pc</span><span class="plain"> &lt; </span><span class="constant">3</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"++ %d%% (%s)\n"</span><span class="plain">, </span><span class="identifier">pc</span><span class="plain">, </span><span class="identifier">progress_stage_name</span><span class="plain">[</span><span class="identifier">stage</span><span class="plain">]);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">);</span>
<span class="identifier">last_progress_pc</span><span class="plain"> = </span><span class="identifier">pc</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProgressBar::final_state_of_progress_bar</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">show_progress_indicator</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"++ 100%% (Finishing work)\n"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-11 02:21:09 +02:00
<p class="endnote">The function ProgressBar::update is used in 1/wtc (<a href="1-wtc.html#SP4">&#167;4</a>), 22/cs (<a href="22-cs.html#SP4">&#167;4</a>), 22/ph (<a href="22-ph.html#SP12_1">&#167;12.1</a>).</p>
2019-03-17 14:40:57 +02:00
<p class="endnote">The function ProgressBar::final_state_of_progress_bar is used in 2/up (<a href="2-up.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Finally, the following sends a pithy summary back to the app to use as
a final status indicator.
</p>
<pre class="display">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">ProgressBar::begin_outcome</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">show_progress_indicator</span><span class="plain"> == </span><span class="identifier">FALSE</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">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"++ Ended: "</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">STDERR</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProgressBar::end_outcome</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">show_progress_indicator</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"\n"</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">STREAM_FLUSH</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function ProgressBar::begin_outcome is used in 2/up (<a href="2-up.html#SP2_2">&#167;2.2</a>, <a href="2-up.html#SP2_3">&#167;2.3</a>).</p>
<p class="endnote">The function ProgressBar::end_outcome is used in 2/up (<a href="2-up.html#SP2_2">&#167;2.2</a>, <a href="2-up.html#SP2_3">&#167;2.3</a>).</p>
<hr class="tocbar">
2020-02-27 13:18:25 +02:00
<ul class="toc"><li><a href="1-htc.html">Back to 'How To Compile'</a></li><li><i>(This section ends Chapter 1: Configuration and Control.)</i></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>